ソースを参照

优惠计算等

skyline 11 ヶ月 前
コミット
2825a85af4
18 ファイル変更483 行追加2 行削除
  1. 1 0
      car-wash-entity/src/main/java/com/kym/entity/Activity.java
  2. 58 0
      car-wash-entity/src/main/java/com/kym/entity/OrderWashDay.java
  3. 78 0
      car-wash-entity/src/main/java/com/kym/entity/WashDay.java
  4. 16 0
      car-wash-mapper/src/main/java/com/kym/mapper/OrderWashDayMapper.java
  5. 16 0
      car-wash-mapper/src/main/java/com/kym/mapper/WashDayMapper.java
  6. 21 0
      car-wash-mapper/src/main/resources/mappers/OrderWashDayMapper.xml
  7. 25 0
      car-wash-mapper/src/main/resources/mappers/WashDayMapper.xml
  8. 18 0
      car-wash-miniapp/src/main/java/com/kym/miniapp/controller/OrderWashDayController.java
  9. 18 0
      car-wash-miniapp/src/main/java/com/kym/miniapp/controller/WashDayController.java
  10. 11 0
      car-wash-service/src/main/java/com/kym/service/DiscountService.java
  11. 16 0
      car-wash-service/src/main/java/com/kym/service/OrderWashDayService.java
  12. 16 0
      car-wash-service/src/main/java/com/kym/service/WashDayService.java
  13. 43 2
      car-wash-service/src/main/java/com/kym/service/awoara/event/handle/OrderCloseEventHandler.java
  14. 35 0
      car-wash-service/src/main/java/com/kym/service/factory/DiscountStrategyFactory.java
  15. 24 0
      car-wash-service/src/main/java/com/kym/service/impl/NoDiscountHandle.java
  16. 20 0
      car-wash-service/src/main/java/com/kym/service/impl/OrderWashDayServiceImpl.java
  17. 47 0
      car-wash-service/src/main/java/com/kym/service/impl/WashDayDiscountHandle.java
  18. 20 0
      car-wash-service/src/main/java/com/kym/service/miniapp/impl/WashDayServiceImpl.java

+ 1 - 0
car-wash-entity/src/main/java/com/kym/entity/Activity.java

@@ -25,6 +25,7 @@ public class Activity extends BaseEntity {
 
     public final static String DISCOUNT_TYPE_服务费折扣权益 = "RechargeRights";
     public final static String DISCOUNT_TYPE_优惠券 = "Coupon";
+    public final static String DISCOUNT_TYPE_洗车日 = "WashDay";
 
     public final static int APPLY_STATION_全部站点 = 0;
     public final static int APPLY_STATION_部分站点 = 1;

+ 58 - 0
car-wash-entity/src/main/java/com/kym/entity/OrderWashDay.java

@@ -0,0 +1,58 @@
+package com.kym.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kym.entity.BaseEntity;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 订单优惠券关联表
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+@Getter
+@Setter
+@TableName("t_order_wash_day")
+public class OrderWashDay extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主活动id
+     */
+    private Long activityId;
+
+    /**
+     * 洗车日id
+     */
+    private Long washDayId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 洗车订单号
+     */
+    private String orderId;
+
+    /**
+     * 折扣:100代表无折扣,75代表75折;折扣金额(分)
+     */
+    private Integer discount;
+
+    /**
+     * 总优惠金额(分)
+     */
+    private Integer discountAmount;
+
+    /**
+     * 状态:0-未知 1-使用成功 2-使用失败
+     */
+    private Integer status;
+}

+ 78 - 0
car-wash-entity/src/main/java/com/kym/entity/WashDay.java

