Jelajahi Sumber

修改营销模块, 增加消息通知

gaohp 11 bulan lalu
induk
melakukan
140a515db9
35 mengubah file dengan 989 tambahan dan 9 penghapusan
  1. 63 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/mq/message/order/DistriOrderMessage.java
  2. 1 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  3. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcPageReqVO.java
  4. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcRespVO.java
  5. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ordercalc/vo/OrderCalcSaveReqVO.java
  6. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentagePageReqVO.java
  7. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java
  8. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageSaveReqVO.java
  9. 95 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/PartitionCrashController.java
  10. 37 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashPageReqVO.java
  11. 44 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashRespVO.java
  12. 30 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashSaveReqVO.java
  13. 1 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ordercalc/OrderCalcDO.java
  14. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java
  15. 51 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/partitioncrash/PartitionCrashDO.java
  16. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ordercalc/OrderCalcMapper.java
  17. 1 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/orderpercentage/OrderPercentageMapper.java
  18. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/partitioncrash/PartitionCrashMapper.java
  19. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/order/OrderConsumer.java
  20. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcService.java
  21. 59 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  22. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageService.java
  23. 16 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageServiceImpl.java
  24. 55 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashService.java
  25. 74 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java
  26. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/partitioncrash/PartitionCrashMapper.xml
  27. 150 0
      feifan-module-distri/feifan-module-distri-biz/src/test/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImplTest.java
  28. 4 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java
  29. 38 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java
  30. 31 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/producer/order/DistriOrderProducer.java
  31. 17 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  32. 50 3
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  33. 34 0
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml
  34. 25 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/mq/consumer/login/LoginConsumer.java
  35. 1 1
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/permission/MenuServiceImpl.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;
+
+}

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

@@ -15,5 +15,6 @@ 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, "碰撞分区不存在");
 
 }

+ 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 - 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;
 }

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

@@ -29,5 +29,6 @@ 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;
+
+}

+ 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;
+
+}

+ 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));
+    }
+
+}

+ 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);
+
+
 }

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

@@ -1,11 +1,18 @@
 package cn.newfeifan.mall.module.distri.service.ordercalc;
 
+import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
+import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
 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;
@@ -71,4 +78,56 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         return orderCalcMapper.selectPage(pageReqVO);
     }
 
+    @Resource
+    private OrderPercentageService orderPercentageService;
+
+    @Override
+    public void calc(List<DistriOrderMessage> tradeOrderDO) {
+
+        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+
+        List<OrderCalcSaveReqVO> saveList = new ArrayList<>();
+
+        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)
+                    .build();
+            saveList.add(orderCalcSaveReqVO);
+
+            // 每个订单计算的过程
+
+            // 增加平台收益
+
+
+
+
+        });
+
+
+    }
+
 }

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

@@ -52,4 +52,11 @@ public interface OrderPercentageService {
      */
     PageResult<OrderPercentageDO> getOrderPercentagePage(OrderPercentagePageReqVO pageReqVO);
 
+    /**
+     * 查找默认计算参数
+     * @return
+     */
+    OrderPercentageDO queryStatus();
+
+
 }

+ 16 - 0
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;
@@ -71,4 +76,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);
+    }
+
 }

+ 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);
+    }
+
+}

+ 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>

+ 150 - 0
feifan-module-distri/feifan-module-distri-biz/src/test/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImplTest.java

