xuqiang пре 3 месеци
родитељ
комит
cbbb5dff93

+ 19 - 0
partner/src/main/java/com/jzg/constants/BigConstants.java

@@ -0,0 +1,19 @@
+package com.jzg.constants;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class BigConstants {
+
+    public static final BigDecimal WEIGHT_YQ = new BigDecimal("0.33");
+    public static final BigDecimal WEIGHT_BF = new BigDecimal("0.34");
+    public static final BigDecimal WEIGHT_GR = new BigDecimal("0.33");
+    public static final BigDecimal WEIGHT_TWO_ITEMS = new BigDecimal("0.50");
+    public static final BigDecimal WEIGHT_ONE_ITEM = BigDecimal.ONE;
+    public static final BigDecimal FULL_RATE = BigDecimal.ONE;
+    public static final BigDecimal HUNDRED = new BigDecimal("100");
+    public static final int DIV_SCALE = 10;
+    public static final int RESULT_SCALE = 2;
+    public static final RoundingMode ROUND_MODE = RoundingMode.HALF_UP;
+
+}

+ 2 - 0
partner/src/main/java/com/jzg/entity/PartnerUser.java

@@ -93,5 +93,7 @@ public class PartnerUser extends PartnerBaseModel {
     @TableField(value = "status")
     private boolean status;
 
+    private boolean first;
+
 
 }

+ 5 - 6
partner/src/main/java/com/jzg/mapper/PartnerUserMapper.java

@@ -118,9 +118,8 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Update("UPDATE partner_user SET upgrade_time = #{date} WHERE  user_id = #{userId} and grade = #{grade}")
     void updateUpgradeTimeByDate(@Param("userId") String userId,@Param("date") Date date,@Param("grade") Integer grade);
 
-    @Update(" UPDATE partner_user pu JOIN( SELECT info.id AS info_id, sa.partner_review_time FROM sys_user_jzg_info info " +
-            " INNER JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = info.id " +
-            " WHERE sa.type_attr = 3 AND sa.partner_status = 3 AND info.user_id = #{userId} LIMIT 1) t ON pu.user_id = t.info_id SET pu.upgrade_time = t.partner_review_time WHERE pu.grade = #{grade} ")
+    @Update(" UPDATE partner_user pu JOIN( SELECT sa.sys_user_jzg_info_id AS info_id,DATE(sa.partner_review_time) as partner_review_time   FROM sys_user_jzg_info_salesman sa " +
+            " WHERE sa.type_attr = 3 AND sa.partner_status = 3 AND sa.sys_user_jzg_info_id = #{userId} ) t ON pu.user_id = t.info_id SET pu.upgrade_time = t.partner_review_time WHERE pu.grade = #{grade} ")
     void updateUpgradeTime(@Param("userId")String userId,@Param("grade") String grade);
 
 
