From 97a5d4ab91eb84fbe39883d5aa3ab63cdb8fdca4 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Wed, 15 Nov 2023 17:12:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=BF=E4=B8=8B=E5=AF=B9=E6=AF=94=E8=A1=A8?= =?UTF-8?q?=E5=A4=B4=E6=94=B9=E9=80=A0=E6=88=90=E5=88=86=E7=BB=84=E7=9A=84?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryacct/bo/SalaryAcctResultBO.java | 52 ++++++++- .../dto/SalaryComparisonResultListDTO.java | 4 +- .../impl/SalaryAcctExcelServiceImpl.java | 106 +++++++++++++----- .../SalaryComparisonResultServiceImpl.java | 6 +- .../salary/web/SalaryAcctController.java | 2 +- .../SalaryComparisonResultWrapper.java | 10 +- 6 files changed, 137 insertions(+), 43 deletions(-) diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java index 57b6e1927..d736bf37f 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java @@ -23,7 +23,6 @@ import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; -import com.engine.salary.util.page.Column; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; @@ -86,36 +85,77 @@ public class SalaryAcctResultBO { // } + /** * 构建薪资核算结果列表的表头(线下对比) * * @param salarySobItemAggregateDTO * @return */ - public static List buildTableColumns4ComparisonResult(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Set excludeSalaryItemIds) { - List columns = Lists.newArrayList(); + public static List buildTableColumns4ComparisonResult(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Set excludeSalaryItemIds) { + List columns = Lists.newArrayList(); // 员工信息字段 for (SalarySobEmpFieldDTO salarySobEmpFieldDTO : salarySobItemAggregateDTO.getEmpFields()) { - columns.add(new Column(salarySobEmpFieldDTO.getFieldName(), salarySobEmpFieldDTO.getFieldId(), salarySobEmpFieldDTO.getFieldId())); + columns.add(new WeaTableColumnGroup("150", salarySobEmpFieldDTO.getFieldName(), salarySobEmpFieldDTO.getFieldId(), salarySobEmpFieldDTO.getFieldId())); } // 薪资项目分组下的薪资项目 for (SalarySobItemGroupDTO salarySobItemGroupDTO : salarySobItemAggregateDTO.getItemGroups()) { if (CollectionUtils.isEmpty(salarySobItemGroupDTO.getItems())) { continue; } + List childrenColumns = Lists.newArrayList(); for (SalarySobItemDTO salarySobItemDTO : salarySobItemGroupDTO.getItems()) { if (excludeSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) { continue; } - columns.add(new Column(salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), "" + salarySobItemDTO.getSalaryItemId())); + childrenColumns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), "" + salarySobItemDTO.getSalaryItemId())); } + WeaTableColumnGroup weaTableColumnWapper = new WeaTableColumnGroup("150", salarySobItemGroupDTO.getName(), String.valueOf(salarySobItemGroupDTO.getId()), childrenColumns); + columns.add(weaTableColumnWapper); } // 没有分类的薪资项目 for (SalarySobItemDTO salarySobItemDTO : salarySobItemAggregateDTO.getItems()) { if (excludeSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) { continue; } - columns.add(new Column(salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), "" + salarySobItemDTO.getSalaryItemId())); + columns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), "" + salarySobItemDTO.getSalaryItemId())); + } + return columns; + } + + /** + * 构建薪资核算结果列表的表头(线下对比) + * + * @param salarySobItemAggregateDTO + * @return + */ + public static List buildTableColumns4ComparisonResultByGroup(SalarySobItemAggregateDTO salarySobItemAggregateDTO, Set excludeSalaryItemIds) { + List columns = Lists.newArrayList(); + // 员工信息字段 + for (SalarySobEmpFieldDTO salarySobEmpFieldDTO : salarySobItemAggregateDTO.getEmpFields()) { + columns.add(new WeaTableColumnGroup("150", salarySobEmpFieldDTO.getFieldName(), salarySobEmpFieldDTO.getFieldId(), salarySobEmpFieldDTO.getFieldId())); + } + // 薪资项目分组下的薪资项目 + for (SalarySobItemGroupDTO salarySobItemGroupDTO : salarySobItemAggregateDTO.getItemGroups()) { + if (CollectionUtils.isEmpty(salarySobItemGroupDTO.getItems())) { + continue; + } + List childrenColumns = Lists.newArrayList(); + for (SalarySobItemDTO salarySobItemDTO : salarySobItemGroupDTO.getItems()) { + if (excludeSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) { + continue; + } + childrenColumns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), "" + salarySobItemDTO.getSalaryItemId())); + } + WeaTableColumnGroup weaTableColumnWapper = new WeaTableColumnGroup("150", salarySobItemGroupDTO.getName(), String.valueOf(salarySobItemGroupDTO.getId()), childrenColumns); + columns.add(weaTableColumnWapper); + } + // 没有分类的薪资项目 + for (SalarySobItemDTO salarySobItemDTO : salarySobItemAggregateDTO.getItems()) { + if (excludeSalaryItemIds.contains(salarySobItemDTO.getSalaryItemId())) { + continue; + } + columns.add(new WeaTableColumnGroup("150", salarySobItemDTO.getName(), "" + salarySobItemDTO.getSalaryItemId(), "" + salarySobItemDTO.getSalaryItemId())); } return columns; } diff --git a/src/com/engine/salary/entity/salaryacct/dto/SalaryComparisonResultListDTO.java b/src/com/engine/salary/entity/salaryacct/dto/SalaryComparisonResultListDTO.java index 39fc6b164..2667b00bb 100644 --- a/src/com/engine/salary/entity/salaryacct/dto/SalaryComparisonResultListDTO.java +++ b/src/com/engine/salary/entity/salaryacct/dto/SalaryComparisonResultListDTO.java @@ -1,6 +1,6 @@ package com.engine.salary.entity.salaryacct.dto; -import com.engine.salary.util.page.Column; +import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.util.page.PageInfo; import lombok.AllArgsConstructor; import lombok.Data; @@ -25,7 +25,7 @@ import java.util.Map; public class SalaryComparisonResultListDTO { //列表的表头 - private List weaTableColumns; + private List weaTableColumns; //列表数据 private PageInfo> data; diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index badb78634..fced76437 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -43,7 +43,6 @@ import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.excel.ExcelParseHelper; import com.engine.salary.util.excel.ExcelSupport; import com.engine.salary.util.excel.ExcelUtilPlus; -import com.engine.salary.util.page.Column; import com.engine.salary.util.valid.ValidUtil; import com.engine.salary.wrapper.SalarySobItemWrapper; import com.google.common.collect.Lists; @@ -695,16 +694,30 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc // 查询薪资项目 List salaryItemPOS = getSalarySobItemService(user).listBySalarySobId4SalaryItem(salaryAcctRecordPO.getSalarySobId()); Set salaryItemIds = SalaryEntityUtil.properties(salaryItemPOS, salaryItemPO -> "" + salaryItemPO.getId()); - for (Column weaTableColumn : salaryComparisonResultListDTO.getWeaTableColumns()) { + for (WeaTableColumnGroup weaTableColumnGroup : salaryComparisonResultListDTO.getWeaTableColumns()) { // 员工信息字段 - if (employeeFieldCodeSet.contains(weaTableColumn.getKey())) { - headerList.add(weaTableColumn.getTitle()); - } - // 薪资项目的表头 - if (salaryItemIds.contains(weaTableColumn.getKey())) { - headerList.add(weaTableColumn.getTitle() + " (线上值)"); - headerList.add(weaTableColumn.getTitle() + " (线下值)"); + if (employeeFieldCodeSet.contains(weaTableColumnGroup.getColumn())) { + headerList.add(weaTableColumnGroup.getText()); + } else { + // 薪资项目的表头 + List childrenList = weaTableColumnGroup.getChildren(); + if (CollectionUtils.isEmpty(childrenList)) { + // 是否是无分类 + if (salaryItemIds.contains(weaTableColumnGroup.getColumn())) { + headerList.add(weaTableColumnGroup.getText() + " (线上值)"); + headerList.add(weaTableColumnGroup.getText() + " (线下值)"); + } + } else { + for (WeaTableColumnGroup children : childrenList) { + if (salaryItemIds.contains(children.getColumn())) { + headerList.add(children.getText() + " (线上值)"); + headerList.add(children.getText() + " (线下值)"); + } + } + } } + + } List> resultMapList = salaryComparisonResultListDTO.getData().getList(); @@ -713,16 +726,28 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayList(); - for (Column weaTableColumn : salaryComparisonResultListDTO.getWeaTableColumns()) { + for (WeaTableColumnGroup weaTableColumnGroup : salaryComparisonResultListDTO.getWeaTableColumns()) { // 员工信息字段的值 - if (employeeFieldCodeSet.contains(weaTableColumn.getKey())) { - row.add(map.get(weaTableColumn.getKey())); + if (employeeFieldCodeSet.contains(weaTableColumnGroup.getColumn())) { + row.add(map.get(weaTableColumnGroup.getColumn())); } // 薪资项目的值 - if (salaryItemIds.contains(weaTableColumn.getKey())) { - Map tempMap = (Map) map.getOrDefault(weaTableColumn.getKey(), Collections.emptyMap()); - row.add(tempMap.get("acctResultValue")); - row.add(tempMap.get("excelResultValue")); + List childrenList = weaTableColumnGroup.getChildren(); + if (CollectionUtils.isEmpty(childrenList)) { + // 是否是无分类 + if (salaryItemIds.contains(weaTableColumnGroup.getColumn())) { + Map tempMap = (Map) map.getOrDefault(weaTableColumnGroup.getColumn(), Collections.emptyMap()); + row.add(tempMap.get("acctResultValue")); + row.add(tempMap.get("excelResultValue")); + } + } else { + for (WeaTableColumnGroup children : childrenList) { + if (salaryItemIds.contains(children.getColumn())) { + Map tempMap = (Map) map.getOrDefault(children.getColumn(), Collections.emptyMap()); + row.add(tempMap.get("acctResultValue")); + row.add(tempMap.get("excelResultValue")); + } + } } } rows.add(row); @@ -775,12 +800,37 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc for (SalarySobItemDTO item : salarySobItemAggregateDTO.getItems()) { headerList.add(item.getName()); } + + + // 无分类薪资项目id + List noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList()); + // 查询列表的表头 + List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); + List finalWeaTableColumns = new ArrayList<>(); + finalWeaTableColumns.add(new WeaTableColumnGroup("150", SalaryI18nUtil.getI18nLabel(85429, "姓名"), SalaryI18nUtil.getI18nLabel(85429, "姓名"))); + finalWeaTableColumns.add(new WeaTableColumnGroup("150", SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"))); + finalWeaTableColumns.add(new WeaTableColumnGroup("150", "部门", "部门")); + finalWeaTableColumns.add(new WeaTableColumnGroup("150", "手机号", "手机号")); + finalWeaTableColumns.add(new WeaTableColumnGroup("150", "工号", "工号")); + for (WeaTableColumnGroup tableColumn : weaTableColumns) { + WeaTableColumnGroup columnGroupItem = (WeaTableColumnGroup) tableColumn; + if (columnGroupItem.getChildren() != null) { + columnGroupItem.setChildren(columnGroupItem.getChildren()); + finalWeaTableColumns.add(columnGroupItem); + } else if (noGroupItemIds.contains(columnGroupItem.getColumn())) { + // 无分类 + finalWeaTableColumns.add(columnGroupItem); + } + } + + List> rows = new ArrayList<>(); - rows.add(headerList); + rows.add(finalWeaTableColumns); String sheetName = "线下对比结果导入模板"; // return ExcelUtil.genWorkbookV2(rows, sheetName); - return ExcelUtilPlus.genWorkbookV2(rows, sheetName); +// return ExcelUtilPlus.genWorkbookV2(rows, sheetName); + return ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, false); } public Map importSalaryAcctResult(SalaryAcctImportParam param) { @@ -804,8 +854,8 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId())); Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); - map.put("headers", ExcelSupport.getSheetHeader(sheet, 0)); - map.put("list", ExcelParseHelper.parse2List(sheet, 1)); + map.put("headers", ExcelSupport.getSheetHeader(sheet, 1)); + map.put("list", ExcelParseHelper.parse2List(sheet, 2)); return map; } finally { @@ -921,20 +971,20 @@ public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExc // 表头 // List headers = ExcelSupport.getSheetHeader(sheet, 0); List headers; - if (StringUtils.equals("importSalaryAcctResult", importType)) { +// if (StringUtils.equals("importSalaryAcctResult", importType)) { headers = ExcelSupport.getSheetHeader(sheet, 1); - } else { - headers = ExcelSupport.getSheetHeader(sheet, 0); - } +// } else { +// headers = ExcelSupport.getSheetHeader(sheet, 0); +// } // 处理数值 // List> data = ExcelParseHelper.parse2Map(sheet, 1); List> data; - if (StringUtils.equals("importSalaryAcctResult", importType)) { +// if (StringUtils.equals("importSalaryAcctResult", importType)) { data = ExcelParseHelper.parse2Map(sheet, 2, 1); - } else { - data = ExcelParseHelper.parse2Map(sheet, 1); - } +// } else { +// data = ExcelParseHelper.parse2Map(sheet, 1); +// } if (CollectionUtils.isEmpty(headers)) { throw new RuntimeException("表头为空"); diff --git a/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java index 3c979d6bf..bff73dd2f 100644 --- a/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java @@ -2,6 +2,7 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO; @@ -27,7 +28,6 @@ import com.engine.salary.service.*; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; -import com.engine.salary.util.page.Column; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; @@ -173,7 +173,7 @@ public class SalaryComparisonResultServiceImpl extends Service implements Salary List salaryAcctEmployeePOS = getSalaryAcctEmployeeService(user).listByResultQueryParam(queryParam); if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) { // 构建薪资核算结果列表表头 - List weaTableColumns = SalaryAcctResultBO.buildTableColumns4ComparisonResult(salarySobItemAggregateDTO, Collections.emptySet()); + List weaTableColumns = SalaryAcctResultBO.buildTableColumns4ComparisonResultByGroup(salarySobItemAggregateDTO, Collections.emptySet()); // 构建列表数据 // 返回结果 return new SalaryComparisonResultListDTO().setWeaTableColumns(weaTableColumns).setData(new PageInfo<>()); @@ -246,7 +246,7 @@ public class SalaryComparisonResultServiceImpl extends Service implements Salary .collect(Collectors.toSet()); } // 构建薪资核算结果列表表头 - List weaTableColumns = SalaryAcctResultBO.buildTableColumns4ComparisonResult(salarySobItemAggregateDTO, excludeSalaryItemIds); + List weaTableColumns = SalaryAcctResultBO.buildTableColumns4ComparisonResultByGroup(salarySobItemAggregateDTO, excludeSalaryItemIds); // 返回结果 return new SalaryComparisonResultListDTO().setWeaTableColumns(weaTableColumns).setData(dtoPage); } diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 078060a02..47baab85e 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -696,7 +696,7 @@ public class SalaryAcctController { @Produces(MediaType.APPLICATION_JSON) public String listComparisonResult(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryComparisonResultQueryParam param) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult>>(user).run(getSalaryComparisonResultWrapper(user)::listPage, param); + return new ResponseResult>(user).run(getSalaryComparisonResultWrapper(user)::listPage, param); } diff --git a/src/com/engine/salary/wrapper/SalaryComparisonResultWrapper.java b/src/com/engine/salary/wrapper/SalaryComparisonResultWrapper.java index 0e16028b2..69ae4ccf4 100644 --- a/src/com/engine/salary/wrapper/SalaryComparisonResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryComparisonResultWrapper.java @@ -12,6 +12,7 @@ import com.engine.salary.service.impl.SalaryComparisonResultServiceImpl; import com.engine.salary.util.page.PageInfo; import weaver.hrm.User; +import java.util.HashMap; import java.util.Map; /** @@ -41,13 +42,16 @@ public class SalaryComparisonResultWrapper extends Service { * @param queryParam 列表查询条件 * @return */ - public PageInfo> listPage(SalaryComparisonResultQueryParam queryParam) { + public Map listPage(SalaryComparisonResultQueryParam queryParam) { // 查询薪资核算线下对比列表 SalaryComparisonResultListDTO salaryComparisonResultListDTO = getSalaryComparisonResultService(user).listPageByParam(queryParam); PageInfo> pageInfo = salaryComparisonResultListDTO.getData(); - pageInfo.setColumns(salaryComparisonResultListDTO.getWeaTableColumns()); - return pageInfo; + Map datas = new HashMap<>(); + datas.put("pageInfo", pageInfo); + datas.put("columns", salaryComparisonResultListDTO.getWeaTableColumns()); + + return datas; } }