xuqiang 1 年間 前
コミット
2cf56d7a14

+ 1 - 1
src/main/java/com/ydtech/modules/partner/dao/PartnerLiftingRecordMapper.java

@@ -20,7 +20,7 @@ public interface PartnerLiftingRecordMapper extends BaseMapper<PartnerLiftingRec
     @Select("select audit_status as auditStatus,count(1) as count from partner_lifting_record group by audit_status")
     List<Map<String, Object>> groupByAuditStatus();
 
-    @Select("SELECT r.id,r.`name`,r.mobile,r.user_id,r.dept_id,r.type,r.original_level,r.after_change,r.cycle,r.upgrade_strategy,r.audit_status,r.audit_time,r.audit_user,r.reject_reason,r.conditions,r.rules,r.create_time,( SELECT `name` FROM sys_dept WHERE sys_dept.id = r.dept_id ) dept_name FROM partner_lifting_record r ${ew.customSqlSegment} ")
+    @Select("SELECT r.id,r.`name`,r.mobile,r.user_id,r.dept_id,r.type,r.original_level,r.after_change,r.cycle,r.upgrade_strategy,r.audit_status,r.audit_time,r.audit_user,r.reject_reason,r.conditions,r.rules,r.create_time,r.upgrade_type,( SELECT `name` FROM sys_dept WHERE sys_dept.id = r.dept_id ) dept_name FROM partner_lifting_record r ${ew.customSqlSegment} ")
     Page<PartnerLiftingRecord> queryPage(Page page,@Param("ew") QueryWrapper<PartnerLiftingRecord> queryWrapper);
 
     @Select("SELECT * FROM partner_lifting_record WHERE type = 1 AND audit_status = 0 AND DATE_ADD(create_time, INTERVAL #{expireDays} DAY) < NOW() ")

+ 11 - 8
src/main/java/com/ydtech/modules/partner/dao/PartnerUserMapper.java

@@ -48,7 +48,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Select("select  MIN(grade) as grade from partner_user where user_id= #{userId}  ")
     Integer selectGradeMin(String userId);
 
-    @Select("select  MIN(grade) as grade from partner_user where  identity_status = 0 and user_id=  #{userId}  ")
+    @Select("select  MIN(grade) as grade from partner_user where  user_id=  #{userId}  ")
     Integer selectGradeIntMin(String userId);
 
 
@@ -150,22 +150,25 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     @Select(" SELECT p.id,p.user_id,p.grade,p.name,p.create_time FROM partner_user p LEFT JOIN sys_user u ON u.id = p .user_id ${ew.customSqlSegment}")
     Page<PartnerUser> selectListVo(@Param("page") Page page ,@Param("ew") QueryWrapper<PartnerUser> queryWrapper);
 
-    @Update("UPDATE partner_user SET identity_status = #{identityStatus} WHERE user_id = #{userId} and grade = #{originalLevel} ")
+    @Update("UPDATE partner_user SET identity_status = #{identityStatus},upgrade_cycle_start_time = DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00') WHERE user_id = #{userId} and grade = #{originalLevel} ")
     void updateIdentityStatus(@Param("userId") String userId,@Param("originalLevel") String originalLevel,@Param("identityStatus")int identityStatus);
 
