From 3f45e8fdfa31d7b764d60a7c0cb5dd11944ed418 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期一, 21 九月 2026 23:38:59 +0800
Subject: [PATCH] bug:统计数据修正

---
 cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java |   89 +++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 82 insertions(+), 7 deletions(-)

diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java
index 760a91e..922aa87 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/HuiminController.java
@@ -81,6 +81,10 @@
     private HuiminRecordService huiminRecordService;
     @Resource
     private StudentClient studentClient;
+    @Resource
+    private UserCouponService userCouponService;
+    @Resource
+    private CouponStoreService couponStoreService;
 
 
     @Autowired
@@ -99,9 +103,10 @@
             @ApiImplicitParam(value = "玩湃惠民卡id", name = "id", dataType = "int", required = true),
             @ApiImplicitParam(value = "支付方式1微信2支付宝", name = "payType", dataType = "int", required = true),
             @ApiImplicitParam(value = "绑定学员ids多,个逗号拼接", name = "studentIds", dataType = "String", required = true),
+            @ApiImplicitParam(value = "用户优惠券领取记录id;不使用时不传", name = "couponId", dataType = "long", required = false),
             @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
     })
-    public ResultUtil<THuiminCard> payHuiminCard(Integer id, Integer payType, String studentIds) {
+    public ResultUtil<?> payHuiminCard(Integer id, Integer payType, String studentIds, Long couponId) {
         try {
             Integer uid = tokenUtil.getUserIdFormRedis();
             if (null == uid) {
@@ -128,7 +133,48 @@
             TPayHuimin tPayHuimin = new TPayHuimin();
             String[] split = studentIds.split(",");
 
-            tPayHuimin.setSalesMoney(huiminCard.getSalesMoney().multiply(new BigDecimal(split.length)).setScale(2));
+            BigDecimal salesMoney = huiminCard.getSalesMoney().multiply(new BigDecimal(split.length)).setScale(2);
+            UserCoupon userCoupon = null;
+            if (couponId != null && couponId != 0) {
+                if (payType != 1 && payType != 2) {
+                    return ResultUtil.error("优惠券仅支持微信或支付宝支付");
+                }
+                userCoupon = userCouponService.getById(couponId);
+                if (userCoupon == null || !uid.equals(userCoupon.getUserId()) || !Integer.valueOf(1).equals(userCoupon.getStatus())) {
+                    return ResultUtil.error("优惠券不可用");
+                }
+                Coupon coupon = couponService.getById(userCoupon.getCouponId());
+                if (coupon == null || coupon.getEndTime() == null || !coupon.getEndTime().after(new Date())) {
+                    return ResultUtil.error("优惠券已过期");
+                }
+                if (Integer.valueOf(3).equals(coupon.getUseScope())) {
+                    Set<Integer> cardStoreIds = Arrays.stream((huiminCard.getStoreIds() == null ? "" : huiminCard.getStoreIds()).split(","))
+                            .filter(value -> !value.trim().isEmpty()).map(Integer::valueOf).collect(Collectors.toSet());
+                    boolean available = couponStoreService.lambdaQuery().eq(CouponStore::getCouponId, coupon.getId()).list()
+                            .stream().map(CouponStore::getStoreId).anyMatch(cardStoreIds::contains);
+                    if (!available) {
+                        return ResultUtil.error("该优惠券不适用于此惠民卡");
+                    }
+                }
+                if (coupon.getType() == 1) {
+                    JSONObject rule = JSON.parseObject(coupon.getContent());
+                    BigDecimal condition = rule.getBigDecimal("conditionalAmount");
+                    BigDecimal deduction = rule.getBigDecimal("deductionAmount");
+                    if (condition == null || deduction == null || salesMoney.compareTo(condition) < 0) {
+                        return ResultUtil.error("该优惠券无法使用");
+                    }
+                    salesMoney = salesMoney.subtract(deduction).max(BigDecimal.ZERO).setScale(2);
+                } else if (coupon.getType() == 2) {
+                    BigDecimal deduction = JSON.parseObject(coupon.getContent()).getBigDecimal("conditionalAmount");
+                    if (deduction == null) {
+                        return ResultUtil.error("该优惠券无法使用");
+                    }
+                    salesMoney = salesMoney.subtract(deduction).max(BigDecimal.ZERO).setScale(2);
+                } else {
+                    return ResultUtil.error("该优惠券不支持购买惠民卡");
+                }
+            }
+            tPayHuimin.setSalesMoney(salesMoney);
             tPayHuimin.setAppUserId(uid);
             tPayHuimin.setStudentId(studentIds);
             switch (huiminCard.getHuiMinType()) {
@@ -155,29 +201,45 @@
             tPayHuimin.setPaymentType(payType);
             tPayHuimin.setRefundStatus(1);
             tPayHuimin.setCardId(huiminCard.getId());
+            tPayHuimin.setUserCouponId(couponId);
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
             tPayHuimin.setCode(sdf.format(new Date()) + UUIDUtil.getNumberRandom(5));
             System.err.println("支付数据" + tPayHuimin);
             payHuiminService.save(tPayHuimin);
+            if (userCoupon != null) {
+                // t_user_coupon 以 userId 分片;updateById 会把 userId 放入 SET,
+                // ShardingSphere 会拒绝更新分片键。只更新状态,并在 WHERE 中带上 userId。
+                boolean couponUpdated = userCouponService.lambdaUpdate()
+                        .set(UserCoupon::getStatus, 2)
+                        .eq(UserCoupon::getId, userCoupon.getId())
+                        .eq(UserCoupon::getUserId, uid)
+                        .eq(UserCoupon::getStatus, 1)
+                        .update();
+                if (!couponUpdated) {
+                    return ResultUtil.error("优惠券已被使用");
+                }
+            }
             BigDecimal bigDecimal = new BigDecimal(studentIds.split(",").length);
             if (tPayHuimin.getSalesMoney().compareTo(BigDecimal.ZERO)==0){
                 // 零元购
                 tPayHuimin.setStatus(2);
                 tPayHuimin.setPaymentTime(new Date());
                 payHuiminService.updateById(tPayHuimin);
-                return ResultUtil.success();
+                JSONObject data = new JSONObject();
+                data.put("paySuccess", true);
+                return ResultUtil.success(data);
             }
             switch (payType) {
                 case 1:
                     // todo 惠民卡收入属于平台商户 定死
-                    return payMoneyUtil.weixinpay("购买玩湃惠民卡", "", tPayHuimin.getCode(), tPayHuimin.getSalesMoney().toString(),
-                            "/base/huimin/callBack/weixinPayHuiminCallback", "APP", "");
+                    return appendPaySuccess(payMoneyUtil.weixinpay("购买玩湃惠民卡", "", tPayHuimin.getCode(), tPayHuimin.getSalesMoney().toString(),
+                            "/base/huimin/callBack/weixinPayHuiminCallback", "APP", ""));
 //                return payMoneyUtil.weixinpayV3("1720719391","购买玩湃惠民卡",tPayHuimin.getCode(),
 //                        "/base/huimin/callBack/weixinPayHuiminCallback1",tPayHuimin.getSalesMoney().toString());
                 case 2:
                     String string = tPayHuimin.getSalesMoney().toString();
-                    return payMoneyUtil.alipay(smid, "购买玩湃惠民卡", "购买玩湃惠民卡", "", tPayHuimin.getCode(), string,
-                            "/base/huimin/callBack/aliPayHuiminCallback");
+                    return appendPaySuccess(payMoneyUtil.alipay(smid, "购买玩湃惠民卡", "购买玩湃惠民卡", "", tPayHuimin.getCode(), string,
+                            "/base/huimin/callBack/aliPayHuiminCallback"));
             }
 
         } catch (Exception e) {
@@ -187,6 +249,19 @@
         return ResultUtil.success();
     }
 
+    /**
+     * 支付参数生成成功不代表实际支付成功,前端仍需拉起第三方支付。
+     */
+    private ResultUtil<?> appendPaySuccess(ResultUtil<?> paymentResult) {
+        JSONObject data = paymentResult.getData() == null ? new JSONObject()
+                : JSON.parseObject(JSON.toJSONString(paymentResult.getData()));
+        if (data == null) {
+            data = new JSONObject();
+        }
+        data.put("paySuccess", false);
+        return ResultUtil.getResult(paymentResult.getCode(), paymentResult.getMsg(), data);
+    }
+
 
     /**
      * 查看玩湃惠民卡详情

--
Gitblit v1.7.1