Просмотр исходного кода

判断分销中是否有团队长的逻辑

Qchen 2 недель назад
Родитель
Сommit
a2bc8b7409

+ 8 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -275,4 +275,12 @@ public interface OrgClient {
      */
     @GetMapping("/plt/areaLicense/getAreaLicenseCode")
     HttpResult<String> convertLicense2AreaNumber(@RequestParam("licenseNo") String licenseNo);
+
+    /**
+     * 根据人员id 查询是否为团队长
+     * @param id
+     */
+    @GetMapping("/sysOrganization/queryOrganizationByManagerId")
+    HttpResult<List<SysOrganization>> queryOrganizationByManagerId(@RequestParam("id")String id);
+
 }

+ 103 - 44
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java

@@ -763,54 +763,73 @@ public class QuoteVerificationAspect {
 
     }
 
-    /**
-     * 计算分销费
-     */
-    private BigDecimal calculateDistributionFee(InsOrdersCosts insOrdersCosts, InsFeeOrders insFeeOrders,InsOrders insOrders){
+    private BigDecimal calculateDistributionFee(InsOrdersCosts insOrdersCosts, InsFeeOrders insFeeOrders, InsOrders insOrders) {
         // 总保费
         BigDecimal totalPremium = insOrdersCosts.getJqPremium().add(insOrdersCosts.getSyPremium()).add(insOrdersCosts.getJyPremium());
+
         // 获取当前租户信息
         HttpResult<SysUserJzgInfo> sysUserJzgInfoResult = orgClient.getUserInfoByMobile(insOrders.getRealQuoteUserId());
         SysUserJzgInfo currentUser = sysUserJzgInfoResult.getData();
+
         // 获取租户分销设置
         HttpResult<SysDistributionSetting> setting = orgClient.getSettingBySystemCode();
         SysDistributionSetting sysDistributionSetting = setting.getData();
+
         if (sysDistributionSetting != null) {
             // 判断业务员所属机构是否被排除
-            // 1.获取业务员所属机构
             String deptId = sysUserJzgInfoResult.getData().getDeptId();
             HttpResult<SysDeptVo> sysDept = orgClient.deptGet(deptId);
+
             if (sysDept.getData() != null && sysDept.getData().getIsDistribution().equals("1")) {
-                // 获取租户分销设置为几级分销
                 String level = sysDistributionSetting.getDistributionMode();
                 BigDecimal diffAmount = BigDecimal.ZERO;
+
+                // 标识是否需要继续计算下一级
+                boolean continueNextLevel = true;
+
                 switch (level) {
                     case "1":
-                        Map<String,Object> map = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getUserId(), sysDistributionSetting);
-                        if(Objects.nonNull(map)){
-                            diffAmount = new BigDecimal(map.get("diffAmount").toString());
+                        Map<String, Object> level1Result = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getUserId(), sysDistributionSetting);
+                        if (Objects.nonNull(level1Result)) {
+                            diffAmount = diffAmount.add(new BigDecimal(level1Result.get("diffAmount").toString()));
                         }
                         break;
                     case "2":
-
-                        Map<String,Object> firstDistributor = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getUserId(), sysDistributionSetting);
+                        // 计算一级分销
+                        Map<String, Object> firstDistributor = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getUserId(), sysDistributionSetting);
                         if (firstDistributor != null) {
-                            Map<String,Object> level2map = calculateLevel2Distribution(insFeeOrders, totalPremium, firstDistributor.get("id").toString(), sysDistributionSetting);
-                            if(Objects.nonNull(level2map)){
-                                diffAmount = new BigDecimal(level2map.get("diffAmount").toString());
-                            }
                             diffAmount = diffAmount.add(new BigDecimal(firstDistributor.get("diffAmount").toString()));
+
+                            // 判断一级分销用户是否为团队长,如果是则不再计算二级
+                            if (!isTeamLeader(firstDistributor.get("id").toString())) {
+                                Map<String, Object> level2Result = calculateLevel2Distribution(insFeeOrders, totalPremium, firstDistributor.get("id").toString(), sysDistributionSetting);
+                                if (Objects.nonNull(level2Result)) {
+                                    diffAmount = diffAmount.add(new BigDecimal(level2Result.get("diffAmount").toString()));
+                                }
+                            }
+                            // 如果一级是团队长,二级分销费用已经在calculateLevel1Distribution中设置为0
                         }
                         break;
                     case "3":
-                        Map<String,Object> level1 = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getId(), sysDistributionSetting);
+                        // 计算一级分销
+                        Map<String, Object> level1 = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getId(), sysDistributionSetting);
                         if (level1 != null) {
-                            Map<String,Object> level2 = calculateLevel2Distribution(insFeeOrders, totalPremium, level1.get("id").toString(), sysDistributionSetting);
-                            if (level2 != null) {
-                                diffAmount = calculateLevel3Distribution(insFeeOrders, totalPremium, level2.get("id").toString(), sysDistributionSetting);
-                                diffAmount = diffAmount.add(new BigDecimal(level2.get("diffAmount").toString()));
-                            }
                             diffAmount = diffAmount.add(new BigDecimal(level1.get("diffAmount").toString()));
+
+                            // 判断一级分销用户是否为团队长
+                            if (!isTeamLeader(level1.get("id").toString())) {
+                                // 计算二级分销
+                                Map<String, Object> level2 = calculateLevel2Distribution(insFeeOrders, totalPremium, level1.get("id").toString(), sysDistributionSetting);
+                                if (level2 != null) {
+                                    diffAmount = diffAmount.add(new BigDecimal(level2.get("diffAmount").toString()));
+                                    // 判断二级分销用户是否为团队长
+                                    if (!isTeamLeader(level2.get("id").toString())) {
+                                        // 计算三级分销
+                                        BigDecimal level3Diff = calculateLevel3Distribution(insFeeOrders, totalPremium, level2.get("id").toString(), sysDistributionSetting);
+                                        diffAmount = diffAmount.add(level3Diff);
+                                    }
+                                }
+                            }
                         }
                         break;
                 }
