| | |
| | | |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.ruoyi.account.api.dto.CouponListDto; |
| | | import com.ruoyi.account.api.dto.GrantCouponDto; |
| | |
| | | import com.ruoyi.account.api.model.TAppUser; |
| | | import com.ruoyi.account.api.model.TAppUserCar; |
| | | import com.ruoyi.account.api.model.TAppUserTag; |
| | | import com.ruoyi.account.api.vo.AppUserWhitelistMatchVO; |
| | | import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; |
| | | import com.ruoyi.account.service.TAppUserService; |
| | | import com.ruoyi.account.service.TAppUserTagService; |
| | | import com.ruoyi.account.service.TAppUserWhitelistService; |
| | | import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; |
| | | import com.ruoyi.chargingPile.api.model.TChargingGun; |
| | | import com.ruoyi.chargingPile.api.model.TChargingPile; |
| | | import com.ruoyi.common.core.utils.ServletUtils; |
| | | import com.ruoyi.common.log.annotation.Log; |
| | | import com.ruoyi.common.log.enums.BusinessType; |
| | | import com.ruoyi.common.log.enums.OperatorType; |
| | | import com.ruoyi.common.redis.service.RedisService; |
| | | import com.ruoyi.common.security.utils.SecurityUtils; |
| | | import com.ruoyi.other.api.vo.CouponListVOVO; |
| | | import com.ruoyi.account.api.vo.ExchangeRecordVO; |
| | | import com.ruoyi.account.service.TAppCouponService; |
| | |
| | | import com.ruoyi.common.security.service.TokenService; |
| | | import com.ruoyi.order.api.feignClient.ChargingOrderClient; |
| | | import com.ruoyi.other.api.domain.TCoupon; |
| | | import com.ruoyi.other.api.dto.ExchangeCodeBindDTO; |
| | | import com.ruoyi.other.api.feignClient.OtherClient; |
| | | import com.ruoyi.other.api.vo.ExchangeCodeBindResultVO; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.util.StringUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import javax.annotation.Resource; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | |
| | | @Autowired |
| | | private TAppUserCarService appUserCarService; |
| | | @Autowired |
| | | @Resource |
| | | private TokenService tokenService; |
| | | @Autowired |
| | | @Resource |
| | | private ChargingPileClient chargingPileClient; |
| | | @Autowired |
| | | @Resource |
| | | private ChargingOrderClient chargingOrderClient; |
| | | |
| | | @Resource |
| | | private ChargingGunClient chargingGunClient; |
| | | |
| | | @Autowired |
| | | private TAppUserTagService appUserTagService; |
| | | @Autowired |
| | | private TAppUserService appUserService; |
| | | @Resource |
| | | private TAppUserWhitelistService whitelistService; |
| | | |
| | | @Autowired |
| | | private RedissonClient redissonClient; |
| | | |
| | | |
| | | /** |
| | | * 后台退款 回退优惠券使用状态 |
| | | * @return |
| | | */ |
| | | @PostMapping(value = "/refund/{id}") |
| | | public R refund(@PathVariable("id") String id) { |
| | | TAppCoupon byId = tAppCouponService.getById(id); |
| | | byId.setStatus(1); |
| | | tAppCouponService.updateById(byId); |
| | | return R.ok(); |
| | | } |
| | | /** |
| | | * 小程序扫一扫 添加车辆 |
| | | * @param dto |
| | | * @return |
| | | */ |
| | | @Log(title = "【扫一扫】添加车辆", businessType = BusinessType.INSERT,operatorType = OperatorType.MOBILE) |
| | | @ApiOperation(value = "添加车辆", tags = {"小程序-扫一扫"}) |
| | | @PostMapping(value = "/scan/addCar") |
| | | public AjaxResult addCar(@RequestBody TAppUserCar dto) { |
| | | dto.setAppUserId(tokenService.getLoginUserApplet().getUserId()); |
| | | appUserCarService.save(dto); |
| | | Long userId = tokenService.getLoginUserApplet().getUserId(); |
| | | RLock lock = redissonClient.getLock("CREATE_CAR:" + userId); |
| | | try { |
| | | boolean tryLock = lock.tryLock(2, 10, TimeUnit.SECONDS); |
| | | if(tryLock){ |
| | | dto.setAppUserId(userId); |
| | | TAppUserCar one = appUserCarService.getOne(new LambdaQueryWrapper<TAppUserCar>() |
| | | .eq(TAppUserCar::getLicensePlate, dto.getLicensePlate()) |
| | | .eq(TAppUserCar::getAppUserId, dto.getAppUserId()) |
| | | .eq(TAppUserCar::getDelFlag, 0)); |
| | | if(null != one){ |
| | | return AjaxResult.error("车辆已存在"); |
| | | } |
| | | appUserCarService.save(dto); |
| | | } |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | }finally { |
| | | lock.unlock(); |
| | | } |
| | | return AjaxResult.success(); |
| | | } |
| | | /** |
| | |
| | | * @return |
| | | */ |
| | | @ApiOperation(value = "通过充电枪id和预付金额获取电站详情", tags = {"小程序-扫一扫"}) |
| | | @GetMapping(value = "/scan/siteInfo") |
| | | @PostMapping(value = "/scan/siteInfo") |
| | | public AjaxResult<SiteInfoVO> siteInfo(Integer id, BigDecimal money) { |
| | | TChargingGun chargingGun = chargingGunClient.getChargingGunById(id).getData(); |
| | | TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData(); |
| | | SiteInfoVO data = chargingPileClient.getSiteInfoByNumber(chargingPile.getNumber().toString()).getData(); |
| | | data.setChargingGunId(id); |
| | | List<TAppUserCar> cars = appUserCarService.list(new QueryWrapper<TAppUserCar>() |
| | | .eq("app_user_id",tokenService.getLoginUserApplet().getUserId()) |
| | | .orderByDesc("create_time")); |
| | | Long data1 = chargingOrderClient.getCar().getData(); |
| | | if (!cars.isEmpty()){ |
| | | if (data1 == -1){ |
| | | // 没有充电订单 展示最新添加的车辆 |
| | | data.setLicensePlate(cars.get(0).getLicensePlate()); |
| | | data.setVehicleBrand(cars.get(0).getVehicleBrand()); |
| | | data.setId(cars.get(0).getId()); |
| | | }else{ |
| | | for (TAppUserCar car : cars) { |
| | | if (car.getId().equals(data1)){ |
| | | data.setLicensePlate(car.getLicensePlate()); |
| | | data.setVehicleBrand(car.getVehicleBrand()); |
| | | data.setId(car.getId()); |
| | | } |
| | | } |
| | | } |
| | | if (id == null || money == null) { |
| | | return AjaxResult.error("充电枪和预付金额不能为空"); |
| | | } |
| | | R<TChargingGun> chargingGunResult = chargingGunClient.getChargingGunById(id); |
| | | TChargingGun chargingGun = chargingGunResult == null ? null : chargingGunResult.getData(); |
| | | if (chargingGun == null) { |
| | | return AjaxResult.error("充电枪不存在或已停用"); |
| | | } |
| | | R<TChargingPile> chargingPileResult = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()); |
| | | TChargingPile chargingPile = chargingPileResult == null ? null : chargingPileResult.getData(); |
| | | if (chargingPile == null || chargingPile.getCode() == null) { |
| | | return AjaxResult.error("充电桩不存在或已停用"); |
| | | } |
| | | R<SiteInfoVO> siteInfoResult = chargingPileClient.getSiteInfoByNumber1(chargingPile.getCode().toString()); |
| | | SiteInfoVO data = siteInfoResult == null ? null : siteInfoResult.getData(); |
| | | if (data == null) { |
| | | String message = siteInfoResult == null ? null : siteInfoResult.getMsg(); |
| | | return AjaxResult.error(StringUtils.hasLength(message) ? message : "获取电站计费信息失败"); |
| | | } |
| | | data.setChargingGunId(id); |
| | | data.setSiteId(chargingGun.getSiteId()); |
| | | data.setChargeMode(chargingGun.getChargeMode()); |
| | | |
| | | String token = SecurityUtils.getToken(ServletUtils.getRequest()); |
| | | if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(token)){ |
| | | List<TAppUserCar> cars = appUserCarService.list(new QueryWrapper<TAppUserCar>() |
| | | .eq("app_user_id",tokenService.getLoginUserApplet().getUserId()) |
| | | .eq("del_flag", 0) |
| | | .orderByDesc("create_time")); |
| | | if (!cars.isEmpty()){ |
| | | data.setLicensePlate(cars.get(0).getLicensePlate()); |
| | | data.setVin(cars.get(0).getVin()); |
| | | data.setVehicleBrand(cars.get(0).getVehicleBrand()); |
| | | data.setId(cars.get(0).getId().toString()); |
| | | } |
| | | AppUserWhitelistMatchVO whitelist = whitelistService.matchWhitelist(tokenService.getLoginUserApplet().getUserId(), chargingGun.getSiteId()); |
| | | data.setWhitelistMatched(Boolean.TRUE.equals(whitelist.getMatched())); |
| | | if (Boolean.TRUE.equals(whitelist.getMatched())) { |
| | | // 充电页余额显示:按白名单所属公司账户模式下发账户可用余额(共享=公司余额,分配=白名单余额) |
| | | data.setWhitelistBalance(whitelistService.resolveWhitelistAccountBalance(whitelist)); |
| | | } |
| | | // 白名单权益已下线(充电完全按企业优惠结算),不再下发权益类型与名称,仅保留命中标识 |
| | | data.setWhitelistBenefitType(null); |
| | | data.setWhitelistBenefitName(null); |
| | | } |
| | | Integer data2 = otherClient.getAddCarIntegral().getData(); |
| | | data.setIntegral(data2); |
| | | |
| | | BigDecimal electrovalence = data.getElectrovalence(); |
| | | BigDecimal vipElectrovalence = data.getVipElectrovalence(); |
| | | if (electrovalence == null || electrovalence.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return AjaxResult.error("当前时段未配置有效费率"); |
| | | } |
| | | if (vipElectrovalence == null) { |
| | | vipElectrovalence = electrovalence; |
| | | } |
| | | // 计算预付金额能充多少度普通电 |
| | | BigDecimal divide1 = money.divide(electrovalence, 2, BigDecimal.ROUND_HALF_UP); |
| | | // 计算冲会员电能充多少度会员电 |
| | | BigDecimal divide = vipElectrovalence.divide(electrovalence, 2, BigDecimal.ROUND_HALF_UP); |
| | | BigDecimal subtract = divide.subtract(divide1); |
| | | // 计算冲会员充电需要多少钱 |
| | | BigDecimal vipMoney = divide1.multiply(vipElectrovalence).setScale(2,BigDecimal.ROUND_HALF_UP); |
| | | // BigDecimal subtract = divide.subtract(divide1); |
| | | // 优惠金额 |
| | | data.setMoney(subtract.multiply(vipElectrovalence).setScale(2, BigDecimal.ROUND_HALF_UP)); |
| | | data.setMoney(electrovalence.multiply(divide1).subtract(vipMoney).setScale(2, BigDecimal.ROUND_DOWN)); |
| | | return AjaxResult.ok(data); |
| | | } |
| | | /** |
| | |
| | | @ApiOperation(value = "选择车辆列表", tags = {"小程序-扫一扫"}) |
| | | @PostMapping(value = "/scan/carList") |
| | | public R<List<TAppUserCar>> carList() { |
| | | String token = SecurityUtils.getToken(ServletUtils.getRequest()); |
| | | if(!StringUtils.hasLength(token)){ |
| | | return R.ok(new ArrayList<>()); |
| | | } |
| | | List<TAppUserCar> appUserId = appUserCarService.list(new QueryWrapper<TAppUserCar>() |
| | | .eq("app_user_id",tokenService.getLoginUserApplet().getUserId())); |
| | | .eq("app_user_id",tokenService.getLoginUserApplet().getUserId()).eq("del_flag", 0)); |
| | | appUserId.forEach(s->s.setId_(s.getId().toString())); |
| | | return R.ok(appUserId); |
| | | } |
| | | |
| | |
| | | * @return |
| | | */ |
| | | @PostMapping("/getExchangeRecordByCouponId") |
| | | public R<PageInfo<ExchangeRecordVO>> getExchangeRecordByCouponId(@RequestBody ExchangeRecordGoodsQuery couponId){ |
| | | public R<List<ExchangeRecordVO>> getExchangeRecordByCouponId(@RequestBody ExchangeRecordGoodsQuery couponId){ |
| | | return R.ok(tAppCouponService.pagelist(couponId)); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value = "优惠卷可用数量", tags = {"小程序-站点管理-站点详情"}) |
| | | @PostMapping(value = "/couponCount") |
| | | @GetMapping(value = "/couponCount") |
| | | public R<Long> couponCount() { |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | return R.ok(tAppCouponService.lambdaQuery().le(TAppCoupon::getStartTime, now).ge(TAppCoupon::getEndTime, now).eq(TAppCoupon::getStatus, 1).count()); |
| | | Long userId = tokenService.getLoginUserApplet().getUserId(); |
| | | Long count = tAppCouponService.lambdaQuery().eq(TAppCoupon::getAppUserId, userId).ge(TAppCoupon::getEndTime, LocalDateTime.now()).eq(TAppCoupon::getStatus, 1).count(); |
| | | if(Objects.isNull(count)){ |
| | | count = 0L; |
| | | } |
| | | return R.ok(count); |
| | | } |
| | | |
| | | @Autowired |
| | | private TAppUserTagService appUserTagService; |
| | | @Autowired |
| | | private TAppUserService appUserService; |
| | | @ApiOperation(value = "兑换码绑定", tags = {"小程序-兑换码"}) |
| | | @PostMapping(value = "/exchangeCode/bind") |
| | | public AjaxResult<ExchangeCodeBindResultVO> bindExchangeCode(@RequestBody ExchangeCodeBindDTO dto) { |
| | | Long userId = tokenService.getLoginUserApplet().getUserId(); |
| | | TAppUser user = appUserService.getById(userId); |
| | | ExchangeCodeBindResultVO data = otherClient.bindExchangeCode(dto, userId, user == null ? "" : user.getPhone()).getData(); |
| | | return AjaxResult.ok(data); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 后台远程调用 给用户发放优惠券 |
| | | */ |
| | | @PostMapping("/grantCoupon") |
| | | public R grantCoupon(@RequestBody GrantCouponDto dto){ |
| | | if (dto.getWaysToObtain()==null){ |
| | | dto.setWaysToObtain(3); |
| | | } |
| | | List<TAppCoupon> res = new ArrayList<>(); |
| | | TCoupon coupon = otherClient.getCouponById(dto.getCouponId()).getData(); |
| | | |
| | |
| | | break; |
| | | case 2: |
| | | // 根据市codes 查询用户ids |
| | | List<Long> collect1 = appUserService.list(new QueryWrapper<TAppUser>() |
| | | .in("city_code", Arrays.asList(dto.getCityCode().split(",")))) |
| | | .stream().map(TAppUser::getId).collect(Collectors.toList()); |
| | | List<Long> collect1 = new ArrayList<>(); |
| | | // 根据市codes 查询用户ids |
| | | if (StringUtils.hasLength(dto.getProvinceCode())){ |
| | | List<Long> collect2 = appUserService.list(new QueryWrapper<TAppUser>() |
| | | .in("province_code", Arrays.asList(dto.getProvinceCode().split(",")))) |
| | | .stream().map(TAppUser::getId).collect(Collectors.toList()); |
| | | collect1.addAll(collect2); |
| | | } |
| | | if (StringUtils.hasLength(dto.getCityCode())){ |
| | | List<Long> collect2 = appUserService.list(new QueryWrapper<TAppUser>() |
| | | .in("city_code", Arrays.asList(dto.getCityCode().split(",")))) |
| | | .stream().map(TAppUser::getId).collect(Collectors.toList()); |
| | | collect1.addAll(collect2); |
| | | } |
| | | for (Long l : collect1) { |
| | | TAppCoupon tAppCoupon = new TAppCoupon(); |
| | | tAppCoupon.setAppUserId(l); |
| | |
| | | |
| | | return R.ok(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 根据id获取优惠券领取记录 |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/getAppCouponById") |
| | | public R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id){ |
| | | TAppCoupon appCoupon = tAppCouponService.getById(id); |
| | | return R.ok(appCoupon); |
| | | } |
| | | |
| | | @PostMapping("/getAppCouponByIds") |
| | | public R<List<TAppCoupon>> getAppCouponByIds(@RequestBody List<Long> ids){ |
| | | if (ids == null || ids.isEmpty()) { |
| | | return R.ok(new ArrayList<>()); |
| | | } |
| | | return R.ok(tAppCouponService.listByIds(ids)); |
| | | } |
| | | |
| | | /** |
| | | * 修改用户优惠券 |
| | | * @param appCoupon |
| | | * @return |
| | | */ |
| | | @PostMapping("/updateAppCoupon") |
| | | public R updateAppCoupon(@RequestBody TAppCoupon appCoupon){ |
| | | tAppCouponService.updateById(appCoupon); |
| | | return R.ok(); |
| | | } |
| | | } |