From 6912e074af61b73307d2fc31b1b8f4974f5eb4f3 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 22 五月 2026 10:17:31 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java |  205 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 163 insertions(+), 42 deletions(-)

diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
index d2f4568..5cc2785 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.account.controller;
 
 
+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;
@@ -8,12 +10,20 @@
 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;
@@ -27,18 +37,22 @@
 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 java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -54,30 +68,71 @@
 public class TAppCouponController {
     @Autowired
     private TAppCouponService tAppCouponService;
+    @Resource
+    private OtherClient otherClient;
 
     @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(10, 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();
     }
     /**
@@ -85,41 +140,43 @@
      * @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();
+        SiteInfoVO data = chargingPileClient.getSiteInfoByNumber1(chargingPile.getCode().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.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.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());
-                    }
-                }
+                data.setId(cars.get(0).getId().toString());
             }
+            AppUserWhitelistMatchVO whitelist = whitelistService.matchWhitelist(tokenService.getLoginUserApplet().getUserId(), chargingGun.getSiteId());
+            data.setWhitelistMatched(Boolean.TRUE.equals(whitelist.getMatched()));
+            data.setWhitelistBenefitType(whitelist.getBenefitType());
+            data.setWhitelistBenefitName(whitelist.getBenefitName());
         }
+        Integer data2 = otherClient.getAddCarIntegral().getData();
+        data.setIntegral(data2);
+
         BigDecimal electrovalence = data.getElectrovalence();
         BigDecimal vipElectrovalence = data.getVipElectrovalence();
         // 计算预付金额能充多少度普通电
         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);
     }
     /**
@@ -140,8 +197,13 @@
     @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);
     }
 
@@ -181,20 +243,43 @@
      * @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 = {"小程序-站点管理-站点详情"})
+    @GetMapping(value = "/couponCount")
+    public R<Long> couponCount() {
+        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();
+
         switch (dto.getType()){
             case 1:
                 // 根据标签ids 查询用户ids
@@ -208,15 +293,27 @@
                     tAppCoupon.setEndTime(dto.getEndTime());
                     tAppCoupon.setWaysToObtain(dto.getWaysToObtain());
                     tAppCoupon.setStatus(1);
+                    tAppCoupon.setCouponJson(JSON.toJSONString(coupon));
                     res.add(tAppCoupon);
                 }
                 tAppCouponService.saveBatch(res);
                 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);
@@ -224,6 +321,7 @@
                     tAppCoupon.setEndTime(dto.getEndTime());
                     tAppCoupon.setWaysToObtain(dto.getWaysToObtain());
                     tAppCoupon.setStatus(1);
+                    tAppCoupon.setCouponJson(JSON.toJSONString(coupon));
                     res.add(tAppCoupon);
                 }
                 tAppCouponService.saveBatch(res);
@@ -236,6 +334,7 @@
                     tAppCoupon.setEndTime(dto.getEndTime());
                     tAppCoupon.setWaysToObtain(dto.getWaysToObtain());
                     tAppCoupon.setStatus(1);
+                    tAppCoupon.setCouponJson(JSON.toJSONString(coupon));
                     res.add(tAppCoupon);
                 }
                 tAppCouponService.saveBatch(res);
@@ -246,5 +345,27 @@
 
         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);
+    }
+    
+    /**
+     * 修改用户优惠券
+     * @param appCoupon
+     * @return
+     */
+    @PostMapping("/updateAppCoupon")
+    public R updateAppCoupon(@RequestBody TAppCoupon appCoupon){
+        tAppCouponService.updateById(appCoupon);
+        return R.ok();
+    }
 }
-

--
Gitblit v1.7.1