fix: 优惠券使用逻辑修改
This commit is contained in:
@@ -97,4 +97,19 @@ public class TbCashierCart implements Serializable {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,4 +17,5 @@ public class OrderCouponInfoDTO {
|
||||
private HashMap<Integer, TbUserCouponVo> fullReductionCouponMap = new HashMap<>();
|
||||
// 商品优惠券
|
||||
private HashMap<Integer, TbUserCouponVo> productCouponMap = new HashMap<>();
|
||||
private HashMap<Integer, List<TbUserCouponVo>> couponMap;
|
||||
}
|
||||
|
||||
@@ -1116,6 +1116,86 @@ public class CartService {
|
||||
return priceDTO;
|
||||
}
|
||||
|
||||
private TbUserCouponVo getCanUseCoupon(HashMap<String, List<TbUserCouponVo>> couponMap, String productId) {
|
||||
List<TbUserCouponVo> 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<String, List<TbUserCouponVo>> couponMap, TbCashierCart cashierCart, HashMap<Integer,
|
||||
List<TbUserCouponVo>> usedCouponMap, BigDecimal discountAmount, ArrayList<TbCashierCart> balanceCartList,
|
||||
ArrayList<TbActivateOutRecord> 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<TbUserCouponVo> 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据商品优惠券计算购物车优惠金额
|
||||
*
|
||||
@@ -1126,74 +1206,25 @@ public class CartService {
|
||||
private BigDecimal calcCartPriceWithCoupon(OrderCartInfoDTO cartInfoDTO, OrderCouponInfoDTO couponInfoDTO, Integer memberId) {
|
||||
ArrayList<TbCashierCart> balanceCartList = new ArrayList<>();
|
||||
BigDecimal discountAmount = BigDecimal.ZERO;
|
||||
HashMap<String, TbUserCouponVo> couponMap = new HashMap<>();
|
||||
HashMap<String, List<TbUserCouponVo>> couponMap = new HashMap<>();
|
||||
couponInfoDTO.getProductCouponMap().values().forEach(item -> {
|
||||
couponMap.put(item.getProId().toString(), item);
|
||||
if (item.getCurrentUseNum() <= 0) {
|
||||
return;
|
||||
}
|
||||
List<TbUserCouponVo> 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<Integer, TbUserCouponVo> usedCouponMap = new HashMap<>();
|
||||
HashMap<Integer, List<TbUserCouponVo>> usedCouponMap = new HashMap<>();
|
||||
ArrayList<TbActivateOutRecord> outRecords = new ArrayList<>();
|
||||
for (TbCashierCart cashierCart : cartInfoDTO.getNewCashierCarts()) {
|
||||
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());
|
||||
discountAmount = reduceProCoupon(couponMap, cashierCart, usedCouponMap, discountAmount, balanceCartList, outRecords, memberId);
|
||||
|
||||
|
||||
// 创建结余购物车
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
if (!balanceCartList.isEmpty()) {
|
||||
@@ -1205,7 +1236,7 @@ public class CartService {
|
||||
cashierCartService.updateBatchById(cartInfoDTO.getNewCashierCarts());
|
||||
|
||||
couponInfoDTO.setOutRecordList(outRecords);
|
||||
couponInfoDTO.setProductCouponMap(usedCouponMap);
|
||||
couponInfoDTO.setCouponMap(usedCouponMap);
|
||||
|
||||
return discountAmount;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user