diff --git a/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java b/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java new file mode 100644 index 000000000..d3d91e5f8 --- /dev/null +++ b/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java @@ -0,0 +1,47 @@ +package com.engine.salary.entity.employeedeclare.bo; + +import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareExcelDTO; +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; +import com.engine.salary.enums.employeedeclare.CardTypeEnum; +import com.engine.salary.enums.employeedeclare.EmploymentTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryI18nUtil; +import org.apache.commons.lang3.StringUtils; + +/** + * @author Harryxzy + * @ClassName EmployeeDeclareBO + * @date 2023/12/27 14:13 + * @description + */ +public class EmployeeDeclareBO { + + public static EmployeeDeclarePO convert2PO(EmployeeDeclareExcelDTO dto) { + if (dto == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "参数错误")); + } + EmployeeDeclarePO po = EmployeeDeclarePO.builder() + .jobNum(dto.getJobNum()) + .employeeName(dto.getEmployeeName()) + .cardType(dto.getCardType() == null ? null :CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue()) + .cardNum(dto.getCardNum()) + .employmentStatus(StringUtils.isBlank(dto.getEmploymentStatus()) ? null : new Integer(dto.getEmploymentStatus())) + .employmentType(EmploymentTypeEnum.getValueByDefaultLabel(dto.getEmploymentType())) + .employmentFirstYear(dto.getEmploymentFirstYear()) + .mobile(dto.getMobile()) + .employmentDate(StringUtils.isBlank(dto.getEmploymentDate()) ? null : SalaryDateUtil.stringToDate(dto.getEmploymentDate()) ) + .dismissDate(StringUtils.isBlank(dto.getDismissDate()) ? null : SalaryDateUtil.stringToDate(dto.getDismissDate())) + .disability(dto.getDisability()) + .disabilityCardNo(dto.getDisabilityCardNo()) + .martyrDependents(dto.getMartyrDependents()) + .martyrDependentsCardNo(dto.getMartyrDependentsCardNo()) + .lonelyOld(dto.getLonelyOld()) + .deductExpenses(dto.getDeductExpenses()) + .gender(StringUtils.isBlank(dto.getGender()) ? null : new Integer(dto.getGender())) + .birthday(StringUtils.isBlank(dto.getBirthday()) ? null : SalaryDateUtil.stringToDate(dto.getBirthday())) + .build(); + return po; + } + +} diff --git a/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java b/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java index 5e1c658d7..8880ce557 100644 --- a/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java +++ b/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java @@ -104,12 +104,33 @@ public class EmployeeDeclareExcelDTO { @TableTitle(title = "任职受雇从业日期", dataIndex = "employmentDate", key = "employmentDate") private String employmentDate; + // 入职年度就业情形 + private String employmentFirstYear; + // 离职日期 @SalaryTableColumn(text = "离职日期", width = "10%", column = "dismissDate") @TableTitle(title = "离职日期", dataIndex = "dismissDate", key = "dismissDate") private String dismissDate; + // 是否残疾 + private Integer disability; + + // 残疾证号 + private String disabilityCardNo; + + // 是否孤老 + private Integer lonelyOld; + + // 是否是烈属 + private Integer martyrDependents; + + // 烈属证号 + private String martyrDependentsCardNo; + + // 是否扣除减除费用 + private Integer deductExpenses; + // 申报状态 private DeclareStatusEnum declareStatus; diff --git a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java index 72a7bd9f3..114013a90 100644 --- a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java +++ b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java @@ -15,4 +15,14 @@ public class EmployeeDeclareImportParam extends EmployeeDeclareListQueryParam { @ApiModelProperty("是否导出现有数据") private String exportData; + + //上传文件id + String imageId; + + // 校验字段 + private String checkType; + + // 个税扣义务人id + private Long taxAgentId; + } diff --git a/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java b/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java index 75a8901b6..88e40e0de 100644 --- a/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java +++ b/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java @@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare; import com.engine.salary.enums.BaseEnum; +import java.util.Arrays; + /** * 人员状态 *

Copyright: Copyright (c) 2023

@@ -41,4 +43,17 @@ public enum EmploymentStatusEnum implements BaseEnum { public Integer getLabelId() { return labelId; } + + public static Integer getValueByDefaultLabel(String defaultLabel) { + if (defaultLabel == null) { + return null; + } + EmploymentStatusEnum[] enumAry = EmploymentStatusEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getDefaultLabel().equals(defaultLabel)) { + return enumAry[i].getValue(); + } + } + return null; + } } diff --git a/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java b/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java index 609e7f8f8..08941637d 100644 --- a/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java +++ b/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java @@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare; import com.engine.salary.enums.BaseEnum; +import java.util.Arrays; + /** * 任职受雇从业类型 *

Copyright: Copyright (c) 2023

@@ -44,4 +46,17 @@ public enum EmploymentTypeEnum implements BaseEnum { public Integer getLabelId() { return labelId; } + + public static Integer getValueByDefaultLabel(String defaultLabel) { + if (defaultLabel == null) { + return null; + } + EmploymentTypeEnum[] enumAry = EmploymentTypeEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getDefaultLabel().equals(defaultLabel)) { + return enumAry[i].getValue(); + } + } + return null; + } } diff --git a/src/com/engine/salary/enums/employeedeclare/GenderEnum.java b/src/com/engine/salary/enums/employeedeclare/GenderEnum.java index 805afa7bd..a4849d129 100644 --- a/src/com/engine/salary/enums/employeedeclare/GenderEnum.java +++ b/src/com/engine/salary/enums/employeedeclare/GenderEnum.java @@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare; import com.engine.salary.enums.BaseEnum; +import java.util.Arrays; + /** * 性别 *

Copyright: Copyright (c) 2023

@@ -41,4 +43,17 @@ public enum GenderEnum implements BaseEnum { public Integer getLabelId() { return labelId; } + + public static Integer getValueByDefaultLabel(String defaultLabel) { + if (defaultLabel == null) { + return null; + } + GenderEnum[] enumAry = GenderEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getDefaultLabel().equals(defaultLabel)) { + return enumAry[i].getValue(); + } + } + return null; + } } diff --git a/src/com/engine/salary/service/EmployeeDeclareExcelService.java b/src/com/engine/salary/service/EmployeeDeclareExcelService.java index f48aa1199..cce2e72e9 100644 --- a/src/com/engine/salary/service/EmployeeDeclareExcelService.java +++ b/src/com/engine/salary/service/EmployeeDeclareExcelService.java @@ -4,6 +4,8 @@ import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareImportParam import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.util.Map; + /** * @description: 人员报送(人员)导入导出 * @author: xiajun @@ -21,6 +23,21 @@ public interface EmployeeDeclareExcelService { */ XSSFWorkbook exportTemplate(EmployeeDeclareImportParam importParam); + + /** + * 导入预览 + * @param param + * @return + */ + Map preview(EmployeeDeclareImportParam param); + + /** + * 导入人员报送数据 + * @param param + * @return + */ + Map importData(EmployeeDeclareImportParam param); + /** * 导出人员信息采集-全部 * diff --git a/src/com/engine/salary/service/EmployeeDeclareService.java b/src/com/engine/salary/service/EmployeeDeclareService.java index 0869a5869..ed184159a 100644 --- a/src/com/engine/salary/service/EmployeeDeclareService.java +++ b/src/com/engine/salary/service/EmployeeDeclareService.java @@ -182,4 +182,6 @@ public interface EmployeeDeclareService{ * @return */ String syncEmploymentDate(EmployeeDeclareSyncStartDateParam param); + + void batchInsert(List insertList); } diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java index 783e15511..4352be9cf 100644 --- a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java @@ -2,36 +2,62 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.employeedeclare.bo.EmployeeDeclareBO; +import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareExcelDTO; import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareListDTO; import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareImportParam; import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam; import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.SalaryOnOffEnum; +import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum; import com.engine.salary.enums.employeedeclare.CardTypeEnum; +import com.engine.salary.enums.employeedeclare.DeclareStatusEnum; import com.engine.salary.enums.employeedeclare.EmploymentStatusEnum; import com.engine.salary.enums.employeedeclare.EmploymentTypeEnum; +import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.employeedeclare.EmployeeDeclareMapper; import com.engine.salary.service.EmployeeDeclareExcelService; import com.engine.salary.service.EmployeeDeclareService; import com.engine.salary.service.SalaryEmployeeService; import com.engine.salary.service.TaxAgentService; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryEnumUtil; import com.engine.salary.util.SalaryI18nUtil; -import com.engine.salary.util.excel.ExcelSheetData; -import com.engine.salary.util.excel.ExcelUtil; +import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.excel.*; +import com.engine.salary.util.valid.SalaryCardUtil; import com.google.common.base.Joiner; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import weaver.file.ExcelSheet; +import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.beans.PropertyDescriptor; +import java.io.InputStream; +import java.time.LocalDate; +import java.util.*; import java.util.stream.Collectors; +import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; + /** * 人员报送(人员)导入导出 *

Copyright: Copyright (c) 2023

@@ -56,6 +82,10 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } + private EmployeeDeclareMapper getEmployeeDeclareMapper() { + return MapperProxyFactory.getProxy(EmployeeDeclareMapper.class); + } + @Override public XSSFWorkbook exportTemplate(EmployeeDeclareImportParam importParam) { // 查询人员 @@ -78,8 +108,8 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee row.add(employmentTypeEnum == null ? "" : employmentTypeEnum.getDefaultLabel()); row.add(employeeDeclare.getEmploymentFirstYear()); row.add(employeeDeclare.getMobile()); - row.add(Util.null2String(employeeDeclare.getEmploymentDate())); - row.add(Util.null2String(employeeDeclare.getDismissDate())); + row.add(SalaryDateUtil.getFormatDate(employeeDeclare.getEmploymentDate())); + row.add(SalaryDateUtil.getFormatDate(employeeDeclare.getDismissDate())); row.add(Objects.equals(employeeDeclare.getDisability(), 1) ? yesI18 : noI18); row.add(employeeDeclare.getDisabilityCardNo()); row.add(Objects.equals(employeeDeclare.getMartyrDependents(), 1) ? yesI18 : noI18); @@ -96,6 +126,432 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee return ExcelUtil.genWorkbook(excelSheetData); } + @Override + public Map preview(EmployeeDeclareImportParam param) { + //1、参数校验 + String imageId = param.getImageId(); + if (StringUtils.isBlank(imageId)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "文件id为空")); + } + Map map = new HashMap<>(); + + InputStream fileInputStream = null; + try { + + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId())); + + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + List headers = ExcelSupport.getSheetHeader(sheet, 0); + + map.put("headers", headers); + map.put("list", ExcelParseHelper.parse2List(sheet, 1)); + + return map; + + } finally { + IOUtils.closeQuietly(fileInputStream); + } + } + + @Override + public Map importData(EmployeeDeclareImportParam param) { + Map apidatas = new HashMap<>(); + InputStream fileInputStream = null; + try { + Date now = new Date(); + // 个税扣缴义务人id + Long taxAgentId = param.getTaxAgentId(); + TaxAgentPO taxAgent = getTaxAgentService(user).getById(taxAgentId); + if (taxAgent == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "参数错误,无法找到个税扣缴义务人")); + } + // 税款所属期 + String taxCycle = SalaryDateUtil.getFormatDate(param.getTaxCycle()); + Date taxCycleDate = param.getTaxCycle(); + + // 导出模板中的表头 + List headerList = getImportHeader().stream().map(header -> header.toString()).collect(Collectors.toList()); + // 查询所有的人员 + List simpleEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ORG); + // 查询所有的外部人员 + List extEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.EXT); + // 查询人员报送表的人员 + List employeeDeclares = getEmployeeDeclareService(user).listByTaxCycleAndTaxAgentId(SalaryDateUtil.dateStrToLocalDate(taxCycle), taxAgentId); + // 校验字段 + String checkType = param.getCheckType(); + Map extEmployeeMap = Maps.newHashMap(); + Map simpleEmployeeMap = Maps.newHashMap(); + Map employeeDeclareMap = Maps.newHashMapWithExpectedSize(employeeDeclares.size()); + if (Objects.equals(checkType, "jobNum")) { + extEmployeeMap = Collections.emptyMap(); + simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getWorkcode); + employeeDeclareMap = SalaryEntityUtil.convert2Map(employeeDeclares, EmployeeDeclarePO::getJobNum); + } else { + // 查询所有人员的个人信息 + simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getIdNo); + extEmployeeMap = SalaryEntityUtil.convert2Map(extEmployees, DataCollectionEmployee::getIdNo); + employeeDeclareMap = SalaryEntityUtil.convert2Map(employeeDeclares, EmployeeDeclarePO::getCardNum); + } + // 需要新增的报送人员 + List needAddEmployeeDeclares = Lists.newArrayList(); + // 需要更新的报送人员 + List needUpdateEmployeeDeclares = Lists.newArrayList(); + // 索引(用于计算进度) + int index = 0; + // 失败的数量 + int failCount = 0; + // 成功的数量 + int successCount = 0; + // 错误行的索引 + int failRowIndex = 1; + // 包含错误提示信息的sheet页 + List errorExcelSheets = Lists.newArrayList(); + + String imageId = Util.null2String(param.getImageId()); + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId)); + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + // 表头 + List headers = ExcelSupport.getSheetHeader(sheet, 0); + + // 检查表头 + String isCorrectHeader = checkHeader(headers, headerList); + if (isCorrectHeader != null) { + throw new SalaryRunTimeException(isCorrectHeader); + } + // 数据 + List> data = ExcelParseHelper.parse2Map(sheet, 1); + if (CollectionUtils.isEmpty(data)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "导入数据不能为空")); + } + // 错误提示信息 + List excelComments = Lists.newArrayList(); + List errorData = new ArrayList<>(); + for (int i = 0; i < data.size(); i++) { + //行号 + String rowIndex = String.format("第%s行", i + 2); + + Map map = data.get(i); + // 数据是否存在错误 + boolean isError = false; + EmployeeDeclareExcelDTO employeeDeclareExcel = new EmployeeDeclareExcelDTO(); + for (String dataKey : headerList) { + String dataValue = Util.null2String(map.get(dataKey)); + if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel( 0, "工号"))) { + if (StringUtils.equals(checkType, "jobNum") && StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "工号不能为空")); + errorData.add(errorMessageMap); + } + employeeDeclareExcel.setJobNum(dataValue); + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "姓名"))) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "姓名不能为空")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setEmployeeName(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "证件类型"))) { + employeeDeclareExcel.setCardType(CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue().toString()); + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "证件号码"))) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "证件号码不能为空")); + errorData.add(errorMessageMap); + } else if (!SalaryCardUtil.checkIdNum(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "证件号码格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setCardNum(dataValue); + employeeDeclareExcel.setGender(SalaryCardUtil.judgeGender(dataValue).getValue().toString()); + employeeDeclareExcel.setBirthday(SalaryCardUtil.judgeBirthday(dataValue).toString()); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "人员状态"))) { + boolean legalDataValue = false; + for (EmploymentStatusEnum employmentStatusEnum : EmploymentStatusEnum.values()) { + if (StringUtils.equals(dataValue, employmentStatusEnum.getDefaultLabel())) { + legalDataValue = true; + employeeDeclareExcel.setEmploymentStatus(employmentStatusEnum.getValue().toString()); + break; + } + } + if (!legalDataValue) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态只能填写正常或非正常")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型"))) { + boolean legalDataValue = false; + for (EmploymentTypeEnum employmentTypeEnum : EmploymentTypeEnum.values()) { + if (StringUtils.equals(dataValue, employmentTypeEnum.getDefaultLabel())) { + legalDataValue = true; + employeeDeclareExcel.setEmploymentType(employmentTypeEnum.getValue().toString()); + break; + } + } + if (!legalDataValue) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型填写错误")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "入职年度就业情形"))) { + employeeDeclareExcel.setEmploymentFirstYear(dataValue); + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "手机号码"))) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "手机号码不能为空")); + errorData.add(errorMessageMap); + } else if (!SalaryCardUtil.checkMobile(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "手机号码格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setMobile(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "任职受雇从业日期"))) { + if (StringUtils.isEmpty(dataValue)) { + if (!Objects.equals(employeeDeclareExcel.getEmploymentType(), EmploymentTypeEnum.OTHER.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型不为「其他」时,任职受雇从业日期为必填")); + errorData.add(errorMessageMap); + } + } else { + if (!SalaryDateUtil.checkDay(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "日期格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setEmploymentDate(LocalDate.parse(dataValue).toString()); + } + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "离职日期"))) { + if (StringUtils.isEmpty(dataValue)) { + if (Objects.equals(employeeDeclareExcel.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态为非正常时,离职日期必填")); + errorData.add(errorMessageMap); + } + } else { + if (!SalaryDateUtil.checkDay(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "日期格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setDismissDate(LocalDate.parse(dataValue).toString()); + } + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否残疾"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setDisability(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setDisability(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否残疾只能填写是与否")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "残疾证号"))) { + if (StringUtils.isEmpty(dataValue)) { + if (Objects.equals(employeeDeclareExcel.getDisability(), SalaryOnOffEnum.ON.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "「是否残疾」填「是」时,残疾证号必填")); + errorData.add(errorMessageMap); + } + } else { + employeeDeclareExcel.setDisabilityCardNo(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否烈属"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setMartyrDependents(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setMartyrDependents(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否烈属只能填写是与否")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "烈属证号"))) { + if (StringUtils.isEmpty(dataValue)) { + if (Objects.equals(employeeDeclareExcel.getMartyrDependents(), SalaryOnOffEnum.ON.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "「是否烈属」填「是」时,烈属证号必填")); + errorData.add(errorMessageMap); + } + } else { + employeeDeclareExcel.setMartyrDependentsCardNo(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否孤老"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setLonelyOld(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setLonelyOld(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否孤老只能填写是与否")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否扣除减除费用"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setDeductExpenses(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setDeductExpenses(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否扣除减除费用只能填写是与否")); + errorData.add(errorMessageMap); + } + } + } + if (!isError) { + if (StringUtils.equals(checkType, "jobNum")) { + EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getJobNum()); + if (employeeDeclare == null) { + DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getJobNum()); + DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getJobNum()); + if (extEmployee == null && simpleEmployee == null) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "系统内的人员不存在该工号")); + errorData.add(errorMessageMap); + } else { + needAddEmployeeDeclares.add(buildEmployeeDeclare(extEmployee, simpleEmployee, + employeeDeclareExcel, taxAgentId, taxCycleDate, now)); + } + } else { + EmployeeDeclarePO newEmployeeDeclare = new EmployeeDeclarePO(); + BeanUtils.copyProperties(employeeDeclare, newEmployeeDeclare); + BeanUtils.copyProperties(employeeDeclareExcel, newEmployeeDeclare); + newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1); + newEmployeeDeclare.setUpdateTime(now); + needUpdateEmployeeDeclares.add(newEmployeeDeclare); + if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) { + newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); + newEmployeeDeclare.setDeclareErrorMsg(""); + } + } + } else { + EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getCardNum()); + if (employeeDeclare == null) { + DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getCardNum()); + DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getCardNum()); + if (extEmployee == null && simpleEmployee == null) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "系统内的人员不存在该证件号码")); + errorData.add(errorMessageMap); + } else { + needAddEmployeeDeclares.add(buildEmployeeDeclare(extEmployee, simpleEmployee, + employeeDeclareExcel, taxAgentId, taxCycleDate, now)); + } + } else { + EmployeeDeclarePO newEmployeeDeclare = new EmployeeDeclarePO(); + BeanUtils.copyProperties(employeeDeclare, newEmployeeDeclare); + EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel); + BeanUtils.copyProperties(employeeDeclarePO, newEmployeeDeclare, getNullPropertyNames(employeeDeclarePO)); + newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1); + newEmployeeDeclare.setUpdateTime(now); + if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) { + newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); + newEmployeeDeclare.setDeclareErrorMsg(""); + } + needUpdateEmployeeDeclares.add(newEmployeeDeclare); + } + } + } + if (isError) { + failCount++; + failRowIndex++; + errorData.add(map); + continue; + } + successCount++; + } + + if (CollectionUtils.isNotEmpty(needAddEmployeeDeclares)) { + getEmployeeDeclareService(user).batchInsert(needAddEmployeeDeclares); + } + if (CollectionUtils.isNotEmpty(needUpdateEmployeeDeclares)) { + needUpdateEmployeeDeclares.stream().forEach(getEmployeeDeclareMapper()::update); + } + + apidatas.put("successCount", successCount); + apidatas.put("errorCount", failCount); + apidatas.put("errorNotice", errorData); + // 发送导入回调信息 +// salaryBatchService.sendImportCallBackInfo(message, successCount, errorCount, errorExcelSheets); + + } catch (Exception e) { + log.error("人员报送信息导入失败:{}", e.getMessage(), e); + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + + + public static String[] getNullPropertyNames (Object source) { + final BeanWrapper src = new BeanWrapperImpl(source); + PropertyDescriptor[] pds = src.getPropertyDescriptors(); + + Set emptyNames = new HashSet<>(); + for(PropertyDescriptor pd : pds) { + Object srcValue = src.getPropertyValue(pd.getName()); + // 此处判断可根据需求修改 + if (srcValue == null) { + emptyNames.add(pd.getName()); + } + } + String[] result = new String[emptyNames.size()]; + return emptyNames.toArray(result); + } + + + + private EmployeeDeclarePO buildEmployeeDeclare(DataCollectionEmployee extEmployee, DataCollectionEmployee simpleEmployee, + EmployeeDeclareExcelDTO employeeDeclareExcel, Long taxAgentId, + Date taxCycle, Date now) { + EmployeeDeclarePO employeeDeclare = EmployeeDeclarePO.builder() + .id(IdGenerator.generate()) + .taxAgentId(taxAgentId) + .taxCycle(taxCycle) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .creator(Long.valueOf(user.getUID())) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .createTime(now) + .updateTime(now).build(); + EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel); + + BeanUtils.copyProperties(employeeDeclarePO, employeeDeclare, getNullPropertyNames(employeeDeclarePO)); + if (extEmployee != null) { + employeeDeclare.setEmployeeId(extEmployee.getEmployeeId()); + employeeDeclare.setEmployeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue()); + } + if (simpleEmployee != null) { + employeeDeclare.setEmployeeId(simpleEmployee.getEmployeeId()); + employeeDeclare.setEmployeeType(EmployeeTypeEnum.ORGANIZATION.getValue()); + } + return employeeDeclare; + } + @Override public XSSFWorkbook export(EmployeeDeclareListQueryParam queryParam) { // 查询需要报送的人员 diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java index 5559e5214..1a18c8b3a 100644 --- a/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java +++ b/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java @@ -727,4 +727,13 @@ public class EmployeeDeclareServiceImpl extends Service implements EmployeeDecla return "执行完毕"; } + + @Override + public void batchInsert(List insertList) { + if (CollectionUtils.isEmpty(insertList)) { + return; + } + List> partition = Lists.partition(insertList, 100); + partition.forEach(getEmployeeDeclareMapper()::batchInsert); + } } diff --git a/src/com/engine/salary/web/EmployeeDeclareController.java b/src/com/engine/salary/web/EmployeeDeclareController.java index c2c2703e6..6c2979f97 100644 --- a/src/com/engine/salary/web/EmployeeDeclareController.java +++ b/src/com/engine/salary/web/EmployeeDeclareController.java @@ -304,6 +304,35 @@ public class EmployeeDeclareController { } } + /** + * 人员报送-导入预览 + * + * @param queryParam 导出参数 + * @return + */ + @POST + @Path("/preview") + @Produces(MediaType.APPLICATION_JSON) + public String preview(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareImportParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::preview, queryParam); + } + + /** + * 人员报送-导入 + * + * @param queryParam 导出参数 + * @return + */ + @POST + @Path("/importData") + @Produces(MediaType.APPLICATION_JSON) + public String importData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareImportParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::importData, queryParam); + } + + /** * 人员报送-导出全部人员 * diff --git a/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java b/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java index 399286e63..39623bb5a 100644 --- a/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java +++ b/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java @@ -567,6 +567,26 @@ public class EmployeeDeclareWrapper extends Service { return getEmployeeDeclareExcelService(user).exportTemplate(param); } + /** + * 人员报送-导入数据 + * + * @param param + * @return + */ + public Map preview(EmployeeDeclareImportParam param) { + return getEmployeeDeclareExcelService(user).preview(param); + } + + /** + * 人员报送-导入数据 + * + * @param param + * @return + */ + public Map importData(EmployeeDeclareImportParam param) { + return getEmployeeDeclareExcelService(user).importData(param); + } + /** * 人员报送-导出本月全部的人员 * diff --git a/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java b/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java index 28bcde42e..62e2ed562 100644 --- a/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java +++ b/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java @@ -36,7 +36,6 @@ import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.springframework.stereotype.Component; import weaver.general.Util; import weaver.hrm.User; @@ -52,7 +51,6 @@ import java.util.stream.Collectors; * @version 1.0 **/ @Slf4j -@Component public class TaxDeclareRecordWrapper extends Service { @@ -674,6 +672,11 @@ public class TaxDeclareRecordWrapper extends Service { public TaxDeclareRecordDetailFormDTO getAddForm(TaxDeclareRecordDetailFormParam param) { TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); + + if (taxDeclaration == null) { + throw new SalaryRunTimeException("申报表不存在!"); + } + // 查询个税申报表列 List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclaration.getIncomeCategory())); //当前税款所属期报送成功且状态正常的人员 @@ -702,6 +705,7 @@ public class TaxDeclareRecordWrapper extends Service { /** * 新增 + * * @param param */ public void add(TaxDeclareRecordDetailSaveParam param) { @@ -710,6 +714,7 @@ public class TaxDeclareRecordWrapper extends Service { /** * 编辑 + * * @param param */ public void edit(TaxDeclareRecordDetailSaveParam param) {