Jelajahi Sumber

代理人app开发

xuqiang 1 tahun lalu
induk
melakukan
7eed64bcf6

+ 4 - 0
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -343,8 +343,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             BigDecimal commissionRate = user.getCommissionRate();
             if (null == commissionRate || commissionRate.compareTo(new BigDecimal("0")) == 0){
                 bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()), user.getUserId(),userId3,userId4);
+                redisTemplate.opsForValue().set("identity:commission:rate","0");
             }else {
                 bigDecimal = commissionRate;
+                redisTemplate.opsForValue().set("identity:commission:rate",String.valueOf(commissionRate));
             }
             details.setProportional(String.valueOf(bigDecimal));
             details.setExtractFee(details.getSumpremium().multiply(bigDecimal.divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
@@ -390,8 +392,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         BigDecimal bigDecimal;
         if (null == commissionRate || commissionRate.compareTo(new BigDecimal("0")) == 0){
             bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()), partnerUser.getUserId(),userId3,userId4);
+            redisTemplate.opsForValue().set("identity:commission:rate","0");
         }else {
             bigDecimal = commissionRate;
+            redisTemplate.opsForValue().set("identity:commission:rate",String.valueOf(commissionRate));
         }
         details.setProportional(String.valueOf(bigDecimal));
         details.setExtractFee(details.getSumpremium().multiply(bigDecimal.divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));

+ 2 - 0
src/main/java/com/ydtech/modules/partner/dao/PartnerUserMapper.java

@@ -171,4 +171,6 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
             " SELECT DATE(approve_time) FROM sys_user_track WHERE `status` = 1 AND user_id = #{userId} LIMIT 1 " +
             " ) WHERE  user_id = #{userId} and grade = #{grade} ")
     void updateUpgradeStartTime(@Param("userId") String userId,@Param("grade") Integer grade);
+
+    BigDecimal subordinateMembersInsurancePremiums(@Param("userId") String userId, @Param("grade")String grade,@Param("period") CommissionValidityPeriod period);
 }

+ 2 - 0
src/main/java/com/ydtech/modules/partner/model/PartnerUser.java

@@ -77,6 +77,8 @@ public class PartnerUser{
 
     private Date assessmentTime;
 
+    private Date upgradeTime;
+
     /**
      * 创建者
      */

+ 6 - 2
src/main/java/com/ydtech/modules/partner/service/Impl/PartnerLiftingRecordServiceImpl.java

@@ -167,12 +167,16 @@ public class PartnerLiftingRecordServiceImpl extends ServiceImpl<PartnerLiftingR
         String referrerId = partnerUserMapper.querySuperiors(liftingRecord.getUserId(),(value - 1),liftingRecord.getOriginalLevel());
         partnerUser.setReferrerId(referrerId);
         partnerUser.setGrade(value);
-        partnerUser.setCommissionRate(auditCommission);
         partnerUser.setIdentityType(1);
         Date date = PartnerDateUtils.addDaysToday(new Date(), 1);
         partnerUser.setUpgradeCycleStartTime(date);
         partnerUser.setAssessmentTime(date);
+        partnerUser.setUpgradeTime(date);
         partnerUserMapper.insert(partnerUser);
+
+        PartnerUser selectOne = partnerUserMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, liftingRecord.getUserId()).eq(PartnerUser::getGrade, liftingRecord.getOriginalLevel()));
+        selectOne.setCommissionRate(auditCommission);
+        partnerUserMapper.updateById(selectOne);
     }
 
     @Override
@@ -180,7 +184,7 @@ public class PartnerLiftingRecordServiceImpl extends ServiceImpl<PartnerLiftingR
         entity.setConditions(ConditionUtils.upgradeConditions(entity.getOriginalLevel()));
         entity.setRules(ConditionUtils.assessmentRules(entity.getOriginalLevel()));
         int insert = baseMapper.insert(entity);
