From fc3ff48eade6ad0a54c3ab0669b846bb9a51f4db Mon Sep 17 00:00:00 2001
From: Cui Zhi Feng <cuizf@fengyuntec.com>
Date: 星期六, 31 八月 2024 22:17:39 +0800
Subject: [PATCH] 下单时的一些处理 TODO

---
 src/main/resources/script/db-v2.sql                                  |   22 +++++++
 src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java   |   18 ++++++
 src/main/java/com/mzl/flower/service/payment/OrderService.java       |   73 ++++++++++++++++++++++--
 src/main/表设计.xlsx                                                    |    0 
 src/main/java/com/mzl/flower/entity/payment/OrderItem.java           |   11 +++
 src/main/java/com/mzl/flower/entity/payment/Order.java               |   30 +++++++++
 src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java |    6 ++
 7 files changed, 152 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java b/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java
index 884f18f..c338f50 100644
--- a/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java
@@ -26,4 +26,10 @@
 
     @NotBlank(message = "微信code不能为空")
     private String wxcode;
+
+    @ApiModelProperty(value = "用户优惠券id")
+    private String couponRecordId;
+
+    @ApiModelProperty(value = "用户积分商品兑换券id列表")
+    private List<Long> goodsRecordIdList;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java
index fde99f8..48ba6dc 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java
@@ -19,7 +19,25 @@
     @ApiModelProperty(value = "商品总金额")
     private BigDecimal totalAmount;
 
+    @ApiModelProperty(value = "商品会员价总金额")
+    private BigDecimal totalMemberAmount;
+
     @ApiModelProperty(value = "打包费")
     private BigDecimal packing;
 
+    @ApiModelProperty(value = "会员等级id")
+    private Long memberId;
+
+    @ApiModelProperty(value = "会员等级名称")
+    private String memberName;
+
+    @ApiModelProperty(value = "折扣类型(discount_type)")
+    private String memberDiscountType;
+
+    @ApiModelProperty(value = "会员折扣")
+    private BigDecimal memberDiscountRatio;
+
+    @ApiModelProperty(value = "优惠金额(每扎)")
+    private BigDecimal memberDiscountAmount;
+
 }
diff --git a/src/main/java/com/mzl/flower/entity/payment/Order.java b/src/main/java/com/mzl/flower/entity/payment/Order.java
index 7706db4..438c5f4 100644
--- a/src/main/java/com/mzl/flower/entity/payment/Order.java
+++ b/src/main/java/com/mzl/flower/entity/payment/Order.java
@@ -16,7 +16,7 @@
     private String orderNo;//单号
 
     @TableField("flower_amount")
-    private BigDecimal flowerAmount;//商品金额
+    private BigDecimal flowerAmount;//商品金额(会员价)
 
     @TableField("packing_fee")
     private BigDecimal packingFee;//打包费
@@ -134,4 +134,32 @@
 
     @TableField("wx_delivery_msg")
     private String wxDeliveryMsg;// 微信发货返回消息
+
+    @TableField("member_coupon_id")
+    private String memberCouponId;//用户优惠券id
+
+    @TableField("member_coupon_code")
+    private String memberCouponCode;//优惠券编码
+
+    @TableField("member_coupon_name")
+    private String memberCouponName;//优惠券名称
+
+    @TableField("member_coupon_amount")
+    private BigDecimal memberCouponAmount;//优惠券金额
+
+    @TableField("member_id")
+    private Long memberId;//会员等级id
+
+    @TableField("member_name")
+    private String memberName;//会员等级名称
+
+    @TableField("member_discount_type")
+    private String memberDiscountType;//折扣类型(discount_type)
+
+    @TableField("member_discount_ratio")
+    private BigDecimal memberDiscountRatio;//会员折扣
+
+    @TableField("member_discount_amount")
+    private BigDecimal memberDiscountAmount;//优惠金额(每扎)
+
 }
diff --git a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java
index 5d1167b..84c559f 100644
--- a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java
+++ b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java
@@ -61,7 +61,7 @@
     private BigDecimal markupPartner;//合伙人加价
 
     @TableField("price")
-    private BigDecimal price;//商品售价
+    private BigDecimal price;//商品售价(会员价)
 
     @TableField("total")
     private BigDecimal total;//总金额
@@ -84,4 +84,13 @@
     @TableField("deduct_amount")
     private BigDecimal deductAmount;//扣款金额
 
