From 03217ee2abb322ac81038e4b0e55fc3253206d4f Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Fri, 21 Feb 2025 18:37:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=B8=8B=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/AdminOrderController.java | 20 +- .../controller/user/UserOrderController.java | 3 +- .../main/java/com/czg/config/RedisCst.java | 4 + .../com/czg/order/dto/OrderDetailDTO.java | 151 ---------- .../com/czg/order/dto/OrderInfoAddDTO.java | 39 ++- .../java/com/czg/order/dto/OrderInfoDTO.java | 10 +- .../com/czg/order/entity/CashierCart.java | 9 +- .../com/czg/order/entity/OrderDetail.java | 23 +- .../java/com/czg/order/entity/OrderInfo.java | 54 +++- .../czg/order/service/CashierCartService.java | 8 +- .../czg/order/service/OrderDetailService.java | 4 + .../czg/order/service/OrderInfoService.java | 3 +- .../com/czg/order/vo/OrderDetailSmallVO.java | 1 + .../com/czg/order/vo/OrderInfoCreateVo.java | 11 - .../order/mapper/CashierCartMapper.java | 8 +- .../order/mapper/OrderDetailMapper.java | 5 +- .../service/impl/CashierCartServiceImpl.java | 6 +- .../service/impl/OrderDetailServiceImpl.java | 6 + .../service/impl/OrderInfoServiceImpl.java | 269 ++++++++++++++++-- .../resources/mapper/CashierCartMapper.xml | 44 ++- .../resources/mapper/OrderDetailMapper.xml | 16 ++ 21 files changed, 466 insertions(+), 228 deletions(-) delete mode 100644 cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderDetailDTO.java delete mode 100644 cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoCreateVo.java diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java index 5cd6c9bd..f67d59e3 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java @@ -1,17 +1,25 @@ package com.czg.controller.admin; +import com.czg.order.dto.OrderInfoAddDTO; import com.czg.order.dto.OrderInfoQueryDTO; +import com.czg.order.entity.OrderInfo; import com.czg.order.service.OrderInfoService; import com.czg.order.vo.OrderInfoVo; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; +import com.czg.utils.AssertUtil; +import com.czg.utils.ServletUtil; import com.mybatisflex.core.paginate.Page; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 订单管理 + * * @author ww * @description */ @@ -30,4 +38,14 @@ public class AdminOrderController { queryDTO.setShopId(StpKit.USER.getShopId()); return CzgResult.success(orderInfoService.getOrderByPage(queryDTO)); } + + @PostMapping("/createOrder") + public CzgResult createOrder(@RequestBody OrderInfoAddDTO addDto) { + AssertUtil.isNull(addDto.getUserId(), "请选择下单用户后使用"); + addDto.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); + addDto.setStaffId(StpKit.USER.getLoginIdAsLong()); + addDto.setShopId(StpKit.USER.getShopId()); + addDto.setOrderType("cash"); + return CzgResult.success(orderInfoService.createOrder(addDto)); + } } diff --git a/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java index bb4ba2c2..f1e57687 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java @@ -4,7 +4,6 @@ import com.czg.order.dto.OrderInfoAddDTO; import com.czg.order.dto.OrderInfoQueryDTO; import com.czg.order.entity.OrderInfo; import com.czg.order.service.OrderInfoService; -import com.czg.order.vo.OrderInfoCreateVo; import com.czg.order.vo.OrderInfoVo; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; @@ -39,7 +38,7 @@ public class UserOrderController { } @PostMapping("/createOrder") - public CzgResult createOrder(@RequestBody OrderInfoAddDTO addDto) { + public CzgResult createOrder(@RequestBody OrderInfoAddDTO addDto) { addDto.setPlatformType(ServletUtil.getHeaderIgnoreCase(ServletUtil.getRequest(), "platformType")); addDto.setUserId(StpKit.USER.getLoginIdAsLong()); addDto.setShopId(StpKit.USER.getShopId()); diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java index 8e12f201..c85bdd84 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java @@ -17,6 +17,10 @@ public interface RedisCst { // 店铺会员动态支付码 String SHOP_USER_DYNAMIC_CODE = "shop:user:dynamic:code:"; + //店铺取餐码key + String SHOP_CODE = "shop:code:"; + + // 排队取号全局号码 String TABLE_CALL_NUMBER = "TABLE_CALL_NUMBER:"; diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderDetailDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderDetailDTO.java deleted file mode 100644 index fa33fd9b..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/dto/OrderDetailDTO.java +++ /dev/null @@ -1,151 +0,0 @@ - -package com.czg.order.dto; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import com.alibaba.fastjson2.annotation.JSONField; -import java.io.Serial; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 订单详情 实体类。 - * - * @author ww - * @since 2025-02-14 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderDetailDTO implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - private Long id; - - private Long orderId; - - private Long shopId; - - private Long productId; - - private String productImg; - - private String productName; - - /** - * 商品类型:单规格商品 single 多规格商品 sku 套餐商品 package 称重商品 weigh 团购券 coupon - */ - private String productType; - - private Long skuId; - - private String skuName; - - /** - * 用餐模式 堂食 dine-in 外带 take-out 外卖 take-away - */ - private String dineMode; - - /** - * 单价:原价/会员价/临时改价 - */ - private BigDecimal price; - - /** - * 折扣金额 - */ - private BigDecimal discountAmount; - - /** - * 打包费 - */ - private BigDecimal packAmount; - - /** - * 总金额/实付金额,包含打包费 不包括优惠金额 - */ - private BigDecimal payAmount; - - /** - * 已退款金额 - */ - private BigDecimal returnAmount; - - /** - * 数量 - */ - private BigDecimal num; - - /** - * 退菜数量(不管价格) - */ - private BigDecimal returnNum; - - /** - * 退单数量 - */ - private BigDecimal refundNum; - - /** - * 退款单号 - */ - private String refundNo; - - /** - * 临时改价备注 - */ - private String discountSaleNote; - - /** - * 状态: in-production 制作中;wait-out 待取餐;refunding 退款中; part-refund 部分退单; refund-退单; done 完成; - */ - private String status; - - /** - * 当前下单次数 - */ - private Integer placeNum; - - /** - * 是否是临时菜品 - */ - private Integer isTemporary; - - /** - * 是否打票 - */ - private Integer isPrint; - - /** - * 是否等叫 - */ - private Integer isWaitCall; - - /** - * 套餐商品选择信息 - */ - private String proGroupInfo; - - /** - * 备注 - */ - private String remark; - - /** - * 退款备注 - */ - private String refundRemark; - - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} 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 063c0c9b..28e7b0b0 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 @@ -3,10 +3,14 @@ package com.czg.order.dto; import cn.hutool.core.util.StrUtil; import jakarta.validation.constraints.NotBlank; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.math.BigDecimal; +import java.util.List; /** * 订单表 实体类。 @@ -27,6 +31,8 @@ public class OrderInfoAddDTO implements Serializable { private Long shopId; private Long userId; + + private Long staffId; /** * 用餐人数 */ @@ -61,12 +67,16 @@ public class OrderInfoAddDTO implements Serializable { /** * 用户使用的卡券 */ - private String couponInfoList; + private List couponList; /** * 订单金额 */ private BigDecimal orderAmount; + /** + * 抹零金额 减免多少钱 + */ + private BigDecimal roundAmount; /** * 积分抵扣金额(tb_points_basic_setting表) @@ -76,7 +86,7 @@ public class OrderInfoAddDTO implements Serializable { /** * 使用的积分数量 (扣除各类折扣 enable_deduction后使用) */ - private BigDecimal pointsNum; + private Integer pointsNum; /** * 台桌Id @@ -91,7 +101,12 @@ public class OrderInfoAddDTO implements Serializable { private String orderType; /** - * 平台类型 pc 收银机客户端 wechat 微信小程序 alipay 支付宝小程序 admin-pc PC管理端 admin-app APP管理端 + * 平台类型 + * PC 收银机客户端 + * WX 微信小程序 + * ALI 支付宝小程序 + * WEB PC管理端 + * APP APP管理端 */ private String platformType; @@ -99,10 +114,10 @@ public class OrderInfoAddDTO implements Serializable { * 用餐模式 堂食 dine-in 外带 take-out 外卖 take-away */ @NotBlank(message = "用餐模式不能为空") - private String eatModel; + private String dineMode; /** - * 支付模式: afterPay 后付费 normal 正常模式 + * 支付模式: afterPay 后付费 normal 正常模式 buyer 挂账模式 */ @NotBlank(message = "付款模式不能为空") private String payMode; @@ -116,6 +131,10 @@ public class OrderInfoAddDTO implements Serializable { * 当前订单下单次数 */ private Integer placeNum; + /** + * 挂账人 + */ + private Long creditBuyerId; /** * 是否等叫 0 否 1 等叫 @@ -130,11 +149,11 @@ public class OrderInfoAddDTO implements Serializable { return seatNum == null ? 0 : seatNum; } - public String getEatModel() { - return StrUtil.isBlank(eatModel) ? "dine-in" : eatModel; + public String getDineMode() { + return StrUtil.isBlank(dineMode) ? "dine-in" : dineMode; } - public BigDecimal getPointsNum() { - return pointsNum == null ? BigDecimal.ZERO : pointsNum; + public Integer getPointsNum() { + return pointsNum == null ? 0 : pointsNum; } } 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 4ca2fb1e..efb1b2ad 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 @@ -60,6 +60,10 @@ public class OrderInfoDTO implements Serializable { * 订单原金额 不含折扣价格 */ private BigDecimal originAmount; + /** + * 抹零金额 减免多少钱 + */ + private BigDecimal roundAmount; /** * 订单金额 (扣除各类折扣) @@ -79,7 +83,7 @@ public class OrderInfoDTO implements Serializable { /** * 使用的积分数量 */ - private BigDecimal pointsNum; + private Integer pointsNum; /** * 商品优惠券抵扣金额 @@ -104,7 +108,7 @@ public class OrderInfoDTO implements Serializable { /** * 折扣比例 */ - private BigDecimal discountRatio; + private String discountRatio; /** * 打包费 @@ -139,7 +143,7 @@ public class OrderInfoDTO implements Serializable { private String dineMode; /** - * 支付模式: afterPay 后付费 normal 正常模式 + * 支付模式: afterPay 后付费 normal 正常模式 buyer 挂账模式 */ private String payMode; 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 4d096e12..5807c484 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 @@ -65,6 +65,10 @@ public class CashierCart implements Serializable { * 数量 */ private BigDecimal number; + /** + * 打包数量 + */ + private BigDecimal packNumber; /** * 台桌桌码 @@ -77,11 +81,6 @@ public class CashierCart implements Serializable { */ private String tableCode; - /** - * 是否打包 - */ - private Integer isPack; - /** * 是否赠送 */ 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 1c89bd3f..2fe578f0 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 @@ -4,6 +4,7 @@ import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; + import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -53,28 +54,23 @@ public class OrderDetail implements Serializable { private String skuName; - /** - * 用餐模式 堂食 dine-in 外带 take-out 外卖 take-away - */ - private String dineMode; - /** * 单价:原价/会员价/临时改价 */ private BigDecimal price; /** - * 折扣金额 + * 折扣金额(商品优惠券抵扣金额) */ private BigDecimal discountAmount; /** - * 打包费 + * 打包费(单价) */ private BigDecimal packAmount; /** - * 总金额/实付金额,包含打包费 不包括优惠金额 + * 支付金额,去除优惠券优惠金额的商品金额 不包含打包费 */ private BigDecimal payAmount; @@ -87,6 +83,14 @@ public class OrderDetail implements Serializable { * 数量 */ private BigDecimal num; + /** + * 打包数量 + */ + private BigDecimal packNumber; + /** + * 优惠券抵扣数量 + */ + private BigDecimal couponNum; /** * 退菜数量(不管价格) @@ -109,7 +113,7 @@ public class OrderDetail implements Serializable { private String discountSaleNote; /** - * 状态: in-production 制作中;wait-out 待取餐;refunding 退款中; part-refund 部分退单; refund-退单; done 完成; + * 状态: in-production 制作中;wait-out 待取餐;refunding 退款中; part-refund 部分退单; refund-退单; done 完成; */ private String status; @@ -117,7 +121,6 @@ public class OrderDetail implements Serializable { * 当前下单次数 */ private Integer placeNum; - /** * 是否是临时菜品 */ 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 b6d6a60b..4c82ae06 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,5 +1,6 @@ package com.czg.order.entity; +import cn.hutool.core.util.StrUtil; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; @@ -64,6 +65,10 @@ public class OrderInfo implements Serializable { * 订单原金额 不含折扣价格 */ private BigDecimal originAmount; + /** + * 抹零金额 减免多少钱 + */ + private BigDecimal roundAmount; /** * 订单金额 (扣除各类折扣) @@ -83,7 +88,7 @@ public class OrderInfo implements Serializable { /** * 使用的积分数量 */ - private BigDecimal pointsNum; + private Integer pointsNum; /** * 商品优惠券抵扣金额 @@ -108,7 +113,7 @@ public class OrderInfo implements Serializable { /** * 折扣比例 */ - private BigDecimal discountRatio; + private String discountRatio; /** * 打包费 @@ -143,7 +148,7 @@ public class OrderInfo implements Serializable { private String dineMode; /** - * 支付模式: afterPay 后付费 normal 正常模式 + * 支付模式: afterPay 后付费 normal 正常模式 buyer 挂账模式 */ private String payMode; @@ -253,4 +258,47 @@ public class OrderInfo implements Serializable { */ private Integer isDel; + public BigDecimal getOriginAmount() { + return originAmount == null ? BigDecimal.ZERO : originAmount; + } + + public BigDecimal getRoundAmount() { + return roundAmount == null ? BigDecimal.ZERO : roundAmount; + } + + public BigDecimal getOrderAmount() { + return orderAmount == null ? BigDecimal.ZERO : orderAmount; + } + + public BigDecimal getPointsDiscountAmount() { + return pointsDiscountAmount == null ? BigDecimal.ZERO : pointsDiscountAmount; + } + + public Integer getPointsNum() { + return pointsNum == null ? 0 : pointsNum; + } + + public BigDecimal getProductCouponDiscountAmount() { + return productCouponDiscountAmount == null ? BigDecimal.ZERO : productCouponDiscountAmount; + } + + public String getCouponInfoList() { + return StrUtil.isBlank(couponInfoList) ? "" : couponInfoList; + } + + public BigDecimal getFullCouponDiscountAmount() { + return fullCouponDiscountAmount == null ? BigDecimal.ZERO : fullCouponDiscountAmount; + } + + public BigDecimal getDiscountAmount() { + return discountAmount == null ? BigDecimal.ZERO : discountAmount; + } + + public String getDiscountRatio() { + return discountRatio == null ? "" : discountRatio + ","; + } + + public BigDecimal getPackFee() { + return packFee == null ? BigDecimal.ZERO : packFee; + } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/CashierCartService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/CashierCartService.java index c243a9d4..2dd6379b 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/CashierCartService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/CashierCartService.java @@ -1,9 +1,10 @@ package com.czg.order.service; +import com.czg.order.entity.CashierCart; import com.czg.order.entity.OrderDetail; import com.mybatisflex.core.service.IService; -import com.czg.order.entity.CashierCart; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import java.util.List; @@ -17,7 +18,10 @@ public interface CashierCartService extends IService { /** * 获取到的结果 是针对tb_order_detail的 + * * @param tableCode 桌码 + * @param isUseVip 是否使用会员价 + * @param placeNum 第几次下单 */ - List getCartByTableCode(@NotBlank String tableCode); + List getCartByTableCode(@NotBlank String tableCode, @NotNull Integer isUseVip,@NotNull Integer placeNum); } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderDetailService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderDetailService.java index 351c5a70..d4c5088d 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderDetailService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderDetailService.java @@ -3,6 +3,8 @@ package com.czg.order.service; import com.mybatisflex.core.service.IService; import com.czg.order.entity.OrderDetail; +import java.util.List; + /** * 订单详情 服务层。 * @@ -11,4 +13,6 @@ import com.czg.order.entity.OrderDetail; */ public interface OrderDetailService extends IService { + void createOrderDetails(Long orderId, List orderDetails); + } 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 6d245023..659d6240 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 @@ -5,7 +5,6 @@ import com.czg.order.dto.OrderInfoAddDTO; import com.czg.order.dto.OrderInfoQueryDTO; import com.czg.order.entity.OrderInfo; import com.czg.order.enums.PayEnums; -import com.czg.order.vo.OrderInfoCreateVo; import com.czg.order.vo.OrderInfoVo; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; @@ -24,7 +23,7 @@ import java.time.LocalDateTime; public interface OrderInfoService extends IService { Page getOrderByPage(OrderInfoQueryDTO param); - OrderInfoCreateVo createOrder(OrderInfoAddDTO param); + OrderInfo createOrder(OrderInfoAddDTO param); void payCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderDetailSmallVO.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderDetailSmallVO.java index 3c198a13..441e979c 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderDetailSmallVO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderDetailSmallVO.java @@ -29,6 +29,7 @@ public class OrderDetailSmallVO implements Serializable { private String productName; private String skuName; private BigDecimal num; + private BigDecimal packNum; private BigDecimal refundNum; } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoCreateVo.java b/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoCreateVo.java deleted file mode 100644 index eb2936cc..00000000 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/vo/OrderInfoCreateVo.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.czg.order.vo; - -import lombok.Data; - -/** - * @author ww - * @description - */ -@Data -public class OrderInfoCreateVo { -} diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/mapper/CashierCartMapper.java b/cash-service/order-service/src/main/java/com/czg/service/order/mapper/CashierCartMapper.java index 43929dca..7e1c5bc8 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/mapper/CashierCartMapper.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/mapper/CashierCartMapper.java @@ -15,5 +15,11 @@ import java.util.List; public interface CashierCartMapper extends BaseMapper { - List getCartByTableCode(String tableCode); + /** + * + * @param tableCode 桌码 + * @param isUseVip 是否使用会员价 + * @param placeNum 第几次下单 + */ + List getCartByTableCode(String tableCode,Integer isUseVip,Integer placeNum); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/mapper/OrderDetailMapper.java b/cash-service/order-service/src/main/java/com/czg/service/order/mapper/OrderDetailMapper.java index 911e2b23..72e29e4c 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/mapper/OrderDetailMapper.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/mapper/OrderDetailMapper.java @@ -2,6 +2,9 @@ package com.czg.service.order.mapper; import com.mybatisflex.core.BaseMapper; import com.czg.order.entity.OrderDetail; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 订单详情 映射层。 @@ -10,5 +13,5 @@ import com.czg.order.entity.OrderDetail; * @since 2025-02-13 */ public interface OrderDetailMapper extends BaseMapper { - + void createOrderDetails(@Param("orderId") Long orderId,@Param("orderDetails") List orderDetails); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/CashierCartServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/CashierCartServiceImpl.java index 1a1b5728..53a542b5 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/CashierCartServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/CashierCartServiceImpl.java @@ -16,10 +16,10 @@ import java.util.List; * @since 2025-02-20 */ @Service -public class CashierCartServiceImpl extends ServiceImpl implements CashierCartService{ +public class CashierCartServiceImpl extends ServiceImpl implements CashierCartService { @Override - public List getCartByTableCode(String tableCode) { - return getMapper().getCartByTableCode(tableCode); + public List getCartByTableCode(String tableCode, Integer isUseVip, Integer placeNum) { + return getMapper().getCartByTableCode(tableCode, isUseVip, placeNum); } } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderDetailServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderDetailServiceImpl.java index c855d155..d1a7bdf3 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderDetailServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderDetailServiceImpl.java @@ -6,6 +6,8 @@ import com.czg.order.service.OrderDetailService; import com.czg.service.order.mapper.OrderDetailMapper; import org.springframework.stereotype.Service; +import java.util.List; + /** * 订单详情 服务层实现。 * @@ -15,4 +17,8 @@ import org.springframework.stereotype.Service; @Service public class OrderDetailServiceImpl extends ServiceImpl implements OrderDetailService{ + @Override + public void createOrderDetails(Long orderId, List orderDetails) { + getMapper().createOrderDetails(orderId, orderDetails); + } } 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 26ea571f..a9114962 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 @@ -1,7 +1,9 @@ package com.czg.service.order.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ValidateException; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; @@ -9,6 +11,7 @@ import com.czg.account.dto.shopuser.ShopUserMoneyEditDTO; import com.czg.account.entity.*; import com.czg.account.service.*; import com.czg.config.RabbitPublisher; +import com.czg.config.RedisCst; import com.czg.entity.notify.CzgPayNotifyDTO; import com.czg.entity.notify.CzgRefundNotifyDTO; import com.czg.enums.ShopUserFlowBizEnum; @@ -23,8 +26,8 @@ import com.czg.order.service.OrderDetailService; import com.czg.order.service.OrderInfoService; import com.czg.order.service.OrderPaymentService; import com.czg.order.vo.OrderDetailSmallVO; -import com.czg.order.vo.OrderInfoCreateVo; import com.czg.order.vo.OrderInfoVo; +import com.czg.service.RedisService; import com.czg.service.order.enums.OrderStatusEnums; import com.czg.service.order.mapper.OrderInfoMapper; import com.czg.utils.AssertUtil; @@ -43,8 +46,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; -import java.util.List; +import java.util.*; /** * 订单表 服务层实现。 @@ -58,27 +62,31 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByPage(OrderInfoQueryDTO param) { @@ -114,13 +122,13 @@ public class OrderInfoServiceImpl extends ServiceImpl 0 && !pointSetting.getEnableDeduction().equals(1)) { + if (param.getPointsNum() > 0 && !pointSetting.getEnableDeduction().equals(1)) { throw new ValidateException("生成订单失败,该店铺未开启积分抵扣"); } UserInfo userInfo = userInfoService.getById(param.getUserId()); @@ -141,11 +149,151 @@ public class OrderInfoServiceImpl extends ServiceImpl cashierCarts = cartService. + if (param.getDiscountRatio().compareTo(BigDecimal.ZERO) <= 0 && param.getDiscountRatio().compareTo(BigDecimal.ONE) > 0) { + throw new ValidateException("生成订单失败,折扣比例不正确"); + } + //商品券 + Map prodCouponMap = new HashMap<>(); + //满减券 满fullCouponAmount 减disCouponAmount + BigDecimal fullAmount = BigDecimal.ZERO; + BigDecimal discountAmount = BigDecimal.ZERO; + if (CollUtil.isNotEmpty(param.getCouponList())) { + //校验优惠券 + List records = couponRecordService.list(QueryWrapper.create() + .where(ShopActivateCouponRecord::getId).in(param.getCouponList()) + .and(ShopActivateCouponRecord::getStatus).eq("not_used")); + if (CollUtil.isEmpty(records)) { + throw new ValidateException("生成订单失败,优惠券信息不存在"); + } else if (records.size() != param.getCouponList().size()) { + throw new ValidateException("生成订单失败,优惠券信息不正确"); + } + boolean isFullMinus = false; + for (ShopActivateCouponRecord record : records) { + if (record.getType().equals(1)) { + if (isFullMinus) { + throw new ValidateException("生成订单失败,满减券仅可使用一张"); + } + fullAmount = record.getFullAmount(); + discountAmount = record.getDiscountAmount(); + isFullMinus = true; + } else if (record.getType().equals(2)) { + prodCouponMap.compute(record.getProId(), (key, oldValue) -> oldValue == null ? 1 : oldValue + 1); + } + } + } + if (discountAmount.compareTo(param.getFullCouponDiscountAmount()) != 0) { + throw new ValidateException("生成订单失败,满减券减免金额不正确"); + } + //获取商品信息 计算金额 需要传入优惠券 减去优惠券 + List orderDetails = cartService.getCartByTableCode(table.getTableCode(), param.isVipPrice() ? 1 : 0, param.getPlaceNum()); + //总打包费 + BigDecimal packAmount = BigDecimal.ZERO; + //商品优惠券金额 + BigDecimal prodCouponAmount = BigDecimal.ZERO; + //总商品支付金额 不包含打包费 用来计算后续 + BigDecimal totalAmount = BigDecimal.ZERO; + processOrderDetails(orderDetails, prodCouponMap, prodCouponAmount, packAmount, totalAmount); + if (packAmount.compareTo(param.getPackFee()) != 0) { + throw new ValidateException("生成订单失败,打包费不正确"); + } + if (prodCouponAmount.compareTo(param.getProductCouponDiscountAmount()) != 0) { + throw new ValidateException("生成订单失败,商品优惠券优惠金额不正确"); + } + //折扣金额 如 9折 计算 为 订单金额*0.9 向上取整 + BigDecimal newTotalAmount = BigDecimal.ZERO; + if (param.getDiscountRatio().compareTo(BigDecimal.ONE) != 0) { + newTotalAmount = totalAmount.multiply(param.getDiscountRatio()).setScale(2, RoundingMode.UP); + if (param.getDiscountAmount().compareTo(totalAmount.subtract(newTotalAmount)) != 0) { + throw new ValidateException("生成订单失败,折扣金额不正确"); + } + } + //满减券 校验 + if (newTotalAmount.compareTo(fullAmount) < 0) { + throw new ValidateException("生成订单失败,满减券不满足条件"); + } + //减去满减优惠券 + newTotalAmount = newTotalAmount.subtract(discountAmount); + //积分抵扣 金额范围校验 抵扣金额校验 + if (param.getPointsNum() > 0) { + if (pointSetting.getMinPaymentAmount().compareTo(newTotalAmount) > 0) { + throw new ValidateException("生成订单失败,未满足积分抵扣最低门槛"); + } + if (pointSetting.getMaxDeductionRatio().multiply(newTotalAmount).compareTo(param.getPointsDiscountAmount()) < 0) { + throw new ValidateException("生成订单失败,积分抵扣金额已超出最大抵扣金额"); + } + BigDecimal pointAmount = new BigDecimal(param.getPointsNum()).divide(new BigDecimal(pointSetting.getEquivalentPoints()), 2, RoundingMode.DOWN); + if (pointAmount.compareTo(param.getPointsDiscountAmount()) != 0) { + throw new ValidateException("生成订单失败,积分抵扣金额不正确"); + } + } + newTotalAmount = newTotalAmount.subtract(param.getPointsDiscountAmount()); + //抹零 + newTotalAmount = newTotalAmount.subtract(param.getRoundAmount()); + //校验最终金额(订单金额 (扣除各类折扣)+打包费 餐位费) + newTotalAmount = newTotalAmount.add(param.getPackFee()).add(new BigDecimal(param.getSeatNum()).multiply(shopInfo.getTableFee())); + if (newTotalAmount.compareTo(param.getOrderAmount()) != 0) { + throw new ValidateException("生成订单失败,订单金额不正确"); + } + //生成订单 //discount_info 所有折扣 几折 折扣金额 满减金额 优惠券金额 积分抵扣金额 抹零 + OrderInfo orderInfo = initOrderInfo(param, shopInfo, table); + orderDetailService.createOrderDetails(orderInfo.getId(), orderDetails); + return orderInfo; + } - return null; + /** + * 填充 优惠券使用数量 以及 付款金额 + * + * @param orderDetails 订单详情 需要回填 优惠券抵扣数量 + * @param prodCouponMap 使用优惠券<商品id,数量> + * @param prodCouponAmount 商品券优惠金额 商品单价*优惠数量 的总和 + * @param packAmount 打包费 + * @param totalAmount 最终总金额(没加打包费 餐位费) 去除优惠券金额后的 + */ + private void processOrderDetails(List orderDetails, Map prodCouponMap, + BigDecimal prodCouponAmount, BigDecimal packAmount, BigDecimal totalAmount) { + Map> detailMap = new HashMap<>(); + for (OrderDetail detail : orderDetails) { + detailMap.computeIfAbsent(detail.getProductId(), k -> new ArrayList<>()).add(detail); + if (detail.getPackNumber().compareTo(BigDecimal.ZERO) > 0 && detail.getPackAmount().compareTo(BigDecimal.ZERO) > 0) { + packAmount = packAmount.add(detail.getPackAmount().multiply(detail.getPackNumber())); + } + } + List resultList = new ArrayList<>(); + for (Map.Entry> entry : detailMap.entrySet()) { + Long key = entry.getKey(); + List value = entry.getValue(); + BigDecimal couponNum = BigDecimal.ZERO; + if (prodCouponMap.containsKey(key)) { + couponNum = new BigDecimal(prodCouponMap.get(key)); + if (value.size() > 1) { + value.sort(Comparator.comparing(OrderDetail::getPrice)); + } + } + for (OrderDetail orderDetail : value) { + if (couponNum.compareTo(BigDecimal.ZERO) > 0) { + if (couponNum.compareTo(orderDetail.getNum()) >= 0) { + orderDetail.setCouponNum(orderDetail.getNum()); + orderDetail.setPayAmount(BigDecimal.ZERO); + couponNum = couponNum.subtract(orderDetail.getNum()); + } else { + orderDetail.setCouponNum(couponNum); + orderDetail.setPayAmount((orderDetail.getNum().subtract(couponNum)).multiply(orderDetail.getPrice())); + couponNum = BigDecimal.ZERO; + } + prodCouponAmount = prodCouponAmount.add(orderDetail.getPrice().multiply(orderDetail.getCouponNum())); + } else { + orderDetail.setCouponNum(BigDecimal.ZERO); + orderDetail.setPayAmount(orderDetail.getNum().multiply(orderDetail.getPrice())); + } + totalAmount = totalAmount.add(orderDetail.getPayAmount()); + resultList.add(orderDetail); + } + if (couponNum.compareTo(BigDecimal.ZERO) != 0) { + throw new ValidateException("生成订单失败,优惠券数量不正确"); + } + } + orderDetails = resultList; } @Override @@ -244,4 +392,91 @@ public class OrderInfoServiceImpl extends ServiceImpl 0) { + jsonObject.put("商品券抵扣", orderInfo.getProductCouponDiscountAmount()); + } + if (orderInfo.getDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { + jsonObject.put("打折优惠", orderInfo.getDiscountAmount()); + } + if (orderInfo.getFullCouponDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { + jsonObject.put("满减券抵扣", orderInfo.getFullCouponDiscountAmount()); + } + if (orderInfo.getPointsDiscountAmount().compareTo(BigDecimal.ZERO) > 0) { + jsonObject.put("积分抵扣", orderInfo.getPointsDiscountAmount()); + } + if (orderInfo.getRoundAmount().compareTo(BigDecimal.ZERO) > 0) { + jsonObject.put("抹零", orderInfo.getPointsNum()); + } + return jsonObject.toString(); + } } diff --git a/cash-service/order-service/src/main/resources/mapper/CashierCartMapper.xml b/cash-service/order-service/src/main/resources/mapper/CashierCartMapper.xml index 455f78c3..ab8882c2 100644 --- a/cash-service/order-service/src/main/resources/mapper/CashierCartMapper.xml +++ b/cash-service/order-service/src/main/resources/mapper/CashierCartMapper.xml @@ -5,12 +5,44 @@