From d1770aadbb67b4c0e74933d5fc3c3cf62f14c768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 19 Jul 2022 18:40:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=AA=E8=B5=84=E6=A1=A3=E6=A1=88=E5=AE=9A?= =?UTF-8?q?=E8=96=AA=E8=B0=83=E8=96=AA=E9=80=82=E9=85=8D=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E6=89=A3=E7=BC=B4=E4=B9=89=E5=8A=A1=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SalaryArchiveServiceImpl.java | 118 ++++++++++++------ 1 file changed, 78 insertions(+), 40 deletions(-) diff --git a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java index c41b79a30..0cd27c32e 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java @@ -53,6 +53,7 @@ import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.file.ImageFileManager; +import weaver.general.Util; import weaver.hrm.User; import java.io.InputStream; @@ -356,13 +357,20 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe List header = Lists.newArrayList(); header.add(SalaryI18nUtil.getI18nLabel(85429, "姓名")); header.add(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人")); - header.add(SalaryI18nUtil.getI18nLabel(85904, "生效日期")); + if (isSalaryItemAdjust) { + header.add(SalaryI18nUtil.getI18nLabel(85904, "生效日期")); + } if (isTaxAgentAdjust || isSalaryItemAdjust) { header.add(SalaryI18nUtil.getI18nLabel(85431, "调整原因")); } header.add(SalaryI18nUtil.getI18nLabel(86185, "部门")); header.add(SalaryI18nUtil.getI18nLabel(86186, "手机号")); header.add(SalaryI18nUtil.getI18nLabel(91075, "状态")); + if (isInit) { + header.add(SalaryI18nUtil.getI18nLabel(91075, "起始发薪日期")); + header.add(SalaryI18nUtil.getI18nLabel(91075, "最后发薪日期")); + } + if (isInit || isSalaryItemAdjust) { for (SalaryItemPO salaryItem : salaryItems) { header.add(salaryItem.getName()); @@ -380,15 +388,21 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe List> listMaps = buildSalaryArchiveData(salaryArchives, taxAgentList, salaryItems, Boolean.FALSE); listMaps.forEach(e -> { List row = new ArrayList<>(); - row.add(e.get("username").toString()); - row.add(e.get("taxAgentName").toString()); + row.add(Util.null2String(e.get("username"))); + row.add(Util.null2String(e.get("taxAgentName"))); if (isTaxAgentAdjust || isSalaryItemAdjust) { row.add(isTaxAgentAdjust ? e.get("taxAgentEffectiveTime") : ""); } - row.add(""); - row.add(e.get("departmentName").toString()); - row.add(e.get("mobile") == null ? "" : e.get("mobile").toString()); - row.add(e.get("employeeStatus").toString()); + if (isSalaryItemAdjust) { + row.add(""); + } + row.add(Util.null2String(e.get("departmentName"))); + row.add(Util.null2String(e.get("mobile"))); + row.add(Util.null2String(e.get("employeeStatus"))); + if (isInit) { + row.add(Util.null2String(e.get("payStartDate"))); + row.add(Util.null2String(e.get("payEndDate"))); + } // 调薪 if (isInit || isSalaryItemAdjust) { // 薪资项目数据 @@ -404,11 +418,10 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe // 4.注释 List excelComments = Lists.newArrayList(); excelComments.add(new ExcelComment(0, 0, 3, 2, SalaryI18nUtil.getI18nLabel(100344, "必填"))); - if (isInit || isTaxAgentAdjust) { - excelComments.add(new ExcelComment(1, 0, 4, 2, SalaryI18nUtil.getI18nLabel(100344, "必填"))); + excelComments.add(new ExcelComment(1, 0, 4, 2, SalaryI18nUtil.getI18nLabel(100344, "必填"))); + if (isSalaryItemAdjust) { + excelComments.add(new ExcelComment(2, 0, 5, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); } - excelComments.add(new ExcelComment(2, 0, 5, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); - //调整个税扣缴义务人 if (isTaxAgentAdjust) { excelComments.add(new ExcelComment(3, 0, 6, 2, SalaryI18nUtil.getI18nLabel(100952, "必填,可填写如:调动,变更,入职,离职,其他,初始化"))); @@ -416,6 +429,9 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe } else if (isSalaryItemAdjust) { excelComments.add(new ExcelComment(3, 0, 6, 2, SalaryI18nUtil.getI18nLabel(100953, "必填,可填写如:入职,转正,调薪,调岗调薪,离职,其他,初始化"))); } + if (isInit) { + excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); + } XSSFWorkbook book = ExcelUtil.genWorkbookV2(rows, sheetName, excelComments); return book; @@ -526,13 +542,6 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe // 用于(调薪和调整个税扣缴义务人)的相同employeeId时取第一条记录,如果是初始化导入则有重复 List allEmployeeIds = Lists.newArrayList(); - int effectiveTimeIndex = 0; - for (int j = 0; j < headers.size(); j++) { - if (headers.get(j).equals(SalaryI18nUtil.getI18nLabel(85904, "生效日期"))) { - effectiveTimeIndex = j; - break; - } - } // 错误sheet数据 List> errorData = new ArrayList<>(); // 错误提示 @@ -543,7 +552,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe Map map = data.get(i); map.put("index", i + 2); // 3.校验行内容 - boolean isError = singleRowCheck(importType, allEmployeeIds, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam); + boolean isError = singleRowCheck(importType, allEmployeeIds, map, headers, excelComments, errorCount, importHandleParam); if (isError) { errorCount += 1; @@ -706,7 +715,6 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", "该员工的薪资档案记录有误,请检查"); excelComments.add(errorMessageMap); -// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(101723, "该员工的薪资档案记录有误,请检查"), finalErrorCount.get() + 1, finalErrorCount.get() + 1, 0, 0); finalErrorCount.addAndGet(1); errorData.add(e.getRow()); finalSuccessCount.addAndGet(-1); @@ -716,7 +724,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe } else { int nums = sames.size(); // 1.生效时间不可重复 - List effectiveTimeList = sames.stream().map(m -> Optional.ofNullable(m.getRow().get("effectiveTime")).orElse("").toString()).distinct().collect(Collectors.toList()); + List effectiveTimeList = sames.stream().map(m -> Optional.ofNullable(m.getRow().get("payStartDate")).orElse("").toString()).distinct().collect(Collectors.toList()); // 2.个税扣缴义务人和薪资项目共同决定是否重复 List rowSameList = sames.stream().map(m -> { Map row = m.getRow(); @@ -724,14 +732,13 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe String salaryItem = Optional.ofNullable(row.get("salaryItemVal")).orElse("").toString(); return taxAgent + salaryItem; }).distinct().collect(Collectors.toList()); - if (effectiveTimeList.size() != nums || rowSameList.size() != nums) { + if (/** effectiveTimeList.size() != nums || */ rowSameList.size() != nums) { sames.forEach(e -> { if (!e.isError()) { e.setError(Boolean.TRUE); Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", "该员工的薪资档案记录有误"); excelComments.add(errorMessageMap); -// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(101723, "该员工的薪资档案记录有误,请检查"), finalErrorCount.get() + 1, finalErrorCount.get() + 1, 0, 0); finalErrorCount.addAndGet(1); errorData.add(e.getRow()); finalSuccessCount.addAndGet(-1); @@ -776,7 +783,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe * @param importHandleParam * @return */ - private boolean singleRowCheck(String importType, List allEmployeeIds, Map map, List headers, int effectiveTimeIndex, + private boolean singleRowCheck(String importType, List allEmployeeIds, Map map, List headers, List> excelComments, int errorCount, SalaryArchiveImportHandleParam importHandleParam) { boolean isError = false; @@ -787,6 +794,8 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe String userNameI18n = SalaryI18nUtil.getI18nLabel(85429, "姓名"); String taxAgentI18n = SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"); String effectiveTimeI18n = SalaryI18nUtil.getI18nLabel(85904, "生效日期"); + String payStartDateI18n = SalaryI18nUtil.getI18nLabel(85904, "起始发薪日期"); + String payEndDateI18n = SalaryI18nUtil.getI18nLabel(85904, "最后发薪日期"); String adjustReasonI18n = SalaryI18nUtil.getI18nLabel(85431, "调整原因"); String rowindex = "第" + map.get("index") + "行"; // 1.姓名 @@ -843,8 +852,21 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe adjustReason = SalaryArchiveItemAdjustReasonEnum.getValueByDefaultLabel(Optional.ofNullable(map.get(adjustReasonI18n)).orElse("").toString()); } + // 5.起始发薪日期 + String payStartDateCellVal = Optional.ofNullable(map.get(payStartDateI18n)).orElse("").toString().replaceAll(" 00:00:00", ""); + // 免得失败后,会追加 00:00:00 + map.put(payStartDateI18n, payStartDateCellVal); + map.put("payStartDate", payStartDateCellVal); + Date payStartDate = SalaryDateUtil.checkDay(payStartDateCellVal) ? dateStrToLocalDate(payStartDateCellVal) : null; + // 6.最后发薪日期 + String payEndDateCellVal = Optional.ofNullable(map.get(payEndDateI18n)).orElse("").toString().replaceAll(" 00:00:00", ""); + // 免得失败后,会追加 00:00:00 + map.put(payEndDateI18n, payEndDateCellVal); + map.put("payEndDate", payEndDateCellVal); + Date payEndDate = SalaryDateUtil.checkDay(payEndDateCellVal) ? dateStrToLocalDate(payEndDateCellVal) : null; + // 构建薪资档案 - SalaryArchivePO finalSalaryArchive = buildSalaryArchive(isInit, employeeId, taxAgentId, importHandleParam); + SalaryArchivePO finalSalaryArchive = buildSalaryArchive(isInit, payStartDate, payEndDate, employeeId, taxAgentId, importHandleParam); for (int j = 0; j < headers.size(); j++) { String key = headers.get(j); @@ -855,7 +877,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe (userNameI18n.equals(key) // 个税扣缴义务人列判空(初始化导入或调整个税扣缴义务人) || (taxAgentI18n.equals(key) && (isInit || isTaxAgentAdjust)) - || effectiveTimeI18n.equals(key) + || (effectiveTimeI18n.equals(key) && isSalaryItemAdjust) // 调整原因列判空(调薪或调整个税扣缴义务人) || (adjustReasonI18n.equals(key) && (isTaxAgentAdjust || isSalaryItemAdjust))); // 判空 @@ -870,17 +892,25 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe errorMessageMap.put("message", rowindex + key + "不能为空"); excelComments.add(errorMessageMap); } - if (effectiveTimeI18n.equals(key) && StringUtils.isEmpty(cellVal)) { - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", rowindex + key + "不能为空"); - excelComments.add(errorMessageMap); - } // 调整原因列判空(调薪或调整个税扣缴义务人) if ((adjustReasonI18n.equals(key) && (isTaxAgentAdjust || isSalaryItemAdjust)) && StringUtils.isEmpty(cellVal)) { Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", rowindex + key + "不能为空"); excelComments.add(errorMessageMap); } + //调薪生效时间不能为空 + if (isSalaryItemAdjust && effectiveTimeI18n.equals(key) && StringUtils.isEmpty(cellVal)){ + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowindex + key + "不能为空"); + excelComments.add(errorMessageMap); + } + //定薪起始时间不能为空 + if (isInit && payStartDateI18n.equals(key) && StringUtils.isEmpty(cellVal)){ + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowindex + key + "不能为空"); + excelComments.add(errorMessageMap); + } + if (isEmpty) { isError = true; } @@ -908,7 +938,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe importHandleParam.setEmployeeId(employeeId); } else if (!isEmpty && taxAgentI18n.equals(key) && (isInit || isTaxAgentAdjust)) { // 2.个税扣缴义务人列处理(初始化导入或调整个税扣缴义务人) - isError = handleTaxAgent(isError, isInit, effectiveTimeIndex, excelComments, errorCount, j, taxAgentId, effectiveTime, finalSalaryArchive, adjustReason, importHandleParam, map); + isError = handleTaxAgent(isError, isInit, excelComments, errorCount, j, taxAgentId, effectiveTime, finalSalaryArchive, adjustReason, importHandleParam, map); } else if (!isEmpty && effectiveTimeI18n.equals(key) && effectiveTime == null) { // 3.生效时间处理 Map errorMessageMap = Maps.newHashMap(); @@ -925,10 +955,14 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe // 5.薪资项目列处理(初始化导入或调薪) } else { // 薪资项目数据 + if(isInit){ + effectiveTime = payStartDate; + } if (effectiveTime == null || finalSalaryArchive == null || !(isInit || isSalaryItemAdjust)) { continue; } - isError = handleSalaryItem(isError, isInit, effectiveTimeIndex, excelComments, errorCount, j, + + isError = handleSalaryItem(isError, isInit, excelComments, effectiveTime, finalSalaryArchive, adjustReason, importHandleParam, key, cellVal, map); } @@ -936,7 +970,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe return isError; } - private SalaryArchivePO buildSalaryArchive(boolean isInit, Long employeeId, Long taxAgentId, SalaryArchiveImportHandleParam importHandleParam) { + private SalaryArchivePO buildSalaryArchive(boolean isInit, Date payStartDate,Date payEndDate,Long employeeId, Long taxAgentId, SalaryArchiveImportHandleParam importHandleParam) { Optional optionalSA = importHandleParam.getSalaryArchives().stream().filter(p -> p.getEmployeeId().equals(employeeId) && p.getTaxAgentId().equals(taxAgentId)).findFirst(); SalaryArchivePO salaryArchive = null; if (optionalSA.isPresent()) { @@ -946,12 +980,16 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe salaryArchive.setId(sa.getId()); salaryArchive.setEmployeeId(sa.getEmployeeId()); salaryArchive.setTaxAgentId(sa.getTaxAgentId()); + salaryArchive.setPayStartDate(payStartDate); + salaryArchive.setPayEndDate(payEndDate); } else if (employeeId != null && isInit) { // 新增档案 salaryArchive = SalaryArchivePO.builder() .id(IdGenerator.generate()) .employeeId(employeeId) .taxAgentId(taxAgentId) + .payStartDate(payStartDate) + .payEndDate(payEndDate) .createTime(importHandleParam.getNowTime()) .updateTime(importHandleParam.getNowTime()) .creator((long) user.getUID()) @@ -977,7 +1015,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe * @param importHandleParam * @return */ - private boolean handleTaxAgent(boolean isError, boolean isInit, int effectiveTimeIndex, + private boolean handleTaxAgent(boolean isError, boolean isInit, List> excelComments, int errorCount, int j, Long taxAgentId, Date effectiveTime, SalaryArchivePO finalSalaryArchive, String taxAgentAdjustReason, SalaryArchiveImportHandleParam importHandleParam, Map map) { String rowindex = "第" + map.get("index") + "行"; @@ -1118,8 +1156,6 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe * * @param isError * @param excelComments - * @param errorCount - * @param j * @param effectiveTime * @param finalSalaryArchive * @param salaryItemAdjustReason @@ -1127,8 +1163,8 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe * @param cellVal * @return */ - private boolean handleSalaryItem(boolean isError, boolean isInit, int effectiveTimeIndex, - List> excelComments, int errorCount, int j, + private boolean handleSalaryItem(boolean isError, boolean isInit, + List> excelComments, Date effectiveTime, SalaryArchivePO finalSalaryArchive, String salaryItemAdjustReason, SalaryArchiveImportHandleParam importHandleParam, String key, String cellVal, Map map) { String rowindex = "第" + map.get("index") + "行"; @@ -1311,13 +1347,15 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe String userNameI18n = SalaryI18nUtil.getI18nLabel(85429, "姓名"); String taxAgentI18n = SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"); String effectiveTimeI18n = SalaryI18nUtil.getI18nLabel(85904, "生效日期"); + String payStartDateI18n = SalaryI18nUtil.getI18nLabel(85904, "起始发薪日期"); + String payEndDateI18n = SalaryI18nUtil.getI18nLabel(85904, "最后发薪日期"); String adjustReasonI18n = SalaryI18nUtil.getI18nLabel(85431, "调整原因"); List mustHeaders = Lists.newArrayList(); if (isInit) { mustHeaders.add(userNameI18n); mustHeaders.add(taxAgentI18n); - mustHeaders.add(effectiveTimeI18n); + mustHeaders.add(payStartDateI18n); } else if (isTaxAgentAdjust) { mustHeaders.add(userNameI18n); mustHeaders.add(taxAgentI18n);