@@ -0,0 +1,78 @@
+package com.kym.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 洗车日活动表
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+@Getter
+@Setter
+@TableName("t_wash_day")
+public class WashDay extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 活动id
+     */
+    private Long activityId;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 描述
+     */
+    private String washDayDesc;
+
+    /**
+     * 开始时间(继承自活动主表)
+     */
+    private LocalDateTime startTime;
+
+    /**
+     * 结束时间(继承自活动主表)
+     */
+    private LocalDateTime endTime;
+
+    /**
+     * 有效期(天)
+     */
+    private Integer validity;
+
+    /**
+     * 领取方式:Release系统发放,Collect主动领取
+     */
+    private String receiveType;
+
+    /**
+     * 折扣:100代表无折扣,75代表75折
+     */
+    private Integer discount;
+
+    /**
+     * 优惠允许叠加:0-不允许,1-允许
+     */
+    private Integer allowStacke;
+
+    /**
+     * 活动状态:0-未开始,1-进行中,2-已结束,3-已取消
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 16 - 0
car-wash-mapper/src/main/java/com/kym/mapper/OrderWashDayMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper;
+
+import com.kym.entity.OrderWashDay;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
+
+/**
+ * <p>
+ * 订单优惠券关联表 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+public interface OrderWashDayMapper extends MyBaseMapper<OrderWashDay> {
+
+}

+ 16 - 0
car-wash-mapper/src/main/java/com/kym/mapper/WashDayMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper;
+
+import com.kym.entity.WashDay;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
+
+/**
+ * <p>
+ * 洗车日活动表 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+public interface WashDayMapper extends MyBaseMapper<WashDay> {
+
+}

+ 21 - 0
car-wash-mapper/src/main/resources/mappers/OrderWashDayMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kym.mapper.miniapp.OrderWashDayMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.miniapp.OrderWashDay">
+        <result column="activity_id" property="activityId" />
+        <result column="wash_day_id" property="washDayId" />
+        <result column="user_id" property="userId" />
+        <result column="order_id" property="orderId" />
+        <result column="discount" property="discount" />
+        <result column="discount_amount" property="discountAmount" />
+        <result column="status" property="status" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        activity_id, wash_day_id, user_id, order_id, discount, discount_amount, status
+    </sql>
+
+</mapper>

+ 25 - 0
car-wash-mapper/src/main/resources/mappers/WashDayMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kym.mapper.WashDayMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.WashDay">
+        <result column="activity_id" property="activityId" />
+        <result column="name" property="name" />
+        <result column="wash_day_desc" property="washDayDesc" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="validity" property="validity" />
+        <result column="receive_type" property="receiveType" />
+        <result column="discount" property="discount" />
+        <result column="allow_stacke" property="allowStacke" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        activity_id, name, wash_day_desc, start_time, end_time, validity, receive_type, discount, allow_stacke, status, remark
+    </sql>
+
+</mapper>

+ 18 - 0
car-wash-miniapp/src/main/java/com/kym/miniapp/controller/OrderWashDayController.java

@@ -0,0 +1,18 @@
+package com.kym.miniapp.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 订单优惠券关联表 前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+@RestController
+@RequestMapping("/order-wash-day")
+public class OrderWashDayController {
+
+}

+ 18 - 0
car-wash-miniapp/src/main/java/com/kym/miniapp/controller/WashDayController.java

@@ -0,0 +1,18 @@
+package com.kym.miniapp.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 洗车日活动表 前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+@RestController
+@RequestMapping("/wash-day")
+public class WashDayController {
+
+}

+ 11 - 0
car-wash-service/src/main/java/com/kym/service/DiscountService.java

@@ -0,0 +1,11 @@
+package com.kym.service;
+
+import com.kym.entity.Account;
+import com.kym.entity.WashOrder;
+
+/**
+ * 优惠计算
+ */
+public interface DiscountService {
+    void computeDiscount(WashOrder order, Account account);
+}

+ 16 - 0
car-wash-service/src/main/java/com/kym/service/OrderWashDayService.java