+    @TableField("coupon_amount")
+    private BigDecimal couponAmount;//优惠券金额/扎
+
+    @TableField("original_price")
+    private BigDecimal originalPrice;//优惠前售价/扎
+
+    @TableField("real_price")
+    private BigDecimal realPrice;//真实成交价格/每扎
+
 }
diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java
index c9bab5f..95bc18a 100644
--- a/src/main/java/com/mzl/flower/service/payment/OrderService.java
+++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java
@@ -21,6 +21,7 @@
 import com.mzl.flower.dto.response.system.CodeValueDTO;
 import com.mzl.flower.dto.response.transport.TransportOrderDTO;
 import com.mzl.flower.dto.response.warehouse.WarehouseLocationDTO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
 import com.mzl.flower.entity.customer.Address;
 import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.flower.FlowerSupplierSaleNum;
@@ -273,10 +274,18 @@
         Long partnerId = customer.getPartnerId();
         Long levelId = customer.getLevelId();
         Member member = getMember(levelId);
+        if (member != null) {
+            result.setMemberId(levelId);
+            result.setMemberName(member.getName());
+            result.setMemberDiscountType(member.getDiscountType());
+            result.setMemberDiscountRatio(member.getDiscountRatio());
+            result.setMemberDiscountAmount(member.getDiscountAmount());
+        }
 
         double totalWeight = 0D;
         int num = 0;
         BigDecimal totalAmount = new BigDecimal(0);
+        BigDecimal totalMemberAmount = new BigDecimal(0);
         for (FlowerCartListDTO c : ls) {
             if (!Constants.FLOWER_STATUS.UP.name().equals(c.getStatus())) {
                 throw new ValidationException("商品" + c.getName() + "已下架,请重新提交");
@@ -307,6 +316,7 @@
 
             totalWeight += c.getWeight() * c.getNum();
             totalAmount = totalAmount.add(c.getTotal());
+            totalMemberAmount = totalMemberAmount.add(c.getTotalMember());
             num += c.getNum();
         }
 
@@ -317,6 +327,7 @@
         result.setFlowers(ls);
         result.setPacking(packing);
         result.setTotalAmount(totalAmount);
+        result.setTotalMemberAmount(totalMemberAmount);
         result.setTotalWeight(totalWeight);
 
         return result;
@@ -359,8 +370,6 @@
             deliveryName = d.getName();
         }
 
-        //TODO 优惠券和会员价相关修改
-
         String userId = SecurityUtils.getUserId();
         Order order = new Order();
         order.setId(UUIDGenerator.getUUID());
@@ -370,12 +379,28 @@
         order.setStatusBackend(Constants.ORDER_STATUS_BACKEND.PENDING.name());
         order.setStatus(Constants.ORDER_STATUS.PENDING.name());
 
-        order.setFlowerAmount(p.getTotalAmount());
+        //设置下单时的会员信息
+        order.setMemberId(p.getMemberId());
+        order.setMemberName(p.getMemberName());
+        order.setMemberDiscountType(p.getMemberDiscountType());
+        order.setMemberDiscountRatio(p.getMemberDiscountRatio());
+        order.setMemberCouponAmount(p.getMemberDiscountAmount());
+
+        order.setFlowerAmount(p.getTotalMemberAmount());//使用会员价总价
         order.setPackingFee(p.getPacking());
         order.setTransportFee(transportFee);
         order.setDeliveryName(deliveryName);
 
-        BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee);
+        BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee);//使用优惠券之前的总价
+        CouponRecordDO coupon = useCouponRecord(order.getId(), totalAmount, dto.getCouponRecordId());
+        if(coupon != null){
+            order.setMemberCouponId(coupon.getId());
+            order.setMemberCouponCode(coupon.getCouponCode());
+            order.setMemberCouponName(coupon.getCouponName());
+            order.setMemberCouponAmount(coupon.getCouponDiscountValue());
+
+            totalAmount = totalAmount.subtract(order.getMemberCouponAmount());//满足条件需要减去优惠券金额
+        }
         order.setTotalAmount(totalAmount);
 
         order.setCustomer(address.getName());
@@ -396,6 +421,7 @@
         //商品列表处理
         List<FlowerCartListDTO> flowers = p.getFlowers();
         Map<Long, List<ParamItemDTO>> paramMap = new HashMap<>();