-        return insert > 0 ? HttpResult.ok("升级成功") : HttpResult.error("升级失败");
+        return insert > 0 ? HttpResult.ok("申请成功") : HttpResult.error("申请失败");
     }
 
     @Override

+ 140 - 45
src/main/java/com/ydtech/modules/partner/service/Impl/PartnerUserServiceImpl.java

@@ -387,7 +387,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
         partnerRuleEntity.setStrategyArray(null);
         CommissionValidityPeriod period = ruleService.getCommissionValidityPeriod(partnerRuleEntity.getCycle(), userId, grade);
         partnerRuleEntity.setAssessmentEndDate(period.getEndDate().split(" ")[0]);
-        BigDecimal bf = baseMapper.selectTotalSumPremium(userId, grade, period);
+        BigDecimal bf = baseMapper.subordinateMembersInsurancePremiums(userId, grade, period);
         BigDecimal p = ruleService.getInviteData(userId, grade, period);
         BigDecimal ownBf = baseMapper.selectOwnSumPremium(userId, period);
         List<PartnerAttribute> requirement = partnerRuleEntity.getRequirement();
@@ -419,66 +419,161 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
         return getAttribute(partnerRuleEntity, bf, p, ownBf, strategyArray);
     }
 
+//    private List<MyUserLevel> getUserLevels(String userId, List<PartnerRule> partnerRules, Map<Integer, PartnerUser> userMap) {
+//        List<MyUserLevel> list = new ArrayList<>();
+//        if (partnerRules == null || userId == null || userMap == null) {
+//            return list; // 输入参数校验
+//        }
+//        for (PartnerRule rule : partnerRules) {
+//            Integer grade = rule.getGrade();
+//            PartnerUser partnerUser = userMap.get(grade);
+//            MyUserLevel level = new MyUserLevel();
+//            level.setFallAmount(rule.getFallAmount());
+//            level.setRatio(getProportion(grade));
+//            level.setGrade(grade);
+//            level.setGradeName(rule.getGradeName());
+//
+//            if (partnerUser == null) {
+//                level.setLockingState("0");
+//                level.setProgressBar(0);
+//                if (1 != grade){
+//                    if (null != userMap.get(grade + 1)){
+//                        boolean verified = ruleService.verifyUpgradeConditions(userId, String.valueOf(grade + 1));
+//                        if (verified) {
+//                            level.setUpgrade(true);
+//                            level.setProgressBar(2);
+//                        }else {
+//                            level.setProgressBar(1);
+//                        }
+//                    }
+//                }
+//                Long count = liftingRecordService.selectDowngradeRecord(userId,grade,0);
+//                if (count > 0){
+//                    level.setUpgradeStatus(true);
+//                }
+//            } else {
+//                level.setUserId(userId);
+//                level.setUserName(partnerUser.getName());
+//                if (partnerUser.isIdentityStatus()) {
+//                    level.setLockingState("2");
+//                    level.setLockCommission(accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade()));
+//                    if (partnerUser.getUpgradeCycleStartTime() != null) {
+//                        LocalDate upgradeCycleStartDate = partnerUser.getUpgradeCycleStartTime().toInstant()
+//                                .atZone(ZoneId.systemDefault()).toLocalDate();
+//                        level.setZeroDays(ChronoUnit.DAYS.between(LocalDate.now(), upgradeCycleStartDate));
+//                    }
+//                    String value = String.valueOf(partnerUser.getGrade());
+//                    boolean verified = ruleService.verifyUpgradeConditions(partnerUser.getUserId(),value);
+//                    if (verified) {
+//                        level.setUpgrade(true);
+//                    }
+//                    Long count = liftingRecordService.selectDowngradeRecord(partnerUser.getUserId(),partnerUser.getGrade() + 1,1);
+//                    if (count > 0){
+//                        level.setUpgradeStatus(true);
+//                    }
+//                } else {
+//                    level.setLockingState("1");
+//                }
+//                level.setProgressBar(2);
+//            }
+//            list.add(level);
+//        }
+//        return list;
+//    }
+
     private List<MyUserLevel> getUserLevels(String userId, List<PartnerRule> partnerRules, Map<Integer, PartnerUser> userMap) {
         List<MyUserLevel> list = new ArrayList<>();
+
+        // 输入参数校验
         if (partnerRules == null || userId == null || userMap == null) {
-            return list; // 输入参数校验
+            return list;
         }
+
         for (PartnerRule rule : partnerRules) {
             Integer grade = rule.getGrade();
             PartnerUser partnerUser = userMap.get(grade);
-            MyUserLevel level = new MyUserLevel();
-            level.setFallAmount(rule.getFallAmount());
-            level.setRatio(getProportion(grade));
-            level.setGrade(grade);
-            level.setGradeName(rule.getGradeName());
+            MyUserLevel level = createBasicUserLevel(rule);
 
             if (partnerUser == null) {
-                level.setLockingState("0");
-                level.setProgressBar(0);
-                if (1 != grade){
-                    boolean verified = ruleService.verifyUpgradeConditions(userId, String.valueOf(grade + 1));
-                    if (verified) {
-                        level.setUpgrade(true);
-                        level.setProgressBar(2);
-                    }else {
-                        level.setProgressBar(1);
-                    }
-                }
-                Long count = liftingRecordService.selectDowngradeRecord(userId,grade,0);
-                if (count > 0){
-                    level.setUpgradeStatus(true);
-                }
+                handleUnregisteredUser(userId, userMap, grade, level);
             } else {
-                level.setUserId(userId);
-                level.setUserName(partnerUser.getName());
-                if (partnerUser.isIdentityStatus()) {
-                    level.setLockingState("2");
-                    level.setLockCommission(accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade()));
-                    if (partnerUser.getUpgradeCycleStartTime() != null) {
-                        LocalDate upgradeCycleStartDate = partnerUser.getUpgradeCycleStartTime().toInstant()
-                                .atZone(ZoneId.systemDefault()).toLocalDate();
-                        level.setZeroDays(ChronoUnit.DAYS.between(LocalDate.now(), upgradeCycleStartDate));
-                    }
-                    String value = String.valueOf(partnerUser.getGrade());
-                    boolean verified = ruleService.verifyUpgradeConditions(partnerUser.getUserId(),value);
-                    if (verified) {
-                        level.setUpgrade(true);
-                    }
-                    Long count = liftingRecordService.selectDowngradeRecord(partnerUser.getUserId(),partnerUser.getGrade() + 1,1);
-                    if (count > 0){
-                        level.setUpgradeStatus(true);
-                    }
-                } else {
-                    level.setLockingState("1");
-                }
-                level.setProgressBar(2);
+                handleRegisteredUser(userId, partnerUser, level);
             }
+
             list.add(level);
         }
