Pārlūkot izejas kodu

合伙人升级bug修改

xuqiang 1 gadu atpakaļ
vecāks
revīzija
5079032f61

+ 16 - 20
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -340,10 +340,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             details.setJqpremium(insAreaCompany.getJqpremium());
             details.setSypremium(insAreaCompany.getSypremium());
             details.setJypremium(insAreaCompany.getJypremium());
-            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()),user.getUserId(),userId);
+            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()), user.getUserId(), userId);
             details.setProportional(String.valueOf(bigDecimal));
-            details.setExtractFee(details.getSumpremium().multiply(bigDecimal
-                    .divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
+            details.setExtractFee(details.getSumpremium().multiply(bigDecimal.divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
             details.setStatus(0);
             details.setType(1);
             details.setDeptId(user.getDeptId());
@@ -351,9 +350,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             details.setCreateTime(new Date());
             details.setLicenseno(insOrders.getLicenseno());
             details.setSource(user.getGrade());
-            list.add( details);
-            SpringUtil.getBean(KickbackChangeUtils.class).before(bigDecimal,details);
-            saveFeeLevelInfo(user.getGrade(),user.getReferrerId(),insAreaCompany,userId,list);
+            list.add(details);
+            SpringUtil.getBean(KickbackChangeUtils.class).before(bigDecimal, details);
+            saveFeeLevelInfo(user.getGrade() - 1, user.getReferrerId(), insAreaCompany, userId, list);
         }
         for (PartnerPremiumDetails details : list) {
             partnerPremiumDetailsMapper.insert(details);
@@ -361,18 +360,17 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         SpringUtil.getBean(KickbackChangeUtils.class).updatePersonnel(list);
     }
 
-    public void saveFeeLevelInfo(Integer grade,String referrerId,InsAreaCompany insAreaCompany,String userId,List<PartnerPremiumDetails> list) {
-
-        InsOrders insOrders = getById(insAreaCompany.getOrderno());
-        grade -- ;
-        if (Objects.isNull(grade) || 0 == grade){
+    public void saveFeeLevelInfo(Integer grade, String referrerId, InsAreaCompany insAreaCompany, String userId, List<PartnerPremiumDetails> list) {
+        if (Objects.isNull(grade) || grade <= 0) {
             return;
         }
-        PartnerUser partnerUser = partnerUserService.selectByUserIdAndGrade(referrerId,grade);
-        if (Objects.isNull(partnerUser)){
+        PartnerUser partnerUser = partnerUserService.selectByUserIdAndGrade(referrerId, grade);
+        if (Objects.isNull(partnerUser)) {
             return;
         }
         PartnerPremiumDetails details = new PartnerPremiumDetails();
+        // 获取订单信息
+        InsOrders insOrders = getById(insAreaCompany.getOrderno());
         details.setUserId(partnerUser.getUserId());
         details.setUserName("");
         details.setIssuerId(userId);
@@ -383,10 +381,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         details.setJqpremium(insAreaCompany.getJqpremium());
         details.setSypremium(insAreaCompany.getSypremium());
         details.setJypremium(insAreaCompany.getJypremium());
-        BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId(), userId);
+        BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()), partnerUser.getUserId(), userId);
         details.setProportional(String.valueOf(bigDecimal));
-        details.setExtractFee(details.getSumpremium().multiply(bigDecimal
-                .divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
+        details.setExtractFee(details.getSumpremium().multiply(bigDecimal.divide(new BigDecimal("100"))).setScale(2, RoundingMode.DOWN));
         details.setStatus(0);
         details.setType(1);
         details.setDeptId(partnerUser.getDeptId());
@@ -394,10 +391,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         details.setCreateTime(new Date());
         details.setLicenseno(insOrders.getLicenseno());
         details.setSource(partnerUser.getGrade());
-        list.add( details);
-        SpringUtil.getBean(KickbackChangeUtils.class).before(bigDecimal,details);
-        saveFeeLevelInfo(grade,partnerUser.getReferrerId(),insAreaCompany,userId,list);
-
+        list.add(details);
+        SpringUtil.getBean(KickbackChangeUtils.class).before(bigDecimal, details);
+        saveFeeLevelInfo(grade - 1, partnerUser.getReferrerId(), insAreaCompany, userId, list);
     }
 
 

+ 76 - 65
src/main/java/com/ydtech/modules/partner/CalculateCommissionUtils.java

@@ -52,23 +52,20 @@ public class CalculateCommissionUtils {
     }
 
 
-//    public Map<String,BigDecimal> calculateUserProportion(String grade,String userId){
-//        HashMap<Object, Object> map = new HashMap<>();
-//
-//    }
-
     public static String getReason(String grade, String userId,String issuerId) {
         CommissionRulesVo rulesVo = commissionService.queryAll();
         if (rulesVo == null) return null;
         if (StringUtils.equals("1", grade)){
             return null;
         }
+        QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", issuerId);
+        PartnerUser issuerUser = partnerUserMapper.selectOne(queryWrapper);
         if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
-            return   obtainReason("gl" , grade,
-                    rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerId);
+            return   obtainReason(grade, rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerUser);
         }
-        if (StringUtils.equals("3", grade) || StringUtils.equals("4", grade)){
-           return obtainReason(StringUtils.equals("3",grade) ? "levelGzs" :"gzs",grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),issuerId);
+        if (StringUtils.equals("4", grade)){
+           return obtainReason(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),issuerUser);
         }
         return null;
     }
@@ -79,20 +76,22 @@ public class CalculateCommissionUtils {
         CommissionRulesVo rulesVo = commissionService.queryAll();
         if (rulesVo == null) return BigDecimal.ZERO;
         BigDecimal gl = BigDecimal.ZERO;
-        if (StringUtils.equals("1", grade)){
-            gl = BigDecimal.ZERO;
+
+        QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", issuerId);
+        PartnerUser issuerIdUser = partnerUserMapper.selectOne(queryWrapper);
+
+        if (StringUtils.equals("1", grade)) {
+            return new BigDecimal(rulesVo.getOriginator());
         }
         if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
-            gl = ladderCommission("gl" , grade,
-                    rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerId);
+            gl = ladderCommission(grade,rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerIdUser);
         }
         BigDecimal hh = BigDecimal.ZERO;
-        if (StringUtils.equals("3", grade) || StringUtils.equals("4", grade)){
-            hh = ladderCommission(StringUtils.equals("3",grade) ? "levelGzs" :"gzs",grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),issuerId);
-        }
-        if (StringUtils.equals("1", grade)) {
-            return new BigDecimal(rulesVo.getOriginator());
+        if (StringUtils.equals("4", grade)){
+            hh = ladderCommission(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),issuerIdUser);
         }
+
         if (StringUtils.equals("2", grade)) {
             PartnerCommissionRules administrator = rulesVo.getAdministrator();
             if (isZero(gl)){
@@ -129,25 +128,32 @@ public class CalculateCommissionUtils {
         return new BigDecimal(a).subtract(new BigDecimal(b));
     }
 
-    public static BigDecimal ladderCommission(String type,String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,String issuerId) {
+    public static BigDecimal ladderCommission(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,PartnerUser issuerIdUser) {
         CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
         List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
                 .sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
                 .collect(Collectors.toList());
         BigDecimal sumPremium = BigDecimal.ZERO;
-        Set<String> userIdList = new HashSet<>(0);
-        if (StringUtils.equals("2",grade)){
-            String gzsList = partnerUserMapper.getGzsList(issuerId);
-            userIdList = getUserIdList(gzsList);
-        }
-        if (StringUtils.equals("3",grade)){
-            String tdList = partnerUserMapper.getTdList(issuerId);
-            userIdList = getUserIdList(tdList);
-        }
-        if (StringUtils.equals("4",grade)){
-            String tdList = partnerUserMapper.getTdList(issuerId);
-            userIdList = getUserIdList(tdList);
+        Set<String> userIdList;
+//        if (StringUtils.equals("2",grade)){
+//            String gzsList = partnerUserMapper.getGzsList(issuerId);
+//            userIdList = getUserIdList(gzsList);
+//        }
+//        if (StringUtils.equals("3",grade)){
+//            String tdList = partnerUserMapper.getTdList(issuerId);
+//            userIdList = getUserIdList(tdList);
+//        }
+//        if (StringUtils.equals("4",grade)){
+//            String tdList = partnerUserMapper.getTdList(issuerId);
+//            userIdList = getUserIdList(tdList);
+//        }
+        String levelUserId;
+        if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
+            levelUserId = getLevelUserId(issuerIdUser.getUserId(), issuerIdUser.getGrade(), "3");
+        }else {
+            levelUserId = getLevelUserId(issuerIdUser.getUserId(), issuerIdUser.getGrade(), "4");
         }
+        userIdList = CalculateCommissionUtils.getUserIdList(levelUserId);
         if (CollectionUtil.isNotEmpty(userIdList)){ QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("user_id", userIdList);
             if (StringUtils.isNotEmpty(period.getStartDate()) && StringUtils.isNotEmpty(period.getEndDate())) {
@@ -157,20 +163,22 @@ public class CalculateCommissionUtils {
             sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
         }
         Integer number;
-        switch (type) {
-            case "gl":
-                String id = partnerUserMapper.queryManager(issuerId);
-                number = partnerUserMapper.selectNumber(id, "4", period);
-                break;
-            case "levelGzs":
-                number = partnerUserMapper.selectNumber3(issuerId, "5", period);
+        switch (grade) {
+            case "2":
+            case "3":
+                number = partnerUserMapper.selectNumber(levelUserId, "4", period);
                 break;
-            case "gzs":
-                number = partnerUserMapper.selectByUserIdNumber(userId, "5", period);
+            case "4":
+                number = partnerUserMapper.selectNumber(levelUserId, "5", period);
                 break;
             default:
-                return BigDecimal.ZERO;
+                number = 0;
         }
+        return obtainReason( sortedList, number,  sumPremium);
+    }
+
+
+    public static BigDecimal obtainReason(List<PartnerRulesRatio> sortedList,Integer number, BigDecimal sumPremium){
         BigDecimal numberBD = BigDecimal.valueOf(number);
         for (PartnerRulesRatio ratio : sortedList) {
             int allSatisfied = ratio.getAllSatisfied();
@@ -207,28 +215,34 @@ public class CalculateCommissionUtils {
         return BigDecimal.ZERO;
     }
 
+    public static String getLevelUserId(String userId,Integer grade,String queryLevel){
+        PartnerUser partnerUser = partnerUserMapper.getLevelUserId(userId,grade);
+        while (partnerUser != null){
+            Integer userGrade = partnerUser.getGrade();
+            if (StringUtils.equals(String.valueOf(userGrade),queryLevel)){
+                return partnerUser.getUserId();
+            }
+            userGrade --;
+            getLevelUserId(partnerUser.getReferrerId(),userGrade,queryLevel);
+        }
+        return null;
+    }
 
 
-
-    public static String obtainReason(String type,String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,String issuerId) {
+    public static String obtainReason(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,PartnerUser issuerUser) {
         CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
         List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
                 .sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
                 .collect(Collectors.toList());
         BigDecimal sumPremium = BigDecimal.ZERO;
-        Set<String> userIdList = new HashSet<>(0);
-        if (StringUtils.equals("2",grade)){
-            String gzsList = partnerUserMapper.getGzsList(issuerId);
-            userIdList = getUserIdList(gzsList);
-        }
-        if (StringUtils.equals("3",grade)){
-            String tdList = partnerUserMapper.getTdList(issuerId);
-            userIdList = getUserIdList(tdList);
-        }
-        if (StringUtils.equals("4",grade)){
-            String tdList = partnerUserMapper.getTdList(issuerId);
-            userIdList = getUserIdList(tdList);
+        Set<String> userIdList;
+        String levelUserId;
+        if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
+            levelUserId = getLevelUserId(issuerUser.getUserId(), issuerUser.getGrade(),"3");
+        }else {
+            levelUserId = getLevelUserId(issuerUser.getUserId(), issuerUser.getGrade(),"4");
         }
+        userIdList = CalculateCommissionUtils.getUserIdList(levelUserId);
         if (CollectionUtil.isNotEmpty(userIdList)){ QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("user_id", userIdList);
             if (StringUtils.isNotEmpty(period.getStartDate()) && StringUtils.isNotEmpty(period.getEndDate())) {
@@ -238,19 +252,16 @@ public class CalculateCommissionUtils {
             sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
         }
         Integer number;
-        switch (type) {
-            case "gl":
-                String id = partnerUserMapper.queryManager(issuerId);
-                number = partnerUserMapper.selectNumber(id, "4", period);
-                break;
-            case "levelGzs":
-                number = partnerUserMapper.selectNumber3(issuerId, "5", period);
+        switch (grade) {
+            case "2":
+            case "3":
+                number = partnerUserMapper.selectNumber(levelUserId, "4", period);
                 break;
-            case "gzs":
-                number = partnerUserMapper.selectByUserIdNumber(userId, "5", period);
+            case "4":
+                number = partnerUserMapper.selectNumber(levelUserId, "5", period);
                 break;
             default:
-                return "";
+                number = 0;
         }
         BigDecimal numberBD = BigDecimal.valueOf(number);
         for (PartnerRulesRatio ratio : sortedList) {

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

@@ -82,8 +82,6 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
 
     Integer selectNumber(@Param("userId") String userId, @Param("number") String number,@Param("period") CommissionValidityPeriod period);
 
-    Integer selectNumber3(@Param("userId") String userId, @Param("number") String number,@Param("period") CommissionValidityPeriod period);
-
 
     @Select("SELECT assessment_time FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
     Date selectAssessmentTime(@Param("userId") String userId, @Param("grade")String grade);
@@ -140,4 +138,7 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     BigDecimal selectTotalSumPremium(@Param("userId") String userId,@Param("grade") String grade, @Param("period")CommissionValidityPeriod period);
 
     String querySuperiors(@Param("userId") String userId,@Param("grade") String grade);
+
+    @Select("SELECT * FROM partner_user WHERE user_id = #{userId} AND grade = #{grade}")
+    PartnerUser getLevelUserId(@Param("userId") String userId,@Param("grade") Integer grade);
 }

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

@@ -105,7 +105,7 @@ public class PartnerLiftingRecordServiceImpl extends ServiceImpl<PartnerLiftingR
         partnerUser.setMobile(liftingRecord.getMobile());
         partnerUser.setUserId(liftingRecord.getUserId());
         partnerUser.setDeptId(liftingRecord.getDeptId());
-        String referrerId = partnerUserMapper.querySuperiors(liftingRecord.getUserId(),String.valueOf(i));
+        String referrerId = partnerUserMapper.querySuperiors(liftingRecord.getUserId(),String.valueOf(i - 1));
         partnerUser.setReferrerId(referrerId);
         partnerUser.setGrade(i);
         partnerUserMapper.insert(partnerUser);

+ 16 - 51
src/main/resources/mapper/modules/partner/PartnerUserMapper.xml

@@ -746,57 +746,22 @@ select grade,grade_name from  partner_rule
 
 
     <select id="selectNumber" resultType="java.lang.Integer">
-        SELECT
-             COUNT( p.user_id )
-            FROM
-             partner_user p
-             LEFT JOIN sys_user_track t ON t.user_id = p.user_id
-             WHERE
-             t.`status` = 1 AND grade = #{number}
-             <if test="period.startDate != null and period.endDate != null">
-                 AND t.approve_time BETWEEN #{period.startDate} AND #{period.endDate}
-             </if>
-             AND p.referrer_id  =  #{userId}
-    </select>
-
-
-    <select id="selectNumber3" resultType="java.lang.Integer">
-        SELECT
-        COUNT( p.user_id )
-        FROM
-        partner_user p
-        LEFT JOIN sys_user_track t ON t.user_id = p.user_id
-        WHERE
-        t.`status` = 1 AND grade = #{number}
-        <if test="period.startDate != null and period.endDate != null">
-            AND t.approve_time BETWEEN #{period.startDate} AND #{period.endDate}
-        </if>
-        AND p.referrer_id IN (
-            WITH RECURSIVE cte_name AS (
-            SELECT
-            user_id,
-            referrer_id,
-            grade,
-            CAST(
-            user_id AS CHAR ( 200 )) AS path
-            FROM
-            partner_user
-            WHERE
-            user_id = #{userId} UNION ALL
-            SELECT
-            t.user_id,
-            t.referrer_id,
-            t.grade,
-            CONCAT( cte_name.path, '->', t.user_id )
-            FROM
-            partner_user t
-            INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
-            WHERE
-            cte_name.path NOT LIKE CONCAT( '%->', t.user_id, '%' )
-            AND t.grade = '4'
-            )
-            SELECT user_id FROM cte_name WHERE grade = 4
-        )
+        SELECT COUNT(1) FROM (
+                                 SELECT
+                                     p.user_id,
+                                     p.grade,
+                                     p.referrer_id,
+                                     u.`status`,
+                                     (SELECT t.approve_time FROM sys_user_track t WHERE t.user_id = p.user_id ORDER BY t.approve_time LIMIT 1) approve_time
+            FROM partner_user p
+        	LEFT JOIN sys_user u ON u.id = p.user_id
+        WHERE p.referrer_id = #{userId} AND p.grade = #{number}
+            ) db
+        <where>
+            <if test="period.startDate != null and period.endDate != null">
+                db.approve_time BETWEEN #{period.startDate} AND #{period.endDate}
+            </if>
+        </where>
     </select>