diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/LimitRateDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/LimitRateDTO.java index 46f7605a8..e64662a80 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/LimitRateDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/LimitRateDTO.java @@ -1,10 +1,16 @@ package com.czg.order.dto; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import lombok.Data; +import java.util.Set; +import java.util.stream.Collectors; + /** * 限时折扣dto * order专用 对应mk_limit_time_discount + * * @author ww * @description */ @@ -31,4 +37,16 @@ public class LimitRateDTO { * 参与商品 */ private String foods; + + private Set foodIds; + + public Set getFoodIds() { + if (CollUtil.isEmpty(foodIds)) { + foodIds = CollUtil.newHashSet(StrUtil.split(foods, ",")) + .stream() + .map(Long::parseLong) + .collect(Collectors.toSet()); + } + return foodIds; + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoAddDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoAddDTO.java index 7e58022db..56db70d30 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoAddDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoAddDTO.java @@ -21,6 +21,8 @@ import java.math.BigDecimal; @NoArgsConstructor @AllArgsConstructor public class OrderInfoAddDTO implements Serializable { + //限时折扣部分 + private LimitRateDTO limitRate; private Long orderId; /** diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoDTO.java index 33f3e6113..c6dcf5c0a 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderInfoDTO.java @@ -170,6 +170,11 @@ public class OrderInfoDTO implements Serializable { */ private String discountInfo; + /** + * 限时折扣信息 json + */ + private String limitRate; + /** * 是否支持退款,1支持退单, 0不支持退单 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/CashierCart.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/CashierCart.java index 5cca6558a..7d3694477 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/CashierCart.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/CashierCart.java @@ -84,6 +84,10 @@ public class CashierCart implements Serializable { * 是否赠送 */ private Integer isGift; + /** + * 是否参加限时折扣 + */ + private Integer isTimeDiscount; /** * 是否是临时菜 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderDetail.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderDetail.java index 8cfcea437..4723fee11 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderDetail.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderDetail.java @@ -136,6 +136,10 @@ public class OrderDetail implements Serializable { * 当前下单次数 */ private Integer placeNum; + /** + * 是否参加限时折扣 + */ + private Integer isTimeDiscount; /** * 是否是临时菜品 */ diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java index 782feec5d..8735d2f89 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/entity/OrderInfo.java @@ -1,6 +1,7 @@ package com.czg.order.entity; import cn.hutool.core.util.StrUtil; +import com.czg.order.dto.LimitRateDTO; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; @@ -189,6 +190,15 @@ public class OrderInfo implements Serializable { * 折扣信息 json */ private String discountInfo; + /** + * 限时折扣信息 json + */ + private String limitRateJson; + /** + * 限时折扣信息 json + */ + @Column(ignore = true) + private LimitRateDTO limitRate; /** * 是否支持退款,1支持退单, 0不支持退单 diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java index f41d068d6..4359f5f23 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java @@ -50,7 +50,7 @@ public interface OrderInfoService extends IService { OrderInfo createPayOrder(Long shopId, BigDecimal amount, String remark); void getOrderAmount(List orderDetails, BigDecimalDTO totalAmount, BigDecimalDTO packAmount, - BigDecimalDTO tempAmount, boolean isAllPack, Integer userAllPack, boolean isVipPrice); + BigDecimalDTO tempAmount, LimitRateDTO limitRate, boolean isAllPack, Integer userAllPack, boolean isVipPrice); Boolean printOrder(Long shopId, OrderInfoPrintDTO orderInfoPrintDTO); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java index 15ef4e9d5..6328d8bbb 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/vo/ShopProductVo.java @@ -25,6 +25,7 @@ public class ShopProductVo implements Serializable { * 商品id */ private Long id; + private Long syncId; /** * 商品名称 */ diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index 8cbc6b691..1f75dc1ea 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.exceptions.ValidateException; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.*; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; @@ -240,6 +241,9 @@ public class OrderInfoServiceImpl extends ServiceImpl orderDetails = orderDetailService.queryChain().select() .eq(OrderDetail::getOrderId, historyOrderVo.getId()) .list(); @@ -268,23 +272,28 @@ public class OrderInfoServiceImpl extends ServiceImpl orderDetails = cartService.getCartByTableCode(shopInfo.getId(), param.getTableCode(), param.getPlaceNum()); AssertUtil.isListEmpty(orderDetails, "下单失败 购物车为空"); - processOrderDetails(orderDetails); + processOrderDetails(orderDetails, param.getLimitRate()); //生成订单 OrderInfo orderInfo = initOrderInfo(param, shopInfo, table); orderDetailService.createOrderDetails(orderInfo.getId(), orderDetails); @@ -394,7 +403,7 @@ public class OrderInfoServiceImpl extends ServiceImpl orderDetails, BigDecimalDTO totalAmount, BigDecimalDTO packAmount, - BigDecimalDTO tempAmount, boolean isAllPack, Integer userAllPack, boolean isVipPrice) { + BigDecimalDTO tempAmount, LimitRateDTO limitRate, boolean isAllPack, Integer userAllPack, boolean isVipPrice) { for (OrderDetail orderDetail : orderDetails) { if (orderDetail.getDiscountSaleAmount() != null && orderDetail.getDiscountSaleAmount().compareTo(BigDecimal.ZERO) > 0) { orderDetail.setUnitPrice(orderDetail.getDiscountSaleAmount()); } else { - if (isVipPrice) { - orderDetail.setUnitPrice( - (orderDetail.getMemberPrice() == null || orderDetail.getMemberPrice().compareTo(BigDecimal.ZERO) <= 0) - ? orderDetail.getPrice() : orderDetail.getMemberPrice()); + if (orderDetail.getIsTimeDiscount() == 1) { + if (limitRate == null || (limitRate.getFoodType() == 2 && CollUtil.isEmpty(limitRate.getFoodIds()))) { + throw new CzgException("限时折扣使用失败,商品范围不正确"); + } + if (limitRate.getFoodType() == 2 && !limitRate.getFoodIds().contains(orderDetail.getProductId())) { + throw new CzgException("限时折扣使用失败,商品" + orderDetail.getProductName() + "不享受限时折扣"); + } + if (!isVipPrice || "limit-time".equals(limitRate.getDiscountPriority())) { + if (orderDetail.getPrice().compareTo(BigDecimal.ZERO) == 0) { + orderDetail.setUnitPrice(orderDetail.getPrice()); + } else { + // 确保最终结果保留两位小数并向上取整 + orderDetail.setUnitPrice( + orderDetail.getPrice() + .multiply(new BigDecimal(limitRate.getDiscountRate()).divide(new BigDecimal("100"), 2, RoundingMode.CEILING)) + .setScale(2, RoundingMode.CEILING) + ); + } + } else { + orderDetail.setUnitPrice( + (orderDetail.getMemberPrice() == null || orderDetail.getMemberPrice().compareTo(BigDecimal.ZERO) <= 0) + ? orderDetail.getPrice() : orderDetail.getMemberPrice()); + } } else { - orderDetail.setUnitPrice(orderDetail.getPrice()); + if (isVipPrice) { + orderDetail.setUnitPrice( + (orderDetail.getMemberPrice() == null || orderDetail.getMemberPrice().compareTo(BigDecimal.ZERO) <= 0) + ? orderDetail.getPrice() : orderDetail.getMemberPrice()); + } else { + orderDetail.setUnitPrice(orderDetail.getPrice()); + } } } if (userAllPack != null) { @@ -854,7 +888,7 @@ public class OrderInfoServiceImpl extends ServiceImpl orderDetails) { + private void processOrderDetails(List orderDetails, LimitRateDTO limitRate) { for (OrderDetail detail : orderDetails) { if (!detail.getIsTemporary().equals(1) && detail.getProductId() > 0) { Product product = productService.getOne(QueryWrapper.create() @@ -869,12 +903,15 @@ public class OrderInfoServiceImpl extends ServiceImpl 0) { detail.setUnitPrice(detail.getDiscountSaleAmount()); } else { - if (detail.getDiscountSaleAmount() != null && detail.getDiscountSaleAmount().compareTo(BigDecimal.ZERO) > 0) { - detail.setUnitPrice(detail.getDiscountSaleAmount()); - } else { - detail.setUnitPrice(detail.getPrice()); - + if (detail.getIsTimeDiscount() == 1) { + if (limitRate == null || (limitRate.getFoodType() == 2 && CollUtil.isEmpty(limitRate.getFoodIds()))) { + throw new CzgException("限时折扣使用失败,商品范围不正确"); + } + if (limitRate.getFoodType() == 2 && !limitRate.getFoodIds().contains(detail.getProductId())) { + throw new CzgException("限时折扣使用失败,商品" + detail.getProductName() + "不享受限时折扣"); + } } + detail.setUnitPrice(detail.getPrice()); } detail.setPayAmount(detail.getNum().multiply(detail.getUnitPrice())); } @@ -1243,6 +1280,9 @@ public class OrderInfoServiceImpl extends ServiceImpl