Răsfoiți Sursa

修改合赢奖的计算程序

Yangzw 8 luni în urmă
părinte
comite
30a9cfa464
24 a modificat fișierele cu 238 adăugiri și 65 ștergeri
  1. 7 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java
  2. 2 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  3. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java
  4. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java
  5. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/integral/IntegralDO.java
  6. 8 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java
  7. 8 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  8. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/message/order/DistriOrderMessage.java
  9. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/message/order/OrderItemMessage.java
  10. 5 12
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailyawardrecords/DailyAwardRecordsServiceImpl.java
  11. 14 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  12. 32 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  13. 11 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  14. 1 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java
  15. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitdailystatisticslog/PtProfitDailyStatisticsLogService.java
  16. 25 32
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitdailystatisticslog/PtProfitDailyStatisticsLogServiceImpl.java
  17. 2 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/tools/LocalDateTimeTool.java
  18. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  19. 6 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  20. 1 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  21. 5 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java
  22. 61 7
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  23. 8 2
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml
  24. 11 1
      sql/mysql/建空库SQL/13_20240617.sql

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

@@ -1,6 +1,8 @@
 package cn.newfeifan.mall.module.distri.constant;
 
 
+import java.math.BigDecimal;
+
 public class DistriConstants {
     // ========== 分销信息商户信息 1-002-029-000 ==========
     public static final Integer PERCENT = 10000;
@@ -14,4 +16,9 @@ public class DistriConstants {
 
     //将身价参数存在redis中的前缀
     public static final String DISTRI_ORDER_PERCENTAGE  = "distri:orderPercentage";
+
+    // 数据库中,积分比金钱大的倍数,即钱转成积分要乘于此参数
+    public static final Integer MONEY2INTEGRAL = PERCENT;
+
+    public static final BigDecimal MONEY2INTEGRAL_BIG_DECIMAL = new BigDecimal(Integer.parseInt(MONEY2INTEGRAL.toString()));
 }

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

@@ -27,6 +27,8 @@ public enum CaclEnum {
     ORDER_REFUND_INTEGRAL_ANCESTER(20,"订单退款-撤回直推奖","订单退款,收回消费者的推荐人,获得的冻结积分"),
     ORDER_PAY_INTEGRAL_CONSUMER(21, "购物获得","消费者购物,获得冻结积分"),//购物者本人 获得积分
     SMALL_QUOTA_CRASH_SETTLE(22, "合赢奖结算获得","每天计算的合赢奖7天后结算"),
+    ORDER_PAY_FREEZE_HIGH_QUOTA(23, "购物获得","消费者购物,获得冻结峰值"),
+    ORDER_REFUND_ORDER_PAY_FREEZE_HIGH_QUOTA(24, "订单退款-撤回峰值奖","消费者购物,获得冻结峰值")
     ;
 
     /**

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

@@ -44,4 +44,6 @@ public class IntegralSaveReqVO {
     @Schema(description = "最高可获取积分", requiredMode = Schema.RequiredMode.REQUIRED)
     private Long highQuota;
 
+    @Schema(description = "冻结的最高可获取积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long freezeHighQuota;
 }

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

@@ -56,4 +56,10 @@ public class PtProfitLogSaveReqVO {
     @Schema(description = "产生积分的用户ID,例如:下订单的用户ID", example = "31502")
     private Long generateUserId;
 
+    @Schema(description = "变动的冻结最大可用额度")
+    private Long freezeHighQuota;
+
+    @Schema(description = "变动后的冻结最大可用额度")
+    private Long afterFreezeHighQuota;
+
 }

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

@@ -60,4 +60,8 @@ public class IntegralDO extends BaseDO {
      * 最高可获取积分
      */
     private Long highQuota;
+    /**
+     * 冻结的最高可获取积分
+     */
+    private Long freezeHighQuota;
 }

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

@@ -84,5 +84,12 @@ public class PtProfitLogDO extends BaseDO {
      */
     private Long generateUserId;
 
-
+    /**
+     * 变动的冻结最大可用额度
+     */
+    private Long freezeHighQuota;
+    /**
+     * 变动后的冻结最大可用额度
+     */
+    private Long afterFreezeHighQuota;
 }

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

@@ -36,7 +36,10 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                 ORDER_REFUND_INTEGRAL_CONSUMER.getType(),
                 ORDER_REFUND_INTEGRAL_ANCESTER.getType(),
                 ORDER_PAY_INTEGRAL_CONSUMER.getType(),
-                SMALL_QUOTA_CRASH_SETTLE.getType());
+                SMALL_QUOTA_CRASH_SETTLE.getType(),
+                ORDER_PAY_FREEZE_HIGH_QUOTA.getType(),
+                ORDER_REFUND_ORDER_PAY_FREEZE_HIGH_QUOTA.getType()
+        );
 
         if(reqVO.getUserId().equals(PT_ID)){
             profitStatus = Arrays.asList(
@@ -54,7 +57,9 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                     ORDER_PAY_INTEGRAL.getType(),
                     ORDER_REFUND_INTEGRAL.getType(),
                     ORDER_CANCEL_BY_USER_REFUND_INTEGRAL.getType(),
-                    ORDER_CANCEL_BY_SYSTEM_REFUND_INTEGRAL.getType()
+                    ORDER_CANCEL_BY_SYSTEM_REFUND_INTEGRAL.getType(),
+                    ORDER_PAY_FREEZE_HIGH_QUOTA.getType(),
+                    ORDER_REFUND_ORDER_PAY_FREEZE_HIGH_QUOTA.getType()
             );
 //            reqVO.setUserId(null);
         }