+
         return list;
     }
 
+    // 提取创建基础UserLevel的逻辑
+    private MyUserLevel createBasicUserLevel(PartnerRule rule) {
+        MyUserLevel level = new MyUserLevel();
+        level.setFallAmount(rule.getFallAmount());
+        level.setRatio(getProportion(rule.getGrade()));
+        level.setGrade(rule.getGrade());
+        level.setGradeName(rule.getGradeName());
+        return level;
+    }
+
+    // 处理未注册用户的逻辑
+    private void handleUnregisteredUser(String userId, Map<Integer, PartnerUser> userMap,
+                                        Integer grade, MyUserLevel level) {
+        level.setLockingState("0");
+        level.setProgressBar(0);
+
+        // 只有非1级才需要检查升级条件
+        if (!grade.equals(1) && userMap.containsKey(grade + 1)) {
+            boolean verified = ruleService.verifyUpgradeConditions(userId, String.valueOf(grade + 1));
+            level.setProgressBar(verified ? 2 : 1);
+            level.setUpgrade(verified);
+        }
+
+        // 检查降级记录
+        if (liftingRecordService.selectDowngradeRecord(userId, grade, 0) > 0) {
+            level.setUpgradeStatus(true);
+        }
+    }
+
+    // 处理已注册用户的逻辑
+    private void handleRegisteredUser(String userId, PartnerUser partnerUser, MyUserLevel level) {
+        level.setUserId(userId);
+        level.setUserName(partnerUser.getName());
+
+        if (partnerUser.isIdentityStatus()) {
+            handleActiveUser(partnerUser, level);
+        } else {
+            level.setLockingState("1");
+        }
+
+        level.setProgressBar(2);
+    }
+
+    // 处理活跃用户的逻辑
+    private void handleActiveUser(PartnerUser partnerUser, MyUserLevel level) {
+        level.setLockingState("2");
+        level.setLockCommission(accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade()));
+
+        // 计算天数差
+        if (partnerUser.getUpgradeCycleStartTime() != null) {
+            LocalDate upgradeCycleStartDate = partnerUser.getUpgradeCycleStartTime()
+                    .toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDate();
+            level.setZeroDays(ChronoUnit.DAYS.between(LocalDate.now(), upgradeCycleStartDate));
+        }
+
+        // 检查升级条件
+        boolean verified = ruleService.verifyUpgradeConditions(
+                partnerUser.getUserId(), String.valueOf(partnerUser.getGrade()));
+        level.setUpgrade(verified);
+
+        // 检查降级记录
+        if (liftingRecordService.selectDowngradeRecord(
+                partnerUser.getUserId(), partnerUser.getGrade() + 1, 1) > 0) {
+            level.setUpgradeStatus(true);
+        }
+    }
 
     public String getProportion(Integer grade){
         CommissionRulesVo rulesVo = commissionService.queryAll();

+ 25 - 2
src/main/java/com/ydtech/modules/partner/utils/CalculateCommissionUtils.java

@@ -14,6 +14,7 @@ import com.ydtech.modules.partner.model.vo.PartnerRulesRatio;
 import com.ydtech.modules.partner.service.PartnerCommissionService;
 import com.ydtech.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,13 +34,16 @@ public class CalculateCommissionUtils {
     private static PartnerCommissionService commissionService;
     private static PartnerUserMapper partnerUserMapper;
     private static PartnerPremiumDetailsMapper partnerPremiumDetailsMapper;
+    private static StringRedisTemplate redisTemplate;
 
     @Autowired
     public void setCommissionService(PartnerCommissionService commissionService,
                                      PartnerUserMapper partnerUserMapper,
+                                     StringRedisTemplate redisTemplate,
                                      PartnerPremiumDetailsMapper partnerPremiumDetailsMapper) {
         CalculateCommissionUtils.commissionService = commissionService;
         CalculateCommissionUtils.partnerUserMapper = partnerUserMapper;
+        CalculateCommissionUtils.redisTemplate = redisTemplate;
         CalculateCommissionUtils.partnerPremiumDetailsMapper = partnerPremiumDetailsMapper;
     }
 
@@ -64,12 +68,12 @@ public class CalculateCommissionUtils {
         Set<String> userIdList = Collections.emptySet();
         BigDecimal grBf = null;
         if (StringUtils.equals("gzs", type)){
-            grBf = queryPersonalInsurancePremiums(userId4,period);
             period = getCommissionValidityPeriod(rules, userId4, "4");
+            grBf = queryPersonalInsurancePremiums(userId4,period);
             userIdList = partnerUserMapper.querySubordinateUserId(userId4);
         }else if (StringUtils.equals("hh", type)){
-            grBf = queryPersonalInsurancePremiums(userId3,period);
             period = getCommissionValidityPeriod(rules, userId3, "3");
+            grBf = queryPersonalInsurancePremiums(userId3,period);
             userIdList = partnerUserMapper.querySubordinate(userId3);
         }
         BigDecimal sumPremium = BigDecimal.ZERO;
@@ -139,10 +143,29 @@ public class CalculateCommissionUtils {
         if (StringUtils.equals("4", grade) || StringUtils.equals("3", grade)){
             hh = ladderCommission(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),"gzs",userId3, userId4);
         }
+        String commissionRatio = redisTemplate.opsForValue().get("identity:commission:rate");
+        if (!StringUtils.equals("0", commissionRatio) && StringUtils.isNotEmpty(commissionRatio)){
+            return fixedCommissionRatio(gl,hh,new BigDecimal(commissionRatio),rulesVo, grade);
+        }
         log.info("用户id:{}++{}级用户++gl:{}++hh:{}", userId, grade,gl, hh);
         return calculateProportion(grade,rulesVo,gl,hh);
     }
 
+    public static BigDecimal fixedCommissionRatio(BigDecimal gl,BigDecimal hh,BigDecimal commissionRatio,CommissionRulesVo rulesVo,String grade){
+        if (StringUtils.equals("3", grade)){
+            BigDecimal subtract;
+            if (!isZero(gl)){
+                subtract = gl;
+            }else {
+                subtract = new BigDecimal(rulesVo.getAdministrator().getSharedRatio()).subtract(new BigDecimal(rulesVo.getAdministrator().getDefaultRatio()));
+            }
+            return new BigDecimal(rulesVo.getPartner().getSharedRatio()).subtract(commissionRatio).add(subtract);
+        }
+        if (StringUtils.equals("2", grade)){
+            return new BigDecimal(rulesVo.getAdministrator().getSharedRatio()).subtract(commissionRatio);
+        }
+        return BigDecimal.ZERO;
+    }
 
     public static BigDecimal calculateProportion(String grade, CommissionRulesVo rulesVo,BigDecimal gl,BigDecimal hh) {
         if (StringUtils.equals("1", grade)) {

+ 2 - 1
src/main/java/com/ydtech/modules/partner/utils/TimedTaskUtils.java

@@ -98,7 +98,8 @@ public class TimedTaskUtils {
     /**
      * TODO: 更新降级考核时间
      */
-    @Scheduled(cron = "*/30 * * * * ?")
+    @Scheduled(cron = "0 0 0 * * *")
+    //@Scheduled(cron = "*/30 * * * * ?")
     public void checkCommissionExpireTime() {
         // TODO等级规则
         List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();

+ 17 - 1
src/main/resources/mapper/modules/partner/PartnerUserMapper.xml

@@ -1030,7 +1030,7 @@ SELECT
                 partner_user t
                     INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
             WHERE
-                FIND_IN_SET(t.user_id, cte_name.path) = 0
+                t.grade = (cte_name.grade - 1)
         )
         SELECT user_id FROM cte_name where grade = #{grade};
     </select>
@@ -1165,4 +1165,20 @@ SELECT
     </select>
 
 
+    <select id="subordinateMembersInsurancePremiums" resultType="java.math.BigDecimal">
+        SELECT SUM(DISTINCT sumpremium) FROM partner_premium_details WHERE user_id IN(
+            WITH RECURSIVE cte_name AS (
+                SELECT user_id,referrer_id, grade FROM partner_user
+                WHERE user_id = #{userId} AND grade = #{grade}
+            UNION ALL
+            SELECT t.user_id, t.referrer_id, t.grade FROM partner_user t
+            INNER JOIN cte_name ON t.referrer_id = cte_name.user_id
+                WHERE t.grade  = (cte_name.grade + 1)
+            ) SELECT DISTINCT user_id FROM cte_name WHERE user_id != #{userId} )
+        <if test="period.startDate != null and period.endDate != null">
+            AND create_time BETWEEN #{period.startDate} AND #{period.endDate}
+        </if>
+    </select>
+
+
 </mapper>