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