@@ -63,6 +68,7 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                 .eqIfPresent(PtProfitLogDO::getUserId, reqVO.getUserId())
                 .in(PtProfitLogDO::getProfitStatus, profitStatus)
                 .orderByDesc(PtProfitLogDO::getCreateTime)
+                .orderByDesc(PtProfitLogDO::getId)
         );
     }
 }

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

@@ -84,6 +84,11 @@ public class DistriOrderMessage {
      */
     private Long ancestorIncreaseIntegral;
 
+    /**
+     * 用户获得冻结最大可用额度
+     */
+    private Long freezeHighQuota;
+
 
     @Override
     public boolean equals(Object o) {

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

@@ -52,4 +52,9 @@ public class OrderItemMessage {
      * 订单项ID
      */
     private Long orderItemId;
+
+    /**
+     * 用户获得冻结最大可用额度
+     */
+    private Long freezeHighQuota;
 }

+ 5 - 12
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/dailyawardrecords/DailyAwardRecordsServiceImpl.java

@@ -20,8 +20,6 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.dailyawardrecords.DailyAwardRecordsMapper;
 
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -102,18 +100,13 @@ public class DailyAwardRecordsServiceImpl implements DailyAwardRecordsService {
 
     @Override
     public void transitionBonus() {
-        // 获取当前时间减去7天
-        LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(6);
-
-        // 格式化成数据库可以识别的日期时间格式(假设数据库字段为 LocalDateTime 类型)
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        String formattedDate = sevenDaysAgo.format(formatter);
-
         //获取到当前7天前未结算的记录
-        List<DailyAwardRecordsDO> dailyAwardRecordsSaveReqVOS = dailyAwardRecordsMapper.selectList(new LambdaQueryWrapper<DailyAwardRecordsDO>()
+        LambdaQueryWrapper<DailyAwardRecordsDO> wrapper = new LambdaQueryWrapper<DailyAwardRecordsDO>()
                 .eq(DailyAwardRecordsDO::getSettled, false)
-                .lt(DailyAwardRecordsDO::getCreateTime, formattedDate)
-        );
+                .apply("date(create_time) <= DATE_SUB(now(), INTERVAL 7 DAY)");
+//                .apply("date(create_time) <= DATE_SUB('2024-06-21', INTERVAL 7 DAY)");
+
+        List<DailyAwardRecordsDO> dailyAwardRecordsSaveReqVOS = dailyAwardRecordsMapper.selectList(wrapper);
 
         dailyAwardRecordsSaveReqVOS.forEach(dailyAwardRecordsDO -> {
             //获取用户钱包

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

@@ -1,10 +1,12 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import javax.validation.*;
 import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 
 /**
  * 推荐用户积分 Service 接口
@@ -81,4 +83,16 @@ public interface IntegralService {
 
     IntegralDO getIntegralByUserId(Long userId);
 
+    /**
+     * 修改用户身价
+     *
+     * @param generateUserId       导致产生积分变动的用户ID
+     * @param userId               身价变动类别
+     * @param caclEnum             变化类型
+     * @param totalFreezeHighQuota 冻结峰值
+     * @param tradeOrderId         订单ID
+     * @param orderNum             订单号
+     * @param payTime
+     */
+    void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum, LocalDateTime payTime);
 }

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

@@ -1,6 +1,9 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+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.sharepath.SharePathService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.context.annotation.Lazy;
@@ -10,6 +13,7 @@ import javax.annotation.Resource;
 
 import org.springframework.validation.annotation.Validated;
 
+import java.time.LocalDateTime;
 import java.util.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.*;
@@ -34,6 +38,9 @@ public class IntegralServiceImpl implements IntegralService {
     @Resource
     private IntegralMapper integralMapper;
 
+    @Resource
+    private PtProfitLogMapper ptProfitLogMapper;
+
     @Resource
     @Lazy
     private SharePathService sharePathService;
@@ -131,4 +138,29 @@ public class IntegralServiceImpl implements IntegralService {
         );
     }
 
+    @Override
+    public void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum, LocalDateTime payTime) {
+        try{
+            IntegralDO integralDO = integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, userId));
+            integralDO.setFreezeHighQuota(integralDO.getFreezeHighQuota() + totalFreezeHighQuota);
+            integralMapper.updateById(integralDO);
+
+            //记录用户的积分变动日志
+            PtProfitLogDO ptProfitLogDO = PtProfitLogDO.builder()
+                    .freezeHighQuota(totalFreezeHighQuota)
+                    .afterFreezeHighQuota(integralDO.getFreezeHighQuota())
+                    .userId(userId)
+                    .generateUserId(generateUserId)
+                    .profitStatus(caclEnum.getType())
+                    .orderId(tradeOrderId)
+                    .orderNo(orderNum)
+                    .build();
+            ptProfitLogDO.setCreateTime(payTime);
+            ptProfitLogDO.setUpdateTime(payTime);
+            ptProfitLogMapper.insert(ptProfitLogDO);
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+    }
+
 }

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

@@ -178,6 +178,8 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 
             // 计算每家店铺每日订单
             dailyBillService.caleDailyBill();
+
+            System.out.println("=================计算程序结束====================");
         }
     }
 