@@ -155,7 +154,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Select("SELECT upgrade_cycle_start_time as startDate FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
     CommissionValidityPeriod selectUpgradeCycleStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
 
-    @Update("UPDATE partner_user SET upgrade_cycle_start_time = #{newDate} WHERE  user_id = #{userId} and grade = #{grade} ")
+    @Update("UPDATE partner_user SET upgrade_cycle_start_time = #{newDate} , first = true WHERE  user_id = #{userId} and grade = #{grade} ")
     void updateUpgradeCycleStartTime(@Param("userId") String userId, @Param("newDate")Date newDate,@Param("grade") Integer grade);
 
 
@@ -164,7 +163,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Select("SELECT upgrade_cycle_start_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
     Date selectUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
 
-    @Update(" UPDATE partner_user pu JOIN( SELECT info.id AS user_id, DATE_ADD(DATE(sa.partner_review_time), INTERVAL 1 DAY) AS new_start_time FROM sys_user_jzg_info info " +
+    @Update(" UPDATE partner_user pu JOIN( SELECT info.id AS user_id, DATE_ADD(DATE(sa.partner_review_time), INTERVAL 0 DAY) AS new_start_time FROM sys_user_jzg_info info " +
             " INNER JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = info.id WHERE sa.type_attr = 3 AND sa.partner_status = 3 " +
             " AND info.id = #{userId} AND sa.partner_review_time IS NOT NULL LIMIT 1) t ON pu.user_id = t.user_id SET pu.upgrade_cycle_start_time = t.new_start_time WHERE pu.grade = #{grade} ")
     void updateUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
@@ -175,7 +174,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     BigDecimal selectFixedRatio(@Param("userId") String userId, @Param("grade") String  grade);
 
 
-    @Select("SELECT p.* FROM partner_user p LEFT JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = p.user_id  WHERE  sa.type_attr = 3 AND sa.partner_status = 3 " +
+    @Select("SELECT p.* FROM partner_user p LEFT JOIN sys_user_jzg_info_salesman sa ON sa.sys_user_jzg_info_id = p.user_id  WHERE   sa.type_attr = 3 AND sa.partner_status = 3 " +
             " AND( p.grade, p.user_id) IN ( SELECT MIN( grade ) grade, user_id FROM partner_user WHERE grade IN ( '2', '3', '4' ) AND identity_status = 0 GROUP BY user_id )" +
             " ORDER BY p.create_time DESC")
     List<PartnerUser> queryDowngradedData();

+ 77 - 21
partner/src/main/java/com/jzg/service/Impl/PartnerUserServiceImpl.java

@@ -15,6 +15,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.SysUserJzgInfo;
 import com.jzg.commons.entity.vo.SysUserVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.constants.BigConstants;
 import com.jzg.constants.TimeConstants;
 import com.jzg.entity.*;
 import com.jzg.entity.param.*;
@@ -466,20 +467,69 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     }
 
     private static BigDecimal getMultiply(List<PartnerAttribute> strategyArray) {
-        PartnerAttribute yq = strategyArray.get(0);
-        BigDecimal min = new BigDecimal(yq.getMin());
-        BigDecimal achieve = new BigDecimal(yq.getAchieve());
-        BigDecimal yqPercent = achieve.divide(min, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("0.33"));
-        PartnerAttribute bf = strategyArray.get(1);
-        BigDecimal bfMin = new BigDecimal(bf.getMin());
-        BigDecimal bfAchieve = new BigDecimal(bf.getAchieve());
-        BigDecimal bfPercent = bfAchieve.divide(bfMin, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("0.34"));
-        PartnerAttribute gr = strategyArray.get(2);
-        BigDecimal grMin = new BigDecimal(gr.getMin());
-        BigDecimal grAchieve = new BigDecimal(gr.getAchieve());
-        BigDecimal grPercent = grAchieve.divide(grMin, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("0.33"));
-        BigDecimal multiply = yqPercent.add(bfPercent).add(grPercent).multiply(new BigDecimal("100"));
-        return multiply;
+        // 1. 健壮性校验:空集合 / 长度不是3 → 直接返回0
+        if (Objects.isNull(strategyArray) || strategyArray.size() != 3) {
+            return BigDecimal.ZERO;
+        }
+
+        PartnerAttribute attr0 = strategyArray.get(0);
+        PartnerAttribute attr1 = strategyArray.get(1);
+        PartnerAttribute attr2 = strategyArray.get(2);
+        // 校验元素非空
+        Objects.requireNonNull(attr0, "第1个指标不能为空");
+        Objects.requireNonNull(attr1, "第2个指标不能为空");
+        Objects.requireNonNull(attr2, "第3个指标不能为空");
+
+        // 2. 获取勾选状态
+        boolean c0 = attr0.isChecked();
+        boolean c1 = attr1.isChecked();
+        boolean c2 = attr2.isChecked();
+        // 统计勾选数量
+        int checkedCount = (c0 ? 1 : 0) + (c1 ? 1 : 0) + (c2 ? 1 : 0);
+
+        // 3. 原始权重数组(与3个指标一一对应)
+        BigDecimal[] baseWeights = {BigConstants.WEIGHT_YQ, BigConstants.WEIGHT_BF, BigConstants.WEIGHT_GR};
+        BigDecimal totalScore = BigDecimal.ZERO;
+
+        // 4. 循环计算(消除所有if-else,复用核心逻辑)
+        for (int i = 0; i < 3; i++) {
+            PartnerAttribute attr = strategyArray.get(i);
+            // 未勾选直接跳过
+            if (!attr.isChecked()) {
+                continue;
+            }
+
+            // 5. 动态获取当前指标权重(核心逻辑)
+            BigDecimal currentWeight;
+            if (checkedCount == 3) {
+                currentWeight = baseWeights[i];  // 3个全选:用原始权重
+            } else if (checkedCount == 2) {
+                currentWeight = BigConstants.WEIGHT_TWO_ITEMS; // 选2个:统一0.5
+            } else if (checkedCount == 1) {
+                currentWeight = BigConstants.WEIGHT_ONE_ITEM;  // 选1个:统一1
+            } else {
+                continue; // 都不选
+            }
+
+            // 6. 统一计算完成率(防止除零异常)
+            BigDecimal achieve = new BigDecimal(attr.getAchieve());
+            BigDecimal min = new BigDecimal(attr.getMin());
+            if (min.compareTo(BigDecimal.ZERO) == 0) {
+                throw new ArithmeticException("指标最小值不能为0,索引:" + i);
+            }
+            BigDecimal percent = achieve.divide(min, BigConstants.DIV_SCALE, BigConstants.ROUND_MODE);
+
+            // 7. 计算单项得分(和原逻辑完全一致)
+            BigDecimal itemScore = percent.compareTo(BigConstants.FULL_RATE) > 0
+                    ? currentWeight
+                    : percent.multiply(currentWeight);
+
+            // 累加总分
+            totalScore = totalScore.add(itemScore);
+        }
+
+        // 8. 统一输出结果(所有分支逻辑相同)
+        return totalScore.multiply(BigConstants.HUNDRED).setScale(BigConstants.RESULT_SCALE, BigConstants.ROUND_MODE);
     }
 
 
@@ -512,13 +562,17 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     }
 
     @Override
-    public HttpResult degradedTask(String grade, String sysUserId) {
+    public HttpResult<PartnerRuleEntity> degradedTask(String grade, String userId) {
+        SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(userId);
+        return degradedTaskVo(grade,sysUserJzgInfo.getId());
+    }
+
+
+    public HttpResult<PartnerRuleEntity> degradedTaskVo(String grade, String userId) {
         PartnerRuleEntity partnerRuleEntity = ruleService.selectByGrade(grade);
         if (partnerRuleEntity == null) {
             return HttpResult.error("等级不存在");
         }
-        SysUserJzgInfo sysUserJzgInfo = getSysUserJzgInfo(sysUserId);
-        String userId = sysUserJzgInfo.getId();
         partnerRuleEntity.setRequirement(null);
         CommissionValidityPeriod period = baseMapper.selectUpgradeCycleStartTime(userId, Integer.valueOf(grade));
         period.setEndDate(SpringUtil.getBean(ExpiredCommissionUtils.class).generateDowngradeTime(grade, period.getStartDate()));
@@ -700,11 +754,13 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
             handleActiveUser(partnerUser, level);
         } else {
             level.setLockingState("1");
-            if (null != partnerUser.getUpgradeTime()) {
-                PartnerRuleEntity ruleEntity = ruleService.selectByGrade(String.valueOf(partnerUser.getGrade()));
-                if (Objects.nonNull(partnerUser.getUpgradeTime())){
-                    level.setExpiryDate(new SimpleDateFormat("yyyy-MM-dd").format(PartnerDateUtils.addDays(partnerUser.getUpgradeTime(), Integer.valueOf(ruleEntity.getKhDays()))));
+            PartnerRuleEntity ruleEntity = ruleService.selectByGrade(String.valueOf(partnerUser.getGrade()));
+            if (Objects.nonNull(partnerUser.getUpgradeCycleStartTime()) && Objects.nonNull(ruleEntity.getKhDays())){
+                Integer value = Integer.valueOf(ruleEntity.getKhDays());
+                if (!partnerUser.isFirst()){
+                    value = value + 1;
                 }
+                level.setExpiryDate(new SimpleDateFormat("yyyy-MM-dd").format(PartnerDateUtils.addDays(partnerUser.getUpgradeCycleStartTime(),value )));
             }
             level.setProportional(proportional(String.valueOf(partnerUser.getGrade()), partnerUser.getUserId()));
         }

+ 16 - 0
partner/src/main/java/com/jzg/utils/TimedTaskUtils.java

@@ -22,6 +22,8 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -150,6 +152,8 @@ public class TimedTaskUtils {
 
         // 查询所有用户的租户code
         List<String> systemCodeList = partnerUserMapper.distinctSystemCode();
+//        ArrayList<String> systemCodeList = new ArrayList<>();
+//        systemCodeList.add("QQ000");
         for (String systemCode : systemCodeList) {
             try {
                 TenantContextUtils.setCustomTenantId(systemCode);
@@ -165,6 +169,9 @@ public class TimedTaskUtils {
                     if (null == upgradeStartTime){
                         continue;
                     }
+                    if (!partnerUser.isFirst()){
+                        khDays = khDays + 1;
+                    }
                     log.info("开始时间:{}", formatter.format(upgradeStartTime));
                     //  生成结束时间
                     Date upgradeEndTime = PartnerDateUtils.generateEndTime(upgradeStartTime, khDays);
@@ -198,6 +205,15 @@ public class TimedTaskUtils {
     }
 
 
+    public static boolean isSameDay(Date date1, Date date2) {
+        if (date1 == null || date2 == null) {
+            return false;
+        }
+        LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate localDate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        return localDate1.equals(localDate2);
+    }
+
     public void update(List<PartnerRuleEntity> partnerRuleEntities,List<String> idList){
         QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("identity_status", 0);