@@ -0,0 +1,16 @@
+package com.kym.service;
+
+import com.kym.entity.OrderWashDay;
+import com.kym.service.mybatisplus.MyBaseService;
+
+/**
+ * <p>
+ * 订单优惠券关联表 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+public interface OrderWashDayService extends MyBaseService<OrderWashDay> {
+
+}

+ 16 - 0
car-wash-service/src/main/java/com/kym/service/WashDayService.java

@@ -0,0 +1,16 @@
+package com.kym.service;
+
+import com.kym.entity.WashDay;
+import com.kym.service.mybatisplus.MyBaseService;
+
+/**
+ * <p>
+ * 洗车日活动表 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+public interface WashDayService extends MyBaseService<WashDay> {
+
+}

+ 43 - 2
car-wash-service/src/main/java/com/kym/service/awoara/event/handle/OrderCloseEventHandler.java

@@ -5,6 +5,7 @@ import com.kym.entity.awoara.MessageBody;
 import com.kym.entity.awoara.OrderInfoObject;
 import com.kym.service.*;
 import com.kym.service.cache.KymCache;
+import com.kym.service.factory.DiscountStrategyFactory;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -88,8 +89,8 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
             washOrderService.updateById(washOrder);
 
 
-            // todo t_account减(上面已完成),t_station_account冻结户减,t_station_account商户加,t_split_record记录
-            // todo 需要判断是否跨网点,分开处理;跨网点结算比例是消费站点分订单额的30%,充值站点分70%
+            // t_account减(上面已完成),t_station_account冻结户减,t_station_account商户加,t_split_record记录
+            // 需要判断是否跨网点,分开处理;跨网点结算比例是消费站点分订单额的30%,充值站点分70%
             if (washOrder.getIsCross()) {
                 // 跨网点订单结算比例是消费站点分订单额的30%,消费站点分70%
                 doCrossSplit(washOrder, KymCache.INSTANCE.getUserStationId(washOrder.getUserId()));
@@ -111,6 +112,15 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
             walletDetail.setStatus(WalletDetail.STATUS_已确认);
             walletDetailService.save(walletDetail);
 
+            // 处理充值权益优惠逻辑/优惠券优惠逻辑/账户优惠金额记录处理逻辑(涉及退款扣减优惠,在NoDiscountHandle中处理)
+            DiscountStrategyFactory.getDiscountStrategy(washOrder.getDiscountType()).computeDiscount(washOrder, account);
+
+            // 更新订单优惠金额
+            washOrderService.updateById(washOrder);
+
+            // 扣费等资金操作
+            deductions(washOrder, account);
+
 
         } else {
             log.error("订单不存在,订单号:{}", orderInfo.getOrder_id());
@@ -118,6 +128,37 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
 
     }
 
+    /**
+     * 扣费等资金操作
+     *
+     * @param washOrder
+     * @param account
+     */
+    private void deductions(WashOrder washOrder, Account account) {
+        // 订单成功
+        washOrder.setOrderStatus(WashOrder.ORDER_STATUS_成功);
+        // 充电结束
+        washOrder.setOrderStatus(WashOrder.PAY_STATUS_已支付);
+        washOrderService.updateById(washOrder);
+
+        // 账户扣费
+        account.setBalance(account.getBalance() - washOrder.getAmountReceived());
+        accountService.updateById(account);
+
+        // 记录资金流水
+        var walletDetail = new WalletDetail();
+        walletDetail.setUserId(washOrder.getUserId());
+        walletDetail.setOrderNo(washOrder.getOrderId());
+        // 消费
+        walletDetail.setType(WalletDetail.TYPE_消费);
+        walletDetail.setAmount(washOrder.getAmountReceivable());
+        walletDetail.setTransactionTime(LocalDateTime.now());
+        // 已确认
+        walletDetail.setStatus(WalletDetail.STATUS_已确认);
+        walletDetailService.save(walletDetail);
+
+    }
+
     /**
      * 执行(本店)分账操作
      *

+ 35 - 0
car-wash-service/src/main/java/com/kym/service/factory/DiscountStrategyFactory.java

@@ -0,0 +1,35 @@
+package com.kym.service.factory;
+
+import com.kym.entity.Activity;
+import com.kym.service.DiscountService;
+import com.kym.service.OrderWashDayService;
+import com.kym.service.WashDayService;
+import com.kym.service.impl.NoDiscountHandle;
+import com.kym.service.impl.WashDayDiscountHandle;
+import org.springframework.stereotype.Component;
+
+/**
+ * 优惠策略工厂
+ *
+ * @author skyline
+ */
+@Component
+public class DiscountStrategyFactory {
+
+    private static WashDayService washDayService;
+
+    private static OrderWashDayService orderWashDayService;
+
+    public DiscountStrategyFactory(WashDayService washDayService, OrderWashDayService orderWashDayService) {
+        DiscountStrategyFactory.washDayService = washDayService;
+        DiscountStrategyFactory.orderWashDayService = orderWashDayService;
+    }
+
+    public static DiscountService getDiscountStrategy(String discountType) {
+        if (Activity.DISCOUNT_TYPE_洗车日.equals(discountType)) {
+            return new WashDayDiscountHandle(washDayService, orderWashDayService);
+        } else {
+            return new NoDiscountHandle();
+        }
+    }
+}