@@ -323,7 +325,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
             // 计算
             // 计算利润: (价格 - 成本价格) * 产品数量
             //用户自得和直推奖不用计算,从orderItem里面获取
-            final BigDecimal[] profit = {new BigDecimal("0"), new BigDecimal("0"), new BigDecimal("0")};
+            final BigDecimal[] profit = {new BigDecimal("0"), new BigDecimal("0"), new BigDecimal("0"), new BigDecimal("0")};
             k.getOrderItemMessages().forEach(j -> {
                 BigDecimal onePrice = new BigDecimal(j.getPrice());
                 BigDecimal oneCostPrice = new BigDecimal(j.getCostPrice());
@@ -331,7 +333,8 @@ 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()));     //直推奖
+                profit[3] = profit[3].add(new BigDecimal(j.getFreezeHighQuota()));     //用户获得冻结最大可用额度
 
                 // 遍历订单项拿到订单项编号
                 //将当前订单项设置为已分配权益
@@ -360,12 +363,13 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 
 
             // 计算当前下单人的毛利的十倍
-            BigDecimal highQuota = grossProfit.multiply(new BigDecimal("10")).setScale(4, RoundingMode.DOWN);
+//            BigDecimal highQuota = grossProfit.multiply(new BigDecimal("10")).setScale(4, RoundingMode.DOWN);
+            BigDecimal highQuota = profit[3];
 
             // 乘以 10000 并转换为整数
             Long ancestorQuotaInt = ancestorQuota.longValue();
             Long descendantQuotaInt = descendantQuota.longValue();
