diff --git a/src/com/engine/salary/constant/SalaryItemConstant.java b/src/com/engine/salary/constant/SalaryItemConstant.java index 790a288cb..26bac736b 100644 --- a/src/com/engine/salary/constant/SalaryItemConstant.java +++ b/src/com/engine/salary/constant/SalaryItemConstant.java @@ -20,5 +20,10 @@ public class SalaryItemConstant { */ public static final String RESULT_IMPORT_FIELD_SIGN="_salaryAcctResultImportFieldSign"; + /** + * 薪资核算导出缓存表头字段key + */ + public static final String RESULT_EXPORT_FIELD_SIGN="_salaryAcctResultExportFieldSign"; + } diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java index 21221a4b3..939163a9d 100644 --- a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java @@ -57,4 +57,7 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam { private Collection ids; private String workcode; + + //薪资项目id + private Collection salaryItemIds; } diff --git a/src/com/engine/salary/service/SalaryAcctExcelService.java b/src/com/engine/salary/service/SalaryAcctExcelService.java index 147c38eea..25dbc0d18 100644 --- a/src/com/engine/salary/service/SalaryAcctExcelService.java +++ b/src/com/engine/salary/service/SalaryAcctExcelService.java @@ -73,6 +73,14 @@ public interface SalaryAcctExcelService { */ SalaryAcctImportFieldDTO getImportField(Long salaryAcctId); + /** + * 薪资核算导出时候薪资项目按取值方式分组 + * + * @param salaryAcctId + * @return + */ + SalaryAcctImportFieldDTO getExportField(Long salaryAcctId); + /** * 下载薪资核算导入模板 * @@ -110,6 +118,8 @@ public interface SalaryAcctExcelService { void cacheImportField(List salaryItems); + void cacheExportField(List salaryItems); + // // /** // * 薪资核算结果校验异常导出 diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index 6cba27124..486073fbf 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -287,12 +287,38 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc List headerColumnGroup = Lists.newArrayList(); // 查询列表的表头 List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); - parseHeader(headerColumnGroup, weaTableColumns); + + //判断是否按照自定义字段导出表头 + List finalWeaTableColumns = new ArrayList<>(); + if (queryParam.getSalaryItemIds() != null ) { + // 必须选择导出所需的薪资项目 + if (CollectionUtils.isEmpty(queryParam.getSalaryItemIds())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的薪资项目")); + } + List headerRangeList = new ArrayList<>(); + List salaryItemPOS = getSalaryItemService(user).listByIds(queryParam.getSalaryItemIds()); + for (SalaryItemPO salaryItemPO : salaryItemPOS) { + headerRangeList.add(salaryItemPO.getId().toString()); + } + for (WeaTableColumnGroup tableColumn : weaTableColumns) { + WeaTableColumnGroup columnGroupItem = (WeaTableColumnGroup) tableColumn; + if (columnGroupItem.getChildren() != null) { + List childrenColumns = columnGroupItem.getChildren().stream().filter(f -> headerRangeList.contains(f.getColumn())).collect(Collectors.toList()); + if (childrenColumns.size() > 0) { + columnGroupItem.setChildren(childrenColumns); + finalWeaTableColumns.add(columnGroupItem); + } + } else if (headerRangeList.contains(columnGroupItem.getColumn())) { + finalWeaTableColumns.add(columnGroupItem); + } + + } + } else { + finalWeaTableColumns = weaTableColumns; + } +// parseHeader(headerColumnGroup, weaTableColumns); + parseHeader(headerColumnGroup, finalWeaTableColumns); // // excel导出的表头 -// String[] headers = headerColumnGroup.stream() -// .map(WeaTableColumn::getText) -// .toArray(String[]::new); -// List headerList = new ArrayList<>(Arrays.asList(headers)); List headerList = new ArrayList<>(weaTableColumns); // 查询薪资核算结果 List> resultMapList = getSalaryAcctResultService(user).listByParam(queryParam); @@ -461,6 +487,70 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc return SalaryAcctImportFieldDTO.builder().itemsByGroup(itemsByGroup).checkItems(checkItems).build(); } + @Override + public SalaryAcctImportFieldDTO getExportField(Long salaryAcctRecordId) { + // 查询薪资核算记录 + SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); + if (Objects.isNull(salaryAcctRecordPO)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); + } + // 查询薪资核算记录所用的薪资账套的薪资项目副本 + List salarySobItems = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); + Set salaryItemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId); + // 查询薪资项目 + List salaryItems = getSalaryItemService(user).listByIds(salaryItemIds); + Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId); + + Map> salarySobItemPOMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId); + + // 查询薪资账套的薪资项目分类 + List salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); + // 对分组进行排序 + salarySobItemGroupPOS = SalaryAcctResultBO.sortGroup(salarySobItemGroupPOS); + // 对分组内薪资项目排序 + SalaryAcctResultBO.sortItem(salarySobItemPOMap); + // 根据账套分组封装薪资项目的值 + List itemsByGroup = new ArrayList<>(); + for(SalarySobItemGroupPO groupPO : salarySobItemGroupPOS){ + List groupItems = salarySobItemPOMap.getOrDefault(groupPO.getId(),Collections.emptyList()); + List items = groupItems.stream() + .map(salarySobItemPO -> SalaryAcctImportFieldDTO.ImportFieldDTO.builder() + .salaryItemId(salarySobItemPO.getSalaryItemId()) + .salaryItemName(Optional.ofNullable(salaryItemMap.get(salarySobItemPO.getSalaryItemId())).map(SalaryItemPO::getName).orElse(StringUtils.EMPTY)) + .build()) + .collect(Collectors.toList()); + + itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder() + .salarySobItemGroupId(groupPO.getId()) + .salarySobItemGroupName(groupPO.getName()) + .salaryItems(items) + .sortedIndex(groupPO.getSortedIndex()).build() ); + } + // 未分类 + List noGroupItems = salarySobItemPOMap.getOrDefault(0L, Collections.emptyList()); + if(CollectionUtils.isNotEmpty(noGroupItems)){ + List items = noGroupItems.stream() + .map(salarySobItemPO ->SalaryAcctImportFieldDTO.ImportFieldDTO.builder() + .salaryItemId(salarySobItemPO.getSalaryItemId()) + .salaryItemName(Optional.ofNullable(salaryItemMap.get(salarySobItemPO.getSalaryItemId())).map(SalaryItemPO::getName).orElse(StringUtils.EMPTY)) + .build()) + .collect(Collectors.toList()); + + itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder() + .salarySobItemGroupId(0L) + .salarySobItemGroupName("未分类") + .salaryItems(items) + .sortedIndex(itemsByGroup.size()).build()); + } + // 缓存勾选 + String cacheKey = user.getUID() + SalaryItemConstant.RESULT_EXPORT_FIELD_SIGN; + String cacheValue = (String)Util_DataCache.getObjVal(cacheKey); + List checkItems = JsonUtil.parseList(cacheValue, Long.class) == null ? new ArrayList<>() : JsonUtil.parseList(cacheValue, Long.class); + // 转换成dto +// return SalaryAcctImportFieldDTO.builder().formulaItems(formulaItems).sqlItems(sqlItems).inputItems(inputItems).checkItems(checkItems).build(); + return SalaryAcctImportFieldDTO.builder().itemsByGroup(itemsByGroup).checkItems(checkItems).build(); + } + @Override public XSSFWorkbook exportImportTemplate(SalaryAcctImportTemplateParam param) { ValidUtil.doValidator(param); @@ -697,6 +787,12 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems)); } + @Override + public void cacheExportField(List salaryItems) { + String cacheKey = user.getUID() + SalaryItemConstant.RESULT_EXPORT_FIELD_SIGN; + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems)); + } + @Override public Map previewImportSalaryAcctResult(SalaryAcctImportParam param) { diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 8df680db0..3167e4e1c 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -481,6 +481,38 @@ public class SalaryAcctController { } } + //导出核算结果(自定义导出字段) + @GET + @Path("/acctresult/exportWithCustomFields") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportSalaryAcctResultWithCustomFields(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + SalaryAcctResultQueryParam param = new SalaryAcctResultQueryParam(); + setSalaryAcctResultQueryParam(request, param); + 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 = getSalaryAcctExcelWrapper(user).exportSalaryAcctResult(param); + String fileName = "薪资核算结果" + LocalDate.now(); + 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; + } + } + //导入核算结果前生成导入模板时可选的薪资项目 @GET @@ -491,6 +523,15 @@ public class SalaryAcctController { return new ResponseResult(user).run(getSalaryAcctExcelService(user)::getImportField, salaryAcctRecordId); } + //导出核算结果前生成可选的薪资项目 + @GET + @Path("/acctresult/exportField") + @Produces(MediaType.APPLICATION_JSON) + public String exportField(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryAcctRecordId") Long salaryAcctRecordId) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalaryAcctExcelService(user)::getExportField, salaryAcctRecordId); + } + // 薪资核算导入字段缓存 @POST @Path("/acctresult/cacheImportField") @@ -500,6 +541,15 @@ public class SalaryAcctController { return new ResponseResult, String>(user).run(getSalaryAcctExcelService(user)::cacheImportField, param.getSalaryItems()); } + // 薪资核算导出字段缓存 + @POST + @Path("/acctresult/cacheExportField") + @Produces(MediaType.APPLICATION_JSON) + public String cacheExportField(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctImportParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, String>(user).run(getSalaryAcctExcelService(user)::cacheExportField, param.getSalaryItems()); + } + //导出导入模板 @GET @Path("/acctresult/importtemplate/export")