-    @Select("SELECT upgrade_cycle_end_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
-    Date queryUpgradeEndTime(@Param("userId") String userId,@Param("grade")Integer grade);
-
     UserRuleVo queryUserRuleVo(@Param("userId") String userId, @Param("grade")Integer grade,@Param("period") CommissionValidityPeriod period);
 
-    @Select("SELECT upgrade_cycle_start_time as startDate,upgrade_cycle_end_time as endDate FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    @Select("SELECT upgrade_cycle_start_time as startDate FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
     CommissionValidityPeriod selectAssessmentCycleTime(@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} ")
     void updateUpgradeCycleStartTime(@Param("userId") String userId, @Param("newDate")Date newDate,@Param("grade") Integer grade);
 
-    @Update("UPDATE partner_user SET upgrade_cycle_end_time = #{newDate} WHERE  user_id = #{userId} and grade = #{grade} ")
-    void updateUpgradeCycleEndTime(@Param("userId") String userId, @Param("newDate")Date newDate,@Param("grade") Integer grade);
 
     BigDecimal selectOwnSumPremium(@Param("userId") String userId, @Param("period") CommissionValidityPeriod period);
+
+    @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 SET upgrade_cycle_start_time = ( " +
+            " 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);
 }

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

@@ -74,6 +74,5 @@ public class PartnerUser extends BaseEntity {
 
     private Date upgradeCycleStartTime;
 
-    private Date upgradeCycleEndTime;
 
 }

+ 3 - 0
src/main/java/com/ydtech/modules/partner/model/vo/TeamOverviewVo.java

@@ -15,6 +15,9 @@ public class TeamOverviewVo {
 
     private String parentStatus;
 
+    @ApiModelProperty(value = "升级状态 0-不支持升级;2-可升级;3-申请中")
+    private Integer upgradeStatus;
+
     private Object vo1;
 
     private Object vo2;

+ 10 - 0
src/main/java/com/ydtech/modules/partner/service/Impl/PartnerLiftingRecordServiceImpl.java

@@ -261,6 +261,16 @@ public class PartnerLiftingRecordServiceImpl extends ServiceImpl<PartnerLiftingR
         return success ? HttpResult.ok(message) : HttpResult.error("审批失败");
     }
 
+    @Override
+    public Long selectDowngradeRecord(String userId, Integer grade) {
+        LambdaQueryWrapper<PartnerLiftingRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(PartnerLiftingRecord::getUserId, userId);
+        wrapper.eq(PartnerLiftingRecord::getOriginalLevel, grade);
+        wrapper.eq(PartnerLiftingRecord::getUpgradeType, 1);
+        wrapper.eq(PartnerLiftingRecord::getAuditStatus, 0);
+        return baseMapper.selectCount(wrapper);
+    }
+
     private void updateUserIdentityStatus(PartnerLiftingRecord liftingRecord, BigDecimal auditCommission) {
         PartnerUser selectOne = partnerUserMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, liftingRecord.getUserId())
                 .eq(PartnerUser::getGrade, liftingRecord.getOriginalLevel()));

+ 58 - 32
src/main/java/com/ydtech/modules/partner/service/Impl/PartnerRuleServiceImpl.java

@@ -4,6 +4,7 @@ package com.ydtech.modules.partner.service.Impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.alipay.api.domain.Person;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -17,7 +18,9 @@ import com.ydtech.modules.partner.model.PartnerRule;
 import com.ydtech.modules.partner.model.param.CommissionValidityPeriod;
 import com.ydtech.modules.partner.model.param.PartnerRuleEntity;
 import com.ydtech.modules.partner.service.PartnerRuleService;
+import com.ydtech.modules.partner.utils.ExpiredCommissionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.mapstruct.ap.shaded.freemarker.core.BugException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -130,12 +133,32 @@ public class PartnerRuleServiceImpl extends ServiceImpl<PartnerRuleMapper, Partn
         PartnerRuleEntity partnerRuleEntity = data.partnerRuleEntity;
         BigDecimal p = data.p;
         BigDecimal bf = data.bf;
-        BigDecimal people = data.people;
-        BigDecimal allBf = data.allBf;
+        List<PartnerAttribute> requirement = partnerRuleEntity.getRequirement();
+        BigDecimal min = new BigDecimal(requirement.get(0).getMin());
+        BigDecimal min1 = new BigDecimal(requirement.get(1).getMin());
+        BigDecimal min2 = new BigDecimal(requirement.get(2).getMin());
+        if (StringUtils.equals("1", partnerRuleEntity.getAppraise())) {
+            return p.compareTo(min) >= 0 && bf.compareTo(min1) >= 0 && data.ownBf.compareTo(min2) >= 0;
+        } else {
+            return p.compareTo(min) >= 0 || bf.compareTo(min1) >= 0 || data.ownBf.compareTo(min2) >= 0;
+        }
+    }
+
+    @Override
+    public boolean verifyDowngradeUpgradeConditions(String userId, String grade) {
+        VerifyData data = downgradeUpgradeConditions(userId, grade);
+        PartnerRuleEntity partnerRuleEntity = data.partnerRuleEntity;
+        BigDecimal p = data.p;
+        BigDecimal bf = data.bf;
+        BigDecimal ownBf = data.ownBf;
+        List<PartnerAttribute> strategyArray = partnerRuleEntity.getStrategyArray();
+        BigDecimal min = new BigDecimal(strategyArray.get(0).getMin());
+        BigDecimal min1 = new BigDecimal(strategyArray.get(1).getMin());
+        BigDecimal min2 = new BigDecimal(strategyArray.get(2).getMin());
         if (StringUtils.equals("1", partnerRuleEntity.getAppraise())) {
-            return p.compareTo(people) >= 0 && bf.compareTo(allBf) >= 0;
+            return p.compareTo(min) >= 0 && bf.compareTo(min1) >= 0 && ownBf.compareTo(min2) >= 0;
         } else {
-            return p.compareTo(people) >= 0 || bf.compareTo(allBf) >= 0;
+            return p.compareTo(min) >= 0 || bf.compareTo(min1) >= 0 || ownBf.compareTo(min2) >= 0;
         }
     }
 
