diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/order/OrderCouponInfoDTO.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/order/OrderCouponInfoDTO.java index e7895609..3c9be106 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/order/OrderCouponInfoDTO.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/order/OrderCouponInfoDTO.java @@ -17,4 +17,5 @@ public class OrderCouponInfoDTO { private HashMap fullReductionCouponMap = new HashMap<>(); // 商品优惠券 private HashMap productCouponMap = new HashMap<>(); + private HashMap> couponMap = new HashMap<>(); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpCashierCartServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpCashierCartServiceImpl.java index 77f38863..94ca64a6 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpCashierCartServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/MpCashierCartServiceImpl.java @@ -134,7 +134,7 @@ public class MpCashierCartServiceImpl extends ServiceImpl selectByOrderIdAndState(Integer orderId, TableConstant.OrderInfo.Status... status) { LambdaQueryChainWrapper queryChainWrapper = lambdaQuery().eq(TbCashierCart::getOrderId, orderId); - if (status != null) { + if (status != null && status.length > 0) { queryChainWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(status)); } return queryChainWrapper.list(); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbShopCouponServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbShopCouponServiceImpl.java index 7e2be2a1..a41ab04e 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbShopCouponServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbShopCouponServiceImpl.java @@ -74,17 +74,13 @@ public class TbShopCouponServiceImpl extends ServiceImpl 0) { totalAmount = BigDecimal.valueOf(totalNumber).multiply(memberPrice).add(packFee); - }else { + } else { totalAmount = BigDecimal.valueOf(totalNumber).multiply(salePrice).add(packFee); } } } + + /** + * 获取总价不包含打包费 + * + */ + public BigDecimal getTotalAmountByNum(Integer num) { + if (num == null) { + num = totalNumber; + } + if (isMember != null && isMember == 1 && memberPrice != null && memberPrice.compareTo(BigDecimal.ZERO) > 0) { + return BigDecimal.valueOf(num).multiply(memberPrice); + } else { + return BigDecimal.valueOf(num).multiply(salePrice); + } + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java index cac0cc36..5ced0406 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java @@ -1177,77 +1177,107 @@ public class TbShopTableServiceImpl implements TbShopTableService { } + private TbUserCouponVo getCanUseCoupon(HashMap> couponMap, String productId) { + List tbUserCouponVos = couponMap.get(productId); + if (tbUserCouponVos == null || tbUserCouponVos.isEmpty()) return null; + for (TbUserCouponVo tbUserCouponVo : tbUserCouponVos) { + if (tbUserCouponVo.getCurrentUseNum() > 0) { + return tbUserCouponVo; + } + } + return null; + } + + private BigDecimal reduceProCoupon(HashMap> couponMap, TbCashierCart cashierCart, HashMap> usedCouponMap, BigDecimal discountAmount, ArrayList balanceCartList, + ArrayList outRecords, Integer memberId) { + TbUserCouponVo couponVo = getCanUseCoupon(couponMap, cashierCart.getProductId()); + if (couponVo != null && couponVo.getCurrentUseNum() > 0) { + BigDecimal currentUseNum; + if (cashierCart.getNumber() < couponVo.getCurrentUseNum()) { + cashierCart.setUserCouponId(couponVo.getId()); + discountAmount = discountAmount.add(cashierCart.getTotalAmountByNum(null)); + couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber()); + } + List tbUserCouponVos = usedCouponMap.computeIfAbsent(Integer.valueOf(cashierCart.getProductId()), k -> new ArrayList<>()); + tbUserCouponVos.add(couponVo); + + TbCashierCart balanceCart = null; + // 优惠券数量小于购物车数量,分割购物车数据 + if (cashierCart.getNumber() > couponVo.getCurrentUseNum()) { + currentUseNum = BigDecimal.valueOf(couponVo.getCurrentUseNum()); + BigDecimal cartNum = BigDecimal.valueOf(cashierCart.getNumber()); + int balanceNum = cashierCart.getTotalNumber() - couponVo.getCurrentUseNum(); + BigDecimal singlePackFee = cashierCart.getPackFee().divide(cartNum, RoundingMode.HALF_UP); + cashierCart.setPackFee(singlePackFee.multiply(currentUseNum)); + BigDecimal totalAmountByNum = cashierCart.getTotalAmountByNum(couponVo.getCurrentUseNum()); + cashierCart.setTotalAmount(totalAmountByNum.add(singlePackFee.multiply(currentUseNum))); + cashierCart.setNumber(couponVo.getCurrentUseNum()); + cashierCart.setTotalNumber(couponVo.getCurrentUseNum()); + cashierCart.setUserCouponId(couponVo.getId()); + discountAmount = discountAmount.add(totalAmountByNum); + couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber()); + + + // 创建结余购物车 + balanceCart = BeanUtil.copyProperties(cashierCart, TbCashierCart.class); + BigDecimal num = BigDecimal.valueOf(balanceNum); + balanceCart.setUserCouponId(null); + balanceCart.setId(null); + balanceCart.setNumber(balanceNum); + balanceCart.setTotalNumber(balanceNum); + balanceCart.setPackFee(singlePackFee.multiply(num)); + balanceCart.setTotalAmount(cashierCart.getSalePrice().multiply(num).add(balanceCart.getPackFee())); + balanceCartList.add(balanceCart); + } else { + currentUseNum = BigDecimal.valueOf(cashierCart.getNumber()); + discountAmount = discountAmount.add(cashierCart.getTotalAmount().divide(BigDecimal.valueOf(cashierCart.getTotalNumber()), RoundingMode.HALF_UP).multiply(currentUseNum)); + cashierCart.setUserCouponId(couponVo.getId()); + couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber()); + } + // 消耗并返还商品优惠券 + Integer shopId = Integer.valueOf(cashierCart.getShopId()); + TbActivateOutRecord tbActivateOutRecord = new TbActivateOutRecord(); + tbActivateOutRecord.setShopId(shopId); + tbActivateOutRecord.setGiveId(couponVo.getId()); + tbActivateOutRecord.setVipUserId(memberId); + tbActivateOutRecord.setType(TableConstant.ActivateOutRecord.Type.FULL_REDUCTION.getValue()); + tbActivateOutRecord.setUseNum(currentUseNum.toBigInteger().intValue()); + tbActivateOutRecord.setStatus(TableConstant.ActivateOutRecord.Status.CLOSED.getValue()); + tbActivateOutRecord.setCreateTime(DateUtil.date()); + tbActivateOutRecord.setRefNum(0); + outRecords.add(tbActivateOutRecord); + + // 优惠券未消耗完毕 + if (balanceCart != null && getCanUseCoupon(couponMap, balanceCart.getProductId()) != null) { + discountAmount = reduceProCoupon(couponMap, balanceCart, usedCouponMap, discountAmount, balanceCartList, outRecords, memberId); + } + return discountAmount; + } + return discountAmount; + } + private BigDecimal calcCartPriceWithCoupon(List newCashierCarts, OrderCouponInfoDTO couponInfoDTO, Integer memberId, TbOrderInfo orderInfo) { ArrayList balanceCartList = new ArrayList<>(); BigDecimal discountAmount = BigDecimal.ZERO; - HashMap couponMap = new HashMap<>(); + HashMap> couponMap = new HashMap<>(); couponInfoDTO.getProductCouponMap().values().forEach(item -> { - couponMap.put(item.getProId().toString(), item); + if (item.getCurrentUseNum() <= 0) { + return; + } + List tbUserCouponVos = couponMap.get(item.getProId().toString()); + if (tbUserCouponVos == null) { + tbUserCouponVos = new ArrayList<>(); + tbUserCouponVos.add(item); + couponMap.put(item.getProId().toString(), tbUserCouponVos); + }else { + tbUserCouponVos.add(item); + } }); - HashMap usedCouponMap = new HashMap<>(); + HashMap> usedCouponMap = new HashMap<>(); ArrayList outRecords = new ArrayList<>(); for (TbCashierCart cashierCart : newCashierCarts) { - TbUserCouponVo couponVo = couponMap.get(cashierCart.getProductId()); - boolean useCoupon; - if (couponVo != null && couponVo.getCurrentUseNum() > 0) { - BigDecimal currentUseNum = BigDecimal.ZERO; - if (cashierCart.getNumber() < couponVo.getCurrentUseNum()) { - currentUseNum = BigDecimal.valueOf(couponVo.getCurrentUseNum()); - BigDecimal cartNum = BigDecimal.valueOf(cashierCart.getNumber()); - BigDecimal singlePackFee = cashierCart.getPackFee().divide(cartNum, RoundingMode.HALF_UP); - cashierCart.setPackFee(singlePackFee.multiply(currentUseNum)); - cashierCart.setTotalAmount(cashierCart.getSalePrice().multiply(currentUseNum).add(singlePackFee.multiply(currentUseNum))); - cashierCart.setNumber(couponVo.getCurrentUseNum()); - cashierCart.setTotalNumber(couponVo.getCurrentUseNum()); - cashierCart.setUserCouponId(couponVo.getId()); - discountAmount = discountAmount.add(cashierCart.getTotalAmount()); - couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber()); - } - usedCouponMap.put(Integer.valueOf(cashierCart.getProductId()), couponVo); - // 优惠券数量小于购物车数量,分割购物车数据 - if (cashierCart.getNumber() > couponVo.getCurrentUseNum()) { - currentUseNum = BigDecimal.valueOf(couponVo.getCurrentUseNum()); - BigDecimal cartNum = BigDecimal.valueOf(cashierCart.getNumber()); - int balanceNum = cashierCart.getTotalNumber() - couponVo.getCurrentUseNum(); - BigDecimal singlePackFee = cashierCart.getPackFee().divide(cartNum, RoundingMode.HALF_UP); - cashierCart.setPackFee(singlePackFee.multiply(currentUseNum)); - cashierCart.setTotalAmount(cashierCart.getSalePrice().multiply(currentUseNum).add(singlePackFee.multiply(currentUseNum))); - cashierCart.setNumber(couponVo.getCurrentUseNum()); - cashierCart.setTotalNumber(couponVo.getCurrentUseNum()); - cashierCart.setUserCouponId(couponVo.getId()); - discountAmount = discountAmount.add(cashierCart.getTotalAmount()); - couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber()); - - - // 创建结余购物车 - TbCashierCart balanceCart = BeanUtil.copyProperties(cashierCart, TbCashierCart.class); - BigDecimal num = BigDecimal.valueOf(balanceNum); - balanceCart.setUserCouponId(null); - balanceCart.setId(null); - balanceCart.setNumber(balanceNum); - balanceCart.setTotalNumber(balanceNum); - balanceCart.setPackFee(singlePackFee.multiply(num)); - balanceCart.setTotalAmount(cashierCart.getSalePrice().multiply(num).add(balanceCart.getPackFee())); - balanceCartList.add(balanceCart); - } else { - currentUseNum = BigDecimal.valueOf(cashierCart.getNumber()); - discountAmount = discountAmount.add(cashierCart.getTotalAmount()); - cashierCart.setUserCouponId(couponVo.getId()); - couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber()); - } - // 消耗并返还商品优惠券 - Integer shopId = Integer.valueOf(cashierCart.getShopId()); - TbActivateOutRecord tbActivateOutRecord = new TbActivateOutRecord(); - tbActivateOutRecord.setShopId(shopId); - tbActivateOutRecord.setGiveId(couponVo.getId()); - tbActivateOutRecord.setVipUserId(memberId); - tbActivateOutRecord.setType(TableConstant.ActivateOutRecord.Type.FULL_REDUCTION.getValue()); - tbActivateOutRecord.setUseNum(currentUseNum.toBigInteger().intValue()); - tbActivateOutRecord.setStatus(TableConstant.ActivateOutRecord.Status.CLOSED.getValue()); - tbActivateOutRecord.setCreateTime(DateUtil.date()); - tbActivateOutRecord.setRefNum(0); - outRecords.add(tbActivateOutRecord); - } + discountAmount = reduceProCoupon(couponMap, cashierCart, usedCouponMap, discountAmount, balanceCartList, outRecords, memberId); } if (!balanceCartList.isEmpty()) { @@ -1258,7 +1288,7 @@ public class TbShopTableServiceImpl implements TbShopTableService { mpCashierCartService.updateBatchById(newCashierCarts); couponInfoDTO.setOutRecordList(outRecords); - couponInfoDTO.setProductCouponMap(usedCouponMap); + couponInfoDTO.setCouponMap(usedCouponMap); return discountAmount; } @@ -1939,7 +1969,7 @@ public class TbShopTableServiceImpl implements TbShopTableService { returnCoupon(orderInfo); Set productIdSet = new HashSet<>(); - List cashierCarts = mpCashierCartService.selectByOrderIdAndState(orderInfo.getId(), null); + List cashierCarts = mpCashierCartService.selectByOrderIdAndState(orderInfo.getId()); ArrayList activateCartInfo = new ArrayList<>(); for (TbCashierCart cashierCart : cashierCarts) { productIdSet.add(cashierCart.getProductId());