Browse Source

Merge remote-tracking branch 'origin/master'

Ben 10 months ago
parent
commit
5a9f59c486
45 changed files with 616 additions and 187 deletions
  1. 1 1
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java
  2. 6 3
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  3. 1 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  4. 15 9
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralPageReqVO.java
  5. 20 11
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralRespVO.java
  6. 18 10
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java
  7. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java
  8. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentagePageReqVO.java
  9. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java
  10. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageSaveReqVO.java
  11. 18 12
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java
  12. 21 7
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/integral/IntegralDO.java
  13. 17 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java
  14. 23 16
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java
  15. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ordercalc/OrderCalcMapper.java
  16. 10 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/message/order/DistriOrderMessage.java
  17. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/message/order/OrderItemMessage.java
  18. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  19. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcService.java
  20. 70 13
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  21. 40 7
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java
  22. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusServiceImpl.java
  23. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/ordercalc/OrderCalcMapper.xml
  24. 2 0
      feifan-module-infra/feifan-module-infra-biz/src/main/java/cn/newfeifan/mall/module/infra/framework/security/config/SecurityConfiguration.java
  25. 2 4
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/mysql/spu/ProductSpuMapper.java
  26. 5 36
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuServiceImpl.java
  27. 3 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java
  28. 30 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderStateEnum.java
  29. 25 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderSubscribeStatusEnum.java
  30. 5 0
      feifan-module-mall/feifan-module-trade-biz/pom.xml
  31. 64 10
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  32. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java
  33. 10 32
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  34. 1 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/config/TradeExpressProperties.java
  35. 6 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java
  36. 18 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java
  37. 2 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java
  38. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressService.java
  39. 5 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressServiceImpl.java
  40. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  41. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  42. 9 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java
  43. 102 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  44. 6 2
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml
  45. 3 3
      feifan-server/src/main/resources/application.yaml

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

@@ -10,5 +10,5 @@ public class DistriConstants {
 
     public static final Boolean IS_EFFECTIVE  = true;
 
-
+    public static final double GROSS_PROFIT_BONUS_QUOTA_PERC = 0.2;
 }

+ 6 - 3
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java

@@ -15,10 +15,13 @@ public enum CaclEnum {
     HIGH_QUOTA(6, "最高可以获得积分", "最高可以获得积分"),
     SMALL_QUOTA_CRASH(7, "小区额度分配", "小区额度分配"),
     AFTER_CRASH_CALC_PT_TOTAL_QUOTA(8, "碰撞后计算平台总收益", "碰撞后计算平台总收益"),
-    AFTER_CRASH_CALC_PT_TOTAL_GROSS_QUOTA(12, "碰撞后计算平台收益", "碰撞后计算平台收益"),
     ORDER_PAY_INTEGRAL(9, "购物获得积分", "购物获得冻结积分"),
     ORDER_REFUND_INTEGRAL(10, "订单退款,积分退回", "购物收货7天后,冻结积分变为可用积分"),
-    ORDER_INTEGRAL_UNFREEZE(11, "订单积分到账", "订单积分到账");
+    ORDER_INTEGRAL_UNFREEZE(11, "订单积分到账", "订单积分到账"),
+    AFTER_CRASH_CALC_PT_TOTAL_GROSS_QUOTA(12, "碰撞后计算平台收益", "碰撞后计算平台收益"),
+    FREEZE_CHANGE_INTEGRAL(13, "冻结积分转化成可用积分", "冻结积分变为可用积分"),
+    GROSS_PROFIT_BONUS_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT(14, "合赢奖超额", "合赢奖的获取超出最高可获取"),
+    GROSS_PROFIT_ANCESTOR_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT(15, "直推奖超额", "直推奖的获取超出最高可获取");
 
     /**
      * 来源
@@ -43,4 +46,4 @@ public enum CaclEnum {
         return null;
     }
 
-}
+}

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

@@ -26,5 +26,6 @@ public interface ErrorCodeConstants {
 
     ErrorCode PT_PROFIT_DAILY_STATISTICS_LOG_NOT_EXISTS = new ErrorCode(1_002_030_020, "查询该日的记录不存在");
     ErrorCode SOCIAL_STATUS_CHANGE_LOG_NOT_EXISTS = new ErrorCode(1_002_030_021, "查询日志记录不存在");
+    ErrorCode GROSS_PROFIT_BONUS_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT = new ErrorCode(1_002_030_022, "合赢奖不能超过最大限制");
 
 }

+ 15 - 9
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralPageReqVO.java

@@ -17,12 +17,6 @@ public class IntegralPageReqVO extends PageParam {
     @Schema(description = "用户ID", example = "19778")
     private Long userId;
 
-    @Schema(description = "当前积分")
-    private Long currentQuota;
-
-    @Schema(description = "冻结积分")
-    private Long freezeQuota;
-
     @Schema(description = "用户类型", example = "17348")
     private Long categoryId;
 
@@ -30,14 +24,26 @@ public class IntegralPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
-    @Schema(description = "最高可获取积分")
-    private Long highQuota;
-
     @Schema(description = "用户名称", example = "赵六")
     private String name;
 
     @Schema(description = "用户昵称", example = "赵六")
     private String nickName;
 
+    @Schema(description = "当前积分")
+    private Long currentQuota;
+
+    @Schema(description = "冻结积分")
+    private Long freezeQuota;
+
+    @Schema(description = "合赢奖累计获取积分")
+    private Long accumulatedQuota;
+
+    @Schema(description = "直推奖累计获取积分")
+    private Long ancestorQuota;
+
+    @Schema(description = "最高可获取积分")
+    private Long highQuota;
+
 
 }

+ 20 - 11
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralRespVO.java

@@ -18,14 +18,6 @@ public class IntegralRespVO {
     @ExcelProperty("用户ID")
     private Long userId;
 
-    @Schema(description = "当前积分")
-    @ExcelProperty("当前积分")
-    private Long currentQuota;
-
-    @Schema(description = "冻结积分")
-    @ExcelProperty("冻结积分")
-    private Long freezeQuota;
-
     @Schema(description = "用户类型", example = "17348")
     @ExcelProperty("用户类型")
     private Long categoryId;
@@ -34,9 +26,6 @@ public class IntegralRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
-    @Schema(description = "最高可获取积分")
-    @ExcelProperty("最高可获取积分")
-    private Long highQuota;
     @Schema(description = "用户名称", example = "赵六")
     @ExcelProperty("用户名称")
     private String name;
@@ -44,4 +33,24 @@ public class IntegralRespVO {
     @Schema(description = "用户昵称", example = "赵六")
     @ExcelProperty("用户昵称")
     private String nickName;
+
+    @Schema(description = "当前积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("当前积分")
+    private Long currentQuota;
+
+    @Schema(description = "冻结积分")
+    @ExcelProperty("冻结积分")
+    private Long freezeQuota;
+
+    @Schema(description = "合赢奖累计获取积分")
+    @ExcelProperty("合赢奖累计获取积分")
+    private Long accumulatedQuota;
+
+    @Schema(description = "直推奖累计获取积分")
+    @ExcelProperty("直推奖累计获取积分")
+    private Long ancestorQuota;
+
+    @Schema(description = "最高可获取积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("最高可获取积分")
+    private Long highQuota;
 }

+ 18 - 10
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java

@@ -3,6 +3,8 @@ package cn.newfeifan.mall.module.distri.controller.admin.integral.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
+import javax.validation.constraints.NotNull;
+
 
 @Schema(description = "管理后台 - 推荐用户积分新增/修改 Request VO")
 @Data
@@ -17,23 +19,29 @@ public class IntegralSaveReqVO {
     @Schema(description = "用户ID", example = "19778")
     private Long userId;
 
-    @Schema(description = "当前积分")
-    private Long currentQuota;
-
-    @Schema(description = "冻结积分")
-    private Long freezeQuota;
-
     @Schema(description = "用户类型", example = "17348")
     private Long categoryId;
 
-    @Schema(description = "最高可获取积分")
-    private Long highQuota;
-
-
     @Schema(description = "用户名称", example = "赵六")
     private String name;
 
     @Schema(description = "用户昵称", example = "赵六")
     private String nickName;
 
+    @Schema(description = "当前积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "当前积分不能为空")
+    private Long currentQuota;
+
+    @Schema(description = "冻结积分")
+    private Long freezeQuota;
+
+    @Schema(description = "合赢奖累计获取积分")
+    private Long accumulatedQuota;
+
+    @Schema(description = "直推奖累计获取积分")
+    private Long ancestorQuota;
+
+    @Schema(description = "最高可获取积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long highQuota;
+
 }

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

@@ -46,6 +46,7 @@ public class OrderPercentageDoubleSaveReqVO {
     @Schema(description = "用户注册后,获得的基础最大合赢奖、直推奖积分限额")
     private String baseMaxQuota;
 
-
+    @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
+    private String collectSocialStatus;
 
 }

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

@@ -52,4 +52,7 @@ public class OrderPercentagePageReqVO extends PageParam {
 
     @Schema(description = "用户注册后,获得的基础最大合赢奖、直推奖积分限额")
     private String baseMaxQuota;
+
+    @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
+    private String collectSocialStatus;
 }

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

@@ -62,4 +62,7 @@ public class OrderPercentageRespVO {
 
     @Schema(description = "用户注册后,获得的基础最大合赢奖、直推奖积分限额")
     private String baseMaxQuota;
+
+    @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
+    private String collectSocialStatus;
 }

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

@@ -46,5 +46,8 @@ public class OrderPercentageSaveReqVO {
     @Schema(description = "用户注册后,获得的基础最大合赢奖、直推奖积分限额")
     private String baseMaxQuota;
 
+    @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
+    private String collectSocialStatus;
+
 
 }

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

@@ -11,18 +11,6 @@ import lombok.*;
 @NoArgsConstructor
 public class PtProfitLogSaveReqVO {
 
-    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12046")
-    private Long id;
-
-    @Schema(description = "增加金额")
-    private Long amount;
-
-    @Schema(description = "增加后金额")
-    private Long afterAmount;
-
-    @Schema(description = "收益类型 1:平台服务器费 2:平台收益 3推荐人额度 4直推人额度 5合赢奖 6最高可以获得积分", example = "2")
-    private Integer profitStatus;
-
     @Schema(description = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
     private Long userId;
 
@@ -32,7 +20,25 @@ public class PtProfitLogSaveReqVO {
     @Schema(description = "订单编号")
     private String orderNo;
 
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5931")
+    private Long id;
+
     @Schema(description = "计算百分比模板")
     private String percentTemplate;
 
+    @Schema(description = "变动的当前可用积分值(可为负数)")
+    private Long amount;
+
+    @Schema(description = "变动后当前可用积分钱包的余额")
+    private Long afterAmount;
+
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖", example = "1")
+    private Integer profitStatus;
+
+    @Schema(description = "变动的冻结积分值(可为负数)")
+    private Long freezeAmount;
+
+    @Schema(description = "变动后冻结积分钱包的余额")
+    private Long afterFreezeAmount;
+
 }

+ 21 - 7
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/integral/IntegralDO.java

@@ -28,6 +28,18 @@ public class IntegralDO extends BaseDO {
      * 用户ID
      */
     private Long userId;
+    /**
+     * 用户类型
+     */
+    private Long categoryId;
+    /**
+     * 用户名称
+     */
+    private String name;
+    /**
+     * 用户昵称
+     */
+    private String nickName;
     /**
      * 当前积分
      */
@@ -37,13 +49,15 @@ public class IntegralDO extends BaseDO {
      */
     private Long freezeQuota;
     /**
-     * 用户类型
+     * 合赢奖累计获取积分
+     */
+    private Long accumulatedQuota;
+    /**
+     * 直推奖累计获取积分
+     */
+    private Long ancestorQuota;
+    /**
+     * 最高可获取积分
      */
-    private Long categoryId;
-
     private Long highQuota;
-
-    private String name;
-
-    private String nickName;
 }

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

@@ -4,6 +4,10 @@ import lombok.*;
 import com.baomidou.mybatisplus.annotation.*;
 import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
 
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.GROSS_PROFIT_BONUS_QUOTA_PERC;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.GROSS_PROFIT_BONUS_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT;
+
 /**
  * 积分相关计算浮动百分比设置 DO
  *
@@ -73,4 +77,17 @@ public class OrderPercentageDO extends BaseDO {
      */
     private String baseMaxQuota;
 
+    /**
+     * 收藏商品获取身价值,同一SPU商品收藏多次无效
+     */
+    private String collectSocialStatus;
+
+    public String getGrossProfitBonusQuotaPerc() {
+        double grossProfitBonusQuotaPerc = Double.parseDouble(this.grossProfitBonusQuotaPerc);
+        if(grossProfitBonusQuotaPerc > GROSS_PROFIT_BONUS_QUOTA_PERC){
+            throw exception(GROSS_PROFIT_BONUS_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT);
+        }
+        return this.grossProfitBonusQuotaPerc;
+    }
+
 }

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

