Explorar el Código

Merge branch 'dev/2024/0407/update-distri'

gaohp hace 11 meses
padre
commit
8d74528ca3
Se han modificado 57 ficheros con 1890 adiciones y 177 borrados
  1. 63 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/mq/message/order/DistriOrderMessage.java
  2. 10 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java
  3. 5 1
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  4. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcPageReqVO.java
  5. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcRespVO.java
  6. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcSaveReqVO.java
  7. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/OrderPercentageController.java
  8. 37 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java
  9. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentagePageReqVO.java
  10. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java
  11. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageSaveReqVO.java
  12. 95 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/PartitionCrashController.java
  13. 37 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashPageReqVO.java
  14. 44 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashRespVO.java
  15. 30 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashSaveReqVO.java
  16. 95 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/PtProfitController.java
  17. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitPageReqVO.java
  18. 36 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitRespVO.java
  19. 28 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitSaveReqVO.java
  20. 95 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/PtProfitLogController.java
  21. 37 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogPageReqVO.java
  22. 44 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java
  23. 34 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java
  24. 1 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ordercalc/OrderCalcDO.java
  25. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java
  26. 51 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/partitioncrash/PartitionCrashDO.java
  27. 43 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofit/PtProfitDO.java
  28. 51 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java
  29. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ordercalc/OrderCalcMapper.java
  30. 1 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/orderpercentage/OrderPercentageMapper.java
  31. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/partitioncrash/PartitionCrashMapper.java
  32. 29 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofit/PtProfitMapper.java
  33. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  34. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/order/OrderConsumer.java
  35. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcService.java
  36. 118 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  37. 9 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageService.java
  38. 39 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageServiceImpl.java
  39. 14 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/handle/OrderPercentCheckHandler.java
  40. 24 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/handle/OrderPercentHandler.java
  41. 55 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashService.java
  42. 74 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java
  43. 63 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitService.java
  44. 91 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitServiceImpl.java
  45. 58 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java
  46. 83 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java
  47. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/partitioncrash/PartitionCrashMapper.xml
  48. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/ptprofit/PtProfitMapper.xml
  49. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/ptprofitlog/PtProfitLogMapper.xml
  50. 0 162
      feifan-module-distri/feifan-module-distri-biz/src/test/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImplTest.java
  51. 4 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java
  52. 38 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java
  53. 31 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/producer/order/DistriOrderProducer.java
  54. 17 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  55. 50 3
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  56. 34 0
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml
  57. 25 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/mq/consumer/login/LoginConsumer.java

+ 63 - 0
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/mq/message/order/DistriOrderMessage.java

@@ -0,0 +1,63 @@
+package cn.newfeifan.mall.framework.common.mq.message.order;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DistriOrderMessage {
+
+
+    /**
+     * 总价
+     */
+    private Integer totalPrice;
+
+    /**
+     * 单价
+     */
+    private Integer price;
+
+    /**
+     * 购买数量
+     */
+    private Integer productCount;
+
+
+    /**
+     * 成本价
+     */
+    private Integer costPrice;
+
+
+    /**
+     * 订单编号
+     */
+    private String no;
+
+    /**
+     * 下单用户
+     */
+    private Long userId;
+
+    /**
+     * 店铺ID
+     */
+    private Long shopId;
+
+    /**
+     * 商户ID
+     */
+    private Long merchantId;
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+
+}

+ 10 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java

@@ -0,0 +1,10 @@
+package cn.newfeifan.mall.module.distri.constant;
+
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
+
+public class DistriConstants {
+    // ========== 分销信息商户信息 1-002-029-000 ==========
+    public static final Integer PERCENT = 10000;
+    public static final Double ONE_HUNDRED = 1d;
+
+}

+ 5 - 1
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java

@@ -4,7 +4,7 @@ import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 
 public interface ErrorCodeConstants {
     // ========== 分销信息商户信息 1-002-029-000 ==========
-    ErrorCode SHARE_PATH_NOT_EXISTS = new ErrorCode(1_002_030_000 , "分销路径不存在");
+    ErrorCode SHARE_PATH_NOT_EXISTS = new ErrorCode(1_002_030_000, "分销路径不存在");
     ErrorCode SOCIAL_STATUS_NOT_EXISTS = new ErrorCode(1_002_030_001, "身价不存在");
     ErrorCode SOURCE_NOT_EXISTS = new ErrorCode(1_002_030_002, "分销来源不存在");
     ErrorCode INTEGRAL_NOT_EXISTS = new ErrorCode(1_002_030_002, "积分表不存在");
@@ -15,5 +15,9 @@ public interface ErrorCodeConstants {
     ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_030_003, "分销用户不存在");
     ErrorCode DUSER_NOT_EXISTS = new ErrorCode(1_002_030_003, "分销用户不存在");
     ErrorCode IS_EXISTS = new ErrorCode(1_002_030_003, "当前推销人已经存在上级");
+    ErrorCode PARTITION_CRASH_NOT_EXISTS = new ErrorCode(1_002_030_003, "碰撞分区不存在");
+    ErrorCode PT_PROFIT_NOT_EXISTS = new ErrorCode(1_002_030_003, "平台利润不存在");
+    ErrorCode PT_PROFIT_LOG_NOT_EXISTS = new ErrorCode(1_002_030_003, "平台利润日志表不存在");
+    ErrorCode PERCENT_LARGE_ONE_HUNDRED = new ErrorCode(1_002_030_003, "百分比总和超过100");
 
 }

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcPageReqVO.java

@@ -46,4 +46,8 @@ public class OrderCalcPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
+
 }

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcRespVO.java

