From ba714629588e22f9ffaab83819f6b9200a6397b3 Mon Sep 17 00:00:00 2001 From: zhanglin8526 <852614290@qq.com> Date: 星期五, 04 八月 2023 22:59:08 +0800 Subject: [PATCH] 1、定时任务 商户进件状态查询 2、小程序下单统一支付提交 3、订单核销分账(未完成) --- ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java | 821 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 680 insertions(+), 141 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 d610779..6303951 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 @@ -5,6 +5,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingReceiver; +import com.github.binarywang.wxpay.bean.profitsharingV3.ProfitSharingRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.google.common.base.Joiner; +import com.google.gson.Gson; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; @@ -12,22 +23,24 @@ 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.config.MyWxPayConfig; import com.ruoyi.order.domain.dto.*; +import com.ruoyi.order.domain.pojo.account.OrderPayment; 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; +import com.ruoyi.order.domain.pojo.order.PayRecord; import com.ruoyi.order.domain.vo.*; import com.ruoyi.order.mapper.order.OrderMapper; -import com.ruoyi.order.mapper.order.UserServiceRecordMapper; -import com.ruoyi.order.service.order.ConsumerGoodsService; -import com.ruoyi.order.service.order.OrderGoodsService; -import com.ruoyi.order.service.order.OrderService; -import com.ruoyi.order.service.order.UserServiceRecordService; +import com.ruoyi.order.service.account.OrderPaymentService; +import com.ruoyi.order.service.account.PaymentMessageService; +import com.ruoyi.order.service.order.*; 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.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; @@ -36,13 +49,16 @@ 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.shop.ShopProportionVo; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.domain.vo.*; import com.ruoyi.system.api.service.*; +import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -101,15 +117,24 @@ private RemoteActivityService remoteActivityService; @Resource - private UserServiceRecordMapper userServiceRecordMapper; + private RedisService redisService; @Resource - private RedisService redisService; + private PayRecordService payRecordService; @Autowired private RedissonClient redissonClient; - /** + @Autowired + private WxPayService wxService; + + @Resource + private PaymentMessageService paymentMessageService; + + @Resource + private OrderPaymentService orderPaymentService; + + /** * @description: buyGoods * @param: appSureOrderDto * @return: AppSureOrderVo @@ -153,10 +178,12 @@ merBaseDto.setShopId(appSureOrderDto.getShopId()); // 获取用户优惠券列表 List<AppMemberCouponVo> appMemberCouponVoList = remoteCouponService.listVoMemberCouponByUserId(merBaseDto).getData(); - // 初始化商品优惠券列表 - List<AppMemberCouponVo> appGoodsMemberCouponVoList; + // 将优惠券列表转换为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; @@ -213,8 +240,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); @@ -222,31 +249,29 @@ } } else if (couponType == 2 && appMemberCouponVo.getDiscountPercent() != null) { discountPercent = appMemberCouponVo.getDiscountPercent(); - goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP); - discountMoney = goodsRealPrice.subtract(goodsTotalPrice); + goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN,2,BigDecimal.ROUND_HALF_UP); + discountMoney = goodsTotalPrice.subtract(goodsRealPrice); useCoupon = 1; userCouponIdSet.add(memberCouponId); 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); } } - } - if(appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()){ - appSureOrderGoodsVo.setAppMemberCouponVoList(appMemberCouponVoList); } appSureOrderGoodsVo.setUseCoupon(useCoupon); appSureOrderGoodsVo.setGoodsTotalPrice(goodsTotalPrice); appSureOrderGoodsVo.setCouponDiscount(discountMoney); appSureOrderGoodsVo.setGoodsRealPrice(goodsRealPrice); - goodsDeposit = goods.getSubscription(); // 获取商品押金 goodsDeposit = goods.getSubscription(); if (goodsDeposit != null && goodsDeposit.compareTo(BigDecimal.ZERO)>0) { @@ -274,9 +299,30 @@ }else{ entity.setUseFlag(0); } + + } + // 过滤商品优惠券列表 + List<AppMemberCouponVo> appGoodsMemberCouponVoList; for(AppSureOrderGoodsVo sureOrderGoodsVo : appSureOrderGoodsVoList) { - sureOrderGoodsVo.setAppMemberCouponVoList(appMemberCouponVoList); + appGoodsMemberCouponVoList = new ArrayList<>(); + for(AppMemberCouponVo entity : appMemberCouponVoList){ + if(StringUtils.isBlank(entity.getRelGoodsIds())||entity.getRelGoodsIds().contains(sureOrderGoodsVo.getGoodsId())){ + 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.getCouponType()==3){ + if(entity.getDiscountMoney().compareTo(sureOrderGoodsVo.getGoodsTotalPrice())<0){ + appGoodsMemberCouponVoList.add(entity); + } + } + + } + } + sureOrderGoodsVo.setAppMemberCouponVoList(appGoodsMemberCouponVoList); } } /*if (appMemberCouponVoList != null && !appMemberCouponVoList.isEmpty()) { @@ -376,13 +422,21 @@ if (activityGoodsGetVo.getActivityStatus() == 2) { throw new ServiceException(AppErrorConstant.ACTIVITY_END); } - if (activityGoodsGetVo.getAvailableBuyNum() < 1) { + Integer surpNum = redisService.getCacheObject(SecurityConstant.ACTIVITY_GOODS+"-"+activityId+"-"+goodsId); + if(surpNum==null||surpNum<1){ throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_NULL); + } + if (activityGoodsGetVo.getAvailableBuyNum() < 1) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND); + } + if (activityGoodsGetVo.getAvailableBuyNum() < buyNum) { + throw new ServiceException(AppErrorConstant.ACTIVITY_GOODS_BEYOND); } Goods goods = remoteGoodsService.getGoods(goodsId).getData(); if(goods.getGoodsStatus()!=1){ throw new ServiceException(AppErrorConstant.GOODS_DOWN); } + appPanicBuyVo.setActivityId(activityId); appPanicBuyVo.setGoodsId(goodsId); appPanicBuyVo.setGoodsName(goods.getGoodsName()); appPanicBuyVo.setGoodsIntroduction(goods.getGoodsIntroduction()); @@ -431,6 +485,7 @@ * @return */ @Override + @Transactional public AppPlaceOrderVo placeOrder(AppPlaceOrderDto appPlaceOrderDto) { // 获取用户ID Long userId = appPlaceOrderDto.getUserId(); @@ -462,7 +517,7 @@ Integer serviceNum; Integer goodsNum = 0; String memberCouponId; - Goods goods; + Goods goods = null; GoodsFile goodsFile; BigDecimal goodsPrice; BigDecimal goodsTotalPrice; @@ -494,6 +549,7 @@ HashSet<String> goodsTypeSet = new HashSet<>(); //使用优惠券 StringJoiner memberCouponSJ = new StringJoiner(","); + List<String> goodsNameList = new ArrayList<>(); // 遍历购买的商品列表 for (AppBuyGoodsDto appBuyGoodsDto : appBuyGoodsDtoList) { appSureOrderGoodsVo = new AppSureOrderGoodsVo(); @@ -503,6 +559,7 @@ memberCouponId = appBuyGoodsDto.getMemberCouponId(); // 获取商品信息 goods = goodsMap.get(goodsId); + goodsNameList.add(goods.getGoodsName()); // 设置商品信息 appSureOrderGoodsVo.setGoodsId(goodsId); appSureOrderGoodsVo.setGoodsName(goods.getGoodsName()); @@ -548,8 +605,8 @@ } } else if (couponType == 2 && appMemberCouponVo.getDiscountPercent() != null) { discountPercent = appMemberCouponVo.getDiscountPercent(); - goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP); - discountMoney = goodsRealPrice.subtract(goodsTotalPrice); + goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN,2, BigDecimal.ROUND_HALF_UP); + discountMoney = goodsTotalPrice.subtract(goodsRealPrice); useCoupon = 1; } else if (couponType == 3 && appMemberCouponVo.getDiscountMoney() != null) { discountMoney = appMemberCouponVo.getDiscountMoney(); @@ -600,6 +657,7 @@ orderGoods.setServiceNum(serviceNum); orderGoods.setGoodsType(goods.getGoodsType()); orderGoods.setGoodsName(goods.getGoodsName()); + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); orderGoods.setGoodsPicture(goodsFile.getFileUrl()); // 保存订单商品 orderGoodsService.save(orderGoods); @@ -634,19 +692,20 @@ order.setReceivableMoney(orderPayMoney); order.setReceivableDeposit(orderPayDeposit); order.setChangeReceivableMoney(orderPayMoney); - order.setPayType(appPlaceOrderDto.getPayType()); // 根据支付类型计算支付金额 - if (order.getPayType() == 1) { + if (appPlaceOrderDto.getPayType() == 1) { order.setPayMoney(orderPayMoney); order.setOnlinePayMoney(orderPayMoney); appPlaceOrderVo.setPayMoney(orderPayMoney); appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setPayType(1); order.setCloseFlag(1); - } else if (order.getPayType() == 2) { + } else if (appPlaceOrderDto.getPayType() == 2) { order.setPayMoney(orderPayDeposit); order.setOnlinePayMoney(orderPayDeposit); appPlaceOrderVo.setPayMoney(orderPayDeposit); appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setPayType(2); order.setCloseFlag(0); } order.setOrderRemark(appPlaceOrderDto.getOrderRemark()); @@ -663,25 +722,92 @@ } appPlaceOrderVo.setOrderId(orderId); appPlaceOrderVo.setOrderNo(orderNo); - // 调用支付 - //减去优惠券 - if(memberCouponSJ!=null){ - remoteCouponService.useMemberCoupon(memberCouponSJ.toString()); + + try { + // 创建支付订单 + Long shopId = appPlaceOrderDto.getShopId(); + R<String> resultMch = remoteShopService.getShopSubMchId(shopId); + String subMchId = resultMch.getData(); + if(StringUtils.isEmpty(subMchId)){ + throw new ServiceException("获取微信商户号失败"); + } + + WxPayConfig config = wxService.getConfig(); + config.setSubMchId(subMchId); + + WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); + request.setTradeType(WxPayConstants.TradeType.JSAPI); + request.setSubMchId(subMchId); + // 商户订单号 + request.setOutTradeNo(orderNo); + // 订单总金额 + Integer totalFee = order.getPayMoney().multiply(new BigDecimal(100)).intValue(); + request.setTotalFee(totalFee); + request.setProductId(orderNo); + request.setNotifyUrl(config.getNotifyUrl()); + request.setProfitSharing("Y"); + request.setOpenid(appPlaceOrderDto.getOpenid()); + request.setSpbillCreateIp(appPlaceOrderDto.getSpbillCreateIp()); + // 商品描述 body + String body = "商品购买"; + if(null != goods){ + body = goods.getGoodsName() + "-" + body; + } + request.setBody(body); + + request.checkAndSign(config); + + // 请求参数 + Gson gson = new Gson(); + String payRequestJson = gson.toJson(request); + + WxPayMpOrderResult result = wxService.createOrder(request); + + String payResponseJson = gson.toJson(request); + + // 支付相关信息返回 + appPlaceOrderVo.setAppId(result.getAppId()); + appPlaceOrderVo.setMchId(config.getMchId()); + appPlaceOrderVo.setTimeStamp(result.getTimeStamp()); + appPlaceOrderVo.setNonceStr(result.getNonceStr()); + appPlaceOrderVo.setPackageStr(result.getPackageValue()); + appPlaceOrderVo.setSignType(result.getSignType()); + appPlaceOrderVo.setPaySign(result.getPaySign()); + appPlaceOrderVo.setPrepayId(result.getPackageValue()); + + //减去优惠券 + if(StringUtils.isNotBlank(memberCouponSJ.toString())){ + 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); + appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(),delayTime)); + + + // 保存支付订单统一下单日志 + paymentMessageService.savePaymentMessage("1", 0L, payRequestJson, payResponseJson); + + // 保存支付订单统一下单支付记录 + orderPaymentService.saveOrderPayment(userId, shopId, orderId, order.getPayMoney(), + appPlaceOrderVo.getEndTime(), "Y", appPlaceOrderDto.getOpenid(), + Joiner.on(";").join(goodsNameList),result.getPackageValue()); + + return appPlaceOrderVo; + } catch (WxPayException e){ + throw new ServiceException(e.getMessage()); } - //生成自动取消订单延时任务 - 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; } + /** * @param appPlaceActivityDto @@ -691,6 +817,7 @@ * @date 2023/7/6 17:59 */ @Override + @Transactional public AppPlaceOrderVo placeActivityOrder(AppPlaceActivityDto appPlaceActivityDto) { Long userId = appPlaceActivityDto.getUserId(); // 创建订单对象 @@ -750,8 +877,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(); @@ -820,6 +947,7 @@ orderGoods.setServiceNum(serviceNum); orderGoods.setGoodsType(goods.getGoodsType()); orderGoods.setGoodsName(goods.getGoodsName()); + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); orderGoods.setGoodsPicture(goodsFile.getFileUrl()); // 保存订单商品 orderGoodsService.save(orderGoods); @@ -860,19 +988,22 @@ order.setReceivableMoney(orderPayMoney); order.setReceivableDeposit(orderPayDeposit); order.setChangeReceivableMoney(orderPayMoney); - order.setPayType(appPlaceActivityDto.getPayType()); + order.setActivityId(activityId); + order.setActivityName(activityGoodsGetVo.getActivityName()); // 根据支付类型设置订单支付金额,在线支付金额,订单支付金额,未支付金额,关闭标志 - if (order.getPayType() == 1) { + if (appPlaceActivityDto.getPayType() == 1) { order.setPayMoney(orderPayMoney); order.setOnlinePayMoney(orderPayMoney); appPlaceOrderVo.setPayMoney(orderPayMoney); appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setPayType(1); order.setCloseFlag(1); - } else if (order.getPayType() == 2) { + } else if (appPlaceActivityDto.getPayType() == 2) { order.setPayMoney(orderPayDeposit); order.setOnlinePayMoney(orderPayDeposit); appPlaceOrderVo.setPayMoney(orderPayDeposit); appPlaceOrderVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getPayMoney())); + order.setPayType(2); order.setCloseFlag(0); } // 设置订单备注,商品数量,创建时间 @@ -902,6 +1033,52 @@ agStockChangeDto.setUserId(order.getUserId()); remoteActivityService.changeActivityStock(agStockChangeDto); // 调用支付 + /*PrepayRequest request = new PrepayRequest(); + Amount amount = new Amount(); + amount.setTotal(Integer.parseInt(order.getPayMoney().multiply(new BigDecimal(100)).toString())); + request.setAmount(amount); + request.setAppid(this.appId); + request.setMchid(this.mchId); + request.setDescription(order.getGoodsInfo()); + request.setNotifyUrl(this.notifyUrl); + request.setOutTradeNo(order.getOrderId()); + Payer payer = new Payer(); + // TODO 获取openID + payer.setOpenid("oLTPCuN5a-nBD4rAL_fa********"); + + request.setPayer(payer);*/ + + //设置订单允许分账 秒杀活动才允许分账 + /*if(order.getOrderFrom()==2){ + SettleInfo settleInfo=new SettleInfo(); + settleInfo.setProfitSharing(true); + request.setSettleInfo(settleInfo); + }*/ + + + //返回前端唤醒支付结果信息 + /*PrepayWithRequestPaymentResponse res = this.getJsApIResponse(request); + + appPlaceOrderVo.setAppId(this.appId); + appPlaceOrderVo.setTimeStamp(res.getTimeStamp()); + appPlaceOrderVo.setNonceStr(res.getNonceStr()); + appPlaceOrderVo.setPackageStr(res.getPackageVal()); + 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)){ @@ -914,6 +1091,7 @@ delayTask.setEndTime(DateUtils.addMinutes(new Date(),delayTime)); delayTask.setRedisKey(DelayTaskEnum.ORDER_AUTOMATIC_CANCEL.getCode() + "-" + orderId); remoteConfigService.addDelayTask(delayTask); + appPlaceOrderVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(),delayTime)); return appPlaceOrderVo; } @@ -941,6 +1119,10 @@ Shop shopTemp = remoteShopService.getShop(shopIdLong).getData(); shopMap.put(shopIdLong, shopTemp); }); + Integer delayTime = 30; + if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){ + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } for (AppUserOrderPageVo appUserOrderPageVo : appUserOrderPageVoList) { shop = shopMap.get(appUserOrderPageVo.getShopId()); appUserOrderPageVo.setShopName(shop.getShopName()); @@ -951,6 +1133,7 @@ appUserOrderPageVo.setSameShop(0); } appUserOrderPageVo.setVerifyCode("1-" + appUserOrderPageVo.getOrderId()); + appUserOrderPageVo.setEndTime(DateUtils.addMinutes(appUserOrderPageVo.getCreateTime(),delayTime)); } } return appUserOrderPageVoList; @@ -975,6 +1158,8 @@ appUserOrderGetVo.setCouponDiscount(order.getCouponMoney()); appUserOrderGetVo.setReceivableDeposit(order.getReceivableDeposit()); appUserOrderGetVo.setReceivableMoney(order.getReceivableMoney()); + appUserOrderGetVo.setUnpaidMoney(order.getReceivableMoney().subtract(order.getOnlinePayMoney())); + appUserOrderGetVo.setPayType(order.getPayType()); appUserOrderGetVo.setPayMoney(order.getPayMoney()); appUserOrderGetVo.setOrderRemark(order.getOrderRemark()); appUserOrderGetVo.setShopId(order.getShopId()); @@ -987,6 +1172,12 @@ appUserOrderGetVo.setShopName(shop.getShopName()); appUserOrderGetVo.setAppUserOrderGoodsPageVoList(appUserOrderGoodsPageVoList); appUserOrderGetVo.setVerifyCode("1-" + orderId); + //生成自动取消订单延时任务 + Integer delayTime = 30; + if(redisService.hasKey(SecurityConstant.AUTO_CANCEL_ORDER_TIME)){ + delayTime = redisService.getCacheObject(SecurityConstant.AUTO_CANCEL_ORDER_TIME); + } + appUserOrderGetVo.setEndTime(DateUtils.addMinutes(order.getCreateTime(),delayTime)); return appUserOrderGetVo; } @@ -998,7 +1189,9 @@ @Override public void cancelOrder(String orderId) { Order order = this.getById(orderId); - if (order.getOrderStatus() == 1) { + if (order.getOrderStatus() == 0) { + throw new ServiceException(AppErrorConstant.CANCEL_CANCEL_ORDER); + }else if (order.getOrderStatus() == 1) { this.autoCancelOrder(orderId); }else if(order.getOrderStatus() == 2){ this.refundOrder(orderId); @@ -1078,9 +1271,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; @@ -1093,6 +1286,7 @@ * @return */ @Override + @Transactional public MerVerifyOrderVo sureVerifyOrder(MerVerifyOrderDto merVerifyOrderDto) { String orderId = merVerifyOrderDto.getOrderId(); BigDecimal relReceiveMoney = merVerifyOrderDto.getRelReceiveMoney(); @@ -1103,14 +1297,23 @@ 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); + } order.setOrderStatus(3); order.setUseTime(nowTime); order.setUseUserId(merVerifyOrderDto.getUserId()); order.setOfflinePayMoney(relPayMoney); order.setOffPayTime(nowTime); order.setPayMoney(order.getPayMoney().add(relPayMoney)); - order.setCloseFlag(1); order.setChangeReceivableMoney(relReceiveMoney); + if(order.getPayMoney().compareTo(order.getChangeReceivableMoney())>=0){ + order.setCloseFlag(1); + }else{ + order.setCloseFlag(0); + } this.saveOrUpdate(order); //创建服务商品 List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listAppVoByOrderId(orderId); @@ -1127,28 +1330,57 @@ Goods goods; List<ConsumerGoods> consumerGoodsList = new ArrayList<>(); for (AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList) { - consumerGoods = new ConsumerGoods(); - goods = goodsMap.get(appUserOrderGoodsPageVo.getGoodsId()); - consumerGoodsId = IdUtils.simpleUUID(); - consumerGoods.setConsumerGoodsId(consumerGoodsId); - consumerGoods.setDelFlag(0); - consumerGoods.setServiceStatus(1); - consumerGoods.setShopId(order.getShopId()); - consumerGoods.setUserId(order.getUserId()); - consumerGoods.setOrderId(orderId); - consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); - consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); - consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); - consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); - consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); - consumerGoods.setUsedNum(0); - consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); - consumerGoods.setCreateTime(nowTime); - consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); - consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); - consumerGoods.setGoodsNurses(goods.getGoodsNurses()); - consumerGoods.setSourceFrom(1); - consumerGoodsList.add(consumerGoods); + Integer buyNum = appUserOrderGoodsPageVo.getBuyNum(); + if(appUserOrderGoodsPageVo.getCycleNumFlag()==0){ + consumerGoods = new ConsumerGoods(); + goods = goodsMap.get(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); + consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); + consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); + consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoods.setSureNum(buyNum); + consumerGoodsList.add(consumerGoods); + }else{ + for(int i=0;i<buyNum;i++){ + consumerGoods = new ConsumerGoods(); + goods = goodsMap.get(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); + consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); + consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); + consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoodsList.add(consumerGoods); + } + } } consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList); //生成返回 @@ -1167,9 +1399,55 @@ 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){ + // profitsSharingService.applyProfitSharing(); + } + + //创建支付记录 + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(order.getOrderId()); + payRecord.setPayMoney(merVerifyOrderDto.getRelPayMoney()); + payRecord.setPayTime(new Date()); + payRecord.setPayType(2); + payRecordService.save(payRecord); + + // TODO 核销完成 开始分账(平台收取服务费) + OrderPayment payment = orderPaymentService.getByOrderId(orderId); + String transactionId = payment.getTransactionId(); + + String platformTyMacId = MyWxPayConfig.getPlatformTyMacId(); + + R<String> resultMch = remoteShopService.getShopSubMchId(order.getShopId()); + String subMchId = resultMch.getData(); + if(StringUtils.isEmpty(subMchId)){ + throw new ServiceException("获取微信商户号失败"); + } + + R<ShopProportionVo> resultShopProportion = remoteShopService.getShopProportion(order.getShopId()); + ShopProportionVo shopProportion = resultShopProportion.getData(); + if(null == shopProportion){ + throw new ServiceException("获取商户分成失败"); + } + + ProfitSharingRequest request = new ProfitSharingRequest(); + request.setSubMchId(subMchId); + request.setTransactionId(transactionId); + request.setOutOrderNo(order.getOrderNo()); + List<ProfitSharingReceiver> receiverList = new ArrayList<>(); + ProfitSharingReceiver receiver = new ProfitSharingReceiver(); + // TODO 分账 + // receiver.set + // request.setReceivers(); + + // platformTyMacId + // wxService.getProfitSharingV3Service().profitSharing() + return merVerifyOrderVo; } @@ -1181,8 +1459,13 @@ * @date 2023/6/28 11:26 */ @Override + @Transactional public MerVerifyCouponVo sureVerifyCoupon(MerVerifyCouponDto merVerifyCouponDto) { MerVerifyCouponGetVo verifyCouponGetVo = remoteCouponService.getVerifyCoupon(merVerifyCouponDto.getMemberCouponId()).getData(); + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyCouponDto.getUserId()).getData(); + if(!shopRelUserVo.getShopId().equals(verifyCouponGetVo.getMemberCoupon().getShopId())){ + throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } // 创建MerVerifyCouponVo对象 MerVerifyCouponVo merVerifyCouponVo = new MerVerifyCouponVo(); // 调用remoteCouponService的getVerifyCoupon方法获取MerVerifyCouponGetVo对象 @@ -1190,7 +1473,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()); @@ -1270,14 +1553,19 @@ * @return MerVerifyAwardVo */ @Override + @Transactional 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); } + ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(merVerifyPrizeDto.getUserId()).getData(); + if(!shopRelUserVo.getShopId().equals(memberGiftRecord.getShopId())){ + 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("平台生日卡"); @@ -1381,11 +1669,23 @@ @Override public void merCloseOrder(MerCloseOrderDto merCloseOrderDto) { Order order = this.getById(merCloseOrderDto.getOrderId()); - order.setOfflinePayMoney(merCloseOrderDto.getPayMoney()); + order.setOfflinePayMoney(order.getOfflinePayMoney().add(merCloseOrderDto.getPayMoney())); order.setOffPayTime(new Date()); order.setPayMoney(order.getPayMoney().add(merCloseOrderDto.getPayMoney())); - order.setCloseFlag(1); + if(order.getPayMoney().compareTo(order.getChangeReceivableMoney())>=0){ + order.setCloseFlag(0); + }else{ + order.setCloseFlag(1); + } this.saveOrUpdate(order); + //创建支付记录 + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(order.getOrderId()); + payRecord.setPayMoney(merCloseOrderDto.getPayMoney()); + payRecord.setPayTime(new Date()); + payRecord.setPayType(2); + payRecordService.save(payRecord); } /** @@ -1397,6 +1697,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(); @@ -1424,6 +1726,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(); @@ -1440,8 +1745,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); @@ -1502,7 +1805,7 @@ } } else if (couponType == 2 && appMemberCouponVo.getDiscountPercent() != null) { discountPercent = appMemberCouponVo.getDiscountPercent(); - goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP); + goodsRealPrice = goodsTotalPrice.multiply(discountPercent).divide(BigDecimal.TEN,2, BigDecimal.ROUND_HALF_UP); discountMoney = goodsRealPrice.subtract(goodsTotalPrice); } else if (couponType == 3 && appMemberCouponVo.getDiscountMoney() != null) { discountMoney = appMemberCouponVo.getDiscountMoney(); @@ -1540,6 +1843,7 @@ orderGoods.setServiceNum(serviceNum); orderGoods.setGoodsType(goods.getGoodsType()); orderGoods.setGoodsName(goods.getGoodsName()); + orderGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); orderGoods.setGoodsPicture(goodsFile.getFileUrl()); orderGoodsService.save(orderGoods); switch (orderGoods.getGoodsType()) { @@ -1582,7 +1886,6 @@ order.setPayMoney(orderPayMoney); order.setOnlinePayMoney(new BigDecimal("0.00")); order.setOfflinePayMoney(orderPayMoney); - order.setCloseFlag(1); order.setOrderRemark(merNewOrderDto.getOrderRemark()); order.setGoodsNum(goodsNum); order.setCreateTime(nowTime); @@ -1593,35 +1896,72 @@ order.setOnlinePayMoney(new BigDecimal("0.00")); order.setOfflinePayMoney(merNewOrderDto.getPayMoney()); order.setOffPayTime(nowTime); - order.setCloseFlag(1); + order.setPayType(1); + if(order.getPayMoney().compareTo(order.getChangeReceivableMoney())>=0){ + order.setCloseFlag(0); + }else{ + order.setCloseFlag(1); + } this.save(order); //创建服务 List<AppUserOrderGoodsPageVo> appUserOrderGoodsPageVoList = orderGoodsService.listAppVoByOrderId(orderId); ConsumerGoods consumerGoods; String consumerGoodsId; + List<ConsumerGoods> consumerGoodsList = new ArrayList<>(); for (AppUserOrderGoodsPageVo appUserOrderGoodsPageVo : appUserOrderGoodsPageVoList) { - consumerGoods = new ConsumerGoods(); - goods = remoteGoodsService.getGoods(appUserOrderGoodsPageVo.getGoodsId()).getData(); - consumerGoodsId = IdUtils.simpleUUID(); - consumerGoods.setConsumerGoodsId(consumerGoodsId); - consumerGoods.setDelFlag(0); - consumerGoods.setServiceStatus(1); - consumerGoods.setShopId(order.getShopId()); - consumerGoods.setUserId(order.getUserId()); - consumerGoods.setOrderId(orderId); - consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); - consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); - consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); - consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); - consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); - consumerGoods.setUsedNum(0); - consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); - consumerGoods.setCreateTime(nowTime); - consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); - consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); - consumerGoods.setGoodsNurses(goods.getGoodsNurses()); - consumerGoodsService.save(consumerGoods); + Integer buyGoodsNum = appUserOrderGoodsPageVo.getBuyNum(); + if(appUserOrderGoodsPageVo.getCycleNumFlag()==0){ + consumerGoods = new ConsumerGoods(); + goods = remoteGoodsService.getGoods(appUserOrderGoodsPageVo.getGoodsId()).getData(); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); + consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); + consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); + consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoods.setSureNum(buyGoodsNum); + consumerGoodsList.add(consumerGoods); + }else{ + for(int i=0;i<buyGoodsNum;i++) { + consumerGoods = new ConsumerGoods(); + goods = remoteGoodsService.getGoods(appUserOrderGoodsPageVo.getGoodsId()).getData(); + consumerGoodsId = IdUtils.simpleUUID(); + consumerGoods.setConsumerGoodsId(consumerGoodsId); + consumerGoods.setDelFlag(0); + consumerGoods.setServiceStatus(1); + consumerGoods.setShopId(order.getShopId()); + consumerGoods.setUserId(order.getUserId()); + consumerGoods.setOrderId(orderId); + consumerGoods.setOrderGoodsId(appUserOrderGoodsPageVo.getOrderGoodsId()); + consumerGoods.setGoodsId(appUserOrderGoodsPageVo.getGoodsId()); + consumerGoods.setGoodsName(appUserOrderGoodsPageVo.getGoodsName()); + consumerGoods.setCycleNumFlag(appUserOrderGoodsPageVo.getCycleNumFlag()); + consumerGoods.setServiceNum(appUserOrderGoodsPageVo.getServiceNum()); + consumerGoods.setUsedNum(0); + consumerGoods.setGoodsType(appUserOrderGoodsPageVo.getGoodsType()); + consumerGoods.setCreateTime(nowTime); + consumerGoods.setGoodsIntroduction(goods.getGoodsIntroduction()); + consumerGoods.setGoodsPicture(appUserOrderGoodsPageVo.getGoodsPicture()); + consumerGoods.setGoodsNurses(goods.getGoodsNurses()); + consumerGoods.setSourceFrom(1); + consumerGoodsList.add(consumerGoods); + } + } } + consumerGoodsService.saveBatchConsumerGoods(consumerGoodsList); Member member = remoteMemberService.getMember(userId).getData(); if (member != null && member.getBindingFlag() != 1) { //绑定商户 @@ -1640,6 +1980,14 @@ shopTotalChangeDto.setExperienceMoney(experienceMoney); shopTotalChangeDto.setGoodsMoney(goodsMoney); remoteShopService.changeShopTotal(shopTotalChangeDto); + //创建支付记录 + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(orderId); + payRecord.setPayMoney(order.getPayMoney()); + payRecord.setPayTime(order.getPayTime()); + payRecord.setPayType(2); + payRecordService.save(payRecord); } @@ -1649,6 +1997,18 @@ */ @Override public List<MerOrderPageVo> pageMerOrder(Page page, MerOrderPageDto merOrderPageDto) { + if(StringUtils.isNotBlank(merOrderPageDto.getKeyword())){ + MgtUserIdByKeywordDto userIdByKeywordDto = new MgtUserIdByKeywordDto(); + userIdByKeywordDto.setKeyword(merOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo userIdByKeywordVo = remoteMemberService.getUserIdByKeyword(userIdByKeywordDto).getData(); + if(StringUtils.isNotBlank(userIdByKeywordVo.getUserIds())){ + List<Long> userIdList = Arrays.stream(userIdByKeywordVo.getUserIds().split(",")) + .map(Long::parseLong) + .collect(Collectors.toList()); + merOrderPageDto.setMemberUserIdList(userIdList); + merOrderPageDto.setMemberUserId(null); + } + } List<MerOrderPageVo> merOrderPageVoList = orderMapper.pageMerOrder(page, merOrderPageDto); if (merOrderPageVoList != null && !merOrderPageVoList.isEmpty()) { Long userId; @@ -1671,7 +2031,7 @@ orderFromDesc = "商城订单"; } merOrderPageVo.setOrderFromDesc(orderFromDesc); - merOrderPageVo.setUnPaidMoney(merOrderPageVo.getReceivableMoney().subtract(merOrderPageVo.getPayMoney())); + merOrderPageVo.setUnPaidMoney(merOrderPageVo.getPayMoney().subtract(merOrderPageVo.getReceiveMoney())); if (merOrderPageVo.getUnPaidMoney() == null) { merOrderPageVo.setUnPaidMoney(zeroBig); } @@ -1682,8 +2042,13 @@ Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream() .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity())); for (MerOrderPageVo merOrderPageVo : merOrderPageVoList) { - merOrderPageVo.setUserName(userMap.get(merOrderPageVo.getUserId()).getNickName()); - merOrderPageVo.setUserMobile(userMap.get(merOrderPageVo.getUserId()).getUserMobile()); + if(merOrderPageVo.getUserId()!=null&&userMap.get(merOrderPageVo.getUserId())!=null){ + merOrderPageVo.setUserName(userMap.get(merOrderPageVo.getUserId()).getRealName()); + merOrderPageVo.setNickName(userMap.get(merOrderPageVo.getUserId()).getNickName()); + merOrderPageVo.setUserMobile(userMap.get(merOrderPageVo.getUserId()).getUserMobile()); + }else{ + log.debug("订单merOrderPageVo"+merOrderPageVo.getOrderId()+"缺少用户"); + } } } return merOrderPageVoList; @@ -1736,6 +2101,7 @@ if (mgtMemberOrderPageVoList != null && !mgtMemberOrderPageVoList.isEmpty()) { Long shopId; HashSet<String> set = new HashSet<>(); + BigDecimal zeroBig = new BigDecimal("0.00"); // 遍历MgtMemberOrderPageVoList,获取shopId并添加到set中 for (MgtMemberOrderPageVo mgtMemberOrderPageVo : mgtMemberOrderPageVoList) { shopId = mgtMemberOrderPageVo.getShopId(); @@ -1754,6 +2120,8 @@ for (MgtMemberOrderPageVo mgtMemberOrderPageVo : mgtMemberOrderPageVoList) { shopId = mgtMemberOrderPageVo.getShopId(); mgtMemberOrderPageVo.setShopName(map.get(shopId).getShopName()); + BigDecimal unPaidMoney = mgtMemberOrderPageVo.getReceivableMoney().subtract(mgtMemberOrderPageVo.getPayMoney()); + mgtMemberOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney); } } // 返回MgtMemberOrderPageVoList @@ -1821,7 +2189,9 @@ for (MgtActivityOrderPageVo mgtActivityOrderPageVo : activityOrderPageVoList) { mgtActivityOrderPageVo.setShopName(shopMap.get(mgtActivityOrderPageVo.getShopId()).getShopName()); if (userMap.get(mgtActivityOrderPageVo.getUserId()) != null) { - mgtActivityOrderPageVo.setUserName(userMap.get(mgtActivityOrderPageVo.getUserId()).getNickName()); + mgtActivityOrderPageVo.setNickName(userMap.get(mgtActivityOrderPageVo.getUserId()).getNickName()); + mgtActivityOrderPageVo.setUserName(userMap.get(mgtActivityOrderPageVo.getUserId()).getRealName()); + mgtActivityOrderPageVo.setUserMobile(userMap.get(mgtActivityOrderPageVo.getUserId()).getUserMobile()); } BigDecimal unPaidMoney = mgtActivityOrderPageVo.getReceivableMoney().subtract(mgtActivityOrderPageVo.getPayMoney()); mgtActivityOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney); @@ -1945,7 +2315,9 @@ } if (userMap != null && !userMap.isEmpty()) { if (userMap.get(mgtShopOrderPageVo.getUserId()) != null) { - mgtShopOrderPageVo.setUserName(userMap.get(mgtShopOrderPageVo.getUserId()).getNickName()); + mgtShopOrderPageVo.setNickName(userMap.get(mgtShopOrderPageVo.getUserId()).getNickName()); + mgtShopOrderPageVo.setUserName(userMap.get(mgtShopOrderPageVo.getUserId()).getRealName()); + mgtShopOrderPageVo.setUserMobile(userMap.get(mgtShopOrderPageVo.getUserId()).getUserMobile()); } } BigDecimal unPaidMoney = mgtShopOrderPageVo.getReceivableMoney().subtract(mgtShopOrderPageVo.getPayMoney()); @@ -2042,8 +2414,15 @@ mgtOrderDetailVo.setCancelTime(order.getCancelTime()); mgtOrderDetailVo.setOrderRemark(order.getOrderRemark()); mgtOrderDetailVo.setShopId(order.getShopId()); - mgtOrderDetailVo.setShopName(shop.getShopName()); + if(shop!=null){ + mgtOrderDetailVo.setShopName(shop.getShopName()); + }else{ + mgtOrderDetailVo.setShopName("商户已被删除"); + } mgtOrderDetailVo.setVerifyTime(order.getUseTime()); + //获取支付记录 + List<MgtOrderPayListVo> orderPayListVoList = payRecordService.listMgtOrderPayVo(orderId); + mgtOrderDetailVo.setOrderPayListVoList(orderPayListVoList); return mgtOrderDetailVo; } @@ -2624,17 +3003,21 @@ throw new ServiceException(AppErrorConstant.COUPON_EXPIRED); } else if (couponStatus == 2) { throw new ServiceException(AppErrorConstant.COUPON_USED); - } else if (couponStatus != 0) { + } else if (couponStatus != 1) { throw new ServiceException(AppErrorConstant.COUPON_NO_FIND); } - if (!memberCoupon.getShopId().equals(shopId)) { + if (memberCoupon.getCouponFrom()==2&&!memberCoupon.getShopId().equals(shopId)) { throw new ServiceException(AppErrorConstant.VERIFY_SHOP_ERROR); + } + //如果是平台优惠券 + if(memberCoupon.getCouponFrom()==1&&memberCoupon.getShopId()==null){ + memberCoupon.setShopId(shopId); } List<Goods> goodsList = verifyCouponGetVo.getGoodsList(); 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()); @@ -2683,7 +3066,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("平台生日卡"); @@ -2788,9 +3171,9 @@ } MerOrderDistributionTotalVo orderDistributionTotalVo = new MerOrderDistributionTotalVo(); // 获取订单年龄用户列表 - List<MerOrderAgeUserVo> orderAgeUserVoList = remoteMemberService.listOrderAgeUser(merTotalDto).getData(); + //List<MerOrderAgeUserVo> orderAgeUserVoList = remoteMemberService.listOrderAgeUser(merTotalDto).getData(); // 如果订单年龄用户列表不为空 - if (orderAgeUserVoList != null && !orderAgeUserVoList.isEmpty()) { + /*if (orderAgeUserVoList != null && !orderAgeUserVoList.isEmpty()) { // 定义变量 Integer ageType; List<Long> userIdList; @@ -2831,12 +3214,23 @@ orderTotalValue[i] = 0; orderMoneyValue[i] = BigDecimal.ZERO; } + }*/ + List<MgtMapTotalPlusVo> mgtMapTotalPlusVoList = orderMapper.listMerOrderDistributionTotal(merTotalDto); + if(mgtMapTotalPlusVoList!=null&&!mgtMapTotalPlusVoList.isEmpty()) { + String[] orderTotalKey = new String[mgtMapTotalPlusVoList.size()]; + Integer[] orderTotalValue = new Integer[mgtMapTotalPlusVoList.size()]; + BigDecimal[] orderMoneyValue = new BigDecimal[mgtMapTotalPlusVoList.size()]; + MgtMapTotalPlusVo mgtMapTotalPlusVo; + for (int i = 0; i < mgtMapTotalPlusVoList.size(); i++) { + mgtMapTotalPlusVo = mgtMapTotalPlusVoList.get(i); + orderTotalKey[i] = mgtMapTotalPlusVo.getMapKey(); + orderTotalValue[i] = mgtMapTotalPlusVo.getMapValueFirst(); + orderMoneyValue[i] = mgtMapTotalPlusVo.getMapValueSecond(); + } + orderDistributionTotalVo.setOrderTotalKey(orderTotalKey); + orderDistributionTotalVo.setOrderTotalValue(orderTotalValue); + orderDistributionTotalVo.setOrderMoneyValue(orderMoneyValue); } - // 设置订单分布总数对象的属性值 - orderDistributionTotalVo.setOrderTotalKey(orderTotalKey); - orderDistributionTotalVo.setOrderTotalValue(orderTotalValue); - orderDistributionTotalVo.setOrderMoneyValue(orderMoneyValue); - } // 返回订单分布总数对象 return orderDistributionTotalVo; } @@ -2941,15 +3335,29 @@ } /** - * @param merBaseDto - * @return MerTotalOrderVo - * @description 商户端订单管理统计 - * @author jqs - * @date 2023/7/4 16:27 + * @description 商户端订单管理统计 + * @author jqs + * @date 2023/7/31 10:53 + * @param merOrderPageDto + * @return MerTotalOrderVo */ @Override - public MerTotalOrderVo totalMerOrder(MerBaseDto merBaseDto) { - return orderMapper.totalMerOrder(merBaseDto.getShopId()); + public MerTotalOrderVo totalMerOrder(MerOrderPageDto merOrderPageDto) { + MerTotalOrderVo merTotalOrderVo = new MerTotalOrderVo(); + if(StringUtils.isNotBlank(merOrderPageDto.getKeyword())){ + MgtUserIdByKeywordDto userIdByKeywordDto = new MgtUserIdByKeywordDto(); + userIdByKeywordDto.setKeyword(merOrderPageDto.getKeyword()); + MgtUserIdByKeywordVo userIdByKeywordVo = remoteMemberService.getUserIdByKeyword(userIdByKeywordDto).getData(); + if(StringUtils.isNotBlank(userIdByKeywordVo.getUserIds())){ + List<Long> userIdList = Arrays.stream(userIdByKeywordVo.getUserIds().split(",")) + .map(Long::parseLong) + .collect(Collectors.toList()); + merOrderPageDto.setMemberUserIdList(userIdList); + merOrderPageDto.setMemberUserId(null); + } + } + merTotalOrderVo = orderMapper.totalMerOrder(merOrderPageDto); + return merTotalOrderVo; } /** @@ -3018,6 +3426,7 @@ * @return void */ @Override + @Transactional public void autoCancelOrder(String orderId){ //更新订单信息 Order order = this.getById(orderId); @@ -3048,6 +3457,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{ @@ -3072,12 +3488,14 @@ * @description 订单支付回调 * @author jqs * @date 2023/7/13 17:57 - * @param orderId + * @param transaction * @return void */ @Override - public void payBack(String orderId) { + @Transactional + public void payBack(Transaction transaction) { // 更新订单状态 + String orderId=transaction.getOutTradeNo(); Order order = this.getById(orderId); order.setOrderStatus(2); order.setPayTime(new Date()); @@ -3094,6 +3512,8 @@ Boolean haveGoods = false; // 获取订单中的所有商品 List<OrderGoods> orderGoodsList = orderGoodsService.listByOrderId(orderId); + List<GoodsTotalChangeDto> goodsTotalChangeDtoList = new ArrayList<>(); + GoodsTotalChangeDto goodsTotalChangeDto; // 遍历订单中的所有商品,根据商品类型累加收款金额,并标记商品存在状态 for (OrderGoods orderGoods : orderGoodsList) { switch (orderGoods.getGoodsType()) { @@ -3116,7 +3536,18 @@ default: break; } + goodsTotalChangeDto = new GoodsTotalChangeDto(); + goodsTotalChangeDto.setGoodsId(orderGoods.getGoodsId()); + goodsTotalChangeDto.setChangeType(1); + goodsTotalChangeDto.setChangeNum(orderGoods.getBuyNum()); + goodsTotalChangeDto.setMoney(orderGoods.getGoodsReceivableMoney()); + Integer bugGoodsNum = orderMapper.countUserBuyGoodsNum(order.getUserId(),orderGoods.getGoodsId()); + if(bugGoodsNum==null||bugGoodsNum<1){ + goodsTotalChangeDto.setPersonNum(1); + } + goodsTotalChangeDtoList.add(goodsTotalChangeDto); } + //更新商品统计 // 更新商户统计信息 ShopTotalChangeDto shopTotalChangeDto = new ShopTotalChangeDto(); shopTotalChangeDto.setShopId(order.getShopId()); @@ -3171,7 +3602,24 @@ } activityTotalChangeDto.setUserId(order.getUserId()); remoteActivityService.changeActivityTotal(activityTotalChangeDto); + + + //活动订单进行分账 + /*ProfitSharingApplyRequest request=new ProfitSharingApplyRequest(); + request.setAppid(this.appId); + request.setSubMchid(""); + request.setTransactionId(transaction.getTransactionId()); + profitsSharingService.applyProfitSharing(request);*/ } + //生成支付记录 + OrderPayment orderPayment = new OrderPayment(); + PayRecord payRecord = new PayRecord(); + payRecord.setDelFlag(0); + payRecord.setOrderId(orderId); + payRecord.setPayMoney(order.getPayMoney()); + payRecord.setPayTime(order.getPayTime()); + payRecord.setPayType(1); + payRecordService.save(payRecord); } /** @@ -3182,6 +3630,7 @@ * @return void */ @Override + @Transactional public void refundOrder(String orderId){ //更新订单信息 Order order = this.getById(orderId); @@ -3234,6 +3683,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()); } @@ -3558,4 +4014,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()); + + } + } + } + } + } } -- Gitblit v1.7.1