Browse Source

Merge branch 'dev/2024/0625/update-admin-Y' of feifan/mall-backend-admin into master

修改支付定时器
Yangzw 8 months ago
parent
commit
6a0fa078a6
35 changed files with 989 additions and 83 deletions
  1. 12 5
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/DailyBillController.java
  2. 29 12
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillPageReqVO.java
  3. 47 16
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillRespVO.java
  4. 35 14
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillSaveReqVO.java
  5. 28 9
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/dailybill/DailyBillDO.java
  6. 15 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/dailybill/DailyBillMapper.java
  7. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofit/PtProfitMapper.java
  8. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/order/TradeOrderConsumer.java
  9. 1 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillService.java
  10. 70 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillServiceImpl.java
  11. 21 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/MerchantDTO.java
  12. 63 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderDTO.java
  13. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderItemDTO.java
  14. 27 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  15. 80 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  16. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  17. 30 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/dailybill/DailyBillMapper.xml
  18. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  19. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
  20. 9 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java
  21. 15 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  22. 10 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java
  23. 22 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/consumer/order/OrderConsumer.java
  24. 11 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java
  25. 236 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  26. 107 3
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/wechat/WcChatMessageUtils.java
  27. 4 4
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml
  28. 7 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java
  29. 5 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java
  30. 25 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/order/TradeOrderProducer.java
  31. 10 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java
  32. 6 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserService.java
  33. 13 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserServiceImpl.java
  34. 6 6
      sql/mysql/建空库SQL/13_20240617.sql
  35. 13 2
      sql/mysql/建空库SQL/14_20240625.sql

+ 12 - 5
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/DailyBillController.java

@@ -8,7 +8,6 @@ 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.*;
@@ -75,8 +74,8 @@ public class DailyBillController {
     @Operation(summary = "获得每日账单分页")
     @PreAuthorize("@ss.hasPermission('distri:daily-bill:query')")
     public CommonResult<PageResult<DailyBillRespVO>> getDailyBillPage(@Valid DailyBillPageReqVO pageReqVO) {
-        PageResult<DailyBillDO> pageResult = dailyBillService.getDailyBillPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, DailyBillRespVO.class));
+        PageResult<DailyBillRespVO> pageResult = dailyBillService.getDailyBillPage(pageReqVO);
+        return success(pageResult);
     }
 
     @GetMapping("/export-excel")
@@ -86,10 +85,18 @@ public class DailyBillController {
     public void exportDailyBillExcel(@Valid DailyBillPageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<DailyBillDO> list = dailyBillService.getDailyBillPage(pageReqVO).getList();
+        List<DailyBillRespVO> list = dailyBillService.getDailyBillPage(pageReqVO).getList();
         // 导出 Excel
         ExcelUtils.write(response, "每日账单.xls", "数据", DailyBillRespVO.class,
-                        BeanUtils.toBean(list, DailyBillRespVO.class));
+                        list);
+    }
+
+    @GetMapping("/getMerchant")
+    @Operation(summary = "计算每日账单")
+    @PreAuthorize("@ss.hasPermission('distri:daily-bill:delete')")
+    public CommonResult<String> getMerchantDailyBill() {
+        dailyBillService.caleDailyBill();
+        return success("success");
     }
 
 }

+ 29 - 12
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillPageReqVO.java

@@ -1,7 +1,8 @@
 package cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo;
 
 import lombok.*;
-import java.util.*;
+
+import java.time.LocalDate;
 import io.swagger.v3.oas.annotations.media.Schema;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -15,26 +16,42 @@ import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR
 @ToString(callSuper = true)
 public class DailyBillPageReqVO extends PageParam {
 
-    @Schema(description = "金额,单位:分")
-    private Integer amount;
+    @Schema(description = "金额,单位:分", example = "30486")
+    private Long price;
 
-    @Schema(description = "确收金额,单位:分")
-    private Integer receivedAmount;
+    @Schema(description = "确收金额,单位:分", example = "29815")
+    private Long receivedPrice;
 
-    @Schema(description = "订单数,默认为0", example = "16252")
-    private Integer orderCount;
+    @Schema(description = "订单数,默认为0", example = "27164")
+    private Long orderCount;
 
-    @Schema(description = "店铺ID", example = "28751")
-    private Integer shopId;
+    @Schema(description = "店铺ID", example = "11867")
+    private Long shopId;
 
-    @Schema(description = "商户ID", example = "26719")
-    private Integer merchantId;
+    @Schema(description = "商户ID", example = "22961")
+    private Long merchantId;
 
-    @Schema(description = "订单ID列表")
+    @Schema(description = "订单ID列表,文本类型")
     private String orderIds;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "退款金额, 单位: 分", example = "11962")
+    private Long refundPrice;
+
+    @Schema(description = "积分")
+    private Long integral;
+
+    @Schema(description = "确收积分")
+    private Long receivedIntegral;
+
+    @Schema(description = "退款积分")
+    private Long refundIntegral;
+
+    @Schema(description = "订单所属日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] orderCalcTime;
+
 }

+ 47 - 16
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillRespVO.java

@@ -2,9 +2,8 @@ package cn.newfeifan.mall.module.distri.controller.admin.dailybill.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.LocalDate;
 import java.time.LocalDateTime;
 import com.alibaba.excel.annotation.*;
 
