Browse Source

合伙人bug修改

xuqiang 1 year ago
parent
commit
ea91544e99

+ 15 - 6
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -325,6 +325,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         InsOrders insOrders = getById(insAreaCompany.getOrderno());
         String userId = insOrders.getUserid();
         List<PartnerUser> partnerUser = partnerUserService.selectByUserId(userId);
+        List<PartnerPremiumDetails> list = new ArrayList<>();
         for (PartnerUser user : partnerUser) {
             PartnerPremiumDetails details = new PartnerPremiumDetails();
             details.setUserId(user.getUserId());
@@ -337,7 +338,7 @@ 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());
+            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));
@@ -347,13 +348,20 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             details.setCreateTime(new Date());
             details.setLicenseno(insOrders.getLicenseno());
             details.setSource(user.getGrade());
+            list.add( details);
+            //partnerPremiumDetailsMapper.insert(details);
+            saveFeeLevelInfo(user.getGrade(),user.getReferrerId(),insAreaCompany,userId,list);
+        }
+        for (PartnerPremiumDetails details : list) {
             partnerPremiumDetailsMapper.insert(details);
-            saveFeeLevelInfo(user.getGrade(),user.getReferrerId(),insAreaCompany,userId);
         }
+
+
     }
 
 
-    public void saveFeeLevelInfo(Integer grade,String referrerId,InsAreaCompany insAreaCompany,String userId) {
+    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){
@@ -374,7 +382,7 @@ 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());
+        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));
@@ -384,8 +392,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         details.setCreateTime(new Date());
         details.setLicenseno(insOrders.getLicenseno());
         details.setSource(partnerUser.getGrade());
-        partnerPremiumDetailsMapper.insert(details);
-        saveFeeLevelInfo(grade,partnerUser.getReferrerId(),insAreaCompany,userId);
+        list.add( details);
+        //partnerPremiumDetailsMapper.insert(details);
+        saveFeeLevelInfo(grade,partnerUser.getReferrerId(),insAreaCompany,userId,list);
 
     }
 

+ 61 - 35
src/main/java/com/ydtech/modules/partner/CalculateCommissionUtils.java

@@ -7,6 +7,7 @@ import com.ydtech.modules.partner.dao.PartnerUserMapper;
 import com.ydtech.modules.partner.model.PartnerCommissionRules;
 import com.ydtech.modules.partner.model.PartnerPremiumDetails;
 import com.ydtech.modules.partner.model.PartnerRatio;
+import com.ydtech.modules.partner.model.PartnerUser;
 import com.ydtech.modules.partner.model.param.CommissionValidityPeriod;
 import com.ydtech.modules.partner.model.vo.CommissionRulesVo;
 import com.ydtech.modules.partner.model.vo.PartnerRulesRatio;
