From 749279e37259659980037bfdbeb6b6531edbd5e0 Mon Sep 17 00:00:00 2001 From: sy Date: Fri, 2 Sep 2022 11:04:51 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=96=AA=E8=B5=84?= =?UTF-8?q?=E6=A0=B8=E7=AE=97=E5=AF=BC=E5=85=A5=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/service/impl/SalaryAcctExcelServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index dc649b276..6645ddf37 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -651,7 +651,8 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc employeeId = employeeSameIds.get(0).getEmployeeId(); } } - }else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "部门"), dataKey.toString())) { + }else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "部门"), dataKey.toString()) + || StringUtils.equals(SalaryI18nUtil.getI18nLabel(86186, "手机号"), dataKey.toString())) { } else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), dataKey.toString())) { if (StringUtils.isEmpty(dataValue)) { From 79cab3629ee6918bb042acadca74fa3777c38a50 Mon Sep 17 00:00:00 2001 From: sy Date: Fri, 2 Sep 2022 11:53:38 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E7=A6=8F=E5=88=A9=E6=A0=B8=E7=AE=97?= =?UTF-8?q?=E5=B9=B2=E9=A2=84=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nsuranceAcctDetailImportTemplateParam.java | 25 ++ .../param/InsuranceAcctImportParam.java | 25 ++ .../salary/service/SIAccountService.java | 4 + .../service/impl/SIAccountServiceImpl.java | 341 +++++++++++++++++- .../salary/web/SIAccountController.java | 86 +++++ 5 files changed, 479 insertions(+), 2 deletions(-) create mode 100644 src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java create mode 100644 src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java diff --git a/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java new file mode 100644 index 000000000..9aed8694a --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java @@ -0,0 +1,25 @@ +package com.engine.salary.entity.siaccount.param; + +import com.engine.salary.util.valid.DataCheck; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Collection; + + + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class InsuranceAcctDetailImportTemplateParam { + + + /** + * 薪资项目id(薪资项目包含了福利项) + */ + @DataCheck(require = true,message = "薪资项目id不能为空") + private Collection salaryItemIds; +} diff --git a/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java new file mode 100644 index 000000000..efd46abca --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java @@ -0,0 +1,25 @@ +package com.engine.salary.entity.siaccount.param; + +import com.engine.salary.util.valid.DataCheck; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author sy + * @Description 福利核算导入参数 + * @Date 2022/9/1 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InsuranceAcctImportParam { + + /** + * 上传文件id + */ + @DataCheck(require = true,message = "imageId为空") + String imageId; +} diff --git a/src/com/engine/salary/service/SIAccountService.java b/src/com/engine/salary/service/SIAccountService.java index 8cd97aebc..de1091702 100644 --- a/src/com/engine/salary/service/SIAccountService.java +++ b/src/com/engine/salary/service/SIAccountService.java @@ -7,6 +7,7 @@ import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountInspectPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.util.page.PageInfo; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.util.Collection; import java.util.List; @@ -207,5 +208,8 @@ public interface SIAccountService { void socialSecurityBenefitsRecalculate(InsuranceAccountBatchPO param); + XSSFWorkbook exportImportTemplate(InsuranceAcctDetailImportTemplateParam param); + + Map importInsuranceAcctDetail(InsuranceAcctImportParam insuranceAcctImportParam); } diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index 218f196e5..af83219d0 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -8,12 +8,21 @@ import com.cloudstore.eccom.pc.table.*; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; -import com.engine.salary.biz.SIAccountBiz; -import com.engine.salary.biz.SIArchivesBiz; +import com.engine.salary.biz.*; import com.engine.salary.component.SalaryWeaTable; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; import com.engine.salary.encrypt.siaccount.SiAccountEncrypt; +import com.engine.salary.entity.datacollection.AddUpDeduction; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.datacollection.dto.AddUpDeductionDTO; +import com.engine.salary.entity.report.po.SalaryAcctResultReportPO; +import com.engine.salary.entity.salaryacct.param.SalaryAcctImportTemplateParam; +import com.engine.salary.entity.salaryacct.po.ExcelAcctResultPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.siaccount.bo.InsuranceAccountBO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountBatchListDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountTabDTO; @@ -24,6 +33,7 @@ import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountInspectPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; import com.engine.salary.entity.sicategory.po.ICategoryPO; +import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.siaccount.BillStatusEnum; @@ -38,22 +48,40 @@ import com.engine.salary.mapper.siaccount.InsuranceAccountInspectMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.service.*; import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryFormItemUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.excel.ExcelParseHelper; +import com.engine.salary.util.excel.ExcelSupport; +import com.engine.salary.util.excel.ExcelUtil; import com.engine.salary.util.page.Column; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import dm.jdbc.util.IdGenerator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.Test; +import weaver.file.ImageFileManager; +import weaver.general.Util; import weaver.hrm.User; +import java.io.InputStream; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; +import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; + /** * @Author weaver_cl @@ -95,6 +123,12 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { return MapperProxyFactory.getProxy(InsuranceAccountDetailMapper.class); } + private SalaryItemService getSalaryItemService(User user) { + return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user); + } + + SICategoryBiz siCategoryBiz = new SICategoryBiz(); + @Override public Map listPage(InsuranceAccountBatchParam queryParam) { Long employeeId = (long) user.getUID(); @@ -954,4 +988,307 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { param.setBillStatus(0); getSiAccountBiz(user).updateById(param); } + + /** + * 导出“福利核算导入模板” + */ + @Override + public XSSFWorkbook exportImportTemplate(InsuranceAcctDetailImportTemplateParam param) { + ValidUtil.doValidator(param); + + // 必须选择导入模板所需的薪资项目(福利项) + if (CollectionUtils.isEmpty(param.getSalaryItemIds())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目")); + } + + // 模板表头(默认必带"个税扣缴义务人"、"姓名") + List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), + "部门", + SalaryI18nUtil.getI18nLabel(86186, "手机号"), + SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), + "账单月份"); + List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "taxAgentName", "billMonth"); + // 查询薪资项目(福利项) + List salaryItemPOS = getSalaryItemService(user).listByIds(param.getSalaryItemIds()); + for (SalaryItemPO salaryItemPO : salaryItemPOS) { + headerList.add(salaryItemPO.getName()); + dataIndexList.add("" + salaryItemPO.getId()); + } + + // excel导出的数据 + List> rows = new ArrayList<>(); + rows.add(headerList); + + String sheetName = "福利核算导入模板"; + return ExcelUtil.genWorkbookV2(rows, sheetName); + } + + @Override + public Map importInsuranceAcctDetail(InsuranceAcctImportParam importParam) { + long currentEmployeeId = user.getUID(); + Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); + + Map apidatas = new HashMap(); + EmployBiz employBiz = new EmployBiz(); + AddUpDeductionBiz addUpDeductionBiz = new AddUpDeductionBiz(); //todo,改为对应Biz + + //检验参数 + //excel文件id + String imageId = Util.null2String(importParam.getImageId()); +// Validate.notBlank(imageId, "imageId为空"); + if (StringUtils.isBlank(imageId)) { + throw new SalaryRunTimeException("文件不存在"); + } + // 获取所有个税扣缴义务人 + List taxAgents = getTaxAgentService(user).listAll(); + Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); +// //个税扣缴义务人 +// String taxAgentId = Util.null2String(importParam.getTaxAgentId()); + // 获取租户下所有的人员 + List salaryEmployees = employBiz.listEmployee(); +// //已经核算过的不可操作 +// // 获取已经核算的数据 +// List salaryAcctEmployees = getAccountedEmployeeData(declareMonthStr); +// // 查询已有数据 +// Date declareMonth = SalaryDateUtil.localDateToDate(LocalDate.parse(declareMonthStr + "-01", SalaryDateUtil.DATE_FORMATTER)); +// List list = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().declareMonth(declareMonth).build()); + + // 失败的数量 + int failCount = 0; + // 成功的数量 + int successCount = 0; + InputStream fileInputStream = null; + try { + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(importParam.getImageId())); + + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + + + // 错误提示信息 + List excelComments = Lists.newArrayList(); + // 存在错误的那行数据 + List> errorDatas = Lists.newArrayList(); + // 表头 + List headers = ExcelSupport.getSheetHeader(sheet, 0); + + // 处理数值 + List> data = ExcelParseHelper.parse2Map(sheet, 1); + if (CollectionUtils.isEmpty(headers)) { + throw new RuntimeException("表头为空"); + } + if (CollectionUtils.isEmpty(data)) { + throw new RuntimeException("无数据"); + } + for (int i = 0; i < data.size(); i++) { + + String row = "第" + (i + 2) + "行"; + + int usernameIndex = 0; + boolean isError = false; + Map map = data.get(i); + Long employeeId = 0L; + Long taxAgentId = 0L; + + for (int j = 0; j < headers.size(); j++) { + String header = headers.get(j); + String dataKey = header; + if (dataKey == null) { + continue; + } + String dataValue = (String) map.getOrDefault(dataKey.toString(), ""); + + String deparmentName = (String) map.getOrDefault("部门", ""); + + String mobile = (String) map.getOrDefault("手机号", ""); + + String billMonth = (String) map.getOrDefault("账单月份", ""); + + Long paymentOrganization = (Long) map.getOrDefault("个税扣缴义务人", ""); + + if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { + usernameIndex = j; + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); + excelComments.add(errorMessageMap); + //salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空"), i, i, j, j); + } else { + + List employeeSameIds = salaryEmployees.stream().filter(e -> (StringUtils.isBlank(dataValue) || Objects.equals(e.getUsername(), dataValue)) + && (StringUtils.isBlank(deparmentName) || Objects.equals(e.getDepartmentName(), deparmentName)) + && (StringUtils.isBlank(mobile) || Objects.equals(e.getMobile(), mobile))) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(employeeSameIds)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); + excelComments.add(errorMessageMap); +// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名"), i, i, j, j); + } else if (employeeSameIds.size() > 1) { + //存在离职和在职状态取在职状态 + employeeSameIds = employeeSameIds.stream() + .filter(e -> UserStatusEnum.getNormalStatus().contains(e.getStatus())) + .collect(Collectors.toList()); + if (employeeSameIds.size() != 1) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + "员工信息不能为空且不可重复(姓名、部门和手机号同时确认唯一)"); + excelComments.add(errorMessageMap); + } else { + employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 ? employeeSameIds.get(0).getEmployeeId() : null; + } + } else { + employeeId = employeeSameIds.get(0).getEmployeeId(); + } + } + }else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "部门"), dataKey.toString())) { + + } else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), dataKey.toString())) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102839, "个税扣缴义务人不能为空"))); + excelComments.add(errorMessageMap); +// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102839, "个税扣缴义务人不能为空"), i, i, j, j); + } else { + taxAgentId = taxAgentNameMap.getOrDefault(dataValue, 0L); + if (taxAgentId == null || taxAgentId <= 0) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"))); + excelComments.add(errorMessageMap); +// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"), i, i, j, j); + } + } + } else if (!checkBillMonth(billMonth)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "账单月份输入有误,请参照“2022-09”这种格式进行检查")); + excelComments.add(errorMessageMap); + } + + //如果福利核算信息查询不到唯一匹配数据,不支持导入 + //todo,根据员工id和账单月份查询 + if (!isError){ + + List employeeIds = new ArrayList<>(); + employeeIds.add(employeeId); + List list = queryList(billMonth, paymentOrganization, employeeIds); + if (list.isEmpty()) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "本次福利核算不包含该人员")); + excelComments.add(errorMessageMap); + } else if (list.size() > 1) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员本次核算出现多组数据,请删除数据库中多余核算项")); + excelComments.add(errorMessageMap); + } else { + //todo,update + updateInsuranceAccountDetail(list.get(0), map); + } + +// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102842, "本次薪资核算不包含该人员"), i, i, usernameIndex, usernameIndex); + } + + } + + if (isError) { + failCount++; + errorDatas.add(map); + continue; + } else { + + //todo,更新数据 + successCount++; + } + + + } + + + apidatas.put("successCount", successCount); + apidatas.put("errorCount", failCount); + apidatas.put("errorData", excelComments); + + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + + + + private void updateInsuranceAccountDetail(InsuranceAccountDetailPO insuranceAccountDetailPO, Map map) { + + //组装json数据,格式Map + StringBuilder socialPerJson = new StringBuilder(); + StringBuilder fundPerJson = new StringBuilder(); + StringBuilder otherPerJson = new StringBuilder(); + StringBuilder socialComJson = new StringBuilder(); + StringBuilder fundComJson = new StringBuilder(); + StringBuilder otherComJson = new StringBuilder(); + + for(Map.Entry entry : map.entrySet()) { + //判断元素是否属于福利类 + String keyName = entry.getKey(); + //获取元素名后缀,方便之后判断“个人”或“单位” + String payScope = keyName.substring(keyName.length() - 1, keyName.length() + 1); + //获取福利类型 + Integer welfareType; + List categoryPOList = siCategoryBiz.listByName(entry.getKey().substring(0, keyName.length() - 1)); + if (categoryPOList.size() == 1) { + ICategoryPO iCategoryPO = categoryPOList.get(0); + welfareType = iCategoryPO.getWelfareType(); + if ("个人".equals(payScope)) { + switch (welfareType) { + case 1: + socialPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + break; + case 2: + fundPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + break; + case 3: + otherPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + break; + } + } else if ("单位".equals(payScope)) { + switch (welfareType) { + case 1: + socialComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + break; + case 2: + fundComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + break; + case 3: + otherComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + break; + } + } + } + + } + + //组装新的insuranceAccountDetailPO对象数据 +// insuranceAccountDetailPO. + } + + /** + * 校验福利核算的账单月份输入格式是否正确 + */ + + public boolean checkBillMonth(String billMonth) { + + String connector = ""; + if(billMonth.length() == 7){ + connector = billMonth.substring(4,5); + return "-".equals(connector); + } else { + return false; + } + } + } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index c6cef245b..e73c71446 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -2,17 +2,27 @@ package com.engine.salary.web; import com.engine.common.util.ParamUtil; import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.datacollection.param.AddUpDeductionImportParam; +import com.engine.salary.entity.salaryacct.param.SalaryAcctImportTemplateParam; +import com.engine.salary.entity.salaryacct.param.SalaryAcctResultQueryParam; +import com.engine.salary.entity.salaryformula.param.SalaryFormulaFieldQueryParam; +import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.entity.siaccount.dto.InsuranceAccountTabDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.param.*; import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum; import com.engine.salary.service.impl.SIAccountServiceImpl; import com.engine.salary.util.ResponseResult; import com.engine.salary.util.page.PageInfo; import com.engine.salary.wrapper.SIAccountWrapper; +import com.engine.salary.wrapper.SalaryFormulaWrapper; import io.swagger.v3.oas.annotations.parameters.RequestBody; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; import com.engine.salary.service.SIAccountService; @@ -22,14 +32,22 @@ import javax.servlet.http.HttpServletResponse; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 福利核算控制器 */ +@Slf4j public class SIAccountController { public SIAccountService getService(User user) { @@ -39,6 +57,10 @@ public class SIAccountController { public SIAccountWrapper getSIAccountWrapper(User user) { return ServiceUtil.getService(SIAccountWrapper.class,user); } + + private SalaryFormulaWrapper getSalaryFormulaWrapper(User user) { + return (SalaryFormulaWrapper) ServiceUtil.getService(SalaryFormulaWrapper.class, user); + } /** * 获取台账列表页 * @@ -371,4 +393,68 @@ public class SIAccountController { return new ResponseResult(user).run(getService(user)::socialSecurityBenefitsRecalculate,insuranceAccountDetailParam); } + /** + * 社保福利项列表 + * @param request + * @param response + * @return + */ + @GET + @Path("/getWelfareList") + @Produces(MediaType.APPLICATION_JSON) + public String getWelfareList(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + SalaryFormulaFieldQueryParam param = new SalaryFormulaFieldQueryParam(); + param.setSourceId("welfare"); + return new ResponseResult>(user).run(getSalaryFormulaWrapper(user)::fieldList, param); + } + + /** + * 导出“福利核算导入”模板 + * @param request + * @param response + * @return + */ + @GET + @Path("/welfare/importtemplate/export") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportImportTemplate(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + InsuranceAcctDetailImportTemplateParam param = new InsuranceAcctDetailImportTemplateParam(); + + String salaryItemIds = request.getParameter("salaryItemIds"); + if (StringUtils.isNotBlank(salaryItemIds)) { + param.setSalaryItemIds(Arrays.stream(salaryItemIds.split(",")).map(Long::valueOf).collect(Collectors.toList())); + } + + User user = HrmUserVarify.getUser(request, response); + XSSFWorkbook workbook = getService(user).exportImportTemplate(param); + String time = LocalDate.now().toString(); + String fileName = "福利核算导入模板" + time; + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); + } catch (Exception e) { + log.error("福利核算导入模板导出异常", e); + throw e; + } + + } + + @POST + @Path("/welfare/importInsuranceAcctDetail") + @Produces(MediaType.APPLICATION_JSON) + public String importInsuranceAcctDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody InsuranceAcctImportParam importParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getService(user)::importInsuranceAcctDetail, importParam); + } + } From 3445642489d9e5cb159796b4b8992f247dc7da10 Mon Sep 17 00:00:00 2001 From: sy Date: Fri, 2 Sep 2022 15:40:05 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=96=AA=E8=B5=84?= =?UTF-8?q?=E6=A0=B8=E7=AE=97=E5=AF=BC=E5=85=A5=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SIAccountServiceImpl.java | 164 +++++++++++++++--- 1 file changed, 142 insertions(+), 22 deletions(-) diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index af83219d0..39069882b 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -61,6 +61,7 @@ import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.icbc.api.internal.apache.http.impl.cookie.S; import dm.jdbc.util.IdGenerator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -1089,6 +1090,8 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { Long employeeId = 0L; Long taxAgentId = 0L; + List updateInsuranceAccountDetailList = new ArrayList<>(); + for (int j = 0; j < headers.size(); j++) { String header = headers.get(j); String dataKey = header; @@ -1169,12 +1172,11 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { excelComments.add(errorMessageMap); } - //如果福利核算信息查询不到唯一匹配数据,不支持导入 - //todo,根据员工id和账单月份查询 if (!isError){ - List employeeIds = new ArrayList<>(); employeeIds.add(employeeId); + //如果福利核算信息查询不到唯一匹配数据,不支持导入 + //根据员工id和账单月份查询 List list = queryList(billMonth, paymentOrganization, employeeIds); if (list.isEmpty()) { isError = true; @@ -1187,14 +1189,16 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员本次核算出现多组数据,请删除数据库中多余核算项")); excelComments.add(errorMessageMap); } else { - //todo,update - updateInsuranceAccountDetail(list.get(0), map); + //拼装待更新数据 + updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map)); } -// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102842, "本次薪资核算不包含该人员"), i, i, usernameIndex, usernameIndex); } } + //将待更新列表加密 + InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(updateInsuranceAccountDetailList); + //todo,更新数据 if (isError) { failCount++; @@ -1202,7 +1206,6 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { continue; } else { - //todo,更新数据 successCount++; } @@ -1221,16 +1224,26 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { } - - private void updateInsuranceAccountDetail(InsuranceAccountDetailPO insuranceAccountDetailPO, Map map) { + /** + * 将更新的数据设置到老的insuranceAccountDetailPO对象中 + * @param insuranceAccountDetailPO + * @param map + */ + private InsuranceAccountDetailPO handleInsuranceAccountDetail(InsuranceAccountDetailPO insuranceAccountDetailPO, Map map) { //组装json数据,格式Map - StringBuilder socialPerJson = new StringBuilder(); - StringBuilder fundPerJson = new StringBuilder(); - StringBuilder otherPerJson = new StringBuilder(); - StringBuilder socialComJson = new StringBuilder(); - StringBuilder fundComJson = new StringBuilder(); - StringBuilder otherComJson = new StringBuilder(); +// StringBuilder socialPerJson = new StringBuilder(); +// StringBuilder fundPerJson = new StringBuilder(); +// StringBuilder otherPerJson = new StringBuilder(); +// StringBuilder socialComJson = new StringBuilder(); +// StringBuilder fundComJson = new StringBuilder(); +// StringBuilder otherComJson = new StringBuilder(); + Map socialPerMap = new HashMap<>(); + Map fundPerMap = new HashMap<>(); + Map otherPerMap = new HashMap<>(); + Map socialComMap = new HashMap<>(); + Map fundComMap = new HashMap<>(); + Map otherComMap = new HashMap<>(); for(Map.Entry entry : map.entrySet()) { //判断元素是否属于福利类 @@ -1243,28 +1256,53 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { if (categoryPOList.size() == 1) { ICategoryPO iCategoryPO = categoryPOList.get(0); welfareType = iCategoryPO.getWelfareType(); +// if ("个人".equals(payScope)) { +// switch (welfareType) { +// case 1: +// socialPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); +// break; +// case 2: +// fundPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); +// break; +// case 3: +// otherPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); +// break; +// } +// } else if ("单位".equals(payScope)) { +// switch (welfareType) { +// case 1: +// socialComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); +// break; +// case 2: +// fundComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); +// break; +// case 3: +// otherComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); +// break; +// } +// } if ("个人".equals(payScope)) { switch (welfareType) { case 1: - socialPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + socialPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: - fundPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + fundPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: - otherPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + otherPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; } } else if ("单位".equals(payScope)) { switch (welfareType) { case 1: - socialComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + socialComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 2: - fundComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + fundComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; case 3: - otherComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); + otherComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; } } @@ -1272,8 +1310,90 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { } + //解密insuranceAccountDetailPO + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); //组装新的insuranceAccountDetailPO对象数据 -// insuranceAccountDetailPO. + if (!socialPerMap.isEmpty()) { + //对比新旧json中数据,并输出最终json + checkjsonMap(socialPerMap, insuranceAccountDetailPO.getSocialPerJson()); + insuranceAccountDetailPO.setSocialPerJson(JSON.toJSONString(socialPerMap)); + } + + if (!socialComMap.isEmpty()) { + checkjsonMap(socialComMap, insuranceAccountDetailPO.getSocialComJson()); + insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialComMap)); + } + + if (!fundPerMap.isEmpty()) { + checkjsonMap(fundPerMap, insuranceAccountDetailPO.getFundPerJson()); + insuranceAccountDetailPO.setFundPerJson(JSON.toJSONString(fundPerMap)); + } + + if (!fundComMap.isEmpty()) { + checkjsonMap(fundComMap, insuranceAccountDetailPO.getFundComJson()); + insuranceAccountDetailPO.setFundComJson(JSON.toJSONString(fundComMap)); + } + + if (!otherPerMap.isEmpty()) { + checkjsonMap(otherPerMap, insuranceAccountDetailPO.getOtherPerJson()); + insuranceAccountDetailPO.setOtherPerJson(JSON.toJSONString(otherPerMap)); + } + + if (!otherComMap.isEmpty()) { + checkjsonMap(otherComMap, insuranceAccountDetailPO.getOtherComJson()); + insuranceAccountDetailPO.setOtherComJson(JSON.toJSONString(otherComMap)); + } + + if (!StringUtils.isEmpty(map.getOrDefault("个人合计", "").toString())) { + insuranceAccountDetailPO.setPerSum(map.get("个人合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("社保个人合计", "").toString())) { + insuranceAccountDetailPO.setSocialPerSum(map.get("社保个人合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("公积金个人合计", "").toString())) { + insuranceAccountDetailPO.setFundPerSum(map.get("公积金个人合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("其他福利个人合计", "").toString())) { + insuranceAccountDetailPO.setOtherPerSum(map.get("其他福利个人合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("单位合计", "").toString())) { + insuranceAccountDetailPO.setComSum(map.get("单位合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("社保单位合计", "").toString())) { + insuranceAccountDetailPO.setSocialComSum(map.get("社保单位合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("公积金单位合计", "").toString())) { + insuranceAccountDetailPO.setFundComSum(map.get("公积金单位合计").toString()); + } + + if (!StringUtils.isEmpty(map.getOrDefault("其他福利单位合计", "").toString())) { + insuranceAccountDetailPO.setOtherComSum(map.get("其他福利单位合计").toString()); + } + + return insuranceAccountDetailPO; + } + + /** + * 对比新旧两份数据,并更新数据 + * @param newMap + * @param oldJson + * @return + */ + private Map checkjsonMap(Map newMap, String oldJson) { + Map oldMap = JSON.parseObject(oldJson, new HashMap().getClass()); + for (Map.Entry oldEntry : oldMap.entrySet()) { + + if (!newMap.containsKey(oldEntry.getKey())) { + newMap.put(oldEntry.getKey(), oldEntry.getValue()); + } + } + return newMap; } /** From 5a6df5a257bc94926ee2bf79b5bcaeb5321f01a5 Mon Sep 17 00:00:00 2001 From: sy Date: Tue, 6 Sep 2022 17:13:33 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=A6=8F=E5=88=A9=E6=A0=B8=E7=AE=97?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=B9=B2=E9=A2=84=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E6=A0=B8=E7=AE=97=E9=A1=B9=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=81=E7=A6=8F=E5=88=A9=E6=A0=B8=E7=AE=97?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=A8=A1=E6=9D=BF=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E3=80=81=E7=A6=8F=E5=88=A9=E6=A0=B8=E7=AE=97=E5=B9=B2?= =?UTF-8?q?=E9=A2=84=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 7 + .../InsuranceAcctDetailImportFieldDTO.java | 23 ++ ...nsuranceAcctDetailImportTemplateParam.java | 4 +- .../InsuranceAccountDetailMapper.java | 6 + .../InsuranceAccountDetailMapper.xml | 27 ++ .../salary/service/SIAccountService.java | 6 + .../service/impl/SIAccountServiceImpl.java | 291 ++++++++---------- .../salary/web/SIAccountController.java | 26 +- .../salary/wrapper/SalaryFormulaWrapper.java | 30 +- 9 files changed, 240 insertions(+), 180 deletions(-) create mode 100644 src/com/engine/salary/entity/siaccount/dto/InsuranceAcctDetailImportFieldDTO.java diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 87d5d2349..49b97c916 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -1687,4 +1687,11 @@ public class SIAccountBiz extends Service { getInsuranceAccountBatchMapper().updateById(param); } + /** + * 批量更新福利台账 + */ + public void batchUpdateByEmployeeIdAndBillMonth(List insuranceAccountDetailPOS) { + getInsuranceAccountDetailMapper().batchUpdateByEmployeeIdAndBillMonth(insuranceAccountDetailPOS); + } + } diff --git a/src/com/engine/salary/entity/siaccount/dto/InsuranceAcctDetailImportFieldDTO.java b/src/com/engine/salary/entity/siaccount/dto/InsuranceAcctDetailImportFieldDTO.java new file mode 100644 index 000000000..b7e99b168 --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/dto/InsuranceAcctDetailImportFieldDTO.java @@ -0,0 +1,23 @@ +package com.engine.salary.entity.siaccount.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author sy + * @Description 福利核算导入时生成导入模板的薪资(福利)项目 + * @Date 2022/9/2 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InsuranceAcctDetailImportFieldDTO { + //字段id +// private String fieldId; + + //薪资项目名称 + private String salaryItemName; +} diff --git a/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java index 9aed8694a..84f5437ca 100644 --- a/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java +++ b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctDetailImportTemplateParam.java @@ -20,6 +20,6 @@ public class InsuranceAcctDetailImportTemplateParam { /** * 薪资项目id(薪资项目包含了福利项) */ - @DataCheck(require = true,message = "薪资项目id不能为空") - private Collection salaryItemIds; + @DataCheck(require = true,message = "福利核算项目name不能为空") + private Collection welfareNames; } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java index 1871ca855..015e9ae2d 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java @@ -1,5 +1,6 @@ package com.engine.salary.mapper.siaccount; +import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO; import com.engine.salary.entity.siaccount.param.InsuranceAccountDetailParam; import com.engine.salary.entity.siaccount.param.SupplementAccountBaseParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; @@ -104,4 +105,9 @@ public interface InsuranceAccountDetailMapper { List changeList(@Param("userName") String userName); + /** + * 根据员工id和账单月份批量更新数据 + */ + void batchUpdateByEmployeeIdAndBillMonth(@Param("pos") Collection pos); + } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index 788bf39cc..59cc9a21b 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -761,4 +761,31 @@ )a + + + UPDATE hrsa_bill_detail + + + social_per_json = #{item.socialPerJson}, + social_per_sum = #{item.socialPerSum}, + fund_per_json = #{item.fundPerJson}, + fund_per_sum = #{item.fundPerSum}, + other_per_json = #{item.otherPerJson}, + other_per_sum = #{item.otherPerSum}, + per_sum = #{item.perSum}, + social_com_json = #{item.socialComJson}, + social_com_sum = #{item.socialComSum}, + fund_com_json = #{item.fundComJson}, + fund_com_sum = #{item.fundComSum}, + other_com_json = #{item.otherComJson}, + other_com_sum = #{item.otherComSum}, + update_time = #{item.updateTime}, + + + WHERE employee_id = #{item.employeeId} + AND bill_month = #{item.billMonth} + AND delete_type = 0 + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SIAccountService.java b/src/com/engine/salary/service/SIAccountService.java index de1091702..32e970c85 100644 --- a/src/com/engine/salary/service/SIAccountService.java +++ b/src/com/engine/salary/service/SIAccountService.java @@ -208,8 +208,14 @@ public interface SIAccountService { void socialSecurityBenefitsRecalculate(InsuranceAccountBatchPO param); + /** + * 导出“福利核算导入模板” + */ XSSFWorkbook exportImportTemplate(InsuranceAcctDetailImportTemplateParam param); + /** + * 将福利核算模板导入的数据更新到数据库 + */ Map importInsuranceAcctDetail(InsuranceAcctImportParam insuranceAcctImportParam); } diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index 39069882b..59a63bc16 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -46,6 +46,7 @@ import com.engine.salary.mapper.siaccount.InsuranceAccountBatchMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountInspectMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; +import com.engine.salary.mapper.taxagent.TaxAgentMapper; import com.engine.salary.service.*; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; @@ -128,6 +129,10 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user); } + private TaxAgentMapper getTaxAgentMapper() { + return MapperProxyFactory.getProxy(TaxAgentMapper.class); + } + SICategoryBiz siCategoryBiz = new SICategoryBiz(); @Override @@ -998,8 +1003,8 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { ValidUtil.doValidator(param); // 必须选择导入模板所需的薪资项目(福利项) - if (CollectionUtils.isEmpty(param.getSalaryItemIds())) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目")); + if (CollectionUtils.isEmpty(param.getWelfareNames())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目核算项")); } // 模板表头(默认必带"个税扣缴义务人"、"姓名") @@ -1008,13 +1013,10 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "账单月份"); - List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "taxAgentName", "billMonth"); - // 查询薪资项目(福利项) - List salaryItemPOS = getSalaryItemService(user).listByIds(param.getSalaryItemIds()); - for (SalaryItemPO salaryItemPO : salaryItemPOS) { - headerList.add(salaryItemPO.getName()); - dataIndexList.add("" + salaryItemPO.getId()); - } +// List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "taxAgentName", "billMonth"); + // 查询福利核算项目 + List welfareNames = (List) param.getWelfareNames(); + headerList.addAll(welfareNames); // excel导出的数据 List> rows = new ArrayList<>(); @@ -1024,35 +1026,30 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { return ExcelUtil.genWorkbookV2(rows, sheetName); } + /** + * 将福利核算模板导入的数据更新到数据库 + */ @Override public Map importInsuranceAcctDetail(InsuranceAcctImportParam importParam) { - long currentEmployeeId = user.getUID(); - Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); +// long currentEmployeeId = user.getUID(); +// Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); Map apidatas = new HashMap(); EmployBiz employBiz = new EmployBiz(); - AddUpDeductionBiz addUpDeductionBiz = new AddUpDeductionBiz(); //todo,改为对应Biz //检验参数 //excel文件id String imageId = Util.null2String(importParam.getImageId()); -// Validate.notBlank(imageId, "imageId为空"); + if (StringUtils.isBlank(imageId)) { throw new SalaryRunTimeException("文件不存在"); } - // 获取所有个税扣缴义务人 - List taxAgents = getTaxAgentService(user).listAll(); - Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); -// //个税扣缴义务人 -// String taxAgentId = Util.null2String(importParam.getTaxAgentId()); +// // 获取所有个税扣缴义务人 +// List taxAgents = getTaxAgentService(user).listAll(); +// Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); + // 获取租户下所有的人员 List salaryEmployees = employBiz.listEmployee(); -// //已经核算过的不可操作 -// // 获取已经核算的数据 -// List salaryAcctEmployees = getAccountedEmployeeData(declareMonthStr); -// // 查询已有数据 -// Date declareMonth = SalaryDateUtil.localDateToDate(LocalDate.parse(declareMonthStr + "-01", SalaryDateUtil.DATE_FORMATTER)); -// List list = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().declareMonth(declareMonth).build()); // 失败的数量 int failCount = 0; @@ -1064,14 +1061,12 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); - // 错误提示信息 List excelComments = Lists.newArrayList(); // 存在错误的那行数据 List> errorDatas = Lists.newArrayList(); // 表头 List headers = ExcelSupport.getSheetHeader(sheet, 0); - // 处理数值 List> data = ExcelParseHelper.parse2Map(sheet, 1); if (CollectionUtils.isEmpty(headers)) { @@ -1080,18 +1075,43 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { if (CollectionUtils.isEmpty(data)) { throw new RuntimeException("无数据"); } + //存储待更新的InsuranceAccountDetailPO数据 + List updateInsuranceAccountDetailList = new ArrayList<>(); + //遍历excel表具体数据 for (int i = 0; i < data.size(); i++) { String row = "第" + (i + 2) + "行"; - int usernameIndex = 0; boolean isError = false; Map map = data.get(i); Long employeeId = 0L; - Long taxAgentId = 0L; +// Long taxAgentId = 0L; - List updateInsuranceAccountDetailList = new ArrayList<>(); + List list = new ArrayList<>(); + String billMonth = (String) map.getOrDefault("账单月份", ""); + + String taxAgentName = (String) map.getOrDefault("个税扣缴义务人", ""); + Long paymentOrganization = 0L; + List taxAgentPoList = getTaxAgentMapper().listByName(taxAgentName); + + if (taxAgentPoList.size() == 1) { + paymentOrganization = taxAgentPoList.get(0).getId(); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"))); + excelComments.add(errorMessageMap); + } + + if (!checkBillMonth(billMonth)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "账单月份输入有误,请参照“2022-09”这种格式进行检查")); + excelComments.add(errorMessageMap); + } + + //遍历表头 for (int j = 0; j < headers.size(); j++) { String header = headers.get(j); String dataKey = header; @@ -1099,25 +1119,17 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { continue; } String dataValue = (String) map.getOrDefault(dataKey.toString(), ""); - String deparmentName = (String) map.getOrDefault("部门", ""); - String mobile = (String) map.getOrDefault("手机号", ""); - String billMonth = (String) map.getOrDefault("账单月份", ""); - - Long paymentOrganization = (Long) map.getOrDefault("个税扣缴义务人", ""); - if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { - usernameIndex = j; if (StringUtils.isEmpty(dataValue)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); excelComments.add(errorMessageMap); - //salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空"), i, i, j, j); - } else { + } else { List employeeSameIds = salaryEmployees.stream().filter(e -> (StringUtils.isBlank(dataValue) || Objects.equals(e.getUsername(), dataValue)) && (StringUtils.isBlank(deparmentName) || Objects.equals(e.getDepartmentName(), deparmentName)) && (StringUtils.isBlank(mobile) || Objects.equals(e.getMobile(), mobile))) @@ -1128,7 +1140,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); excelComments.add(errorMessageMap); -// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名"), i, i, j, j); + } else if (employeeSameIds.size() > 1) { //存在离职和在职状态取在职状态 employeeSameIds = employeeSameIds.stream() @@ -1149,70 +1161,46 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { }else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "部门"), dataKey.toString())) { } else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), dataKey.toString())) { - if (StringUtils.isEmpty(dataValue)) { - isError = true; - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102839, "个税扣缴义务人不能为空"))); - excelComments.add(errorMessageMap); -// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102839, "个税扣缴义务人不能为空"), i, i, j, j); - } else { - taxAgentId = taxAgentNameMap.getOrDefault(dataValue, 0L); - if (taxAgentId == null || taxAgentId <= 0) { - isError = true; - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"))); - excelComments.add(errorMessageMap); -// salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102840, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"), i, i, j, j); - } - } - } else if (!checkBillMonth(billMonth)) { - isError = true; - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "账单月份输入有误,请参照“2022-09”这种格式进行检查")); - excelComments.add(errorMessageMap); - } - - if (!isError){ - List employeeIds = new ArrayList<>(); - employeeIds.add(employeeId); - //如果福利核算信息查询不到唯一匹配数据,不支持导入 - //根据员工id和账单月份查询 - List list = queryList(billMonth, paymentOrganization, employeeIds); - if (list.isEmpty()) { - isError = true; - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "本次福利核算不包含该人员")); - excelComments.add(errorMessageMap); - } else if (list.size() > 1) { - isError = true; - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员本次核算出现多组数据,请删除数据库中多余核算项")); - excelComments.add(errorMessageMap); - } else { - //拼装待更新数据 - updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map)); - } } } - //将待更新列表加密 - InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(updateInsuranceAccountDetailList); - //todo,更新数据 + + if (!isError){ + List employeeIds = new ArrayList<>(); + employeeIds.add(employeeId); + //如果福利核算信息查询不到唯一匹配数据,不支持导入 + //根据员工id、个税扣缴义务人id、账单月份查询 + list = queryList(billMonth, paymentOrganization, employeeIds); + if (list.isEmpty()) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "本次福利核算不包含该人员")); + excelComments.add(errorMessageMap); + } else if (list.size() > 1) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员本次核算出现多组数据,请删除数据库中多余核算项")); + excelComments.add(errorMessageMap); + } else { + //拼装待更新数据 + updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map)); + } + + } if (isError) { failCount++; errorDatas.add(map); - continue; } else { - successCount++; } - } - - + //将待更新列表加密 + InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(updateInsuranceAccountDetailList); + //更新 + getSiAccountBiz(user).batchUpdateByEmployeeIdAndBillMonth(updateInsuranceAccountDetailList); apidatas.put("successCount", successCount); apidatas.put("errorCount", failCount); apidatas.put("errorData", excelComments); @@ -1226,18 +1214,10 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { /** * 将更新的数据设置到老的insuranceAccountDetailPO对象中 - * @param insuranceAccountDetailPO - * @param map */ - private InsuranceAccountDetailPO handleInsuranceAccountDetail(InsuranceAccountDetailPO insuranceAccountDetailPO, Map map) { + private InsuranceAccountDetailPO handleInsuranceAccountDetail(InsuranceAccountDetailPO insuranceAccountDetailPO, Map baseMap) { //组装json数据,格式Map -// StringBuilder socialPerJson = new StringBuilder(); -// StringBuilder fundPerJson = new StringBuilder(); -// StringBuilder otherPerJson = new StringBuilder(); -// StringBuilder socialComJson = new StringBuilder(); -// StringBuilder fundComJson = new StringBuilder(); -// StringBuilder otherComJson = new StringBuilder(); Map socialPerMap = new HashMap<>(); Map fundPerMap = new HashMap<>(); Map otherPerMap = new HashMap<>(); @@ -1245,42 +1225,28 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { Map fundComMap = new HashMap<>(); Map otherComMap = new HashMap<>(); - for(Map.Entry entry : map.entrySet()) { + //筛选出福利核算项 + Map toDealMap = + baseMap.entrySet().stream() + .filter(map -> !"姓名".equals(map.getKey()) + && !"部门".equals(map.getKey()) + && !"手机号".equals(map.getKey()) + && !"个税扣缴义务人".equals(map.getKey()) + && !"账单月份".equals(map.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + for(Map.Entry entry : toDealMap.entrySet()) { //判断元素是否属于福利类 String keyName = entry.getKey(); //获取元素名后缀,方便之后判断“个人”或“单位” - String payScope = keyName.substring(keyName.length() - 1, keyName.length() + 1); + String payScope = keyName.substring(keyName.length() - 2); //获取福利类型 Integer welfareType; - List categoryPOList = siCategoryBiz.listByName(entry.getKey().substring(0, keyName.length() - 1)); + List categoryPOList = siCategoryBiz.listByName(entry.getKey().substring(0, keyName.length() - 2)); if (categoryPOList.size() == 1) { ICategoryPO iCategoryPO = categoryPOList.get(0); welfareType = iCategoryPO.getWelfareType(); -// if ("个人".equals(payScope)) { -// switch (welfareType) { -// case 1: -// socialPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); -// break; -// case 2: -// fundPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); -// break; -// case 3: -// otherPerJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); -// break; -// } -// } else if ("单位".equals(payScope)) { -// switch (welfareType) { -// case 1: -// socialComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); -// break; -// case 2: -// fundComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); -// break; -// case 3: -// otherComJson.append(iCategoryPO.getId().toString()).append(":").append(entry.getValue().toString()).append(","); -// break; -// } -// } + if ("个人".equals(payScope)) { switch (welfareType) { case 1: @@ -1292,6 +1258,8 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { case 3: otherPerMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; + default: + throw new SalaryRunTimeException("福利类型不存在"); } } else if ("单位".equals(payScope)) { switch (welfareType) { @@ -1304,91 +1272,96 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { case 3: otherComMap.put(iCategoryPO.getId().toString(), entry.getValue().toString()); break; + default: + throw new SalaryRunTimeException("福利类型不存在"); } } } } - //解密insuranceAccountDetailPO - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); +// //解密insuranceAccountDetailPO +// InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); //组装新的insuranceAccountDetailPO对象数据 if (!socialPerMap.isEmpty()) { //对比新旧json中数据,并输出最终json - checkjsonMap(socialPerMap, insuranceAccountDetailPO.getSocialPerJson()); + checkJsonMap(socialPerMap, insuranceAccountDetailPO.getSocialPerJson()); insuranceAccountDetailPO.setSocialPerJson(JSON.toJSONString(socialPerMap)); } if (!socialComMap.isEmpty()) { - checkjsonMap(socialComMap, insuranceAccountDetailPO.getSocialComJson()); + checkJsonMap(socialComMap, insuranceAccountDetailPO.getSocialComJson()); insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialComMap)); } if (!fundPerMap.isEmpty()) { - checkjsonMap(fundPerMap, insuranceAccountDetailPO.getFundPerJson()); + checkJsonMap(fundPerMap, insuranceAccountDetailPO.getFundPerJson()); insuranceAccountDetailPO.setFundPerJson(JSON.toJSONString(fundPerMap)); } if (!fundComMap.isEmpty()) { - checkjsonMap(fundComMap, insuranceAccountDetailPO.getFundComJson()); + checkJsonMap(fundComMap, insuranceAccountDetailPO.getFundComJson()); insuranceAccountDetailPO.setFundComJson(JSON.toJSONString(fundComMap)); } if (!otherPerMap.isEmpty()) { - checkjsonMap(otherPerMap, insuranceAccountDetailPO.getOtherPerJson()); + checkJsonMap(otherPerMap, insuranceAccountDetailPO.getOtherPerJson()); insuranceAccountDetailPO.setOtherPerJson(JSON.toJSONString(otherPerMap)); } if (!otherComMap.isEmpty()) { - checkjsonMap(otherComMap, insuranceAccountDetailPO.getOtherComJson()); + checkJsonMap(otherComMap, insuranceAccountDetailPO.getOtherComJson()); insuranceAccountDetailPO.setOtherComJson(JSON.toJSONString(otherComMap)); } - if (!StringUtils.isEmpty(map.getOrDefault("个人合计", "").toString())) { - insuranceAccountDetailPO.setPerSum(map.get("个人合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("个人合计", "").toString())) { + insuranceAccountDetailPO.setPerSum(baseMap.get("个人合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("社保个人合计", "").toString())) { - insuranceAccountDetailPO.setSocialPerSum(map.get("社保个人合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("社保个人合计", "").toString())) { + insuranceAccountDetailPO.setSocialPerSum(baseMap.get("社保个人合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("公积金个人合计", "").toString())) { - insuranceAccountDetailPO.setFundPerSum(map.get("公积金个人合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("公积金个人合计", "").toString())) { + insuranceAccountDetailPO.setFundPerSum(baseMap.get("公积金个人合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("其他福利个人合计", "").toString())) { - insuranceAccountDetailPO.setOtherPerSum(map.get("其他福利个人合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("其他福利个人合计", "").toString())) { + insuranceAccountDetailPO.setOtherPerSum(baseMap.get("其他福利个人合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("单位合计", "").toString())) { - insuranceAccountDetailPO.setComSum(map.get("单位合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("单位合计", "").toString())) { + insuranceAccountDetailPO.setComSum(baseMap.get("单位合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("社保单位合计", "").toString())) { - insuranceAccountDetailPO.setSocialComSum(map.get("社保单位合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("社保单位合计", "").toString())) { + insuranceAccountDetailPO.setSocialComSum(baseMap.get("社保单位合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("公积金单位合计", "").toString())) { - insuranceAccountDetailPO.setFundComSum(map.get("公积金单位合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("公积金单位合计", "").toString())) { + insuranceAccountDetailPO.setFundComSum(baseMap.get("公积金单位合计").toString()); } - if (!StringUtils.isEmpty(map.getOrDefault("其他福利单位合计", "").toString())) { - insuranceAccountDetailPO.setOtherComSum(map.get("其他福利单位合计").toString()); + if (!StringUtils.isEmpty(baseMap.getOrDefault("其他福利单位合计", "").toString())) { + insuranceAccountDetailPO.setOtherComSum(baseMap.get("其他福利单位合计").toString()); } + if (!StringUtils.isEmpty(baseMap.getOrDefault("账单月份", "").toString())) { + insuranceAccountDetailPO.setBillMonth(baseMap.get("账单月份").toString()); + } + + insuranceAccountDetailPO.setUpdateTime(new Date()); + return insuranceAccountDetailPO; } /** * 对比新旧两份数据,并更新数据 - * @param newMap - * @param oldJson - * @return */ - private Map checkjsonMap(Map newMap, String oldJson) { - Map oldMap = JSON.parseObject(oldJson, new HashMap().getClass()); + private Map checkJsonMap(Map newMap, String oldJson) { + Map oldMap = JSON.parseObject(oldJson, HashMap.class); for (Map.Entry oldEntry : oldMap.entrySet()) { - + //保留无变动数据,更新已变动数据 if (!newMap.containsKey(oldEntry.getKey())) { newMap.put(oldEntry.getKey(), oldEntry.getValue()); } @@ -1399,10 +1372,10 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { /** * 校验福利核算的账单月份输入格式是否正确 */ - public boolean checkBillMonth(String billMonth) { - String connector = ""; + //校验内容:billMonth的长度是否为7、年月连接符是否为“-” + String connector; if(billMonth.length() == 7){ connector = billMonth.substring(4,5); return "-".equals(connector); diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index e73c71446..0f1e2c7a3 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -9,6 +9,7 @@ import com.engine.salary.entity.salaryformula.param.SalaryFormulaFieldQueryParam import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.entity.siaccount.dto.InsuranceAccountTabDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; +import com.engine.salary.entity.siaccount.dto.InsuranceAcctDetailImportFieldDTO; import com.engine.salary.entity.siaccount.param.*; import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; @@ -394,26 +395,18 @@ public class SIAccountController { } /** - * 社保福利项列表 - * @param request - * @param response - * @return + * 社保福利(核算)项列表 */ @GET @Path("/getWelfareList") @Produces(MediaType.APPLICATION_JSON) public String getWelfareList(@Context HttpServletRequest request, @Context HttpServletResponse response) { User user = HrmUserVarify.getUser(request, response); - SalaryFormulaFieldQueryParam param = new SalaryFormulaFieldQueryParam(); - param.setSourceId("welfare"); - return new ResponseResult>(user).run(getSalaryFormulaWrapper(user)::fieldList, param); + return new ResponseResult>(user).run(getSalaryFormulaWrapper(user)::welfareList); } /** * 导出“福利核算导入”模板 - * @param request - * @param response - * @return */ @GET @Path("/welfare/importtemplate/export") @@ -422,9 +415,9 @@ public class SIAccountController { try { InsuranceAcctDetailImportTemplateParam param = new InsuranceAcctDetailImportTemplateParam(); - String salaryItemIds = request.getParameter("salaryItemIds"); - if (StringUtils.isNotBlank(salaryItemIds)) { - param.setSalaryItemIds(Arrays.stream(salaryItemIds.split(",")).map(Long::valueOf).collect(Collectors.toList())); + String welfareNames = request.getParameter("welfareNames"); + if (StringUtils.isNotBlank(welfareNames)) { + param.setWelfareNames(Arrays.stream(welfareNames.split(",")).map(String::valueOf).collect(Collectors.toList())); } User user = HrmUserVarify.getUser(request, response); @@ -449,12 +442,15 @@ public class SIAccountController { } + /** + * 将通过“福利核算导入”模板导入的数据更新到hrsa_bill_detail表中 + */ @POST @Path("/welfare/importInsuranceAcctDetail") @Produces(MediaType.APPLICATION_JSON) - public String importInsuranceAcctDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody InsuranceAcctImportParam importParam) { + public String importInsuranceAcctDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody InsuranceAcctImportParam insuranceAcctImportParam) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult>(user).run(getService(user)::importInsuranceAcctDetail, importParam); + return new ResponseResult>(user).run(getService(user)::importInsuranceAcctDetail, insuranceAcctImportParam); } } diff --git a/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java b/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java index c50dd6df9..ddd692fad 100644 --- a/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java @@ -2,6 +2,7 @@ package com.engine.salary.wrapper; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.biz.SalaryItemBiz; import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.bo.SalaryFormulaBO; import com.engine.salary.entity.salaryformula.dto.ExpressFormulaDTO; @@ -9,6 +10,8 @@ import com.engine.salary.entity.salaryformula.param.SalaryFormulaFieldQueryParam import com.engine.salary.entity.salaryformula.param.SalaryFormulaSaveParam; import com.engine.salary.entity.salaryformula.po.FormulaPO; import com.engine.salary.entity.salaryformula.po.FormulaVar; +import com.engine.salary.entity.salaryitem.po.SalaryItemPO; +import com.engine.salary.entity.siaccount.dto.InsuranceAcctDetailImportFieldDTO; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.RemoteExcelService; import com.engine.salary.service.SalaryFormulaService; @@ -18,10 +21,7 @@ import org.apache.commons.collections4.CollectionUtils; import weaver.hrm.User; import weaver.servicefiles.DataSourceXML; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 薪资项目 @@ -41,6 +41,7 @@ public class SalaryFormulaWrapper extends Service { return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user); } + private SalaryItemBiz salaryItemBiz = new SalaryItemBiz(); /** * 公式字段列表 @@ -80,4 +81,25 @@ public class SalaryFormulaWrapper extends Service { ArrayList pointArrayList = dataSourceXML.getPointArrayList(); return pointArrayList; } + + /** + * 获取薪资项目中福利类项目 + */ + public List welfareList() { + + List welfareList = new ArrayList<>(); + SalaryFormulaFieldQueryParam param = new SalaryFormulaFieldQueryParam(); + param.setSourceId("welfare"); + //获取福利类薪资项目 + List list = getRemoteExcelService(user).fieldList(param.getSourceId(), param.getExtendParam()); + //提取出福利类项目名称 + for(FormulaVar formulaVar : list) { + InsuranceAcctDetailImportFieldDTO insuranceAcctDetailImportFieldDTO = new InsuranceAcctDetailImportFieldDTO(); +// insuranceAcctDetailImportFieldDTO.setFieldId(formulaVar.getFieldId()); + insuranceAcctDetailImportFieldDTO.setSalaryItemName(formulaVar.getName()); + welfareList.add(insuranceAcctDetailImportFieldDTO); + + } + return welfareList; + } }