@@ -146,22 +169,25 @@ public class PartnerRuleServiceImpl extends ServiceImpl<PartnerRuleMapper, Partn
         PartnerRuleEntity partnerRuleEntity = data.partnerRuleEntity;
         BigDecimal p = data.p;
         BigDecimal bf = data.bf;
-        BigDecimal people = data.people;
-        BigDecimal allBf = data.allBf;
+
+        List<PartnerAttribute> requirement = partnerRuleEntity.getRequirement();
+        BigDecimal min = new BigDecimal(requirement.get(0).getMin());
+        BigDecimal min1 = new BigDecimal(requirement.get(1).getMin());
+        BigDecimal min2 = new BigDecimal(requirement.get(2).getMin());
         StringBuilder message = new StringBuilder();
         if (StringUtils.equals("1", partnerRuleEntity.getAppraise())) {
-            if (p.compareTo(people) >= 0 && bf.compareTo(allBf) >= 0) {
-                message.append("邀请").append(people).append("个合伙人, 累计保费达").append(allBf).append("元");
+            if (p.compareTo(min) >= 0 && bf.compareTo(min1) >= 0) {
+                message.append("邀请").append(min).append("个合伙人, 累计保费达").append(min1).append("元");
             }
         } else {
-            if (p.compareTo(people) >= 0) {
-                message.append("邀请").append(people).append("个合伙人");
+            if (p.compareTo(min) >= 0) {
+                message.append("邀请").append(min).append("个合伙人");
             }
-            if (bf != null && bf.compareTo(allBf) >= 0) {
+            if (bf != null && bf.compareTo(min1) >= 0) {
                 if (message.length() > 0) {
                     message.append(", ");
                 }
-                message.append("累计保费达").append(allBf).append("元");
+                message.append("累计保费达").append(min1).append("元");
             }
         }
         return message.toString();
@@ -190,40 +216,40 @@ public class PartnerRuleServiceImpl extends ServiceImpl<PartnerRuleMapper, Partn
         if (bf == null){
             bf = BigDecimal.ZERO;
         }
-        BigDecimal people;
-        BigDecimal allBf;
-        if (requirement.size() >= 2) {
-            people = getRequirementValue(requirement, 0);
-            allBf = getRequirementValue(requirement, 1);
-        } else {
-            throw new SystemException("考核条件不足");
-        }
-
-        return new VerifyData(partnerRuleEntity, p, bf, people, allBf,ownBf);
+        return new VerifyData(partnerRuleEntity, p, bf,ownBf);
     }
 
-    private BigDecimal getRequirementValue(List<PartnerAttribute> requirement, int index) {
-        if (requirement.size() > index) {
-            return new BigDecimal(requirement.get(index).getMin());
+    private VerifyData downgradeUpgradeConditions(String userId, String grade) {
+        PartnerRuleEntity partnerRuleEntity = validateGradeAndFetchRuleEntity(grade);
+        if (partnerRuleEntity == null) {
+            throw new SystemException("合作伙伴规则实体不能为空");
         }
-        throw new SystemException("考核条件配置错误");
+        partnerRuleEntity.getStrategyArray();
+        CommissionValidityPeriod period = partnerUserMapper.selectAssessmentCycleTime(userId, Integer.valueOf(grade));
+        period.setEndDate(SpringUtil.getBean(ExpiredCommissionUtils.class).generateDowngradeTime(grade,period.getStartDate()));
+        BigDecimal p = getInviteData(userId, grade, period);
+        BigDecimal bf = partnerUserMapper.selectTotalSumPremium(userId, grade, period);
+        //  查询当前用户出单的保费
+        BigDecimal ownBf = partnerUserMapper.selectOwnSumPremium(userId, period);
+        if (bf == null){
+            bf = BigDecimal.ZERO;
+        }
+        if (ownBf == null){
+            ownBf = BigDecimal.ZERO;
+        }
+        return new VerifyData(partnerRuleEntity, p, bf,ownBf);
     }
 
-
     private static class VerifyData {
         private final PartnerRuleEntity partnerRuleEntity;
         private final BigDecimal p;
         private final BigDecimal bf;
-        private final BigDecimal people;
-        private final BigDecimal allBf;
         private final BigDecimal ownBf;
 
-        public VerifyData(PartnerRuleEntity partnerRuleEntity, BigDecimal p, BigDecimal bf, BigDecimal people, BigDecimal allBf,BigDecimal ownBf) {
+        public VerifyData(PartnerRuleEntity partnerRuleEntity, BigDecimal p, BigDecimal bf,BigDecimal ownBf) {
             this.partnerRuleEntity = partnerRuleEntity;
             this.p = p;
             this.bf = bf;
-            this.people = people;
-            this.allBf = allBf;
             this.ownBf = ownBf;
         }
     }

+ 66 - 20
src/main/java/com/ydtech/modules/partner/service/Impl/PartnerUserServiceImpl.java

@@ -9,6 +9,7 @@ import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -35,6 +36,8 @@ import com.ydtech.modules.partner.service.PartnerCommissionService;
 import com.ydtech.modules.partner.service.PartnerLiftingRecordService;
 import com.ydtech.modules.partner.service.PartnerRuleService;
 import com.ydtech.modules.partner.service.PartnerUserService;
+import com.ydtech.modules.partner.utils.ConditionUtils;
+import com.ydtech.modules.partner.utils.ExpiredCommissionUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -74,6 +77,9 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     @Autowired
     private PartnerCommissionService commissionService;
 
+    @Autowired
+    private PartnerRuleService partnerRuleService;
+
     @Override
     public int insert(PartnerUser partnerUser) {
         return baseMapper.insert(partnerUser);
@@ -182,7 +188,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
         lambdaQueryWrapper.eq(PartnerUser::getGrade,userGradeParam.getGrade());
         PartnerUser partnerUser = baseMapper.selectOne(lambdaQueryWrapper);
         //   条件
-        PartnerRuleEntity ruleEntity = ruleService.selectByGrade(userGradeParam.getGrade());
+        //PartnerRuleEntity ruleEntity = ruleService.selectByGrade(userGradeParam.getGrade());
         PartnerLiftingRecord record = new PartnerLiftingRecord();
         record.setName(partnerUser.getName());
         record.setMobile(partnerUser.getMobile());
@@ -207,8 +213,12 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
                 break;
 
         }
-        record.setCycle(getMessage(ruleEntity));
-        record.setUpgradeStrategy(ruleService.verifyUpgradeConditionsMessage(userGradeParam.getId(),userGradeParam.getGrade()));
+//        record.setCycle(getMessage(ruleEntity));
+//        record.setUpgradeStrategy(ruleService.verifyUpgradeConditionsMessage(userGradeParam.getId(),userGradeParam.getGrade()));
+
+        record.setConditions(ConditionUtils.upgradeConditions(record.getOriginalLevel()));
+        record.setRules(ConditionUtils.assessmentRules(record.getOriginalLevel()));
+
         return liftingRecordService.saveLiftingRecord(record);
     }
 
@@ -281,6 +291,9 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
             }else {
                 if (partnerUser.isIdentityStatus()){
                     overviewVo.setParentStatus("2");
+                    List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();
+                    ExpiredCommissionUtils commissionUtils = SpringUtil.getBean(ExpiredCommissionUtils.class);
+                    getRule(partnerRuleEntities, commissionUtils, overviewVo, partnerUser);
                 }else {
                     overviewVo.setParentStatus("1");
                 }
@@ -377,7 +390,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
         BigDecimal p = ruleService.getInviteData(userId, grade, period);
         BigDecimal ownBf = baseMapper.selectOwnSumPremium(userId, period);
         List<PartnerAttribute> requirement = partnerRuleEntity.getRequirement();
-        return getAttribute(partnerRuleEntity, bf, p, ownBf, requirement);
+        return getAttribute(partnerRuleEntity, new BigDecimal(362), new BigDecimal(1), new BigDecimal(159), requirement);
     }
 
     private HttpResult getAttribute(PartnerRuleEntity partnerRuleEntity, BigDecimal bf, BigDecimal p, BigDecimal ownBf, List<PartnerAttribute> requirement) {
@@ -390,8 +403,12 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
     @Override
     public HttpResult degradedTask(String grade, String userId) {
         PartnerRuleEntity partnerRuleEntity = ruleService.selectByGrade(grade);
+        if (partnerRuleEntity == null){
+            return HttpResult.error("等级不存在");
+        }
         partnerRuleEntity.setRequirement(null);
         CommissionValidityPeriod period = baseMapper.selectAssessmentCycleTime(userId, Integer.valueOf(grade));
+        period.setEndDate(SpringUtil.getBean(ExpiredCommissionUtils.class).generateDowngradeTime(grade,period.getStartDate()));
         partnerRuleEntity.setAssessmentEndDate(period.getEndDate().split(" ")[0]);
         BigDecimal bf = baseMapper.selectTotalSumPremium(userId, grade, period);
         BigDecimal p = ruleService.getInviteData(userId, grade, period);
@@ -401,38 +418,52 @@ 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) {
+    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) {
-            PartnerUser partnerUser = userMap.get(rule.getGrade());
+            Integer grade = rule.getGrade();
+            PartnerUser partnerUser = userMap.get(grade);
             MyUserLevel level = new MyUserLevel();
-            level.setRatio(getProportion(rule.getGrade()));
-            level.setGrade(rule.getGrade());
+            level.setRatio(getProportion(grade));
+            level.setGrade(grade);
             level.setGradeName(rule.getGradeName());
-            if (Objects.isNull(partnerUser)){
+
+            if (partnerUser == null) {
                 level.setLockingState("0");
                 level.setProgressBar(0);
-            }else {
+            } else {
                 level.setUserId(userId);
                 level.setUserName(partnerUser.getName());
-                if (partnerUser.isIdentityStatus()){
+
+                if (partnerUser.isIdentityStatus()) {
                     level.setLockingState("2");
                     level.setLockCommission(accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade()));
-                    level.setZeroDays(ChronoUnit.DAYS.between(LocalDate.now(), partnerUser.getUpgradeCycleEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()));
-                }else {
+                    if (partnerUser.getUpgradeCycleStartTime() != null) {
+                        LocalDate upgradeCycleStartDate = partnerUser.getUpgradeCycleStartTime().toInstant()
+                                .atZone(ZoneId.systemDefault()).toLocalDate();
+                        level.setZeroDays(ChronoUnit.DAYS.between(LocalDate.now(), upgradeCycleStartDate));
+                    }
+                } else {
                     level.setLockingState("1");
                 }
+
                 level.setProgressBar(2);
-            }
-            if (rule.getGrade() != 1){
-                boolean verified = ruleService.verifyUpgradeConditions(userId, String.valueOf(rule.getGrade()));
-                if (verified){
-                    level.setProgressBar(1);
+
+                if (grade != null && grade != 1) {
+                    boolean verified = partnerUser.isIdentityStatus()
+                            ? ruleService.verifyDowngradeUpgradeConditions(userId, String.valueOf(grade))
+                            : ruleService.verifyUpgradeConditions(userId, String.valueOf(grade));
+                    if (verified) {
+                        level.setProgressBar(1);
+                    }
+                    level.setUpgrade(verified);
                 }
-                level.setUpgrade(verified);
             }
             list.add(level);
-
         }
         return list;
     }
@@ -573,6 +604,8 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
                 .in(PartnerUser::getGrade, grades));
         Map<Integer, PartnerUser> userMap = partnerUsers.stream()
                 .collect(Collectors.toMap(PartnerUser::getGrade, Function.identity()));
+        List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();
+        ExpiredCommissionUtils commissionUtils = SpringUtil.getBean(ExpiredCommissionUtils.class);
 
         for (TeamOverviewVo overviewVo : teamOverviewVos) {
             JSONObject map = new JSONObject();
@@ -599,6 +632,9 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
                     map.put("data", getPage(page));
                     map.put("total", hashMap);
                     map.put("parentStatus", partnerUser.isIdentityStatus() ? "2" : "1");
+                    getRule(partnerRuleEntities, commissionUtils, overviewVo, partnerUser);
+
+                    map.put("upgradeStatus", new JSONObject());
                 }
             } catch (Exception e) {
                 // 记录异常日志并跳过当前项
@@ -611,6 +647,16 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
         return HttpResult.ok(list);
     }
 
+    private void getRule(List<PartnerRuleEntity> partnerRuleEntities, ExpiredCommissionUtils commissionUtils, TeamOverviewVo overviewVo, PartnerUser partnerUser) {
+        PartnerRuleEntity ruleEntity = commissionUtils.getRule(String.valueOf(partnerUser.getGrade()), partnerRuleEntities);
+        boolean checked = commissionUtils.checkUpgradeConditions(partnerUser, ruleEntity.getAppraise(), ruleEntity.getStrategyArray());
+        overviewVo.setUpgradeStatus(checked ? 1 : 0);
+        Long count = liftingRecordService.selectDowngradeRecord(partnerUser.getUserId(), partnerUser.getGrade());
+        if (count > 0){
+            overviewVo.setUpgradeStatus(2);
+        }
+    }
+
     private void setDefaultValues(HashMap<String, Object> hashMap) {
         hashMap.put("commission", BigDecimal.ZERO);
         hashMap.put("numberOrders", BigDecimal.ZERO);

+ 2 - 0
src/main/java/com/ydtech/modules/partner/service/PartnerLiftingRecordService.java

@@ -30,4 +30,6 @@ public interface PartnerLiftingRecordService {
     void updateAuditStatusById(PartnerLiftingRecord record);
 
     HttpResult downgradeAudit(LiftingRecordAudit audit);
+
+    Long selectDowngradeRecord(String userId, Integer grade);
 }

+ 5 - 0
src/main/java/com/ydtech/modules/partner/service/PartnerRuleService.java

@@ -23,6 +23,11 @@ public interface PartnerRuleService {
      */
     boolean verifyUpgradeConditions(String userId,  String grade);
 
+    /**
+     * 验证是否满足降级升级条件
+     */
+    boolean verifyDowngradeUpgradeConditions(String userId,  String grade);
+
     String verifyUpgradeConditionsMessage(String userId,  String grade);
 
     PartnerRuleEntity selectByGrade(String grade);

+ 94 - 33
src/main/java/com/ydtech/modules/partner/utils/CalculateCommissionUtils.java

@@ -50,10 +50,12 @@ public class CalculateCommissionUtils {
     private static class CommissionValues {
         BigDecimal sumPremium;
         BigDecimal number;
+        BigDecimal grBf;
 
-        CommissionValues(BigDecimal sumPremium, BigDecimal number) {
+        CommissionValues(BigDecimal sumPremium, BigDecimal number,BigDecimal grBf) {
             this.sumPremium = sumPremium;
             this.number = number;
+            this.grBf = grBf;
         }
     }
 
@@ -67,7 +69,7 @@ public class CalculateCommissionUtils {
             period = getCommissionValidityPeriod(rules, userId3, "3");
             userIdList = partnerUserMapper.querySubordinate(userId3);
         }
-        BigDecimal sumPremium = BigDecimal.ZERO;
+        BigDecimal sumPremium = java.math.BigDecimal.ZERO;
         if (CollectionUtil.isNotEmpty(userIdList)) {
             QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("user_id", userIdList);
@@ -75,7 +77,7 @@ public class CalculateCommissionUtils {
                 queryWrapper.between("create_time", period.getStartDate(), period.getEndDate());
             }
             BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
-            sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
+            sumPremium = Optional.ofNullable(totalSumPremium).orElse(java.math.BigDecimal.ZERO);
         }
         Integer number = 0;
 
@@ -88,9 +90,14 @@ public class CalculateCommissionUtils {
             log.info("用户id{}++{}级用户++出单人的上级用户{}++统计的保单金额{}++统计的邀请人数{}",
                     userId, grade, userId3, sumPremium, number);
         }
-        return new CommissionValues(sumPremium, new BigDecimal(number));
+        BigDecimal grBf = queryPersonalInsurancePremiums(userId,period);
+        return new CommissionValues(sumPremium, new BigDecimal(number),grBf);
     }
 
+    public static BigDecimal queryPersonalInsurancePremiums(String userId,CommissionValidityPeriod period){
+        BigDecimal bigDecimal = partnerUserMapper.selectOwnSumPremium(userId, period);
+        return null == bigDecimal ? BigDecimal.ZERO : bigDecimal;
+    }
 
     public static String getReason(String grade, String userId,String userId3,String userId4) {
         CommissionRulesVo rulesVo = commissionService.queryAll();
@@ -184,7 +191,7 @@ public class CalculateCommissionUtils {
                 .sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
                 .collect(Collectors.toList());
         for (PartnerRulesRatio ratio : sortedList) {
-            BigDecimal result = handleRatioCondition(ratio, values.number, values.sumPremium);
+            BigDecimal result = handleRatioCondition(ratio, values.number, values.sumPremium,values.grBf);
             if (result.compareTo(BigDecimal.ZERO) > 0) {
                 return result;
             }
@@ -193,41 +200,95 @@ public class CalculateCommissionUtils {
     }
 
 
-    private static BigDecimal handleRatioCondition(PartnerRulesRatio ratio, BigDecimal numberBD, BigDecimal sumPremium) {
+//    private static BigDecimal handleRatioCondition(PartnerRulesRatio ratio, BigDecimal numberBD, BigDecimal sumPremium,BigDecimal grBf) {
+//        List<PartnerRatio> ratioList = ratio.getPartnerRatioList();
+//        if (CollectionUtil.isEmpty(ratioList)) return BigDecimal.ZERO;
+//        int allSatisfied = ratio.getAllSatisfied();
+//        BigDecimal min = ratioList.get(0).getMin();
+//        BigDecimal min1 = ratioList.get(1).getMin();
+//        BigDecimal min2 = ratioList.get(2).getMin();
+//        boolean ry = ratioList.get(0).isRy();
+//        boolean bf = ratioList.get(1).isBf();
+//        boolean gr = ratioList.get(2).isGr();
+//        if (ry && bf &&  gr) {
+//            if (allSatisfied == 1) {
+//                if (numberBD.compareTo(min) >= 0 && sumPremium.compareTo(min1) >= 0 && grBf.compareTo(min2) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            } else {
+//                if (numberBD.compareTo(min) >= 0 || sumPremium.compareTo(min1) >= 0 || grBf.compareTo(min2) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }
+//        }else if (!ry && bf && gr){
+//            if (allSatisfied == 1) {
+//                if (sumPremium.compareTo(min1) >= 0 && grBf.compareTo(min2) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }else {
+//                if (sumPremium.compareTo(min1) >= 0 || grBf.compareTo(min2) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }
+//        }else if (ry && !bf && gr){
+//            if (allSatisfied == 1) {
+//                if (numberBD.compareTo(min) >= 0 &&  grBf.compareTo(min2) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }else {
+//                if (numberBD.compareTo(min) >= 0 ||  grBf.compareTo(min2) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }
+//        }else if (ry && bf && !gr){
+//            if (allSatisfied == 1) {
+//                if (numberBD.compareTo(min) >= 0 && sumPremium.compareTo(min1) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }else {
+//                if (numberBD.compareTo(min) >= 0 || sumPremium.compareTo(min1) >= 0) {
+//                    return ratio.getKickback();
+//                }
+//            }
+//        }
+//        return BigDecimal.ZERO;
+//    }
+
+    private static BigDecimal handleRatioCondition(PartnerRulesRatio ratio, BigDecimal numberBD, BigDecimal sumPremium, BigDecimal grBf) {
         List<PartnerRatio> ratioList = ratio.getPartnerRatioList();
-        if (CollectionUtil.isEmpty(ratioList)) return BigDecimal.ZERO;
+        if (CollectionUtil.isEmpty(ratioList)) {
+            return BigDecimal.ZERO;
+        }
+        boolean[] conditions = {
+                ratioList.get(0).isRy(),
+                ratioList.get(1).isBf(),
+                ratioList.get(2).isGr()
+        };
+        BigDecimal[] values = {numberBD, sumPremium, grBf};
+        BigDecimal[] min = {
+                ratioList.get(0).getMin(),
+                ratioList.get(1).getMin(),
+                ratioList.get(2).getMin()
+        };
+
         int allSatisfied = ratio.getAllSatisfied();
-        BigDecimal min = ratioList.get(0).getMin();
-        BigDecimal min1 = ratioList.get(1).getMin();
-        boolean ry = ratioList.get(0).isRy();
-        boolean bf = ratioList.get(1).isBf();
-        if (ry && bf) {
-            if (allSatisfied == 1) {
-                if (numberBD.compareTo(min) >= 0 && sumPremium.compareTo(min1) >= 0) {
-                    return ratio.getKickback();
-                }
-            } else {
-                if (numberBD.compareTo(min) >= 0 || sumPremium.compareTo(min1) >= 0) {
-                    return ratio.getKickback();
-                }
-            }
-        }else if (ry && !bf){
-            if (allSatisfied != 1) {
-                if (numberBD.compareTo(min) >= 0) {
-                    return ratio.getKickback();
-                }
-            }
-        }else if (!ry && bf){
-            if (allSatisfied != 1) {
-                if (sumPremium.compareTo(min1) >= 0) {
-                    return ratio.getKickback();
-                }
+        boolean anyConditionMet = false;
+        boolean allConditionsMet = true;
+
+        for (int i = 0; i < conditions.length; i++) {
+            if (conditions[i]) {
+                int comparison = values[i].compareTo(min[i]);
+                anyConditionMet = anyConditionMet || (comparison >= 0);
+                allConditionsMet = allConditionsMet && (comparison >= 0);
             }
         }
+
+        if ((allSatisfied == 1 && allConditionsMet) || (allSatisfied != 1 && anyConditionMet)) {
+            return ratio.getKickback();
+        }
         return BigDecimal.ZERO;
     }
 
-
     public static String obtainReason(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,String type,String userId3,String userId4) {
         List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
                 .sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())

+ 42 - 30
src/main/java/com/ydtech/modules/partner/utils/ExpiredCommissionUtils.java

@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -73,22 +74,6 @@ public class ExpiredCommissionUtils {
         }
     }
 
-    /**
-     * TODO 用户升级、注册用户时 生成  降级时间范围
-     * @param partnerUser
-     * @return
-     */
-    public void downgradingTimeRange(PartnerUser partnerUser){
-        // 等级规则
-        List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();
-        if (1 == partnerUser.getGrade()){
-            return;
-        }
-        PartnerRuleEntity rule = getRule(String.valueOf(partnerUser.getGrade()), partnerRuleEntities);
-        updateUpgradeCycleTime(partnerUser,rule, new Date());
-
-    }
-
     public PartnerRuleEntity getRule(String grade,List<PartnerRuleEntity> partnerRuleEntities) {
         return partnerRuleEntities.stream().filter(partnerRuleEntity -> StringUtils.equals(partnerRuleEntity.getGrade(), grade)).findAny().orElse(null);
     }
@@ -110,17 +95,28 @@ public class ExpiredCommissionUtils {
     public void checkCommissionExpireTime(String userId) {
         // TODO等级规则
         List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();
-
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         List<PartnerUser> partnerUsers = partnerUserMapper.selectList(new QueryWrapper<PartnerUser>().eq("user_id", userId));
         for (PartnerUser partnerUser : partnerUsers) {
-            if (1 == partnerUser.getGrade()) {
+            if (1 == partnerUser.getGrade() || partnerUser.isIdentityStatus()) {
                 continue;
             }
             PartnerRuleEntity rule = getRule(String.valueOf(partnerUser.getGrade()), partnerRuleEntities);
-            //  升降周期结束时间
-            Date upgradeTime = partnerUserMapper.queryUpgradeEndTime(userId, partnerUser.getGrade());
+            Integer khDays = rule.getKhDays();
+            Date upgradeStartTime = partnerUserMapper.selectUpgradeStartTime(userId, partnerUser.getGrade());
+            if (upgradeStartTime == null) {
+                partnerUserMapper.updateUpgradeStartTime(userId, partnerUser.getGrade());
+            }else {
+                //TODO    更新考核周期
+                updateUpgradeCycleTime(partnerUser,rule, upgradeStartTime);
+            }
+            upgradeStartTime = partnerUserMapper.selectUpgradeStartTime(userId, partnerUser.getGrade());
+            System.out.println("开始时间:" + formatter.format(upgradeStartTime));
+            //  生成结束时间
+            Date upgradeEndTime = PartnerDateUtils.addDays(upgradeStartTime, khDays);
+            System.out.println("结束时间:" + formatter.format(upgradeEndTime));
             //   判断当前时间是否大于考核周期时间
-            boolean withinDays = PartnerDateUtils.isBefore(upgradeTime);
+            boolean withinDays = PartnerDateUtils.isBefore(upgradeEndTime);
             if (withinDays){
                 List<PartnerAttribute> strategyArray = rule.getStrategyArray();
                 String appraise = rule.getAppraise();
@@ -132,24 +128,19 @@ public class ExpiredCommissionUtils {
                     //TODO  不满足
                     generateLockRecords(partnerUser);
                 }
-                //TODO    更新考核周期
-                updateUpgradeCycleTime(partnerUser,rule, upgradeTime);
+
             }
         }
     }
 
     public  void updateUpgradeCycleTime(PartnerUser partnerUser,PartnerRuleEntity rule,Date upgradeTime) {
         Integer khDays = rule.getKhDays();
-        Date newDate = PartnerDateUtils.addDaysToday(upgradeTime, khDays);
-        while (PartnerDateUtils.isBefore(newDate)) {
-            newDate = PartnerDateUtils.addDaysToday(newDate, khDays);
+        while (!PartnerDateUtils.isWithinDays(upgradeTime, khDays)) {
+            upgradeTime = PartnerDateUtils.addDaysToday(upgradeTime, khDays);
         }
-        partnerUserMapper.updateUpgradeCycleStartTime(partnerUser.getUserId(), newDate,partnerUser.getGrade());
-        partnerUserMapper.updateUpgradeCycleEndTime(partnerUser.getUserId(), PartnerDateUtils.addDaysToday(newDate, khDays),partnerUser.getGrade());
+        partnerUserMapper.updateUpgradeCycleStartTime(partnerUser.getUserId(), upgradeTime,partnerUser.getGrade());
     }
 
-
-
     /**
      * TODO 生成降级记录
      * @param partnerUser
@@ -206,4 +197,25 @@ public class ExpiredCommissionUtils {
     }
 
 
+    /**
+     * TODO 生成降级时间
+     * @param grade
+     */
+    public String generateDowngradeTime(String grade,String startTime) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // TODO等级规则
+        List<PartnerRuleEntity> partnerRuleEntities = partnerRuleService.queryAll();
+        PartnerRuleEntity rule = getRule(grade, partnerRuleEntities);
+        Integer khDays = rule.getKhDays();
+        try {
+            Date newDate = PartnerDateUtils.addDays(formatter.parse(startTime), khDays);
+            return formatter.format(newDate);
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+
 }