package com.engine.salary.entity.siarchives.bo; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.siarchives.po.InsuranceArchivesBaseInfoPO; import com.engine.salary.entity.taxagent.po.TaxAgentEmpChangePO; import com.engine.salary.enums.siaccount.EmployeeStatusEnum; import com.engine.salary.enums.taxagent.TaxAgentEmpChangeTypeEnum; import com.engine.salary.util.SalaryEntityUtil; import com.google.common.collect.Lists; import dm.jdbc.util.IdGenerator; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.lang3.math.NumberUtils; import java.util.*; import java.util.stream.Collectors; /** * @Author: sy * @Description: 社保福利档案基础信息 * @Date: 2022/10/13 **/ public class InsuranceArchivesBaseInfoBO { @Override public String toString() { return "InsuranceArchivesBaseInfoBO{}"; } /** * 构建增量数据 */ public static InsuranceArchivesBaseInfoBO.ChangeData buildChangeData(List taxAgentEmpChangeList, List insuranceArchivesBaseInfoList, Long currentEmployeeId) { List changeIds = taxAgentEmpChangeList.stream().map(TaxAgentEmpChangePO::getId).collect(Collectors.toList()); // 根据个税扣缴义务人和人员以及增量类型分组 Map changeTypeMap = taxAgentEmpChangeList.stream().collect(Collectors.groupingBy(change -> change.getTaxAgentId() + "-" + change.getEmployeeId() + "-" + change.getChangeType(), Collectors.counting())); // 顺序倒转 Collections.reverse(taxAgentEmpChangeList); // 去重 taxAgentEmpChangeList = taxAgentEmpChangeList.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getTaxAgentId() + "-" + f.getEmployeeId()))), ArrayList::new)); List taxAgentEmpChanges = taxAgentEmpChangeList .stream() // 不相等则保留,否则忽略 .filter(change -> !Objects.equals(changeTypeMap.get(change.getTaxAgentId() + "-" + change.getEmployeeId() + "-" + TaxAgentEmpChangeTypeEnum.ADD.getValue()) , changeTypeMap.get(change.getTaxAgentId() + "-" + change.getEmployeeId() + "-" + TaxAgentEmpChangeTypeEnum.DEL.getValue()))) .collect(Collectors.toList()); Date now = new Date(); Date today = new Date(); List baseInfoAddTodoList = Lists.newArrayList(); List baseInfoUpdateTodoList = Lists.newArrayList(); Map insuranceArchivesBaseInfoListMap = SalaryEntityUtil.convert2Map(insuranceArchivesBaseInfoList, k -> k.getPaymentOrganization() + "-" + k.getEmployeeId()); taxAgentEmpChanges.forEach(change -> { InsuranceArchivesBaseInfoPO insuranceBaseInfo = insuranceArchivesBaseInfoListMap.get(change.getTaxAgentId() + "-" + change.getEmployeeId()); // 如果是新增 说明:如果没有档案,则新增,如果有档案而且是停止缴纳,就转移到待增员中,以个税扣缴义务人和人员id判断唯一 if (change.getChangeType() == TaxAgentEmpChangeTypeEnum.ADD.getValue()) { if (insuranceBaseInfo != null) { // 停止缴纳->待增员 if (insuranceBaseInfo.getRunStatus().equals(EmployeeStatusEnum.STOP_PAYMENT.getValue())) { insuranceBaseInfo.setRunStatus(EmployeeStatusEnum.STAY_ADD.getValue()); insuranceBaseInfo.setUpdateTime(now); baseInfoUpdateTodoList.add(insuranceBaseInfo); } } else { //新增社保、公积金、其他福利档案 // 新增基础信息 baseInfoAddTodoList.add(InsuranceArchivesBaseInfoPO.builder() .id(IdGenerator.generate()) .employeeId(change.getEmployeeId()) .paymentOrganization(change.getTaxAgentId()) .runStatus(EmployeeStatusEnum.STAY_ADD.getValue()) .createTime(now) .updateTime(now) .creator(currentEmployeeId) .deleteType(NumberUtils.INTEGER_ZERO) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build()); } // 如果是删除 说明:如果有档案并且是在缴纳中才处理,没档案不用管 } else if (change.getChangeType() == TaxAgentEmpChangeTypeEnum.DEL.getValue()) { if (insuranceBaseInfo != null) { if (insuranceBaseInfo.getRunStatus().equals(EmployeeStatusEnum.PAYING.getValue())) { // 正在缴纳->待减员 insuranceBaseInfo.setRunStatus(EmployeeStatusEnum.STAY_DEL.getValue()); insuranceBaseInfo.setUpdateTime(now); baseInfoUpdateTodoList.add(insuranceBaseInfo); } else if (insuranceBaseInfo.getRunStatus().equals(EmployeeStatusEnum.STAY_DEL.getValue())) { // 待减员->停止缴纳 insuranceBaseInfo.setRunStatus(EmployeeStatusEnum.STOP_PAYMENT.getValue()); baseInfoUpdateTodoList.add(insuranceBaseInfo); } } } }); return ChangeData.builder() .baseInfoAddTodoList(baseInfoAddTodoList) .baseInfoUpdateTodoList(baseInfoUpdateTodoList) .changeIds(changeIds) .build(); } @Data @Builder @NoArgsConstructor @AllArgsConstructor public static class ChangeData { /** * 需要批量修改的福利档案基础信息 */ private List baseInfoAddTodoList; /** * 需要批量新增的福利档案基础信息 */ private List baseInfoUpdateTodoList; /** * 需要删除的增量数据 */ private List changeIds; } }