fix: 优惠券使用顺序调整
This commit is contained in:
parent
8a33d49c7c
commit
04023c3f30
|
|
@ -12,6 +12,8 @@ public class OrderPriceDTO {
|
||||||
private BigDecimal originAmount = BigDecimal.ZERO;
|
private BigDecimal originAmount = BigDecimal.ZERO;
|
||||||
private BigDecimal totalAmount = BigDecimal.ZERO;
|
private BigDecimal totalAmount = BigDecimal.ZERO;
|
||||||
private BigDecimal packAmount = BigDecimal.ZERO;
|
private BigDecimal packAmount = BigDecimal.ZERO;
|
||||||
|
// 打折折扣金额
|
||||||
|
private BigDecimal discountAmount = BigDecimal.ZERO;
|
||||||
private boolean hasNewInfo = false;
|
private boolean hasNewInfo = false;
|
||||||
private List<TbOrderDetail> newOrderDetailList = new ArrayList<>();
|
private List<TbOrderDetail> newOrderDetailList = new ArrayList<>();
|
||||||
private List<TbOrderDetail> removeOrderDetailList = new ArrayList<>();
|
private List<TbOrderDetail> removeOrderDetailList = new ArrayList<>();
|
||||||
|
|
|
||||||
|
|
@ -229,12 +229,15 @@ public class TbCashierCart implements Serializable {
|
||||||
if (discountRadio == null) {
|
if (discountRadio == null) {
|
||||||
discountRadio = new BigDecimal("1");
|
discountRadio = new BigDecimal("1");
|
||||||
}
|
}
|
||||||
resetTotalAmount(discountRadio);
|
|
||||||
if (num == null) {
|
if (num == null) {
|
||||||
num = totalNumber;
|
num = totalNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
return totalAmount.divide(totalNumber, 9, RoundingMode.HALF_UP).multiply(num).setScale(2, RoundingMode.HALF_UP);
|
if (isMember != null && isMember == 1 && memberPrice != null && memberPrice.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
return num.multiply(memberPrice).multiply(discountRadio).add(packFee).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}else {
|
||||||
|
return num.multiply(discountSaleAmount != null ? discountSaleAmount : salePrice).add(packFee).multiply(discountRadio).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
// if (isMember != null && isMember == 1 && memberPrice != null && memberPrice.compareTo(BigDecimal.ZERO) > 0) {
|
// if (isMember != null && isMember == 1 && memberPrice != null && memberPrice.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
// return num.multiply(memberPrice);
|
// return num.multiply(memberPrice);
|
||||||
// } else {
|
// } else {
|
||||||
|
|
|
||||||
|
|
@ -583,12 +583,12 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
tbCashierCart.setNote(addCartDTO.getNote());
|
tbCashierCart.setNote(addCartDTO.getNote());
|
||||||
tbCashierCart.setPlatformType(OrderPlatformTypeEnum.PC.getValue());
|
tbCashierCart.setPlatformType(OrderPlatformTypeEnum.PC.getValue());
|
||||||
tbCashierCart.setIsMember(shopEatTypeInfoDTO.isMemberPrice() && addCartDTO.getVipUserId() != null ? 1 : 0);
|
tbCashierCart.setIsMember(shopEatTypeInfoDTO.isMemberPrice() && addCartDTO.getVipUserId() != null ? 1 : 0);
|
||||||
tbCashierCart.setIsMember(!shopEatTypeInfoDTO.isMemberPrice() ? 0 : addCartDTO.getVipUserId() == null ? 0 : 1);
|
tbCashierCart.setIsMember(!shopEatTypeInfoDTO.isMemberPrice() ? 0 : addCartDTO.getVipUserId() == null ? 0 : 1);
|
||||||
tbCashierCart.setMemberPrice(productSku.getMemberPrice());
|
tbCashierCart.setMemberPrice(productSku.getMemberPrice());
|
||||||
cashierCartRepository.save(tbCashierCart);
|
cashierCartRepository.save(tbCashierCart);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
tbCashierCart.setIsMember(!shopEatTypeInfoDTO.isMemberPrice() ? 0 : addCartDTO.getVipUserId() == null ? 0 : 1);
|
tbCashierCart.setIsMember(!shopEatTypeInfoDTO.isMemberPrice() ? 0 : addCartDTO.getVipUserId() == null ? 0 : 1);
|
||||||
tbCashierCart.setNote(addCartDTO.getNote());
|
tbCashierCart.setNote(addCartDTO.getNote());
|
||||||
tbCashierCart.setTotalAmount(addCartDTO.getNum().multiply(productSku.getSalePrice()));
|
tbCashierCart.setTotalAmount(addCartDTO.getNum().multiply(productSku.getSalePrice()));
|
||||||
|
|
||||||
|
|
@ -1277,7 +1277,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
|
|
||||||
private BigDecimal reduceProCoupon(HashMap<String, List<TbUserCouponVo>> couponMap, TbCashierCart cashierCart, HashMap<Integer,
|
private BigDecimal reduceProCoupon(HashMap<String, List<TbUserCouponVo>> couponMap, TbCashierCart cashierCart, HashMap<Integer,
|
||||||
List<TbUserCouponVo>> usedCouponMap, BigDecimal discountAmount, ArrayList<TbCashierCart> balanceCartList,
|
List<TbUserCouponVo>> usedCouponMap, BigDecimal discountAmount, ArrayList<TbCashierCart> balanceCartList,
|
||||||
ArrayList<TbActivateOutRecord> outRecords, Integer memberId) {
|
ArrayList<TbActivateOutRecord> outRecords, Integer memberId) {
|
||||||
TbUserCouponVo couponVo = getCanUseCoupon(couponMap, cashierCart.getProductId());
|
TbUserCouponVo couponVo = getCanUseCoupon(couponMap, cashierCart.getProductId());
|
||||||
if (couponVo != null && couponVo.getCurrentUseNum().compareTo(BigDecimal.ZERO) > 0) {
|
if (couponVo != null && couponVo.getCurrentUseNum().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
BigDecimal currentUseNum;
|
BigDecimal currentUseNum;
|
||||||
|
|
@ -1291,7 +1291,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum().subtract(cashierCart.getNumber()));
|
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum().subtract(cashierCart.getNumber()));
|
||||||
currentUseNum = cashierCart.getNumber();
|
currentUseNum = cashierCart.getNumber();
|
||||||
// 优惠券数量小于购物车数量,分割购物车数据
|
// 优惠券数量小于购物车数量,分割购物车数据
|
||||||
}else if (cashierCart.getNumber().compareTo(couponVo.getCurrentUseNum()) > 0) {
|
} else if (cashierCart.getNumber().compareTo(couponVo.getCurrentUseNum()) > 0) {
|
||||||
currentUseNum = couponVo.getCurrentUseNum();
|
currentUseNum = couponVo.getCurrentUseNum();
|
||||||
BigDecimal cartNum = BigDecimal.valueOf(cashierCart.getNumber().intValue());
|
BigDecimal cartNum = BigDecimal.valueOf(cashierCart.getNumber().intValue());
|
||||||
BigDecimal balanceNum = cashierCart.getTotalNumber().subtract(couponVo.getCurrentUseNum());
|
BigDecimal balanceNum = cashierCart.getTotalNumber().subtract(couponVo.getCurrentUseNum());
|
||||||
|
|
@ -1307,7 +1307,6 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
currentUseNum = cashierCart.getNumber();
|
currentUseNum = cashierCart.getNumber();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 创建结余购物车
|
// 创建结余购物车
|
||||||
balanceCart = BeanUtil.copyProperties(cashierCart, TbCashierCart.class);
|
balanceCart = BeanUtil.copyProperties(cashierCart, TbCashierCart.class);
|
||||||
balanceCart.setUserCouponId(null);
|
balanceCart.setUserCouponId(null);
|
||||||
|
|
@ -1318,7 +1317,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
balanceCart.setTotalAmount(cashierCart.getTotalAmountByNum(balanceNum, null).add(singlePackFee.multiply(balanceNum)));
|
balanceCart.setTotalAmount(cashierCart.getTotalAmountByNum(balanceNum, null).add(singlePackFee.multiply(balanceNum)));
|
||||||
balanceCartList.add(balanceCart);
|
balanceCartList.add(balanceCart);
|
||||||
} else {
|
} else {
|
||||||
currentUseNum =cashierCart.getNumber();
|
currentUseNum = cashierCart.getNumber();
|
||||||
discountAmount = discountAmount.add(cashierCart.getTotalAmount());
|
discountAmount = discountAmount.add(cashierCart.getTotalAmount());
|
||||||
cashierCart.setUserCouponId(couponVo.getId());
|
cashierCart.setUserCouponId(couponVo.getId());
|
||||||
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum().subtract(cashierCart.getNumber()));
|
couponVo.setCurrentUseNum(couponVo.getCurrentUseNum().subtract(cashierCart.getNumber()));
|
||||||
|
|
@ -1369,7 +1368,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
tbUserCouponVos = new ArrayList<>();
|
tbUserCouponVos = new ArrayList<>();
|
||||||
tbUserCouponVos.add(item);
|
tbUserCouponVos.add(item);
|
||||||
couponMap.put(item.getProId().toString(), tbUserCouponVos);
|
couponMap.put(item.getProId().toString(), tbUserCouponVos);
|
||||||
}else {
|
} else {
|
||||||
tbUserCouponVos.add(item);
|
tbUserCouponVos.add(item);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -1409,7 +1408,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
couponInfoDTO.setOutRecordList(outRecords);
|
couponInfoDTO.setOutRecordList(outRecords);
|
||||||
couponInfoDTO.setCouponMap(usedCouponMap);
|
couponInfoDTO.setCouponMap(usedCouponMap);
|
||||||
|
|
||||||
return discountAmount.multiply(orderInfo.getDiscountRatio());
|
return discountAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
private OrderCouponInfoDTO getCouponInfo(Integer memberId, Integer shopId, List<UserCouponInfoDTO> userCouponInfoDTOList, BigDecimal orderAmount, Set<String> productIds) {
|
private OrderCouponInfoDTO getCouponInfo(Integer memberId, Integer shopId, List<UserCouponInfoDTO> userCouponInfoDTOList, BigDecimal orderAmount, Set<String> productIds) {
|
||||||
|
|
@ -1467,7 +1466,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
List<TbCashierCart> allCashierCarts;
|
List<TbCashierCart> allCashierCarts;
|
||||||
if (orderId != null) {
|
if (orderId != null) {
|
||||||
allCashierCarts = mpCashierCartService.selectByOrderIdAndState(orderId);
|
allCashierCarts = mpCashierCartService.selectByOrderIdAndState(orderId);
|
||||||
}else {
|
} else {
|
||||||
allCashierCarts = mpCashierCartService.selectByShopEatType(shopEatTypeInfoDTO, masterId);
|
allCashierCarts = mpCashierCartService.selectByShopEatType(shopEatTypeInfoDTO, masterId);
|
||||||
}
|
}
|
||||||
TbCashierCart seatCart = null;
|
TbCashierCart seatCart = null;
|
||||||
|
|
@ -1586,11 +1585,13 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
|
|
||||||
// 已经退款和使用优惠券的商品不进行统计金额
|
// 已经退款和使用优惠券的商品不进行统计金额
|
||||||
if (!"return".equals(cashierCart.getStatus()) && cashierCart.getUserCouponId() == null) {
|
if (!"return".equals(cashierCart.getStatus()) && cashierCart.getUserCouponId() == null) {
|
||||||
|
BigDecimal originalTotal = cashierCart.getTotalAmountByNum(cashierCart.getTotalNumber(), BigDecimal.ONE);
|
||||||
|
priceDTO.setDiscountAmount(priceDTO.getDiscountAmount().add(originalTotal.subtract(cashierCart.getTotalAmount())));
|
||||||
priceDTO.setTotalAmount(priceDTO.getTotalAmount().add(cashierCart.getTotalAmount()));
|
priceDTO.setTotalAmount(priceDTO.getTotalAmount().add(cashierCart.getTotalAmount()));
|
||||||
priceDTO.setPackAmount(priceDTO.getPackAmount().add(cashierCart.getPackFee()));
|
priceDTO.setPackAmount(priceDTO.getPackAmount().add(cashierCart.getPackFee()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!"return".equals(cashierCart.getStatus())) {
|
if (!"return".equals(cashierCart.getStatus())) {
|
||||||
priceDTO.setOriginAmount(priceDTO.getOriginAmount().add(cashierCart.getTotalAmount()));
|
priceDTO.setOriginAmount(priceDTO.getOriginAmount().add(cashierCart.getTotalAmount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2116,6 +2117,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
// 返还上次使用的券
|
// 返还上次使用的券
|
||||||
returnCoupon(orderInfo, true);
|
returnCoupon(orderInfo, true);
|
||||||
|
|
||||||
|
// 设置折扣比例
|
||||||
|
orderInfo.setDiscountRatio(payDTO.getDiscount());
|
||||||
|
|
||||||
Set<String> productIdSet = new HashSet<>();
|
Set<String> productIdSet = new HashSet<>();
|
||||||
List<TbCashierCart> cashierCarts = mpCashierCartService.selectByOrderIdAndState(orderInfo.getId());
|
List<TbCashierCart> cashierCarts = mpCashierCartService.selectByOrderIdAndState(orderInfo.getId());
|
||||||
|
|
@ -2140,12 +2143,13 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
// 更新订单信息
|
// 更新订单信息
|
||||||
ShopEatTypeInfoDTO shopEatTypeInfoDTO = checkEatModel(orderInfo.getShopId(), orderInfo.getTableId());
|
ShopEatTypeInfoDTO shopEatTypeInfoDTO = checkEatModel(orderInfo.getShopId(), orderInfo.getTableId());
|
||||||
OrderPriceDTO priceDTO = createOrderDetailWithCoupon(activateCartInfo, orderInfo, payDTO.getShopId(), false, shopEatTypeInfoDTO);
|
OrderPriceDTO priceDTO = createOrderDetailWithCoupon(activateCartInfo, orderInfo, payDTO.getShopId(), false, shopEatTypeInfoDTO);
|
||||||
BigDecimal finalAmount = priceDTO.getTotalAmount().multiply(payDTO.getDiscount()).setScale(2, RoundingMode.HALF_UP);
|
BigDecimal finalAmount = priceDTO.getTotalAmount().setScale(2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
orderInfo.setUpdatedAt(System.currentTimeMillis());
|
orderInfo.setUpdatedAt(System.currentTimeMillis());
|
||||||
orderInfo.setSettlementAmount(finalAmount);
|
orderInfo.setSettlementAmount(finalAmount);
|
||||||
orderInfo.setAmount(finalAmount);
|
orderInfo.setAmount(finalAmount);
|
||||||
orderInfo.setOrderAmount(finalAmount);
|
orderInfo.setOrderAmount(finalAmount);
|
||||||
|
orderInfo.setDiscountAmount(priceDTO.getDiscountAmount());
|
||||||
|
|
||||||
// 计算订单优惠
|
// 计算订单优惠
|
||||||
TbActivateOutRecord outRecord = calcOrderInfoDiscount(payDTO, orderInfo, couponInfo);
|
TbActivateOutRecord outRecord = calcOrderInfoDiscount(payDTO, orderInfo, couponInfo);
|
||||||
|
|
@ -2251,17 +2255,17 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
}
|
}
|
||||||
|
|
||||||
BigDecimal finalAmount = null;
|
BigDecimal finalAmount = null;
|
||||||
// 计算订单折扣信息
|
|
||||||
if (payDTO.getDiscount().compareTo(new BigDecimal("1")) != 0) {
|
|
||||||
finalAmount = resetAmountByDiscount(payDTO, orderInfo);
|
|
||||||
}else {
|
|
||||||
finalAmount = orderInfo.getOrderAmount();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算优惠券积分折扣信息
|
// 计算优惠券积分折扣信息
|
||||||
if (payDTO.getVipUserId() != null) {
|
if (payDTO.getVipUserId() != null) {
|
||||||
// 计算商品券折扣
|
// 计算商品券折扣
|
||||||
finalAmount = calcDiscountAndUpdateInfo(payDTO, orderInfo);
|
finalAmount = calcDiscountAndUpdateInfo(payDTO, orderInfo);
|
||||||
|
} else {
|
||||||
|
if (payDTO.getDiscount().compareTo(new BigDecimal("1")) != 0) {
|
||||||
|
finalAmount = resetAmountByDiscount(payDTO, orderInfo);
|
||||||
|
} else {
|
||||||
|
finalAmount = orderInfo.getOrderAmount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isOnline = false;
|
boolean isOnline = false;
|
||||||
|
|
@ -2414,7 +2418,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
CreateOrderDTO dto = null;
|
CreateOrderDTO dto = null;
|
||||||
if (orderId != null) {
|
if (orderId != null) {
|
||||||
TbOrderInfo orderInfo = mpOrderInfoService.getById(orderId);
|
TbOrderInfo orderInfo = mpOrderInfoService.getById(orderId);
|
||||||
if(!TableConstant.OrderInfo.Status.UNPAID.equalsVals(orderInfo.getStatus())) {
|
if (!TableConstant.OrderInfo.Status.UNPAID.equalsVals(orderInfo.getStatus())) {
|
||||||
throw new BadRequestException("订单状态异常");
|
throw new BadRequestException("订单状态异常");
|
||||||
}
|
}
|
||||||
dto = new CreateOrderDTO();
|
dto = new CreateOrderDTO();
|
||||||
|
|
@ -2802,13 +2806,13 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
.add(returnPackFee);
|
.add(returnPackFee);
|
||||||
// 移除使用的券
|
// 移除使用的券
|
||||||
couponInfoDTO.getProductCoupon().forEach(item -> {
|
couponInfoDTO.getProductCoupon().forEach(item -> {
|
||||||
if (Objects.equals(item.getId(), outRecord.getGiveId())) {
|
if (Objects.equals(item.getId(), outRecord.getGiveId())) {
|
||||||
item.setReturnNum(item.getReturnNum() + outRecord.getRefNum());
|
item.setReturnNum(item.getReturnNum() + outRecord.getRefNum());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 使用了满减或积分,获取普通付款商品计算退款比例,退部分现金
|
// 使用了满减或积分,获取普通付款商品计算退款比例,退部分现金
|
||||||
}else if (oldOrderInfo.getFullCouponDiscountAmount().compareTo(BigDecimal.ZERO) > 0 || oldOrderInfo.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0){
|
} else if (oldOrderInfo.getFullCouponDiscountAmount().compareTo(BigDecimal.ZERO) > 0 || oldOrderInfo.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
|
||||||
hasNormalReturn = true;
|
hasNormalReturn = true;
|
||||||
// 计算当前商品占比
|
// 计算当前商品占比
|
||||||
BigDecimal ratio = calcDetailRatio(orderDetail, returnNum);
|
BigDecimal ratio = calcDetailRatio(orderDetail, returnNum);
|
||||||
|
|
@ -2820,7 +2824,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
||||||
.divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP)
|
.divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP)
|
||||||
.multiply(returnNum)).setScale(2, RoundingMode.HALF_UP);
|
.multiply(returnNum)).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
}else {
|
} else {
|
||||||
hasNormalReturn = true;
|
hasNormalReturn = true;
|
||||||
currentDetailAMount = orderDetail.getPriceAmount()
|
currentDetailAMount = orderDetail.getPriceAmount()
|
||||||
.divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP)
|
.divide(orderDetail.getNum(), 8, RoundingMode.HALF_UP)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue