bug
jiangqs
2023-07-25 eac1bb48ce6df55a923981a99c26693406f877e9
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -28,6 +28,7 @@
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.activity.ActivityRecord;
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;
@@ -175,7 +176,10 @@
        List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(merBaseDto).getData();
        // 将优惠券列表转换为Map,以优惠券ID为键
        Map<String, AppMemberCouponVo> appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity()));
        Map<String, AppMemberCouponVo> appMemberCouponVoMap = new HashMap<>();
        if(appMemberCouponVoList!=null&&!appMemberCouponVoList.isEmpty()){
            appMemberCouponVoMap = appMemberCouponVoList.stream().collect(Collectors.toMap(AppMemberCouponVo::getMemberCouponId, Function.identity()));
        }
        AppMemberCouponVo appMemberCouponVo;
        Integer couponType;
        BigDecimal moneyThreshold;
@@ -232,8 +236,8 @@
                    couponType = appMemberCouponVo.getCouponType();
                    if (couponType == 1 && appMemberCouponVo.getMoneyThreshold() != null && appMemberCouponVo.getDiscountMoney() != null) {
                        moneyThreshold = appMemberCouponVo.getMoneyThreshold();
                        if (goodsTotalPrice.compareTo(moneyThreshold) >= 0) {
                            discountMoney = appMemberCouponVo.getDiscountMoney();
                        discountMoney = appMemberCouponVo.getDiscountMoney();
                        if (goodsTotalPrice.compareTo(moneyThreshold) >= 0 && goodsTotalPrice.compareTo(discountMoney)>0) {
                            goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                            useCoupon = 1;
                            userCouponIdSet.add(memberCouponId);
@@ -248,13 +252,15 @@
                        appSureOrderGoodsVo.setMemberCouponId(memberCouponId);
                    } else if (couponType == 3 && appMemberCouponVo.getDiscountMoney() != null) {
                        discountMoney = appMemberCouponVo.getDiscountMoney();
                        goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                        if(goodsRealPrice.compareTo(BigDecimal.ZERO)<0){
                            goodsRealPrice = BigDecimal.ZERO;
                        if(goodsTotalPrice.compareTo(discountMoney)>0){
                            goodsRealPrice = goodsTotalPrice.subtract(discountMoney);
                            if(goodsRealPrice.compareTo(BigDecimal.ZERO)<0){
                                goodsRealPrice = BigDecimal.ZERO;
                            }
                            useCoupon = 1;
                            userCouponIdSet.add(memberCouponId);
                            appSureOrderGoodsVo.setMemberCouponId(memberCouponId);
                        }
                        useCoupon = 1;
                        userCouponIdSet.add(memberCouponId);
                        appSureOrderGoodsVo.setMemberCouponId(memberCouponId);
                    }
                }
            }
@@ -262,7 +268,6 @@
            appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice);
            appSureOrderGoodsVo.setCouponDiscount(discountMoney);
            appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice);
            goodsDeposit = goods.getSubscription();
            // 获取商品押金
            goodsDeposit = goods.getSubscription();
            if (goodsDeposit != null && goodsDeposit.compareTo(BigDecimal.ZERO)>0) {
@@ -290,6 +295,8 @@
                }else{
                    entity.setUseFlag(0);
                }
            }
            // 过滤商品优惠券列表
            List<AppMemberCouponVo> appGoodsMemberCouponVoList;