-            Long highQuotaInt = highQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
+            Long highQuotaInt = highQuota.longValue();
             Long grossProfitAfterBonusInt = grossProfitAfterBonus.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
             Long platformQuotaInt = platformQuota.multiply(new BigDecimal("10000")).setScale(0, RoundingMode.DOWN).longValue();
 
@@ -505,6 +509,8 @@ public class OrderCalcServiceImpl implements OrderCalcService {
                     .afterFreezeAmount(integralDO.getFreezeQuota())
                     .maxAvailablePointsAmount(highQuotaInt)
                     .afterMaxAvailablePointsAmount(integralDO.getHighQuota()+ new BigDecimal(orderPercentageDO.getBaseMaxQuota()).longValue())
+                    .freezeHighQuota(-highQuotaInt)
+                    .afterFreezeHighQuota(integralDO.getFreezeHighQuota())
                     .percentTemplate(percentTemplate)
                     .generateUserId(integralDO.getUserId())
                     .build();
@@ -604,6 +610,7 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         // 修改用户钱包
         // 增加直推人额度
         integralDO.setHighQuota(integralDO.getHighQuota() + highQuota);
+        integralDO.setFreezeHighQuota(integralDO.getFreezeHighQuota() - highQuota);
         // todo 增加累计额度
 
         integralDO.setCurrentQuota(integralDO.getCurrentQuota() + descendantQuota);

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

@@ -547,6 +547,7 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
         LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); // 今天的开始时间,即午夜12点
         LocalDateTime localDateTime = todayStart.minusDays(1);
         String yesterdayString = localDateTime.toString();
+//        return "CRASH:" + userId + ":" + "2024-06-20T00:00";
         return "CRASH:" + userId + ":" + yesterdayString;
 
     }

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

@@ -50,6 +50,6 @@ public interface PtProfitDailyStatisticsLogService {
      */
     PageResult<PtProfitDailyStatisticsLogDO> getPtProfitDailyStatisticsLogPage(PtProfitDailyStatisticsLogPageReqVO pageReqVO);
 
-    void createPtProfitDailyStatisticsLog();
+//    void createPtProfitDailyStatisticsLog();
 
 }

+ 25 - 32
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitdailystatisticslog/PtProfitDailyStatisticsLogServiceImpl.java

@@ -1,17 +1,11 @@
 package cn.newfeifan.mall.module.distri.service.ptprofitdailystatisticslog;
 
