From cfd0118ef446a66f91999afc7b1e46ca607adf50 Mon Sep 17 00:00:00 2001
From: jiangqs <jiangqs>
Date: 星期四, 13 七月 2023 20:32:35 +0800
Subject: [PATCH] 定时任务 统计

---
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java |  619 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 609 insertions(+), 10 deletions(-)

diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
index 5884fed..6b2ad45 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -6,11 +6,14 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.uuid.IdUtils;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.common.security.utils.CodeFactoryUtil;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.order.domain.dto.*;
+import com.ruoyi.order.domain.pojo.account.OrderRefund;
 import com.ruoyi.order.domain.pojo.order.ConsumerGoods;
 import com.ruoyi.order.domain.pojo.order.Order;
 import com.ruoyi.order.domain.pojo.order.OrderGoods;
@@ -22,21 +25,29 @@
 import com.ruoyi.order.service.order.OrderService;
 import com.ruoyi.order.service.order.UserServiceRecordService;
 import com.ruoyi.system.api.constant.AppErrorConstant;
+import com.ruoyi.system.api.constant.DelayTaskEnum;
+import com.ruoyi.system.api.constant.SecurityConstant;
 import com.ruoyi.system.api.domain.dto.*;
+import com.ruoyi.system.api.domain.poji.config.DelayTask;
 import com.ruoyi.system.api.domain.poji.goods.Goods;
 import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
 import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
 import com.ruoyi.system.api.domain.poji.member.Member;
 import com.ruoyi.system.api.domain.poji.member.MemberCoupon;
+import com.ruoyi.system.api.domain.poji.member.MemberGiftRecord;
 import com.ruoyi.system.api.domain.poji.shop.Shop;
 import com.ruoyi.system.api.domain.poji.sys.SysUser;
 import com.ruoyi.system.api.domain.vo.*;
 import com.ruoyi.system.api.service.*;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -90,6 +101,12 @@
     @Resource
     private UserServiceRecordMapper userServiceRecordMapper;
 