@@ -49,17 +50,30 @@ public class CalculateCommissionUtils {
     public void init() {
     }
 
-    public static BigDecimal calculateCommission(String grade, String userId) {
+
+//    public Map<String,BigDecimal> calculateUserProportion(String grade,String userId){
+//        HashMap<Object, Object> map = new HashMap<>();
+//
+//    }
+
+
+
+
+
+    public static BigDecimal calculateCommission(String grade, String userId,String issuerId) {
         CommissionRulesVo rulesVo = commissionService.queryAll();
         if (rulesVo == null) return BigDecimal.ZERO;
         BigDecimal gl = BigDecimal.ZERO;
+        if (StringUtils.equals("1", grade)){
+            gl = BigDecimal.ZERO;
+        }
         if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
-            gl = ladderCommission(StringUtils.equals("3", grade) ? "2" : grade,
-                    rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator());
+            gl = ladderCommission("gl" , grade,
+                    rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerId);
         }
         BigDecimal hh = BigDecimal.ZERO;
         if (StringUtils.equals("3", grade) || StringUtils.equals("4", grade)){
-            hh = ladderCommission(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner());
+            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());
@@ -100,40 +114,37 @@ public class CalculateCommissionUtils {
         return new BigDecimal(a).subtract(new BigDecimal(b));
     }
 
-    public static BigDecimal ladderCommission(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules) {
-        if (CollectionUtil.isEmpty(rulesRatioList) || StringUtils.equals("1", grade)) {
-            return BigDecimal.ZERO;
-        }
+    public static BigDecimal ladderCommission(String type,String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,String issuerId) {
         CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
         List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
                 .sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
                 .collect(Collectors.toList());
-        Set<String> userIdList = getUserIdList(userId);
         BigDecimal sumPremium = BigDecimal.ZERO;
-        if (CollectionUtil.isNotEmpty(userIdList)) {
-            try {
-                QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
-                queryWrapper.in("user_id", userIdList);
-                if (StringUtils.isNotEmpty(period.getStartDate()) && StringUtils.isNotEmpty(period.getEndDate())) {
-                    queryWrapper.between("create_time", period.getStartDate(), period.getEndDate());
-                }
-                BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
-                sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
-            } catch (Exception e) {
-                log.error("查询保费失败", e);
+        Set<String> userIdList = new HashSet<>(0);
+        if (StringUtils.equals("3",grade) || StringUtils.equals("2",grade)){
+            userIdList = getUserIdList(partnerUserMapper.getGzsList(issuerId));
+        }
+        if (StringUtils.equals("4",grade)){
+            userIdList = getUserIdList(partnerUserMapper.getTdList(issuerId));
+        }
+        if (CollectionUtil.isNotEmpty(userIdList)){ QueryWrapper<PartnerPremiumDetails> queryWrapper = new QueryWrapper<>();
+            queryWrapper.in("user_id", userIdList);
+            if (StringUtils.isNotEmpty(period.getStartDate()) && StringUtils.isNotEmpty(period.getEndDate())) {
+                queryWrapper.between("create_time", period.getStartDate(), period.getEndDate());
             }
-        } else {
-            return BigDecimal.ZERO;
+            BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
+            sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
         }
         Integer number;
-        switch (grade) {
-            case "2":
-                number = partnerUserMapper.selectNumber(userId, "4", period);
+        switch (type) {
+            case "gl":
+                String id = partnerUserMapper.queryManager(issuerId);
+                number = partnerUserMapper.selectNumber(id, "4", period);
                 break;
-            case "3":
-                number = partnerUserMapper.selectNumber(userId, "5", period);
+            case "levelGzs":
+                number = partnerUserMapper.selectNumber3(issuerId, "5", period);
                 break;
-            case "4":
+            case "gzs":
                 number = partnerUserMapper.selectByUserIdNumber(userId, "5", period);
                 break;
             default:
@@ -144,16 +155,31 @@ public class CalculateCommissionUtils {
             int allSatisfied = ratio.getAllSatisfied();
             List<PartnerRatio> ratioList = ratio.getPartnerRatioList();
             if (CollectionUtil.isEmpty(ratioList)) continue;
-
             BigDecimal min = ratioList.get(0).getMin();
             BigDecimal min1 = ratioList.get(1).getMin();
-            if (allSatisfied == 1) {
-                if (numberBD.compareTo(min) >= 0 && sumPremium.compareTo(min1) >= 0) {
-                    return ratio.getKickback();
+            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 (numberBD.compareTo(min) >= 0 || sumPremium.compareTo(min1) >= 0) {
-                    return ratio.getKickback();
+            }else if (!ry && bf){
+                if (allSatisfied != 1) {
+                    if (sumPremium.compareTo(min1) >= 0) {
+                        return ratio.getKickback();
+                    }
                 }
             }
         }

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

@@ -82,6 +82,8 @@ 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 referrer_id FROM partner_user WHERE user_id = #{userId} ")
     String queryReferrerId(String userId);
 
@@ -118,4 +120,16 @@ public interface PartnerUserMapper extends BaseMapper<PartnerUser> {
     void updateAssessmentTimeByDate(@Param("userId") String userId,@Param("date") Date date);
 
     Integer selectByUserIdNumber(@Param("userId") String userId,@Param("number")  String number, @Param("period") CommissionValidityPeriod period);
+
+    String getIssuerId(String issuerId);
+
+
+    String queryManager(String issuerId);
+
+    String getGzsList(String issuerId);
+
+    String getTdList(String issuerId);
+
+    @Select("SELECT * FROM partner_user WHERE user_id = #{issuerId} ")
+    PartnerUser selectByIssuerId(String issuerId);
 }

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

@@ -815,7 +815,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
 
         BigDecimal totalAmountSafe = BigDecimal.ZERO;
         for (PartnerUser partnerUser : partnerUsers) {
-            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId());
+            BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId(),"");
             totalAmountSafe = totalAmountSafe.add(bigDecimal);
         }
         JSONObject jsonObject = new JSONObject();
@@ -828,7 +828,7 @@ public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, Partn
             JSONObject object = new JSONObject();
             object.put("grade",user.getGrade());
             object.put("gradeName",rule.getOrDefault(user.getGrade(),""));
-            object.put("commissionRate",CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()),user.getUserId()));
+            object.put("commissionRate",CalculateCommissionUtils.calculateCommission(String.valueOf(user.getGrade()),user.getUserId(),""));
             list.add(object);
         }
         jsonObject.put("data",list);

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

@@ -814,10 +814,37 @@ select grade,grade_name from  partner_rule
              <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 ( SELECT user_id FROM partner_user WHERE referrer_id = #{userId} )
+             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
+            FROM partner_user
+            WHERE user_id = #{userId}
+            UNION ALL
+            SELECT t.user_id, t.referrer_id,t.grade
+            FROM partner_user t
+            INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
+            WHERE t.grade = '4'
+            )
+            SELECT user_id FROM cte_name WHERE grade = 4
+        )
+    </select>
+
     <select id="selectByUserIdNumber" resultType="java.lang.Integer">
         SELECT
         COUNT( p.user_id )
@@ -832,4 +859,77 @@ select grade,grade_name from  partner_rule
         AND p.referrer_id = #{userId}
     </select>
 
+
+
+
+    <select id="getIssuerId" resultType="java.lang.String">
+        WITH RECURSIVE cte_name AS (
+
+            SELECT user_id,referrer_id,grade
+            FROM partner_user
+            WHERE user_id = #{issuerId}
+
+            UNION ALL
+            SELECT t.user_id, t.referrer_id,t.grade
+            FROM partner_user t
+                     INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
+            WHERE t.grade = '4'
+        )
+        SELECT user_id FROM cte_name WHERE grade = 4
+    </select>
+
+
+    <select id="queryManager" resultType="java.lang.String">
+        WITH RECURSIVE cte_name AS (
+
+            SELECT user_id,referrer_id,grade
+            FROM partner_user
+            WHERE user_id = #{issuerId}
+
+            UNION ALL
+            SELECT t.user_id, t.referrer_id,t.grade
+            FROM partner_user t
+                     INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
+
+        )
+        SELECT user_id FROM cte_name WHERE grade = 3
+    </select>
+
+
+
+
+    <select id="getGzsList" resultType="java.lang.String">
+        WITH RECURSIVE cte_name AS (
+
+            SELECT user_id,referrer_id,grade
+            FROM partner_user
+            WHERE user_id =  #{issuerId}
+
+            UNION ALL
+            SELECT t.user_id, t.referrer_id,t.grade
+            FROM partner_user t
+                     INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
+
+        )
+        SELECT user_id FROM cte_name WHERE grade = 3
+    </select>
+
+
+
+    <select id="getTdList" resultType="java.lang.String">
+        WITH RECURSIVE cte_name AS (
+
+            SELECT user_id,referrer_id,grade
+            FROM partner_user
+            WHERE user_id =  #{issuerId}
+
+            UNION ALL
+            SELECT t.user_id, t.referrer_id,t.grade
+            FROM partner_user t
+                     INNER JOIN cte_name ON t.user_id = cte_name.referrer_id
+
+        )
+        SELECT user_id FROM cte_name WHERE grade = 4
+    </select>
+
 </mapper>