fix: 优惠券使用逻辑修改
This commit is contained in:
@@ -17,4 +17,5 @@ public class OrderCouponInfoDTO {
|
|||||||
private HashMap<Integer, TbUserCouponVo> fullReductionCouponMap = new HashMap<>();
|
private HashMap<Integer, TbUserCouponVo> fullReductionCouponMap = new HashMap<>();
|
||||||
// 商品优惠券
|
// 商品优惠券
|
||||||
private HashMap<Integer, TbUserCouponVo> productCouponMap = new HashMap<>();
|
private HashMap<Integer, TbUserCouponVo> productCouponMap = new HashMap<>();
|
||||||
|
private HashMap<Integer, List<TbUserCouponVo>> couponMap = new HashMap<>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
|
|||||||
@Override
|
@Override
|
||||||
public List<TbCashierCart> selectByOrderIdAndState(Integer orderId, TableConstant.OrderInfo.Status... status) {
|
public List<TbCashierCart> selectByOrderIdAndState(Integer orderId, TableConstant.OrderInfo.Status... status) {
|
||||||
LambdaQueryChainWrapper<TbCashierCart> queryChainWrapper = lambdaQuery().eq(TbCashierCart::getOrderId, orderId);
|
LambdaQueryChainWrapper<TbCashierCart> queryChainWrapper = lambdaQuery().eq(TbCashierCart::getOrderId, orderId);
|
||||||
if (status != null) {
|
if (status != null && status.length > 0) {
|
||||||
queryChainWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(status));
|
queryChainWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(status));
|
||||||
}
|
}
|
||||||
return queryChainWrapper.list();
|
return queryChainWrapper.list();
|
||||||
|
|||||||
@@ -74,17 +74,13 @@ public class TbShopCouponServiceImpl extends ServiceImpl<TbShopCouponMapper, TbS
|
|||||||
private TbActivateOutRecordMapper outRecordMapper;
|
private TbActivateOutRecordMapper outRecordMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private TbShopShareRecordService shareRecordService;
|
private TbShopShareRecordService shareRecordService;
|
||||||
private final TbMShopUserMapper shopUserMapper;
|
|
||||||
private final MpShopUserService shopUserService;
|
private final MpShopUserService shopUserService;
|
||||||
private final MpOrderInfoService mpOrderInfoService;
|
private final MpOrderInfoService mpOrderInfoService;
|
||||||
private final MpOrderDetailService mpOrderDetailService;
|
|
||||||
private final MpCashierCartService mpCashierCartService;
|
private final MpCashierCartService mpCashierCartService;
|
||||||
|
|
||||||
public TbShopCouponServiceImpl(TbMShopUserMapper shopUserMapper, MpShopUserService shopUserService, MpOrderInfoService mpOrderInfoService, MpOrderDetailService mpOrderDetailService, MpCashierCartService mpCashierCartService) {
|
public TbShopCouponServiceImpl(MpShopUserService shopUserService, MpOrderInfoService mpOrderInfoService, MpCashierCartService mpCashierCartService) {
|
||||||
this.shopUserMapper = shopUserMapper;
|
|
||||||
this.shopUserService = shopUserService;
|
this.shopUserService = shopUserService;
|
||||||
this.mpOrderInfoService = mpOrderInfoService;
|
this.mpOrderInfoService = mpOrderInfoService;
|
||||||
this.mpOrderDetailService = mpOrderDetailService;
|
|
||||||
this.mpCashierCartService = mpCashierCartService;
|
this.mpCashierCartService = mpCashierCartService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,15 +19,16 @@ import lombok.Data;
|
|||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import cn.hutool.core.bean.copier.CopyOptions;
|
import cn.hutool.core.bean.copier.CopyOptions;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import javax.validation.constraints.*;
|
import javax.validation.constraints.*;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @author lyf
|
||||||
* @website https://eladmin.vip
|
* @website https://eladmin.vip
|
||||||
* @description /
|
* @description /
|
||||||
* @author lyf
|
|
||||||
* @date 2024-03-02
|
* @date 2024-03-02
|
||||||
**/
|
**/
|
||||||
@Entity
|
@Entity
|
||||||
@@ -189,4 +190,19 @@ public class TbCashierCart implements Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取总价不包含打包费
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1177,33 +1177,32 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private BigDecimal calcCartPriceWithCoupon(List<TbCashierCart> newCashierCarts, OrderCouponInfoDTO couponInfoDTO, Integer memberId, TbOrderInfo orderInfo) {
|
private TbUserCouponVo getCanUseCoupon(HashMap<String, List<TbUserCouponVo>> couponMap, String productId) {
|
||||||
ArrayList<TbCashierCart> balanceCartList = new ArrayList<>();
|
List<TbUserCouponVo> tbUserCouponVos = couponMap.get(productId);
|
||||||
BigDecimal discountAmount = BigDecimal.ZERO;
|
if (tbUserCouponVos == null || tbUserCouponVos.isEmpty()) return null;
|
||||||
HashMap<String, TbUserCouponVo> couponMap = new HashMap<>();
|
for (TbUserCouponVo tbUserCouponVo : tbUserCouponVos) {
|
||||||
couponInfoDTO.getProductCouponMap().values().forEach(item -> {
|
if (tbUserCouponVo.getCurrentUseNum() > 0) {
|
||||||
couponMap.put(item.getProId().toString(), item);
|
return tbUserCouponVo;
|
||||||
});
|
}
|
||||||
HashMap<Integer, TbUserCouponVo> usedCouponMap = new HashMap<>();
|
}
|
||||||
ArrayList<TbActivateOutRecord> outRecords = new ArrayList<>();
|
return null;
|
||||||
for (TbCashierCart cashierCart : newCashierCarts) {
|
}
|
||||||
TbUserCouponVo couponVo = couponMap.get(cashierCart.getProductId());
|
|
||||||
boolean useCoupon;
|
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) {
|
if (couponVo != null && couponVo.getCurrentUseNum() > 0) {
|
||||||
BigDecimal currentUseNum = BigDecimal.ZERO;
|
BigDecimal currentUseNum;
|
||||||
if (cashierCart.getNumber() < couponVo.getCurrentUseNum()) {
|
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());
|
cashierCart.setUserCouponId(couponVo.getId());
|
||||||
discountAmount = discountAmount.add(cashierCart.getTotalAmount());
|
discountAmount = discountAmount.add(cashierCart.getTotalAmountByNum(null));
|
||||||
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber());
|
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber());
|
||||||
}
|
}
|
||||||
usedCouponMap.put(Integer.valueOf(cashierCart.getProductId()), couponVo);
|
List<TbUserCouponVo> tbUserCouponVos = usedCouponMap.computeIfAbsent(Integer.valueOf(cashierCart.getProductId()), k -> new ArrayList<>());
|
||||||
|
tbUserCouponVos.add(couponVo);
|
||||||
|
|
||||||
|
TbCashierCart balanceCart = null;
|
||||||
// 优惠券数量小于购物车数量,分割购物车数据
|
// 优惠券数量小于购物车数量,分割购物车数据
|
||||||
if (cashierCart.getNumber() > couponVo.getCurrentUseNum()) {
|
if (cashierCart.getNumber() > couponVo.getCurrentUseNum()) {
|
||||||
currentUseNum = BigDecimal.valueOf(couponVo.getCurrentUseNum());
|
currentUseNum = BigDecimal.valueOf(couponVo.getCurrentUseNum());
|
||||||
@@ -1211,16 +1210,17 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||||||
int balanceNum = cashierCart.getTotalNumber() - couponVo.getCurrentUseNum();
|
int balanceNum = cashierCart.getTotalNumber() - couponVo.getCurrentUseNum();
|
||||||
BigDecimal singlePackFee = cashierCart.getPackFee().divide(cartNum, RoundingMode.HALF_UP);
|
BigDecimal singlePackFee = cashierCart.getPackFee().divide(cartNum, RoundingMode.HALF_UP);
|
||||||
cashierCart.setPackFee(singlePackFee.multiply(currentUseNum));
|
cashierCart.setPackFee(singlePackFee.multiply(currentUseNum));
|
||||||
cashierCart.setTotalAmount(cashierCart.getSalePrice().multiply(currentUseNum).add(singlePackFee.multiply(currentUseNum)));
|
BigDecimal totalAmountByNum = cashierCart.getTotalAmountByNum(couponVo.getCurrentUseNum());
|
||||||
|
cashierCart.setTotalAmount(totalAmountByNum.add(singlePackFee.multiply(currentUseNum)));
|
||||||
cashierCart.setNumber(couponVo.getCurrentUseNum());
|
cashierCart.setNumber(couponVo.getCurrentUseNum());
|
||||||
cashierCart.setTotalNumber(couponVo.getCurrentUseNum());
|
cashierCart.setTotalNumber(couponVo.getCurrentUseNum());
|
||||||
cashierCart.setUserCouponId(couponVo.getId());
|
cashierCart.setUserCouponId(couponVo.getId());
|
||||||
discountAmount = discountAmount.add(cashierCart.getTotalAmount());
|
discountAmount = discountAmount.add(totalAmountByNum);
|
||||||
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber());
|
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber());
|
||||||
|
|
||||||
|
|
||||||
// 创建结余购物车
|
// 创建结余购物车
|
||||||
TbCashierCart balanceCart = BeanUtil.copyProperties(cashierCart, TbCashierCart.class);
|
balanceCart = BeanUtil.copyProperties(cashierCart, TbCashierCart.class);
|
||||||
BigDecimal num = BigDecimal.valueOf(balanceNum);
|
BigDecimal num = BigDecimal.valueOf(balanceNum);
|
||||||
balanceCart.setUserCouponId(null);
|
balanceCart.setUserCouponId(null);
|
||||||
balanceCart.setId(null);
|
balanceCart.setId(null);
|
||||||
@@ -1231,7 +1231,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||||||
balanceCartList.add(balanceCart);
|
balanceCartList.add(balanceCart);
|
||||||
} else {
|
} else {
|
||||||
currentUseNum = BigDecimal.valueOf(cashierCart.getNumber());
|
currentUseNum = BigDecimal.valueOf(cashierCart.getNumber());
|
||||||
discountAmount = discountAmount.add(cashierCart.getTotalAmount());
|
discountAmount = discountAmount.add(cashierCart.getTotalAmount().divide(BigDecimal.valueOf(cashierCart.getTotalNumber()), RoundingMode.HALF_UP).multiply(currentUseNum));
|
||||||
cashierCart.setUserCouponId(couponVo.getId());
|
cashierCart.setUserCouponId(couponVo.getId());
|
||||||
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber());
|
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum() - cashierCart.getNumber());
|
||||||
}
|
}
|
||||||
@@ -1247,7 +1247,37 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||||||
tbActivateOutRecord.setCreateTime(DateUtil.date());
|
tbActivateOutRecord.setCreateTime(DateUtil.date());
|
||||||
tbActivateOutRecord.setRefNum(0);
|
tbActivateOutRecord.setRefNum(0);
|
||||||
outRecords.add(tbActivateOutRecord);
|
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<TbCashierCart> newCashierCarts, OrderCouponInfoDTO couponInfoDTO, Integer memberId, TbOrderInfo orderInfo) {
|
||||||
|
ArrayList<TbCashierCart> balanceCartList = new ArrayList<>();
|
||||||
|
BigDecimal discountAmount = BigDecimal.ZERO;
|
||||||
|
HashMap<String, List<TbUserCouponVo>> couponMap = new HashMap<>();
|
||||||
|
couponInfoDTO.getProductCouponMap().values().forEach(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, List<TbUserCouponVo>> usedCouponMap = new HashMap<>();
|
||||||
|
ArrayList<TbActivateOutRecord> outRecords = new ArrayList<>();
|
||||||
|
for (TbCashierCart cashierCart : newCashierCarts) {
|
||||||
|
discountAmount = reduceProCoupon(couponMap, cashierCart, usedCouponMap, discountAmount, balanceCartList, outRecords, memberId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!balanceCartList.isEmpty()) {
|
if (!balanceCartList.isEmpty()) {
|
||||||
@@ -1258,7 +1288,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||||||
mpCashierCartService.updateBatchById(newCashierCarts);
|
mpCashierCartService.updateBatchById(newCashierCarts);
|
||||||
|
|
||||||
couponInfoDTO.setOutRecordList(outRecords);
|
couponInfoDTO.setOutRecordList(outRecords);
|
||||||
couponInfoDTO.setProductCouponMap(usedCouponMap);
|
couponInfoDTO.setCouponMap(usedCouponMap);
|
||||||
|
|
||||||
return discountAmount;
|
return discountAmount;
|
||||||
}
|
}
|
||||||
@@ -1939,7 +1969,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|||||||
returnCoupon(orderInfo);
|
returnCoupon(orderInfo);
|
||||||
|
|
||||||
Set<String> productIdSet = new HashSet<>();
|
Set<String> productIdSet = new HashSet<>();
|
||||||
List<TbCashierCart> cashierCarts = mpCashierCartService.selectByOrderIdAndState(orderInfo.getId(), null);
|
List<TbCashierCart> cashierCarts = mpCashierCartService.selectByOrderIdAndState(orderInfo.getId());
|
||||||
ArrayList<TbCashierCart> activateCartInfo = new ArrayList<>();
|
ArrayList<TbCashierCart> activateCartInfo = new ArrayList<>();
|
||||||
for (TbCashierCart cashierCart : cashierCarts) {
|
for (TbCashierCart cashierCart : cashierCarts) {
|
||||||
productIdSet.add(cashierCart.getProductId());
|
productIdSet.add(cashierCart.getProductId());
|
||||||
|
|||||||
Reference in New Issue
Block a user