@@ -20,16 +20,32 @@ import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
 public class PtProfitLogDO extends BaseDO {
 
     /**
-     * 用户编号
+     * 用户ID , 只有收益类型为 3,4才有值
+     */
+    private Long userId;
+    /**
+     * 订单Id
+     */
+    private Long orderId;
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+    /**
+     * 编号
      */
     @TableId
     private Long id;
     /**
-     * 增加金额
+     * 计算百分比模板
+     */
+    private String percentTemplate;
+    /**
+     * 变动的当前可用积分值(可为负数)
      */
     private Long amount;
     /**
-     * 增加后金额
+     * 变动后当前可用积分钱包的余
      */
     private Long afterAmount;
     /**
@@ -37,22 +53,13 @@ public class PtProfitLogDO extends BaseDO {
      */
     private Integer profitStatus;
     /**
-     * 用户ID , 只有收益类型为 3,4才有值
-     */
-    private Long userId;
-
-    /**
-     * 订单Id
-     */
-    private Long orderId;
-    /**
-     * 订单编号
+     * 变动的冻结积分值(可为负数)
      */
-    private String orderNo;
+    private Long freezeAmount;
     /**
-     * 计算百分比模板
+     * 变动后冻结积分钱包的余额
      */
-    private String percentTemplate;
+    private Long afterFreezeAmount;
 
 
 }

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

@@ -1,6 +1,5 @@
 package cn.newfeifan.mall.module.distri.dal.mysql.ordercalc;
 
-import java.util.*;
 
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -8,6 +7,7 @@ import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
 import org.apache.ibatis.annotations.Mapper;
 import cn.newfeifan.mall.module.distri.controller.admin.ordercalc.vo.*;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 订单产生数据计算 Mapper
@@ -37,4 +37,5 @@ public interface OrderCalcMapper extends BaseMapperX<OrderCalcDO> {
                 .orderByDesc(OrderCalcDO::getId));
     }
 
+    void updateOrderItemById(@Param("orderItemId")Long orderItemId);
 }

+ 10 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/message/order/DistriOrderMessage.java