@@ -13,36 +12,68 @@ import com.alibaba.excel.annotation.*;
 @ExcelIgnoreUnannotated
 public class DailyBillRespVO {
 
-    @Schema(description = "账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17268")
+    @Schema(description = "账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27497")
     @ExcelProperty("账单编号")
     private Long id;
 
-    @Schema(description = "金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30486")
     @ExcelProperty("金额,单位:分")
-    private Integer amount;
+    private Long price;
 
-    @Schema(description = "确收金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "确收金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "29815")
     @ExcelProperty("确收金额,单位:分")
-    private Integer receivedAmount;
+    private Long receivedPrice;
 
-    @Schema(description = "订单数,默认为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "16252")
+    @Schema(description = "订单数,默认为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "27164")
     @ExcelProperty("订单数,默认为0")
-    private Integer orderCount;
+    private Long orderCount;
 
-    @Schema(description = "店铺ID", example = "28751")
+    @Schema(description = "店铺ID", example = "11867")
     @ExcelProperty("店铺ID")
-    private Integer shopId;
+    private Long shopId;
+
+    @Schema(description = "店铺名称")
+    @ExcelProperty("店铺名称")
+    private String shopName;
+
+    @Schema(description = "商户名称")
+    @ExcelProperty("商户名称")
+    private String merchantName;
 
-    @Schema(description = "商户ID", example = "26719")
+    @Schema(description = "商户ID", example = "22961")
     @ExcelProperty("商户ID")
-    private Integer merchantId;
+    private Long merchantId;
 
-    @Schema(description = "订单ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("订单ID列表")
+    @Schema(description = "订单ID列表,文本类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("订单ID列表,文本类型")
     private String orderIds;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "退款金额, 单位: 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "11962")
+    @ExcelProperty("退款金额, 单位: 分")
+    private Long refundPrice;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("积分")
+    private Long integral;
+
+    @Schema(description = "确收积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("确收积分")
+    private Long receivedIntegral;
+
+    @Schema(description = "退款积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("退款积分")
+    private Long refundIntegral;
+
+    @Schema(description = "订单所属日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("订单所属日期")
+    private LocalDate orderCalcTime;
+
+    public String getOrderCalcTime() {
+        return orderCalcTime.toString();
+    }
+
 }

+ 35 - 14
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/dailybill/vo/DailyBillSaveReqVO.java

@@ -2,36 +2,57 @@ package cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
-import java.util.*;
+
+import java.time.LocalDate;
 import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 每日账单新增/修改 Request VO")
 @Data
 public class DailyBillSaveReqVO {
 
-    @Schema(description = "账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17268")
+    @Schema(description = "账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27497")
     private Long id;
 
-    @Schema(description = "金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30486")
     @NotNull(message = "金额,单位:分不能为空")
-    private Integer amount;
+    private Long price;
 
-    @Schema(description = "确收金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "确收金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "29815")
     @NotNull(message = "确收金额,单位:分不能为空")
-    private Integer receivedAmount;
+    private Long receivedPrice;
 
-    @Schema(description = "订单数,默认为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "16252")
+    @Schema(description = "订单数,默认为0", requiredMode = Schema.RequiredMode.REQUIRED, example = "27164")
     @NotNull(message = "订单数,默认为0不能为空")
-    private Integer orderCount;
+    private Long orderCount;
 
-    @Schema(description = "店铺ID", example = "28751")
-    private Integer shopId;
+    @Schema(description = "店铺ID", example = "11867")
+    private Long shopId;
 
-    @Schema(description = "商户ID", example = "26719")
-    private Integer merchantId;
+    @Schema(description = "商户ID", example = "22961")
+    private Long merchantId;
 
-    @Schema(description = "订单ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotEmpty(message = "订单ID列表不能为空")
+    @Schema(description = "订单ID列表,文本类型", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "订单ID列表,文本类型不能为空")
     private String orderIds;
 
+    @Schema(description = "退款金额, 单位: 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "11962")
+    @NotNull(message = "退款金额, 单位: 分不能为空")
+    private Long refundPrice;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "积分不能为空")
+    private Long integral;
+
+    @Schema(description = "确收积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "确收积分不能为空")
+    private Long receivedIntegral;
+
+    @Schema(description = "退款积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "退款积分不能为空")
+    private Long refundIntegral;
+
+    @Schema(description = "订单所属日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "订单所属日期不能为空")
+    private LocalDate orderCalcTime;
+
 }

+ 28 - 9
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/dailybill/DailyBillDO.java

@@ -1,9 +1,8 @@
 package cn.newfeifan.mall.module.distri.dal.dataobject.dailybill;
 
 import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
+
+import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.*;
 import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
 
@@ -30,26 +29,46 @@ public class DailyBillDO extends BaseDO {
     /**
      * 金额,单位:分
      */
-    private Integer amount;
+    private Long price;
     /**
      * 确收金额,单位:分
      */
-    private Integer receivedAmount;
+    private Long receivedPrice;
     /**
      * 订单数,默认为0
      */
-    private Integer orderCount;
+    private Long orderCount;
     /**
      * 店铺ID
      */
-    private Integer shopId;
+    private Long shopId;
     /**
      * 商户ID
      */
-    private Integer merchantId;
+    private Long merchantId;
     /**
-     * 订单ID列表
+     * 订单ID列表,文本类型
      */
     private String orderIds;
+    /**
+     * 退款金额, 单位: 分
+     */
+    private Long refundPrice;
+    /**
+     * 积分
+     */
+    private Long integral;
+    /**
+     * 确收积分
+     */
+    private Long receivedIntegral;
+    /**
+     * 退款积分
+     */
+    private Long refundIntegral;
+    /**
+     * 订单所属日期
+     */
+    private LocalDate orderCalcTime;
 
 }

+ 15 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/dailybill/DailyBillMapper.java

@@ -5,9 +5,12 @@ 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.service.dailybill.dto.MerchantDTO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.dailybill.DailyBillDO;
+import cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO;
 import org.apache.ibatis.annotations.Mapper;
 import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.*;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 每日账单 Mapper
@@ -19,14 +22,24 @@ public interface DailyBillMapper extends BaseMapperX<DailyBillDO> {
 
     default PageResult<DailyBillDO> selectPage(DailyBillPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<DailyBillDO>()
-                .eqIfPresent(DailyBillDO::getAmount, reqVO.getAmount())
-                .eqIfPresent(DailyBillDO::getReceivedAmount, reqVO.getReceivedAmount())
+                .eqIfPresent(DailyBillDO::getPrice, reqVO.getPrice())
+                .eqIfPresent(DailyBillDO::getReceivedPrice, reqVO.getReceivedPrice())
                 .eqIfPresent(DailyBillDO::getOrderCount, reqVO.getOrderCount())
                 .eqIfPresent(DailyBillDO::getShopId, reqVO.getShopId())
                 .eqIfPresent(DailyBillDO::getMerchantId, reqVO.getMerchantId())
                 .eqIfPresent(DailyBillDO::getOrderIds, reqVO.getOrderIds())
                 .betweenIfPresent(DailyBillDO::getCreateTime, reqVO.getCreateTime())
+                .betweenIfPresent(DailyBillDO::getOrderCalcTime, reqVO.getOrderCalcTime())
                 .orderByDesc(DailyBillDO::getId));
     }
 
+    List<MerchantDTO> getMerchantDTO();
+
+    List<OrderDTO> getOrderDetailsByMerchantIdWithsShopId(@Param("merchantId") Long merchantId, @Param("shopId") Long shopId);
+
+    void updateOrderItemByOrderId(List<Long> orderIds);
+
+    String getMerchantName(Long merchantId);
+
+    String getShopName(Long shopId);
 }

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

@@ -8,6 +8,9 @@ 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.*;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 /**
  * 平台利润 Mapper
@@ -26,4 +29,14 @@ public interface PtProfitMapper extends BaseMapperX<PtProfitDO> {
                 .orderByDesc(PtProfitDO::getId));
     }
 
+    @Update("UPDATE distri_integral SET current_quota = current_quota + #{amount},freeze_quota = freeze_quota + #{freeze_mount} " +
+            "WHERE (current_quota + #{amount2})>=0 and user_id=#{userId} and (freeze_quota + #{freeze_mount2})>=0 ")
+    int updateUserIntegral(@Param("amount") Long amount,
+                           @Param("amount2") Long amount2,
+                           @Param("freeze_mount") Long freezeAmount,
+                           @Param("freeze_mount2") Long freezeAmount2,
+                           @Param("userId") Long userId);
+
+    @Select("SELECT current_quota,freeze_quota FROM distri_integral WHERE user_id = #{userId}")
+    Map<String, Object> selectUserIntegral(@Param("userId") Long userId);
 }

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/order/OrderConsumer.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/order/TradeOrderConsumer.java

@@ -12,7 +12,7 @@ import javax.annotation.Resource;
 
 @Component
 @Slf4j
-public class OrderConsumer {
+public class TradeOrderConsumer {
 
     @Resource
     private OrderCalcService orderCalcService;

+ 1 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillService.java

@@ -1,11 +1,9 @@
 package cn.newfeifan.mall.module.distri.service.dailybill;
 
-import java.util.*;
 import javax.validation.*;
 import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.dailybill.DailyBillDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
 
 /**
  * 每日账单 Service 接口
@@ -50,7 +48,7 @@ public interface DailyBillService {
      * @param pageReqVO 分页查询
      * @return 每日账单分页
      */
-    PageResult<DailyBillDO> getDailyBillPage(DailyBillPageReqVO pageReqVO);
+    PageResult<DailyBillRespVO> getDailyBillPage(DailyBillPageReqVO pageReqVO);
 
     /**
      * 计算每家店铺每日的订单

+ 70 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/DailyBillServiceImpl.java

@@ -1,10 +1,14 @@
 package cn.newfeifan.mall.module.distri.service.dailybill;
 
+import cn.newfeifan.mall.module.distri.service.dailybill.dto.MerchantDTO;
+import cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
-import java.util.*;
 import cn.newfeifan.mall.module.distri.controller.admin.dailybill.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.dailybill.DailyBillDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -12,6 +16,12 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.dailybill.DailyBillMapper;
 
+import java.time.LocalDate;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
@@ -65,12 +75,69 @@ public class DailyBillServiceImpl implements DailyBillService {
     }
 
     @Override
-    public PageResult<DailyBillDO> getDailyBillPage(DailyBillPageReqVO pageReqVO) {
-        return dailyBillMapper.selectPage(pageReqVO);
+    public PageResult<DailyBillRespVO> getDailyBillPage(DailyBillPageReqVO pageReqVO) {
+        PageResult<DailyBillDO> dailyBillDOPageResult = dailyBillMapper.selectPage(pageReqVO);
+        PageResult<DailyBillRespVO> result = BeanUtils.toBean(dailyBillDOPageResult, DailyBillRespVO.class);
+        for (DailyBillRespVO dailyBillRespVO : result.getList()) {
+            dailyBillRespVO.setMerchantName(dailyBillMapper.getMerchantName(dailyBillRespVO.getMerchantId()));
+            dailyBillRespVO.setShopName(dailyBillMapper.getShopName(dailyBillRespVO.getShopId()));
+        }
+        return result;
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void caleDailyBill() {
+        // 获取所有商户及旗下的店铺
+        List<MerchantDTO> merchantDTOS = dailyBillMapper.getMerchantDTO();
+
+        merchantDTOS.forEach(merchantDTO -> {
+            merchantDTO.getShopIds().forEach(shopId -> {
+                // 获取每个店铺的订单列表
+                List<OrderDTO> orderDetails = dailyBillMapper.getOrderDetailsByMerchantIdWithsShopId(merchantDTO.getMerchantId(), shopId);
+
+                // 使用Stream API和Collectors.groupingBy按照日期分组,并按时间倒序排序每个日期的Order列表
+                Map<LocalDate, List<OrderDTO>> ordersByDate = orderDetails.stream()
+                        .collect(Collectors.groupingBy(order -> order.getCreateTime().toLocalDate(),
+                                LinkedHashMap::new, // 保持插入顺序
+                                Collectors.toList()));
+
+                // 计算分组结果,并按订单创建时间倒序输出每个日期的订单
+                ordersByDate.forEach((date, orderList) -> {
+
+                    Long price = orderList.stream()
+                            .mapToLong(OrderDTO::getPayPrice)
+                            .sum();
+                    Long refundPrice = orderList.stream()
+                            .mapToLong(OrderDTO::getRefundPrice)
+                            .sum();
+                    Long integral = orderList.stream()
+                            .mapToLong(OrderDTO::getPayIntegral)
+                            .sum();
+                    Long refundIntegral = orderList.stream()
+                            .filter(order -> order.getRefundIntegral() != null)  // 过滤掉 getRefundIntegral 为空的订单
+                            .mapToLong(OrderDTO::getRefundIntegral)
+                            .sum();
+
+                    DailyBillDO dailyBillDO = DailyBillDO.builder()
+                            .price(price)
+                            .refundPrice(refundPrice)
+                            .receivedPrice(price - refundPrice)
+                            .integral(integral)
+                            .refundIntegral(refundIntegral)
+                            .receivedIntegral(integral - refundIntegral)
+                            .orderCount((long) orderList.size())
+                            .shopId(shopId)
+                            .merchantId(merchantDTO.getMerchantId())
+                            .orderIds(orderList.stream().map(OrderDTO::getId).collect(Collectors.toList()).toString())
+                            .orderCalcTime(date)
+                            .build();
+
+                    dailyBillMapper.insert(dailyBillDO);
+                    dailyBillMapper.updateOrderItemByOrderId(orderList.stream().map(OrderDTO::getId).collect(Collectors.toList()));
+                });
+            });
+        });
     }
 
 }

+ 21 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/MerchantDTO.java

@@ -0,0 +1,21 @@
+package cn.newfeifan.mall.module.distri.service.dailybill.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 商户信息
+ */
+@Data
+public class MerchantDTO {
+    /**
+     * 商户id
+     */
+    private Long merchantId;
+
+    /**
+     * 商户下面的店铺id
+     */
+    private List<Long> shopIds;
+}

+ 63 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderDTO.java

@@ -0,0 +1,63 @@
+package cn.newfeifan.mall.module.distri.service.dailybill.dto;
+
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OrderDTO extends BaseDO {
+    /**
+     * 订单编号,主键自增
+     */
+    private Long id;
+    /**
+     * 订单流水号
+     * <p>
+     * 例如说,1146347329394184195
+     */
+    private String no;
+    /**
+     * 购买的商品数量
+     */
+    private Integer productCount;
+    /**
+     * 商品原价,单位:分
+     * <p>
+     * <p>
+     * 对应 taobao 的 trade.total_fee 字段
+     */
+    private Integer totalPrice;
+    /**
+     * 运费金额,单位:分
+     */
+    private Integer deliveryPrice;
+
+    /**
+     * 应付金额(总),单位:分
+     */
+    private Integer payPrice;
+    // ========== 售后基本信息 ==========
+    /**
+     * 售后状态
+     */
+    private Integer refundStatus;
+    /**
+     * 退款金额,单位:分
+     */
+    private Integer refundPrice;
+    /**
+     * 支付积分
+     */
+    private Long payIntegral;
+    /**
+     * 退还的使用的积分
+     */
+    private Long refundIntegral;
+    /**
+     * 实付人民币,单位:分
+     */
+    private Integer payRmb;
+
+    private List<OrderItemDTO> items;
+}

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailybill/dto/OrderItemDTO.java

@@ -0,0 +1,4 @@
+package cn.newfeifan.mall.module.distri.service.dailybill.dto;
+
+public class OrderItemDTO {
+}

+ 27 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java

@@ -96,6 +96,17 @@ public interface IntegralService {
      */
     void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum, LocalDateTime payTime);
 
+    /**
+     * 修改用户身价
+     * @param generateUserId 导致产生积分变动的用户ID
+     * @param userId 身价变动类别
+     * @param caclEnum 变化类型
+     * @param totalFreezeHighQuota 冻结峰值
+     * @param tradeOrderId 订单ID
+     * @param orderNum 订单号
+     */
+    void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum);
+
     /**
      * 初始化累计积分峰值
      */
@@ -111,5 +122,21 @@ public interface IntegralService {
      */
     void updateUserIntegral(Long userId, CaclEnum caclEnum, Long payIntegral, Long tradeOrderId, String orderNum);
 
+    /**
+     * 修改用户积分
+     *
+     * @param generateUserId 导致产生积分变动的用户ID
+     * @param userId 要修改积分的用户
+     * @param caclEnum 导致积分变化的事件类型枚举
+     * @param amount 用户积分变化金额,可为负数
+     * @param freezeAmount 用户冻结积分变化金额,可为负数
+     * @return 返回是否执行成功。执行失败,通常是就是用户积分不足,没积分抵扣
+     */
+    Boolean updateUserIntegral(Long generateUserId,//导致产生积分变动的用户ID
+                               Long userId, CaclEnum caclEnum, Long amount, Long freezeAmount,
+                               Long tradeOrderId,
+                               String orderNum
+    );
+
     void calcIntegral();
 }

+ 80 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java

@@ -5,6 +5,7 @@ import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSave
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.PtProfitLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
 import cn.newfeifan.mall.module.distri.dal.mysql.ptprofitlog.PtProfitLogMapper;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
@@ -59,6 +60,9 @@ public class IntegralServiceImpl implements IntegralService {
     @Resource
     private PtProfitService ptProfitService;
 
+    @Resource
+    private PtProfitMapper ptProfitMapper;
+
     @Override
     public Long createIntegral(IntegralSaveReqVO createReqVO) {
         // 插入
@@ -177,6 +181,25 @@ public class IntegralServiceImpl implements IntegralService {
         }
     }
 
+    @Override
+    public void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum) {
+        IntegralDO integralDO = integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, userId));
+        integralDO.setFreezeHighQuota(integralDO.getFreezeHighQuota() + totalFreezeHighQuota);
+        integralMapper.updateById(integralDO);
+
+        //记录用户的积分变动日志
+        PtProfitLogSaveReqVO profitLogSaveReqVO = PtProfitLogSaveReqVO.builder()
+                .freezeHighQuota(totalFreezeHighQuota)
+                .afterFreezeHighQuota(integralDO.getFreezeHighQuota())
+                .userId(userId)
+                .generateUserId(generateUserId)
+                .profitStatus(caclEnum.getType())
+                .orderId(tradeOrderId)
+                .orderNo(orderNum)
+                .build();
+        ptProfitLogService.createPtProfitLog(profitLogSaveReqVO);
+    }
+
     @Override
     public void initializeIntegralHighQuotaTotal() {
         List<IntegralDO> integralDOS = integralMapper.selectList();
@@ -207,6 +230,63 @@ public class IntegralServiceImpl implements IntegralService {
         ptProfitLogService.addMessage(userId,userId,caclEnum,payIntegral,integralDO.getCurrentQuota(),0L,0L,null,tradeOrderId,orderNum);
     }
 
+    /**
+     * add by Ben
+     * 修改用户积分
+     *
+     * @param generateUserId 要修改积分的用户
+     * @param userId 要修改积分的用户
+     * @param caclEnum 导致积分变化的事件类型枚举
+     * @param amount 用户可用积分变化金额,可为负数
+     * @param freezeAmount 用户冻结积分变化金额,可为负数
+     * @return 返回是否执行成功。执行失败,通常是就是用户积分不足,没积分抵扣
+     */
+    @Override
+    public Boolean updateUserIntegral(Long generateUserId,//导致产生积分变动的用户ID
+                                      Long userId, CaclEnum caclEnum, Long amount, Long freezeAmount,
+                                      Long tradeOrderId,
+                                      String OrderNum
+    ) {
+        Boolean success = null;
+
+        //修改用户积分钱包的积分
+        int effectRowNum = ptProfitMapper.updateUserIntegral(amount,amount,freezeAmount,freezeAmount,userId);
+
+        if (effectRowNum==1) {//如果成功修改积分记录
+            success = true;
+
+            //用户修改后的当前可用的钱包余额
+            Long afterAmount = null;
+            //用户修改后的冻结积分钱包余额
+            Long afterFreezeAmount = null;
+
+            //查询用户修改后的积分
+            Map<String, Object> map = ptProfitMapper.selectUserIntegral(userId);
+            Object currentQuotaObj = map.get("current_quota");
+            Object freezeQuotaObj = map.get("freeze_quota");
+
+            afterAmount = (Long)currentQuotaObj;
+            afterFreezeAmount = (Long)freezeQuotaObj;
+
+            if(afterAmount<0||afterFreezeAmount<0){
+                throw new RuntimeException("用户钱包为负数:用户IO为"+userId+"的用户可用钱包为"+afterAmount+",冻结钱包为"+afterFreezeAmount);
+            }
+
+            //记录用户的积分变动日志
+            ptProfitLogService.addMessage(generateUserId,//导致产生积分变动的用户ID
+                    userId, caclEnum, amount, afterAmount,
+                    freezeAmount, afterFreezeAmount,null,tradeOrderId,OrderNum);
+
+        }else if(effectRowNum<1){//如果钱包积分不足,不够抵扣
+            success = false;
+        } else if (effectRowNum>1) {
+//            success = false;
+            throw new RuntimeException("用户IO为"+userId+"的用户钱包不只一个!");
+        }
+
+        return success;
+    }
+
     @Override
     public void calcIntegral() {
         List<PtProfitLogDO> ptProfitLogDOS = ptProfitLogService.calcIntegral();

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

@@ -177,7 +177,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             dailyAwardRecordsService.transitionBonus();
 
             // 计算每家店铺每日订单
-            dailyBillService.caleDailyBill();
+//            dailyBillService.caleDailyBill();
 
             System.out.println("=================计算程序结束====================");
         }
@@ -216,7 +216,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
                 BigDecimal oneGrossProfit = onePrice.subtract(oneCostPrice).multiply(productCount);
                 profit[0] = profit[0].add(oneGrossProfit);  // 注意这里的改动
                 profit[1] = profit[1].add(new BigDecimal(j.getIncreaseIntegral()));     //自得积分
-                profit[2] = profit[2].add(new BigDecimal(j.getAncestorIncreaseIntegral()));     //自得积分
+                profit[2] = profit[2].add(new BigDecimal(j.getAncestorIncreaseIntegral()));     //直推奖积分
 
                 // 参与过订单计算后就标记为已分配权益
                 updateOrderItemTransitionTime(j.getOrderItemId());

+ 30 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/dailybill/DailyBillMapper.xml

@@ -8,5 +8,35 @@
         代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
         文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
      -->
+    <resultMap id="MerchantDTOResultMap" type="cn.newfeifan.mall.module.distri.service.dailybill.dto.MerchantDTO">
+        <id property="merchantId" column="merchantId" />
+        <collection property="shopIds" ofType="long" column="merchantId" select="selectShopIdsByMerchantId" />
+    </resultMap>
+    <update id="updateOrderItemByOrderId">
+        update trade_order_item set computation_bill = 1 where order_id in
+        <foreach collection="list" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+    </update>
 
+    <select id="getMerchantDTO" resultMap="MerchantDTOResultMap">
+        SELECT id AS merchantId FROM sale_merchant
+    </select>
+
+    <select id="selectShopIdsByMerchantId" resultType="long">
+        SELECT id FROM sale_shop WHERE merchant_id = #{merchantId}
+    </select>
+    <select id="getOrderDetailsByMerchantIdWithsShopId"
+            resultType="cn.newfeifan.mall.module.distri.service.dailybill.dto.OrderDTO">
+        select o.id,o.no,o.product_count,o.delivery_price,o.pay_price,o.refund_status,o.refund_price,o.pay_integral,o.refund_integral,
+               o.pay_rmb,o.create_time from trade_order o
+               join trade_order_item item on item.order_id = o.id
+        where shop_id = #{shopId} and merchant_id = #{merchantId} and pay_status = 1 and date(o.create_time) &lt; date(now()) and item.computation_bill = 0
+    </select>
+    <select id="getMerchantName" resultType="java.lang.String">
+        select name from sale_merchant where id = #{merchantId}
+    </select>
+    <select id="getShopName" resultType="java.lang.String">
+        select name from sale_shop where id = #{shopId}
+    </select>
 </mapper>

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java

@@ -325,6 +325,7 @@ public class TradeOrderController {
 
     @GetMapping("/startCalc")
     @Operation(summary = "计算启动")
+    @PreAuthorize("@ss.hasPermission('trade:order:delete')")
     public CommonResult<String> startCalc() {
         //发货七天前订单
         List<DistriOrderMessage> appTradeOrderDetailRespVos = tradeOrderQueryService.queryAllOrder();
@@ -348,5 +349,13 @@ public class TradeOrderController {
 //        return success("success");
 //    }
 
+    @GetMapping("/initializationOrderItem")
+    @Operation(summary = "初始化订单详情中的成本价和推广费")
+    @PreAuthorize("@ss.hasPermission('trade:order:delete')")
+    public CommonResult<String> initializationOrderItem() {
+        tradeOrderUpdateService.initializationOrderItem();
+
+        return success("success");
+    }
 
 }

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java

@@ -156,4 +156,7 @@ public class TradeOrderBaseVO {
 
     @Schema(description = "售后状态", example = "0")
     private Integer refundStatus;
+
+    @Schema(description = "支付积分")
+    private Long payIntegral;
 }

+ 9 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java

@@ -9,10 +9,11 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 
-import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.*;
 
 @Schema(description = "管理后台 - 交易订单的分页 Request VO")
 @Data
@@ -97,4 +98,11 @@ public class TradeOrderPageReqVO extends PageParam {
     @Schema(description = "发货信息附件")
     private String attachment;
 
+    @Schema(description = "订单账单日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate orderCalcTime;
+
+    @Schema(description = "支付状态")
+    private Integer payStatus;
+
 }

+ 15 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java

@@ -164,13 +164,28 @@ public class TradeOrderItemDO extends BaseDO {
       */
     private Long ancestorIncreaseIntegral;
 
+    //用户获得积分
+    private Long increaseIntegral;
+
     /**
      * 用户获得冻结最大可用额度
      */
     private Long freezeHighQuota;
 
+    /**
+     * 高精度价格
+     */
     private BigDecimal highPrecisionPrice;
 
+    /**
+     * 推广费, 单位: 分
+     */
+    private Integer promotionFee;
+    /**
+     * 成本价,单位: 分
+     */
+    private Integer costPrice;
+
 
     /**
      * 商品属性

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

@@ -13,6 +13,7 @@ import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -45,6 +46,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eqIfPresent(TradeOrderDO::getShopId, reqVO.getShopId())
                 .inIfPresent(TradeOrderDO::getShopId, reqVO.getShopIds())
                 .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
+                .inIfPresent(TradeOrderDO::getPayStatus, reqVO.getPayStatus())
                 .likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
                 .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(TradeOrderDO::getId);
@@ -54,6 +56,10 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
             queryWrapper.eqIfPresent(TradeOrderDO::getStatus, reqVO.getStatus());
             queryWrapper.ne(TradeOrderDO::getRefundStatus, TradeOrderRefundStatusEnum.ALL.getStatus());
         }
+
+        if(reqVO.getOrderCalcTime() != null){
+            queryWrapper.apply("date(create_time) = {0}", reqVO.getOrderCalcTime());
+        }
         return selectPage(reqVO, queryWrapper);
     }
 
@@ -197,4 +203,8 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
         );
     }
+
+    //add by Ben 20240604
+    @Select("SELECT ancestor FROM `distri_share_path` where descendant = #{userId} and depth=1")
+    Long selectAncesterByMemberUserId(@Param("userId") Long userId);
 }

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

@@ -0,0 +1,22 @@
+package cn.newfeifan.mall.module.trade.mq.consumer.order;
+
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class OrderConsumer {
+
+    @Resource
+    private TradeOrderUpdateService tradeOrderUpdateService;
+
+    @EventListener
+    public void onMessage(Long payOrderId) {
+        //修改订单状态,并计算权益
+        tradeOrderUpdateService.updateOrderPaid(payOrderId);
+    }
+}

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

@@ -209,4 +209,15 @@ public interface TradeOrderUpdateService {
      * 手动启动计算已支付的订单项的冻结峰值
      */
     void updateOrderItemByFreezeHighQuota();
+
+    /**
+     * 初始化订单项的冻结峰值
+     */
+    void initializationOrderItem();
+
+    /**
+     *  修改订单状态
+     * @param payOrderId 支付订单id
+     */
+    void updateOrderPaid(Long payOrderId);
 }

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

@@ -12,10 +12,13 @@ import cn.newfeifan.mall.framework.common.enums.UserTypeEnum;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
 import cn.newfeifan.mall.module.distri.constant.DistriConstants;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
+import cn.newfeifan.mall.module.distri.dal.mysql.orderpercentage.OrderPercentageMapper;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
 import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
 import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderRespDTO;
@@ -24,6 +27,7 @@ import cn.newfeifan.mall.module.product.api.comment.ProductCommentApi;
 import cn.newfeifan.mall.module.product.api.comment.dto.ProductCommentCreateReqDTO;
 import cn.newfeifan.mall.module.product.dal.dataobject.sku.ProductSkuDO;
 import cn.newfeifan.mall.module.product.dal.mysql.sku.ProductSkuMapper;
+import cn.newfeifan.mall.module.system.service.user.AdminUserService;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO;
@@ -57,6 +61,7 @@ import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
 import cn.newfeifan.mall.module.trade.utils.wechat.WcChatMessageUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import com.kuaidi100.sdk.api.Subscribe;
@@ -75,9 +80,11 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.DecimalFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 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.util.collection.CollectionUtils.*;
@@ -136,6 +143,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private ProductSkuMapper productSkuMapper;
 
+    @Resource
+    private OrderPercentageMapper orderPercentageMapper;
+
+    @Resource
+    private MemberUserService memberUserService;
+
+    @Resource
+    private AdminUserService adminUserService;
+
     // =================== Order ===================
 
     @Override
@@ -1038,6 +1054,225 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         }
     }
 
+    @Override
+    public void initializationOrderItem() {
+        List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectList();
+        for (TradeOrderItemDO tradeOrderItemDO : tradeOrderItemDOS) {
+            ProductSkuDO productSkuDO = productSkuMapper.selectById(tradeOrderItemDO.getSkuId());
+            tradeOrderItemDO.setCostPrice(productSkuDO.getCostPrice());
+            tradeOrderItemDO.setPromotionFee(productSkuDO.getPromotionFee());
+
+            tradeOrderItemMapper.updateById(tradeOrderItemDO);
+        }
+    }
+
+    @Override
+    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_PAY)
+    @Transactional(rollbackFor = Exception.class)
+    public void updateOrderPaid(Long payOrderId) {
+        //查询订单提成比例
+        QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
+        OrderPercentageDO orderPercentageDO = orderPercentageMapper.selectOne(queryWrapper);//表中只有一条记录
+
+        /*
+         * 毛利 = 成本 * 0.38... (推广费用)
+         */
+        String grossProfitPerc = orderPercentageDO.getGrossProfitPerc();
+
+        /*
+         * 购物本人自得 百分比
+         */
+        String grossProfitUserQuotaPerc = orderPercentageDO.getGrossProfitUserQuotaPerc();
+
+        /*
+         * 推荐人(上一级) 百分比
+         */
+        String grossProfitAncestorQuotaPerc = orderPercentageDO.getGrossProfitAncestorQuotaPerc();
+
+        //add by Ben 根据支付订单id,查询所有 支付订单 对应的 订单
+        List<TradeOrderDO> TradeOrderDOList = tradeOrderMapper.selectList("pay_order_id", payOrderId);
+
+        //购物者ID
+        Long memberUserIdOfTradeOrder = TradeOrderDOList.get(0).getUserId();
+        //20240604 推荐人(上级用户ID)
+        Long ancesterUserId = tradeOrderMapper.selectAncesterByMemberUserId(memberUserIdOfTradeOrder);
+
+        for (TradeOrderDO tradeOrderDO : TradeOrderDOList) {
+
+            Long tradeOrderId = tradeOrderDO.getId();
+
+//            System.out.println("#########updateOrderPaid####tradeOrderId:"+tradeOrderId);
+
+            // 1. 校验并获得交易订单(可支付)
+            KeyValue<TradeOrderDO, PayOrderRespDTO> orderResult = validateOrderPayable(tradeOrderId, payOrderId);
+
+            TradeOrderDO order = orderResult.getKey();
+            PayOrderRespDTO payOrder = orderResult.getValue();
+
+            // 2. 更新 TradeOrderDO 状态为已支付,等待发货
+            int updateCount = tradeOrderMapper.updateByIdAndStatus(tradeOrderId, order.getStatus(),
+                    new TradeOrderDO().setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus()).setPayStatus(true)
+                            .setPayTime(LocalDateTime.now()).setPayChannelCode(payOrder.getChannelCode()));
+
+//            System.out.println("#########updateOrderPaid####updateCount:"+updateCount);
+
+            if (updateCount == 0) {
+                throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
+            }
+
+            //注释 by Ben ,下面是系统原来的营销部分,和我们业务对不上,注释掉
+            // 3. 执行 TradeOrderHandler 的后置处理
+//            List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(tradeOrderId);
+
+            //注释 by Ben ,下面是系统原来的营销部分,和我们业务对不上,注释掉
+//            tradeOrderHandlers.forEach(handler -> handler.afterPayOrder(order, orderItems));
+
+            // 4. 记录订单日志
+            TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus());
+            TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue());
+
+
+            // 5. 增加用户冻结积分 20240420
+
+
+            List<Long> skuList = new ArrayList<>();
+            //汇总各订单项利润
+            List<TradeOrderItemDO> TradeOrderItemList = tradeOrderItemMapper.selectList("order_id", order.getId());
+            for (TradeOrderItemDO tradeOrderItemDO : TradeOrderItemList) {
+                Long skuId = tradeOrderItemDO.getSkuId();
+                skuList.add(skuId);
+            }
+
+            List<ProductSkuDO> productSkuDOS = productSkuMapper.selectBatchIds(skuList);
+            Map<Long, ProductSkuDO> skuDOMap = new HashMap<>();
+            for (ProductSkuDO productSkuDO : productSkuDOS) {
+                skuDOMap.put(productSkuDO.getId(), productSkuDO);
+            }
+
+            Long totalFreezeAmount = 0L;//用户总的冻结积分
+
+            Long totalAncestorFreezeAmount = 0L;//推荐人总的冻结积分
+
+            Long totalFreezeHighQuota = 0L;//冻结峰值
+
+            for (TradeOrderItemDO tradeOrderItemDO : TradeOrderItemList) {
+                ProductSkuDO productSkuDO = skuDOMap.get(tradeOrderItemDO.getSkuId());
+                //这类商品的总推广费
+                Integer promotionExpenses = (productSkuDO.getPrice() - productSkuDO.getCostPrice())
+                        * tradeOrderItemDO.getCount();
+
+                //把商品项的推广费,转换为这项商品直推人获得的冻结积分
+                Long itemFreezeAmount =
+                        promotionExpenses2GrossProfitAncestorQuota(promotionExpenses,
+                                grossProfitPerc,//毛利 = 成本 * 0.38... (推广费用)
+                                grossProfitUserQuotaPerc//消费者自得额度 百分比
+                        );
+
+
+                //把商品项的推广费,转换为这项商品推荐人(上级)获得的冻结积分
+                Long ancestorItemFreezeAmount =
+                        promotionExpenses2GrossProfitAncestorQuota(promotionExpenses,
+                                grossProfitPerc,//毛利 = 成本 * 0.38... (推广费用)
+                                grossProfitAncestorQuotaPerc//消费者自得额度 百分比
+                        );
+
+                //峰值为毛利的十倍
+                BigDecimal grossProfit = new BigDecimal(promotionExpenses).multiply(new BigDecimal(grossProfitPerc)).setScale(4, RoundingMode.DOWN);
+                BigDecimal freezeHighQuota = grossProfit.multiply(new BigDecimal("10"));
+                freezeHighQuota = money2Integral(freezeHighQuota);
+                Long freezeHighQuotaInt = freezeHighQuota.longValue();
+
+                totalFreezeAmount += itemFreezeAmount;
+                totalAncestorFreezeAmount += ancestorItemFreezeAmount;
+                totalFreezeHighQuota += freezeHighQuotaInt;
+
+                //记录用户在此订单项获得的冻结积分
+                TradeOrderItemDO toid = new TradeOrderItemDO();
+                toid.setId(tradeOrderItemDO.getId());
+                toid.setIncreaseIntegral(itemFreezeAmount);
+                toid.setAncestorIncreaseIntegral(ancestorItemFreezeAmount);//20240504 add by Ben
+                toid.setFreezeHighQuota(freezeHighQuotaInt);
+                tradeOrderItemMapper.updateById(toid);
+            }
+
+            //把商品的推广费总额,转换为直推人获得的冻结积分
+//            Integer freezeAmount = promotionExpenses2GrossProfitAncestorQuota(orderPercentageMapper,totalPromotionExpenses);
+
+            String OrderNum = order.getNo();
+            //修改购物者本人获得的冻结积分
+            integralService.updateUserIntegral(tradeOrderDO.getUserId(), tradeOrderDO.getUserId(), CaclEnum.ORDER_PAY_INTEGRAL_CONSUMER, 0L, totalFreezeAmount, tradeOrderId, OrderNum);
+
+            //修改推荐人(上级)获得的冻结积分
+            integralService.updateUserIntegral(tradeOrderDO.getUserId(), ancesterUserId, CaclEnum.ORDER_PAY_INTEGRAL_ANCESTER, 0L, totalAncestorFreezeAmount, tradeOrderId, OrderNum);
+
+            //修改购物者本人获得的冻结峰值
+            integralService.updateIntegralFreezeHighQuota(tradeOrderDO.getUserId(), tradeOrderDO.getUserId(),CaclEnum.ORDER_PAY_FREEZE_HIGH_QUOTA,totalFreezeHighQuota,tradeOrderId,OrderNum);
+            log.warn("[TradeOrderUpdateServiceImpl.updateOrderPaid]$$$:[tradeOrderId({}),ancesterUserId({}),totalAncestorFreezeAmount({})]" + new Date(),
+                    tradeOrderId, ancesterUserId, totalAncestorFreezeAmount);
+
+            // 发送给微信消息给系统用户待发货消息
+            sentWcChatMessage(order);
+        }
+    }
+
+    private void sentWcChatMessage(TradeOrderDO order) {
+        List<String> params = new ArrayList<>();
+        DecimalFormat df = new DecimalFormat("0.00");
+        String formattedPrice = df.format((double) order.getPayPrice() / 100);
+
+        params.add("¥ " + formattedPrice);
+        params.add(order.getNo());
+        params.add(memberUserService.getUser(order.getUserId()).getNickname());
+
+        List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectListByOrderId(order.getId());
+        List<String> productNames = tradeOrderItemDOS.stream().map(TradeOrderItemDO::getSpuName).collect(Collectors.toList());
+        String name = productNames.toString();
+
+        // 去除首尾的括号,并去除空格
+        name = name.substring(1, name.length() - 1).trim();
+
+        params.add(name);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        params.add(LocalDateTime.now().format(formatter));
+
+        List<Long> adminUsers = adminUserService.getUserIdsByShop(order.getShopId());
+        for (Long aUserId : adminUsers) {
+            //发送信息
+            wcChatMessageUtils.sendWcChatMessage(WcChatMessageTemplateIdEnum.ORDER_NO_DELIVERY2.getTemplateId(),
+                    params, aUserId, order.getId());
+        }
+    }
+
+    public static Long promotionExpenses2GrossProfitAncestorQuota(
+            /*
+            商品的推广费总额
+             */
+            Integer promotionExpenses,
+            /*
+             * 毛利 = 成本 * 0.38... (推广费用)
+             */
+            String grossProfitPerc,
+            /*
+             * 推广-推荐人/消费者本人额度 百分比
+             */
+            String grossProfitAncestorQuotaPerc
+    ) {
+
+        //转为BigDecimal
+        BigDecimal profit = new BigDecimal(String.valueOf(promotionExpenses));
+
+        // 计算毛利: 利润 * 0.38
+        BigDecimal grossProfit = profit.multiply(new BigDecimal(grossProfitPerc)).setScale(4, RoundingMode.DOWN);
+
+        // 计算直推人额度: 毛利 * 0.35
+        BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(grossProfitAncestorQuotaPerc)).setScale(4, RoundingMode.DOWN);
+
+        //把钱转为:增加的冻结积分
+        BigDecimal freezeAmount_bigDecimal = money2Integral(descendantQuota);
+
+        return freezeAmount_bigDecimal.longValue();
+    }
+
     public static BigDecimal money2Integral(BigDecimal money) {
         return money.multiply(DistriConstants.MONEY2INTEGRAL_BIG_DECIMAL);
     }
@@ -1104,4 +1339,5 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         return SpringUtil.getBean(getClass());
     }
 
+
 }

+ 107 - 3
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/wechat/WcChatMessageUtils.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 import cn.newfeifan.mall.module.member.service.user.MemberUserService;
 import cn.newfeifan.mall.module.system.dal.dataobject.config.SystemConfigDO;
 import cn.newfeifan.mall.module.system.dal.dataobject.wechatmsgtemplate.WechatMsgTemplateDO;
@@ -24,9 +25,7 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.Arrays;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 
 import static cn.newfeifan.mall.module.system.constant.SystemConstants.WX_TICK_KEY_APPID;
 import static cn.newfeifan.mall.module.trade.enums.MessageTemplateConstants.AFTER_SALE_NO_CHECK_List;
@@ -203,6 +202,107 @@ public class WcChatMessageUtils {
         sendWxgMessage(userId, templateData, templateId, systemUserId, memberUserId, objectId);
     }
 
+    /**
+     * 发送微信信息
+     *
+     * @param templateId   自定义消息模板id
+     * @param params       消息参数
+     * @param systemUserId 系统用户id
+     * @param objectId     对象id
+     */
+    public void sendWcChatMessage(String templateId, List<String> params, Long systemUserId, Long objectId) {
+        WechatMsgTemplateDO template = getTemplateId(templateId);
+        String messageTemplateParameters = template.getMessageTemplateParameters();
+
+        // 去除首尾的括号,并去除空格
+        messageTemplateParameters = messageTemplateParameters.substring(1, messageTemplateParameters.length() - 1).trim();
+
+        // 使用逗号分割字符串,并去除空格
+        String[] parts = messageTemplateParameters.split(",\\s*");
+
+        // 创建集合并将数组转换为集合
+        List<String> dataParams = Arrays.asList(parts);
+        JsonObject templateData = getTemplateData(dataParams, params);
+
+        // 组装消息内容
+        String userOpenId;
+        // 判断系统用户是否有接收消息的权限
+        if (!isHavePermission(systemUserId, templateId)) {
+            return;
+        }
+
+        // 获取系统用户绑定的会员用户集
+        Map<String, Long> openMap = new HashMap<>();
+        List<MemberUserDO> memberUserDOS = getMemberUserBySystemUserId(systemUserId);
+        for (MemberUserDO memberUserDO : memberUserDOS) {
+            userOpenId = getOpenId(memberUserDO.getId());
+
+            //如果用户没有绑定微信,则不发送消息
+            if (userOpenId == null) {
+                continue;
+            }
+
+            openMap.put(userOpenId, memberUserDO.getId());
+        }
+
+        openMap.forEach((k, v) -> sendWxgMessage(v, templateData, templateId, systemUserId, objectId, k));
+    }
+
+    /**
+     * 发送微信消息
+     *
+     * @param userId 接口消息的用户id
+     * @param data   模板参数
+     */
+    private void sendWxgMessage(Long userId, JsonObject data, String wechatMsgTemplateId, Long systemUserId, Long objectId, String userOpenId) {
+        String templateId = getTemplateId(wechatMsgTemplateId).getWechatMsgTemplateId(); // 模板id
+        String url = getDoMain(wechatMsgTemplateId, objectId);       // 跳转路径(小程序之外)
+        String client_msg_id = UUID.randomUUID().toString();  // 防重入id
+
+
+        WeChatTemplateMessage message = new WeChatTemplateMessage();
+        message.setTouser(userOpenId);
+        message.setTemplate_id(templateId);
+        message.setUrl(url);
+        message.setClient_msg_id(client_msg_id);
+        message.setData(data);
+
+        sendWecChatMessage(userId, wechatMsgTemplateId, systemUserId, objectId, userOpenId, message,1);
+    }
+
+    private void sendWecChatMessage(Long userId, String wechatMsgTemplateId, Long systemUserId, Long objectId, String userOpenId, WeChatTemplateMessage message, int maxRetries) {
+        // 发送消息
+        String returnMsg = HttpUtil.post(StrUtil.format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}", getAccessToken()), message.toString());
+        cn.hutool.json.JSONObject jsonObject2 = JSONUtil.parseObj(returnMsg);
+        String errmsg = jsonObject2.getStr("errmsg");
+
+        //记录发送的微信消息
+        MessageLogSaveReqVO messageLogSaveReqVO = MessageLogSaveReqVO.builder()
+                .openid(userOpenId)
+                .memberUserId(userId)
+                .systemUserId(systemUserId)
+                .wechatMsgTemplateId(Long.valueOf(wechatMsgTemplateId))
+                .wechatMsgTemplateParams(message.toString())
+                .objectId(objectId)
+                .sendStatus(true)
+                .sendTime(LocalDateTime.now())
+                .responseResult(returnMsg)
+                .build();
+        if (!StrUtil.equals("ok", errmsg)) {
+            log.info("=====消息发送失败,原因:{}", errmsg);
+            messageLogSaveReqVO.setSendStatus(false);
+        }
+
+        messageLogService.createMessageLog(messageLogSaveReqVO);
+
+        // 如果微信的accessToken失效,则重新获取,最多重试3次
+        if (jsonObject2.getStr("errcode").equals("40001") && maxRetries <= 3) {
+            maxRetries++;
+            stringRedisTemplate.delete(WX_TICK_KEY_APPID);
+            sendWecChatMessage(userId, wechatMsgTemplateId, systemUserId, objectId, userOpenId, message, maxRetries);
+        }
+    }
+
     /**
      * 判断用户是否有接收者调消息的权限
      *
@@ -266,4 +366,8 @@ public class WcChatMessageUtils {
         }
         return getOpenId(memberUserId);
     }
+
+    private List<MemberUserDO> getMemberUserBySystemUserId(Long systemUserId) {
+        return memberUserService.getUserListBySystemUserId(systemUserId);
+    }
 }

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

@@ -22,8 +22,8 @@
 <!--    参与 冻结转可用的订单计算-->
     <select id="queryAllOrder" resultMap="BaseResultMap">
         select tor.total_price as totalPrice,
-               ps.cost_price as costPrice,
-               ps.price as price,
+               toi.cost_price as costPrice,
+               toi.price as price,
                tor.product_count as productCount,
                tor.`no` as `no`,
                tor.id as orderId,
@@ -57,8 +57,8 @@
 <!--    参与合赢奖的订单-->
     <select id="queryDailyOrder" resultMap="BaseResultMap">
         select tor.total_price as totalPrice,
-               ps.cost_price as costPrice,
-               ps.price as price,
+               toi.cost_price as costPrice,
+               toi.price as price,
                tor.product_count as productCount,
                tor.`no` as `no`,
                tor.id as orderId,

+ 7 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java

@@ -199,4 +199,11 @@ public interface MemberUserService {
 
 
     Long getUserIdBySystemUserId(Long systemUserId);
+
+    /**
+     * 根据系统用户ID查询用户
+     * @param systemUserId 系统用户ID
+     * @return 用户
+     */
+    List<MemberUserDO> getUserListBySystemUserId(Long systemUserId);
 }

+ 5 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java

@@ -340,4 +340,9 @@ public class MemberUserServiceImpl implements MemberUserService {
         return memberUserDO == null ? null : memberUserDO.getId();
     }
 
+    @Override
+    public List<MemberUserDO> getUserListBySystemUserId(Long systemUserId) {
+        return memberUserMapper.selectList(MemberUserDO::getSystemUsersId, systemUserId);
+    }
+
 }

+ 25 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/order/TradeOrderProducer.java

@@ -0,0 +1,25 @@
+package cn.newfeifan.mall.module.pay.order;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+public class TradeOrderProducer {
+    @Resource
+    private ApplicationContext applicationContext;
+
+
+    /**
+     * 发送订单消息
+     *
+     * @param payOrderId 支付订单id
+     */
+    public void sendTradeOrderMessage(Long payOrderId) {
+        applicationContext.publishEvent(payOrderId);
+    }
+
+}

+ 10 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

@@ -28,6 +28,7 @@ import cn.newfeifan.mall.module.pay.dal.redis.no.PayNoRedisDAO;
 import cn.newfeifan.mall.module.pay.enums.notify.PayNotifyTypeEnum;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
 import cn.newfeifan.mall.module.pay.framework.pay.config.PayProperties;
+import cn.newfeifan.mall.module.pay.order.TradeOrderProducer;
 import cn.newfeifan.mall.module.pay.service.app.PayAppService;
 import cn.newfeifan.mall.module.pay.service.channel.PayChannelService;
 import cn.newfeifan.mall.module.pay.service.notify.PayNotifyService;
@@ -76,6 +77,9 @@ public class PayOrderServiceImpl implements PayOrderService {
     @Resource
     private PayNotifyService notifyService;
 
+    @Resource
+    private TradeOrderProducer tradeOrderProducer;
+
     @Override
     public PayOrderDO getOrder(Long id) {
         return orderMapper.selectById(id);
@@ -359,6 +363,12 @@ public class PayOrderServiceImpl implements PayOrderService {
         if (updateCounts == 0) { // 校验状态,必须是待支付
             throw exception(PAY_ORDER_STATUS_IS_NOT_WAITING);
         }
+        PayOrderDO payOrderDO = orderMapper.selectById(order.getId());
+        System.out.println(payOrderDO.getStatus());
+
+        //如果确实是漏了订单未支付成功,那就补充回来
+        tradeOrderProducer.sendTradeOrderMessage(order.getId());
+
         log.info("[updateOrderExtensionSuccess][order({}) 更新为已支付]", order.getId());
         return false;
     }

+ 6 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserService.java

@@ -217,4 +217,10 @@ public interface AdminUserService {
     void createUserByMobile(Long merId, Long shopId, String contactMobile, String contactName);
 
 
+    /**
+     * 通过店铺查询用户编号
+     * @param shopId 店铺id
+     * @return 用户编号
+     */
+    List<Long> getUserIdsByShop(Long shopId);
 }

+ 13 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserServiceImpl.java

@@ -44,6 +44,7 @@ import javax.annotation.Resource;
 import java.io.InputStream;
 import java.time.LocalDateTime;
 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.util.collection.CollectionUtils.convertList;
@@ -486,6 +487,7 @@ public class AdminUserServiceImpl implements AdminUserService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void createUserByMobile(Long merId, Long shopId, String contactMobile, String contactName) {
         Set<Long> roleIds = new HashSet<>();
 
@@ -509,6 +511,17 @@ public class AdminUserServiceImpl implements AdminUserService {
         createUser(build);
     }
 
+    @Override
+    public List<Long> getUserIdsByShop(Long shopId) {
+        if(shopId != null){
+            List<AdminUserDO> adminUserDOS = userMapper.selectList(new LambdaQueryWrapper<AdminUserDO>()
+                    .eq(AdminUserDO::getShopId, shopId)
+            );
+            return adminUserDOS.stream().map(AdminUserDO::getId).collect(Collectors.toList());
+        }
+        return null;
+    }
+
     /**
      * 对密码进行加密
      *

+ 6 - 6
sql/mysql/建空库SQL/13_20240617.sql

@@ -1,11 +1,11 @@
 CREATE TABLE `distri_daily_bill` (
                                     `id` bigint NOT NULL AUTO_INCREMENT COMMENT '账单编号',
-                                    `amount` int NOT NULL DEFAULT '0' COMMENT '金额,单位:分',
-                                    `received_amount` int NOT NULL DEFAULT '0' COMMENT '确收金额,单位:分',
-                                    `order_count` int NOT NULL DEFAULT '0' COMMENT '订单数,默认为0',
-                                    `shop_id` int DEFAULT NULL COMMENT '店铺ID',
-                                    `merchant_id` int DEFAULT NULL COMMENT '商户ID',
-                                    `order_ids` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单ID列表',
+                                    `price` bigint NOT NULL DEFAULT '0' COMMENT '金额,单位:分',
+                                    `received_price` bigint NOT NULL DEFAULT '0' COMMENT '确收金额,单位:分',
+                                    `order_count` bigint NOT NULL DEFAULT '0' COMMENT '订单数,默认为0',
+                                    `shop_id` bigint DEFAULT NULL COMMENT '店铺ID',
+                                    `merchant_id` bigint DEFAULT NULL COMMENT '商户ID',
+                                    `order_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单ID列表',
                                     `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '创建者',
                                     `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                     `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '更新者',

+ 13 - 2
sql/mysql/建空库SQL/14_20240625.sql

@@ -1,6 +1,17 @@
 ALTER TABLE trade_order_item
     ADD COLUMN `promotion_fee` INT ( 11 ) DEFAULT NULL COMMENT '推广费, 单位: 分',
-ADD COLUMN `cost_price` INT ( 11 ) DEFAULT '-1' COMMENT '成本价,单位: 分';
+    ADD COLUMN `cost_price` INT ( 11 ) DEFAULT '-1' COMMENT '成本价,单位: 分';
 
 ALTER TABLE distri_daily_award_records
-    ADD COLUMN `generate_user_id` bigint(20) DEFAULT NULL COMMENT '产生积分的用户ID,例如:下订单的用户ID';
+    ADD COLUMN `generate_user_id` bigint(20) DEFAULT NULL COMMENT '产生积分的用户ID,例如:下订单的用户ID';
+
+ALTER TABLE distri_daily_bill
+    ADD COLUMN `refund_price` bigint NOT NULL DEFAULT '0' COMMENT '退款金额, 单位: 分',
+    ADD COLUMN `integral` bigint NOT NULL DEFAULT '0' COMMENT '积分',
+    ADD COLUMN `received_integral` bigint NOT NULL DEFAULT '0' COMMENT '确收积分',
+    ADD COLUMN `refund_integral` bigint NOT NULL DEFAULT '0' COMMENT '退款积分',
+    ADD COLUMN `order_calc_time` date NOT NULL COMMENT '订单所属日期';
+
+ALTER TABLE trade_order_item
+    ADD COLUMN `computation_bill` bit(1) DEFAULT b'0' COMMENT '是否已经计算每日账单,已计算是1,未计算为0';
+