@@ -297,10 +304,14 @@
                appGoodsMemberCouponVoList = new ArrayList<>();
                for(AppMemberCouponVo entity : appMemberCouponVoList){
                    if(StringUtils.isBlank(entity.getRelGoodsIds())||entity.getRelGoodsIds().contains(sureOrderGoodsVo.getGoodsId())){
                        if(entity.getCouponType()!=1){
                        if(entity.getCouponType()==1){
                            if(entity.getMoneyThreshold().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0&&entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0){
                                appGoodsMemberCouponVoList.add(entity);
                            }
                        }else if(entity.getCouponType()==2){
                            appGoodsMemberCouponVoList.add(entity);
                        }else{
                            if(entity.getMoneyThreshold().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0){
                        }else if(entity.getCouponType()==3){
                            if(entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0){
                                appGoodsMemberCouponVoList.add(entity);
                            }
                        }
@@ -409,6 +420,9 @@
        }
        if (activityGoodsGetVo.getAvailableBuyNum() < 1) {
            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
        }
        if (activityGoodsGetVo.getAvailableBuyNum() < buyNum) {
            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND);
        }
        Goods goods = remoteGoodsService.getGoods(goodsId).getData();
        if(goods.getGoodsStatus()!=1){
@@ -726,7 +740,7 @@
        //减去优惠券
        if(memberCouponSJ!=null){
        if(memberCouponSJ!=null&&StringUtils.isNotBlank(memberCouponSJ.toString())){
            remoteCouponService.useMemberCoupon(memberCouponSJ.toString());
        }
        //生成自动取消订单延时任务
@@ -814,8 +828,8 @@
        if (activityGoodsGetVo.getAvailableBuyNum() < 1) {
            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
        }
        if (buyNum < activityGoodsGetVo.getAvailableBuyNum()) {
            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL);
        if (activityGoodsGetVo.getAvailableBuyNum() < buyNum) {
            throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND);
        }
        // 创建订单ID和订单号
        String orderId = IdUtils.simpleUUID();
@@ -1000,7 +1014,19 @@
        appPlaceOrderVo.setTradeType(res.getSignType());
        appPlaceOrderVo.setPaySign(res.getPaySign());
*/
        //生成活动参加记录
        ActivityRecord activityRecord = new ActivityRecord();
        activityRecord.setDelFlag(0);
        activityRecord.setActivityId(activityId);
        activityRecord.setUserId(userId);
        activityRecord.setOrderTime(order.getCreateTime());
        activityRecord.setOrderMoney(order.getOrderMoney());
        activityRecord.setOrderId(orderId);
        activityRecord.setCreateTime(new Date());
        activityRecord.setBuyNum(orderGoods.getBuyNum());
        activityRecord.setGoodsId(orderGoods.getGoodsId());
        activityRecord.setActivityMoney(activityGoodsGetVo.getActivityPrice());
        remoteActivityService.addActivityRecord(activityRecord);
        //生成自动取消订单延时任务
        Integer delayTime = 30;
        if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){
@@ -1184,9 +1210,9 @@
        merVerifyOrderVo.setUseTime(order.getUseTime());
        merVerifyOrderVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList);
        // 根据订单用户ID获取用户信息
        SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData();
        merVerifyOrderVo.setUserName(sysUser.getNickName());
        merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber());
        Member member = remoteMemberService.getMember(order.getUserId()).getData();
        merVerifyOrderVo.setUserName(member.getRealName());
        merVerifyOrderVo.setUserMobile(member.getMobile());
        merVerifyOrderVo.setCloseFlag(order.getCloseFlag());
        // 返回结果
        return merVerifyOrderVo;
@@ -1210,6 +1236,7 @@
        if (order.getOrderStatus() != 2) {
            throw new ServiceException(AppErrorConstant.VERIFY_USED);
        }
        ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyOrderDto.getUserId()).getData();
        if(!shopRelUserVo.getShopId().equals(order.getShopId())){
            throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR);
@@ -1278,9 +1305,10 @@
        merVerifyOrderVo.setCreateTime(order.getCreateTime());
        merVerifyOrderVo.setPayTime(order.getPayTime());
        merVerifyOrderVo.setUseTime(order.getUseTime());
        SysUser sysUser = remoteUserService.getSysUser(order.getUserId()).getData();
        merVerifyOrderVo.setUserName(sysUser.getNickName());
        merVerifyOrderVo.setUserMobile(sysUser.getPhonenumber());
        Member member = remoteMemberService.getMember(order.getUserId()).getData();
        merVerifyOrderVo.setUserName(member.getRealName());
        merVerifyOrderVo.setUserMobile(member.getMobile());
        merVerifyOrderVo.setCloseFlag(order.getCloseFlag());
        //
        if(order.getOrderFrom()==2){
@@ -1312,7 +1340,7 @@
        Long userId = verifyCouponGetVo.getUserId();
        // 调用remoteMemberService的getMember方法获取Member对象
        Member member = remoteMemberService.getMember(userId).getData();
        merVerifyCouponVo.setUserName(member.getNickName());
        merVerifyCouponVo.setUserName(member.getRealName());
        merVerifyCouponVo.setUserMobile(member.getMobile());
        merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom());
        merVerifyCouponVo.setCouponName(verifyCouponGetVo.getMemberCoupon().getCouponName());
