From fd45fcbd496bbeaf9ee18edd8f2f858cf9cebaf3 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 24 一月 2025 16:47:38 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java | 814 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 590 insertions(+), 224 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 2802a73..46a2b85 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 @@ -11,6 +11,7 @@ import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.account.api.vo.PaymentUserCouponVo; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.mapper.ShoppingCartMapper; @@ -142,9 +143,33 @@ } 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<ShoppingCart> list1 = new ArrayList<>(); + for (ShoppingCart shoppingCart : list) { + if(shoppingCart.getType() == 2){ + GetSeckillActivityInfo info = new GetSeckillActivityInfo(); + info.setGoodsId(shoppingCart.getGoodsId()); + info.setVip(appUser.getVipId()); + GoodsSeckill data1 = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); + if(null != data1){ + SeckillActivityInfo seckillActivityInfo = seckillActivityInfoClient.getSeckillActivityInfoById(data1.getSeckillActivityInfoId()).getData(); + if(null != seckillActivityInfo && (seckillActivityInfo.getIsShelves() == 1 && + seckillActivityInfo.getStartTime().isBefore(LocalDateTime.now()) && seckillActivityInfo.getEndTime().isAfter(LocalDateTime.now()))){ + + list1.add(shoppingCart); + continue; + } + } + this.removeById(shoppingCart.getId()); + }else{ + list1.add(shoppingCart); + } + } + //构建返回数据 - List<MyShoppingCartVo> page = buildDetail(appUser, shopId, list, null); + List<MyShoppingCartVo> page = buildDetail(appUser, shopId, list1, null); return page; } @@ -156,7 +181,7 @@ * @param shopId * @return */ - public Price getPrice(AppUser appUser, Integer goodsId, Integer shopId){ + public Price getPrice(AppUser appUser, Integer goodsId, Integer type, Integer shopId){ //获取支付价格 //秒杀活动>门店特价>地区价格>会员价格 //判断是否有秒杀活动 @@ -165,7 +190,8 @@ info.setGoodsId(goodsId); info.setVip(appUser.getVipId()); GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); - if(null == goodsSeckill){ + //没有秒杀活动或者添加的普通商品则不使用秒杀活动价格 + if((null == goodsSeckill || (null == goodsSeckill.getCashPayment() && null == goodsSeckill.getPointPayment())) || type == 1){ //没有秒杀价,则判断门店特价 GetGoodsBargainPrice goodsBargainPrice = new GetGoodsBargainPrice(); goodsBargainPrice.setGoodsId(goodsId); @@ -184,17 +210,17 @@ area.setVip(appUser.getVipId()); area.setGoodsId(goodsId); GoodsArea goodsArea = goodsAreaClient.getGoodsArea(area).getData(); - if(null == goodsArea){ + if(null == goodsArea || (null == goodsArea.getCashPayment() && null == goodsArea.getPointPayment())){ //没有地区价格,则使用会员价格 GoodsVip goodsVip = goodsVipClient.getGoodsVip(goodsId, appUser.getVipId()).getData(); - if(null == goodsVip){ + if(null == goodsVip || (null == goodsVip.getCashPayment() && null == goodsVip.getPointPayment())){ //没有配置价格,直接使用原始基础价格 return null; }else{ price.setCash(goodsVip.getSellingPrice()); price.setPoint(goodsVip.getIntegral()); - price.setCashPayment(goodsVip.getCashPayment() == 1); - price.setPointPayment(goodsVip.getPointPayment() == 1); + price.setCashPayment(null != goodsVip.getCashPayment() && goodsVip.getCashPayment() == 1); + price.setPointPayment(null != goodsVip.getPointPayment() && goodsVip.getPointPayment() == 1); price.setEarnSpendingPoints(goodsVip.getEarnSpendingPoints()); price.setSuperiorSubcommission(goodsVip.getSuperiorSubcommission()); price.setSuperiorRebatePoints(goodsVip.getSuperiorRebatePoints()); @@ -211,8 +237,8 @@ }else{ price.setCash(goodsArea.getSellingPrice()); price.setPoint(goodsArea.getIntegral()); - price.setCashPayment(goodsArea.getCashPayment() == 1); - price.setPointPayment(goodsArea.getPointPayment() == 1); + price.setCashPayment(null !=goodsArea.getCashPayment() && goodsArea.getCashPayment() == 1); + price.setPointPayment(null !=goodsArea.getPointPayment() && goodsArea.getPointPayment() == 1); price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); @@ -238,18 +264,34 @@ area.setProvinceCode(appUser.getProvinceCode()); area.setVip(appUser.getVipId()); GoodsArea goodsArea = goodsAreaClient.getGoodsArea(area).getData(); - price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); - price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); - price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); - price.setSuperiorType(goodsArea.getSuperiorType()); - price.setSuperiorPriceType(goodsArea.getSuperiorPriceType()); - price.setServuceShopCharges(goodsArea.getServuceShopCharges()); - price.setServuceShopPoints(goodsArea.getServuceShopPoints()); - price.setTechnicianPoints(goodsArea.getTechnicianPoints()); - price.setBoundShopCharges(goodsArea.getBoundShopCharges()); - price.setBoundShopPoints(goodsArea.getBoundShopPoints()); - price.setBoundShopSuperiorsCharges(goodsArea.getBoundShopSuperiorsCharges()); - price.setBoundShopSuperiorsPoints(goodsArea.getBoundShopSuperiorsPoints()); + if(null != goodsArea){ + price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); + price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); + price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); + price.setSuperiorType(goodsArea.getSuperiorType()); + price.setSuperiorPriceType(goodsArea.getSuperiorPriceType()); + price.setServuceShopCharges(goodsArea.getServuceShopCharges()); + price.setServuceShopPoints(goodsArea.getServuceShopPoints()); + price.setTechnicianPoints(goodsArea.getTechnicianPoints()); + price.setBoundShopCharges(goodsArea.getBoundShopCharges()); + price.setBoundShopPoints(goodsArea.getBoundShopPoints()); + price.setBoundShopSuperiorsCharges(goodsArea.getBoundShopSuperiorsCharges()); + price.setBoundShopSuperiorsPoints(goodsArea.getBoundShopSuperiorsPoints()); + }else{ + GoodsVip goodsVip = goodsVipClient.getGoodsVip(goodsId, appUser.getVipId()).getData(); + price.setEarnSpendingPoints(goodsVip.getEarnSpendingPoints()); + price.setSuperiorSubcommission(goodsVip.getSuperiorSubcommission()); + price.setSuperiorRebatePoints(goodsVip.getSuperiorRebatePoints()); + price.setSuperiorType(goodsVip.getSuperiorType()); + price.setSuperiorPriceType(goodsVip.getSuperiorPriceType()); + price.setServuceShopCharges(goodsVip.getServuceShopCharges()); + price.setServuceShopPoints(goodsVip.getServuceShopPoints()); + price.setTechnicianPoints(goodsVip.getTechnicianPoints()); + price.setBoundShopCharges(goodsVip.getBoundShopCharges()); + price.setBoundShopPoints(goodsVip.getBoundShopPoints()); + price.setBoundShopSuperiorsCharges(goodsVip.getBoundShopSuperiorsCharges()); + price.setBoundShopSuperiorsPoints(goodsVip.getBoundShopSuperiorsPoints()); + } } }else{ //构建价格数据 @@ -263,8 +305,8 @@ if(goodsSeckill.getCashPayment() == 0 && goodsSeckill.getPointPayment() == 1){ price.setPoint(goodsSeckill.getIntegral()); } - price.setCashPayment(goodsSeckill.getCashPayment() == 1); - price.setPointPayment(goodsSeckill.getPointPayment() == 1); + price.setCashPayment(null != goodsSeckill.getCashPayment() && goodsSeckill.getCashPayment() == 1); + price.setPointPayment(null != goodsSeckill.getPointPayment() && goodsSeckill.getPointPayment() == 1); price.setEndTime(goodsSeckill.getEndTime()); price.setEarnSpendingPoints(goodsSeckill.getEarnSpendingPoints()); price.setSuperiorSubcommission(goodsSeckill.getSuperiorSubcommission()); @@ -288,9 +330,41 @@ @Override public Long addGoods(ShoppingCart shoppingCart) { Long userid = tokenService.getLoginUserApplet().getUserid(); - shoppingCart.setAppUserId(userid); - this.save(shoppingCart); - return shoppingCart.getId(); + long goodsSaleNum = orderService.getGoodsSaleNum(shoppingCart.getGoodsId(), null, userid); + long count = count(new LambdaQueryWrapper<ShoppingCart>() + .eq(ShoppingCart::getGoodsId, shoppingCart.getGoodsId()) + .eq(ShoppingCart::getStatus,1) + .eq(ShoppingCart::getAppUserId, userid)); + goodsSaleNum += count; + Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); + + Integer maxNum = 0; + if(shoppingCart.getType() == 2){ + R<SeckillActivityInfo> r = seckillActivityInfoClient.getSeckillActivityInfoByGoodsId(shoppingCart.getGoodsId()); + if (R.isError(r)){ + throw new ServiceException("获取秒杀商品失败!"); + } + SeckillActivityInfo seckillActivityInfo = r.getData(); + maxNum = seckillActivityInfo.getMaxNum(); + }else { + maxNum = goods.getPurchaseLimit(); + } + + if(null != goods.getPurchaseLimit() && -1 != maxNum && (goodsSaleNum + shoppingCart.getNumber()) > maxNum){ + throw new ServiceException("超出购买数量限制"); + } + 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(); + } } @@ -301,15 +375,18 @@ */ @Override public R setGoodsNumber(SetGoodsNumber setGoodsNumber) { + + ShoppingCart shoppingCart = this.getById(setGoodsNumber.getId()); if(0 >= setGoodsNumber.getNumber()){ return R.fail("修改数量不能小于等于0"); } - ShoppingCart shoppingCart = this.getById(setGoodsNumber.getId()); if(null != shoppingCart){ - Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); - if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && goods.getPurchaseLimit() < setGoodsNumber.getNumber()){ + Goods goods1 = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); + if(null != goods1.getPurchaseLimit() && -1 != goods1.getPurchaseLimit() + && goods1.getPurchaseLimit() < setGoodsNumber.getNumber() + && setGoodsNumber.getNumber() >= shoppingCart.getNumber()){ return R.fail("修改数量不能大于限购数量"); } @@ -336,12 +413,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(); @@ -362,33 +442,137 @@ 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()))); + myShoppingCartVo.setEarnSpendingPoints(myShoppingCartVo.getEarnSpendingPoints() * myShoppingCartVo.getNumber()); + } confirmOrderVo.setOrderMoney(bigDecimal); }else{ - int sum = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); + int sum = 0; + for (MyShoppingCartVo myShoppingCartVo : goodsList) { + sum += ((null != myShoppingCartVo.getPoint() ? myShoppingCartVo.getPoint() : 0) * myShoppingCartVo.getNumber()); + myShoppingCartVo.setEarnSpendingPoints((null != myShoppingCartVo.getEarnSpendingPoints() ? myShoppingCartVo.getEarnSpendingPoints() : 0) * myShoppingCartVo.getNumber()); + } confirmOrderVo.setOrderPoint(sum); } - //查询当前是否有订单活动 - OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); + BigDecimal orderMoney = confirmOrderVo.getOrderMoney(); BigDecimal paymentMoney = orderMoney; - //满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 activityAmount = BigDecimal.ZERO; + + BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); - confirmOrderVo.setUseSimultaneously(baseSetting.getContent().equals("1")); + confirmOrderVo.setUseSimultaneously(JSON.parseObject(baseSetting.getContent()).getInteger("status") == 1); + //减去优惠券优惠金额 + 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); + } + } + + //查询当前是否有订单活动 + List<OrderActivityInfo> orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); + //满XX才打折,只有现金才能优惠 + if((confirmOrderVo.getUseSimultaneously() || (!confirmOrderVo.getUseSimultaneously() && activityAmount.equals(BigDecimal.ZERO))) + && null != orderActivityInfo && confirmOrder.getPaymentType() == 1){ + BigDecimal zyh = BigDecimal.ZERO; + OrderActivityInfo activityInfo1 = null; + for (OrderActivityInfo activityInfo : orderActivityInfo) { + if(activityInfo.getConditionAmount().compareTo(paymentMoney) <= 0){ + //优惠后的支付金额 + BigDecimal multiply = activityInfo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); + //优惠金额 + BigDecimal bigDecimal = paymentMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN); + if(bigDecimal.compareTo(zyh) > 0){ + zyh = bigDecimal; + activityInfo1 = activityInfo; + } + } + } + + if(null != activityInfo1){ + confirmOrderVo.setActivityName(activityInfo1.getActivityName()); + paymentMoney = paymentMoney.subtract(zyh); + activityAmount = activityAmount.add(zyh); + } + } + confirmOrderVo.setDiscountAmount(activityAmount); int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); confirmOrderVo.setEarnPoint(earnPoint); + if(null != paymentMoney && BigDecimal.ZERO.compareTo(paymentMoney) > 0){ + paymentMoney = BigDecimal.ZERO; + } + //支付金额,订单金额-订单优惠 confirmOrderVo.setPayMoney(paymentMoney); - confirmOrderVo.setResidualPoint(appUser.getLavePoint().intValue()); + confirmOrderVo.setResidualPoint(appUser.getAvailablePoint().intValue()); //获取默认收货地址 UserAddress userAddress = userAddressClient.getDefaultUserAddress(userid).getData(); if(null != userAddress){ userAddress.setIdStr(userAddress.getId().toString()); + userAddress.setRecieveAddress(userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getRecieveAddress()); confirmOrderVo.setUserAddress(userAddress); } confirmOrderVo.setPaymentType(confirmOrder.getPaymentType()); @@ -414,11 +598,11 @@ } }else{ //部分商品适用 - BigDecimal goodsMoney = BigDecimal.ZERO; + BigDecimal goodsMoney = BigDecimal.ZERO; for (MyShoppingCartVo myShoppingCartVo : goodsList) { Integer goodsId = myShoppingCartVo.getGoodsId(); BigDecimal cash = myShoppingCartVo.getCash(); - if(forGoodIds.contains(goodsId)){ + if(forGoodIds.contains(String.valueOf(goodsId))){ goodsMoney = goodsMoney.add(cash); } } @@ -474,6 +658,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()); @@ -488,7 +673,7 @@ } } //获取支付价格 - Price price = getPrice(appUser, shoppingCart.getGoodsId(), shopId); + Price price = getPrice(appUser, shoppingCart.getGoodsId(), shoppingCart.getType(), shopId); if(null == price){ price = new Price(); //使用商品的基础价格 @@ -512,6 +697,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()); @@ -560,23 +746,36 @@ 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, userid); 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() + "已超出秒杀活动购买上限"); + } + } } + + if(goods.getStatus() == 1){ + throw new RuntimeException(goods.getName() + "商品已被下架"); + } + if(!goods.getCommodityAuthority().contains("-1") && !goods.getCommodityAuthority().contains(appUser.getVipId().toString())){ + throw new RuntimeException("无权限购买" + goods.getName()); + } + ids.add(id); } @@ -633,9 +832,6 @@ }else{ for (MyShoppingCartVo myShoppingCartVo : goodsList) { orderPoint += (myShoppingCartVo.getPoint() * myShoppingCartVo.getNumber()); - } - if(appUser.getLavePoint().intValue() < orderPoint){ - return R.fail("账户剩余积分不足"); } } //现金的支付金额 @@ -719,20 +915,31 @@ } //查询当前是否有订单活动 - OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); + List<OrderActivityInfo> orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); //系统活动设置(优惠券和活动能否同时使用) - boolean useSimultaneously = baseSetting.getContent().equals("1"); + Integer status = JSON.parseObject(baseSetting.getContent()).getInteger("status"); //满XX才打折,只有现金才能优惠 //如果使用优惠券,则需要判断是否可以和同时使用,且活动满足使用条件。 //没有使用优惠券,只需要判断是都满足使用条件 - if((useSimultaneously || null == shoppingCartPayment.getUserCouponId()) && - null != orderActivityInfo && shoppingCartPayment.getPaymentType() != 3 && orderActivityInfo.getConditionAmount().compareTo(paymentMoney) <= 0){ - BigDecimal paymentMoney1 = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); - BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); - discount = orderActivityInfo.getDiscount(); - paymentMoney = paymentMoney1; - activityAmount = activityAmount.add(bigDecimal); + OrderActivityInfo orderActivityInfo1 = null; + if((1 == status || null == shoppingCartPayment.getUserCouponId()) && + null != orderActivityInfo && shoppingCartPayment.getPaymentType() != 3){ + //找出最优会的金额 + BigDecimal zyh = BigDecimal.ZERO; + for (OrderActivityInfo activityInfo : orderActivityInfo) { + if(activityInfo.getConditionAmount().compareTo(paymentMoney) <= 0){ + BigDecimal paymentMoney1 = activityInfo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); + BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); + if(bigDecimal.compareTo(zyh) > 0){ + zyh = bigDecimal; + orderActivityInfo1 = activityInfo; + } + } + } + + paymentMoney = paymentMoney.subtract(zyh); + activityAmount = activityAmount.add(zyh); } //可获得的消费积分 @@ -766,6 +973,10 @@ } } } + if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ + paymentMoney = BigDecimal.ZERO; + } + //构建订单明细 Order order = new Order(); order.setAppUserId(userid); @@ -780,7 +991,7 @@ order.setGoodName(goodName.substring(0, goodName.length() - 1)); Goods goods = goodsClient.getGoodsById(goodsList.get(0).getGoodsId()).getData(); order.setOrderType(goods.getType()); - order.setOrderStatus(goods.getType() == 1 ? 3 : 1); + order.setOrderStatus(goods.getType() == 1 ? 3 : (shoppingCartPayment.getDistributionMode() == 2 ? 1 : 2)); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); order.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date())); order.setTotalAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN)); @@ -797,11 +1008,12 @@ } if(3 != shoppingCartPayment.getPaymentType() && (fullReductionAmount.compareTo(BigDecimal.ZERO) > 0 ||moneyAmount.compareTo(BigDecimal.ZERO) > 0 || discountAmount.compareTo(BigDecimal.ZERO) > 0)){ order.setCouponJson(JSON.toJSONString(couponInfoVo)); + order.setUserCouponId(shoppingCartPayment.getUserCouponId()); } - if(activityAmount.compareTo(BigDecimal.ZERO) > 0){ - order.setActivityJson(JSON.toJSONString(orderActivityInfo)); + if(null != orderActivityInfo1){ + order.setActivityJson(JSON.toJSONString(orderActivityInfo1)); } - if(null != shoppingCartPayment.getUserAddressId()){ + if(2 == shoppingCartPayment.getDistributionMode()){ UserAddress address = userAddressClient.getUserAddressById(shoppingCartPayment.getUserAddressId()).getData(); order.setExpressAmount(expressFee); order.setAddressJson(JSON.toJSONString(address)); @@ -812,6 +1024,7 @@ order.setDelFlag(0); order.setCreateTime(LocalDateTime.now()); order.setExpressPayMethod(shoppingCartPayment.getFreightPaymentType()); + order.setDistributionMode(shoppingCartPayment.getDistributionMode()); if(2 == shoppingCartPayment.getPaymentType()){ BigDecimal balance = appUser.getBalance(); @@ -821,8 +1034,8 @@ } if(3 == shoppingCartPayment.getPaymentType()){ Integer availablePoint = appUser.getAvailablePoint(); - if(availablePoint < orderPoint){ - return R.fail("账户积分不足"); + if(availablePoint.compareTo(orderPoint) < 0){ + return R.fail("账户可用积分不足"); } } //判断运费支付是否足够 @@ -839,19 +1052,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; @@ -871,25 +1088,106 @@ orderGood.setBoundShopPoints(myShoppingCartVo.getBoundShopPoints()); orderGood.setBoundShopSuperiorsCharges(myShoppingCartVo.getBoundShopSuperiorsCharges()); orderGood.setBoundShopSuperiorsPoints(myShoppingCartVo.getBoundShopSuperiorsPoints()); + orderGood.setCashPayment(myShoppingCartVo.getCashPayment() ? 1 : 0); + orderGood.setPointPayment(myShoppingCartVo.getPointPayment() ? 1 : 0); + orderGood.setSellingPrice(myShoppingCartVo.getCash()); + orderGood.setIntegral(myShoppingCartVo.getPoint()); orderGoodService.save(orderGood); } //开始构建支付数据 //现金支付 paymentMoney = paymentMoney.add(expressFee).setScale(2, RoundingMode.HALF_EVEN); + if(BigDecimal.ZERO.compareTo(paymentMoney) > 0){ + paymentMoney = BigDecimal.ZERO; + } if(1 == shoppingCartPayment.getPaymentType()){ - //调起微信支付 - 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(), ""); - if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){ - return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg()); + if(BigDecimal.ZERO.compareTo(paymentMoney) < 0){ + //调起微信支付 + 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()); + }else{ + + earnPoint = order.getGetPoint(); + appUser = appUserClient.getAppUserById(order.getAppUserId()); + Integer lavePoint = appUser.getLavePoint(); + paymentMoney = order.getPaymentAmount(); + //构建积分流水记录 + if(earnPoint > 0){ + 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.setTotalPoint(appUser.getTotalPoint() + earnPoint); + appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("shopPoint", earnPoint); + jsonObject.put("availablePoint", earnPoint1); + if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ + appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); + jsonObject.put("transferablePoint", earnPoint1); + } + + if(earnPoint > 0){ + 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()); + userPoint.setExtention(jsonObject.toJSONString()); + 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); + + //处理优惠券 + if(null != order.getUserCouponId()){ + UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData(); + if(null != userCoupon && null == userCoupon.getUseTime()){ + userCoupon.setStatus(2); + userCoupon.setUseTime(LocalDateTime.now()); + userCouponClient.editUserCoupon(userCoupon); + } + } + + + //删除购物车数据 + userid = tokenService.getLoginUserApplet().getUserid(); + List<OrderGood> list1 = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId())); + List<Integer> goodsIds1 = list1.stream().map(OrderGood::getGoodsId).collect(Collectors.toList()); + this.remove(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds1)); + } - String rc_result = uniPayResult.getRc_Result(); - //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。 - long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC); - redisTemplate.opsForZSet().add("OrderPayment", order.getOrderNumber(), second); - return R.ok(rc_result); } //账户余额 BigDecimal redPacketAmount = BigDecimal.ZERO; @@ -899,29 +1197,30 @@ BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); BigDecimal balance = appUser.getBalance(); //红包金额满足支付 - if(paymentMoney.compareTo(totalRedPacketAmount) <= 0){ - totalRedPacketAmount = totalRedPacketAmount.subtract(paymentMoney); - balance = balance.subtract(paymentMoney); + BigDecimal paymentMoney1 = paymentMoney; + if(paymentMoney1.compareTo(totalRedPacketAmount) <= 0){ + totalRedPacketAmount = totalRedPacketAmount.subtract(paymentMoney1); + balance = balance.subtract(paymentMoney1); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setBalance(balance); - redPacketAmount = paymentMoney; + redPacketAmount = paymentMoney1; }else{ - paymentMoney = paymentMoney.subtract(totalRedPacketAmount); + paymentMoney1 = paymentMoney1.subtract(totalRedPacketAmount); redPacketAmount = totalRedPacketAmount; totalRedPacketAmount = BigDecimal.ZERO; - if(paymentMoney.compareTo(totalDistributionAmount) <= 0){ - totalDistributionAmount = totalDistributionAmount.subtract(paymentMoney); - balance = balance.subtract(paymentMoney); + if(paymentMoney1.compareTo(totalDistributionAmount) <= 0){ + totalDistributionAmount = totalDistributionAmount.subtract(paymentMoney1); + balance = balance.subtract(paymentMoney1); appUser.setTotalRedPacketAmount(totalRedPacketAmount); - appUser.setTotalDistributionAmount(totalDistributionAmount); +// appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); - distributionAmount = paymentMoney; + distributionAmount = paymentMoney1; }else{ - paymentMoney = paymentMoney.subtract(totalDistributionAmount); + paymentMoney1 = paymentMoney1.subtract(totalDistributionAmount); totalDistributionAmount = BigDecimal.ZERO; - balance = balance.subtract(paymentMoney); + balance = balance.subtract(paymentMoney1); appUser.setTotalRedPacketAmount(totalRedPacketAmount); - appUser.setTotalDistributionAmount(totalDistributionAmount); +// appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); distributionAmount = totalDistributionAmount; } @@ -937,19 +1236,28 @@ appUser.setLavePoint(appUser.getLavePoint() + earnPoint); appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); + appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("shopPoint", earnPoint); + jsonObject.put("availablePoint", earnPoint1); if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); + jsonObject.put("transferablePoint", earnPoint1); } - 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); + 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()); + userPoint.setExtention(jsonObject.toJSONString()); + userPointClient.saveUserPoint(userPoint); + } } appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); appUser.setLastShopTime(LocalDateTime.now()); @@ -959,6 +1267,7 @@ //构建余额明细变动记录 BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); balanceChangeRecord.setAppUserId(appUser.getId()); + balanceChangeRecord.setVipId(appUser.getVipId()); balanceChangeRecord.setOrderId(order.getId()); balanceChangeRecord.setChangeType(5); balanceChangeRecord.setBeforeAmount(balance.add(paymentMoney)); @@ -975,6 +1284,15 @@ orderService.updateById(order); //删除购物车数据 this.removeBatchByIds(ids); + //处理优惠券 + if(null != order.getUserCouponId()){ + UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData(); + if(null != userCoupon && null == userCoupon.getUseTime()){ + userCoupon.setUseTime(LocalDateTime.now()); + userCouponClient.editUserCoupon(userCoupon); + } + } + } //积分支付 if(3 == shoppingCartPayment.getPaymentType()){ @@ -982,82 +1300,86 @@ 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(), ""); + UniPayResult uniPayResult = PaymentUtil.uniPay("K" + order.getOrderNumber(), 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(rc_result); + redisTemplate.opsForZSet().add("MaterialFlowPayment", "K" + order.getOrderNumber(), second); + return R.ok(jsonObject.toJSONString()); } } - + 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.setLavePoint(appUser.getLavePoint() - orderPoint); appUser.setAvailablePoint(appUser.getAvailablePoint() - orderPoint); - - appUser.setShopPoint(appUser.getShopPoint() + earnPoint); - appUser.setLavePoint(appUser.getLavePoint() + earnPoint); - appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); - if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ - appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); + //可转增积分 + Integer transferablePoint = appUser.getTransferablePoint(); + Integer tra = 0; + if(transferablePoint > 0){ + tra = transferablePoint - orderPoint; + appUser.setTransferablePoint(tra >= 0 ? tra : 0); + }else{ + appUser.setTransferablePoint(appUser.getTransferablePoint() - orderPoint); } - appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); + + //构建积分流水记录 + if(orderPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(11); + userPoint.setHistoricalPoint(lavePoint); + 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); + } + appUser.setLastShopTime(LocalDateTime.now()); appUserClient.editAppUserById(appUser); //变更等级 appUserClient.vipUpgrade(appUser.getId()); - //构建积分流水记录 - UserPoint userPoint = new UserPoint(); - userPoint.setType(1); - userPoint.setHistoricalPoint(lavePoint); - Integer point = appUser.getLavePoint() - lavePoint; - userPoint.setVariablePoint(point >= 0 ? point : point * -1); - 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() == 2){ BigDecimal totalRedPacketAmount = appUser.getTotalRedPacketAmount(); BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); BigDecimal balance = appUser.getBalance(); - if(expressFee.compareTo(totalRedPacketAmount) <= 0){ - totalRedPacketAmount = totalRedPacketAmount.subtract(expressFee); - balance = balance.subtract(expressFee); + BigDecimal expressFee1 = expressFee; + if(expressFee1.compareTo(totalRedPacketAmount) <= 0){ + totalRedPacketAmount = totalRedPacketAmount.subtract(expressFee1); + balance = balance.subtract(expressFee1); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setBalance(balance); - redPacketAmount = expressFee; + redPacketAmount = expressFee1; }else{ - expressFee = expressFee.subtract(totalRedPacketAmount); + expressFee1 = expressFee1.subtract(totalRedPacketAmount); redPacketAmount = totalRedPacketAmount; totalRedPacketAmount = BigDecimal.ZERO; - if(expressFee.compareTo(totalDistributionAmount) <= 0){ - totalDistributionAmount = totalDistributionAmount.subtract(expressFee); - balance = balance.subtract(expressFee); + if(expressFee1.compareTo(totalDistributionAmount) <= 0){ + totalDistributionAmount = totalDistributionAmount.subtract(expressFee1); + balance = balance.subtract(expressFee1); appUser.setTotalRedPacketAmount(totalRedPacketAmount); - appUser.setTotalDistributionAmount(totalDistributionAmount); +// appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); - distributionAmount = expressFee; + distributionAmount = expressFee1; }else{ - expressFee = expressFee.subtract(totalDistributionAmount); + expressFee1 = expressFee1.subtract(totalDistributionAmount); totalDistributionAmount = BigDecimal.ZERO; - balance = balance.subtract(expressFee); + balance = balance.subtract(expressFee1); appUser.setTotalRedPacketAmount(totalRedPacketAmount); - appUser.setTotalDistributionAmount(totalDistributionAmount); +// appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); distributionAmount = totalDistributionAmount; } @@ -1067,10 +1389,11 @@ //构建余额明细变动记录 BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); balanceChangeRecord.setAppUserId(appUser.getId()); + balanceChangeRecord.setVipId(appUser.getVipId()); balanceChangeRecord.setOrderId(order.getId()); balanceChangeRecord.setChangeType(5); - balanceChangeRecord.setBeforeAmount(balance.add(paymentMoney)); - balanceChangeRecord.setChangeAmount(paymentMoney); + balanceChangeRecord.setBeforeAmount(balance.add(expressFee)); + balanceChangeRecord.setChangeAmount(expressFee); balanceChangeRecord.setAfterAmount(balance); balanceChangeRecord.setDelFlag(0); balanceChangeRecord.setCreateTime(LocalDateTime.now()); @@ -1094,7 +1417,9 @@ //删除购物车数据 this.removeBatchByIds(ids); } + } + //添加账户余额支付明细 if(redPacketAmount.compareTo(BigDecimal.ZERO) > 0 || distributionAmount.compareTo(BigDecimal.ZERO) > 0){ OrderBalancePayment orderBalancePayment = new OrderBalancePayment(); @@ -1129,28 +1454,41 @@ } Integer earnPoint = order.getGetPoint(); AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); + Integer lavePoint = appUser.getLavePoint(); BigDecimal paymentMoney = order.getPaymentAmount(); //构建积分流水记录 if(earnPoint > 0){ PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); - int earnPoint1 = earnPoint; + int earnPoint1 = 0; if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ - earnPoint1 = new BigDecimal(earnPoint1).multiply(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue(); + earnPoint1 = new BigDecimal(earnPoint).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); - - 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.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + earnPoint1); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("shopPoint", earnPoint); + jsonObject.put("availablePoint", earnPoint1); + if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){ + appUser.setTransferablePoint(appUser.getTransferablePoint() + earnPoint1); + jsonObject.put("transferablePoint", earnPoint1); + } + + if(earnPoint > 0){ + 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()); + userPoint.setExtention(jsonObject.toJSONString()); + userPointClient.saveUserPoint(userPoint); + } } appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); appUser.setLastShopTime(LocalDateTime.now()); @@ -1164,11 +1502,27 @@ order.setOrderStatus(2); } orderService.updateById(order); + + //处理优惠券 + if(null != order.getUserCouponId()){ + UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData(); + if(null != userCoupon && null == userCoupon.getUseTime()){ + userCoupon.setStatus(2); + userCoupon.setUseTime(LocalDateTime.now()); + userCouponClient.editUserCoupon(userCoupon); + } + } + //删除购物车数据 - Long userid = tokenService.getLoginUserApplet().getUserid(); + Long userid = order.getAppUserId(); 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)); + + //商品销量增加 + for (Integer goodsId : goodsIds) { + goodsClient.editGoodsNum(goodsId, 1); + } return R.ok(); } @@ -1181,45 +1535,49 @@ @Override public R shoppingCartMaterialFlowPaymentCallback(UniPayCallbackResult uniPayCallbackResult) { String r2_orderNo = uniPayCallbackResult.getR2_OrderNo(); - r2_orderNo = r2_orderNo.substring(0, 23); + r2_orderNo = r2_orderNo.substring(1); 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(); Integer orderPoint = order.getPoint(); - 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 appUser = appUserClient.getAppUserById(order.getAppUserId()); + + Integer lavePoint = appUser.getLavePoint(); //扣减订单支付积分 appUser.setLavePoint(appUser.getLavePoint() - orderPoint); appUser.setAvailablePoint(appUser.getAvailablePoint() - orderPoint); - - appUser.setShopPoint(appUser.getShopPoint() + earnPoint); - appUser.setLavePoint(appUser.getLavePoint() + earnPoint); - appUser.setAvailablePoint(appUser.getAvailablePoint() + earnPoint1); - appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); + //可转增积分 + Integer transferablePoint = appUser.getTransferablePoint(); + Integer tra = 0; + if(transferablePoint > 0){ + tra = transferablePoint - orderPoint; + appUser.setTransferablePoint(tra >= 0 ? tra : 0); + }else{ + appUser.setTransferablePoint(appUser.getTransferablePoint() - orderPoint); + } + + //构建积分流水记录 + if(orderPoint > 0){ + UserPoint userPoint = new UserPoint(); + userPoint.setType(11); + userPoint.setHistoricalPoint(lavePoint); + 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); + } + + //积分支付不反积分 + appUser.setLastShopTime(LocalDateTime.now()); appUserClient.editAppUserById(appUser); //变更等级 appUserClient.vipUpgrade(appUser.getId()); - - //构建积分流水记录 - UserPoint userPoint = new UserPoint(); - userPoint.setType(1); - userPoint.setHistoricalPoint(lavePoint); - Integer point = appUser.getLavePoint() - lavePoint; - userPoint.setVariablePoint(point >= 0 ? point : point * -1); - userPoint.setBalance(appUser.getLavePoint()); - userPoint.setCreateTime(LocalDateTime.now()); - userPoint.setAppUserId(appUser.getId()); - userPoint.setObjectId(order.getId()); - userPointClient.saveUserPoint(userPoint); + //修改订支付状态 order.setPayStatus(2); //自提 @@ -1243,35 +1601,43 @@ 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){ - 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)); + Set<String> orderPayment = redisTemplate.opsForZSet().rangeByScore("OrderPayment", 0, second); + if(orderPayment.size() > 0){ + List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().in(Order::getOrderNumber, orderPayment)); + for (Order order : list) { + if(null == order || order.getPayStatus() != 1){ + redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); + continue; + } + //开始执行关闭订单操作 + CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber()); + 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", order.getOrderNumber(), 0); + log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult)); + } + redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber()); } } //快递支付 - 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){ - 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)); + Set<String> materialFlowPayment = redisTemplate.opsForZSet().rangeByScore("MaterialFlowPayment", 0, second); + if(materialFlowPayment.size() > 0){ + materialFlowPayment.forEach(s->s.substring(1)); + List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().in(Order::getOrderNumber, materialFlowPayment)); + for (Order order : list) { + if(null == order || order.getPayStatus() != 1){ + redisTemplate.opsForZSet().remove("MaterialFlowPayment", order.getOrderNumber()); + continue; + } + //开始执行关闭订单操作 + CloseOrderResult closeOrderResult = PaymentUtil.closeOrder("K" + order.getOrderNumber()); + 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", order.getOrderNumber(), 0); + log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult)); + } + redisTemplate.opsForZSet().remove("MaterialFlowPayment", order.getOrderNumber()); } } } -- Gitblit v1.7.1