|
|
@@ -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();
|