@@ -56,5 +56,7 @@ public class OrderCalcRespVO {
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
 
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcSaveReqVO.java

@@ -2,11 +2,15 @@ package cn.newfeifan.mall.module.distri.controller.admin.ordercalc.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
 import java.util.*;
 import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 订单产生数据计算新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class OrderCalcSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4925")
@@ -38,5 +42,7 @@ public class OrderCalcSaveReqVO {
 
     @Schema(description = "推广-平台分成额度(浮动)")
     private Integer grossProfitPlatformQuota;
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
 
 }

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/OrderPercentageController.java

@@ -41,14 +41,14 @@ public class OrderPercentageController {
     @PostMapping("/create")
     @Operation(summary = "创建积分相关计算浮动百分比设置")
     @PreAuthorize("@ss.hasPermission('distri:order-percentage:create')")
-    public CommonResult<Long> createOrderPercentage(@Valid @RequestBody OrderPercentageSaveReqVO createReqVO) {
+    public CommonResult<Long> createOrderPercentage(@Valid @RequestBody OrderPercentageDoubleSaveReqVO createReqVO) {
         return success(orderPercentageService.createOrderPercentage(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新积分相关计算浮动百分比设置")
     @PreAuthorize("@ss.hasPermission('distri:order-percentage:update')")
-    public CommonResult<Boolean> updateOrderPercentage(@Valid @RequestBody OrderPercentageSaveReqVO updateReqVO) {
+    public CommonResult<Boolean> updateOrderPercentage(@Valid @RequestBody OrderPercentageDoubleSaveReqVO updateReqVO) {
         orderPercentageService.updateOrderPercentage(updateReqVO);
         return success(true);
     }

+ 37 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java

@@ -0,0 +1,37 @@
+package cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 积分相关计算浮动百分比设置新增/修改 Request VO")
+@Data
+public class OrderPercentageDoubleSaveReqVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2203")
+    private Long id;
+
+    @Schema(description = "毛利 = 成本 * 0.38... (推广费用)")
+    private Double grossProfitPerc;
+
+    @Schema(description = "推广-用户额度 百分比")
+    private Double grossProfitUserQuotaPerc;
+
+    @Schema(description = "推广-推荐人额度 百分比")
+    private Double grossProfitAncestorQuotaPerc;
+
+    @Schema(description = "推广-合赢奖额度(浮动) 百分比")
+    private Double grossProfitBonusQuotaPerc;
+
+    @Schema(description = "推广-平台分成额度(浮动) 百分比")
+    private Double grossProfitPlatformQuotaPerc;
+
+    @Schema(description = "分成百分比")
+    private Double divideIntoPerc;
+    @Schema(description = "是否启用 0关闭 1启动", example = "2")
+    private Integer status;
+
+
+
+
+
+}

+ 2 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentagePageReqVO.java

@@ -36,5 +36,6 @@ public class OrderPercentagePageReqVO extends PageParam {
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
-
+    @Schema(description = "是否启用 0关闭 1启动", example = "2")
+    private Integer status;
 }

+ 2 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java

@@ -44,5 +44,6 @@ public class OrderPercentageRespVO {
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
-
+    @Schema(description = "是否启用 0关闭 1启动", example = "2")
+    private Integer status;
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageSaveReqVO.java

@@ -29,5 +29,11 @@ public class OrderPercentageSaveReqVO {
 
     @Schema(description = "分成百分比")
     private Integer divideIntoPerc;
+    @Schema(description = "是否启用 0关闭 1启动", example = "2")
+    private Integer status;
+
+
+
+
 
 }

+ 95 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/PartitionCrashController.java

@@ -0,0 +1,95 @@
+package cn.newfeifan.mall.module.distri.controller.admin.partitioncrash;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
+
+import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
+
+import cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash.PartitionCrashDO;
+import cn.newfeifan.mall.module.distri.service.partitioncrash.PartitionCrashService;
+
+@Tag(name = "管理后台 - 分区碰撞")
+@RestController
+@RequestMapping("/distri/partition-crash")
+@Validated
+public class PartitionCrashController {
+
+    @Resource
+    private PartitionCrashService partitionCrashService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建分区碰撞")
+    @PreAuthorize("@ss.hasPermission('distri:partition-crash:create')")
+    public CommonResult<Long> createPartitionCrash(@Valid @RequestBody PartitionCrashSaveReqVO createReqVO) {
+        return success(partitionCrashService.createPartitionCrash(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新分区碰撞")
+    @PreAuthorize("@ss.hasPermission('distri:partition-crash:update')")
+    public CommonResult<Boolean> updatePartitionCrash(@Valid @RequestBody PartitionCrashSaveReqVO updateReqVO) {
+        partitionCrashService.updatePartitionCrash(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除分区碰撞")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('distri:partition-crash:delete')")
+    public CommonResult<Boolean> deletePartitionCrash(@RequestParam("id") Long id) {
+        partitionCrashService.deletePartitionCrash(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得分区碰撞")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('distri:partition-crash:query')")
+    public CommonResult<PartitionCrashRespVO> getPartitionCrash(@RequestParam("id") Long id) {
+        PartitionCrashDO partitionCrash = partitionCrashService.getPartitionCrash(id);
+        return success(BeanUtils.toBean(partitionCrash, PartitionCrashRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得分区碰撞分页")
+    @PreAuthorize("@ss.hasPermission('distri:partition-crash:query')")
+    public CommonResult<PageResult<PartitionCrashRespVO>> getPartitionCrashPage(@Valid PartitionCrashPageReqVO pageReqVO) {
+        PageResult<PartitionCrashDO> pageResult = partitionCrashService.getPartitionCrashPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, PartitionCrashRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出分区碰撞 Excel")
+    @PreAuthorize("@ss.hasPermission('distri:partition-crash:export')")
+    @OperateLog(type = EXPORT)
+    public void exportPartitionCrashExcel(@Valid PartitionCrashPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<PartitionCrashDO> list = partitionCrashService.getPartitionCrashPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "分区碰撞.xls", "数据", PartitionCrashRespVO.class,
+                        BeanUtils.toBean(list, PartitionCrashRespVO.class));
+    }
+
+}

+ 37 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashPageReqVO.java

@@ -0,0 +1,37 @@
+package cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 分区碰撞分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PartitionCrashPageReqVO extends PageParam {
+
+    @Schema(description = "用户ID", example = "15393")
+    private Long userId;
+
+    @Schema(description = "分区编号")
+    private String partNo;
+
+    @Schema(description = "兄弟分区额度", example = "12349")
+    private Integer brotherPrice;
+
+    @Schema(description = "子分区额度", example = "30462")
+    private Integer sonPrice;
+
+    @Schema(description = "碰撞后额度")
+    private Integer afterHitQuota;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 44 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashRespVO.java

@@ -0,0 +1,44 @@
+package cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 分区碰撞 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PartitionCrashRespVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15914")
+    @ExcelProperty("用户编号")
+    private Long id;
+
+    @Schema(description = "用户ID", example = "15393")
+    @ExcelProperty("用户ID")
+    private Long userId;
+
+    @Schema(description = "分区编号")
+    @ExcelProperty("分区编号")
+    private String partNo;
+
+    @Schema(description = "兄弟分区额度", example = "12349")
+    @ExcelProperty("兄弟分区额度")
+    private Integer brotherPrice;
+
+    @Schema(description = "子分区额度", example = "30462")
+    @ExcelProperty("子分区额度")
+    private Integer sonPrice;
+
+    @Schema(description = "碰撞后额度")
+    @ExcelProperty("碰撞后额度")
+    private Integer afterHitQuota;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 30 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashSaveReqVO.java

@@ -0,0 +1,30 @@
+package cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 分区碰撞新增/修改 Request VO")
+@Data
+public class PartitionCrashSaveReqVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15914")
+    private Long id;
+
+    @Schema(description = "用户ID", example = "15393")
+    private Long userId;
+
+    @Schema(description = "分区编号")
+    private String partNo;
+
+    @Schema(description = "兄弟分区额度", example = "12349")
+    private Integer brotherPrice;
+
+    @Schema(description = "子分区额度", example = "30462")
+    private Integer sonPrice;
+
+    @Schema(description = "碰撞后额度")
+    private Integer afterHitQuota;
+
+}

+ 95 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/PtProfitController.java

@@ -0,0 +1,95 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofit;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
+
+import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
+
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
+
+@Tag(name = "管理后台 - 平台利润")
+@RestController
+@RequestMapping("/distri/pt-profit")
+@Validated
+public class PtProfitController {
+
+    @Resource
+    private PtProfitService ptProfitService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建平台利润")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit:create')")
+    public CommonResult<Long> createPtProfit(@Valid @RequestBody PtProfitSaveReqVO createReqVO) {
+        return success(ptProfitService.createPtProfit(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新平台利润")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit:update')")
+    public CommonResult<Boolean> updatePtProfit(@Valid @RequestBody PtProfitSaveReqVO updateReqVO) {
+        ptProfitService.updatePtProfit(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除平台利润")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit:delete')")
+    public CommonResult<Boolean> deletePtProfit(@RequestParam("id") Long id) {
+        ptProfitService.deletePtProfit(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得平台利润")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit:query')")
+    public CommonResult<PtProfitRespVO> getPtProfit(@RequestParam("id") Long id) {
+        PtProfitDO ptProfit = ptProfitService.getPtProfit(id);
+        return success(BeanUtils.toBean(ptProfit, PtProfitRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得平台利润分页")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit:query')")
+    public CommonResult<PageResult<PtProfitRespVO>> getPtProfitPage(@Valid PtProfitPageReqVO pageReqVO) {
+        PageResult<PtProfitDO> pageResult = ptProfitService.getPtProfitPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, PtProfitRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出平台利润 Excel")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit:export')")
+    @OperateLog(type = EXPORT)
+    public void exportPtProfitExcel(@Valid PtProfitPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<PtProfitDO> list = ptProfitService.getPtProfitPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "平台利润.xls", "数据", PtProfitRespVO.class,
+                        BeanUtils.toBean(list, PtProfitRespVO.class));
+    }
+
+}

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitPageReqVO.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 平台利润分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PtProfitPageReqVO extends PageParam {
+
+    @Schema(description = "平台服务费(毛利下的百分比收益)")
+    private Integer ptAdd;
+
+    @Schema(description = "平台收益(0.3888 之外的收益)")
+    private Integer ptGrossAdd;
+
+    @Schema(description = "平台总收益")
+    private Integer ptTotalAdd;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 36 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitRespVO.java

@@ -0,0 +1,36 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 平台利润 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PtProfitRespVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24754")
+    @ExcelProperty("用户编号")
+    private Long id;
+
+    @Schema(description = "平台服务费(毛利下的百分比收益)")
+    @ExcelProperty("平台服务费(毛利下的百分比收益)")
+    private Integer ptAdd;
+
+    @Schema(description = "平台收益(0.3888 之外的收益)")
+    @ExcelProperty("平台收益(0.3888 之外的收益)")
+    private Integer ptGrossAdd;
+
+    @Schema(description = "平台总收益")
+    @ExcelProperty("平台总收益")
+    private Integer ptTotalAdd;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 28 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofit/vo/PtProfitSaveReqVO.java

@@ -0,0 +1,28 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 平台利润新增/修改 Request VO")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PtProfitSaveReqVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24754")
+    private Long id;
+
+    @Schema(description = "平台收益(0.3888 之外的收益)")
+    private Integer ptAdd;
+
+    @Schema(description = "平台服务费(毛利下的百分比收益)")
+    private Integer ptGrossAdd;
+
+    @Schema(description = "平台总收益")
+    private Integer ptTotalAdd;
+
+}

+ 95 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/PtProfitLogController.java

@@ -0,0 +1,95 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
+
+import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
+
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
+
+@Tag(name = "管理后台 - 平台利润记录")
+@RestController
+@RequestMapping("/distri/pt-profit-log")
+@Validated
+public class PtProfitLogController {
+
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建平台利润记录")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:create')")
+    public CommonResult<Long> createPtProfitLog(@Valid @RequestBody PtProfitLogSaveReqVO createReqVO) {
+        return success(ptProfitLogService.createPtProfitLog(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新平台利润记录")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:update')")
+    public CommonResult<Boolean> updatePtProfitLog(@Valid @RequestBody PtProfitLogSaveReqVO updateReqVO) {
+        ptProfitLogService.updatePtProfitLog(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除平台利润记录")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:delete')")
+    public CommonResult<Boolean> deletePtProfitLog(@RequestParam("id") Long id) {
+        ptProfitLogService.deletePtProfitLog(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得平台利润记录")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:query')")
+    public CommonResult<PtProfitLogRespVO> getPtProfitLog(@RequestParam("id") Long id) {
+        PtProfitLogDO ptProfitLog = ptProfitLogService.getPtProfitLog(id);
+        return success(BeanUtils.toBean(ptProfitLog, PtProfitLogRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得平台利润记录分页")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:query')")
+    public CommonResult<PageResult<PtProfitLogRespVO>> getPtProfitLogPage(@Valid PtProfitLogPageReqVO pageReqVO) {
+        PageResult<PtProfitLogDO> pageResult = ptProfitLogService.getPtProfitLogPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, PtProfitLogRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出平台利润记录 Excel")
+    @PreAuthorize("@ss.hasPermission('distri:pt-profit-log:export')")
+    @OperateLog(type = EXPORT)
+    public void exportPtProfitLogExcel(@Valid PtProfitLogPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<PtProfitLogDO> list = ptProfitLogService.getPtProfitLogPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "平台利润记录.xls", "数据", PtProfitLogRespVO.class,
+                        BeanUtils.toBean(list, PtProfitLogRespVO.class));
+    }
+
+}

+ 37 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogPageReqVO.java

@@ -0,0 +1,37 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 平台利润记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PtProfitLogPageReqVO extends PageParam {
+
+    @Schema(description = "增加金额")
+    private Integer amount;
+
+    @Schema(description = "增加后金额")
+    private Integer afterAmount;
+
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益", example = "2")
+    private Integer profitStatus;
+
+    @Schema(description = "订单号", example = "15682")
+    private Long orderId;
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 44 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java

@@ -0,0 +1,44 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 平台利润记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PtProfitLogRespVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12046")
+    @ExcelProperty("用户编号")
+    private Long id;
+
+    @Schema(description = "增加金额")
+    @ExcelProperty("增加金额")
+    private Integer amount;
+
+    @Schema(description = "增加后金额")
+    @ExcelProperty("增加后金额")
+    private Integer afterAmount;
+
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益", example = "2")
+    @ExcelProperty("收益类型 1:平台服务器费 2:平台收益")
+    private Integer profitStatus;
+
+    @Schema(description = "订单号", example = "15682")
+    @ExcelProperty("订单号")
+    private Long orderId;
+
+    @Schema(description = "计算百分比模板")
+    @ExcelProperty("计算百分比模板")
+    private String percentTemplate;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 34 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java

@@ -0,0 +1,34 @@
+package cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 平台利润记录新增/修改 Request VO")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PtProfitLogSaveReqVO {
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12046")
+    private Long id;
+
+    @Schema(description = "增加金额")
+    private Integer amount;
+
+    @Schema(description = "增加后金额")
+    private Integer afterAmount;
+
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益", example = "2")
+    private Integer profitStatus;
+
+    @Schema(description = "订单号", example = "15682")
+    private Long orderId;
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
+
+}

+ 1 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ordercalc/OrderCalcDO.java

@@ -63,5 +63,6 @@ public class OrderCalcDO extends BaseDO {
      * 推广-平台分成额度(浮动)
      */
     private Integer grossProfitPlatformQuota;
+    private String percentTemplate;
 
 }

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java

@@ -52,4 +52,6 @@ public class OrderPercentageDO extends BaseDO {
      */
     private Integer divideIntoPerc;
 
+    private Integer status;
+
 }

+ 51 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/partitioncrash/PartitionCrashDO.java

@@ -0,0 +1,51 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 分区碰撞 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_partition_crash")
+@KeySequence("distri_partition_crash_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PartitionCrashDO extends BaseDO {
+
+    /**
+     * 用户编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 分区编号
+     */
+    private String partNo;
+    /**
+     * 兄弟分区额度
+     */
+    private Integer brotherPrice;
+    /**
+     * 子分区额度
+     */
+    private Integer sonPrice;
+    /**
+     * 碰撞后额度
+     */
+    private Integer afterHitQuota;
+
+}

+ 43 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofit/PtProfitDO.java

@@ -0,0 +1,43 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 平台利润 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_pt_profit")
+@KeySequence("distri_pt_profit_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PtProfitDO extends BaseDO {
+
+    /**
+     * 用户编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 平台服务费(毛利下的百分比收益)
+     */
+    private Integer ptAdd;
+    /**
+     * 平台收益(0.3888 之外的收益)
+     */
+    private Integer ptGrossAdd;
+    /**
+     * 平台总收益
+     */
+    private Integer ptTotalAdd;
+
+}

+ 51 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java

@@ -0,0 +1,51 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 平台利润记录 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_pt_profit_log")
+@KeySequence("distri_pt_profit_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PtProfitLogDO extends BaseDO {
+
+    /**
+     * 用户编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 增加金额
+     */
+    private Integer amount;
+    /**
+     * 增加后金额
+     */
+    private Integer afterAmount;
+    /**
+     * 收益类型 1:平台服务器费 2:平台收益
+     */
+    private Integer profitStatus;
+    /**
+     * 订单号
+     */
+    private Long orderId;
+    /**
+     * 计算百分比模板
+     */
+    private String percentTemplate;
+
+}

+ 2 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ordercalc/OrderCalcMapper.java

@@ -21,6 +21,7 @@ public interface OrderCalcMapper extends BaseMapperX<OrderCalcDO> {
         return selectPage(reqVO, new LambdaQueryWrapperX<OrderCalcDO>()
                 .eqIfPresent(OrderCalcDO::getOrderNo, reqVO.getOrderNo())
                 .eqIfPresent(OrderCalcDO::getUserId, reqVO.getUserId())
+                .betweenIfPresent(OrderCalcDO::getCreateTime, reqVO.getCreateTime())
                 .eqIfPresent(OrderCalcDO::getPrice, reqVO.getPrice())
                 .eqIfPresent(OrderCalcDO::getCost, reqVO.getCost())
                 .eqIfPresent(OrderCalcDO::getGrossProfit, reqVO.getGrossProfit())
@@ -28,7 +29,7 @@ public interface OrderCalcMapper extends BaseMapperX<OrderCalcDO> {
                 .eqIfPresent(OrderCalcDO::getGrossProfitAncestorQuota, reqVO.getGrossProfitAncestorQuota())
                 .eqIfPresent(OrderCalcDO::getGrossProfitBonusQuota, reqVO.getGrossProfitBonusQuota())
                 .eqIfPresent(OrderCalcDO::getGrossProfitPlatformQuota, reqVO.getGrossProfitPlatformQuota())
-                .betweenIfPresent(OrderCalcDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(OrderCalcDO::getPercentTemplate, reqVO.getPercentTemplate())
                 .orderByDesc(OrderCalcDO::getId));
     }
 

+ 1 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/orderpercentage/OrderPercentageMapper.java

@@ -24,6 +24,7 @@ public interface OrderPercentageMapper extends BaseMapperX<OrderPercentageDO> {
                 .eqIfPresent(OrderPercentageDO::getGrossProfitAncestorQuotaPerc, reqVO.getGrossProfitAncestorQuotaPerc())
                 .eqIfPresent(OrderPercentageDO::getGrossProfitBonusQuotaPerc, reqVO.getGrossProfitBonusQuotaPerc())
                 .eqIfPresent(OrderPercentageDO::getGrossProfitPlatformQuotaPerc, reqVO.getGrossProfitPlatformQuotaPerc())
+                .eqIfPresent(OrderPercentageDO::getStatus, reqVO.getStatus())
                 .eqIfPresent(OrderPercentageDO::getDivideIntoPerc, reqVO.getDivideIntoPerc())
                 .betweenIfPresent(OrderPercentageDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(OrderPercentageDO::getId));

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/partitioncrash/PartitionCrashMapper.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.partitioncrash;
+
+import java.util.*;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash.PartitionCrashDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo.*;
+
+/**
+ * 分区碰撞 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface PartitionCrashMapper extends BaseMapperX<PartitionCrashDO> {
+
+    default PageResult<PartitionCrashDO> selectPage(PartitionCrashPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PartitionCrashDO>()
+                .eqIfPresent(PartitionCrashDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(PartitionCrashDO::getPartNo, reqVO.getPartNo())
+                .eqIfPresent(PartitionCrashDO::getBrotherPrice, reqVO.getBrotherPrice())
+                .eqIfPresent(PartitionCrashDO::getSonPrice, reqVO.getSonPrice())
+                .eqIfPresent(PartitionCrashDO::getAfterHitQuota, reqVO.getAfterHitQuota())
+                .betweenIfPresent(PartitionCrashDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(PartitionCrashDO::getId));
+    }
+
+}

+ 29 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofit/PtProfitMapper.java

@@ -0,0 +1,29 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.ptprofit;
+
+import java.util.*;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
+
+/**
+ * 平台利润 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface PtProfitMapper extends BaseMapperX<PtProfitDO> {
+
+    default PageResult<PtProfitDO> selectPage(PtProfitPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PtProfitDO>()
+                .eqIfPresent(PtProfitDO::getPtAdd, reqVO.getPtAdd())
+                .eqIfPresent(PtProfitDO::getPtGrossAdd, reqVO.getPtGrossAdd())
+                .eqIfPresent(PtProfitDO::getPtTotalAdd, reqVO.getPtTotalAdd())
+                .betweenIfPresent(PtProfitDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(PtProfitDO::getId));
+    }
+
+}

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.ptprofitlog;
+
+import java.util.*;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
+
+/**
+ * 平台利润记录 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
+
+    default PageResult<PtProfitLogDO> selectPage(PtProfitLogPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PtProfitLogDO>()
+                .eqIfPresent(PtProfitLogDO::getAmount, reqVO.getAmount())
+                .eqIfPresent(PtProfitLogDO::getAfterAmount, reqVO.getAfterAmount())
+                .eqIfPresent(PtProfitLogDO::getProfitStatus, reqVO.getProfitStatus())
+                .eqIfPresent(PtProfitLogDO::getOrderId, reqVO.getOrderId())
+                .eqIfPresent(PtProfitLogDO::getPercentTemplate, reqVO.getPercentTemplate())
+                .betweenIfPresent(PtProfitLogDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(PtProfitLogDO::getId));
+    }
+
+}

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/order/OrderConsumer.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.distri.mq.consumer.order;
+
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
+import cn.newfeifan.mall.module.distri.service.ordercalc.OrderCalcService;
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+@Component
+@Slf4j
+public class OrderConsumer {
+
+    @Resource
+    private OrderCalcService orderCalcService;
+
+    @EventListener
+    @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
+    public void onMessage(List<DistriOrderMessage> tradeOrderDO) {
+        log.info("[onMessage][消息内容({})]", tradeOrderDO);
+        // todo 计算数据
+        orderCalcService.calc(tradeOrderDO);
+
+    }
+
+}

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcService.java

@@ -2,6 +2,8 @@ package cn.newfeifan.mall.module.distri.service.ordercalc;
 
 import java.util.*;
 import javax.validation.*;
+
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.module.distri.controller.admin.ordercalc.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -52,4 +54,11 @@ public interface OrderCalcService {
      */
     PageResult<OrderCalcDO> getOrderCalcPage(OrderCalcPageReqVO pageReqVO);
 
+    /**
+     * 计算订单信息
+     * @param tradeOrderDO
+     */
+    void calc(List<DistriOrderMessage> tradeOrderDO);
+
+
 }

+ 118 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java

@@ -1,11 +1,24 @@
 package cn.newfeifan.mall.module.distri.service.ordercalc;
 
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.PtProfitLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
+import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
+
 import cn.newfeifan.mall.module.distri.controller.admin.ordercalc.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -15,6 +28,7 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.module.distri.dal.mysql.ordercalc.OrderCalcMapper;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.PERCENT;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
 /**
@@ -29,6 +43,13 @@ public class OrderCalcServiceImpl implements OrderCalcService {
     @Resource
     private OrderCalcMapper orderCalcMapper;
 
+    @Resource
+    private PtProfitService ptProfitService;
+
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
+
     @Override
     public Long createOrderCalc(OrderCalcSaveReqVO createReqVO) {
         // 插入
@@ -71,4 +92,101 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         return orderCalcMapper.selectPage(pageReqVO);
     }
 
+    @Resource
+    private OrderPercentageService orderPercentageService;
+
+    @Override
+    public void calc(List<DistriOrderMessage> tradeOrderDO) {
+
+        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+        // 当前计算百分比模板
+        String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
+
+
+        // 每个订单收益
+        List<OrderCalcSaveReqVO> saveList = new ArrayList<>();
+        // 平台收益
+        List<PtProfitSaveReqVO> ptProfitSaveReqVOS = new ArrayList<>();
+        // 平台收益日志
+        List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS = new ArrayList<>();
+
+        PtProfitDO ptProfitDO = ptProfitService.getPtProfit();
+
+        tradeOrderDO.forEach(k -> {
+
+            // 计算利润: (价格 - 成本价格) * 产品数量
+            Integer profit = (k.getPrice() - k.getCostPrice()) * k.getProductCount();
+            // 计算毛利: 利润 * 0.38
+            Integer grossProfit = profit * orderPercentageDO.getGrossProfitPerc();
+            // 计算用户额度: 利润 * 0.38
+            Integer userProfit = grossProfit * orderPercentageDO.getGrossProfitUserQuotaPerc();
+            // 计算直推人额度: 利润 * 0.38
+            Integer ancestorQuota = grossProfit * orderPercentageDO.getGrossProfitAncestorQuotaPerc();
+            // 计算合赢奖: 利润 * 0.38
+            Integer bonusQuota = grossProfit * orderPercentageDO.getGrossProfitBonusQuotaPerc();
+            // 计算平台收益: 利润 * 0.38
+            Integer platformQuota = grossProfit * orderPercentageDO.getGrossProfitPlatformQuotaPerc();
+
+
+            // 计算
+            OrderCalcSaveReqVO orderCalcSaveReqVO = OrderCalcSaveReqVO.builder()
+                    .userId(k.getUserId())
+                    .orderNo(k.getNo())
+                    .cost(k.getCostPrice())
+                    .price(k.getPrice())
+                    .grossProfit(grossProfit)
+                    .grossProfitUserQuota(userProfit)
+                    .grossProfitAncestorQuota(ancestorQuota)
+                    .grossProfitBonusQuota(bonusQuota)
+                    .grossProfitPlatformQuota(platformQuota)
+                    .percentTemplate(percentTemplate)
+                    .build();
+            saveList.add(orderCalcSaveReqVO);
+
+            // 每个订单计算的过程
+            // 增加平台收益
+            // 平台服务费
+            Integer ptGrossAdd = ptProfitDO.getPtGrossAdd() + platformQuota;
+            // 平台收益
+            Integer ptAdd = ptProfitDO.getPtAdd() + grossProfit * (10000 - orderPercentageDO.getGrossProfitBonusQuotaPerc());
+            // 平台总收益
+            Integer ptTotal = ptProfitDO.getPtTotalAdd() + ptGrossAdd + ptAdd;
+
+            PtProfitSaveReqVO ptProfitSaveReqVO = PtProfitSaveReqVO.builder()
+                    .ptAdd(ptAdd)
+                    .ptGrossAdd(ptGrossAdd)
+                    .ptTotalAdd(ptTotal).build();
+            ptProfitSaveReqVOS.add(ptProfitSaveReqVO);
+
+            // 平台记录
+            PtProfitLogSaveReqVO ptGrossAddLog = PtProfitLogSaveReqVO.builder()
+                    .orderId(k.getOrderId())
+                    .profitStatus(1)
+                    .amount(platformQuota)
+                    .afterAmount(ptProfitSaveReqVO.getPtGrossAdd())
+                    .percentTemplate(percentTemplate).build();
+
+            PtProfitLogSaveReqVO ptAddLog = PtProfitLogSaveReqVO.builder()
+                    .orderId(k.getOrderId())
+                    .profitStatus(2)
+                    .amount(grossProfit * (PERCENT - orderPercentageDO.getGrossProfitBonusQuotaPerc()))
+                    .afterAmount(ptProfitSaveReqVO.getPtAdd())
+                    .percentTemplate(percentTemplate).build();
+            ptProfitLogSaveReqVOS.add(ptGrossAddLog);
+            ptProfitLogSaveReqVOS.add(ptAddLog);
+
+
+        });
+
+        // 将信息存储到数据库中
+        orderCalcMapper.insertBatch(BeanUtils.toBean(saveList, OrderCalcDO.class));
+        ptProfitService.saveBatch(ptProfitSaveReqVOS);
+        ptProfitLogService.saveBatch(ptProfitLogSaveReqVOS);
+
+
+        // todo 计算当天用户的碰撞
+
+
+    }
+
 }

+ 9 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageService.java

@@ -20,14 +20,14 @@ public interface OrderPercentageService {
      * @param createReqVO 创建信息
      * @return 编号
      */
-    Long createOrderPercentage(@Valid OrderPercentageSaveReqVO createReqVO);
+    Long createOrderPercentage(@Valid OrderPercentageDoubleSaveReqVO createReqVO);
 
     /**
      * 更新积分相关计算浮动百分比设置
      *
      * @param updateReqVO 更新信息
      */
-    void updateOrderPercentage(@Valid OrderPercentageSaveReqVO updateReqVO);
+    void updateOrderPercentage(@Valid OrderPercentageDoubleSaveReqVO updateReqVO);
 
     /**
      * 删除积分相关计算浮动百分比设置
@@ -52,4 +52,11 @@ public interface OrderPercentageService {
      */
     PageResult<OrderPercentageDO> getOrderPercentagePage(OrderPercentagePageReqVO pageReqVO);
 
+    /**
+     * 查找默认计算参数
+     * @return
+     */
+    OrderPercentageDO queryStatus();
+
+
 }

+ 39 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageServiceImpl.java

@@ -1,11 +1,16 @@
 package cn.newfeifan.mall.module.distri.service.orderpercentage;
 
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+
 import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -15,6 +20,8 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.module.distri.dal.mysql.orderpercentage.OrderPercentageMapper;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.ONE_HUNDRED;
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.PERCENT;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
 /**
@@ -30,16 +37,34 @@ public class OrderPercentageServiceImpl implements OrderPercentageService {
     private OrderPercentageMapper orderPercentageMapper;
 
     @Override
-    public Long createOrderPercentage(OrderPercentageSaveReqVO createReqVO) {
+    public Long createOrderPercentage(OrderPercentageDoubleSaveReqVO createReqVO) {
+        OrderPercentageSaveReqVO orderPercentageSaveReqVO = new OrderPercentageSaveReqVO();
+        orderPercentageSaveReqVO.setDivideIntoPerc((int) (createReqVO.getDivideIntoPerc() * PERCENT));
+        orderPercentageSaveReqVO.setGrossProfitPerc((int) (createReqVO.getGrossProfitPerc() * PERCENT));
+        orderPercentageSaveReqVO.setGrossProfitAncestorQuotaPerc((int) (createReqVO.getGrossProfitAncestorQuotaPerc() * PERCENT));
+        orderPercentageSaveReqVO.setGrossProfitBonusQuotaPerc((int) (createReqVO.getGrossProfitBonusQuotaPerc() * PERCENT));
+        orderPercentageSaveReqVO.setGrossProfitPlatformQuotaPerc((int) (createReqVO.getGrossProfitPlatformQuotaPerc() * PERCENT));
+        orderPercentageSaveReqVO.setGrossProfitUserQuotaPerc((int) (createReqVO.getGrossProfitUserQuotaPerc() * PERCENT));
+        if (checkPercent(createReqVO)){
+            throw  exception(PERCENT_LARGE_ONE_HUNDRED);
+        }
         // 插入
-        OrderPercentageDO orderPercentage = BeanUtils.toBean(createReqVO, OrderPercentageDO.class);
+        OrderPercentageDO orderPercentage = BeanUtils.toBean(orderPercentageSaveReqVO, OrderPercentageDO.class);
         orderPercentageMapper.insert(orderPercentage);
         // 返回
         return orderPercentage.getId();
     }
 
+    public boolean checkPercent(OrderPercentageDoubleSaveReqVO createReqVO){
+        // 判断是否等于1
+        Double total =  createReqVO.getGrossProfitUserQuotaPerc()+createReqVO.getGrossProfitAncestorQuotaPerc()+createReqVO.getGrossProfitPlatformQuotaPerc()
+                +createReqVO.getGrossProfitBonusQuotaPerc();
+        return total > ONE_HUNDRED;
+    }
+
+
     @Override
-    public void updateOrderPercentage(OrderPercentageSaveReqVO updateReqVO) {
+    public void updateOrderPercentage(OrderPercentageDoubleSaveReqVO updateReqVO) {
         // 校验存在
         validateOrderPercentageExists(updateReqVO.getId());
         // 更新
@@ -71,4 +96,15 @@ public class OrderPercentageServiceImpl implements OrderPercentageService {
         return orderPercentageMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public OrderPercentageDO queryStatus() {
+        List<OrderPercentageDO> orderPercentageDOS = orderPercentageMapper.selectList(new LambdaQueryWrapperX<OrderPercentageDO>()
+                .eqIfPresent(OrderPercentageDO::getStatus, 1));
+
+        if (orderPercentageDOS.isEmpty()) {
+            return null;
+        }
+        return orderPercentageDOS.get(0);
+    }
+
 }

+ 14 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/handle/OrderPercentCheckHandler.java

@@ -0,0 +1,14 @@
+package cn.newfeifan.mall.module.distri.service.orderpercentage.handle;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * 订单百分比校验
+ *
+ * @author HUIHUI
+ */
+@Component
+public class OrderPercentCheckHandler  implements OrderPercentHandler{
+
+
+}

+ 24 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/handle/OrderPercentHandler.java

@@ -0,0 +1,24 @@
+package cn.newfeifan.mall.module.distri.service.orderpercentage.handle;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.newfeifan.mall.module.promotion.api.bargain.BargainActivityApi;
+import cn.newfeifan.mall.module.promotion.api.bargain.BargainRecordApi;
+import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
+import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderItemDO;
+import cn.newfeifan.mall.module.trade.enums.order.TradeOrderTypeEnum;
+import cn.newfeifan.mall.module.trade.service.order.handler.TradeOrderHandler;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 订单百分比
+ *
+ * @author HUIHUI
+ */
+public interface OrderPercentHandler {
+
+
+}

+ 55 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashService.java

@@ -0,0 +1,55 @@
+package cn.newfeifan.mall.module.distri.service.partitioncrash;
+
+import java.util.*;
+import javax.validation.*;
+import cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash.PartitionCrashDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+
+/**
+ * 分区碰撞 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface PartitionCrashService {
+
+    /**
+     * 创建分区碰撞
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createPartitionCrash(@Valid PartitionCrashSaveReqVO createReqVO);
+
+    /**
+     * 更新分区碰撞
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updatePartitionCrash(@Valid PartitionCrashSaveReqVO updateReqVO);
+
+    /**
+     * 删除分区碰撞
+     *
+     * @param id 编号
+     */
+    void deletePartitionCrash(Long id);
+
+    /**
+     * 获得分区碰撞
+     *
+     * @param id 编号
+     * @return 分区碰撞
+     */
+    PartitionCrashDO getPartitionCrash(Long id);
+
+    /**
+     * 获得分区碰撞分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 分区碰撞分页
+     */
+    PageResult<PartitionCrashDO> getPartitionCrashPage(PartitionCrashPageReqVO pageReqVO);
+
+}

+ 74 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java

@@ -0,0 +1,74 @@
+package cn.newfeifan.mall.module.distri.service.partitioncrash;
+
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash.PartitionCrashDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.partitioncrash.PartitionCrashMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 分区碰撞 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class PartitionCrashServiceImpl implements PartitionCrashService {
+
+    @Resource
+    private PartitionCrashMapper partitionCrashMapper;
+
+    @Override
+    public Long createPartitionCrash(PartitionCrashSaveReqVO createReqVO) {
+        // 插入
+        PartitionCrashDO partitionCrash = BeanUtils.toBean(createReqVO, PartitionCrashDO.class);
+        partitionCrashMapper.insert(partitionCrash);
+        // 返回
+        return partitionCrash.getId();
+    }
+
+    @Override
+    public void updatePartitionCrash(PartitionCrashSaveReqVO updateReqVO) {
+        // 校验存在
+        validatePartitionCrashExists(updateReqVO.getId());
+        // 更新
+        PartitionCrashDO updateObj = BeanUtils.toBean(updateReqVO, PartitionCrashDO.class);
+        partitionCrashMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deletePartitionCrash(Long id) {
+        // 校验存在
+        validatePartitionCrashExists(id);
+        // 删除
+        partitionCrashMapper.deleteById(id);
+    }
+
+    private void validatePartitionCrashExists(Long id) {
+        if (partitionCrashMapper.selectById(id) == null) {
+            throw exception(PARTITION_CRASH_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public PartitionCrashDO getPartitionCrash(Long id) {
+        return partitionCrashMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<PartitionCrashDO> getPartitionCrashPage(PartitionCrashPageReqVO pageReqVO) {
+        return partitionCrashMapper.selectPage(pageReqVO);
+    }
+
+}

+ 63 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitService.java

@@ -0,0 +1,63 @@
+package cn.newfeifan.mall.module.distri.service.ptprofit;
+
+import java.util.*;
+import javax.validation.*;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+
+/**
+ * 平台利润 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface PtProfitService {
+
+    /**
+     * 创建平台利润
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createPtProfit(@Valid PtProfitSaveReqVO createReqVO);
+
+    /**
+     * 更新平台利润
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updatePtProfit(@Valid PtProfitSaveReqVO updateReqVO);
+
+    /**
+     * 删除平台利润
+     *
+     * @param id 编号
+     */
+    void deletePtProfit(Long id);
+
+    /**
+     * 获得平台利润
+     *
+     * @param id 编号
+     * @return 平台利润
+     */
+    PtProfitDO getPtProfit(Long id);
+
+    /**
+     * 获得平台利润分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 平台利润分页
+     */
+    PageResult<PtProfitDO> getPtProfitPage(PtProfitPageReqVO pageReqVO);
+
+    /**
+     * 获取当前平台信息
+     */
+    PtProfitDO getPtProfit();
+
+
+    void saveBatch(List<PtProfitSaveReqVO> ptProfitSaveReqVOS);
+
+}

+ 91 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitServiceImpl.java

@@ -0,0 +1,91 @@
+package cn.newfeifan.mall.module.distri.service.ptprofit;
+
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 平台利润 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class PtProfitServiceImpl implements PtProfitService {
+
+    @Resource
+    private PtProfitMapper ptProfitMapper;
+
+    @Override
+    public Long createPtProfit(PtProfitSaveReqVO createReqVO) {
+        // 插入
+        PtProfitDO ptProfit = BeanUtils.toBean(createReqVO, PtProfitDO.class);
+        ptProfitMapper.insert(ptProfit);
+        // 返回
+        return ptProfit.getId();
+    }
+
+    @Override
+    public void updatePtProfit(PtProfitSaveReqVO updateReqVO) {
+        // 校验存在
+        validatePtProfitExists(updateReqVO.getId());
+        // 更新
+        PtProfitDO updateObj = BeanUtils.toBean(updateReqVO, PtProfitDO.class);
+        ptProfitMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deletePtProfit(Long id) {
+        // 校验存在
+        validatePtProfitExists(id);
+        // 删除
+        ptProfitMapper.deleteById(id);
+    }
+
+    private void validatePtProfitExists(Long id) {
+        if (ptProfitMapper.selectById(id) == null) {
+            throw exception(PT_PROFIT_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public PtProfitDO getPtProfit(Long id) {
+        return ptProfitMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<PtProfitDO> getPtProfitPage(PtProfitPageReqVO pageReqVO) {
+        return ptProfitMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public PtProfitDO getPtProfit() {
+        return ptProfitMapper.selectList(new LambdaQueryWrapperX<PtProfitDO>()).get(0);
+    }
+
+    @Override
+    public void saveBatch(List<PtProfitSaveReqVO> ptProfitSaveReqVOS) {
+
+        List<PtProfitDO> ptProfit = BeanUtils.toBean(ptProfitSaveReqVOS, PtProfitDO.class);
+        ptProfitMapper.insertBatch(ptProfit);
+
+    }
+
+}

+ 58 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java

@@ -0,0 +1,58 @@
+package cn.newfeifan.mall.module.distri.service.ptprofitlog;
+
+import java.util.*;
+import javax.validation.*;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+
+/**
+ * 平台利润记录 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface PtProfitLogService {
+
+    /**
+     * 创建平台利润记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createPtProfitLog(@Valid PtProfitLogSaveReqVO createReqVO);
+
+    /**
+     * 更新平台利润记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updatePtProfitLog(@Valid PtProfitLogSaveReqVO updateReqVO);
+
+    /**
+     * 删除平台利润记录
+     *
+     * @param id 编号
+     */
+    void deletePtProfitLog(Long id);
+
+    /**
+     * 获得平台利润记录
+     *
+     * @param id 编号
+     * @return 平台利润记录
+     */
+    PtProfitLogDO getPtProfitLog(Long id);
+
+    /**
+     * 获得平台利润记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 平台利润记录分页
+     */
+    PageResult<PtProfitLogDO> getPtProfitLogPage(PtProfitLogPageReqVO pageReqVO);
+
+    void saveBatch(List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS);
+
+
+}

+ 83 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java

@@ -0,0 +1,83 @@
+package cn.newfeifan.mall.module.distri.service.ptprofitlog;
+
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.ptprofitlog.PtProfitLogMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 平台利润记录 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class PtProfitLogServiceImpl implements PtProfitLogService {
+
+    @Resource
+    private PtProfitLogMapper ptProfitLogMapper;
+
+    @Override
+    public Long createPtProfitLog(PtProfitLogSaveReqVO createReqVO) {
+        // 插入
+        PtProfitLogDO ptProfitLog = BeanUtils.toBean(createReqVO, PtProfitLogDO.class);
+        ptProfitLogMapper.insert(ptProfitLog);
+        // 返回
+        return ptProfitLog.getId();
+    }
+
+    @Override
+    public void updatePtProfitLog(PtProfitLogSaveReqVO updateReqVO) {
+        // 校验存在
+        validatePtProfitLogExists(updateReqVO.getId());
+        // 更新
+        PtProfitLogDO updateObj = BeanUtils.toBean(updateReqVO, PtProfitLogDO.class);
+        ptProfitLogMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deletePtProfitLog(Long id) {
+        // 校验存在
+        validatePtProfitLogExists(id);
+        // 删除
+        ptProfitLogMapper.deleteById(id);
+    }
+
+    private void validatePtProfitLogExists(Long id) {
+        if (ptProfitLogMapper.selectById(id) == null) {
+            throw exception(PT_PROFIT_LOG_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public PtProfitLogDO getPtProfitLog(Long id) {
+        return ptProfitLogMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<PtProfitLogDO> getPtProfitLogPage(PtProfitLogPageReqVO pageReqVO) {
+        return ptProfitLogMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public void saveBatch(List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS) {
+        List<PtProfitLogDO> ptProfitLog = BeanUtils.toBean(ptProfitLogSaveReqVOS, PtProfitLogDO.class);
+        ptProfitLogMapper.insertBatch(ptProfitLog);
+    }
+
+}

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/partitioncrash/PartitionCrashMapper.xml

@@ -0,0 +1,12 @@
+<?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="cn.newfeifan.mall.module.distri.dal.mysql.partitioncrash.PartitionCrashMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/ptprofit/PtProfitMapper.xml

@@ -0,0 +1,12 @@
+<?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="cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/ptprofitlog/PtProfitLogMapper.xml

@@ -0,0 +1,12 @@
+<?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="cn.newfeifan.mall.module.distri.dal.mysql.ptprofitlog.PtProfitLogMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 0 - 162
feifan-module-distri/feifan-module-distri-biz/src/test/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImplTest.java

@@ -1,162 +0,0 @@
-package cn.newfeifan.mall.module.distri.service.duser;
-
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.mock.mockito.MockBean;
-
-import javax.annotation.Resource;
-
-import cn.newfeifan.mall.framework.test.core.ut.BaseDbUnitTest;
-
-import cn.newfeifan.mall.module.distri.controller.admin.duser.vo.*;
-import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
-import cn.newfeifan.mall.module.distri.dal.mysql.duser.DuserMapper;
-import cn.newfeifan.mall.framework.common.pojo.PageResult;
-
-import javax.annotation.Resource;
-import org.springframework.context.annotation.Import;
-import java.util.*;
-import java.time.LocalDateTime;
-
-import static cn.hutool.core.util.RandomUtil.*;
-import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
-import static cn.newfeifan.mall.framework.test.core.util.AssertUtils.*;
-import static cn.newfeifan.mall.framework.test.core.util.RandomUtils.*;
-import static cn.newfeifan.mall.framework.common.util.date.LocalDateTimeUtils.*;
-import static cn.newfeifan.mall.framework.common.util.object.ObjectUtils.*;
-import static cn.newfeifan.mall.framework.common.util.date.DateUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-/**
- * {@link DuserServiceImpl} 的单元测试类
- *
- * @author 非繁人
- */
-@Import(DuserServiceImpl.class)
-public class DuserServiceImplTest extends BaseDbUnitTest {
-
-    @Resource
-    private DuserServiceImpl duserService;
-
-    @Resource
-    private DuserMapper duserMapper;
-
-    @Test
-    public void testCreateDuser_success() {
-        // 准备参数
-        DuserSaveReqVO createReqVO = randomPojo(DuserSaveReqVO.class).setId(null);
-
-        // 调用
-        Long duserId = duserService.createDuser(createReqVO);
-        // 断言
-        assertNotNull(duserId);
-        // 校验记录的属性是否正确
-        DuserDO duser = duserMapper.selectById(duserId);
-        assertPojoEquals(createReqVO, duser, "id");
-    }
-
-    @Test
-    public void testUpdateDuser_success() {
-        // mock 数据
-        DuserDO dbDuser = randomPojo(DuserDO.class);
-        duserMapper.insert(dbDuser);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        DuserSaveReqVO updateReqVO = randomPojo(DuserSaveReqVO.class, o -> {
-            o.setId(dbDuser.getId()); // 设置更新的 ID
-        });
-
-        // 调用
-        duserService.updateDuser(updateReqVO);
-        // 校验是否更新正确
-        DuserDO duser = duserMapper.selectById(updateReqVO.getId()); // 获取最新的
-        assertPojoEquals(updateReqVO, duser);
-    }
-
-    @Test
-    public void testUpdateDuser_notExists() {
-        // 准备参数
-        DuserSaveReqVO updateReqVO = randomPojo(DuserSaveReqVO.class);
-
-        // 调用, 并断言异常
-        assertServiceException(() -> duserService.updateDuser(updateReqVO), DUSER_NOT_EXISTS);
-    }
-
-    @Test
-    public void testDeleteDuser_success() {
-        // mock 数据
-        DuserDO dbDuser = randomPojo(DuserDO.class);
-        duserMapper.insert(dbDuser);// @Sql: 先插入出一条存在的数据
-        // 准备参数
-        Long id = dbDuser.getId();
-
-        // 调用
-        duserService.deleteDuser(id);
-       // 校验数据不存在了
-       assertNull(duserMapper.selectById(id));
-    }
-
-    @Test
-    public void testDeleteDuser_notExists() {
-        // 准备参数
-        Long id = randomLongId();
-
-        // 调用, 并断言异常
-        assertServiceException(() -> duserService.deleteDuser(id), DUSER_NOT_EXISTS);
-    }
-
-    @Test
-    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
-    public void testGetDuserPage() {
-       // mock 数据
-       DuserDO dbDuser = randomPojo(DuserDO.class, o -> { // 等会查询到
-           o.setUserId(null);
-           o.setName(null);
-           o.setMobile(null);
-           o.setSource(null);
-           o.setIntegralId(null);
-           o.setSocialStatus(null);
-           o.setSocialStatusPoint(null);
-           o.setCategoryId(null);
-           o.setCreateTime(null);
-       });
-       duserMapper.insert(dbDuser);
-       // 测试 userId 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setUserId(null)));
-       // 测试 name 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setName(null)));
-       // 测试 mobile 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setMobile(null)));
-       // 测试 source 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setSource(null)));
-       // 测试 integralId 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setIntegralId(null)));
-       // 测试 socialStatus 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setSocialStatus(null)));
-       // 测试 socialStatusPoint 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setSocialStatusPoint(null)));
-       // 测试 categoryId 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setCategoryId(null)));
-       // 测试 createTime 不匹配
-       duserMapper.insert(cloneIgnoreId(dbDuser, o -> o.setCreateTime(null)));
-       // 准备参数
-       DuserPageReqVO reqVO = new DuserPageReqVO();
-       reqVO.setUserId(null);
-       reqVO.setName(null);
-       reqVO.setMobile(null);
-       reqVO.setSource(null);
-       reqVO.setIntegralId(null);
-       reqVO.setSocialStatus(null);
-       reqVO.setSocialStatusPoint(null);
-       reqVO.setCategoryId(null);
-       reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
-
-       // 调用
-       PageResult<DuserDO> pageResult = duserService.getDuserPage(reqVO);
-       // 断言
-       assertEquals(1, pageResult.getTotal());
-       assertEquals(1, pageResult.getList().size());
-       assertPojoEquals(dbDuser, pageResult.getList().get(0));
-    }
-
-}

+ 4 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.module.trade.dal.mysql.order;
 
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -9,6 +10,7 @@ import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderPageR
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -146,5 +148,6 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eqIfPresent(TradeOrderDO::getMerchantId, key))));
     }
 
-    ;
+    List<DistriOrderMessage> queryAllOrder(@Param("start") LocalDateTime start,@Param("end") LocalDateTime end);
+
 }

+ 38 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java

@@ -0,0 +1,38 @@
+package cn.newfeifan.mall.module.trade.job.order;
+
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
+import cn.newfeifan.mall.framework.quartz.core.handler.JobHandler;
+import cn.newfeifan.mall.framework.tenant.core.job.TenantJob;
+import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderDetailRespVO;
+import cn.newfeifan.mall.module.trade.mq.producer.order.DistriOrderProducer;
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 交易订单自动计算 Job
+ *
+ * @author 非繁源码
+ */
+@Component
+public class TradeOrderAutoCalcJob implements JobHandler {
+
+    @Resource
+    private DistriOrderProducer distriOrderProducer;
+
+    @Resource
+    private TradeOrderQueryService tradeOrderQueryService;
+
+    @Override
+    @TenantJob
+    public String execute(String param) {
+        List<DistriOrderMessage> appTradeOrderDetailRespVos = tradeOrderQueryService.queryAllOrder();
+        distriOrderProducer.sendDistriOrderMessage(appTradeOrderDetailRespVos);
+        return String.format("执行成功");
+    }
+
+}

+ 31 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/producer/order/DistriOrderProducer.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.trade.mq.producer.order;
+
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
+import cn.newfeifan.mall.module.system.mq.message.mail.MailSendMessage;
+import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderDetailRespVO;
+import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Component
+public class DistriOrderProducer {
+    @Resource
+    private ApplicationContext applicationContext;
+
+
+    /**
+     * 发送 {@link MailSendMessage} 消息
+     *
+     * @param tradeOrderDO 当前订单信息
+     */
+    public void sendDistriOrderMessage(List<DistriOrderMessage> tradeOrderDO) {
+        applicationContext.publishEvent(tradeOrderDO);
+    }
+
+}

+ 17 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java

@@ -1,14 +1,17 @@
 package cn.newfeifan.mall.module.trade.service.order;
 
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
+import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderDetailRespVO;
 import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderItemDO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
@@ -189,4 +192,18 @@ public interface TradeOrderQueryService {
      */
     Integer getShopSalesVolume(Long key);
 
+    /**
+     * 获取所有订单信息, 已经完成的(已经经过收款7天之后的订单)
+     * @return
+     */
+    List<AppTradeOrderDetailRespVO> cancelOrderBySystem();
+
+
+    /**
+     * 查询当前系统的所有订单
+     * @return
+     */
+    List<DistriOrderMessage> queryAllOrder();
+
+
 }

+ 50 - 3
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java

@@ -5,7 +5,9 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.collection.CollectionUtils;
 import cn.newfeifan.mall.module.member.api.user.MemberUserApi;
 import cn.newfeifan.mall.module.member.api.user.dto.MemberUserRespDTO;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO;
@@ -13,7 +15,9 @@ import cn.newfeifan.mall.module.product.api.sku.ProductSkuApi;
 import cn.newfeifan.mall.module.product.api.sku.dto.ProductSkuRespDTO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
+import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderDetailRespVO;
 import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
+import cn.newfeifan.mall.module.trade.convert.order.TradeOrderConvert;
 import cn.newfeifan.mall.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderItemDO;
@@ -25,16 +29,22 @@ import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.ExpressClientFactory;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
+import cn.newfeifan.mall.module.trade.framework.order.config.TradeOrderProperties;
 import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.EXPRESS_NOT_EXISTS;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
 
@@ -62,7 +72,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 
     @Resource
     private ProductSkuApi productSkuApi;
-
+    @Resource
+    private TradeOrderProperties tradeOrderProperties;
 
     // =================== Order ===================
 
@@ -166,7 +177,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 
     @Override
     public Long getOrderCount(Integer status, Long shopId, Long merId) {
-        return tradeOrderMapper.selectCountByStatus(status,shopId,merId);
+        return tradeOrderMapper.selectCountByStatus(status, shopId, merId);
     }
 
     @Override
@@ -185,7 +196,43 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
     @Override
     public Integer getShopSalesVolume(Long key) {
 
-        return  tradeOrderMapper.selectByMerId(key);
+        return tradeOrderMapper.selectByMerId(key);
+
+    }
+
+    public List<TradeOrderDO> getTodayOrder() {
+        // 获取7天之前的订单
+        LocalDateTime start = LocalDateTime.now().minusDays(1).minusDays(7).with(LocalTime.of(3, 0, 0));
+        LocalDateTime end = LocalDateTime.now().minusDays(7).with(LocalTime.of(2, 59, 59));
+
+        return tradeOrderMapper.selectList(new LambdaQueryWrapper<TradeOrderDO>().between(TradeOrderDO::getCreateTime, start, end)
+                .eq(TradeOrderDO::getStatus, 30).eq(TradeOrderDO::getPayStatus, true));
+    }
+
+    @Override
+    public List<AppTradeOrderDetailRespVO> cancelOrderBySystem() {
+
+        List<TradeOrderDO> order = getTodayOrder();
+        if (order.isEmpty()) {
+            return Collections.emptyList();
+        }
+        return order.stream().map(k -> {
+            // 查询订单项
+            List<TradeOrderItemDO> orderItems = getOrderItemListByOrderId(k.getId());
+            // 查询物流公司
+            DeliveryExpressDO express = k.getLogisticsId() != null && k.getLogisticsId() > 0 ?
+                    deliveryExpressService.getDeliveryExpress(k.getLogisticsId()) : null;
+            // 最终组合
+            return TradeOrderConvert.INSTANCE.convert02(k, orderItems, tradeOrderProperties, express);
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<DistriOrderMessage> queryAllOrder() {
+        // 获取7天之前的订单
+        LocalDateTime start = LocalDateTime.now().minusDays(1).minusDays(7).with(LocalTime.of(3, 0, 0));
+        LocalDateTime end = LocalDateTime.now().minusDays(7).with(LocalTime.of(2, 59, 59));
+        return tradeOrderMapper.queryAllOrder(start, end);
 
     }
 

+ 34 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml

@@ -0,0 +1,34 @@
+<?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="cn.newfeifan.mall.module.trade.dal.mysql.order.TradeOrderMapper">
+
+    <resultMap id="BaseResultMap" type="cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage">
+        <id column="totalPrice" property="totalPrice"/>
+        <result column="price" property="price"/>
+        <result column="productCount" property="productCount"/>
+        <result column="costPrice" property="costPrice"/>
+        <result column="no" property="no"/>
+        <result column="userId" property="userId"/>
+        <result column="shopId" property="shopId"/>
+        <result column="merchantId" property="merchantId"/>
+        <result column="orderId" property="orderId"/>
+    </resultMap>
+
+    <select id="queryAllOrder" resultMap="BaseResultMap">
+        select tor.total_price   as totalPrice,
+               ps.cost_price     as costPrice,
+               ps.price          as price,
+               tor.product_count as productCount,
+               tor.`no`          as `no`,
+               tor.id            as orderId,
+               ps.merchant_id    as merchantId,
+               ps.shop_id        as shopId
+        from trade_order tor
+                 LEFT JOIN trade_order_item toi
+                           on tor.id = toi.order_id
+                 LEFT JOIN product_sku ps
+                           on toi.sku_id = ps.id
+        where tor.update_time BETWEEN #{start} AND #{end}
+    </select>
+
+</mapper>

+ 25 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/mq/consumer/login/LoginConsumer.java

@@ -0,0 +1,25 @@
+package cn.newfeifan.mall.sale.mq.consumer.login;
+
+import cn.newfeifan.mall.module.system.mq.message.login.LoginSendMessage;
+import cn.newfeifan.mall.sale.service.merchant.MerchantService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class LoginConsumer {
+    @Resource
+    private MerchantService mailSendService;
+
+    @EventListener
+    @Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步
+    public void onMessage(LoginSendMessage message) {
+        log.info("[onMessage][消息内容({})]", message);
+        mailSendService.doSendMail(message);
+    }
+
+}