package com.ydtech.modules.partner; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.extra.spring.SpringUtil; import com.ydtech.modules.partner.dao.PartnerUserMapper; import com.ydtech.modules.partner.model.*; import com.ydtech.modules.partner.service.PartnerKickbackChangeService; import com.ydtech.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.math.BigDecimal; import java.util.*; @Component public class UpdateRatioUtils { private static final Logger log = LoggerFactory.getLogger(UpdateRatioUtils.class); private static PartnerUserMapper partnerUserMapper; private static PartnerKickbackChangeService kickbackChangeService; @Autowired public void setCommissionService(PartnerUserMapper partnerUserMapper, PartnerKickbackChangeService kickbackChangeService) { UpdateRatioUtils.partnerUserMapper = partnerUserMapper; UpdateRatioUtils.kickbackChangeService = kickbackChangeService; } @PostConstruct public void init() { } public void loginBefore(String userId){ Map allByUserId = getAllByUserId(userId); if (isExist(allByUserId)){ allByUserId.forEach((key, value) -> { String grade = String.valueOf(key); BigDecimal latest = CalculateCommissionUtils.calculateCommission(grade, value.getUserId(),allByUserId.get(3).getUserId(),allByUserId.get(4).getUserId()); initializeCommissionRatio(value, latest); }); } } public static String getString(Map allByUserId, String grade) { Integer userIdKey = null; if (StringUtils.equals("1", grade)) { userIdKey = 2; } else if (StringUtils.equals("2", grade)) { userIdKey = 3; } else if (StringUtils.equals("3", grade) || StringUtils.equals("4", grade)) { userIdKey = 4; } if (userIdKey != null) { PartnerUser s = allByUserId.get(userIdKey); if (!Objects.isNull(s)) { return s.getUserId(); } } return null; } private void initializeCommissionRatio(PartnerUser value, BigDecimal latest) { BigDecimal mostRecent = SpringUtil.getBean(PartnerKickbackChangeService.class).mostRecentRecord(value.getUserId(),String.valueOf(value.getGrade())); if (mostRecent == null){ PartnerKickbackChange change = new PartnerKickbackChange(); change.setUserId(value.getUserId()); change.setUserGrade(String.valueOf(value.getGrade())); change.setOriginalCommission(latest); change.setAfterChange(null); change.setDeptId(value.getDeptId()); change.setChangeTime(new Date()); kickbackChangeService.saveKickbackChange(change); } } public void loginChange(String userId){ Map allByUserId = getAllByUserId(userId); saveChange(allByUserId); } public Map getAllByUserId(String userId) { Map map = new HashMap<>(); List userList = partnerUserMapper.queryByUserId(userId); if (CollectionUtil.isNotEmpty(userList)) { for (PartnerUser user : userList) { getMap(map, user); } } return map; } private void saveChange(Map map) { if (isExist(map)){ List kickbackChange = new ArrayList<>(); for (Map.Entry entry : map.entrySet()) { String key = String.valueOf(entry.getKey()); PartnerUser value = entry.getValue(); BigDecimal latest = CalculateCommissionUtils.calculateCommission(String.valueOf(key), value.getUserId(), map.get(3).getUserId(), map.get(4).getUserId()); BigDecimal mostRecent = SpringUtil.getBean(PartnerKickbackChangeService.class).mostRecentRecord(value.getUserId(),key); getPartnerKickbackChange(latest, mostRecent, value, kickbackChange,map); } for (PartnerKickbackChange change : kickbackChange) { kickbackChangeService.saveKickbackChange(change); } } } private static void getMap(Map map, PartnerUser user) { map.put(user.getGrade(), user); while (true) { Integer userGrade = user.getGrade(); int i = userGrade - 1; if (0 == i) { break; } user = partnerUserMapper.queryUser(user.getReferrerId(),i ); if (user == null) { break; } map.put(user.getGrade(),user); } } public boolean isExist(Map map) { int[] keysToCheck = {3,4}; return Arrays.stream(keysToCheck).allMatch(map::containsKey); } public void before(String referrerId, Integer grade){ Map map = new HashMap<>(); PartnerUser user = partnerUserMapper.queryUser(referrerId, grade); if (user != null) { getMap(map, user); } if (isExist(map)){ for (Map.Entry entry : map.entrySet()) { String key = String.valueOf(entry.getKey()); PartnerUser value = entry.getValue(); BigDecimal latest = CalculateCommissionUtils.calculateCommission(key,value.getUserId(),map.get(3).getUserId(),map.get(4).getUserId()); initializeCommissionRatio(value, latest); } } } public void addChangeRecord(String userId){ Map allByUserId = getAllByUserId(userId); saveChange(allByUserId); } public static void getPartnerKickbackChange(BigDecimal latest,BigDecimal mostRecent,PartnerUser details,List list,Map map){ if (mostRecent == null){ PartnerKickbackChange change = getChange(null, latest, details,map); list.add( change); }else { if (latest.compareTo(mostRecent) != 0){ PartnerKickbackChange change = getChange(latest, mostRecent, details,map); list.add( change); } } } private static PartnerKickbackChange getChange(BigDecimal bigDecimal, BigDecimal mostRecent, PartnerUser details,Map map) { PartnerKickbackChange change = new PartnerKickbackChange(); change.setUserId(details.getUserId()); change.setUserGrade(String.valueOf(details.getGrade())); change.setOriginalCommission(mostRecent); change.setAfterChange(bigDecimal); String reason = CalculateCommissionUtils.getReason(String.valueOf(details.getGrade()), details.getUserId(),map.get(3).getUserId(), map.get(4).getUserId()); change.setChangeReason(reason); change.setDeptId(details.getDeptId()); change.setChangeTime(new Date()); return change; } }