package com.engine.salary.entity.employeedeclare.bo; import com.api.formmode.page.util.Util; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareRefreshDTO; import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; import com.engine.salary.entity.extemp.po.ExtEmpPO; import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO; import com.engine.salary.enums.SalaryOnOffEnum; import com.engine.salary.enums.employeedeclare.*; import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.valid.SalaryCardUtil; import com.google.common.collect.Lists; import dm.jdbc.util.IdGenerator; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import java.time.YearMonth; import java.util.*; /** * @description: * @author: xiajun * @modified By: xiajun * @date: 2022/11/6 15:47 * @version:v1.0 */ public class EmployeeDeclareRefresh { public static Result refresh(EmployeeDeclareRefreshDTO dto, Long employeeId) { Result result = new Result(); // 本月已有的需要报送的人员 Set employeeIds = SalaryEntityUtil.properties(dto.getEmployeeDeclares(), EmployeeDeclarePO::getEmployeeId); // 员工的个人信息 Map simpleUserInfoMap = SalaryEntityUtil.convert2Map(dto.getHrmEmployeeComInfos(), DataCollectionEmployee::getEmployeeId); // 薪资档案的数据(任职受雇从业类型、起始发薪日期、最后发薪日期) Map salaryArchiveMap = SalaryEntityUtil.convert2Map(dto.getSalaryArchives(), SalaryArchivePO::getEmployeeId); // 非系统人员的数据(任职受雇从业类型) Map extEmployeeMap = SalaryEntityUtil.convert2Map(dto.getExtEmployees(), ExtEmpPO::getId); Date now = new Date(); // 对已有人员处理「人员状态」、「离职日期」、「任职受雇从业类型」 for (EmployeeDeclarePO employeeDeclare : dto.getEmployeeDeclares()) { SalaryArchivePO salaryArchive = salaryArchiveMap.get(employeeDeclare.getEmployeeId()); if (salaryArchive != null && (Objects.equals(salaryArchive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) || Objects.equals(salaryArchive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()))) { if (Objects.equals(employeeDeclare.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue()) || Objects.equals(Util.null2String(employeeDeclare.getDismissDate()), Util.null2String(salaryArchive.getPayEndDate()))) { employeeDeclare.setEmploymentStatus(EmploymentStatusEnum.ABNORMAL.getValue()); employeeDeclare.setDismissDate(salaryArchive.getPayEndDate()); employeeDeclare.setNewEmployeeInfo(1); employeeDeclare.setUpdateTime(now); result.getEmployeeDeclares().add(employeeDeclare); } } // if (salaryArchive != null && !Objects.equals(employeeDeclare.getEmploymentType(), Util.getIntValue(salaryArchive.getEmploymentType()))) { // employeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); // employeeDeclare.setEmploymentType(Util.getIntValue(salaryArchive.getEmploymentType())); // employeeDeclare.setNewEmployeeInfo(1); // } // ExtEmpPO extEmployee = extEmployeeMap.get(employeeDeclare.getEmployeeId()); // if (extEmployee != null && !Objects.equals(employeeDeclare.getEmploymentType(), extEmployee.getEmploymentType())) { // employeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); // employeeDeclare.setEmploymentType(extEmployee.getEmploymentType()); // employeeDeclare.setNewEmployeeInfo(1); // } } // 自动保存上个月报送成功的人员 for (EmployeeDeclarePO preTaxCycleEmployeeDeclare : dto.getPreTaxCycleEmployeeDeclare()) { if (!employeeIds.contains(preTaxCycleEmployeeDeclare.getEmployeeId())) { EmployeeDeclarePO employeeDeclare = new EmployeeDeclarePO(); BeanUtils.copyProperties(preTaxCycleEmployeeDeclare, employeeDeclare); employeeDeclare.setId(IdGenerator.generate()) .setTaxCycle(dto.getTaxCycle().toString()) .setNewEmployeeInfo(0) .setCreateTime(now) .setUpdateTime(now); // 对人员处理「人员状态」、「离职日期」、「任职受雇从业类型」 SalaryArchivePO salaryArchive = salaryArchiveMap.get(employeeDeclare.getEmployeeId()); if (salaryArchive != null && (Objects.equals(salaryArchive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) || Objects.equals(salaryArchive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()))) { employeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); employeeDeclare.setEmploymentStatus(EmploymentStatusEnum.ABNORMAL.getValue()); employeeDeclare.setDismissDate(salaryArchive.getPayEndDate()); employeeDeclare.setNewEmployeeInfo(1); } // if (salaryArchive != null && !Objects.equals(Util.null2String(employeeDeclare.getEmploymentType()), salaryArchive.getEmploymentType())) { // employeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); // employeeDeclare.setEmploymentType(Util.getIntValue(salaryArchive.getEmploymentType())); // employeeDeclare.setNewEmployeeInfo(1); // } // ExtEmployeePO extEmployee = extEmployeeMap.get(employeeDeclare.getEmployeeId()); // if (extEmployee != null && !Objects.equals(employeeDeclare.getEmploymentType(), extEmployee.getEmploymentType())) { // employeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); // employeeDeclare.setEmploymentType(extEmployee.getEmploymentType()); // employeeDeclare.setNewEmployeeInfo(1); // } employeeIds.add(employeeDeclare.getEmployeeId()); result.getNewEmployeeDeclares().add(employeeDeclare); } } // 薪资档案中新增的需报送的人员 for (DataCollectionEmployee hrmEmployeeComInfo : dto.getHrmEmployeeComInfos()) { if (employeeIds.contains(hrmEmployeeComInfo.getEmployeeId())) { continue; } EmployeeDeclarePO employeeDeclare = initEmployeeDeclare(dto.getTaxAgentId(), dto.getTaxCycle(), now, employeeId); DataCollectionEmployee simpleUserInfo = simpleUserInfoMap.get(hrmEmployeeComInfo.getEmployeeId()); String idNum = simpleUserInfo == null ? "" : simpleUserInfo.getIdNo(); employeeDeclare.setEmployeeId(hrmEmployeeComInfo.getEmployeeId()) .setEmployeeType(EmployeeTypeEnum.ORGANIZATION.getValue()) .setEmployeeName(hrmEmployeeComInfo.getUsername()) .setJobNum(hrmEmployeeComInfo.getWorkcode()) .setCardNum(idNum) .setGender(StringUtils.equalsIgnoreCase(hrmEmployeeComInfo.getSex(), GenderEnum.MALE.name()) ? GenderEnum.MALE.getValue() : GenderEnum.FEMALE.getValue()) .setBirthday(simpleUserInfo == null ? null : SalaryDateUtil.dateStrToLocalDate(simpleUserInfo.getBirthday())) .setMobile(hrmEmployeeComInfo.getMobile()); if (StringUtils.isEmpty(idNum)) { employeeDeclare.setDeclareStatus(DeclareStatusEnum.DECLARE_FAIL.getValue()); employeeDeclare.setDeclareErrorMsg(SalaryI18nUtil.getI18nLabel(187460, "身份证号不能为空")); } else if (!SalaryCardUtil.checkIdNum(idNum)) { employeeDeclare.setDeclareStatus(DeclareStatusEnum.DECLARE_FAIL.getValue()); employeeDeclare.setDeclareErrorMsg(SalaryI18nUtil.getI18nLabel(156510, "身份证号格式错误")); } else { employeeDeclare.setGender(SalaryCardUtil.judgeGender(idNum).getValue()); employeeDeclare.setBirthday(SalaryDateUtil.localDateToDate(SalaryCardUtil.judgeBirthday(idNum))); } // 对人员处理「人员状态」、「离职日期」 SalaryArchivePO salaryArchive = salaryArchiveMap.get(employeeDeclare.getEmployeeId()); if (salaryArchive != null) { // employeeDeclare.setEmploymentType(Util.getIntValue(salaryArchive.getEmploymentType())); employeeDeclare.setEmploymentDate(salaryArchive.getPayStartDate()); if (Objects.equals(salaryArchive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()) || Objects.equals(salaryArchive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue())) { employeeDeclare.setEmploymentStatus(EmploymentStatusEnum.ABNORMAL.getValue()); employeeDeclare.setDismissDate(salaryArchive.getPayEndDate()); } } employeeIds.add(employeeDeclare.getEmployeeId()); result.getNewEmployeeDeclares().add(employeeDeclare); } // 非系统人员中新增的需报送的人员 // for (ExtEmployeePO extEmployee : dto.getExtEmployees()) { // if (employeeIds.contains(extEmployee.getId())) { // continue; // } // EmployeeDeclarePO employeeDeclare = initEmployeeDeclare(dto.getTaxAgentId(), dto.getTaxCycle(), now, employeeId, tenantKey); // employeeDeclare.setEmployeeId(extEmployee.getId()) // .setEmployeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue()) // .setEmployeeName(extEmployee.getUsername()) // .setCardNum(extEmployee.getCardNum()) // .setMobile(extEmployee.getMobile()) // .setEmploymentType(extEmployee.getEmploymentType()) // .setEmploymentDate(YearMonth.parse(extEmployee.getStartMonth()).atDay(1)); // if (StringUtils.isEmpty(extEmployee.getCardNum())) { // employeeDeclare.setDeclareStatus(DeclareStatusEnum.DECLARE_FAIL.getValue()); // employeeDeclare.setDeclareErrorMsg(SalaryI18nUtil.getI18nLabel(187460, "身份证号不能为空")); // } else if (!SalaryCardUtil.checkIdNum(extEmployee.getCardNum())) { // employeeDeclare.setDeclareStatus(DeclareStatusEnum.DECLARE_FAIL.getValue()); // employeeDeclare.setDeclareErrorMsg(SalaryI18nUtil.getI18nLabel(156510, "身份证号格式错误")); // } else { // employeeDeclare.setGender(SalaryCardUtil.judgeGender(extEmployee.getCardNum()).getValue()); // employeeDeclare.setBirthday(SalaryCardUtil.judgeBirthday(extEmployee.getCardNum())); // } // employeeIds.add(employeeDeclare.getEmployeeId()); // result.getNewEmployeeDeclares().add(employeeDeclare); // } return result; } private static EmployeeDeclarePO initEmployeeDeclare(Long taxAgentId, YearMonth taxCycle, Date now, Long employeeId) { return new EmployeeDeclarePO() .setId(IdGenerator.generate()) .setTaxAgentId(taxAgentId) .setTaxCycle(taxCycle.toString()) .setCardType(CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue()) .setGender(GenderEnum.MALE.getValue()) .setEmploymentStatus(EmploymentStatusEnum.NORMAL.getValue()) .setEmploymentType(EmploymentTypeEnum.EMPLOYEE.getValue()) .setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()) .setDeclareErrorMsg("") .setDisability(SalaryOnOffEnum.OFF.getValue()) .setDisabilityCardNo("") .setLonelyOld(SalaryOnOffEnum.OFF.getValue()) .setMartyrDependents(SalaryOnOffEnum.OFF.getValue()) .setMartyrDependentsCardNo("") .setDeductExpenses(SalaryOnOffEnum.ON.getValue()) .setSuccessfullyDeclared(0) .setNewEmployeeInfo(0) .setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()) .setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .setCreator(employeeId) .setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue()) .setCreateTime(now) .setUpdateTime(now); } @Data public static class Result { /** * 已有的需要更新的报送人员 */ private List employeeDeclares; /** * 新增的报送人员 */ private List newEmployeeDeclares; public Result() { this.employeeDeclares = Lists.newArrayList(); this.newEmployeeDeclares = Lists.newArrayList(); } } }