@@ -1404,7 +1432,7 @@
            throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR);
        }
        Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData();
        merVerifyAwardVo.setUserName(member.getNickName());
        merVerifyAwardVo.setUserName(member.getRealName());
        merVerifyAwardVo.setUserMobile(member.getMobile());
        if(memberGiftRecord.getGiftFrom()==1){
            merVerifyAwardVo.setGiftFrom("平台生日卡");
@@ -1524,6 +1552,8 @@
    public void createNewOrder(MerNewOrderDto merNewOrderDto) {
        Long userId = merNewOrderDto.getBuyUserId();
        Date nowTime = new Date();
        Long shopId = merNewOrderDto.getShopId();
        Shop shop = remoteShopService.getShop(shopId).getData();
        //如果非指定用户判断是否需要通过手机号创建新用户
        if (userId == null) {
            String name = merNewOrderDto.getName();
@@ -1551,6 +1581,9 @@
                member.setMobile(mobile);
                member.setRealName(name);
                member.setNickName(name);
                member.setBindingFlag(1);
                member.setRelationShopId(shopId);
                member.setRelationShopName(shop.getShopName());
                remoteMemberService.createNewMember(member);
            }
            userId = sysUser.getUserId();
@@ -1567,8 +1600,6 @@
        BigDecimal goodsPrice;
        BigDecimal goodsTotalPrice;
        BigDecimal goodsRealPrice;
        Long shopId = merNewOrderDto.getShopId();
        Shop shop = remoteShopService.getShop(shopId).getData();
        MerBaseDto merBaseDto = new MerBaseDto();
        merBaseDto.setUserId(userId);
        merBaseDto.setShopId(shopId);
@@ -2762,7 +2793,7 @@
        Long userId = verifyCouponGetVo.getUserId();
        // 调用remoteMemberService的getMember方法获取Member对象
        Member member = remoteMemberService.getMember(userId).getData();
        merVerifyCouponVo.setUserName(member.getNickName());
        merVerifyCouponVo.setUserName(member.getRealName());
        merVerifyCouponVo.setUserMobile(member.getMobile());
        merVerifyCouponVo.setCouponFrom(verifyCouponGetVo.getCouponFrom());
        merVerifyCouponVo.setCouponName(verifyCouponGetVo.getMemberCoupon().getCouponName());
@@ -2811,7 +2842,7 @@
            throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR);
        }
        Member member = remoteMemberService.getMember(memberGiftRecord.getUserId()).getData();
        merVerifyAwardVo.setUserName(member.getNickName());
        merVerifyAwardVo.setUserName(member.getRealName());
        merVerifyAwardVo.setUserMobile(member.getMobile());
        if(memberGiftRecord.getGiftFrom()==1){
            merVerifyAwardVo.setGiftFrom("平台生日卡");
@@ -3177,6 +3208,13 @@
                    agStockChangeDto.setShopId(order.getShopId());
                    agStockChangeDto.setUserId(order.getUserId());
                    remoteActivityService.changeActivityStock(agStockChangeDto);
                    //删除活动记录
                    ActivityRecord activityRecord = new ActivityRecord();
                    activityRecord.setActivityId(order.getActivityId());
                    activityRecord.setGoodsId(orderGoods.getGoodsId());
                    activityRecord.setUserId(order.getUserId());
                    activityRecord.setOrderTime(order.getCreateTime());
                    remoteActivityService.delActivityRecord(activityRecord);
                }
            }
        }else{
@@ -3394,6 +3432,13 @@
                    agStockChangeDto.setShopId(order.getShopId());
                    agStockChangeDto.setUserId(order.getUserId());
                    remoteActivityService.changeActivityStock(agStockChangeDto);
                    //删除活动记录
                    ActivityRecord activityRecord = new ActivityRecord();
                    activityRecord.setActivityId(order.getActivityId());
                    activityRecord.setGoodsId(orderGoods.getGoodsId());
                    activityRecord.setUserId(order.getUserId());
                    activityRecord.setOrderTime(order.getCreateTime());
                    remoteActivityService.delActivityRecord(activityRecord);
                }else{
                    memberCouponSJ.add(orderGoods.getCouponId());
                }
@@ -3718,4 +3763,87 @@
        }
        return dateList;
    }
    /**
     * @description  检查订单状态定时任务
     * @author  jqs
     * @date    2023/7/25 14:40
     * @param
     * @return  void
     */
    @Override
    public void checkOrderStatus(){
        Integer delayTime = 30;
        if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){
            delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME);
        }
        delayTime = delayTime + 5;
        Date checkTime = DateUtils.addMinutes(new Date(),delayTime);
        LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Order::getDelFlag,0);
        queryWrapper.lt(Order::getCreateTime,checkTime);
        queryWrapper.eq(Order::getOrderStatus,1);
        List<Order> orderList = this.list(queryWrapper);
        if(orderList!=null&&!orderList.isEmpty()){
            for(Order  order: orderList){
                autoTimeCancelOrder(order);
            }
        }
    }
    private void autoTimeCancelOrder(Order order){
        String orderId = order.getOrderId();
        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);
                    //删除活动记录
                    ActivityRecord activityRecord = new ActivityRecord();
                    activityRecord.setActivityId(order.getActivityId());
                    activityRecord.setGoodsId(orderGoods.getGoodsId());
                    activityRecord.setUserId(order.getUserId());
                    activityRecord.setOrderTime(order.getCreateTime());
                    remoteActivityService.delActivityRecord(activityRecord);
                }
            }
        }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());
                    }
                }
            }
        }
    }
}