|
|
@@ -51,47 +51,97 @@ public class CalculateCommissionUtils {
|
|
|
public void init() {
|
|
|
}
|
|
|
|
|
|
+ private static class CommissionValues {
|
|
|
+ BigDecimal sumPremium;
|
|
|
+ BigDecimal number;
|
|
|
|
|
|
- public static String getReason(String grade, String userId,String issuerId) {
|
|
|
+ CommissionValues(BigDecimal sumPremium, BigDecimal number) {
|
|
|
+ this.sumPremium = sumPremium;
|
|
|
+ this.number = number;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static CommissionValues calculateCommonValues(String grade, String userId, PartnerCommissionRules rules,String levelUserId) {
|
|
|
+ CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
|
|
|
+ Set<String> userIdList;
|
|
|
+ userIdList = CalculateCommissionUtils.getUserIdList(levelUserId);
|
|
|
+ BigDecimal sumPremium = BigDecimal.ZERO;
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
|
|
|
+ sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ Integer number;
|
|
|
+ switch (grade) {
|
|
|
+ case "2":
|
|
|
+ case "3":
|
|
|
+ number = partnerUserMapper.selectNumber(levelUserId, "4", period);
|
|
|
+ break;
|
|
|
+ case "4":
|
|
|
+ number = partnerUserMapper.selectNumber(levelUserId, "5", period);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ number = 0;
|
|
|
+ }
|
|
|
+ return new CommissionValues(sumPremium, new BigDecimal(number));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static String getReason(String grade, String userId,String levelUserId) {
|
|
|
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);
|
|
|
+ //String levelUserId = querySuperiorAndSubordinate(issuerId, grade, userId);
|
|
|
if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
|
|
|
- return obtainReason(grade, rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerUser);
|
|
|
+ return obtainReason(grade, rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),levelUserId);
|
|
|
}
|
|
|
if (StringUtils.equals("4", grade)){
|
|
|
- return obtainReason(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),issuerUser);
|
|
|
+ return obtainReason(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),levelUserId);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
|
|
|
+ public static String querySuperiorAndSubordinate(String issuerId,String grade){
|
|
|
+ String levelUserId = "";
|
|
|
+ QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq("user_id", issuerId);
|
|
|
+ PartnerUser issuerUser = partnerUserMapper.selectOne(queryWrapper);
|
|
|
+ if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)) {
|
|
|
+ levelUserId = getLevelUserId(issuerUser.getUserId(), issuerUser.getGrade(), "3");
|
|
|
+ } else {
|
|
|
+ levelUserId = getLevelUserId(issuerUser.getUserId(), issuerUser.getGrade(), "4");
|
|
|
+ }
|
|
|
+ return levelUserId;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- public static BigDecimal calculateCommission(String grade, String userId,String issuerId) {
|
|
|
+ public static BigDecimal calculateCommission(String grade, String userId,String levelUserId) {
|
|
|
CommissionRulesVo rulesVo = commissionService.queryAll();
|
|
|
if (rulesVo == null) return BigDecimal.ZERO;
|
|
|
BigDecimal 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());
|
|
|
- }
|
|
|
+ //String levelUserId = querySuperiorAndSubordinate(issuerId, grade, userId);
|
|
|
if (StringUtils.equals("2", grade) || StringUtils.equals("3", grade)){
|
|
|
- gl = ladderCommission(grade,rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(),issuerIdUser);
|
|
|
+ gl = ladderCommission(grade,rulesVo.getAdministrator().getRulesRatioList(), userId, rulesVo.getAdministrator(), levelUserId);
|
|
|
}
|
|
|
BigDecimal hh = BigDecimal.ZERO;
|
|
|
- if (StringUtils.equals("4", grade)){
|
|
|
- hh = ladderCommission(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),issuerIdUser);
|
|
|
+ if (StringUtils.equals("4", grade) || StringUtils.equals("3", grade)){
|
|
|
+ hh = ladderCommission(grade, rulesVo.getPartner().getRulesRatioList(), userId, rulesVo.getPartner(),levelUserId);
|
|
|
}
|
|
|
+ return calculateProportion(grade,rulesVo,gl,hh);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
+ public static BigDecimal calculateProportion(String grade, CommissionRulesVo rulesVo,BigDecimal gl,BigDecimal hh) {
|
|
|
+ if (StringUtils.equals("1", grade)) {
|
|
|
+ return new BigDecimal(rulesVo.getOriginator());
|
|
|
+ }
|
|
|
if (StringUtils.equals("2", grade)) {
|
|
|
PartnerCommissionRules administrator = rulesVo.getAdministrator();
|
|
|
if (isZero(gl)){
|
|
|
@@ -120,6 +170,8 @@ public class CalculateCommissionUtils {
|
|
|
return BigDecimal.ZERO;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
private static boolean isZero(BigDecimal value) {
|
|
|
return value.compareTo(BigDecimal.ZERO) == 0;
|
|
|
}
|
|
|
@@ -128,58 +180,17 @@ public class CalculateCommissionUtils {
|
|
|
return new BigDecimal(a).subtract(new BigDecimal(b));
|
|
|
}
|
|
|
|
|
|
- public static BigDecimal ladderCommission(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,PartnerUser issuerIdUser) {
|
|
|
- CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
|
|
|
+ public static BigDecimal ladderCommission(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,String levelUserId) {
|
|
|
+ CommissionValues values = calculateCommonValues(grade, userId, rules, levelUserId);
|
|
|
List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
|
|
|
.sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
|
|
|
.collect(Collectors.toList());
|
|
|
- BigDecimal sumPremium = BigDecimal.ZERO;
|
|
|
- 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())) {
|
|
|
- queryWrapper.between("create_time", period.getStartDate(), period.getEndDate());
|
|
|
- }
|
|
|
- BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
|
|
|
- sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
|
|
|
- }
|
|
|
- Integer number;
|
|
|
- switch (grade) {
|
|
|
- case "2":
|
|
|
- case "3":
|
|
|
- number = partnerUserMapper.selectNumber(levelUserId, "4", period);
|
|
|
- break;
|
|
|
- case "4":
|
|
|
- number = partnerUserMapper.selectNumber(levelUserId, "5", period);
|
|
|
- break;
|
|
|
- default:
|
|
|
- number = 0;
|
|
|
- }
|
|
|
- return obtainReason( sortedList, number, sumPremium);
|
|
|
+ return obtainReason(sortedList, values.number, values.sumPremium);
|
|
|
}
|
|
|
|
|
|
|
|
|
- public static BigDecimal obtainReason(List<PartnerRulesRatio> sortedList,Integer number, BigDecimal sumPremium){
|
|
|
- BigDecimal numberBD = BigDecimal.valueOf(number);
|
|
|
+
|
|
|
+ public static BigDecimal obtainReason(List<PartnerRulesRatio> sortedList,BigDecimal numberBD, BigDecimal sumPremium){
|
|
|
for (PartnerRulesRatio ratio : sortedList) {
|
|
|
int allSatisfied = ratio.getAllSatisfied();
|
|
|
List<PartnerRatio> ratioList = ratio.getPartnerRatioList();
|
|
|
@@ -215,55 +226,13 @@ 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 grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,PartnerUser issuerUser) {
|
|
|
- CommissionValidityPeriod period = getCommissionValidityPeriod(rules, userId, grade);
|
|
|
+ public static String obtainReason(String grade, List<PartnerRulesRatio> rulesRatioList, String userId, PartnerCommissionRules rules,String levelUserId) {
|
|
|
List<PartnerRulesRatio> sortedList = rulesRatioList.stream()
|
|
|
.sorted(Comparator.comparing(PartnerRulesRatio::getKickback).reversed())
|
|
|
.collect(Collectors.toList());
|
|
|
- BigDecimal sumPremium = BigDecimal.ZERO;
|
|
|
- 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())) {
|
|
|
- queryWrapper.between("create_time", period.getStartDate(), period.getEndDate());
|
|
|
- }
|
|
|
- BigDecimal totalSumPremium = partnerPremiumDetailsMapper.selectTotalSumPremium(queryWrapper);
|
|
|
- sumPremium = Optional.ofNullable(totalSumPremium).orElse(BigDecimal.ZERO);
|
|
|
- }
|
|
|
- Integer number;
|
|
|
- switch (grade) {
|
|
|
- case "2":
|
|
|
- case "3":
|
|
|
- number = partnerUserMapper.selectNumber(levelUserId, "4", period);
|
|
|
- break;
|
|
|
- case "4":
|
|
|
- number = partnerUserMapper.selectNumber(levelUserId, "5", period);
|
|
|
- break;
|
|
|
- default:
|
|
|
- number = 0;
|
|
|
- }
|
|
|
- BigDecimal numberBD = BigDecimal.valueOf(number);
|
|
|
+ CommissionValues values = calculateCommonValues(grade, userId, rules,levelUserId);
|
|
|
+ BigDecimal numberBD = values.number;
|
|
|
+ BigDecimal sumPremium = values.sumPremium;
|
|
|
for (PartnerRulesRatio ratio : sortedList) {
|
|
|
int allSatisfied = ratio.getAllSatisfied();
|
|
|
List<PartnerRatio> ratioList = ratio.getPartnerRatioList();
|
|
|
@@ -302,19 +271,21 @@ public class CalculateCommissionUtils {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public static String aaa(String grade){
|
|
|
- switch ( grade){
|
|
|
- case "1":
|
|
|
- return "普通会员";
|
|
|
- case "2":
|
|
|
- return "高级会员";
|
|
|
- case "3":
|
|
|
- return "下属团队出单保费";
|
|
|
- case "4":
|
|
|
- return "工作室";
|
|
|
- default:
|
|
|
- return "";
|
|
|
+ public static String getLevelUserId(String userId,Integer grade,String queryLevel){
|
|
|
+ PartnerUser partnerUser = partnerUserMapper.getLevelUserId(userId,grade);
|
|
|
+ while (partnerUser != null){
|
|
|
+ Integer userGrade = partnerUser.getGrade();
|
|
|
+ if (userGrade != null && userGrade.toString().equals(queryLevel)){
|
|
|
+ return partnerUser.getUserId();
|
|
|
+ }
|
|
|
+ userId = partnerUser.getReferrerId();
|
|
|
+ if (userId == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ grade--;
|
|
|
+ partnerUser = partnerUserMapper.getLevelUserId(userId, grade);
|
|
|
}
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
|