From 3fa017b13ac87cabd2c184e939fa437fb75e21c7 Mon Sep 17 00:00:00 2001 From: sy Date: Tue, 6 Dec 2022 11:44:04 +0800 Subject: [PATCH 01/20] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=A1=A5=E5=B7=AE?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E9=A1=B9=E5=88=97=E8=A1=A8=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=92=8C=E8=A1=A5=E5=B7=AE=E6=A8=A1=E6=9D=BF=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/SIAccountService.java | 5 ++- .../service/impl/SIAccountServiceImpl.java | 44 +++++++++++++++++++ .../salary/web/SIAccountController.java | 14 ++++++ .../salary/wrapper/SalaryFormulaWrapper.java | 11 +++++ 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/SIAccountService.java b/src/com/engine/salary/service/SIAccountService.java index f4cb5b59a..db3cf5a13 100644 --- a/src/com/engine/salary/service/SIAccountService.java +++ b/src/com/engine/salary/service/SIAccountService.java @@ -140,7 +140,6 @@ public interface SIAccountService { /** * tab信息 - * @param billMonth */ InsuranceAccountTabDTO tabList(AccountParam build); @@ -260,5 +259,9 @@ public interface SIAccountService { */ void editAccount(EditAccountDetailParam param); + /** + * 导出“福利核算-补差导入模板” + */ + XSSFWorkbook exportBalanceImportTemplate(InsuranceAcctDetailImportTemplateParam param); } diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index b59e86774..5c34035c3 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -2475,4 +2475,48 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { insuranceAccountDetailPO.setTotal(perSum.add(comSum).toPlainString()); return insuranceAccountDetailPO; } + + /** + * 导出“福利核算-补差导入”模板 + */ + @Override + public XSSFWorkbook exportBalanceImportTemplate(InsuranceAcctDetailImportTemplateParam param) { + ValidUtil.doValidator(param); + + // 必须选择导入模板所需的薪资项目(福利项) + if (CollectionUtils.isEmpty(param.getWelfareNames())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的福利项目核算项")); + } + + // 模板表头(默认必带"个税扣缴义务人"、"姓名") + List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), + "部门", + SalaryI18nUtil.getI18nLabel(86186, "手机号"), + SalaryI18nUtil.getI18nLabel(86317, "工号"), + SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人") + ); + List dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName"); + // 查询福利核算项目 + List welfareNames = (List) param.getWelfareNames(); + headerList.addAll(welfareNames); + +// //查询当前已有的补缴数据 +// List> resultMapList = getSupplyDataByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); +// // excel导出的数据 +// List> rows = Lists.newArrayListWithExpectedSize(resultMapList.size()); +// rows.add(headerList); +// for (Map map : resultMapList) { +// List row = Lists.newArrayListWithExpectedSize(headerList.size()); +// for (String dataIndex : dataIndexList) { +// row.add(map.getOrDefault(dataIndex, StringUtils.EMPTY)); +// } +// rows.add(row); +// } + + List> rows = new ArrayList<>(); + rows.add(headerList); + + String sheetName = "福利核算-补差导入模板"; + return ExcelUtil.genWorkbookV2(rows, sheetName); + } } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index 790c125f0..d206d9cfc 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -786,4 +786,18 @@ public class SIAccountController { } // **********************************调差 end*********************************/ + + // **********************************补差 start*********************************/ + /** + * 福利台账-补差福利项列表 + */ + @GET + @Path("/getBalanceWelfareList") + @Produces(MediaType.APPLICATION_JSON) + public String getBalanceWelfareList(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryFormulaWrapper(user)::balanceWelfareList); + } + + // **********************************补差 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java b/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java index 5e66d5c9a..95375091c 100644 --- a/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryFormulaWrapper.java @@ -22,6 +22,7 @@ import weaver.hrm.User; import weaver.servicefiles.DataSourceXML; import java.util.*; +import java.util.stream.Collectors; /** * 薪资项目 @@ -108,4 +109,14 @@ public class SalaryFormulaWrapper extends Service { return welfareList; } + + /** + * 获取福利台账的补差-福利类项目 + */ + public List balanceWelfareList() { + + List welfareList = welfareList(); + welfareList = welfareList.stream().filter(f -> !f.getSalaryItemName().contains("合计")).collect(Collectors.toList()); + return welfareList; + } } From ccfffc200e1f436a4a9aa90f9153321286dd583e Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 7 Dec 2022 17:09:53 +0800 Subject: [PATCH 02/20] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=A1=A5=E5=B7=AE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../param/InsuranceAcctImportParam.java | 2 + .../enums/siaccount/ResourceFromEnum.java | 4 +- .../InsuranceAccountDetailMapper.java | 5 + .../InsuranceAccountDetailMapper.xml | 17 + .../mapper/siarchives/FundSchemeMapper.java | 9 +- .../mapper/siarchives/FundSchemeMapper.xml | 11 +- .../siarchives/InsuranceBaseInfoMapper.java | 5 + .../siarchives/InsuranceBaseInfoMapper.xml | 10 + .../mapper/siarchives/SocialSchemeMapper.java | 9 +- .../mapper/siarchives/SocialSchemeMapper.xml | 11 +- .../salary/service/SIAccountService.java | 5 + .../service/impl/SIAccountServiceImpl.java | 445 ++++++++++++++++++ .../salary/web/SIAccountController.java | 49 ++ 13 files changed, 577 insertions(+), 5 deletions(-) diff --git a/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java index efd46abca..5f690e8db 100644 --- a/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java +++ b/src/com/engine/salary/entity/siaccount/param/InsuranceAcctImportParam.java @@ -22,4 +22,6 @@ public class InsuranceAcctImportParam { */ @DataCheck(require = true,message = "imageId为空") String imageId; + + private String billMonth; } diff --git a/src/com/engine/salary/enums/siaccount/ResourceFromEnum.java b/src/com/engine/salary/enums/siaccount/ResourceFromEnum.java index 33f7814aa..7b50b909d 100644 --- a/src/com/engine/salary/enums/siaccount/ResourceFromEnum.java +++ b/src/com/engine/salary/enums/siaccount/ResourceFromEnum.java @@ -12,7 +12,9 @@ public enum ResourceFromEnum implements BaseEnum { SYSTEM(0, "系统核算", 92268), - Temporary(1, "临时", 92269); + Temporary(1, "临时", 92269), + + IMPORT(2,"导入",87622); private Integer value; diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java index 738208c58..94843ff71 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java @@ -171,4 +171,9 @@ public interface InsuranceAccountDetailMapper { * 获取数据(账单月份+缴纳状态+人员id+个税扣缴义务人) */ InsuranceAccountDetailPO getOneByBpep(InsuranceAccountDetailPO po); + + /** + * 获取补差数据(账单月份+人员id+个税扣缴义务人) + */ + List queryBalanceList(InsuranceAccountDetailPO po); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index 4901c5000..c8f99f6e9 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -1213,4 +1213,21 @@ AND t.payment_organization = #{paymentOrganization} AND t.employee_id = #{employeeId} + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java index cfee53a1c..a6043041c 100644 --- a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java +++ b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java @@ -32,12 +32,19 @@ public interface FundSchemeMapper { /** - * 根据id获取 + * 根据ids获取多条 * @param ids * @return */ List getFundById(@Param("ids")List ids); + /** + * 根据id获取单条 + * @param id + * @return + */ + InsuranceArchivesFundSchemePO getOneById(@Param("id")Long id); + /** * 批量删除 * @param singletonList diff --git a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml index 00d4e32f9..e38f50f35 100644 --- a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml @@ -68,7 +68,7 @@ AND payment_organization = #{param.paymentOrganization} - + + + + UPDATE hrsa_fund_archives diff --git a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java index 207649a61..f159a7c20 100644 --- a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java +++ b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java @@ -81,6 +81,11 @@ public interface InsuranceBaseInfoMapper { */ List getAbnormalList(@Param("param") InsuranceArchivesListParam param); + /** + * 根据个税扣缴义务人和人员id获取单条数据 + */ + InsuranceArchivesBaseInfoPO getOneByEmployeeIdAndPayOrg(@Param("paymentOrganization")Long paymentOrganization, @Param("employeeId")Long employeeId); + /** * 根据ids重置runStatus * @param po diff --git a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml index fa6462426..a1647a502 100644 --- a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml @@ -238,6 +238,16 @@ + + UPDATE hrsa_insurance_base_info diff --git a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java index d663b4471..5e6aa828b 100644 --- a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java +++ b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java @@ -32,12 +32,19 @@ public interface SocialSchemeMapper { List getSocialByEmployeeIdAndPayOrg(@Param("param")InsuranceArchivesEmployeePO insuranceArchivesEmployeePO); /** - * 根据id获取 + * 根据ids获取多条 * @param ids * @return */ List getSocialById(@Param("ids")List ids); + /** + * 根据id获取单条 + * @param id + * @return + */ + InsuranceArchivesSocialSchemePO getOneById(@Param("id")Long id); + /** * 批量删除 * @param singletonList diff --git a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml index b56512c37..d9de5a6dc 100644 --- a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml @@ -65,7 +65,7 @@ AND payment_organization = #{param.paymentOrganization} - + + + + UPDATE hrsa_social_archives diff --git a/src/com/engine/salary/service/SIAccountService.java b/src/com/engine/salary/service/SIAccountService.java index db3cf5a13..a96f7157d 100644 --- a/src/com/engine/salary/service/SIAccountService.java +++ b/src/com/engine/salary/service/SIAccountService.java @@ -263,5 +263,10 @@ public interface SIAccountService { * 导出“福利核算-补差导入模板” */ XSSFWorkbook exportBalanceImportTemplate(InsuranceAcctDetailImportTemplateParam param); + + /** + * 将福利台账-补差模板导入的数据更新到数据库 + */ + Map importBalanceInsuranceDetail(InsuranceAcctImportParam importParam); } diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index 5c34035c3..a431edf01 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -27,18 +27,23 @@ import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountInspectPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesBaseInfoPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; +import com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO; +import com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO; import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.entity.sischeme.po.InsuranceSchemePO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.siaccount.*; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.enums.sicategory.WelfareTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.siaccount.ExcelInsuranceDetailMapper; 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.siarchives.FundSchemeMapper; import com.engine.salary.mapper.siarchives.InsuranceBaseInfoMapper; +import com.engine.salary.mapper.siarchives.SocialSchemeMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.mapper.sischeme.InsuranceSchemeMapper; import com.engine.salary.mapper.sys.SalarySysConfMapper; @@ -73,6 +78,7 @@ import weaver.hrm.User; import java.io.InputStream; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -157,6 +163,14 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { return MapperProxyFactory.getProxy(InsuranceBaseInfoMapper.class); } + private SocialSchemeMapper getSocialSchemeMapper() { + return MapperProxyFactory.getProxy(SocialSchemeMapper.class); + } + + private FundSchemeMapper getFundSchemeMapper() { + return MapperProxyFactory.getProxy(FundSchemeMapper.class); + } + private EmployBiz employeeBiz = new EmployBiz(); private TaxAgentBiz taxAgentBiz = new TaxAgentBiz(); @@ -2519,4 +2533,435 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { String sheetName = "福利核算-补差导入模板"; return ExcelUtil.genWorkbookV2(rows, sheetName); } + + /** + * 将福利台账-补差模板导入的数据更新到数据库 + */ + @Override + public Map importBalanceInsuranceDetail(InsuranceAcctImportParam importParam) { + long currentEmployeeId = user.getUID(); +// Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); + + Map apidatas = new HashMap(); + EmployBiz employBiz = new EmployBiz(); + + //查询对于人员信息导入筛选的全局配置 + SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); + String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; + //检验参数 + //excel文件id + String imageId = Util.null2String(importParam.getImageId()); + + if (StringUtils.isBlank(imageId)) { + throw new SalaryRunTimeException("文件不存在"); + } +// // 获取所有个税扣缴义务人 +// List taxAgents = getTaxAgentService(user).listAll(); +// Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); + + // 获取租户下所有的人员 + List salaryEmployees = employBiz.listEmployee(); + + List insuranceCategoryPOS = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll(); + // 失败的数量 + 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 SalaryRunTimeException("表头为空"); + } + if (CollectionUtils.isEmpty(data)) { + throw new SalaryRunTimeException("无数据"); + } + //存储待更新的InsuranceAccountDetailPO数据 + List updateInsuranceAccountDetailList = new ArrayList<>(); + + //存储待新增的InsuranceAccountDetailPO数据 + List createInsuranceAccountDetailList = new ArrayList<>(); + + String billMonth = importParam.getBillMonth(); + //遍历excel表具体数据 + for (int i = 0; i < data.size(); i++) { + + String row = "第" + (i + 2) + "行"; + + boolean isError = false; + Map map = data.get(i); + Long employeeId = 0L; +// Long taxAgentId = 0L; + + List list = new ArrayList<>(); + + + 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); + } + + List> singleAccount = new ArrayList<>(); + + //遍历表头 + for (int j = 0; j < headers.size(); j++) { + String header = headers.get(j); + String dataKey = header; + if (dataKey == null) { + continue; + } + //组装单条数据基础数据 + Map cellData = new HashMap<>(); + cellData.put(dataKey, Optional.ofNullable(map.get(dataKey)).orElse("").toString()); + cellData.put("index", j); + singleAccount.add(cellData); + //抽取人员信息进行校验 + String name = (String) map.getOrDefault("姓名", ""); + String departmentName = (String) map.getOrDefault("部门", ""); + String mobile = (String) map.getOrDefault("手机号", ""); + String workcode = (String) map.getOrDefault("工号", ""); + + + if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { + //当人员信息导入筛选的全局配置为"0"时,姓名才是必填项 + if (StringUtils.isEmpty(name) && "0".equals(confValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); + excelComments.add(errorMessageMap); + + } else { + //筛选导入人员信息可以在人力资源池中匹配到的人员信息 + List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, name, departmentName, mobile, workcode, null); + + if (CollectionUtils.isEmpty(employeeSameIds)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); + excelComments.add(errorMessageMap); + + } 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(); + } + } + } + + + } + + if (!isError){ + + //如果福利核算信息查询不到唯一匹配数据,不支持导入 + //根据员工id、个税扣缴义务人id、账单月份查询补差数据 + list = getInsuranceAccountDetailMapper().queryBalanceList(InsuranceAccountDetailPO.builder() + .employeeId(employeeId) + .paymentOrganization(paymentOrganization) + .billMonth(billMonth) + .build()); + + if (list.isEmpty()) { + //新增数据情况 + InsuranceAccountDetailPO createPO = buildBalanceAccountDetail(paymentOrganization, insuranceCategoryPOS, singleAccount, billMonth, employeeId, currentEmployeeId); + createInsuranceAccountDetailList.add(createPO); + } else if (list.size() > 1) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "该人员在当前账单月已存在多组补差数据,请删除数据库中多余项")); + excelComments.add(errorMessageMap); + } else { + //更新数据情况 + //拼装待更新数据 + InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); + updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map)); + } + + } + + if (isError) { + failCount++; + errorDatas.add(map); + } else { + successCount++; + } + + } + Long paymentOrganization = null; + if (updateInsuranceAccountDetailList.size() > 0) { + paymentOrganization = updateInsuranceAccountDetailList.get(0).getPaymentOrganization(); + //将待更新列表加密 + InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(updateInsuranceAccountDetailList); + //更新 + for(InsuranceAccountDetailPO po : updateInsuranceAccountDetailList) { + getSiAccountBiz(user).updateByEmployeeIdAndBillMonth(po); + } + } + if (createInsuranceAccountDetailList.size() > 0) { + paymentOrganization = createInsuranceAccountDetailList.get(0).getPaymentOrganization(); + //将待新增列表加密 + InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(createInsuranceAccountDetailList); + //新增 + List> createPartition = Lists.partition((List) createInsuranceAccountDetailList, 20); + createPartition.forEach(getInsuranceAccountDetailMapper()::batchSaveAccountDetails); + } + + //刷新bill_batch表中统计信息 + refreshBillBatch(paymentOrganization, importParam.getBillMonth()); + + apidatas.put("successCount", successCount); + apidatas.put("errorCount", failCount); + apidatas.put("errorData", excelComments); + + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + + public InsuranceAccountDetailPO buildBalanceAccountDetail(Long paymentOrganization, List insuranceCategoryPOS, + List> singleAccount, String billMonth, Long employeeId, Long creator) { + InsuranceAccountDetailPO insuranceAccountDetailPO = new InsuranceAccountDetailPO(); + insuranceAccountDetailPO.setId(IdGenerator.generate()); + insuranceAccountDetailPO.setEmployeeId(employeeId); + insuranceAccountDetailPO.setBillMonth(billMonth); + insuranceAccountDetailPO.setBillStatus(BillStatusEnum.NOT_ARCHIVED.getValue()); + insuranceAccountDetailPO.setPaymentStatus(PaymentStatusEnum.BALANCE.getValue()); + insuranceAccountDetailPO.setResourceFrom(ResourceFromEnum.IMPORT.getValue()); + + insuranceAccountDetailPO.setCreator(creator); + insuranceAccountDetailPO.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue()); + insuranceAccountDetailPO.setCreateTime(new Date()); + insuranceAccountDetailPO.setUpdateTime(new Date()); + insuranceAccountDetailPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); + insuranceAccountDetailPO.setPaymentOrganization(paymentOrganization); + insuranceAccountDetailPO.setSocialPayOrg(paymentOrganization); + insuranceAccountDetailPO.setFundPayOrg(paymentOrganization); + insuranceAccountDetailPO.setOtherPayOrg(paymentOrganization); + + InsuranceArchivesBaseInfoPO baseInfoPO = getInsuranceBaseInfoMapper().getOneByEmployeeIdAndPayOrg(employeeId, paymentOrganization); + if (baseInfoPO != null) { + InsuranceArchivesSocialSchemePO socialSchemePO = getSocialSchemeMapper().getOneById(baseInfoPO.getSocialArchivesId()); + + InsuranceArchivesFundSchemePO fundSchemePO = getFundSchemeMapper().getOneById(baseInfoPO.getFundArchivesId()); + if (socialSchemePO != null) { + insuranceAccountDetailPO.setSocialAccount(socialSchemePO.getSocialAccount()); + } + if (fundSchemePO != null) { + insuranceAccountDetailPO.setFundAccount(fundSchemePO.getFundAccount()); + insuranceAccountDetailPO.setSupplementFundAccount(fundSchemePO.getSupplementFundAccount()); + } + } + + //获取改员工社保档案 + accountBalanceSocial(singleAccount, insuranceAccountDetailPO, insuranceCategoryPOS, creator); + accountBalanceFund(singleAccount, insuranceAccountDetailPO, insuranceCategoryPOS, creator); + // 其他福利档案 + accountBalanceOther(singleAccount, insuranceAccountDetailPO, insuranceCategoryPOS, creator); + account((insuranceAccountDetailPO)); + if (insuranceAccountDetailPO.getOtherSchemeId() == null) { + insuranceAccountDetailPO.setOtherSchemeId(0L); + } + if (insuranceAccountDetailPO.getSocialSchemeId() == null) { + insuranceAccountDetailPO.setSocialSchemeId(0L); + } + if (insuranceAccountDetailPO.getFundSchemeId() == null) { + insuranceAccountDetailPO.setFundSchemeId(0L); + } + return insuranceAccountDetailPO; + } + + public InsuranceAccountDetailPO accountBalanceSocial(List> singleAccount, InsuranceAccountDetailPO insuranceAccountDetailPO, + List insuranceCategoryPOS, Long employeeId) { + //社保-个人 + List socialCategory = insuranceCategoryPOS.stream().filter(po -> po.getWelfareType().equals(WelfareTypeEnum.SOCIAL_SECURITY.getValue())) + .collect(Collectors.toList()); + List socialPer = new ArrayList<>(); + Map socialPerJsonMap = new HashMap<>(); + for (int i = 0; i < singleAccount.size(); i++) { + Map stringObjectMap = singleAccount.get(i); + Optional personalOptional = socialCategory.stream() + .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人"))).findFirst(); + if (personalOptional.isPresent() && StringUtils + .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")))) { + String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")); + perNumString = perNumString.replace(",", ""); + BigDecimal result = new BigDecimal(perNumString); + socialPerJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); + socialPer.add(result); + } + } + insuranceAccountDetailPO.setSocialPerJson(JSON.toJSONString(socialPerJsonMap)); + BigDecimal socialPerSum = new BigDecimal("0"); + for (BigDecimal bigDecimal : socialPer) { + socialPerSum = socialPerSum.add(bigDecimal); + } + insuranceAccountDetailPO.setSocialPerSum(socialPerSum.toPlainString()); + + //社保-单位 + List socialCom = new ArrayList<>(); + Map sociaComJsonMap = new HashMap<>(); + for (int i = 0; i < singleAccount.size(); i++) { + Map stringObjectMap = singleAccount.get(i); + Optional personalOptional = socialCategory.stream() + .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位"))).findFirst(); + if (personalOptional.isPresent() && StringUtils + .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")))) { + String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")); + perNumString = perNumString.replace(",", ""); + BigDecimal result = new BigDecimal(perNumString); + sociaComJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); + socialCom.add(result); + } + } + insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(sociaComJsonMap)); + BigDecimal socialComSum = new BigDecimal("0"); + for (BigDecimal decimal : socialCom) { + socialComSum = socialComSum.add(decimal); + } + insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); + return insuranceAccountDetailPO; + } + + public InsuranceAccountDetailPO accountBalanceFund(List> singleAccount, InsuranceAccountDetailPO insuranceAccountDetailPO, + List insuranceCategoryPOS, Long employeeId) { + //公积金-个人 + List fundCategory = insuranceCategoryPOS.stream().filter(po -> po.getWelfareType().equals(WelfareTypeEnum.ACCUMULATION_FUND.getValue())) + .collect(Collectors.toList()); + List fundPer = new ArrayList<>(); + Map fundPerJsonMap = new HashMap<>(); + for (int i = 0; i < singleAccount.size(); i++) { + Map stringObjectMap = singleAccount.get(i); + Optional personalOptional = fundCategory.stream() + .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人"))).findFirst(); + if (personalOptional.isPresent() && StringUtils + .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")))) { + String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")); + perNumString = perNumString.replace(",", ""); + BigDecimal result = new BigDecimal(perNumString); + fundPerJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); + fundPer.add(result); + } + } + insuranceAccountDetailPO.setFundPerJson(JSON.toJSONString(fundPerJsonMap)); + BigDecimal funPerSum = new BigDecimal("0"); + for (BigDecimal bigDecimal : fundPer) { + funPerSum = funPerSum.add(bigDecimal); + } + insuranceAccountDetailPO.setFundPerSum(funPerSum.toPlainString()); + + //公积金-单位 + List fundComList = new ArrayList<>(); + Map fundComJsonMap = new HashMap<>(); + for (int i = 0; i < singleAccount.size(); i++) { + Map stringObjectMap = singleAccount.get(i); + Optional personalOptional = fundCategory.stream() + .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位"))).findFirst(); + if (personalOptional.isPresent() && StringUtils + .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")))) { + String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")); + perNumString = perNumString.replace(",", ""); + BigDecimal result = new BigDecimal(perNumString); + fundComJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); + fundComList.add(result); + } + } + insuranceAccountDetailPO.setFundComJson(JSON.toJSONString(fundComJsonMap)); + BigDecimal fundComSum = new BigDecimal("0"); + for (BigDecimal bigDecimal : fundComList) { + fundComSum = fundComSum.add(bigDecimal); + } + insuranceAccountDetailPO.setFundComSum(fundComSum.toPlainString()); + return insuranceAccountDetailPO; + } + + public InsuranceAccountDetailPO accountBalanceOther(List> singleAccount, InsuranceAccountDetailPO insuranceAccountDetailPO, + List insuranceCategoryPOS, Long employeeId) { + List otherCategory = insuranceCategoryPOS.stream().filter(po -> po.getWelfareType().equals(WelfareTypeEnum.OTHER.getValue())) + .collect(Collectors.toList()); + // 其他福利-个人 + List otherPer = new ArrayList<>(); + Map otherPerJsonMap = new HashMap<>(); + for (int i = 0; i < singleAccount.size(); i++) { + Map stringObjectMap = singleAccount.get(i); + Optional personalOptional = otherCategory.stream() + .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人"))).findFirst(); + if (personalOptional.isPresent() && StringUtils + .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")))) { + String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(87159, "个人")); + perNumString = perNumString.replace(",", ""); + BigDecimal result = new BigDecimal(perNumString); + otherPerJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); + otherPer.add(result); + } + } + insuranceAccountDetailPO.setOtherPerJson(JSON.toJSONString(otherPerJsonMap)); + BigDecimal otherPerSum = new BigDecimal("0"); + for (BigDecimal bigDecimal : otherPer) { + otherPerSum = otherPerSum.add(bigDecimal); + } + insuranceAccountDetailPO.setOtherPerSum(otherPerSum.toPlainString()); + + // 其他福利-单位 + List otherComList = new ArrayList<>(); + Map otherComJsonMap = new HashMap<>(); + for (int i = 0; i < singleAccount.size(); i++) { + Map stringObjectMap = singleAccount.get(i); + Optional personalOptional = otherCategory.stream() + .filter(social -> stringObjectMap.containsKey(social.getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位"))).findFirst(); + if (personalOptional.isPresent() && StringUtils + .isNotBlank((String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")))) { + String perNumString = (String) stringObjectMap.get(personalOptional.get().getInsuranceName() + SalaryI18nUtil.getI18nLabel(100289, "单位")); + perNumString = perNumString.replace(",", ""); + BigDecimal result = new BigDecimal(perNumString); + otherComJsonMap.put(String.valueOf(personalOptional.get().getId()), result.toPlainString()); + otherComList.add(result); + } + } + insuranceAccountDetailPO.setOtherComJson(JSON.toJSONString(otherComJsonMap)); + BigDecimal otherComSum = new BigDecimal("0"); + for (BigDecimal bigDecimal : otherComList) { + otherComSum = otherComSum.add(bigDecimal); + } + insuranceAccountDetailPO.setOtherComSum(otherComSum.toPlainString()); + return insuranceAccountDetailPO; + } } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index d206d9cfc..ccd3d7840 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -799,5 +799,54 @@ public class SIAccountController { return new ResponseResult>(user).run(getSalaryFormulaWrapper(user)::balanceWelfareList); } + /** + * 导出“福利核算-补差导入”模板 + */ + @GET + @Path("/welfare/balanceimporttemplate/export") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportBalanceImportTemplate(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + InsuranceAcctDetailImportTemplateParam param = new InsuranceAcctDetailImportTemplateParam(); + + param.setPaymentOrganization(Long.valueOf(request.getParameter("paymentOrganization"))); + param.setBillMonth(request.getParameter("billMonth")); + 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); + XSSFWorkbook workbook = getService(user).exportBalanceImportTemplate(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; + } + + } + + /** + * 将通过“福利台账-补差导入”模板导入的数据更新到hrsa_bill_detail表中 + */ + @POST + @Path("/welfare/importBalanceInsuranceDetail") + @Produces(MediaType.APPLICATION_JSON) + public String importBalanceInsuranceDetail(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody InsuranceAcctImportParam insuranceAcctImportParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getService(user)::importBalanceInsuranceDetail, insuranceAcctImportParam); + } // **********************************补差 end*********************************/ } From f31e176cab8dc5e44511c87c5da821419bc2101c Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 7 Dec 2022 17:50:25 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8CbillBatch=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E6=8D=AE=E5=88=B7=E6=96=B0=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=88=E4=B8=8D=E9=9C=80=E8=A6=81=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E8=A1=A5=E5=B7=AE=E6=95=B0=E6=8D=AE=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=BA=BA=E6=95=B0=E4=BF=A1=E6=81=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 12 +++++-- .../InsuranceAccountDetailMapper.xml | 2 +- .../service/impl/SIAccountServiceImpl.java | 36 +------------------ 3 files changed, 11 insertions(+), 39 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 752388f6f..65967acf5 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -1734,7 +1734,9 @@ public class SIAccountBiz extends Service { BigDecimal otherPaySum = new BigDecimal("0"); for (InsuranceAccountDetailPO item : pos) { if (StringUtils.isNotBlank(item.getOtherSum()) && SalaryEntityUtil.string2DoubleDefault0(item.getOtherSum()) != 0.0) { - otherNum += 1; + if (!PaymentStatusEnum.BALANCE.getValue().equals(item.getPaymentStatus())) { + otherNum += 1; + } otherPaySum = otherPaySum.add(new BigDecimal(item.getOtherSum())); } } @@ -1747,7 +1749,9 @@ public class SIAccountBiz extends Service { BigDecimal fundPaySum = new BigDecimal("0"); for (InsuranceAccountDetailPO item : pos) { if (StringUtils.isNotBlank(item.getFundSum()) && SalaryEntityUtil.string2DoubleDefault0(item.getFundSum()) != 0.0) { - fundNum += 1; + if (!PaymentStatusEnum.BALANCE.getValue().equals(item.getPaymentStatus())) { + fundNum += 1; + } fundPaySum = fundPaySum.add(new BigDecimal(item.getFundSum())); } } @@ -1760,7 +1764,9 @@ public class SIAccountBiz extends Service { BigDecimal socialPaySum = new BigDecimal("0"); for (InsuranceAccountDetailPO item : pos) { if (StringUtils.isNotBlank(item.getSocialSum()) && SalaryEntityUtil.string2DoubleDefault0(item.getSocialSum()) != 0.0 ) { - socialNum += 1; + if (!PaymentStatusEnum.BALANCE.getValue().equals(item.getPaymentStatus())) { + socialNum += 1; + } socialPaySum = socialPaySum.add(new BigDecimal(item.getSocialSum())); } } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index c8f99f6e9..b77cc580f 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -268,7 +268,7 @@ + +