-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.tools.LocalDateTimeTool;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 
-import java.time.LocalDate;
-import java.util.*;
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitdailystatisticslog.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitdailystatisticslog.PtProfitDailyStatisticsLogDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -20,7 +14,6 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.module.distri.dal.mysql.ptprofitdailystatisticslog.PtProfitDailyStatisticsLogMapper;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.newfeifan.mall.module.distri.enums.CaclEnum.AFTER_CRASH_CALC_PT_TOTAL_GROSS_QUOTA;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
 /**
@@ -83,30 +76,30 @@ public class PtProfitDailyStatisticsLogServiceImpl implements PtProfitDailyStati
         return ptProfitDailyStatisticsLogMapper.selectPage(pageReqVO);
     }
 
-    @Override
-    public void createPtProfitDailyStatisticsLog() {
-        LocalDate now = LocalDate.now();
-
-        //确保每天只有一条记录
-        PtProfitDailyStatisticsLogDO ptLog = ptProfitDailyStatisticsLogMapper.selectByEveryday(now);
-        if (ptLog != null) {
-            deletePtProfitDailyStatisticsLog(ptLog.getId());
-        }
-        //获取平台总收益
-        PtProfitDO ptProfitDO = ptProfitMapper.selectList().get(0);
-        //获取当天碰撞支出总和
-        List<PtProfitLogDO> ptProfitLogDOS = ptProfitLogMapper.selectList(new LambdaQueryWrapper<PtProfitLogDO>()
-                .between(PtProfitLogDO::getCreateTime, LocalDateTimeTool.startTime(now), LocalDateTimeTool.endTime(now))
-                .eq(PtProfitLogDO::getProfitStatus, AFTER_CRASH_CALC_PT_TOTAL_GROSS_QUOTA)
-        );
-        Long sum = ptProfitLogDOS.stream().mapToLong(PtProfitLogDO::getAmount).sum();
-
-        ptLog = new PtProfitDailyStatisticsLogDO();
-        ptLog.setEveryday(now);
-        ptLog.setTotalCollisionAmount(sum);
-        ptLog.setTotalRemainingAmount(ptProfitDO.getPtTotalAdd());
-
-        ptProfitDailyStatisticsLogMapper.insert(ptLog);
-    }
+//    @Override
+//    public void createPtProfitDailyStatisticsLog() {
+//        LocalDate now = LocalDate.now();
+//
+//        //确保每天只有一条记录
+//        PtProfitDailyStatisticsLogDO ptLog = ptProfitDailyStatisticsLogMapper.selectByEveryday(now);
+//        if (ptLog != null) {
+//            deletePtProfitDailyStatisticsLog(ptLog.getId());
+//        }
+//        //获取平台总收益
+//        PtProfitDO ptProfitDO = ptProfitMapper.selectList().get(0);
+//        //获取当天碰撞支出总和
+//        List<PtProfitLogDO> ptProfitLogDOS = ptProfitLogMapper.selectList(new LambdaQueryWrapper<PtProfitLogDO>()
+//                .between(PtProfitLogDO::getCreateTime, LocalDateTimeTool.startTime(now), LocalDateTimeTool.endTime(now))
+//                .eq(PtProfitLogDO::getProfitStatus, AFTER_CRASH_CALC_PT_TOTAL_GROSS_QUOTA)
+//        );
+//        Long sum = ptProfitLogDOS.stream().mapToLong(PtProfitLogDO::getAmount).sum();
+//
+//        ptLog = new PtProfitDailyStatisticsLogDO();
+//        ptLog.setEveryday(now);
+//        ptLog.setTotalCollisionAmount(sum);
+//        ptLog.setTotalRemainingAmount(ptProfitDO.getPtTotalAdd());
+//
+//        ptProfitDailyStatisticsLogMapper.insert(ptLog);
+//    }
 
 }

+ 2 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/tools/LocalDateTimeTool.java

@@ -5,12 +5,11 @@ import java.time.LocalDateTime;
 
 public class LocalDateTimeTool {
     public static LocalDateTime startTime(LocalDate date){
-        LocalDateTime startTime = date.atStartOfDay();
-        return startTime.plusHours(3);
+        return date.atStartOfDay();
     }
 
     public static LocalDateTime endTime(LocalDate date){
         LocalDateTime startTime = date.atStartOfDay();
-        return startTime.plusDays(1).plusHours(3);
+        return startTime.plusHours(24);
     }
 }

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

@@ -334,5 +334,13 @@ public class TradeOrderController {
         return success("success");
     }
 
+    @GetMapping("/calcOrderItem")
+    @Operation(summary = "计算所有订单的订单项的可获得峰值")
+    public CommonResult<String> calcOrderItem() {
+        tradeOrderUpdateService.updateOrderItemByFreezeHighQuota();
+
+        return success("success");
+    }
+
 
 }

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

@@ -163,6 +163,12 @@ public class TradeOrderItemDO extends BaseDO {
       */
     private Long ancestorIncreaseIntegral;
 