+    @Resource
+    private RedisService redisService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     /**
      * @description: buyGoods
      * @param: appSureOrderDto
@@ -100,9 +117,12 @@
     @Override
     public AppSureOrderVo buyGoods(AppSureOrderDto appSureOrderDto) {
         Long userId = appSureOrderDto.getUserId();
+        // 初始化订单对象
         AppSureOrderVo appSureOrderVo = new AppSureOrderVo();
+        // 初始化订单商品列表
         List<AppSureOrderGoodsVo> appSureOrderGoodsVoList = new ArrayList<>();
         AppSureOrderGoodsVo appSureOrderGoodsVo;
+        // 获取购买商品列表
         List<AppBuyGoodsDto> appBuyGoodsDtoList = appSureOrderDto.getAppBuyGoodsDtoList();
         String goodsId;
         Integer buyNum;
@@ -112,8 +132,11 @@
         BigDecimal goodsPrice;
         BigDecimal goodsTotalPrice;
         BigDecimal goodsRealPrice;
+        // 获取用户优惠券列表
         List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(userId).getData();
+        // 初始化商品优惠券列表
         List<AppMemberCouponVo> appGoodsMemberCouponVoList;
+        // 将优惠券列表转换为Map,以优惠券ID为键
         Map<String, AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity()));
         AppMemberCouponVo appMemberCouponVo;
         Integer couponType;
@@ -123,27 +146,31 @@
         BigDecimal goodsDeposit;
         GoodsFile goodsFile;
         Integer useCoupon;
+        // 初始化订单相关金额
         BigDecimal orderGoodsMoney = new BigDecimal("0.00");
         BigDecimal couponDiscount = new BigDecimal("0.00");
         BigDecimal orderPayDeposit = new BigDecimal("0.00");
         BigDecimal orderPayMoney = new BigDecimal("0.00");
+        // 遍历购买商品列表
         for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) {
             appSureOrderGoodsVo = new AppSureOrderGoodsVo();
             useCoupon = 0;
             goodsId = appBuyGoodsDto.getGoodsId();
             buyNum = appBuyGoodsDto.getBuyNum();
             memberCouponId = appBuyGoodsDto.getMemberCouponId();
+            // 获取商品信息
             goods = remoteGoodsService.getGoods(goodsId).getData();
+            // 设置订单商品信息
             appSureOrderGoodsVo.setGoodsId(goodsId);
             appSureOrderGoodsVo.setGoodsName(goods.getGoodsName());
             appSureOrderGoodsVo.setGoodsIntroduction(goods.getGoodsIntroduction());
             appSureOrderGoodsVo.setGoodsType(goods.getGoodsType());
-            //商品图片
+            // 获取商品图片
             goodsFile = remoteGoodsService.getGoodsFile(goodsId).getData();
             appSureOrderGoodsVo.setGoodsPicture(goodsFile.getFileUrl());
             appSureOrderGoodsVo.setBuyNum(buyNum);
             goodsPrice = goods.getSalesPrice();
-            //商户定制价格
+            // 获取商户定制价格
             AppShopGoodsGetDto appShopGoodsGetDto = new AppShopGoodsGetDto();
             appShopGoodsGetDto.setGoodsId(goods.getGoodsId());
             appShopGoodsGetDto.setShopId(appSureOrderDto.getShopId());
@@ -155,6 +182,7 @@
             buyNumBig = BigDecimal.valueOf(buyNum);
             goodsTotalPrice = goodsPrice.multiply(buyNumBig);
             goodsRealPrice = goodsTotalPrice;
+            // 处理优惠券
             if (memberCouponId != null) {
                 appMemberCouponVo = appMemberCouponVoMap.get(memberCouponId);
                 if (StringUtils.isBlank(appMemberCouponVo.getRelGoodsIds()) || appMemberCouponVo.getRelGoodsIds().contains(goodsId)) {
@@ -187,28 +215,45 @@
                 goodsDeposit = new BigDecimal("0.00");
             }
             appSureOrderGoodsVo.setGoodsDeposit(goodsDeposit);
+            // 计算订单总金额
             orderGoodsMoney = orderGoodsMoney.add(goodsTotalPrice);
             couponDiscount = couponDiscount.add(discountMoney);
             orderPayDeposit = orderPayDeposit.add(goodsDeposit);
             orderPayMoney = orderPayMoney.add(goodsRealPrice);
-            //商品关联优惠券
+            // 获取商品关联优惠券
             appGoodsMemberCouponVoList = new ArrayList<>();
             if (appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()) {
                 for (AppMemberCouponVo entity : appMemberCouponVoList) {
                     if (StringUtils.isBlank(entity.getRelGoodsIds())) {
-                        appGoodsMemberCouponVoList.add(entity);
+                        if (entity.getCouponType() == 1 && entity.getMoneyThreshold() != null && entity.getDiscountMoney() != null) {
+                            moneyThreshold = entity.getMoneyThreshold();
+                            if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) {
+                                appGoodsMemberCouponVoList.add(entity);
+                            }
+                        }else{
+                            appGoodsMemberCouponVoList.add(entity);
+                        }
                     } else if (entity.getRelGoodsIds().contains(goodsId)) {
-                        appGoodsMemberCouponVoList.add(entity);
+                        if (entity.getCouponType() == 1 && entity.getMoneyThreshold() != null && entity.getDiscountMoney() != null) {
+                            moneyThreshold = entity.getMoneyThreshold();
+                            if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) {
+                                appGoodsMemberCouponVoList.add(entity);
+                            }
+                        }else{
+                            appGoodsMemberCouponVoList.add(entity);
+                        }
                     }
                 }
                 appSureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList);
             }
             appSureOrderGoodsVoList.add(appSureOrderGoodsVo);
         }
+        // 设置订单相关金额
         appSureOrderVo.setOrderGoodsMoney(orderGoodsMoney);
         appSureOrderVo.setCouponDiscount(couponDiscount);
         appSureOrderVo.setOrderPayDeposit(orderPayDeposit);
         appSureOrderVo.setOrderPayMoney(orderPayMoney);
+        // 设置订单商品列表
         appSureOrderVo.setAppSureOrderGoodsVoList(appSureOrderGoodsVoList);
         return appSureOrderVo;
     }
@@ -342,6 +387,8 @@
         String orderGoodsId;
         // 创建商品类型集合,用于记录订单中所有商品的类型
         HashSet<String> goodsTypeSet = new HashSet<>();
+        //使用优惠券
+        StringJoiner memberCouponSJ = new StringJoiner(",");
         // 遍历购买的商品列表
         for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) {
             appSureOrderGoodsVo = new AppSureOrderGoodsVo();
@@ -405,6 +452,7 @@
                         useCoupon = 1;
                     }
                 }
+                memberCouponSJ.add(memberCouponId);
             }
             appSureOrderGoodsVo.setUseCoupon(useCoupon);
             appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice);
@@ -505,6 +553,22 @@
         appPlaceOrderVo.setOrderId(orderId);
         appPlaceOrderVo.setOrderNo(orderNo);
         // 调用支付
+        //使用优惠券
+        if(memberCouponSJ!=null){
+            remoteCouponService.useMemberCoupon(memberCouponSJ.toString());
+        }
+        //生成自动取消订单延时任务
+        Integer delayTime = 30;
+        if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){
+            delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME);
+        }
+        redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, orderId, delayTime.longValue(), TimeUnit.MINUTES);
+        DelayTask delayTask = new DelayTask();
+        delayTask.setDelFlag(0);
+        delayTask.setCreateTime(new Date());
+        delayTask.setEndTime(DateUtils.addMinutes(new Date(),delayTime));
+        delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId);
+        remoteConfigService.addDelayTask(delayTask);
         return appPlaceOrderVo;
     }
 
@@ -526,6 +590,20 @@
         String activityId = appPlaceActivityDto.getActivityId();
         String goodsId = appPlaceActivityDto.getGoodsId();
         Integer buyNum = appPlaceActivityDto.getBuyNum();
+        //redis库存控制极简版
+        String goodsLock = "goods_lock_"+activityId+"_"+goodsId;
+        RLock redissonLock = redissonClient.getLock(goodsLock);
+        try{
+            redissonLock.lock(30, TimeUnit.SECONDS);
+            Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId);
+            if(surpNum==null||surpNum<buyNum){
+                throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
+            }else{
+                redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId,surpNum-buyNum);
+            }
+        }finally{
+            redissonLock.unlock();
+        }
         // 定义购买数量,服务数量,商品数量
         BigDecimal buyNumBig;
         Integer serviceNum;
@@ -559,6 +637,9 @@
             throw new ServiceException(AppErrorConstant.ACTIVITY_END);
         }
         if (activityGoodsGetVo.getAvailableBuyNum() < 1) {
+            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
+        }
+        if (buyNum < activityGoodsGetVo.getAvailableBuyNum()) {
             throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
         }
         // 创建订单ID和订单号
@@ -649,7 +730,7 @@
         order.setDelFlag(0);
         order.setOrderStatus(1);
         order.setOrderNo(orderNo);
-        order.setOrderFrom(1);
+        order.setOrderFrom(2);
         order.setShopId(appPlaceActivityDto.getShopId());
         order.setUserId(userId);
         order.setOrderMoney(orderGoodsMoney);
@@ -689,7 +770,28 @@
         // 设置订单ID和订单号
         appPlaceOrderVo.setOrderId(orderId);
         appPlaceOrderVo.setOrderNo(orderNo);
+        //改变活动库存
+        AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
+        agStockChangeDto.setActivityId(activityId);
+        agStockChangeDto.setGoodsId(goodsId);
+        agStockChangeDto.setChangeType(2);
+        agStockChangeDto.setChangeNum(buyNum);
+        agStockChangeDto.setShopId(order.getShopId());
+        agStockChangeDto.setUserId(order.getUserId());
+        remoteActivityService.changeActivityStock(agStockChangeDto);
         // 调用支付
+        //生成自动取消订单延时任务
+        Integer delayTime = 30;
+        if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){
+            delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME);
+        }
+        redisService.setCacheObject(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId, orderId, delayTime.longValue(), TimeUnit.MINUTES);
+        DelayTask delayTask = new DelayTask();
+        delayTask.setDelFlag(0);
+        delayTask.setCreateTime(new Date());
+        delayTask.setEndTime(DateUtils.addMinutes(new Date(),delayTime));
+        delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId);
+        remoteConfigService.addDelayTask(delayTask);
         return appPlaceOrderVo;
     }
 
@@ -774,12 +876,13 @@
     @Override
     public void cancelOrder(String orderId) {
         Order order = this.getById(orderId);
-        if (order.getOrderStatus() != 1) {
+        if (order.getOrderStatus() == 1) {
+            this.autoCancelOrder(orderId);
+        }else if(order.getOrderStatus() == 2){
+            this.refundOrder(orderId);
+        }else{
             throw new ServiceException(AppErrorConstant.CANCEL_ERROR_ORDER);
         }
-        order.setOrderStatus(0);
-        order.setCancelTime(new Date());
-        this.saveOrUpdate(order);
     }
 
     /**
@@ -976,12 +1079,23 @@
         merVerifyCouponVo.setUserName(member.getNickName());
         merVerifyCouponVo.setUserMobile(member.getMobile());
         merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom());
+        merVerifyCouponVo.setCouponName(verifyCouponGetVo.getMemberCoupon().getCouponName());
+        merVerifyCouponVo.setCreateTime(verifyCouponGetVo.getMemberCoupon().getReceiveTime());
         // 将goodsList转换为MerCouponGoodsListVo列表,并设置相应属性
         List<MerCouponGoodsListVo> merCouponGoodsList = goodsList.stream()
                 .map(goods -> {
                     MerCouponGoodsListVo merCouponGoods = new MerCouponGoodsListVo();
                     merCouponGoods.setGoodsId(goods.getGoodsId());
                     merCouponGoods.setGoodsName(goods.getGoodsName());
+                    if (goods.getGoodsType() == 1) {
+                        merCouponGoods.setGoodsType("周期");
+                    } else if (goods.getGoodsType() == 2) {
+                        merCouponGoods.setGoodsType("服务");
+                    } else if (goods.getGoodsType() == 3) {
+                        merCouponGoods.setGoodsType("体验");
+                    } else if (goods.getGoodsType() == 4) {
+                        merCouponGoods.setGoodsType("单品");
+                    }
                     // 设置其他属性
                     return merCouponGoods;
                 })
@@ -1029,8 +1143,99 @@
             consumerGoodsList.add(consumerGoods);
         }
         consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList);
+        merVerifyCouponVo.setVerifyStatus(2);
         return merVerifyCouponVo;
     }
+
+
+    /**
+     * @description  确认核销奖品
+     * @author  jqs
+     * @date    2023/7/9 9:54
+     * @param merVerifyPrizeDto
+     * @return  MerVerifyAwardVo
+     */
+    @Override
+    public MerVerifyAwardVo sureVerifyPrize(MerVerifyPrizeDto merVerifyPrizeDto){
+        MerVerifyAwardVo merVerifyAwardVo = new MerVerifyAwardVo();
+        MemberGiftRecord memberGiftRecord = remoteMemberService.getVerifyPrize(merVerifyPrizeDto.getPrizeId()).getData();
+        if(memberGiftRecord==null||memberGiftRecord.getVerifyStatus()!=1){
+            throw new ServiceException(AppErrorConstant.COUPON_USED);
+        }
+        Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData();
+        merVerifyAwardVo.setUserName(member.getNickName());
+        merVerifyAwardVo.setUserMobile(member.getMobile());
+        if(memberGiftRecord.getGiftFrom()==1){
+            merVerifyAwardVo.setGiftFrom("平台生日卡");
+        }else{
+            merVerifyAwardVo.setGiftFrom("商户生日卡");
+        }
+        merVerifyAwardVo.setGiftType(memberGiftRecord.getGiftType());
+        List<BirthdayGiftSendDto> giftSendDtoList = new ArrayList<>();
+        BirthdayGiftSendDto birthdayGiftSendDto = new BirthdayGiftSendDto();
+        switch(memberGiftRecord.getGiftType()){
+            case 1:
+                merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName());
+                merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getCouponNumber()));
+                birthdayGiftSendDto.setUserId(memberGiftRecord.getUserId());
+                birthdayGiftSendDto.setGiftType(memberGiftRecord.getGiftType());
+                birthdayGiftSendDto.setGiftFrom(memberGiftRecord.getGiftFrom());
+                birthdayGiftSendDto.setShopId(memberGiftRecord.getShopId());
+                birthdayGiftSendDto.setCouponId(memberGiftRecord.getCouponId());
+                birthdayGiftSendDto.setCouponNumber(memberGiftRecord.getCouponNumber());
+                giftSendDtoList.add(birthdayGiftSendDto);
+                remoteCouponService.sendCouponGift(giftSendDtoList);
+                break;
+            case 2:
+                Goods goods = remoteGoodsService.getGoods(memberGiftRecord.getGoodsId()).getData();
+                merVerifyAwardVo.setGiftName(memberGiftRecord.getGoodsName());
+                merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGoodsNumber()));
+                if (goods.getGoodsType() == 1) {
+                    merVerifyAwardVo.setGiftRemark("周期");
+                } else if (goods.getGoodsType() == 2) {
+                    merVerifyAwardVo.setGiftRemark("服务");
+                } else if (goods.getGoodsType() == 3) {
+                    merVerifyAwardVo.setGiftRemark("体验");
+                } else if (goods.getGoodsType() == 4) {
+                    merVerifyAwardVo.setGiftRemark("单品");
+                }
+                birthdayGiftSendDto.setUserId(memberGiftRecord.getUserId());
+                birthdayGiftSendDto.setGiftType(memberGiftRecord.getGiftType());
+                birthdayGiftSendDto.setGiftFrom(memberGiftRecord.getGiftFrom());
+                birthdayGiftSendDto.setShopId(memberGiftRecord.getShopId());
+                birthdayGiftSendDto.setGoodsId(memberGiftRecord.getGoodsId());
+                birthdayGiftSendDto.setGoodsNumber(memberGiftRecord.getGoodsNumber());
+                giftSendDtoList.add(birthdayGiftSendDto);
+                consumerGoodsService.sendGoodsGift(giftSendDtoList);
+                break;
+            case 3:
+                merVerifyAwardVo.setGiftName("现金");
+                merVerifyAwardVo.setGiftNumber(memberGiftRecord.getMoney().doubleValue());
+                break;
+            case 4:
+                merVerifyAwardVo.setGiftName(memberGiftRecord.getGiftName());
+                merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGiftNumber()));
+                break;
+            default:
+                break;
+        }
+        merVerifyAwardVo.setCreateTime(memberGiftRecord.getCreateTime());
+        memberGiftRecord.setVerifyStatus(2);
+        memberGiftRecord.setVerifyTime(new Date());
+        if(member.getBindingFlag()!=1){
+            AppMemberBindingDto appMemberBindingDto = new AppMemberBindingDto();
+            appMemberBindingDto.setBindingFlag(1);
+            appMemberBindingDto.setShopId(merVerifyPrizeDto.getShopId());
+            Shop shop = remoteShopService.getShop(merVerifyPrizeDto.getShopId()).getData();
+            appMemberBindingDto.setShopName(shop.getShopName());
+            appMemberBindingDto.setUserId(merVerifyPrizeDto.getUserId());
+            remoteMemberService.updateMemberBinding(appMemberBindingDto);
+        }
+        merVerifyAwardVo.setPrizeId(merVerifyPrizeDto.getPrizeId());
+        merVerifyAwardVo.setVerifyStatus(2);
+        return merVerifyAwardVo;
+    }
+
 
     /**
      * 收银未结清订单列表
@@ -1310,6 +1515,7 @@
         }
         ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto();
         shopTotalChangeDto.setShopId(order.getShopId());
+        shopTotalChangeDto.setOrderType(1);
         shopTotalChangeDto.setCycleMoney(cycleMoney);
         shopTotalChangeDto.setServiceMoney(serviceMoney);
         shopTotalChangeDto.setExperienceMoney(experienceMoney);
@@ -2312,19 +2518,95 @@
         merVerifyCouponVo.setUserName(member.getNickName());
         merVerifyCouponVo.setUserMobile(member.getMobile());
         merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom());
+        merVerifyCouponVo.setCouponName(verifyCouponGetVo.getMemberCoupon().getCouponName());
+        merVerifyCouponVo.setCreateTime(verifyCouponGetVo.getMemberCoupon().getReceiveTime());
         // 将goodsList转换为MerCouponGoodsListVo列表,并设置相应属性
         List<MerCouponGoodsListVo> merCouponGoodsList = goodsList.stream()
                 .map(goods -> {
                     MerCouponGoodsListVo merCouponGoods = new MerCouponGoodsListVo();
                     merCouponGoods.setGoodsId(goods.getGoodsId());
                     merCouponGoods.setGoodsName(goods.getGoodsName());
+                    if (goods.getGoodsType() == 1) {
+                        merCouponGoods.setGoodsType("周期");
+                    } else if (goods.getGoodsType() == 2) {
+                        merCouponGoods.setGoodsType("服务");
+                    } else if (goods.getGoodsType() == 3) {
+                        merCouponGoods.setGoodsType("体验");
+                    } else if (goods.getGoodsType() == 4) {
+                        merCouponGoods.setGoodsType("单品");
+                    }
                     // 设置其他属性
                     return merCouponGoods;
                 })
                 .collect(Collectors.toList());
         // 设置merVerifyCouponVo的goodsList属性为merCouponGoodsList
         merVerifyCouponVo.setGoodsList(merCouponGoodsList);
+        merVerifyCouponVo.setVerifyStatus(1);
         return merVerifyCouponVo;
+    }
+
+    /**
+     * @description  获取核销奖品
+     * @author  jqs
+     * @date    2023/7/8 17:46
+     * @param verifyCode
+     * @param shopId
+     * @return  MerVerifyAwardVo
+     */
+    @Override
+    public MerVerifyAwardVo verifyPrize(String verifyCode,Long shopId){
+        MerVerifyAwardVo merVerifyAwardVo = new MerVerifyAwardVo();
+        MemberGiftRecord memberGiftRecord = remoteMemberService.getVerifyPrize(verifyCode).getData();
+        if(memberGiftRecord==null||memberGiftRecord.getVerifyStatus()!=1){
+            throw new ServiceException(AppErrorConstant.COUPON_USED);
+        }
+        if(memberGiftRecord.getGiftFrom()==2&&!memberGiftRecord.getShopId().equals(shopId)){
+            throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR);
+        }
+        Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData();
+        merVerifyAwardVo.setUserName(member.getNickName());
+        merVerifyAwardVo.setUserMobile(member.getMobile());
+        if(memberGiftRecord.getGiftFrom()==1){
+            merVerifyAwardVo.setGiftFrom("平台生日卡");
+        }else{
+            merVerifyAwardVo.setGiftFrom("商户生日卡");
+        }
+
+        merVerifyAwardVo.setGiftType(memberGiftRecord.getGiftType());
+        switch(memberGiftRecord.getGiftType()){
+            case 1:
+                merVerifyAwardVo.setGiftName(memberGiftRecord.getCouponName());
+                merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getCouponNumber()));
+                break;
+            case 2:
+                Goods goods = remoteGoodsService.getGoods(memberGiftRecord.getGoodsId()).getData();
+                merVerifyAwardVo.setGiftName(memberGiftRecord.getGoodsName());
+                merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGoodsNumber()));
+                if (goods.getGoodsType() == 1) {
+                    merVerifyAwardVo.setGiftRemark("周期");
+                } else if (goods.getGoodsType() == 2) {
+                    merVerifyAwardVo.setGiftRemark("服务");
+                } else if (goods.getGoodsType() == 3) {
+                    merVerifyAwardVo.setGiftRemark("体验");
+                } else if (goods.getGoodsType() == 4) {
+                    merVerifyAwardVo.setGiftRemark("单品");
+                }
+                break;
+            case 3:
+                merVerifyAwardVo.setGiftName("现金");
+                merVerifyAwardVo.setGiftNumber(memberGiftRecord.getMoney().doubleValue());
+                break;
+            case 4:
+                merVerifyAwardVo.setGiftName(memberGiftRecord.getGiftName());
+                merVerifyAwardVo.setGiftNumber(Double.valueOf(memberGiftRecord.getGiftNumber()));
+                break;
+            default:
+                break;
+        }
+        merVerifyAwardVo.setCreateTime(memberGiftRecord.getCreateTime());
+        merVerifyAwardVo.setVerifyStatus(1);
+        merVerifyAwardVo.setPrizeId(verifyCode);
+        return merVerifyAwardVo;
     }
 
     /**
@@ -2360,6 +2642,13 @@
             merTotalDto.setShopId(null);
         }
         MerOrderTotalVo orderTotalVo = orderMapper.getMerOrderTotalOrderFrom(merTotalDto);
+        MerOrderTotalVo goodsTypeVo = orderMapper.getMerTotalOrderTotalGoodsType(merTotalDto);
+        orderTotalVo.setCycleTotal(goodsTypeVo.getCycleTotal());
+        orderTotalVo.setCycleMoney(goodsTypeVo.getCycleMoney());
+        orderTotalVo.setExperienceTotal(goodsTypeVo.getExperienceTotal());
+        orderTotalVo.setExperienceMoney(goodsTypeVo.getExperienceMoney());
+        orderTotalVo.setServiceTotal(goodsTypeVo.getServiceTotal());
+        orderTotalVo.setServiceMoney(goodsTypeVo.getServiceMoney());
         return orderTotalVo;
     }
 
@@ -2601,4 +2890,314 @@
         }
         return shopAllOrderPageVoList;
     }
+
+    /**
+     * @description 自动取消订单
+     * @author  jqs
+     * @date    2023/7/13 17:15
+     * @param orderId
+     * @return  void
+     */
+    @Override
+    public void autoCancelOrder(String orderId){
+        //更新订单信息
+        Order order = this.getById(orderId);
+        order.setOrderStatus(0);
+        order.setCancelTime(new Date());
+        this.saveOrUpdate(order);
+        //活动订单回退库存
+        if(order.getOrderFrom()==2){
+            List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+            if(orderGoodsList!=null&&!orderGoodsList.isEmpty()){
+                for(OrderGoods orderGoods : orderGoodsList){
+                    //redis库存控制极简版
+                    String goodsLock = "goods_lock_"+order.getActivityId()+"_"+orderGoods.getGoodsId();
+                    RLock redissonLock = redissonClient.getLock(goodsLock);
+                    try{
+                        redissonLock.lock(30, TimeUnit.SECONDS);
+                        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId());
+                        redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId(),surpNum+orderGoods.getBuyNum());
+                    }finally{
+                        redissonLock.unlock();
+                    }
+                    //改变活动库存
+                    AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
+                    agStockChangeDto.setActivityId(order.getActivityId());
+                    agStockChangeDto.setGoodsId(orderGoods.getGoodsId());
+                    agStockChangeDto.setChangeType(1);
+                    agStockChangeDto.setChangeNum(orderGoods.getBuyNum());
+                    agStockChangeDto.setShopId(order.getShopId());
+                    agStockChangeDto.setUserId(order.getUserId());
+                    remoteActivityService.changeActivityStock(agStockChangeDto);
+                }
+            }
+        }else{
+            if(order.getCouponMoney().compareTo(BigDecimal.ZERO)>0){
+                //回退优惠券
+                List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+                if(orderGoodsList!=null&&!orderGoodsList.isEmpty()) {
+                    StringJoiner memberCouponSJ = new StringJoiner(",");
+                    for (OrderGoods orderGoods : orderGoodsList) {
+                        memberCouponSJ.add(orderGoods.getCouponId());
+                    }
+                    if(memberCouponSJ!=null){
+                        remoteCouponService.backMemberCoupon(memberCouponSJ.toString());
+
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @description  订单支付回调
+     * @author  jqs
+     * @date    2023/7/13 17:57
+     * @param orderId
+     * @return  void
+     */
+    @Override
+    public void payBack(String orderId) {
+        // 更新订单状态
+        Order order = this.getById(orderId);
+        order.setOrderStatus(2);
+        order.setPayTime(new Date());
+        this.saveOrUpdate(order);
+        // 初始化各类商品的收款金额
+        BigDecimal cycleMoney = new BigDecimal("0.00");
+        BigDecimal experienceMoney = new BigDecimal("0.00");
+        BigDecimal serviceMoney = new BigDecimal("0.00");
+        BigDecimal goodsMoney = new BigDecimal("0.00");
+        // 初始化各类商品的存在状态
+        Boolean haveCycle = false;
+        Boolean haveService = false;
+        Boolean haveExperience = false;
+        Boolean haveGoods = false;
+        // 获取订单中的所有商品
+        List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+        // 遍历订单中的所有商品,根据商品类型累加收款金额,并标记商品存在状态
+        for (OrderGoods orderGoods : orderGoodsList) {
+            switch (orderGoods.getGoodsType()) {
+                case 1:
+                    cycleMoney = cycleMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveCycle = true;
+                    break;
+                case 2:
+                    serviceMoney = serviceMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveService = true;
+                    break;
+                case 3:
+                    experienceMoney = experienceMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveExperience = true;
+                    break;
+                case 4:
+                    goodsMoney = goodsMoney.add(orderGoods.getGoodsReceivableMoney());
+                    haveGoods = true;
+                    break;
+                default:
+                    break;
+            }
+        }
+        // 更新商户统计信息
+        ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto();
+        shopTotalChangeDto.setShopId(order.getShopId());
+        shopTotalChangeDto.setOrderType(1);
+        shopTotalChangeDto.setCycleMoney(cycleMoney);
+        shopTotalChangeDto.setServiceMoney(serviceMoney);
+        shopTotalChangeDto.setExperienceMoney(experienceMoney);
+        shopTotalChangeDto.setGoodsMoney(goodsMoney);
+        remoteShopService.changeShopTotal(shopTotalChangeDto);
+        // 初始化会员统计信息
+        MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto();
+        memberTotalChangeDto.setUserId(order.getUserId());
+        // 如果存在积分兑换比例,则计算积分
+        if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) {
+            Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL);
+            BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue);
+            BigDecimal integralBig = moneyValueBig.multiply(order.getPayMoney());
+            Integer integral = Integer.valueOf(integralBig.toString());
+            memberTotalChangeDto.setChangeIntegral(integral);
+            memberTotalChangeDto.setTypeIntegral(1);
+        }
+        // 设置会员支付金额和支付时间
+        memberTotalChangeDto.setPayMoney(order.getPayMoney());
+        memberTotalChangeDto.setPayTime(new Date());
+        // 根据商品存在状态,设置会员统计信息
+        if (haveCycle) {
+            memberTotalChangeDto.setCycleOrderChange(1);
+        }
+        if (haveService) {
+            memberTotalChangeDto.setServiceOrderChange(1);
+        }
+        if (haveExperience) {
+            memberTotalChangeDto.setExperienceOrderChange(1);
+        }
+        if (haveGoods) {
+            memberTotalChangeDto.setGoodsOrderChange(1);
+        }
+        // 更新会员统计信息
+        remoteMemberService.changeMemberTotal(memberTotalChangeDto);
+        // 如果订单来源于活动,则更新活动统计信息
+        if (order.getOrderFrom() == 2) {
+            ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto();
+            activityTotalChangeDto.setActivityId(order.getActivityId());
+            activityTotalChangeDto.setChangeType(1);
+            activityTotalChangeDto.setChangeNum(1);
+            activityTotalChangeDto.setMoney(order.getPayMoney());
+            Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId());
+            if (userActivityNum == 1) {
+                activityTotalChangeDto.setPersonNum(1);
+            } else {
+                activityTotalChangeDto.setPersonNum(0);
+            }
+            activityTotalChangeDto.setUserId(order.getUserId());
+            remoteActivityService.changeActivityTotal(activityTotalChangeDto);
+        }
+    }
+
+    /**
+     * @description  订单退款
+     * @author  jqs
+     * @date    2023/7/13 18:36
+     * @param orderId
+     * @return  void
+     */
+    @Override
+    public void refundOrder(String orderId){
+        //更新订单信息
+        Order order = this.getById(orderId);
+        order.setOrderStatus(0);
+        order.setCancelTime(new Date());
+        this.saveOrUpdate(order);
+        OrderRefund orderRefund = new OrderRefund();
+        String refundId = IdUtils.simpleUUID();
+        orderRefund.setRefundId(refundId);
+        orderRefund.setDelFlag(0);
+        orderRefund.setRefundType(1);
+        orderRefund.setOrderId(order.getOrderId());
+        orderRefund.setUserId(order.getUserId());
+        orderRefund.setShopId(order.getShopId());
+        orderRefund.setRefundMoney(order.getPayMoney());
+        orderRefund.setOrderMoney(order.getPayMoney());
+        orderRefund.setCreateTime(new Date());
+        // 初始化各类商品的收款金额
+        BigDecimal cycleMoney = new BigDecimal("0.00");
+        BigDecimal experienceMoney = new BigDecimal("0.00");
+        BigDecimal serviceMoney = new BigDecimal("0.00");
+        BigDecimal goodsMoney = new BigDecimal("0.00");
+        // 初始化各类商品的存在状态
+        Boolean haveCycle = false;
+        Boolean haveService = false;
+        Boolean haveExperience = false;
+        Boolean haveGoods = false;
+        List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId);
+        if(orderGoodsList!=null&&!orderGoodsList.isEmpty()){
+            StringJoiner memberCouponSJ = new StringJoiner(",");
+            for(OrderGoods orderGoods : orderGoodsList){
+                if(order.getOrderFrom()==2){
+                    //redis库存控制极简版
+                    //活动订单回退库存
+                    String goodsLock = "goods_lock_"+order.getActivityId()+"_"+orderGoods.getGoodsId();
+                    RLock redissonLock = redissonClient.getLock(goodsLock);
+                    try{
+                        redissonLock.lock(30, TimeUnit.SECONDS);
+                        Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId());
+                        redisService.setCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+order.getActivityId()+"-"+orderGoods.getGoodsId(),surpNum+orderGoods.getBuyNum());
+                    }finally{
+                        redissonLock.unlock();
+                    }
+                    //改变活动库存
+                    AGStockChangeDto agStockChangeDto = new AGStockChangeDto();
+                    agStockChangeDto.setActivityId(order.getActivityId());
+                    agStockChangeDto.setGoodsId(orderGoods.getGoodsId());
+                    agStockChangeDto.setChangeType(1);
+                    agStockChangeDto.setChangeNum(orderGoods.getBuyNum());
+                    agStockChangeDto.setShopId(order.getShopId());
+                    agStockChangeDto.setUserId(order.getUserId());
+                    remoteActivityService.changeActivityStock(agStockChangeDto);
+                }else{
+                    memberCouponSJ.add(orderGoods.getCouponId());
+                }
+                switch (orderGoods.getGoodsType()) {
+                    case 1:
+                        cycleMoney = cycleMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveCycle = true;
+                        break;
+                    case 2:
+                        serviceMoney = serviceMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveService = true;
+                        break;
+                    case 3:
+                        experienceMoney = experienceMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveExperience = true;
+                        break;
+                    case 4:
+                        goodsMoney = goodsMoney.add(orderGoods.getGoodsReceivableMoney());
+                        haveGoods = true;
+                        break;
+                    default:
+                        break;
+                }
+            }
+            //回退优惠券
+            if(memberCouponSJ!=null){
+                remoteCouponService.backMemberCoupon(memberCouponSJ.toString());
+            }
+        }
+        // 更新商户统计信息
+        ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto();
+        shopTotalChangeDto.setOrderType(2);
+        shopTotalChangeDto.setShopId(order.getShopId());
+        shopTotalChangeDto.setCycleMoney(cycleMoney);
+        shopTotalChangeDto.setServiceMoney(serviceMoney);
+        shopTotalChangeDto.setExperienceMoney(experienceMoney);
+        shopTotalChangeDto.setGoodsMoney(goodsMoney);
+        remoteShopService.changeShopTotal(shopTotalChangeDto);
+        // 初始化会员统计信息
+        MemberTotalChangeDto memberTotalChangeDto = new MemberTotalChangeDto();
+        memberTotalChangeDto.setUserId(order.getUserId());
+        // 如果存在积分兑换比例,则计算积分
+        /*if (redisService.hasKey(SecurityConstant.PAY_MONEY_INTEGRAL)) {
+            Integer moneyValue = redisService.getCacheObject(SecurityConstant.PAY_MONEY_INTEGRAL);
+            BigDecimal moneyValueBig = BigDecimal.valueOf(moneyValue);
+            BigDecimal integralBig = moneyValueBig.multiply(order.getPayMoney());
+            Integer integral = Integer.valueOf(integralBig.toString());
+            memberTotalChangeDto.setChangeIntegral(integral);
+            memberTotalChangeDto.setTypeIntegral(2);
+        }*/
+        // 设置会员支付金额和支付时间
+        memberTotalChangeDto.setPayMoney(order.getPayMoney().negate());
+        // 根据商品存在状态,设置会员统计信息
+        if (haveCycle) {
+            memberTotalChangeDto.setCycleOrderChange(-1);
+        }
+        if (haveService) {
+            memberTotalChangeDto.setServiceOrderChange(-1);
+        }
+        if (haveExperience) {
+            memberTotalChangeDto.setExperienceOrderChange(-1);
+        }
+        if (haveGoods) {
+            memberTotalChangeDto.setGoodsOrderChange(-1);
+        }
+        // 更新会员统计信息
+        remoteMemberService.changeMemberTotal(memberTotalChangeDto);
+        // 如果订单来源于活动,则更新活动统计信息
+        if (order.getOrderFrom() == 2) {
+            ActivityTotalChangeDto activityTotalChangeDto = new ActivityTotalChangeDto();
+            activityTotalChangeDto.setActivityId(order.getActivityId());
+            activityTotalChangeDto.setChangeType(2);
+            activityTotalChangeDto.setChangeNum(1);
+            activityTotalChangeDto.setRefundNum(1);
+            activityTotalChangeDto.setMoney(order.getPayMoney());
+            Integer userActivityNum = orderMapper.countUserActivityByActivity(order.getUserId(), order.getActivityId());
+            if (userActivityNum > 0) {
+                activityTotalChangeDto.setPersonNum(1);
+            } else {
+                activityTotalChangeDto.setPersonNum(0);
+            }
+            activityTotalChangeDto.setUserId(order.getUserId());
+            remoteActivityService.changeActivityTotal(activityTotalChangeDto);
+        }
+    }
 }

--
Gitblit v1.7.1