@@ -0,0 +1,150 @@
+package cn.newfeifan.mall.module.distri.service.partitioncrash;
+
+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.partitioncrash.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash.PartitionCrashDO;
+import cn.newfeifan.mall.module.distri.dal.mysql.partitioncrash.PartitionCrashMapper;
+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 PartitionCrashServiceImpl} 的单元测试类
+ *
+ * @author 非繁人
+ */
+@Import(PartitionCrashServiceImpl.class)
+public class PartitionCrashServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private PartitionCrashServiceImpl partitionCrashService;
+
+    @Resource
+    private PartitionCrashMapper partitionCrashMapper;
+
+    @Test
+    public void testCreatePartitionCrash_success() {
+        // 准备参数
+        PartitionCrashSaveReqVO createReqVO = randomPojo(PartitionCrashSaveReqVO.class).setId(null);
+
+        // 调用
+        Long partitionCrashId = partitionCrashService.createPartitionCrash(createReqVO);
+        // 断言
+        assertNotNull(partitionCrashId);
+        // 校验记录的属性是否正确
+        PartitionCrashDO partitionCrash = partitionCrashMapper.selectById(partitionCrashId);
+        assertPojoEquals(createReqVO, partitionCrash, "id");
+    }
+
+    @Test
+    public void testUpdatePartitionCrash_success() {
+        // mock 数据
+        PartitionCrashDO dbPartitionCrash = randomPojo(PartitionCrashDO.class);
+        partitionCrashMapper.insert(dbPartitionCrash);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        PartitionCrashSaveReqVO updateReqVO = randomPojo(PartitionCrashSaveReqVO.class, o -> {
+            o.setId(dbPartitionCrash.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        partitionCrashService.updatePartitionCrash(updateReqVO);
+        // 校验是否更新正确
+        PartitionCrashDO partitionCrash = partitionCrashMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, partitionCrash);
+    }
+
+    @Test
+    public void testUpdatePartitionCrash_notExists() {
+        // 准备参数
+        PartitionCrashSaveReqVO updateReqVO = randomPojo(PartitionCrashSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> partitionCrashService.updatePartitionCrash(updateReqVO), PARTITION_CRASH_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeletePartitionCrash_success() {
+        // mock 数据
+        PartitionCrashDO dbPartitionCrash = randomPojo(PartitionCrashDO.class);
+        partitionCrashMapper.insert(dbPartitionCrash);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbPartitionCrash.getId();
+
+        // 调用
+        partitionCrashService.deletePartitionCrash(id);
+       // 校验数据不存在了
+       assertNull(partitionCrashMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeletePartitionCrash_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> partitionCrashService.deletePartitionCrash(id), PARTITION_CRASH_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetPartitionCrashPage() {
+       // mock 数据
+       PartitionCrashDO dbPartitionCrash = randomPojo(PartitionCrashDO.class, o -> { // 等会查询到
+           o.setUserId(null);
+           o.setPartNo(null);
+           o.setBrotherPrice(null);
+           o.setSonPrice(null);
+           o.setAfterHitQuota(null);
+           o.setCreateTime(null);
+       });
+       partitionCrashMapper.insert(dbPartitionCrash);
+       // 测试 userId 不匹配
+       partitionCrashMapper.insert(cloneIgnoreId(dbPartitionCrash, o -> o.setUserId(null)));
+       // 测试 partNo 不匹配
+       partitionCrashMapper.insert(cloneIgnoreId(dbPartitionCrash, o -> o.setPartNo(null)));
+       // 测试 brotherPrice 不匹配
+       partitionCrashMapper.insert(cloneIgnoreId(dbPartitionCrash, o -> o.setBrotherPrice(null)));
+       // 测试 sonPrice 不匹配
+       partitionCrashMapper.insert(cloneIgnoreId(dbPartitionCrash, o -> o.setSonPrice(null)));
+       // 测试 afterHitQuota 不匹配
+       partitionCrashMapper.insert(cloneIgnoreId(dbPartitionCrash, o -> o.setAfterHitQuota(null)));
+       // 测试 createTime 不匹配
+       partitionCrashMapper.insert(cloneIgnoreId(dbPartitionCrash, o -> o.setCreateTime(null)));
+       // 准备参数
+       PartitionCrashPageReqVO reqVO = new PartitionCrashPageReqVO();
+       reqVO.setUserId(null);
+       reqVO.setPartNo(null);
+       reqVO.setBrotherPrice(null);
+       reqVO.setSonPrice(null);
+       reqVO.setAfterHitQuota(null);
+       reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+       // 调用
+       PageResult<PartitionCrashDO> pageResult = partitionCrashService.getPartitionCrashPage(reqVO);
+       // 断言
+       assertEquals(1, pageResult.getTotal());
+       assertEquals(1, pageResult.getList().size());
+       assertPojoEquals(dbPartitionCrash, 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);
+    }
+
+}

+ 1 - 1
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/permission/MenuServiceImpl.java

@@ -156,7 +156,7 @@ public class MenuServiceImpl implements MenuService {
             throw exception(MENU_PARENT_ERROR);
         }
 //        MenuDO menu = menuMapper.selectById(parentId);
-        MenuDO menu = menuMapper.selectOne(new LambdaQueryWrapperX<MenuDO>().eqIfPresent(MenuDO::getParentId,parentId)
+        MenuDO menu = menuMapper.selectOne(new LambdaQueryWrapperX<MenuDO>().eqIfPresent(MenuDO::getId,parentId)
                 .eqIfPresent(MenuDO::getCategoryId,categoryId));
         // 父菜单不存在
         if (menu == null) {