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