Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
Tankaikai
2024-11-12 09:30:01 +08:00
5 changed files with 121 additions and 77 deletions

View File

@@ -118,26 +118,31 @@ public class ProductController {
}
@PostMapping("/choseEatModel")
public Result choseEatModel(@Validated @RequestBody ChoseEatModelDTO choseEatModelDTO) {
public Result choseEatModel(@RequestHeader("id") Integer userId, @Validated @RequestBody ChoseEatModelDTO choseEatModelDTO) {
choseEatModelDTO.setUserId(userId);
List<TbCashierCart> cashierCartList = cartService.choseEatModel(choseEatModelDTO);
BigDecimal amount = BigDecimal.ZERO;
BigDecimal memberAmount = BigDecimal.ZERO;
BigDecimal packFee = BigDecimal.ZERO;
ArrayList<TbCashierCart> cashierCarts = new ArrayList<>();
TbCashierCart seatFee = null;
for (TbCashierCart item : cashierCartList) {
if (!TableConstant.CART_SEAT_ID.equals(item.getProductId())) {
cashierCarts.add(item);
amount = amount.add(item.getSalePrice().multiply(BigDecimal.valueOf(item.getTotalNumber())).add(item.getPackFee()));
if (item.getMemberPrice() == null || item.getMemberPrice().compareTo(BigDecimal.ZERO) <= 0) item.setMemberPrice(item.getSalePrice());
memberAmount = memberAmount.add(item.getMemberPrice().multiply(BigDecimal.valueOf(item.getTotalNumber())).add(item.getPackFee()));
}else {
seatFee = item;
}
packFee = packFee.add(item.getPackFee());
}
HashMap<String, Object> data = new HashMap<>();
data.put("amount", amount);
data.put("memberAmount", memberAmount);
data.put("info", cashierCarts);
data.put("seatFee", seatFee);
data.put("packFee", packFee);
return Result.success(CodeEnum.SUCCESS, data);
}

View File

@@ -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);
}
}
}

View File

@@ -17,4 +17,5 @@ public class ChoseEatModelDTO {
@Min(0)
// 0切换店内 1切换外带
private Integer type;
private Integer userId;
}

View File

@@ -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;
}

View File

@@ -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;
}
@@ -1481,25 +1512,17 @@ public class CartService {
}
public List<TbCashierCart> choseEatModel(ChoseEatModelDTO choseEatModelDTO) {
Integer userId = TokenUtil.getUserId();
List<TbCashierCart> cashierCartList;
ShopEatTypeInfoDTO shopEatTypeInfoDTO = shopUtils.checkEatModel(choseEatModelDTO.getTableId(), choseEatModelDTO.getShopId());
// 外带模式
if (choseEatModelDTO.getType() == 1) {
// 查询购物车所有信息
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, choseEatModelDTO.getShopId())
.gt(TbCashierCart::getCreatedAt, DateUtil.offsetDay(DateUtil.date(), -1).getTime())
.isNull(TbCashierCart::getOrderId)
.ne(TbCashierCart::getProductId, "-999")
.eq(TbCashierCart::getStatus, "create");
queryWrapper.eq(TbCashierCart::getUserId, userId);
cashierCartList = mpCashierCartMapper.selectList(queryWrapper);
cashierCartList = cashierCartService.selectByShopEatTypeInfo(shopEatTypeInfoDTO, choseEatModelDTO.getUserId());
cashierCartList = cashierCartList.stream().filter(item -> !TableConstant.CART_SEAT_ID.equals(item.getProductId())).collect(Collectors.toList());
// 计算打包费
if (cashierCartList.isEmpty()) {
return new ArrayList<>();
}
List<String> productIds = cashierCartList.stream().map(TbCashierCart::getProductId).collect(Collectors.toList());
Map<Integer, TbProduct> productMap = productMapper.selectByIds(productIds).stream()
.collect(Collectors.toMap(
@@ -1518,7 +1541,6 @@ public class CartService {
} else {
// 查询购物车所有信息
ShopEatTypeInfoDTO shopEatTypeInfoDTO = shopUtils.checkEatModel(choseEatModelDTO.getTableId(), choseEatModelDTO.getShopId());
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, choseEatModelDTO.getShopId())
.gt(TbCashierCart::getCreatedAt, DateUtil.offsetDay(DateUtil.date(), -1).getTime())