+    /**
+     * 用户获得冻结最大可用额度
+     */
+    private Long freezeHighQuota;
+
+
     /**
      * 商品属性
      */

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

@@ -314,6 +314,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
                         .orderItemId(k.getOrderItemId())
                         .increaseIntegral(k.getIncreaseIntegral())
                         .ancestorIncreaseIntegral(k.getAncestorIncreaseIntegral())
+                        .freezeHighQuota(k.getFreezeHighQuota())
                         .totalPrice(k.getTotalPrice()).build())
                 .collect(Collectors.groupingBy(OrderItemMessage::getOrderId));
 

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

@@ -204,4 +204,9 @@ public interface TradeOrderUpdateService {
     void updateOrder(String com, String nu, LocalDateTime time);
 
     void updateOrderById(TradeOrderDO order);
+
+    /**
+     * 手动启动计算已支付的订单项的冻结峰值
+     */
+    void updateOrderItemByFreezeHighQuota();
 }

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

@@ -11,6 +11,9 @@ import cn.newfeifan.mall.framework.common.core.KeyValue;
 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.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.pay.api.order.PayOrderApi;
@@ -19,6 +22,8 @@ import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderRespDTO;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
 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.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;
@@ -68,12 +73,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
@@ -99,6 +103,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private TradeNoRedisDAO tradeNoRedisDAO;
 
+    @Resource
+    private IntegralService integralService;
+
     @Resource
     private List<TradeOrderHandler> tradeOrderHandlers;
 
@@ -126,6 +133,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Value("${feifan.trade.express.kd100.key}")
     private String key;
 
+    @Resource
+    private ProductSkuMapper productSkuMapper;
+
     // =================== Order ===================
 
     @Override
@@ -361,7 +371,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_DELIVERY)
     public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) {
         //校验发货信息不能都为空
-        if(deliveryReqVO.getLogisticsNo() == null && deliveryReqVO.getDeliveryRemark() == null){
+        if (deliveryReqVO.getLogisticsNo() == null && deliveryReqVO.getDeliveryRemark() == null) {
             throw exception(ORDER_DELIVERY_DETAILS_IS_NULL);
         }
 
@@ -398,10 +408,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         }
 
         // 执行更新
-        if(deliveryReqVO.getDeliveryRemark() != null){
+        if (deliveryReqVO.getDeliveryRemark() != null) {
             //如果是虚拟商品直接完成发货和签收
             updateOrderObj.setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()).setDeliveryTime(LocalDateTime.now()).setReceivingTime(LocalDateTime.now());
-        }else{
+        } else {
             updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now());
         }
         int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj);