@@ -69,6 +69,16 @@ public class DistriOrderMessage {
      */
     private Long orderId;
 
+    /**
+     * 订单明细ID
+     */
+    private Long orderItemId;
+
+    /**
+     * 用户自得积分
+     */
+    private Long increaseIntegral;
+
 
     @Override
     public boolean equals(Object o) {

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/message/order/OrderItemMessage.java

@@ -38,4 +38,13 @@ public class OrderItemMessage {
      */
     private Long orderId;
 
+    /**
+     * 用户自得积分
+     */
+    private Long increaseIntegral;
+
+    /**
+     * 订单项ID
+     */
+    private Long orderItemId;
 }

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

@@ -40,6 +40,8 @@ public class IntegralServiceImpl implements IntegralService {
     public Long createIntegral(IntegralSaveReqVO createReqVO) {
         // 插入
         IntegralDO integral = BeanUtils.toBean(createReqVO, IntegralDO.class);
+        integral.setAccumulatedQuota(0L);
+        integral.setAncestorQuota(0L);
         integralMapper.insert(integral);
         // 返回
         return integral.getId();
@@ -86,6 +88,10 @@ public class IntegralServiceImpl implements IntegralService {
     @Override
     public void saveBatch(List<IntegralSaveReqVO> integralSaveReqVOS) {
         List<IntegralDO> integralDOS = BeanUtils.toBean(integralSaveReqVOS, IntegralDO.class);
+        integralDOS.forEach(k -> {
+            k.setAccumulatedQuota(0L);
+            k.setAncestorQuota(0L);
+        });
         integralMapper.insertBatch(integralDOS);
     }
 
@@ -123,4 +129,4 @@ public class IntegralServiceImpl implements IntegralService {
         );
     }
 
-}
+}

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

@@ -7,7 +7,6 @@ import javax.validation.*;
 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;
-import cn.newfeifan.mall.module.distri.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.module.distri.mq.message.order.OrderCalcMessage;
 
 /**
@@ -64,4 +63,5 @@ public interface OrderCalcService {
 
     List<OrderCalcDO> queryTodayCalcByUserIds(LocalDateTime todayStart, LocalDateTime todayEnd,List<Long> userList);
 
+    void updateOrderItem(Long orderItemId);
 }

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

@@ -11,6 +11,7 @@ import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPerce
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
+import cn.newfeifan.mall.module.distri.enums.SocialStatusEnum;
 import cn.newfeifan.mall.module.distri.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.module.distri.mq.message.order.OrderCalcMessage;
 import cn.newfeifan.mall.module.distri.mq.message.order.OrderItemMessage;
@@ -19,7 +20,6 @@ import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
 import cn.newfeifan.mall.module.distri.service.partitioncrash.PartitionCrashService;
 import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
-import cn.newfeifan.mall.module.distri.service.ptprofitdailystatisticslog.PtProfitDailyStatisticsLogService;
 import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
 import org.springframework.context.annotation.Lazy;
@@ -83,9 +83,6 @@ public class OrderCalcServiceImpl implements OrderCalcService {
     @Resource
     private PartitionCrashService partitionCrashService;
 
-    @Resource
-    private PtProfitDailyStatisticsLogService ptProfitDailyStatisticsLogService;
-
     @Override
     public Long createOrderCalc(OrderCalcSaveReqVO createReqVO) {
         // 插入
@@ -146,7 +143,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
             calc(tradeOrderDO, orderPercentageDO, percentTemplate);
         } catch (Exception e) {
-
+            System.out.println(e.getMessage());
         } finally {
             // todo 计算当天用户的碰撞
             // 计算兄弟分区, 以及后代分区
@@ -161,6 +158,11 @@ public class OrderCalcServiceImpl implements OrderCalcService {
                 .in(OrderCalcDO::getUserId, userList));
     }
 
+    @Override
+    public void updateOrderItem(Long orderItemId) {
+        orderCalcMapper.updateOrderItemById(orderItemId);
+    }
+
     private void calc(List<OrderCalcMessage> tradeOrderDO, OrderPercentageDO orderPercentageDO, String percentTemplate) {
 
         List<PtProfitSaveReqVO> savePFitMap = new ArrayList<>();
@@ -198,13 +200,16 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 
             // 计算
             // 计算利润: (价格 - 成本价格) * 产品数量
-            final BigDecimal[] profit = {new BigDecimal("0")};
+            final BigDecimal[] profit = {new BigDecimal("0"), new BigDecimal("0")};      //用户自得不用要计算,从orderItem里面获取
             k.getOrderItemMessages().forEach(j -> {
                 BigDecimal onePrice = new BigDecimal(j.getPrice());
                 BigDecimal oneCostPrice = new BigDecimal(j.getCostPrice());
                 BigDecimal productCount = new BigDecimal(j.getCount());
                 BigDecimal oneGrossProfit = onePrice.subtract(oneCostPrice).multiply(productCount);
                 profit[0] = profit[0].add(oneGrossProfit);  // 注意这里的改动
+                profit[1] = profit[1].add(new BigDecimal(j.getIncreaseIntegral()));     //自得积分
+
+                updateOrderItem(j.getOrderItemId());
             });
 
 
@@ -219,7 +224,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             }
 
             // 用户所得: 毛利 * 0.35
-            BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitUserQuotaPerc())).setScale(4, RoundingMode.DOWN);
+            BigDecimal descendantQuota = profit[1];
 
             // 直推奖: 毛利 * 0.35 (上一级)
             BigDecimal ancestorQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc())).setScale(4, RoundingMode.DOWN);
@@ -237,7 +242,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             // 乘以 10000 并转换为整数
             Long grossProfitInt = grossProfit.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
             Long ancestorQuotaInt = ancestorQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
-            Long descendantQuotaInt = descendantQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
+            Long descendantQuotaInt = descendantQuota.longValue();
             Long bonusQuotaInt = bonusQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
             Long highQuotaInt = highQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
             Long grossProfitAfterBonusInt = grossProfitAfterBonus.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
@@ -250,6 +255,20 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             IntegralDO integralDOAncestor = integralService.selectByUser(sharePath.getAncestor());
             IntegralDO integralDO = integralService.selectByUser(sharePath.getDescendant());
             IntegralDO ptIntegral = integralService.selectByUser(1L);
+
+
+            // ========== 身价计算 ==============
+            //推荐人身价计算
+            double orderAncestorSocialStatus = Double.parseDouble(orderPercentageDO.getOrderAncestorSocialStatus());
+            double ancestorSocial = k.getOrderItemMessages().get(0).getTotalPrice() * orderAncestorSocialStatus;
+            duserService.updateDuserSocial(integralDOAncestor.getUserId(), (long) ancestorSocial, SocialStatusEnum.SHOPPING_ANCESTOR_SOCIAL.getStatus());
+
+            //自得身价计算
+            double orderUserSocialStatus = Double.parseDouble(orderPercentageDO.getOrderUserSocialStatus());
+            double descendantSocial = k.getOrderItemMessages().get(0).getTotalPrice() * orderUserSocialStatus;
+            duserService.updateDuserSocial(integralDO.getUserId(), (long) descendantSocial, SocialStatusEnum.SHOPPING_SOCIAL.getStatus());
+
+
             // ========== 汇总计算 =================
             OrderCalcSaveReqVO orderCalcSaveReqVO = OrderCalcSaveReqVO.builder()
                     .userId(k.getUserId())
@@ -267,7 +286,15 @@ public class OrderCalcServiceImpl implements OrderCalcService {
                     .percentTemplate(percentTemplate).build();
             saveList.add(orderCalcSaveReqVO);
             // ========== 修改用户钱包 =================
-            changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ptIntegral, ancestorQuotaInt, descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt);
+            //直推奖也要限制额度
+            Long ancestorHighQuota = integralDOAncestor.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();//加上基础的最大额度值
+            if (ancestorHighQuota < ancestorQuotaInt) {
+                changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ptIntegral, 0L,
+                        descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt);
+            } else {
+                changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ptIntegral, ancestorQuotaInt,
+                        descendantQuotaInt, highQuotaInt, grossProfitAfterBonusInt, platformQuotaInt);
+            }
             // ========== 修改平台信息 =================
             // 每个订单计算的过程
             // 增加平台收益
@@ -277,6 +304,11 @@ public class OrderCalcServiceImpl implements OrderCalcService {
                             .ptAdd(platformQuotaInt)
                             .ptGrossAdd(grossProfitAfterBonusInt)
                             .ptTotalAdd(platformQuotaInt + grossProfitAfterBonusInt).build();
+
+            // 当直推人获取的积分额度不足时,平台收益要加回来,并生成log
+            calcIntegral(ptProfitSaveReqVOS, ptProfitSaveReqVO, ancestorHighQuota, ancestorQuotaInt,
+                    k.getOrderId(), k.getNo(), integralDOAncestor.getUserId());
+
             ptProfitSaveReqVOS.add(ptProfitSaveReqVO);
             // ========== 增加日志记录 =================
 
@@ -303,6 +335,9 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 
             // 直推人记录
             PtProfitLogSaveReqVO ztrLog = PtProfitLogSaveReqVO.builder().orderId(k.getOrderId()).profitStatus(CaclEnum.DIRECT_REFERRAL_QUOTA.getType()).orderNo(k.getNo()).userId(sharePath.getDescendant()).amount(descendantQuotaInt).afterAmount(integralDO.getCurrentQuota() + descendantQuotaInt).percentTemplate(percentTemplate).build();
+            // 直推人冻结积分转化成可用记录
+            PtProfitLogSaveReqVO freezeLog = PtProfitLogSaveReqVO.builder().orderId(k.getOrderId()).profitStatus(CaclEnum.FREEZE_CHANGE_INTEGRAL.getType()).orderNo(k.getNo()).userId(sharePath.getDescendant()).freezeAmount(descendantQuotaInt).afterFreezeAmount(integralDO.getCurrentQuota() - descendantQuotaInt).percentTemplate(percentTemplate).build();
+
             PtProfitLogSaveReqVO highQuotaLog = PtProfitLogSaveReqVO.builder().orderId(k.getOrderId()).profitStatus(CaclEnum.HIGH_QUOTA.getType()).orderNo(k.getNo()).userId(sharePath.getDescendant()).amount(highQuotaInt).afterAmount(integralDO.getHighQuota() + highQuotaInt).percentTemplate(percentTemplate).build();
 
             // 合赢奖记录
@@ -314,6 +349,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             ptProfitLogSaveReqVOS.add(ptAddLog);
             ptProfitLogSaveReqVOS.add(tjrLog);
             ptProfitLogSaveReqVOS.add(ztrLog);
+            ptProfitLogSaveReqVOS.add(freezeLog);
             ptProfitLogSaveReqVOS.add(hyjLog);
             ptProfitLogSaveReqVOS.add(highQuotaLog);
 
@@ -346,6 +382,24 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 
     }
 
+    private void calcIntegral(List<PtProfitSaveReqVO> ptProfitSaveReqVOS, PtProfitSaveReqVO ptProfitSaveReqVO,
+                              Long highQuotaInt, Long ancestorQuotaInt, Long orderId, String orderNo, Long userId) {
+        if (highQuotaInt < ancestorQuotaInt) {
+            ptProfitSaveReqVO.setPtGrossAdd(ptProfitSaveReqVO.getPtGrossAdd() + ancestorQuotaInt);
+            ptProfitSaveReqVO.setPtTotalAdd(ptProfitSaveReqVO.getPtGrossAdd() + ptProfitSaveReqVO.getPtAdd());
+
+            PtProfitLogSaveReqVO ptProfitLog = PtProfitLogSaveReqVO.builder()
+                    .orderId(orderId)
+                    .profitStatus(CaclEnum.GROSS_PROFIT_ANCESTOR_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT.getType())
+                    .orderNo(orderNo)
+                    .userId(userId)
+                    .amount(ancestorQuotaInt)
+                    .afterAmount(ptProfitSaveReqVOS.stream().mapToLong(PtProfitSaveReqVO::getPtGrossAdd).sum() + ancestorQuotaInt)
+                    .build();
+            ptProfitLogService.createPtProfitLog(ptProfitLog);
+        }
+    }
+
     private PtProfitDO calcPtProfit(PtProfitDO ptProfitDO, List<PtProfitSaveReqVO> ptProfitSaveReqVOS) {
 
         Long currentPtAdd = 0L;
@@ -386,10 +440,14 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         // todo 增加累计额度
 
         integralDO.setCurrentQuota(integralDO.getCurrentQuota() + descendantQuota);
-
-
+        integralDO.setFreezeQuota(integralDO.getFreezeQuota() - descendantQuota);
         // 增加推荐人额度
         integralDOAncestor.setCurrentQuota(integralDOAncestor.getCurrentQuota() + ancestorQuota);
+        // 减少推荐人的可获取额度
+        integralDOAncestor.setHighQuota(integralDOAncestor.getHighQuota() - ancestorQuota);
+        integralDOAncestor.setAncestorQuota(integralDOAncestor.getAncestorQuota() + ancestorQuota);
+        integralService.updateIntegral(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
+
         // 增加平台额度
         pt.setCurrentQuota(pt.getCurrentQuota() + ptA + ptB);
 
@@ -397,7 +455,6 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 //        integralSaveReqVOS.add(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
 
         integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
-        integralService.updateIntegral(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
         integralService.updateIntegral(BeanUtils.toBean(pt, IntegralSaveReqVO.class));
 
     }
@@ -409,4 +466,4 @@ public class OrderCalcServiceImpl implements OrderCalcService {
     }
 
 
-}
+}

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

@@ -259,26 +259,34 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
 
                 // 积分添加 添加的时候, 需要注意当前用户是否有足够的积分可以获取
                 // 碰撞后的额度的
-                Long highQuota = integralDO.getHighQuota();
-                Long parentHighQuota = parentIntegralDo.getHighQuota();
+                Long highQuota = integralDO.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();       //加上基础的最大额度值
+                Long parentHighQuota = parentIntegralDo.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();
 
                 BigDecimal smallBigDecimal = new BigDecimal(String.valueOf(smallQuota));
                 BigDecimal multiply = smallBigDecimal.divide(new BigDecimal("2.0"), 4, RoundingMode.DOWN);
-                if (compare(highQuota, multiply)) {
+                if (compare(highQuota, multiply) && multiply.longValue() != 0) {
                     integralDO.setCurrentQuota(integralDO.getCurrentQuota() + multiply.intValue());
-                    integralDO.setHighQuota(parentIntegralDo.getHighQuota() - multiply.intValue());
+//                    integralDO.setHighQuota(integralDO.getHighQuota() - multiply.intValue());
+                    integralDO.setAccumulatedQuota(integralDO.getAccumulatedQuota() + multiply.intValue());
                     // 碰撞后的额度添加到日志中 增加日志模块
                     integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
                     ptProfitLogService.addMessage(k.getUserId(), CaclEnum.SMALL_QUOTA_CRASH, Long.parseLong(String.valueOf(multiply.intValue())), integralDO.getCurrentQuota(), JsonUtils.toJsonString(orderPercentageDO));
                 }
-                if (compare(parentHighQuota, multiply)) {
+                if (compare(parentHighQuota, multiply) && multiply.longValue() != 0) {
                     // 减去最高额度
                     parentIntegralDo.setCurrentQuota(parentIntegralDo.getCurrentQuota() + multiply.intValue());
-                    parentIntegralDo.setHighQuota(parentIntegralDo.getHighQuota() - multiply.intValue());
+//                    parentIntegralDo.setHighQuota(parentIntegralDo.getHighQuota() - multiply.intValue());
+                    parentIntegralDo.setAccumulatedQuota(parentIntegralDo.getAccumulatedQuota() + multiply.intValue());
                     // 碰撞后的额度添加到日志中 增加日志模块
                     integralService.updateIntegral(BeanUtils.toBean(parentIntegralDo, IntegralSaveReqVO.class));
                     ptProfitLogService.addMessage(parentIntegralDo.getUserId(), CaclEnum.SMALL_QUOTA_CRASH, Long.parseLong(String.valueOf(multiply.intValue())), parentIntegralDo.getCurrentQuota(), JsonUtils.toJsonString(orderPercentageDO));
                 }
+                if(highQuota < multiply.longValue() && multiply.longValue() != 0L){
+                    calcIntegral(multiply.longValue(), integralDO.getUserId(), JsonUtils.toJsonString(orderPercentageDO));
+                }
+                if(parentHighQuota < multiply.longValue() && multiply.longValue() != 0L){
+                    calcIntegral(multiply.longValue(), parentIntegralDo.getUserId(), JsonUtils.toJsonString(orderPercentageDO));
+                }
 
                 // 获取计算后积分, Long为userId, Integer为碰撞后额度
                 HashMap<Long, Long> map = new HashMap<>();
@@ -325,6 +333,25 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
                     continue;
                 }
 
+                // 获取当前用户的钱包
+                IntegralDO integralDO = integralDOMap.get(entry.getKey());
+                // 获取当前父亲的钱包
+                Long parent = sonAndParent.get(entry.getKey());
+                IntegralDO parentIntegralDo = integralDOMap.get(parent);
+                Long highQuota = integralDO.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();       //加上基础的最大额度值
+                Long parentHighQuota = parentIntegralDo.getHighQuota() + new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue();
+                if(highQuota  < entry.getValue()){
+                    continue;
+                }
+                if(parentHighQuota < entry.getValue()){
+                    continue;
+                }
+
+                integralDO.setHighQuota(integralDO.getHighQuota() - entry.getValue());
+                parentIntegralDo.setHighQuota(parentIntegralDo.getHighQuota() - entry.getValue());
+                integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
+                integralService.updateIntegral(BeanUtils.toBean(parentIntegralDo, IntegralSaveReqVO.class));
+
                 // 扣除平台收益
                 log.info("扣除平台收益[合赢奖] " + "用户 " + entry.getKey() + "额度: " + entry.getValue());
                 ptProfit.setPtGrossAdd(ptProfit.getPtGrossAdd() - entry.getValue());
@@ -355,6 +382,12 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
         createPtProfitDailyStatisticsLog(sum);
     }
 
+    private void calcIntegral(Long multiply, Long userId, String jsonString) {
+        PtProfitDO ptProfit = ptProfitService.getPtProfit();
+        ptProfitLogService.addMessage(userId, CaclEnum.GROSS_PROFIT_BONUS_QUOTA_PERC_EXCEED_MAXIMUM_LIMIT, multiply,
+                ptProfit.getPtTotalAdd(), jsonString);
+    }
+
     private void createPtProfitDailyStatisticsLog(Long sum) {
         LocalDate now = LocalDate.now();
 
@@ -426,4 +459,4 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
     }
 
 
-}
+}

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusServiceImpl.java

@@ -92,6 +92,10 @@ public class SocialStatusServiceImpl implements SocialStatusService {
                 break;
             }
         }
+        if(socialStatusBO.getId() == null){
+            socialStatusBO.setId(socialStatusDOS.get(socialStatusDOS.size() - 1).getId());
+            socialStatusBO.setSocialUpNeed(0L);
+        }
         return socialStatusBO;
     }
 

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/ordercalc/OrderCalcMapper.xml

@@ -9,4 +9,9 @@
         文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
      -->
 
+    <update id="updateOrderItemById">
+        update trade_order_item
+        set distribute_benefit = 1
+        where id = #{orderItemId}
+    </update>
 </mapper>

+ 2 - 0
feifan-module-infra/feifan-module-infra-biz/src/main/java/cn/newfeifan/mall/module/infra/framework/security/config/SecurityConfiguration.java

@@ -39,6 +39,8 @@ public class SecurityConfiguration {
                         .antMatchers(adminSeverContextPath + "/**").anonymous();
                 // 文件读取
                 registry.antMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll();
+                //快递100回调
+                registry.antMatchers(buildAdminApi("/trade/order/callBackUrl")).permitAll();
             }
 
         };

+ 2 - 4
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/mysql/spu/ProductSpuMapper.java

@@ -60,22 +60,20 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> {
     }
 
 
-    default Long selectCountByMerId(Long shopId,Long merId) {
+    default Long selectCountByMerId(Long merId) {
         LambdaQueryWrapperX<ProductSpuDO> queryWrapper = new LambdaQueryWrapperX<>();
         // 库存小于等于警戒库存
         queryWrapper
                 .eqIfPresent(ProductSpuDO::getMerchantId, merId)
-                .eqIfPresent(ProductSpuDO::getShopId, shopId)
                 .le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
                 // 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数
                 .notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus());
         return selectCount(queryWrapper);
     }
 
-    default Long selectCountByMerId(Long shopId,Long merId, SFunction<ProductSpuDO, ?> field, Integer status) {
+    default Long selectCountByMerId(Long merId, SFunction<ProductSpuDO, ?> field, Integer status) {
         return selectCount(new LambdaQueryWrapperX<ProductSpuDO>()
                 .eqIfPresent(ProductSpuDO::getMerchantId, merId)
-                .eqIfPresent(ProductSpuDO::getShopId, shopId)
                 .eq(field, status));
     }
 

+ 5 - 36
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuServiceImpl.java

@@ -17,14 +17,9 @@ import cn.newfeifan.mall.module.product.service.brand.ProductBrandService;
 import cn.newfeifan.mall.module.product.service.category.ProductCategoryService;
 import cn.newfeifan.mall.module.product.service.favorite.ProductFavoriteService;
 import cn.newfeifan.mall.module.product.service.sku.ProductSkuService;
-import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
-import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
-import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -34,7 +29,6 @@ import java.util.*;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
-import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.product.dal.dataobject.category.ProductCategoryDO.CATEGORY_LEVEL;
 import static cn.newfeifan.mall.module.product.enums.ErrorCodeConstants.*;
 
@@ -62,13 +56,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
     @Resource
     private ProductFavoriteService favoriteService;
 
-
-    @Resource
-    private StringRedisTemplate stringRedisTemplate;
-
-    @Resource
-    private AdminUserMapper userMapper;
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createSpu(ProductSpuSaveReqVO createReqVO) {
@@ -302,42 +289,24 @@ public class ProductSpuServiceImpl implements ProductSpuService {
     public Map<Integer, Long> getTabsCount(Long merId) {
         Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5);
 
-        ShopBO shop = getShop();
-
         // 查询销售中的商品数量
         counts.put(ProductSpuPageReqVO.FOR_SALE,
-                productSpuMapper.selectCountByMerId(shop.getShopId(),shop.getMerId(),ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()));
+                productSpuMapper.selectCountByMerId(merId,ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()));
         // 查询仓库中的商品数量
         counts.put(ProductSpuPageReqVO.IN_WAREHOUSE,
-                productSpuMapper.selectCountByMerId(shop.getShopId(),shop.getMerId(),ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus()));
+                productSpuMapper.selectCountByMerId(merId,ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus()));
         // 查询售空的商品数量
         counts.put(ProductSpuPageReqVO.SOLD_OUT,
-                productSpuMapper.selectCountByMerId(shop.getShopId(),shop.getMerId(),ProductSpuDO::getStock, 0));
+                productSpuMapper.selectCountByMerId(merId,ProductSpuDO::getStock, 0));
         // 查询触发警戒库存的商品数量
         counts.put(ProductSpuPageReqVO.ALERT_STOCK,
-                productSpuMapper.selectCountByMerId(shop.getShopId(),shop.getMerId()));
+                productSpuMapper.selectCountByMerId(merId));
         // 查询回收站中的商品数量
         counts.put(ProductSpuPageReqVO.RECYCLE_BIN,
-                productSpuMapper.selectCountByMerId(shop.getShopId(),shop.getMerId(),ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()));
+                productSpuMapper.selectCountByMerId(merId,ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()));
         return counts;
     }
 
-    private ShopBO getShop(){
-        Long loginUserId = getLoginUserId();
-        String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);
-        if (StringUtils.isEmpty(s)) {
-            AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
-            ShopBO shop = new ShopBO();
-            shop.setShopId(adminUserDO.getShopId());
-            shop.setMerId(adminUserDO.getMerchantId());
-            log.info("====shop:{}", shop);
-            return shop;
-        } else {
-            log.info("====shop:{}", s);
-            return JSONObject.parseObject(s, ShopBO.class);
-        }
-    }
-
 
     @Override
     public Long getSpuCountByCategoryId(Long categoryId) {

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

@@ -92,5 +92,8 @@ public interface ErrorCodeConstants {
     ErrorCode BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING = new ErrorCode(1_011_008_001, "佣金提现记录状态不是审核中");
     ErrorCode BROKERAGE_WITHDRAW_MIN_PRICE = new ErrorCode(1_011_008_002, "提现金额不能低于 {} 元");
     ErrorCode BROKERAGE_WITHDRAW_USER_BALANCE_NOT_ENOUGH = new ErrorCode(1_011_008_003, "您当前最多可提现 {} 元");
+    ErrorCode NOT_SUFFICIENT_FUNDS = new ErrorCode(1_011_008_004, "账号无可用单量,需要充值");
+    ErrorCode CALLBACK_PARAMETER_ERROR = new ErrorCode(1_011_008_005, "第三方回调参数为Null");
+    ErrorCode SUBSCRIBER_ERROR = new ErrorCode(1_011_008_006, "订阅异常");
 
 }

+ 30 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderStateEnum.java

@@ -0,0 +1,30 @@
+package cn.newfeifan.mall.module.trade.enums.order;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 交易订单状态枚举
+ */
+@RequiredArgsConstructor
+@Getter
+public enum TradeOrderStateEnum {
+    ON_THE_WAY("0","在途"),
+    COLLECT("1","揽收"),
+    ABNORMAL("2","疑难"),
+    RECEIVED("3","已签收"),
+    CANCEL_A_VISA("4","退签"),
+    DELIVERY("5","派件"),
+    SEND_BACK("6","退回"),
+    TRANSFER_TO("7","转投"),
+    REFUSE_TO_SIGN("14","拒签");
+
+    /**
+     * 状态值
+     */
+    private final String state;
+    /**
+     * 状态名
+     */
+    private final String name;
+}

+ 25 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderSubscribeStatusEnum.java

@@ -0,0 +1,25 @@
+package cn.newfeifan.mall.module.trade.enums.order;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 订单订阅状态
+ *
+ */
+@RequiredArgsConstructor
+@Getter
+public enum TradeOrderSubscribeStatusEnum {
+    UNSUBSCRIBE(0, "未订阅"),
+    SUBSCRIBE(1, "已订阅"),
+    abnormal(2,"异常");
+
+    /**
+     * 状态值
+     */
+    private final Integer status;
+    /**
+     * 状态名
+     */
+    private final String name;
+}

+ 5 - 0
feifan-module-mall/feifan-module-trade-biz/pom.xml

@@ -124,6 +124,11 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.kuaidi100-api</groupId>
+            <artifactId>sdk</artifactId>
+            <version>1.0.12</version>
+        </dependency>
     </dependencies>
 
 </project>

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

@@ -22,6 +22,7 @@ import cn.newfeifan.mall.module.trade.convert.order.TradeOrderConvert;
 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.dal.dataobject.order.TradeOrderLogDO;
+import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStateEnum;
 import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStatusEnum;
 import cn.newfeifan.mall.module.trade.mq.producer.order.DistriOrderProducer;
 import cn.newfeifan.mall.module.trade.service.aftersale.AfterSaleService;
@@ -29,6 +30,9 @@ import cn.newfeifan.mall.module.trade.service.order.TradeOrderLogService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
 import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import com.kuaidi100.sdk.response.SubscribeResp;
+import com.kuaidi100.sdk.utils.SignUtils;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -38,13 +42,19 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+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.pojo.CommonResult.success;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.CALLBACK_PARAMETER_ERROR;
 
 @Tag(name = "管理后台 - 交易订单")
 @RestController
@@ -146,6 +156,52 @@ public class TradeOrderController {
         return success(true);
     }
 
+    @PostMapping("/callBackUrl")
+    @Operation(summary = "订单订阅回调")
+    public SubscribeResp callBackUrl(HttpServletRequest request) {
+        String param = request.getParameter("param");
+        if(param == null){
+            throw exception(CALLBACK_PARAMETER_ERROR);
+        }
+        String sign = request.getParameter("sign");
+        String orderId = request.getParameter("orderId");
+
+        Gson gson = new Gson();
+        Map<String, Object> map = gson.fromJson(param, Map.class);
+        Map<String, Object> lastResult = (Map<String, Object>) map.get("lastResult");
+        String state = (String) lastResult.get("state");
+
+        //判断订单状态是否是已签收
+        if (state.equals(TradeOrderStateEnum.RECEIVED.getState())) {
+            TradeOrderDO order = tradeOrderQueryService.getOrderById(Long.valueOf(orderId));
+            if (order != null) {
+                List<Map<String, Object>> dataList = (List<Map<String, Object>>) lastResult.get("data");
+                Map<String, Object> firstData = dataList.get(0);
+                //保存签收时间
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
+                order.setReceivingTime(LocalDateTime.parse(firstData.get("time").toString(), formatter));
+                tradeOrderUpdateService.updateOrderById(order);
+            }
+        }
+
+        //建议记录一下这个回调的内容,方便出问题后双方排查问题
+        log.debug("快递100订阅推送回调结果|{}|{}", param, sign);
+        //订阅时传的salt,没有可以忽略
+        String salt = "";
+        String ourSign = SignUtils.sign(param + salt);
+        log.info("订单:{},回调param:{}", orderId, param);
+        SubscribeResp subscribeResp = new SubscribeResp();
+        subscribeResp.setResult(Boolean.TRUE);
+        subscribeResp.setReturnCode("200");
+        subscribeResp.setMessage("成功");
+        //加密如果相等,属于快递100推送;否则可以忽略掉当前请求
+        if (ourSign.equals(sign)) {
+            //TODO 业务处理
+            return subscribeResp;
+        }
+        return null;
+    }
+
     @PutMapping("/update-remark")
     @Operation(summary = "订单备注")
     @PreAuthorize("@ss.hasPermission('trade:order:update')")
@@ -203,13 +259,13 @@ public class TradeOrderController {
     public CommonResult<Map<Integer, Long>> getOrderCount(@RequestParam(value = "merId", required = false) Long merId) {
         Map<Integer, Long> orderCount = Maps.newLinkedHashMapWithExpectedSize(6);
 
-        orderCount.put(-1, tradeOrderQueryService.getOrderCount(null, merId));
+        orderCount.put(-1, tradeOrderQueryService.getOrderCount(null, null, merId));
         orderCount.put(TradeOrderStatusEnum.AFTER_SALE.getStatus(), afterSaleService.getApplyingAfterSaleCount(null, merId));
-        orderCount.put(TradeOrderStatusEnum.UNPAID.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNPAID.getStatus(), merId));
-        orderCount.put(TradeOrderStatusEnum.UNDELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNDELIVERED.getStatus(), merId));
-        orderCount.put(TradeOrderStatusEnum.DELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.DELIVERED.getStatus(), merId));
-        orderCount.put(TradeOrderStatusEnum.COMPLETED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.COMPLETED.getStatus(), merId));
-        orderCount.put(TradeOrderStatusEnum.CANCELED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.CANCELED.getStatus(), merId));
+        orderCount.put(TradeOrderStatusEnum.UNPAID.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNPAID.getStatus(), null, merId));
+        orderCount.put(TradeOrderStatusEnum.UNDELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNDELIVERED.getStatus(), null, merId));
+        orderCount.put(TradeOrderStatusEnum.DELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.DELIVERED.getStatus(), null, merId));
+        orderCount.put(TradeOrderStatusEnum.COMPLETED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.COMPLETED.getStatus(), null, merId));
+        orderCount.put(TradeOrderStatusEnum.CANCELED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.CANCELED.getStatus(), null, merId));
         return success(orderCount);
     }
 
