From b22df417e0bc423c788b013feaad686531d69eed Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期三, 08 一月 2025 09:51:37 +0800 Subject: [PATCH] 修改bug --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java | 549 ++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 423 insertions(+), 126 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java index db2b7cd..d8b27db 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java @@ -19,12 +19,18 @@ import com.ruoyi.order.model.OrderGood; import com.ruoyi.order.model.ShoppingCart; import com.ruoyi.order.service.*; +import com.ruoyi.order.util.payment.PaymentUtil; +import com.ruoyi.order.util.payment.model.CloseOrderResult; +import com.ruoyi.order.util.payment.model.UniPayCallbackResult; +import com.ruoyi.order.util.payment.model.UniPayResult; import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.other.api.vo.GetGoodsBargainPrice; import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; import com.ruoyi.other.api.vo.GetSeckillActivityInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -32,9 +38,11 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.*; import java.util.stream.Collectors; +@Slf4j @Service public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, ShoppingCart> implements ShoppingCartService { @@ -101,17 +109,16 @@ @Resource private UserChangeLogClient userChangeLogClient; - - - - - - @Resource private PointSettingClient pointSettingClient; @Resource private OrderBalancePaymentService orderBalancePaymentService; + + @Resource + private RedisTemplate redisTemplate; + + @@ -135,7 +142,8 @@ } List<Integer> goodsIds = data.stream().map(Goods::getId).collect(Collectors.toList()); //查询符合商品类型的商品数据 - List<ShoppingCart> list = this.list(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds)); + List<ShoppingCart> list = this.list(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid) + .in(ShoppingCart::getGoodsId, goodsIds).eq(ShoppingCart::getStatus, 1)); //构建返回数据 List<MyShoppingCartVo> page = buildDetail(appUser, shopId, list, null); return page; @@ -149,7 +157,7 @@ * @param shopId * @return */ - public Price getPrice(AppUser appUser, Integer goodsId, Integer shopId){ + public Price getPrice(AppUser appUser, Integer goodsId, Integer type, Integer shopId){ //获取支付价格 //秒杀活动>门店特价>地区价格>会员价格 //判断是否有秒杀活动 @@ -158,7 +166,8 @@ info.setGoodsId(goodsId); info.setVip(appUser.getVipId()); GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); - if(null == goodsSeckill){ + //没有秒杀活动或者添加的普通商品则不使用秒杀活动价格 + if(null == goodsSeckill || type == 1){ //没有秒杀价,则判断门店特价 GetGoodsBargainPrice goodsBargainPrice = new GetGoodsBargainPrice(); goodsBargainPrice.setGoodsId(goodsId); @@ -281,9 +290,18 @@ @Override public Long addGoods(ShoppingCart shoppingCart) { Long userid = tokenService.getLoginUserApplet().getUserid(); - shoppingCart.setAppUserId(userid); - this.save(shoppingCart); - return shoppingCart.getId(); + ShoppingCart one = this.getOne(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid) + .eq(ShoppingCart::getGoodsId, shoppingCart.getGoodsId()).eq(ShoppingCart::getType, shoppingCart.getType()).eq(ShoppingCart::getStatus, 1)); + if(null != one){ + one.setNumber(one.getNumber() + shoppingCart.getNumber()); + this.updateById(one); + return one.getId(); + }else{ + shoppingCart.setAppUserId(userid); + shoppingCart.setStatus(1); + this.save(shoppingCart); + return shoppingCart.getId(); + } } @@ -329,12 +347,15 @@ JSONArray objects = JSON.parseArray(goodsJson); Long id = objects.getJSONObject(0).getLong("id"); Integer num1 = objects.getJSONObject(0).getInteger("num"); + Integer type = objects.getJSONObject(0).getInteger("type"); ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.setAppUserId(userid); shoppingCart.setGoodsId(id.intValue()); shoppingCart.setNumber(num1); - Long shoppingCarId = addGoods(shoppingCart); - confirmOrder.setGoodsJson("[{\"id\": " + shoppingCarId + ", \"num\": " + num1 + "}]"); + shoppingCart.setType(type); + shoppingCart.setStatus(0); + this.save(shoppingCart); + confirmOrder.setGoodsJson("[{\"id\": " + shoppingCart.getId() + ", \"num\": " + num1 + ",\"type\":" + type + "}]"); } AppUser appUser = appUserClient.getAppUserById(userid); Integer shopId = confirmOrder.getShopId(); @@ -355,24 +376,103 @@ confirmOrderVo.setShopName(shop.getName()); //现金支付 if(confirmOrder.getPaymentType() == 1){ - BigDecimal bigDecimal = goodsList.stream().map(MyShoppingCartVo::getCash).reduce(BigDecimal::add).get(); + BigDecimal bigDecimal = BigDecimal.ZERO; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + bigDecimal = bigDecimal.add(myShoppingCartVo.getCash().multiply(new BigDecimal(myShoppingCartVo.getNumber()))); + } confirmOrderVo.setOrderMoney(bigDecimal); }else{ - int sum = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); + int sum = 0; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + sum += (myShoppingCartVo.getPoint() * myShoppingCartVo.getNumber()); + } confirmOrderVo.setOrderPoint(sum); } - //查询当前是否有订单活动 - OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); + BigDecimal orderMoney = confirmOrderVo.getOrderMoney(); BigDecimal paymentMoney = orderMoney; + //总优惠金额 + BigDecimal activityAmount = BigDecimal.ZERO; + + //减去优惠券优惠金额 + CouponInfoVo couponInfoVo = null; + if(null != confirmOrder.getCouponId() && 2 != confirmOrder.getPaymentType()){ + couponInfoVo = userCouponClient.getCouponInfo(confirmOrder.getCouponId()).getData(); + String forGoodIds = couponInfoVo.getForGoodIds(); + String[] split = forGoodIds.split(","); + List<String> parseArray = Arrays.asList(split); + //全部商品 + if("-1".equals(forGoodIds)){ + //满减 + if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(paymentMoney) <= 0){ + paymentMoney = paymentMoney.subtract(couponInfoVo.getDiscountAmount()); + activityAmount = activityAmount.add(couponInfoVo.getDiscountAmount()); + } + //代金券 + if(2 == couponInfoVo.getCouponType()){ + paymentMoney = paymentMoney.subtract(couponInfoVo.getMoneyAmount()); + activityAmount = activityAmount.add(couponInfoVo.getMoneyAmount()); + if(paymentMoney.compareTo(BigDecimal.ZERO) < 0){ + paymentMoney = BigDecimal.ZERO; + } + } + //折扣券 + if(3 == couponInfoVo.getCouponType()){ + BigDecimal paymentMoney1 = couponInfoVo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); + BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); + paymentMoney = paymentMoney1; + activityAmount = activityAmount.add(bigDecimal); + } + }else{ + //部分商品,需要计算参与优惠商品的支付金额,然后再对商品进行优惠券处理 + paymentMoney = BigDecimal.ZERO; + BigDecimal goodsMoney = BigDecimal.ZERO; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + String goodsId = myShoppingCartVo.getGoodsId().toString(); + BigDecimal cash = myShoppingCartVo.getCash(); + if(parseArray.contains(goodsId)){ + goodsMoney = goodsMoney.add(cash); + }else{ + paymentMoney = paymentMoney.add(cash); + } + } + + //满减 + if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(goodsMoney) <= 0){ + goodsMoney = goodsMoney.subtract(couponInfoVo.getDiscountAmount()); + activityAmount = activityAmount.add(couponInfoVo.getDiscountAmount()); + } + //代金券 + if(2 == couponInfoVo.getCouponType()){ + goodsMoney = goodsMoney.subtract(couponInfoVo.getMoneyAmount()); + activityAmount = activityAmount.add(couponInfoVo.getMoneyAmount()); + if(goodsMoney.compareTo(BigDecimal.ZERO) < 0){ + goodsMoney = BigDecimal.ZERO; + } + } + //折扣券 + if(3 == couponInfoVo.getCouponType()){ + BigDecimal paymentMoney1 = couponInfoVo.getDiscount().divide(new BigDecimal(10)).multiply(goodsMoney); + BigDecimal bigDecimal = goodsMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); + goodsMoney = paymentMoney1; + activityAmount = activityAmount.add(bigDecimal); + } + paymentMoney = paymentMoney.add(goodsMoney); + } + } + + //查询当前是否有订单活动 + OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); //满XX才打折,只有现金才能优惠 if(null != orderActivityInfo && confirmOrder.getPaymentType() == 1 && orderActivityInfo.getConditionAmount().compareTo(orderMoney) <= 0){ confirmOrderVo.setActivityName(orderActivityInfo.getActivityName()); - paymentMoney = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(orderMoney); - confirmOrderVo.setDiscountAmount(orderMoney.subtract(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); + BigDecimal multiply = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); + BigDecimal bigDecimal = paymentMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN); + activityAmount = activityAmount.add(bigDecimal); } + confirmOrderVo.setDiscountAmount(activityAmount); BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); - confirmOrderVo.setUseSimultaneously(baseSetting.getContent().equals("1")); + confirmOrderVo.setUseSimultaneously(JSON.parseObject(baseSetting.getContent()).getInteger("status") == 1); int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); confirmOrderVo.setEarnPoint(earnPoint); //支付金额,订单金额-订单优惠 @@ -394,7 +494,7 @@ List<PaymentUserCouponVo> data = userCouponClient.getPaymentUserCoupon(paymentUserCoupon).getData(); if(null != data){ for (PaymentUserCouponVo couponInfo : data) { - List<Integer> forGoodIds = couponInfo.getForGoodIds(); + List<String> forGoodIds = couponInfo.getForGoodIds(); //全部商品适用 if(null == forGoodIds){ //满减券 @@ -467,6 +567,7 @@ Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); MyShoppingCartVo vo = new MyShoppingCartVo(); vo.setId(shoppingCart.getId().toString()); + vo.setType(shoppingCart.getType()); vo.setGoodsId(goods.getId()); vo.setHomePicture(goods.getHomePagePicture()); vo.setName(goods.getName()); @@ -481,7 +582,7 @@ } } //获取支付价格 - Price price = getPrice(appUser, shoppingCart.getGoodsId(), shopId); + Price price = getPrice(appUser, shoppingCart.getGoodsId(), shoppingCart.getType(), shopId); if(null == price){ price = new Price(); //使用商品的基础价格 @@ -505,6 +606,7 @@ //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) if(null == goods.getPurchaseLimit() || -1 == goods.getPurchaseLimit()){ vo.setPurchaseLimit(false); + vo.setPurchaseLimitNum(-1); }else{ List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); @@ -515,6 +617,7 @@ sum = orderGoodList.stream().mapToInt(OrderGood::getNum).sum(); } vo.setPurchaseLimit((num + sum) > goods.getPurchaseLimit()); + vo.setPurchaseLimitNum(goods.getPurchaseLimit() - sum); } vo.setDistributionMode(goods.getDistributionMode()); vo.setEarnSpendingPoints(price.getEarnSpendingPoints()); @@ -552,21 +655,26 @@ for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); Integer num1 = objects.getJSONObject(i).getInteger("num"); + Integer type = objects.getJSONObject(i).getInteger("type"); num += num1; ShoppingCart shoppingCart = this.getById(id); //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) + Integer goodsSaleNum = orderService.getGoodsSaleNum(shoppingCart.getGoodsId(), type); Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); - if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit()){ - List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); - List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); - int sum = 0; - if(orderIds.size() > 0){ - List<OrderGood> orderGoodList = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().in(OrderGood::getOrderId, orderIds) - .eq(OrderGood::getGoodsId, shoppingCart.getGoodsId()).eq(OrderGood::getDelFlag, 0)); - sum = orderGoodList.stream().mapToInt(OrderGood::getNum).sum(); - } - if((num1 + sum) > goods.getPurchaseLimit()){ + if(1 == type){ + if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && (goodsSaleNum + num1) > goods.getPurchaseLimit()){ return R.fail(goods.getName() + "已超出购买上限"); + } + }else{ + GetSeckillActivityInfo info = new GetSeckillActivityInfo(); + info.setGoodsId(shoppingCart.getGoodsId()); + info.setVip(appUser.getVipId()); + GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); + if(null != goodsSeckill ){ + SeckillActivityInfo activityInfo = seckillActivityInfoClient.getSeckillActivityInfoById(goodsSeckill.getSeckillActivityInfoId()).getData(); + if(null != activityInfo.getMaxNum() && -1 != activityInfo.getMaxNum() && (goodsSaleNum + num1) > activityInfo.getMaxNum()){ + return R.fail(goods.getName() + "已超出秒杀活动购买上限"); + } } } ids.add(id); @@ -602,7 +710,7 @@ String goodsName = ""; for (Integer goodsId : goodsIds) { Goods goods = goodsClient.getGoodsById(goodsId).getData(); - if(1 == goods.getAppointStore() && !collect.contains(goodsId)){ + if(goods.getType() == 1 && 1 == goods.getAppointStore() && !collect.contains(goodsId)){ goodsName = goods.getName(); break; } @@ -623,7 +731,6 @@ orderMoney = orderMoney.add(myShoppingCartVo.getCash().multiply(new BigDecimal(myShoppingCartVo.getNumber()))); } }else{ - orderPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); for (MyShoppingCartVo myShoppingCartVo : goodsList) { orderPoint += (myShoppingCartVo.getPoint() * myShoppingCartVo.getNumber()); } @@ -647,9 +754,10 @@ if(null != shoppingCartPayment.getUserCouponId() && 3 != shoppingCartPayment.getPaymentType()){ couponInfoVo = userCouponClient.getCouponInfo(shoppingCartPayment.getUserCouponId()).getData(); String forGoodIds = couponInfoVo.getForGoodIds(); - List<Integer> parseArray = JSON.parseArray(forGoodIds, Integer.class); + String[] split = forGoodIds.split(","); + List<String> parseArray = Arrays.asList(split); //全部商品 - if(parseArray.contains(-1)){ + if("-1".equals(forGoodIds)){ //满减 if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(paymentMoney) <= 0){ paymentMoney = paymentMoney.subtract(couponInfoVo.getDiscountAmount()); @@ -676,7 +784,7 @@ paymentMoney = BigDecimal.ZERO; BigDecimal goodsMoney = BigDecimal.ZERO; for (MyShoppingCartVo myShoppingCartVo : goodsList) { - Integer goodsId = myShoppingCartVo.getGoodsId(); + String goodsId = myShoppingCartVo.getGoodsId().toString(); BigDecimal cash = myShoppingCartVo.getCash(); if(parseArray.contains(goodsId)){ goodsMoney = goodsMoney.add(cash); @@ -731,9 +839,6 @@ int earnPoint = 0; for (MyShoppingCartVo myShoppingCartVo : goodsList) { earnPoint += (myShoppingCartVo.getEarnSpendingPoints() * myShoppingCartVo.getNumber()); - } - if(null != shoppingCartPayment.getUserAddressId()){ - userAddressClient.getUserAddressById(shoppingCartPayment.getUserAddressId()).getData(); } //获取快递策略,计算快递费 @@ -814,6 +919,12 @@ return R.fail("账户余额不足"); } } + if(3 == shoppingCartPayment.getPaymentType()){ + Integer availablePoint = appUser.getAvailablePoint(); + if(availablePoint < orderPoint){ + return R.fail("账户积分不足"); + } + } //判断运费支付是否足够 if(null != shoppingCartPayment.getFreightPaymentType() && 2 == shoppingCartPayment.getFreightPaymentType() && expressFee.compareTo(BigDecimal.ZERO) > 0){ BigDecimal balance = appUser.getBalance(); @@ -828,19 +939,23 @@ OrderGood orderGood = new OrderGood(); orderGood.setGoodsId(myShoppingCartVo.getGoodsId()); orderGood.setOrderId(order.getId()); - GetSeckillActivityInfo info = new GetSeckillActivityInfo(); - info.setGoodsId(myShoppingCartVo.getGoodsId()); - info.setVip(appUser.getVipId()); - GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); - if(null != goodsSeckill){ - orderGood.setSeckillJson(JSON.toJSONString(goodsSeckill)); - } for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); if(myShoppingCartVo.getId().equals(id.toString())){ ShoppingCart shoppingCart = this.getById(id); Integer num1 = objects.getJSONObject(i).getInteger("num"); + Integer type = objects.getJSONObject(i).getInteger("type"); orderGood.setNum(num1); + orderGood.setType(type); + if(2 == type){ + GetSeckillActivityInfo info = new GetSeckillActivityInfo(); + info.setGoodsId(myShoppingCartVo.getGoodsId()); + info.setVip(appUser.getVipId()); + GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); + if(null != goodsSeckill){ + orderGood.setSeckillJson(JSON.toJSONString(goodsSeckill)); + } + } Goods goods1 = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); orderGood.setGoodJson(JSON.toJSONString(goods1)); break; @@ -867,10 +982,20 @@ //现金支付 paymentMoney = paymentMoney.add(expressFee).setScale(2, RoundingMode.HALF_EVEN); if(1 == shoppingCartPayment.getPaymentType()){ - //调起微信支付 TODO 待完善 - - - + //调起微信支付 + String goodsNames = goodsList.stream().map(MyShoppingCartVo::getName).collect(Collectors.joining("\n")); + UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber(), paymentMoney.doubleValue(), order.getOrderType() == 1 ? "购买服务商品" : "购买单品商品", + goodsNames, "", "/order/shopping-cart/shoppingCartPaymentCallback", appUser.getWxOpenid(), null); + if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ + return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); + } + String rc_result = uniPayResult.getRc_Result(); + JSONObject jsonObject = JSON.parseObject(rc_result); + jsonObject.put("orderId", order.getId().toString()); + //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 + long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); + redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second); + return R.ok(jsonObject.toJSONString()); } //账户余额 BigDecimal redPacketAmount = BigDecimal.ZERO; @@ -910,27 +1035,36 @@ //构建积分流水记录 if(earnPoint > 0){ PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); - int earnPoint1 = earnPoint; + int earnPoint1 = 0; if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ - earnPoint1 = earnPoint1 * (100 - pointSetting.getBuyPoint()); + earnPoint1 = new BigDecimal(earnPoint).multiply(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue(); } appUser.setShopPoint(appUser.getShopPoint() + earnPoint); - appUser.setLavePoint(appUser.getLavePoint() + earnPoint1); + appUser.setLavePoint(appUser.getLavePoint() + earnPoint); appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ + appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); + } - UserPoint userPoint = new UserPoint(); - userPoint.setType(1); - userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint1); - userPoint.setVariablePoint(earnPoint); - userPoint.setBalance(appUser.getLavePoint()); - userPoint.setCreateTime(LocalDateTime.now()); - userPoint.setAppUserId(appUser.getId()); - userPoint.setObjectId(order.getId()); - userPointClient.saveUserPoint(userPoint); + if(earnPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(1); + userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); + userPoint.setVariablePoint(earnPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } } appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); appUser.setLastShopTime(LocalDateTime.now()); appUserClient.editAppUserById(appUser); + //变更等级 + appUserClient.vipUpgrade(appUser.getId()); //构建余额明细变动记录 BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); balanceChangeRecord.setAppUserId(appUser.getId()); @@ -950,43 +1084,87 @@ orderService.updateById(order); //删除购物车数据 this.removeBatchByIds(ids); - //检查消费积分满足后升级会员 - vipUpgrade(appUser); } //积分支付 if(3 == shoppingCartPayment.getPaymentType()){ - Integer lavePoint = appUser.getLavePoint(); - PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); - int earnPoint1 = earnPoint; - //计算可用积分比例 - if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ - earnPoint1 = earnPoint1 * (100 - pointSetting.getBuyPoint()); + //先完成快递费支付后再处理后续的逻辑 + if(expressFee.compareTo(BigDecimal.ZERO) > 0){ + if(shoppingCartPayment.getFreightPaymentType() == 1){ + //调起微信支付 + UniPayResult uniPayResult = PaymentUtil.uniPay(order.getOrderNumber() + appUser.getId(), expressFee.doubleValue(), order.getOrderType() == 1 ? "购买服务商品快递费" : "购买单品商品快递费", + "快递费", "", "/order/shopping-cart/shoppingCartMaterialFlowPaymentCallback", appUser.getWxOpenid(), null); + if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ + return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); + } + String rc_result = uniPayResult.getRc_Result(); + JSONObject jsonObject = JSON.parseObject(rc_result); + jsonObject.put("orderId", order.getId().toString()); + //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 + long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); + redisTemplate.opsForZSet().add("MaterialFlowPayment", order.getOrderNumber() + appUser.getId(), second); + return R.ok(jsonObject.toJSONString()); + } } + + Integer lavePoint = appUser.getLavePoint(); + //扣减订单支付积分 appUser.setLavePoint(appUser.getLavePoint() - orderPoint); - appUser.setShopPoint(appUser.getShopPoint() + earnPoint); - appUser.setLavePoint(appUser.getLavePoint() + earnPoint1); - appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); - appUser.setLastShopTime(LocalDateTime.now()); - appUserClient.editAppUserById(appUser); - //检查消费积分满足后升级会员 - vipUpgrade(appUser); + appUser.setAvailablePoint(appUser.getAvailablePoint() - orderPoint); + //可转增积分 + Integer transferablePoint = appUser.getTransferablePoint(); + Integer tra = 0; + if(transferablePoint > 0){ + tra = transferablePoint - orderPoint; + appUser.setTransferablePoint(tra >= 0 ? tra : 0); + } + appUser.setTransferablePoint(appUser.getTransferablePoint() - orderPoint); //构建积分流水记录 UserPoint userPoint = new UserPoint(); - userPoint.setType(1); + userPoint.setType(11); userPoint.setHistoricalPoint(lavePoint); - Integer point = appUser.getLavePoint() - lavePoint; - userPoint.setVariablePoint(point >= 0 ? point : point * -1); + userPoint.setVariablePoint(orderPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); + userPoint.setExtention((tra >= 0 ? orderPoint : transferablePoint) + ""); userPointClient.saveUserPoint(userPoint); + + lavePoint = appUser.getLavePoint(); + PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); + int earnPoint1 = 0; + //计算可用积分比例 + if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ + earnPoint1 = new BigDecimal(earnPoint).multiply(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue(); + } + appUser.setShopPoint(appUser.getShopPoint() + earnPoint); + appUser.setLavePoint(appUser.getLavePoint() + earnPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ + appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); + } + appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); + appUser.setLastShopTime(LocalDateTime.now()); + appUserClient.editAppUserById(appUser); + //变更等级 + appUserClient.vipUpgrade(appUser.getId()); + + //构建积分流水记录 + if(earnPoint > 0){ + userPoint = new UserPoint(); + userPoint.setType(1); + userPoint.setHistoricalPoint(lavePoint); + userPoint.setVariablePoint(earnPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } //如果有运费,需要先扣除账户积分,再进行支付。支付成功后修改订单状态,未支付成功则回退积分,删除的订单 if(expressFee.compareTo(BigDecimal.ZERO) > 0){ - if(shoppingCartPayment.getFreightPaymentType() == 1){ - //调起微信支付 - } if(shoppingCartPayment.getFreightPaymentType() == 2){ BigDecimal totalRedPacketAmount = appUser.getTotalRedPacketAmount(); BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); @@ -1062,7 +1240,7 @@ return R.ok(order.getId().toString()); } - + public String getNumber(Integer size){ String str = ""; for (Integer i = 0; i < size; i++) { @@ -1070,49 +1248,168 @@ } return str; } - - + + /** - * 会员等级变化 - * @param appUser + * 线上支付回调逻辑处理 + * @param uniPayCallbackResult + * @return */ - public void vipUpgrade(AppUser appUser){ - Integer shopPoint = appUser.getShopPoint(); - Integer vipId = appUser.getVipId(); - //钻石会员 - VipSetting vipSetting3 = vipSettingClient.getVipSetting(3).getData(); - Integer vipLevelUpShopRole = vipSetting3.getVipLevelUpShopRole(); - Integer vipLevelUpShop = vipSetting3.getVipLevelUpShop(); - if(null != vipLevelUpShopRole && 1 == vipLevelUpShopRole && appUser.getVipId() < 3 && shopPoint >= vipLevelUpShop){ - appUser.setVipId(3); - appUserClient.editAppUserById(appUser); - //添加等级变化记录 - UserChangeLog userChangeLog = new UserChangeLog(); - userChangeLog.setDelFlag(0); - userChangeLog.setCreateTime(LocalDateTime.now()); - userChangeLog.setAppUserId(appUser.getId()); - userChangeLog.setBeforeVipId(vipId); - userChangeLog.setAfterVipId(appUser.getVipId()); - userChangeLog.setChangeType(1); - userChangeLogClient.saveUserChangeLog(userChangeLog); - return; + @Override + public R shoppingCartPaymentCallback(UniPayCallbackResult uniPayCallbackResult) { + Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, uniPayCallbackResult.getR2_OrderNo())); + if(null == order || order.getPayStatus() == 2){ + return R.ok(); } - //黄金会员 - VipSetting vipSetting2 = vipSettingClient.getVipSetting(2).getData(); - vipLevelUpShopRole = vipSetting2.getVipLevelUpShopRole(); - vipLevelUpShop = vipSetting2.getVipLevelUpShop(); - if(null != vipLevelUpShopRole && 1 == vipLevelUpShopRole && appUser.getVipId() < 2 && shopPoint >= vipLevelUpShop){ - appUser.setVipId(2); - appUserClient.editAppUserById(appUser); - //添加等级变化记录 - UserChangeLog userChangeLog = new UserChangeLog(); - userChangeLog.setDelFlag(0); - userChangeLog.setCreateTime(LocalDateTime.now()); - userChangeLog.setAppUserId(appUser.getId()); - userChangeLog.setBeforeVipId(vipId); - userChangeLog.setAfterVipId(appUser.getVipId()); - userChangeLog.setChangeType(1); - userChangeLogClient.saveUserChangeLog(userChangeLog); + Integer earnPoint = order.getGetPoint(); + AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); + BigDecimal paymentMoney = order.getPaymentAmount(); + //构建积分流水记录 + if(earnPoint > 0){ + PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); + int earnPoint1 = earnPoint; + if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ + earnPoint1 = new BigDecimal(earnPoint1).multiply(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue(); + } + appUser.setShopPoint(appUser.getShopPoint() + earnPoint); + appUser.setLavePoint(appUser.getLavePoint() + earnPoint); + appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + + if(earnPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(1); + userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); + userPoint.setVariablePoint(earnPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + } + } + appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); + appUser.setLastShopTime(LocalDateTime.now()); + appUserClient.editAppUserById(appUser); + //变更等级 + appUserClient.vipUpgrade(appUser.getId()); + //修改订支付状态 + order.setPayStatus(2); + //自提 + if(order.getOrderType() == 1 && StringUtils.isEmpty(order.getAddressJson())){ + order.setOrderStatus(2); + } + orderService.updateById(order); + //删除购物车数据 + Long userid = tokenService.getLoginUserApplet().getUserid(); + List<OrderGood> list = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId())); + List<Integer> goodsIds = list.stream().map(OrderGood::getGoodsId).collect(Collectors.toList()); + this.remove(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds)); + return R.ok(); + } + + + /** + * 订单物流支付回调处理逻辑 + * @param uniPayCallbackResult + * @return + */ + @Override + public R shoppingCartMaterialFlowPaymentCallback(UniPayCallbackResult uniPayCallbackResult) { + String r2_orderNo = uniPayCallbackResult.getR2_OrderNo(); + r2_orderNo = r2_orderNo.substring(0, 23); + Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, r2_orderNo)); + if(null == order || order.getPayStatus() == 2){ + return R.ok(); + } + Integer earnPoint = order.getGetPoint(); + AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); + Integer lavePoint = appUser.getLavePoint(); + PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); + int earnPoint1 = 0; + //计算可用积分比例 + if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ + earnPoint1 = new BigDecimal(earnPoint).multiply(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue(); + } + appUser.setShopPoint(appUser.getShopPoint() + earnPoint); + appUser.setLavePoint(appUser.getLavePoint() + earnPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); + appUser.setLastShopTime(LocalDateTime.now()); + appUserClient.editAppUserById(appUser); + //变更等级 + appUserClient.vipUpgrade(appUser.getId()); + + //构建积分流水记录 + UserPoint userPoint = new UserPoint(); + userPoint.setType(1); + userPoint.setHistoricalPoint(lavePoint); + userPoint.setVariablePoint(earnPoint); + userPoint.setBalance(appUser.getLavePoint()); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(order.getId()); + userPointClient.saveUserPoint(userPoint); + + //修改订支付状态 + order.setPayStatus(2); + //自提 + if(order.getOrderType() == 1 && StringUtils.isEmpty(order.getAddressJson())){ + order.setOrderStatus(2); + } + orderService.updateById(order); + //删除购物车数据 + Long userid = tokenService.getLoginUserApplet().getUserid(); + List<OrderGood> list = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId())); + List<Integer> goodsIds = list.stream().map(OrderGood::getGoodsId).collect(Collectors.toList()); + this.remove(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds)); + return R.ok(); + } + + + /** + * 定时任务关闭订单 + */ + @Override + public void closeOrder() { + //订单支付数据 + long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); + Set<String> orderPayment = redisTemplate.opsForZSet().range("OrderPayment", 0, second); + for (String code : orderPayment) { + Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code)); + if(null == order || order.getPayStatus() != 1){ + redisTemplate.opsForZSet().remove("OrderPayment", code); + continue; + } + //开始执行关闭订单操作 + CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(code); + if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) && + Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){ + redisTemplate.opsForZSet().add("OrderPayment", code, 0); + log.error("关闭订单失败:{}---->{}", code, JSON.toJSONString(closeOrderResult)); + } + redisTemplate.opsForZSet().remove("OrderPayment", code); + } + + //快递支付 + Set<String> materialFlowPayment = redisTemplate.opsForZSet().range("MaterialFlowPayment", 0, second); + for (String code : materialFlowPayment) { + code = code.substring(0, 23); + Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code)); + if(null == order || order.getPayStatus() != 1){ + redisTemplate.opsForZSet().remove("MaterialFlowPayment", code); + continue; + } + //开始执行关闭订单操作 + CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(code); + if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) && + Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){ + redisTemplate.opsForZSet().add("MaterialFlowPayment", code, 0); + log.error("关闭订单失败:{}---->{}", code, JSON.toJSONString(closeOrderResult)); + } + redisTemplate.opsForZSet().remove("MaterialFlowPayment", code); } } } -- Gitblit v1.7.1