package com.ydtech.modules.partner.service.Impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ydtech.exception.SystemException; import com.ydtech.modules.partner.dao.PartnerAttributeMapper; import com.ydtech.modules.partner.dao.PartnerRuleMapper; import com.ydtech.modules.partner.dao.PartnerUserMapper; import com.ydtech.modules.partner.model.PartnerAttribute; import com.ydtech.modules.partner.model.PartnerRule; import com.ydtech.modules.partner.model.param.CommissionValidityPeriod; import com.ydtech.modules.partner.model.param.PartnerRuleEntity; import com.ydtech.modules.partner.service.PartnerRuleService; import com.ydtech.modules.partner.utils.ExpiredCommissionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.*; @Service public class PartnerRuleServiceImpl extends ServiceImpl implements PartnerRuleService { @Autowired private PartnerAttributeMapper attributeMapper; @Autowired private PartnerUserMapper partnerUserMapper; @Override @Transactional(rollbackFor = Exception.class) public int save(List ruleEntityList) { if (CollectionUtil.isEmpty(ruleEntityList)){ throw new RuntimeException("参数不能为空"); } int num = 0; try { for (PartnerRuleEntity ruleEntity : ruleEntityList) { PartnerRule partnerRule = new PartnerRule(); BeanUtil.copyProperties(ruleEntity,partnerRule); if (StringUtils.isNotBlank(partnerRule.getId())){ baseMapper.updateById(partnerRule); }else { baseMapper.insert(partnerRule); } if (StringUtils.equals("1",ruleEntity.getUpgrade())){ PartnerAttribute cycle = ruleEntity.getCycle(); if (ObjectUtil.isNotNull(cycle)){ if (StringUtils.isNotBlank(cycle.getId())){ attributeMapper.updateById(cycle); }else { cycle.setRuleId(partnerRule.getId()); attributeMapper.insert(cycle); } } List requirement = ruleEntity.getRequirement(); if (CollectionUtil.isNotEmpty(requirement)){ for (PartnerAttribute attribute : requirement) { if (StringUtils.isNotBlank(attribute.getId())){ attributeMapper.updateById(attribute); }else { attribute.setRuleId(partnerRule.getId()); attributeMapper.insert(attribute); } } } } // 保级策略 List strategy = ruleEntity.getStrategyArray(); if (CollectionUtil.isNotEmpty(strategy)){ for (PartnerAttribute attribute : strategy) { if (StringUtils.isNotBlank(attribute.getId())){ attributeMapper.updateById(attribute); }else { attribute.setRuleId(partnerRule.getId()); attributeMapper.insert(attribute); } } } num ++; } }catch (Exception e){ e.printStackTrace(); throw new RuntimeException("保存失败"); } return num; } @Override public List queryAll() { List partnerRuleEntities = attributeMapper.queryAll(); return partnerRuleEntities; } @Override public List> queryGradeName() { return attributeMapper.queryGradeName(); } private PartnerRuleEntity validateGradeAndFetchRuleEntity(String grade) { if (StringUtils.isBlank(grade)) { throw new SystemException("等级不能为空"); } PartnerRuleEntity partnerRuleEntity = attributeMapper.selectByGrade(grade); if (StringUtils.equals("2", partnerRuleEntity.getUpgrade())) { throw new SystemException("当前等级不支持升级"); } return partnerRuleEntity; } @Override public boolean verifyUpgradeConditions(String userId, String grade) { if (StringUtils.equals("1", grade) || StringUtils.equals("0", grade)) { return false; } VerifyData data = extractCommonLogic(userId, grade); return verifyConditionsInternal(data, data.partnerRuleEntity.getRequirement(), data.partnerRuleEntity.getAppraise()); } @Override public boolean verifyDowngradeUpgradeConditions(String userId, String grade) { VerifyData data = downgradeUpgradeConditions(userId, grade); return verifyConditionsInternal(data, data.partnerRuleEntity.getStrategyArray(), data.partnerRuleEntity.getRelSatisfy()); } /** * 内部通用的条件验证方法 * @param data 验证数据 * @param attributes 属性列表(要求或策略数组) * @param appraise 评估标志 * @return 是否满足条件 */ private boolean verifyConditionsInternal(VerifyData data, List attributes, String appraise) { if (attributes == null || attributes.size() < 3) { return false; } boolean c1 = attributes.get(0).isChecked(); boolean c2 = attributes.get(1).isChecked(); boolean c3 = attributes.get(2).isChecked(); BigDecimal p = data.p; BigDecimal bf = data.bf; BigDecimal ownBf = data.ownBf; BigDecimal min1 = new BigDecimal(attributes.get(0).getMin()); BigDecimal min2 = new BigDecimal(attributes.get(1).getMin()); BigDecimal min3 = new BigDecimal(attributes.get(2).getMin()); boolean isAndLogic = StringUtils.equals("1", appraise); if (c1 && c2 && c3) { return isAndLogic ? p.compareTo(min1) >= 0 && bf.compareTo(min2) >= 0 && ownBf.compareTo(min3) >= 0 : p.compareTo(min1) >= 0 || bf.compareTo(min2) >= 0 || ownBf.compareTo(min3) >= 0; } if (c1 && c2) { return isAndLogic ? p.compareTo(min1) >= 0 && bf.compareTo(min2) >= 0 : p.compareTo(min1) >= 0 || bf.compareTo(min2) >= 0; } if (c1 && c3) { return isAndLogic ? p.compareTo(min1) >= 0 && ownBf.compareTo(min3) >= 0 : p.compareTo(min1) >= 0 || ownBf.compareTo(min3) >= 0; } if (c2 && c3) { return isAndLogic ? bf.compareTo(min2) >= 0 && ownBf.compareTo(min3) >= 0 : bf.compareTo(min2) >= 0 || ownBf.compareTo(min3) >= 0; } if (c1) return p.compareTo(min1) >= 0; if (c2) return bf.compareTo(min2) >= 0; if (c3) return ownBf.compareTo(min3) >= 0; return false; } @Override public String verifyUpgradeConditionsMessage(String userId, String grade) { VerifyData data = extractCommonLogic(userId, grade); PartnerRuleEntity partnerRuleEntity = data.partnerRuleEntity; BigDecimal p = data.p; BigDecimal bf = data.bf; List requirement = partnerRuleEntity.getRequirement(); BigDecimal min = new BigDecimal(requirement.get(0).getMin()); BigDecimal min1 = new BigDecimal(requirement.get(1).getMin()); BigDecimal min2 = new BigDecimal(requirement.get(2).getMin()); StringBuilder message = new StringBuilder(); if (StringUtils.equals("1", partnerRuleEntity.getAppraise())) { if (p.compareTo(min) >= 0 && bf.compareTo(min1) >= 0) { message.append("邀请").append(min).append("个合伙人, 累计保费达").append(min1).append("元"); } } else { if (p.compareTo(min) >= 0) { message.append("邀请").append(min).append("个合伙人"); } if (bf != null && bf.compareTo(min1) >= 0) { if (message.length() > 0) { message.append(", "); } message.append("累计保费达").append(min1).append("元"); } } return message.toString(); } private VerifyData extractCommonLogic(String userId, String grade) { PartnerRuleEntity partnerRuleEntity = validateGradeAndFetchRuleEntity(grade); if (partnerRuleEntity == null) { throw new SystemException("合作伙伴规则实体不能为空"); } PartnerAttribute cycle1 = partnerRuleEntity.getCycle(); List requirement = partnerRuleEntity.getRequirement(); if (CollectionUtil.isEmpty(requirement)) { throw new SystemException("考核条件不能为空"); } if (StringUtils.equals("5", grade)){ grade = "4"; } CommissionValidityPeriod period = getCommissionValidityPeriod(cycle1, userId, grade); if (period == null) { throw new SystemException("有效周期不能为空"); } BigDecimal p = getInviteData(userId, grade, period); BigDecimal bf = partnerUserMapper.subordinateMembersInsurancePremiums(userId, grade, period); // 查询当前用户出单的保费 BigDecimal ownBf = partnerUserMapper.selectOwnSumPremium(userId, period); if (bf == null){ bf = BigDecimal.ZERO; } if (ownBf == null){ ownBf = BigDecimal.ZERO; } return new VerifyData(partnerRuleEntity, p, bf,ownBf); } private VerifyData downgradeUpgradeConditions(String userId, String grade) { PartnerRuleEntity partnerRuleEntity = validateGradeAndFetchRuleEntity(grade); if (partnerRuleEntity == null) { throw new SystemException("合作伙伴规则实体不能为空"); } partnerRuleEntity.getStrategyArray(); CommissionValidityPeriod period = partnerUserMapper.selectUpgradeCycleStartTime(userId, Integer.valueOf(grade)); period.setEndDate(SpringUtil.getBean(ExpiredCommissionUtils.class).generateDowngradeTime(grade,period.getStartDate())); BigDecimal p = getInviteData(userId, grade, period); BigDecimal bf = partnerUserMapper.subordinateMembersInsurancePremiums(userId, grade, period); // 查询当前用户出单的保费 BigDecimal ownBf = partnerUserMapper.selectOwnSumPremium(userId, period); if (bf == null){ bf = BigDecimal.ZERO; } if (ownBf == null){ ownBf = BigDecimal.ZERO; } return new VerifyData(partnerRuleEntity, p, bf,ownBf); } private static class VerifyData { private final PartnerRuleEntity partnerRuleEntity; private final BigDecimal p; private final BigDecimal bf; private final BigDecimal ownBf; public VerifyData(PartnerRuleEntity partnerRuleEntity, BigDecimal p, BigDecimal bf,BigDecimal ownBf) { this.partnerRuleEntity = partnerRuleEntity; this.p = p; this.bf = bf; this.ownBf = ownBf; } } @Override public BigDecimal getInviteData(String userId, String grade,CommissionValidityPeriod period){ int number = 0; if (StringUtils.equals("2", grade)){ number = partnerUserMapper.assessment(userId,"3",period); }else if (StringUtils.equals("3", grade)){ number = partnerUserMapper.assessment(userId,"4",period); }else if (StringUtils.equals("4", grade)){ number = partnerUserMapper.assessment(userId,"5",period); } return new BigDecimal(number); } @Override public CommissionValidityPeriod getCommissionValidityPeriod(PartnerAttribute cycle1, String userId, String grade) { CommissionValidityPeriod period = new CommissionValidityPeriod(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (StringUtils.equals("1", cycle1.getCycle())) { return period; } else if (StringUtils.equals("2", cycle1.getCycle())) { Date upgradeTime = partnerUserMapper.selectUpgradeTime(userId, grade); if (upgradeTime == null) { partnerUserMapper.updateUpgradeTime(userId,grade); upgradeTime = partnerUserMapper.selectUpgradeTime(userId, grade); if (Objects.isNull(upgradeTime)){ return period; } } String fixedDays = cycle1.getFixedDays(); if (!isWithinDays(upgradeTime,Integer.valueOf(fixedDays) )) { updateUpgradeTimeByDate(upgradeTime,Integer.valueOf(fixedDays),userId,grade ); upgradeTime = partnerUserMapper.selectUpgradeTime(userId, grade); } period.setStartDate(dateFormat.format(upgradeTime)); period.setEndDate(dateFormat.format(addDays(upgradeTime,Integer.valueOf(fixedDays)))); } else if (StringUtils.equals("3", cycle1.getCycle())) { // Date fixedCycle = partnerUserMapper.selectFixedCycleTime(userId, grade); // if (fixedCycle == null) { // partnerUserMapper.updateFixedCycleTime(userId); // fixedCycle = partnerUserMapper.selectFixedCycleTime(userId, grade); // if (fixedCycle == null){ // return period; // } // } // period.setStartDate(rules.getStartDate()); // period.setEndDate(rules.getEndDate()); } return period; } public Date addDays(Date date, int days) { LocalDateTime localDate = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalDateTime newLocalDate = localDate.plusDays(days); LocalDateTime endOfDay = newLocalDate.withHour(23) .withMinute(59) .withSecond(59) .withNano(999_999_999); return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()); } private void updateUpgradeTimeByDate(Date assessmentTime, int days, String userId,String grade) { Date newDate = addDaysToday(assessmentTime, days); while (!isWithinDays(newDate, days)) { newDate = addDaysToday(newDate, days); } partnerUserMapper.updateUpgradeTimeByDate(userId, newDate,Integer.valueOf(grade)); } public Date addDaysToday(Date date, int days) { LocalDateTime localDate = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalDateTime newLocalDate = localDate.plusDays(days); // 设置时分秒为0 LocalDateTime newDateTime = newLocalDate.withHour(0) .withMinute(0) .withSecond(0) .withNano(0); return Date.from(newDateTime.atZone(ZoneId.systemDefault()).toInstant()); } public boolean isWithinDays(Date date, int days) { LocalDate targetDate = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); return Math.abs(ChronoUnit.DAYS.between(LocalDate.now(), targetDate)) <= days; } @Override public PartnerRuleEntity selectByGrade(String grade) { return attributeMapper.selectByGrade(grade); } @Override public List selectAll() { return baseMapper.selectList(new LambdaQueryWrapper<>(PartnerRule.class).notIn(PartnerRule::getGrade,5).orderByAsc(PartnerRule::getGrade)); } public boolean compare(String str1 ,String str2){ try { int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); if (num1 > num2) { return true; } else if (num1 < num2) { return false; } else { return true; } } catch (NumberFormatException e) { System.err.println("字符串包含非数字字符!"); return false; } } }