|
|
@@ -2185,63 +2185,99 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
|
|
|
}
|
|
|
|
|
|
private Map<String, Object> calcDistLevel1(InsFeeOrders o, BigDecimal totalPremium, String userId, SysDistributionSetting setting) {
|
|
|
- HttpResult<EsmUserReferrer> ref = orgClient.getReferrer(userId);
|
|
|
- if (ref == null || ref.getData() == null) return null;
|
|
|
- EsmUserReferrer referrer = ref.getData();
|
|
|
- HttpResult<SysUserJzgInfo> info = orgClient.getUserInfo(referrer.getReferrerId());
|
|
|
- if (info == null || info.getData() == null || !"1".equals(info.getData().getIsDistribution())) {
|
|
|
- o.setFirstDistributionFee(BigDecimal.ZERO);
|
|
|
- o.setFirstDistributionRatio(BigDecimal.ZERO);
|
|
|
- return null;
|
|
|
- }
|
|
|
- BigDecimal commissionRatio1 = setting.getCommissionRatioLevel1().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
|
|
|
- o.setFirstDistributorId(referrer.getReferrerId());
|
|
|
- BigDecimal fee5 = totalPremium.multiply(commissionRatio1.setScale(5, RoundingMode.DOWN));
|
|
|
- o.setFirstDistributionFee(totalPremium.multiply(commissionRatio1.setScale(2, RoundingMode.DOWN)));
|
|
|
- o.setFirstDistributionRatio(commissionRatio1);
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("id", referrer.getReferrerId());
|
|
|
- map.put("diffAmount", fee5.subtract(o.getFirstDistributionFee()));
|
|
|
- return map;
|
|
|
+ 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);
|
|
|
+ o.setFirstDistributorId(distributorId);
|
|
|
+ BigDecimal fee_5 = (totalPremium.multiply(commissionRatio1).setScale(5, RoundingMode.DOWN));
|
|
|
+ o.setFirstDistributionFee(totalPremium.multiply(commissionRatio1).setScale(2, RoundingMode.DOWN));
|
|
|
+ o.setFirstDistributionRatio(commissionRatio1.multiply(new BigDecimal(100)));
|
|
|
+ BigDecimal diffAmount = fee_5.subtract(o.getFirstDistributionFee());
|
|
|
+
|
|
|
+ // 如果一级分销是团队长,清空后续分销费用(二级、三级)
|
|
|
+ if (isTeamLeader(distributorId)) {
|
|
|
+ o.setSecondDistributionFee(BigDecimal.ZERO);
|
|
|
+ o.setSecondDistributionRatio(BigDecimal.ZERO);
|
|
|
+ o.setThirdDistributionFee(BigDecimal.ZERO);
|
|
|
+ o.setThirdDistributionRatio(BigDecimal.ZERO);
|
|
|
+ // 清空后续分销人ID
|
|
|
+ o.setSecondDistributorId(null);
|
|
|
+ o.setThirdDistributorId(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("id", distributorId);
|
|
|
+ map.put("diffAmount", diffAmount);
|
|
|
+ return map;
|
|
|
+ } else {
|
|
|
+ o.setFirstDistributionFee(BigDecimal.ZERO);
|
|
|
+ o.setFirstDistributionRatio(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
private Map<String, Object> calcDistLevel2(InsFeeOrders o, BigDecimal totalPremium, String upperId, SysDistributionSetting setting) {
|
|
|
- HttpResult<EsmUserReferrer> ref = orgClient.getReferrer(upperId);
|
|
|
- if (ref == null || ref.getData() == null) return null;
|
|
|
- EsmUserReferrer referrer = ref.getData();
|
|
|
- HttpResult<SysUserJzgInfo> info = orgClient.getUserInfo(referrer.getReferrerId());
|
|
|
- if (info == null || info.getData() == null || !"1".equals(info.getData().getIsDistribution())) {
|
|
|
- o.setSecondDistributionFee(BigDecimal.ZERO);
|
|
|
- o.setSecondDistributionRatio(BigDecimal.ZERO);
|
|
|
- return null;
|
|
|
- }
|
|
|
- BigDecimal commissionRatio2 = setting.getCommissionRatioLevel2().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
|
|
|
- o.setSecondDistributorId(referrer.getReferrerId());
|
|
|
- BigDecimal fee5 = totalPremium.multiply(commissionRatio2).setScale(5, RoundingMode.DOWN);
|
|
|
- o.setSecondDistributionFee(totalPremium.multiply(commissionRatio2).setScale(2, RoundingMode.DOWN));
|
|
|
- o.setSecondDistributionRatio(commissionRatio2);
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put("id", referrer.getReferrerId());
|
|
|
- map.put("diffAmount", fee5.subtract(o.getSecondDistributionFee()));
|
|
|
- return map;
|
|
|
+ HttpResult<EsmUserReferrer> referrerResult = orgClient.getReferrer(upperId);
|
|
|
+ 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);
|
|
|
+ o.setSecondDistributorId(distributorId);
|
|
|
+ BigDecimal fee_5 = (totalPremium.multiply(commissionRatio2).setScale(5, RoundingMode.DOWN));
|
|
|
+ o.setSecondDistributionFee(totalPremium.multiply(commissionRatio2).setScale(2, RoundingMode.DOWN));
|
|
|
+ o.setSecondDistributionRatio(commissionRatio2.multiply(new BigDecimal(100)));
|
|
|
+ BigDecimal diffAmount = fee_5.subtract(o.getSecondDistributionFee());
|
|
|
+
|
|
|
+ // 如果二级分销是团队长,清空后续分销费用(三级)
|
|
|
+ if (isTeamLeader(distributorId)) {
|
|
|
+ o.setThirdDistributionFee(BigDecimal.ZERO);
|
|
|
+ o.setThirdDistributionRatio(BigDecimal.ZERO);
|
|
|
+ o.setThirdDistributorId(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("id", distributorId);
|
|
|
+ map.put("diffAmount", diffAmount);
|
|
|
+ return map;
|
|
|
+ } else {
|
|
|
+ o.setSecondDistributionFee(BigDecimal.ZERO);
|
|
|
+ o.setSecondDistributionRatio(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
private BigDecimal calcDistLevel3(InsFeeOrders o, BigDecimal totalPremium, String upperId, SysDistributionSetting setting) {
|
|
|
- HttpResult<EsmUserReferrer> ref = orgClient.getReferrer(upperId);
|
|
|
- if (ref == null || ref.getData() == null) return BigDecimal.ZERO;
|
|
|
- EsmUserReferrer referrer = ref.getData();
|
|
|
- HttpResult<SysUserJzgInfo> info = orgClient.getUserInfo(referrer.getReferrerId());
|
|
|
- if (info == null || info.getData() == null || !"1".equals(info.getData().getIsDistribution())) {
|
|
|
- o.setThirdDistributionFee(BigDecimal.ZERO);
|
|
|
- o.setThirdDistributionRatio(BigDecimal.ZERO);
|
|
|
- return BigDecimal.ZERO;
|
|
|
- }
|
|
|
- BigDecimal commissionRatio3 = setting.getCommissionRatioLevel3().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
|
|
|
- o.setThirdDistributorId(referrer.getReferrerId());
|
|
|
- BigDecimal fee5 = totalPremium.multiply(commissionRatio3).setScale(5, RoundingMode.DOWN);
|
|
|
- o.setThirdDistributionFee(totalPremium.multiply(commissionRatio3).setScale(2, RoundingMode.DOWN));
|
|
|
- o.setThirdDistributionRatio(commissionRatio3);
|
|
|
- return fee5.subtract(o.getThirdDistributionFee());
|
|
|
+ HttpResult<EsmUserReferrer> referrerResult = orgClient.getReferrer(upperId);
|
|
|
+ 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();
|
|
|
+ o.setThirdDistributorId(distributorId);
|
|
|
+ BigDecimal commissionRatio3 = setting.getCommissionRatioLevel3().divide(new BigDecimal(100)).setScale(5, RoundingMode.DOWN);
|
|
|
+ BigDecimal fee_5 = (totalPremium.multiply(commissionRatio3).setScale(5, RoundingMode.DOWN));
|
|
|
+ o.setThirdDistributionFee(totalPremium.multiply(commissionRatio3).setScale(2, RoundingMode.DOWN));
|
|
|
+ o.setThirdDistributionRatio(commissionRatio3.multiply(new BigDecimal(100)));
|
|
|
+ BigDecimal diffAmount = fee_5.subtract(o.getThirdDistributionFee());
|
|
|
+
|
|
|
+ // 三级分销如果是团队长,无需清空后续(已经是最后一级)
|
|
|
+ return diffAmount;
|
|
|
+ } else {
|
|
|
+ o.setThirdDistributionFee(BigDecimal.ZERO);
|
|
|
+ o.setThirdDistributionRatio(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return BigDecimal.ZERO;
|
|
|
}
|
|
|
|
|
|
// ===== 费用计算辅助方法 =====
|
|
|
@@ -2471,59 +2507,99 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
|
|
|
* 区别:userId 取自当前登录用户 baseController.getUserId(),而非订单。
|
|
|
*
|
|
|
* @param totalPremium 总保费
|
|
|
- * @param feeOrders 费用订单对象(用于设置分销字段)
|
|
|
+ * @param insFeeOrders 费用订单对象(用于设置分销字段)
|
|
|
* @param mobile 业务员手机号
|
|
|
* @return 分销精度差值(scale=5 - scale=2)
|
|
|
*/
|
|
|
- private BigDecimal calcDistributionFee(BigDecimal totalPremium, InsFeeOrders feeOrders, String mobile) {
|
|
|
-
|
|
|
- HttpResult<SysUserJzgInfo> userResult = orgClient.getUserInfoByMobile(mobile);
|
|
|
- if (userResult == null || userResult.getData() == null) {
|
|
|
- return BigDecimal.ZERO;
|
|
|
- }
|
|
|
- String userId = userResult.getData().getUserId();
|
|
|
+ private BigDecimal calcDistributionFee(BigDecimal totalPremium, InsFeeOrders insFeeOrders, String mobile) {
|
|
|
+ // 获取当前租户信息
|
|
|
+ HttpResult<SysUserJzgInfo> sysUserJzgInfoResult = orgClient.getUserInfoByMobile(mobile);
|
|
|
+ SysUserJzgInfo currentUser = sysUserJzgInfoResult.getData();
|
|
|
|
|
|
// 获取租户分销设置
|
|
|
- HttpResult<SysDistributionSetting> settingResult = orgClient.getSettingBySystemCode();
|
|
|
- if (settingResult == null || settingResult.getData() == null) {
|
|
|
- return BigDecimal.ZERO;
|
|
|
- }
|
|
|
- SysDistributionSetting sysDistributionSetting = settingResult.getData();
|
|
|
- // 判断业务员所属机构是否开启分销
|
|
|
- String deptId = userResult.getData().getDeptId();
|
|
|
- HttpResult<SysDeptVo> deptResult = orgClient.deptGet(deptId);
|
|
|
- if (deptResult == null || deptResult.getData() == null || !"1".equals(deptResult.getData().getIsDistribution())) {
|
|
|
- return BigDecimal.ZERO;
|
|
|
- }
|
|
|
- String level = sysDistributionSetting.getDistributionMode();
|
|
|
- BigDecimal diffAmount = BigDecimal.ZERO;
|
|
|
- switch (level) {
|
|
|
- case "1":
|
|
|
- Map<String, Object> lv1 = calcDistLevel1(feeOrders, totalPremium, userId, sysDistributionSetting);
|
|
|
- if (lv1 != null) diffAmount = new BigDecimal(lv1.get("diffAmount").toString());
|
|
|
- break;
|
|
|
- case "2":
|
|
|
- Map<String, Object> first = calcDistLevel1(feeOrders, totalPremium, userId, sysDistributionSetting);
|
|
|
- if (first != null) {
|
|
|
- Map<String, Object> second = calcDistLevel2(feeOrders, totalPremium, first.get("id").toString(), sysDistributionSetting);
|
|
|
- if (second != null) diffAmount = new BigDecimal(second.get("diffAmount").toString());
|
|
|
- diffAmount = diffAmount.add(new BigDecimal(first.get("diffAmount").toString()));
|
|
|
- }
|
|
|
- break;
|
|
|
- case "3":
|
|
|
- Map<String, Object> l1 = calcDistLevel1(feeOrders, totalPremium, userId, sysDistributionSetting);
|
|
|
- if (l1 != null) {
|
|
|
- Map<String, Object> l2 = calcDistLevel2(feeOrders, totalPremium, l1.get("id").toString(), sysDistributionSetting);
|
|
|
- if (l2 != null) {
|
|
|
- BigDecimal l3Diff = calcDistLevel3(feeOrders, totalPremium, l2.get("id").toString(), sysDistributionSetting);
|
|
|
- diffAmount = diffAmount.add(l3Diff);
|
|
|
- diffAmount = diffAmount.add(new BigDecimal(l2.get("diffAmount").toString()));
|
|
|
- }
|
|
|
- diffAmount = diffAmount.add(new BigDecimal(l1.get("diffAmount").toString()));
|
|
|
+ HttpResult<SysDistributionSetting> setting = orgClient.getSettingBySystemCode();
|
|
|
+ SysDistributionSetting sysDistributionSetting = setting.getData();
|
|
|
+
|
|
|
+ if (sysDistributionSetting != null) {
|
|
|
+ // 判断业务员所属机构是否被排除
|
|
|
+ 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;
|
|
|
+
|
|
|
+ switch (level) {
|
|
|
+ case "1":
|
|
|
+ Map<String, Object> level1Result = calcDistLevel1(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 = calcDistLevel1(insFeeOrders, totalPremium, currentUser.getUserId(), sysDistributionSetting);
|
|
|
+ if (firstDistributor != null) {
|
|
|
+ diffAmount = diffAmount.add(new BigDecimal(firstDistributor.get("diffAmount").toString()));
|
|
|
+
|
|
|
+ // 判断一级分销用户是否为团队长,如果不是则继续计算二级
|
|
|
+ if (!isTeamLeader(firstDistributor.get("id").toString())) {
|
|
|
+ Map<String, Object> level2Result = calcDistLevel2(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 = calcDistLevel1(insFeeOrders, totalPremium, currentUser.getId(), sysDistributionSetting);
|
|
|
+ if (level1 != null) {
|
|
|
+ diffAmount = diffAmount.add(new BigDecimal(level1.get("diffAmount").toString()));
|
|
|
+
|
|
|
+ // 判断一级分销用户是否为团队长
|
|
|
+ if (!isTeamLeader(level1.get("id").toString())) {
|
|
|
+ // 计算二级分销
|
|
|
+ Map<String, Object> level2 = calcDistLevel2(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 = calcDistLevel3(insFeeOrders, totalPremium, level2.get("id").toString(), sysDistributionSetting);
|
|
|
+ diffAmount = diffAmount.add(level3Diff);
|
|
|
+ }
|
|
|
+ // 如果二级是团队长,三级分销费用已经在calculateLevel2Distribution中设置为0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果一级是团队长,二级和三级分销费用已经在calculateLevel1Distribution中设置为0
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
- break;
|
|
|
+ return diffAmount;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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;
|
|
|
}
|
|
|
- return diffAmount;
|
|
|
}
|
|
|
|
|
|
/**
|