@@ -977,6 +987,50 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         tradeOrderMapper.updateById(order);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateOrderItemByFreezeHighQuota() {
+        List<TradeOrderDO> tradeOrderDOS = tradeOrderMapper.selectList(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getPayStatus, true)
+        );
+
+        for (TradeOrderDO tradeOrderDO : tradeOrderDOS) {
+            List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectList(new LambdaQueryWrapper<TradeOrderItemDO>()
+                    .eq(TradeOrderItemDO::getOrderId, tradeOrderDO.getId())
+                    .isNull(TradeOrderItemDO::getAfterSaleId)
+            );
+
+            Long totalFreezeHighQuota = 0L;
+
+            //订单项
+            for (TradeOrderItemDO orderItem : tradeOrderItemDOS) {
+                ProductSkuDO productSkuDO = productSkuMapper.selectById(orderItem.getSkuId());
+
+                //毛利
+                Integer promotionExpenses = (productSkuDO.getPrice() - productSkuDO.getCostPrice())
+                        * orderItem.getCount();
+
+                //毛利 * 10 = 峰值
+                BigDecimal grossProfit = new BigDecimal(promotionExpenses).multiply(new BigDecimal(1)).setScale(4, RoundingMode.DOWN);
+                BigDecimal freezeHighQuota = grossProfit.multiply(new BigDecimal("10"));
+                freezeHighQuota = money2Integral(freezeHighQuota);
+                Long freezeHighQuotaInt = freezeHighQuota.longValue();
+
+                totalFreezeHighQuota += freezeHighQuotaInt;
+
+                orderItem.setFreezeHighQuota(freezeHighQuotaInt);
+                tradeOrderItemMapper.updateById(orderItem);
+            }
+
+            //修改购物者本人获得的冻结峰值
+            integralService.updateIntegralFreezeHighQuota(tradeOrderDO.getUserId(), tradeOrderDO.getUserId(), CaclEnum.ORDER_PAY_FREEZE_HIGH_QUOTA,totalFreezeHighQuota,tradeOrderDO.getId(),tradeOrderDO.getNo(),tradeOrderDO.getPayTime());
+        }
+    }
+
+    public static BigDecimal money2Integral(BigDecimal money) {
+        return money.multiply(DistriConstants.MONEY2INTEGRAL_BIG_DECIMAL);
+    }
+
     /**
      * 创建单个订单的评论
      *

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

@@ -35,7 +35,8 @@
                toi.count as `count`,
                toi.id as orderItemId,
                toi.increase_integral AS increaseIntegral,
-               toi.ancestor_increase_integral AS ancestorIncreaseIntegral
+               toi.ancestor_increase_integral AS ancestorIncreaseIntegral,
+               toi.freeze_high_quota AS freezeHighQuota
         from trade_order tor
                  LEFT JOIN member_user mu
                            ON tor.user_id = mu.id
@@ -44,9 +45,12 @@
                  LEFT JOIN product_sku ps
                            on toi.sku_id = ps.id
         where tor.pay_status = 1
+        and tor.deleted = 0 and toi.deleted = 0
         and toi.distribute_benefit = 0
         and (toi.after_sale_status = 0 or toi.after_sale_status = 61)
-        and tor.pay_time &lt; DATE_SUB(NOW(), INTERVAL 6 DAY)
+        and date(tor.pay_time) <![CDATA[ <= ]]> DATE_SUB(CURDATE(), INTERVAL 7 DAY)
+--         and date(tor.pay_time) <![CDATA[ <= ]]> DATE_SUB('2024-06-21', INTERVAL 7 DAY)
+--         and date(tor.pay_time) = '2024-06-20'
 --           and tor.receiving_time &lt; DATE_SUB(NOW(), INTERVAL 7 DAY)
     </select>
 
@@ -75,9 +79,11 @@
                  LEFT JOIN product_sku ps
                            on toi.sku_id = ps.id
         where tor.pay_status = 1
+          and tor.deleted = 0 and toi.deleted = 0
           and (toi.after_sale_status = 0 or toi.after_sale_status = 61)
           and toi.transition_time is null
           and DATE(tor.create_time) &lt; CURDATE()
+--           and DATE(tor.create_time) = '2024-06-20'
     </select>
 
     <select id="queryAllOrderByOrderIds"

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

@@ -29,4 +29,14 @@ CREATE TABLE `distri_daily_award_records` (
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='每日用户获得合赢奖记录';
 
 ALTER TABLE trade_order_item
-    ADD COLUMN transition_time datetime DEFAULT NULL COMMENT '订单项金额转换冻结的时间(合赢奖)';
+    ADD COLUMN transition_time datetime DEFAULT NULL COMMENT '订单项金额转换冻结的时间(合赢奖)';
+
+ALTER TABLE distri_integral
+    ADD freeze_high_quota BIGINT NOT NULL DEFAULT '0' COMMENT '冻结的最高可获取积分';
+
+ALTER TABLE distri_pt_profit_log
+    ADD COLUMN freeze_high_quota BIGINT DEFAULT NULL COMMENT '变动的冻结最大可用额度',
+ADD COLUMN after_freeze_high_quota BIGINT DEFAULT NULL COMMENT '变动后的冻结最大可用额度';
+
+ALTER TABLE trade_order_item
+    ADD COLUMN freeze_high_quota BIGINT DEFAULT NULL COMMENT '用户获得冻结最大可用额度';