+ 24 - 0
car-wash-service/src/main/java/com/kym/service/impl/NoDiscountHandle.java

@@ -0,0 +1,24 @@
+package com.kym.service.impl;
+
+import com.kym.entity.Account;
+import com.kym.entity.WashOrder;
+import com.kym.service.DiscountService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 无优惠策略
+ *
+ * @author skyline
+ */
+@Service
+@Slf4j
+public class NoDiscountHandle implements DiscountService {
+
+
+    @Override
+    public void computeDiscount(WashOrder order, Account account) {
+
+    }
+}
+

+ 20 - 0
car-wash-service/src/main/java/com/kym/service/impl/OrderWashDayServiceImpl.java

@@ -0,0 +1,20 @@
+package com.kym.service.impl;
+
+import com.kym.entity.OrderWashDay;
+import com.kym.mapper.OrderWashDayMapper;
+import com.kym.service.OrderWashDayService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单优惠券关联表 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+@Service
+public class OrderWashDayServiceImpl extends MyBaseServiceImpl<OrderWashDayMapper, OrderWashDay> implements OrderWashDayService {
+
+}

+ 47 - 0
car-wash-service/src/main/java/com/kym/service/impl/WashDayDiscountHandle.java

@@ -0,0 +1,47 @@
+package com.kym.service.impl;
+
+import com.kym.entity.Account;
+import com.kym.entity.OrderWashDay;
+import com.kym.entity.WashDay;
+import com.kym.entity.WashOrder;
+import com.kym.service.DiscountService;
+import com.kym.service.WashDayService;
+import com.kym.service.OrderWashDayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 洗车日优惠计算
+ */
+@Service
+@Slf4j
+public class WashDayDiscountHandle implements DiscountService {
+
+    private final WashDayService washDayService;
+
+    private final OrderWashDayService orderWashDayService;
+
+    public WashDayDiscountHandle(WashDayService washDayService, OrderWashDayService orderWashDayService) {
+        this.washDayService = washDayService;
+        this.orderWashDayService = orderWashDayService;
+    }
+
+    @Override
+    public void computeDiscount(WashOrder order, Account account) {
+        // 获取订单关联的洗车日活动信息
+        var orderWashDay = orderWashDayService.lambdaQuery().eq(OrderWashDay::getOrderId,  order.getOrderId()).oneOpt();
+        orderWashDay.ifPresent(owd -> {
+            var washDay = washDayService.lambdaQuery().eq(WashDay::getId, owd.getWashDayId()).oneOpt();
+            washDay.ifPresent(wd -> {
+                // 折扣
+                var discount = wd.getDiscount();
+                // 计算折扣金额
+                var discountAmount = order.getAmount() * discount / 100;
+                order.setDiscountAmount(discountAmount);
+                // 订单实付金额
+                order.setAmountReceivable(order.getAmount() - discountAmount);
+            });
+        });
+
+    }
+}

+ 20 - 0
car-wash-service/src/main/java/com/kym/service/miniapp/impl/WashDayServiceImpl.java

@@ -0,0 +1,20 @@
+package com.kym.service.miniapp.impl;
+
+import com.kym.entity.WashDay;
+import com.kym.mapper.WashDayMapper;
+import com.kym.service.WashDayService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 洗车日活动表 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2025-06-13
+ */
+@Service
+public class WashDayServiceImpl extends MyBaseServiceImpl<WashDayMapper, WashDay> implements WashDayService {
+
+}