@@ -260,12 +316,12 @@ public class TradeOrderController {
                         .costPrice(k.getCostPrice())
                         .orderId(k.getOrderId())
                         .count(k.getCount())
+                        .orderItemId(k.getOrderItemId())
+                        .increaseIntegral(k.getIncreaseIntegral())
                         .totalPrice(k.getTotalPrice()).build())
                 .collect(Collectors.groupingBy(OrderItemMessage::getOrderId));
 
 
-
-
         List<OrderCalcMessage> orderCalcMessages = appTradeOrderDetailRespVos.stream().distinct().map(k -> {
             OrderCalcMessage orderCalcMessage = OrderCalcMessage.builder()
                     .orderId(k.getOrderId())
@@ -289,6 +345,4 @@ public class TradeOrderController {
     }
 
 
-
-
 }

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

@@ -334,4 +334,13 @@ public class TradeOrderDO extends BaseDO {
     private Long shopId;
 
     private Long merchantId;
+
+    /**
+     * 订阅物流信息,未订阅是0,已订阅是1
+     */
+    private Integer subscriptionLogisticsInfo;
+    /**
+     * 物流签收时间
+     */
+    private LocalDateTime receivingTime;
 }

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

@@ -33,19 +33,16 @@ public class TradeOrderItemDO extends BaseDO {
     private Long id;
     /**
      * 用户编号
-     *
      * 关联 MemberUserDO 的 id 编号
      */
     private Long userId;
     /**
      * 订单编号
-     *
      * 关联 {@link TradeOrderDO#getId()}
      */
     private Long orderId;
     /**
      * 购物车项编号
-     *
      * 关联 {@link CartDO#getId()}
      */
     private Long cartId;
@@ -53,25 +50,21 @@ public class TradeOrderItemDO extends BaseDO {
     // ========== 商品基本信息; 冗余较多字段,减少关联查询 ==========
     /**
      * 商品 SPU 编号
-     *
      * 关联 ProductSkuDO 的 spuId 编号
      */
     private Long spuId;
     /**
      * 商品 SPU 名称
-     *
      * 冗余 ProductSkuDO 的 spuName 编号
      */
     private String spuName;
     /**
      * 商品 SKU 编号
-     *
      * 关联 ProductSkuDO 的 id 编号
      */
     private Long skuId;
     /**
      * 属性数组,JSON 格式
-     *
      * 冗余 ProductSkuDO 的 properties 字段
      */
     @TableField(typeHandler = PropertyTypeHandler.class)
@@ -86,7 +79,6 @@ public class TradeOrderItemDO extends BaseDO {
     private Integer count;
     /**
      * 是否评价
-     *
      * true - 已评价
      * false - 未评价
      */
@@ -96,14 +88,12 @@ public class TradeOrderItemDO extends BaseDO {
 
     /**
      * 商品原价(单),单位:分
-     *
      * 对应 ProductSkuDO 的 price 字段
      * 对应 taobao 的 order.price 字段
      */
     private Integer price;
     /**
      * 优惠金额(总),单位:分
-     *
      * 对应 taobao 的 order.discount_fee 字段
      */
     private Integer discountPrice;
@@ -113,13 +103,11 @@ public class TradeOrderItemDO extends BaseDO {
     private Integer deliveryPrice;
     /**
      * 订单调价(总),单位:分
-     *
      * 正数,加价;负数,减价
      */
     private Integer adjustPrice;
     /**
      * 应付金额(总),单位:分
-     *
      * = {@link #price} * {@link #count}
      * - {@link #couponPrice}
      * - {@link #pointPrice}
@@ -134,25 +122,18 @@ public class TradeOrderItemDO extends BaseDO {
 
     /**
      * 优惠劵减免金额,单位:分
-     *
      * 对应 taobao 的 trade.coupon_fee 字段
      */
     private Integer couponPrice;
-    /**
-     * 积分抵扣的金额,单位:分
-     *
+    /*** 积分抵扣的金额,单位:分
      * 对应 taobao 的 trade.point_fee 字段
      */
     private Integer pointPrice;
-    /**
-     * 使用的积分
-     *
+    /*** 使用的积分
      * 目的:用于后续取消或者售后订单时,需要归还赠送
      */
     private Integer usePoint;
-    /**
-     * 赠送的积分
-     *
+    /*** 赠送的积分
      * 目的:用于后续取消或者售后订单时,需要扣减赠送
      */
     private Integer givePoint;
@@ -163,19 +144,20 @@ public class TradeOrderItemDO extends BaseDO {
 
     // ========== 售后基本信息 ==========
 
-    /**
-     * 售后单编号
-     *
+    /*** 售后单编号
      * 关联 {@link AfterSaleDO#getId()} 字段
      */
     private Long afterSaleId;
-    /**
-     * 售后状态
-     *
+    /*** 售后状态
      * 枚举 {@link TradeOrderItemAfterSaleStatusEnum}
      */
     private Integer afterSaleStatus;
 
+    /**
+     * 是否分配积分、身价权益,已分配是1,未分配为0
+     */
+    private Boolean distributeBenefit;
+
     /**
      * 商品属性
      */
@@ -184,26 +166,22 @@ public class TradeOrderItemDO extends BaseDO {
 
         /**
          * 属性编号
-         *
          * 关联 ProductPropertyDO 的 id 编号
          */
         private Long propertyId;
         /**
          * 属性名字
-         *
          * 关联 ProductPropertyDO 的 name 字段
          */
         private String propertyName;
 
         /**
          * 属性值编号
-         *
          * 关联 ProductPropertyValueDO 的 id 编号
          */
         private Long valueId;
         /**
          * 属性值名字
-         *
          * 关联 ProductPropertyValueDO 的 name 字段
          */
         private String valueName;

+ 1 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/config/TradeExpressProperties.java

@@ -23,10 +23,9 @@ public class TradeExpressProperties {
 
     /**
      * 快递客户端
-     *
      * 默认不提供,需要提醒用户配置一个快递服务商。
      */
-    private ExpressClientEnum client = ExpressClientEnum.NOT_PROVIDE;
+    private ExpressClientEnum client = ExpressClientEnum.KD_100;
 
     /**
      * 快递鸟配置

+ 6 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -12,7 +13,6 @@ import static cn.newfeifan.mall.framework.common.util.date.DateUtils.TIME_ZONE_D
 
 /**
  * 快递 100 实时快递查询 Resp DTO
- *
  * 参见  <a href="https://api.kuaidi100.com/document/5f0ffb5ebc8da837cbd8aefc">快递 100 文档</a>
  *
  * @author jason
@@ -37,7 +37,6 @@ public class Kd100ExpressQueryRespDTO {
 
     /**
      * 查询结果
-     *
      * 失败返回 "false"
      */
     private String result;
@@ -61,6 +60,11 @@ public class Kd100ExpressQueryRespDTO {
         @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
         private LocalDateTime time;
 
+        public void setTime(String time) {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
+            this.time = LocalDateTime.parse(time,formatter);
+        }
+
         /**
          * 轨迹描述
          */

+ 18 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java

@@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.HexUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.module.trade.enums.order.TradeOrderStateEnum;
 import cn.newfeifan.mall.module.trade.framework.delivery.config.TradeExpressProperties;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.ExpressClient;
 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.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO;
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.*;
@@ -17,6 +19,7 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
+import javax.annotation.Resource;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -40,6 +43,14 @@ public class Kd100ExpressClient implements ExpressClient {
     private final RestTemplate restTemplate;
     private final TradeExpressProperties.Kd100Config config;
 
+    public Kd100ExpressClient(RestTemplate restTemplate,TradeExpressProperties.Kd100Config config){
+        this.restTemplate = restTemplate;
+        this.config = config;
+    }
+
+    @Resource
+    private TradeOrderUpdateService tradeOrderUpdateService;
+
     /**
      * 查询快递轨迹
      *
@@ -63,7 +74,13 @@ public class Kd100ExpressClient implements ExpressClient {
         if (CollUtil.isEmpty(respDTO.getTracks())) {
             return Collections.emptyList();
         }
-        return INSTANCE.convertList2(respDTO.getTracks());
+        List<ExpressTrackRespDTO> expressTrackRespDTOS = INSTANCE.convertList2(respDTO.getTracks());
+
+        //如果状态为已签收("3"),则保存到订单信息中
+        if(respDTO.getState().equals(TradeOrderStateEnum.RECEIVED.getState())){
+            tradeOrderUpdateService.updateOrder(respDTO.getExpressCompanyCode(),respDTO.getLogisticsNo(),expressTrackRespDTOS.get(0).getTime());
+        }
+        return expressTrackRespDTOS;
     }
 
     /**

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

@@ -40,6 +40,8 @@ public class TradeOrderAutoCalcJob implements JobHandler {
                         .costPrice(k.getCostPrice())
                         .orderId(k.getOrderId())
                         .count(k.getCount())
+                        .orderItemId(k.getOrderItemId())
+                        .increaseIntegral(k.getIncreaseIntegral())
                         .totalPrice(k.getTotalPrice()).build())
                 .collect(Collectors.groupingBy(OrderItemMessage::getOrderId));
 

+ 1 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressService.java

@@ -79,4 +79,5 @@ public interface DeliveryExpressService {
      */
     List<DeliveryExpressDO> getDeliveryExpressListByStatus(Integer status);
 
+    DeliveryExpressDO selectByCode(String code);
 }

+ 5 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressServiceImpl.java

@@ -111,4 +111,9 @@ public class DeliveryExpressServiceImpl implements DeliveryExpressService {
         return deliveryExpressMapper.selectListByStatus(status);
     }
 
+    @Override
+    public DeliveryExpressDO selectByCode(String code) {
+        return deliveryExpressMapper.selectByCode(code);
+    }
+
 }

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

@@ -221,5 +221,6 @@ public interface TradeOrderQueryService {
      */
     ShopBO getShop();
 
+    TradeOrderDO getOrderById(Long orderId);
 
 }

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

@@ -281,6 +281,14 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
         return getShopBO(stringRedisTemplate, userMapper, log);
     }
 
+    @Override
+    public TradeOrderDO getOrderById(Long orderId) {
+        return tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getId,orderId)
+                .isNull(TradeOrderDO::getReceivingTime)
+        );
+    }
+
     public static ShopBO getShopBO(StringRedisTemplate stringRedisTemplate, AdminUserMapper userMapper, Logger log) {
         Long loginUserId = getLoginUserId();
         String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);

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

@@ -1,6 +1,5 @@
 package cn.newfeifan.mall.module.trade.service.order;
 
-import cn.newfeifan.mall.framework.common.enums.TerminalEnum;
 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;
@@ -12,6 +11,7 @@ import cn.newfeifan.mall.module.trade.controller.app.order.vo.item.AppTradeOrder
 import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
 
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 
 /**
  * 交易订单【写】Service 接口
@@ -196,4 +196,12 @@ public interface TradeOrderUpdateService {
      */
     void cancelPaidOrder(Long userId, Long orderId);
 
+    /**
+     * 保存订单的签收时间
+     * @param com 快递公司编码
+     * @param nu 单号
+     */
+    void updateOrder(String com, String nu, LocalDateTime time);
+
+    void updateOrderById(TradeOrderDO order);
 }

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

@@ -49,8 +49,19 @@ import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.kuaidi100.sdk.api.Subscribe;
+import com.kuaidi100.sdk.contant.ApiInfoConstant;
+import com.kuaidi100.sdk.core.IBaseClient;
+import com.kuaidi100.sdk.pojo.HttpResult;
+import com.kuaidi100.sdk.request.SubscribeParam;
+import com.kuaidi100.sdk.request.SubscribeParameters;
+import com.kuaidi100.sdk.request.SubscribeReq;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -72,7 +83,7 @@ import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
  * 交易订单【写】Service 实现类
  *
  * @author LeeYan9
- * @since 2022-08-26
+ * @since 2022-01-26
  */
 @Service
 @Slf4j
@@ -107,6 +118,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private TradeOrderProperties tradeOrderProperties;
 
+    @Value("${feifan.trade.express.kd100.key}")
+    private String key;
+
     // =================== Order ===================
 
     @Override
@@ -336,6 +350,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) {
         // 1.1 校验并获得交易订单(可发货)
         TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
+        order.setLogisticsId(deliveryReqVO.getLogisticsId());
+        order.setLogisticsNo(deliveryReqVO.getLogisticsNo());
         // 1.2 校验 deliveryType 是否为快递,是快递才可以发货
         if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) {
             throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS);
@@ -352,9 +368,18 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             // 2.2 无需发货
             updateOrderObj.setLogisticsId(0L).setLogisticsNo("");
         }
+
+        try {
+            //发送订单订阅
+            testSubscribe(order);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
         // 执行更新
         updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now());
         int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj);
+        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectById(order.getId());
         if (updateCount == 0) {
             throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED);
         }
@@ -369,6 +394,57 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null));
     }
 