@@ -821,26 +840,39 @@ public class QuoteVerificationAspect {
     }
 
     /**
-     * 计算一级分销
-     * @return 一级分销员ID,若不存在则返回null
+     * 计算一级分销,返回结果包含用户ID和差额
+     * 如果该级是团队长,会清空后续所有分销费用
      */
-    private Map<String,Object> calculateLevel1Distribution(InsFeeOrders insFeeOrders, BigDecimal totalPremium,
-                                               String userId, SysDistributionSetting setting) {
+    private Map<String, Object> calculateLevel1Distribution(InsFeeOrders insFeeOrders, BigDecimal totalPremium,
+                                                            String userId, SysDistributionSetting setting) {
         HttpResult<EsmUserReferrer> referrerResult = orgClient.getReferrer(userId);
         if (referrerResult.getData() != null) {
             EsmUserReferrer referrer = referrerResult.getData();
             HttpResult<SysUserJzgInfo> referrerInfoResult = orgClient.getUserInfo(referrer.getReferrerId());
             if (referrerInfoResult.getData() != null && "1".equals(referrerInfoResult.getData().getIsDistribution())) {
                 String distributorId = referrer.getReferrerId();
+
                 BigDecimal commissionRatio1 = setting.getCommissionRatioLevel1().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
                 insFeeOrders.setFirstDistributorId(distributorId);
-                BigDecimal fee_5 = (totalPremium.multiply(commissionRatio1).setScale(5,RoundingMode.DOWN));
-                insFeeOrders.setFirstDistributionFee(totalPremium.multiply(commissionRatio1).setScale(2,RoundingMode.DOWN));
+                BigDecimal fee_5 = (totalPremium.multiply(commissionRatio1).setScale(5, RoundingMode.DOWN));
+                insFeeOrders.setFirstDistributionFee(totalPremium.multiply(commissionRatio1).setScale(2, RoundingMode.DOWN));
                 insFeeOrders.setFirstDistributionRatio(commissionRatio1.multiply(new BigDecimal(100)));
                 BigDecimal diffAmount = fee_5.subtract(insFeeOrders.getFirstDistributionFee());
-                Map map = new HashMap();
-                map.put("id",distributorId);
-                map.put("diffAmount",diffAmount);
+
+                // 如果一级分销是团队长,清空后续分销费用(二级、三级)
+                if (isTeamLeader(distributorId)) {
+                    insFeeOrders.setSecondDistributionFee(BigDecimal.ZERO);
+                    insFeeOrders.setSecondDistributionRatio(BigDecimal.ZERO);
+                    insFeeOrders.setThirdDistributionFee(BigDecimal.ZERO);
+                    insFeeOrders.setThirdDistributionRatio(BigDecimal.ZERO);
+                    // 清空后续分销人ID
+                    insFeeOrders.setSecondDistributorId(null);
+                    insFeeOrders.setThirdDistributorId(null);
+                }
+
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", distributorId);
+                map.put("diffAmount", diffAmount);
                 return map;
             } else {
                 insFeeOrders.setFirstDistributionFee(BigDecimal.ZERO);
@@ -851,26 +883,35 @@ public class QuoteVerificationAspect {
     }
 
     /**
-     * 计算二级分销
-     * @return 二级分销员ID,若不存在则返回null
+     * 计算二级分销,返回结果包含用户ID和差额
+     * 如果该级是团队长,会清空后续分销费用(三级)
      */
-    private Map<String,Object> calculateLevel2Distribution(InsFeeOrders insFeeOrders, BigDecimal totalPremium,
-                                               String upperDistributorId, SysDistributionSetting setting) {
+    private Map<String, Object> calculateLevel2Distribution(InsFeeOrders insFeeOrders, BigDecimal totalPremium,
+                                                            String upperDistributorId, SysDistributionSetting setting) {
         HttpResult<EsmUserReferrer> referrerResult = orgClient.getReferrer(upperDistributorId);
         if (referrerResult.getData() != null) {
             EsmUserReferrer referrer = referrerResult.getData();
             HttpResult<SysUserJzgInfo> referrerInfoResult = orgClient.getUserInfo(referrer.getReferrerId());
             if (referrerInfoResult.getData() != null && "1".equals(referrerInfoResult.getData().getIsDistribution())) {
                 String distributorId = referrer.getReferrerId();
+
                 BigDecimal commissionRatio2 = setting.getCommissionRatioLevel2().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
                 insFeeOrders.setSecondDistributorId(distributorId);
-                BigDecimal fee_5 = (totalPremium.multiply(commissionRatio2).setScale(5,RoundingMode.DOWN));
-                insFeeOrders.setSecondDistributionFee(totalPremium.multiply(commissionRatio2).setScale(2,RoundingMode.DOWN));
+                BigDecimal fee_5 = (totalPremium.multiply(commissionRatio2).setScale(5, RoundingMode.DOWN));
+                insFeeOrders.setSecondDistributionFee(totalPremium.multiply(commissionRatio2).setScale(2, RoundingMode.DOWN));
                 insFeeOrders.setSecondDistributionRatio(commissionRatio2.multiply(new BigDecimal(100)));
                 BigDecimal diffAmount = fee_5.subtract(insFeeOrders.getSecondDistributionFee());
-                Map map = new HashMap();
-                map.put("id",distributorId);
-                map.put("diffAmount",diffAmount);
+
+                // 如果二级分销是团队长,清空后续分销费用(三级)
+                if (isTeamLeader(distributorId)) {
+                    insFeeOrders.setThirdDistributionFee(BigDecimal.ZERO);
+                    insFeeOrders.setThirdDistributionRatio(BigDecimal.ZERO);
+                    insFeeOrders.setThirdDistributorId(null);
+                }
+
+                Map<String, Object> map = new HashMap<>();
+                map.put("id", distributorId);
+                map.put("diffAmount", diffAmount);
                 return map;
             } else {
                 insFeeOrders.setSecondDistributionFee(BigDecimal.ZERO);
@@ -881,21 +922,25 @@ public class QuoteVerificationAspect {
     }
 
     /**
-     * 计算三级分销
+     * 计算三级分销,返回差额
      */
     private BigDecimal calculateLevel3Distribution(InsFeeOrders insFeeOrders, BigDecimal totalPremium,
-                                             String upperDistributorId, SysDistributionSetting setting) {
+                                                   String upperDistributorId, SysDistributionSetting setting) {
         HttpResult<EsmUserReferrer> referrerResult = orgClient.getReferrer(upperDistributorId);
         if (referrerResult.getData() != null) {
             EsmUserReferrer referrer = referrerResult.getData();
             HttpResult<SysUserJzgInfo> referrerInfoResult = orgClient.getUserInfo(referrer.getReferrerId());
             if (referrerInfoResult.getData() != null && "1".equals(referrerInfoResult.getData().getIsDistribution())) {
-                insFeeOrders.setThirdDistributorId(referrer.getReferrerId());
+                String distributorId = referrer.getReferrerId();
+
+                insFeeOrders.setThirdDistributorId(distributorId);
                 BigDecimal commissionRatio3 = setting.getCommissionRatioLevel3().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
-                BigDecimal fee_5 = (totalPremium.multiply(commissionRatio3).setScale(5,RoundingMode.DOWN));
-                insFeeOrders.setThirdDistributionFee(totalPremium.multiply(commissionRatio3).setScale(2,RoundingMode.DOWN));
+                BigDecimal fee_5 = (totalPremium.multiply(commissionRatio3).setScale(5, RoundingMode.DOWN));
+                insFeeOrders.setThirdDistributionFee(totalPremium.multiply(commissionRatio3).setScale(2, RoundingMode.DOWN));
                 insFeeOrders.setThirdDistributionRatio(commissionRatio3.multiply(new BigDecimal(100)));
                 BigDecimal diffAmount = fee_5.subtract(insFeeOrders.getThirdDistributionFee());
+
+                // 三级分销如果是团队长,无需清空后续(已经是最后一级)
                 return diffAmount;
             } else {
                 insFeeOrders.setThirdDistributionFee(BigDecimal.ZERO);
@@ -905,6 +950,20 @@ public class QuoteVerificationAspect {
         return BigDecimal.ZERO;
     }
 
+
+    /**
+     * 判断用户是否为团队长
+     */
+    private boolean isTeamLeader(String userId) {
+        try {
+            HttpResult<List<SysOrganization>> organizations = orgClient.queryOrganizationByManagerId(userId);
+            return organizations.getData() != null && !organizations.getData().isEmpty();
+        } catch (Exception e) {
+            // 异常处理,默认不是团队长
+            return false;
+        }
+    }
+
     @Before("@annotation(com.jzg.quotation.summary.aop.QuoteVerification)")
     public void doBefore(JoinPoint point) {
         Object[] args = point.getArgs();

+ 8 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/SysOrganizationController.java

@@ -21,6 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("/sysOrganization")
 public class SysOrganizationController {
@@ -163,4 +165,10 @@ public class SysOrganizationController {
         Page page = sysOrganizationUserLinkQueryVo.getPage();
         return HttpResult.ok(sysOrganizationService.getTeamUserPage(page,sysOrganizationUserLinkQueryVo));
     }
+
+    @Operation(summary = "根据用户id查询团队")
+    @PostMapping("queryOrganizationByManagerId")
+    public HttpResult<List<SysOrganization>> queryOrganizationByManagerId(@RequestParam("userId") String userId){
+        return HttpResult.ok(sysOrganizationService.queryOrganizationByManagerId(userId));
+    }
 }

+ 4 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysOrganizationService.java

@@ -9,6 +9,7 @@ import com.jzg.commons.entity.po.SysOrganizationVO;
 import com.jzg.commons.entity.vo.SysOrganizationUserLinkQueryVo;
 import com.jzg.commons.entity.vo.SysOrganizationUserLinkVo;
 
+import java.util.List;
 import java.util.Map;
 
 public interface SysOrganizationService extends IService<SysOrganization> {
@@ -60,4 +61,7 @@ public interface SysOrganizationService extends IService<SysOrganization> {
      * @date 2026年4月10日10:09:12
      */
     Page<SysOrganizationUserLinkVo> getTeamUserPage(Page page,SysOrganizationUserLinkQueryVo sysOrganizationUserLinkQueryVo);
+
+    List<SysOrganization> queryOrganizationByManagerId(String userId);
+
 }

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysOrganizationServiceImpl.java

@@ -204,4 +204,13 @@ public class SysOrganizationServiceImpl extends ServiceImpl<SysOrganizationMappe
         log.debug("获取团队下的人员列表分页.查询出[{}]个业务员。 sysOrganizationUserLinkQueryVo=[{}], page=[{}]", CollUtil.size(teamUserPage.getRecords()), JSONUtil.toJsonStr(sysOrganizationUserLinkQueryVo), JSONUtil.toJsonStr(page));
         return teamUserPage;
     }
+
+    @Override
+    public List<SysOrganization> queryOrganizationByManagerId(String managerId) {
+        LambdaQueryWrapper<SysOrganization> lambdaQueryWrapper = new LambdaQueryWrapper<SysOrganization>()
+                .eq(SysOrganization::getManagerId, managerId)
+                .eq(SysOrganization::getIsDelete, 0);
+        return sysOrganizationMapper.selectList(lambdaQueryWrapper);
+    }
+
 }