+        BigDecimal flowerAmount = order.getFlowerAmount();//订单商品总价
         for (FlowerCartListDTO f : flowers) {
             OrderItem t = new OrderItem();
             t.setId(UUIDGenerator.getUUID());
@@ -421,8 +447,14 @@
             t.setMarkupOne(pp.getFirstFee());
             t.setMarkupTwo(pp.getSecondFee());
             t.setMarkupPartner(pp.getPartnerFee());
-            t.setPrice(pp.getPrice());
-            t.setTotal(f.getTotal());
+            t.setPrice(f.getPriceMember());//使用会员单价
+            t.setTotal(f.getTotalMember());//使用会员总价
+
+            t.setOriginalPrice(pp.getPrice());//非会员售价
+            BigDecimal couponAmount = calculateCoupon(order.getMemberCouponAmount()
+                    , t.getTotal(), order.getFlowerAmount(), t.getNum());
+            t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值
+            t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交价
 
             t.create(userId);
             orderItemMapper.insert(t);
@@ -434,11 +466,40 @@
         order.setPayOpenid(openId);
         orderMapper.insert(order);
 
+        //TODO 处理积分商品兑换券
+
         Map map = paymentV3Service.wxPrepay(order);
         map.put("_testV2OrderId", order.getId());
         return map;
     }
 
+    /**
+     * 计算订单中每种商品每扎平摊的优惠券面值,保留2位小数
+     *
+     * @param couponAmount
+     * @param itemTotalAmount
+     * @param totalAmount
+     * @param num
+     * @return
+     */
+    private BigDecimal calculateCoupon(BigDecimal couponAmount, BigDecimal itemTotalAmount
+            , BigDecimal totalAmount, Integer num){
+        if(couponAmount == null){
+            return new BigDecimal(0);
+        }
+        BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比
+        BigDecimal subCoupon = couponAmount.multiply(radio);//占有的优惠券面值
+        return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP);
+    }
+
+    private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){
+        if(StringUtils.isNotEmpty(couponRecordId)){
+            //TODO 优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法
+        }
+
+        return null;
+    }
+
     private String getOrderNo() {
         String seq = sequenceNo.getSeqNo(SequenceNo.ORDER_FLOWER);
         return "XH" + format(LocalDateTime.now(), "yyyyMMdd") + seq;
diff --git a/src/main/resources/script/db-v2.sql b/src/main/resources/script/db-v2.sql
new file mode 100644
index 0000000..c8c0f76
--- /dev/null
+++ b/src/main/resources/script/db-v2.sql
@@ -0,0 +1,22 @@
+==================================================20240831
+ALTER TABLE `t_order` ADD `member_coupon_id` varchar(50)  COMMENT '用户优惠券id';
+ALTER TABLE `t_order` ADD `member_coupon_code` varchar(50)  COMMENT '优惠券编码';
+ALTER TABLE `t_order` ADD `member_coupon_name` varchar(50)  COMMENT '优惠券名称';
+ALTER TABLE `t_order` ADD `member_coupon_amount` DECIMAL(11,2)  COMMENT '优惠券金额';
+ALTER TABLE `t_order` ADD `member_id` bigint(25)  COMMENT '会员等级id';
+ALTER TABLE `t_order` ADD `member_name` varchar(50)  COMMENT '会员等级名称';
+ALTER TABLE `t_order` ADD `member_discount_type` varchar(50)  COMMENT '折扣类型(discount_type)';
+ALTER TABLE `t_order` ADD `member_discount_ratio` DECIMAL(11,2)  COMMENT '会员折扣';
+ALTER TABLE `t_order` ADD `member_discount_amount` DECIMAL(11,2)  COMMENT '优惠金额(每扎)';
+
+ALTER TABLE `t_order_item` ADD `coupon_amount` DECIMAL(11,2)  COMMENT '优惠券金额/扎';
+ALTER TABLE `t_order_item` ADD `original_price` DECIMAL(11,2)  COMMENT '优惠前售价/扎';
+ALTER TABLE `t_order_item` ADD `real_price` DECIMAL(11,2)  COMMENT '真实成交价格/每扎';
+
+
+
+
+
+
+
+
diff --git "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx" "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx"
index 341bd45..1eb580f 100644
--- "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx"
+++ "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx"
Binary files differ

--
Gitblit v1.9.3