+    /**
+     * 测试订阅物流信息
+     *
+     * @param order 交易订单对象,包含物流信息和接收人手机号
+     * @throws Exception 抛出异常,可能由于外部服务调用失败等原因
+     */
+    private void testSubscribe(TradeOrderDO order) throws Exception {
+        // 根据物流ID获取配送信息
+        DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(order.getLogisticsId());
+
+        // 设置订阅参数,包括回调URL和手机号
+        SubscribeParameters subscribeParameters = new SubscribeParameters();
+        subscribeParameters.setCallbackurl("https://47.107.28.221:8002/admin-api/trade/order/callBackUrl?orderId="+order.getId());
+        subscribeParameters.setPhone(order.getReceiverMobile());
+
+        // 创建订阅参数实例,并设置相关公司代码、物流单号和密钥
+        SubscribeParam subscribeParam = new SubscribeParam();
+        subscribeParam.setParameters(subscribeParameters);
+        subscribeParam.setCompany(deliveryExpress.getCode());
+        subscribeParam.setNumber(order.getLogisticsNo());
+        subscribeParam.setKey(key);
+
+        // 构建订阅请求对象,设置请求模式和参数
+        SubscribeReq subscribeReq = new SubscribeReq();
+        subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA);
+        subscribeReq.setParam(new Gson().toJson(subscribeParam));
+
+        // 调用订阅服务,并打印执行结果
+        IBaseClient subscribe = new Subscribe();
+        HttpResult execute = subscribe.execute(subscribeReq);
+
+        Gson gson = new Gson();
+        JsonObject jsonObject = gson.fromJson(execute.getBody(), JsonObject.class);
+        boolean result = jsonObject.get("result").getAsBoolean();
+        String returnCode = jsonObject.get("returnCode").getAsString();
+
+        if (result && returnCode.equals("200")) {
+            log.info("订单号:{}:订阅成功",order.getLogisticsNo());
+
+            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.SUBSCRIBE.getStatus());
+        } else if(returnCode.equals("600") || returnCode.equals("601")) {
+            throw exception(NOT_SUFFICIENT_FUNDS);
+        } else {
+            log.info("订单号:{}:订阅失败",order.getLogisticsNo());
+
+            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.abnormal.getStatus());
+        }
+        tradeOrderMapper.updateById(order);
+
+    }
+
     /**
      * 校验交易订单满足被发货的条件
      * <p>
@@ -837,6 +913,31 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
     }
 
+    /**
+     * 保存订单的签收时间
+     * @param com 快递公司编码
+     * @param nu 单号
+     */
+    public void updateOrder(String com, String nu, LocalDateTime time){
+        DeliveryExpressDO deliveryExpressDO = deliveryExpressService.selectByCode(com);
+        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getLogisticsNo, nu)
+                .eq(TradeOrderDO::getLogisticsId, deliveryExpressDO.getId())
+                .isNull(TradeOrderDO::getReceivingTime)
+        );
+        if(tradeOrderDO == null){
+            return;
+        }
+        tradeOrderDO.setReceivingTime(time);
+
+        tradeOrderMapper.updateById(tradeOrderDO);
+    }
+
+    @Override
+    public void updateOrderById(TradeOrderDO order) {
+        tradeOrderMapper.updateById(order);
+    }
+
     /**
      * 创建单个订单的评论
      *

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

@@ -57,10 +57,11 @@
         tor.user_id as userId,
         ps.merchant_id as merchantId,
         ps.shop_id as shopId,
-        ps.shop_id as shopId,
         mu.`name` as name,
         mu.nickname as nickname,
-        toi.count as `count`
+        toi.count as `count`,
+        toi.id as orderItemId,
+        toi.increase_integral AS increaseIntegral
         from trade_order tor
         LEFT JOIN member_user mu
         ON tor.user_id = mu.id
@@ -70,6 +71,9 @@
         on toi.sku_id = ps.id
         <where>
             tor.pay_status = 1
+            and toi.distribute_benefit = 0
+            and (toi.after_sale_status = 0 or toi.after_sale_status = 61)
+            and tor.receiving_time &lt; DATE_SUB(NOW(), INTERVAL 7 DAY)
             <if test="orderIds!=null">
                 and tor.id in (
                 <foreach collection="orderIds" item="orderId" separator=",">

+ 3 - 3
feifan-server/src/main/resources/application.yaml

@@ -255,13 +255,13 @@ feifan:
       receive-expire-time: 14d # 收货的过期时间
       comment-expire-time: 7d # 评论的过期时间
     express:
-      client: kd_niao
+      client: KD_100
       kd-niao:
         api-key: cb022f1e-48f1-4c4a-a723-9001ac9676b8
         business-id: 1809751
       kd100:
-        key: pLXUGAwK5305
-        customer: E77DF18BE109F454A5CD319E44BF5177
+        key: vAeIErtY7248
+        customer: 7FA4F892DB920F6EB6DEACF31D6B0D4F
 
 debug: false