package com.engine.salary.service.impl; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.cloudstore.dev.api.util.Util_DataCache; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.report.po.SalaryAcctResultReportPO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctEmployeeBO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO; import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultLogBO; import com.engine.salary.entity.salaryacct.dto.SalaryAccEmployeeListDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctImportFieldDTO; import com.engine.salary.entity.salaryacct.dto.SalaryComparisonResultListDTO; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.*; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemGroupDTO; import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO; import com.engine.salary.entity.salarysob.po.SalarySobItemGroupPO; import com.engine.salary.entity.salarysob.po.SalarySobItemPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.sys.SalarySysConfMapper; import com.engine.salary.service.*; import com.engine.salary.sys.constant.SalarySysConstant; import com.engine.salary.sys.entity.po.SalarySysConfPO; import com.engine.salary.sys.enums.OpenEnum; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryEntityUtil; 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.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.wbi.util.Util; import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.file.ImageFileManager; import weaver.hrm.User; import java.io.InputStream; import java.util.*; import java.util.stream.Collectors; import static com.engine.salary.sys.constant.SalarySysConstant.OPEN_ACCT_RESULT_SUM; import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; /** * 薪资核算导入导出 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ @Slf4j public class SalaryAcctExcelServiceImpl extends Service implements SalaryAcctExcelService { private SalaryAcctRecordService getSalaryAcctRecordService(User user) { return (SalaryAcctRecordService) ServiceUtil.getService(SalaryAcctRecordServiceImpl.class, user); } private SalaryAcctEmployeeService getSalaryAcctEmployeeService(User user) { return (SalaryAcctEmployeeService) ServiceUtil.getService(SalaryAcctEmployeeServiceImpl.class, user); } private SalaryAcctResultService getSalaryAcctResultService(User user) { return (SalaryAcctResultService) ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); } private SalarySobEmpFieldService getSalarySobEmpFieldService(User user) { return (SalarySobEmpFieldService) ServiceUtil.getService(SalarySobEmpFieldServiceImpl.class, user); } private SalarySobItemService getSalarySobItemService(User user) { return (SalarySobItemService) ServiceUtil.getService(SalarySobItemServiceImpl.class, user); } private SalaryItemService getSalaryItemService(User user) { return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user); } // private SalaryFormulaService getSalaryFormulaService(User user) { // return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user); // } private SalaryComparisonResultService getSalaryComparisonResultService(User user) { return (SalaryComparisonResultService) ServiceUtil.getService(SalaryComparisonResultServiceImpl.class, user); } private TaxAgentService getTaxAgentService(User user) { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } private SalaryEmployeeService getSalaryEmployeeService(User user) { return (SalaryEmployeeService) ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } private SalarySobItemGroupService getSalarySobItemGroupService(User user) { return ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user); } private SalaryCheckResultService salaryCheckResultService; private SalaryCheckResultDetailService salaryCheckResultDetailService; private SalarySobCheckRuleService salarySobCheckRuleService; private SalaryAcctReportService getSalaryAcctReportService(User user) { return ServiceUtil.getService(SalaryAcctReportServiceImpl.class, user); } private SalarySysConfMapper getSalarySysConfMapper() { return SqlProxyHandle.getProxy(SalarySysConfMapper.class); } private SalarySysConfService getSalarySysConfService(User user) { return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } private SalaryAcctResultLogService getSalaryAcctResultLogService(User user) { return ServiceUtil.getService(SalaryAcctResultLogServiceImpl.class, user); } @Override public XSSFWorkbook exportSalaryAcctEmployee(SalaryAcctEmployeeQueryParam queryParam) { ValidUtil.doValidator(queryParam); // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(85368, "核算人员范围"); // 2.表头 String[] header = { SalaryI18nUtil.getI18nLabel(85429, "姓名"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(86185, "部门"), SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86186, "工号"), SalaryI18nUtil.getI18nLabel(91075, "员工状态"), SalaryI18nUtil.getI18nLabel(91075, "入职日期"), SalaryI18nUtil.getI18nLabel(91075, "离职日期") }; List headerList = new ArrayList<>(Arrays.asList(header)); // 查询薪资核算人员 List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(queryParam); // 组装数据 List> rows = new ArrayList<>(); rows.add(headerList); // 3.表数据 List> lists = convert2ExcelRow(salaryAcctEmployees); rows.addAll(lists); // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } @Override public XSSFWorkbook exportReducedEmployee(SalaryAcctEmployeeQueryParam queryParam) { ValidUtil.doValidator(queryParam); // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(85368, "环比上月减少人员"); // 2.表头 String[] header = { SalaryI18nUtil.getI18nLabel(85429, "姓名"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(86185, "部门"), SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86186, "工号"), SalaryI18nUtil.getI18nLabel(91075, "员工状态"), SalaryI18nUtil.getI18nLabel(91075, "入职日期"), SalaryI18nUtil.getI18nLabel(91075, "离职日期") }; List headerList = new ArrayList<>(Arrays.asList(header)); // 查询薪资核算人员(环比上月减少) List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam4Reduce(queryParam); // 组装数据 List> rows = new ArrayList<>(); rows.add(headerList); // 3.表数据 List> lists = convert2ExcelRow(salaryAcctEmployees); rows.addAll(lists); // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } @Override public XSSFWorkbook exportAddedEmployee(SalaryAcctEmployeeQueryParam queryParam) { ValidUtil.doValidator(queryParam); // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(85368, "环比上月增加人员"); // 2.表头 String[] header = { SalaryI18nUtil.getI18nLabel(85429, "姓名"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(86185, "部门"), SalaryI18nUtil.getI18nLabel(86186, "手机号"), SalaryI18nUtil.getI18nLabel(86186, "工号"), SalaryI18nUtil.getI18nLabel(91075, "员工状态"), SalaryI18nUtil.getI18nLabel(91075, "入职日期"), SalaryI18nUtil.getI18nLabel(91075, "离职日期") }; List headerList = new ArrayList<>(Arrays.asList(header)); // 查询薪资核算人员(环比上月增加) List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam4Add(queryParam); // 组装数据 List> rows = new ArrayList<>(); rows.add(headerList); // 3.表数据 List> lists = convert2ExcelRow(salaryAcctEmployees); rows.addAll(lists); // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } private List> convert2ExcelRow(List salaryAcctEmployees) { if (CollectionUtils.isEmpty(salaryAcctEmployees)) { return Collections.emptyList(); } List salaryAccEmployeeListDTOS = new ArrayList<>(); List> partition = Lists.partition(salaryAcctEmployees, 1000); for (List tempList : partition) { // 人员 List employeeIds = tempList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); List simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds); // 个税扣缴义务人 List taxAgentIds = tempList.stream().map(SalaryAcctEmployeePO::getTaxAgentId).distinct().collect(Collectors.toList()); List taxAgents = getTaxAgentService(user).listByIds(taxAgentIds); // 转换成列表数据 salaryAccEmployeeListDTOS.addAll(SalaryAcctEmployeeBO.convert2EmployeeListDTO(tempList, taxAgents, simpleEmployees)); } List> rows = Lists.newArrayListWithExpectedSize(salaryAccEmployeeListDTOS.size()); for (SalaryAccEmployeeListDTO dto : salaryAccEmployeeListDTOS) { List row = Lists.newArrayListWithExpectedSize(8); row.add(dto.getEmployeeName()); row.add(dto.getTaxAgentName()); row.add(dto.getDepartmentName()); row.add(dto.getMobile()); row.add(dto.getJobNum()); row.add(dto.getStatus()); row.add(dto.getHireDate()); row.add(dto.getDismissDate()); rows.add(row); } return rows; } @Override public XSSFWorkbook exportSalaryAcctResult(SalaryAcctResultQueryParam queryParam) { ValidUtil.doValidator(queryParam); // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } // excel导出的表头 List headerColumnGroup = Lists.newArrayList(); // 查询列表的表头 List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); parseHeader(headerColumnGroup, weaTableColumns); // // 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); //合计 boolean total = false; SalarySysConfPO openSum = getSalarySysConfService(user).getOneByCode(OPEN_ACCT_RESULT_SUM); if (openSum != null && StringUtils.isNotBlank(openSum.getConfValue()) && OpenEnum.parseByValue(openSum.getConfValue()) == OpenEnum.OPEN) { total = true; Map sumRow = getSalaryAcctResultService(user).sumRow(queryParam); if(sumRow !=null){ sumRow.put("taxAgentName", "总计"); resultMapList.add(sumRow); } } // excel导出的数据 List> rows = new ArrayList<>(); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayListWithExpectedSize(headerColumnGroup.size()); for (WeaTableColumnGroup weaTableColumn : headerColumnGroup) { row.add(map.getOrDefault(weaTableColumn.getColumn(), StringUtils.EMPTY)); } rows.add(row); } String sheetName = "薪资核算结果"; // return ExcelUtil.genWorkbookV2(rows, sheetName, total); return ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, total); } /** * 构建薪资核算结果列表的表头 * * @param salaryAcctRecordPO 薪资核算记录 * @return */ public List listWeaTableColumn(SalaryAcctRecordPO salaryAcctRecordPO) { // 是否是回算 SalaryAcctRecordPO byId = getSalaryAcctRecordService(user).getById(salaryAcctRecordPO.getId()); boolean isBackCalc = Objects.equals(byId.getBackCalcStatus(), 1); // 查询薪资账套下的薪资项目+员工信息字段 SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateWithItemHideBySalarySobId(salaryAcctRecordPO.getSalarySobId(),isBackCalc); // 构建薪资核算结果列表表头 return SalaryAcctResultBO.buildTableColumns(salarySobItemAggregateDTO, ListUtils.emptyIfNull(salaryAcctRecordPO.getLockSalaryItemIds())); } /** * 报表表头 * * @param salaryAcctRecordPO * @return */ public Map listColumn(SalaryAcctRecordPO salaryAcctRecordPO) { // 查询薪资账套下的薪资项目+员工信息字段 SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // 构建薪资核算结果列表表头 return SalaryAcctResultBO.buildColumns(salarySobItemAggregateDTO); } /** * 解析表头 * * @param headerList * @param weaTableColumns */ private void parseHeader(List headerList, List weaTableColumns) { for (WeaTableColumnGroup weaTableColumnGroup : weaTableColumns) { if (CollectionUtils.isEmpty(weaTableColumnGroup.getChildren())) { headerList.add(weaTableColumnGroup); continue; } parseHeader(headerList, weaTableColumnGroup.getChildren()); } } @Override public SalaryAcctImportFieldDTO getImportField(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()); } // // 薪资项目中的公式项 // List formulaItems = salaryItems.stream() // .filter(salaryItemPO -> Objects.equals(salaryItemPO.getValueType(), SalaryValueTypeEnum.FORMULA.getValue())) // .map(salaryItemPO -> SalaryAcctImportFieldDTO.ImportFieldDTO.builder() // .salaryItemId(salaryItemPO.getId()) // .salaryItemName(salaryItemPO.getName()) // .build()) // .collect(Collectors.toList()); // // 薪资项目中的SQl项 // List sqlItems = salaryItems.stream() // .filter(salaryItemPO -> Objects.equals(salaryItemPO.getValueType(), SalaryValueTypeEnum.SQL.getValue())) // .map(salaryItemPO -> SalaryAcctImportFieldDTO.ImportFieldDTO.builder() // .salaryItemId(salaryItemPO.getId()) // .salaryItemName(salaryItemPO.getName()) // .build()) // .collect(Collectors.toList()); // // 薪资项目中的输入项 // List inputItems = salaryItems.stream() // .filter(salaryItemPO -> Objects.equals(salaryItemPO.getValueType(), SalaryValueTypeEnum.INPUT.getValue())) // .map(salaryItemPO -> SalaryAcctImportFieldDTO.ImportFieldDTO.builder() // .salaryItemId(salaryItemPO.getId()) // .salaryItemName(salaryItemPO.getName()) // .build()) // .collect(Collectors.toList()); // 缓存勾选 String cacheKey = user.getUID() + SalaryItemConstant.RESULT_IMPORT_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); // 必须选择导入模板所需的薪资项目 if (CollectionUtils.isEmpty(param.getSalaryItemIds())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99019, "参数错误,请选择导入模板所需的薪资项目")); } // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId()); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } // // 模板表头(默认必带"个税扣缴义务人"、"姓名") // 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 salaryItemPOS = getSalaryItemService(user).listByIds(param.getSalaryItemIds()); // for (SalaryItemPO salaryItemPO : salaryItemPOS) { // headerList.add(salaryItemPO.getName()); // dataIndexList.add("" + salaryItemPO.getId()); // } // // // 查询薪资核算结果 // List> resultMapList = getSalaryAcctResultService(user).listByParam(param); // // 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); // } // return ExcelUtil.genWorkbookV2(rows, sheetName); // 查询薪资项目 List headerRangeList = new ArrayList<>(); List salaryItemPOS = getSalaryItemService(user).listByIds(param.getSalaryItemIds()); for (SalaryItemPO salaryItemPO : salaryItemPOS) { headerRangeList.add(salaryItemPO.getId().toString()); } headerRangeList.add("username"); headerRangeList.add("mobile"); headerRangeList.add("workcode"); headerRangeList.add("taxAgentName"); headerRangeList.add("departmentName"); // 查询列表的表头 List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); List finalWeaTableColumns = new ArrayList<>(); 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); } } // excel导出的表头 List headerColumnGroup = Lists.newArrayList(); // 查询列表的表头 parseHeader(headerColumnGroup, finalWeaTableColumns); List headerList = new ArrayList<>(finalWeaTableColumns); // 查询薪资核算结果 List> resultMapList = getSalaryAcctResultService(user).listByParam(param); // excel导出的数据 List> rows = new ArrayList<>(); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayListWithExpectedSize(headerColumnGroup.size()); for (WeaTableColumnGroup weaTableColumn : headerColumnGroup) { row.add(map.getOrDefault(weaTableColumn.getColumn(), StringUtils.EMPTY)); } rows.add(row); } String sheetName = "薪资核算导入模板"; return ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, false); } @Override public XSSFWorkbook exportComparisonResult(SalaryComparisonResultQueryParam queryParam) { ValidUtil.doValidator(queryParam); // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } // 查询线下对比结果 SalaryComparisonResultListDTO salaryComparisonResultListDTO = getSalaryComparisonResultService(user).listByParam(queryParam); // 薪资核算线下对比结果列表表头 List headerList = Lists.newArrayList(); // 查询薪资核算所用的薪资账套的员工信息字段 List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); Set employeeFieldCodeSet = SalaryEntityUtil.properties(salarySobEmpFieldPOS, SalarySobEmpFieldPO::getFieldCode); // 查询薪资项目 List salaryItemPOS = getSalarySobItemService(user).listBySalarySobId4SalaryItem(salaryAcctRecordPO.getSalarySobId()); Set salaryItemIds = SalaryEntityUtil.properties(salaryItemPOS, salaryItemPO -> "" + salaryItemPO.getId()); for (Column weaTableColumn : salaryComparisonResultListDTO.getWeaTableColumns()) { // 员工信息字段 if (employeeFieldCodeSet.contains(weaTableColumn.getKey())) { headerList.add(weaTableColumn.getTitle()); } // 薪资项目的表头 if (salaryItemIds.contains(weaTableColumn.getKey())) { headerList.add(weaTableColumn.getTitle() + " (线上值)"); headerList.add(weaTableColumn.getTitle() + " (线下值)"); } } List> resultMapList = salaryComparisonResultListDTO.getData().getList(); // excel导出的数据 List> rows = new ArrayList<>(); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayList(); for (Column weaTableColumn : salaryComparisonResultListDTO.getWeaTableColumns()) { // 员工信息字段的值 if (employeeFieldCodeSet.contains(weaTableColumn.getKey())) { row.add(map.get(weaTableColumn.getKey())); } // 薪资项目的值 if (salaryItemIds.contains(weaTableColumn.getKey())) { Map tempMap = (Map) map.getOrDefault(weaTableColumn.getKey(), Collections.emptyMap()); row.add(tempMap.get("acctResultValue")); row.add(tempMap.get("excelResultValue")); } } rows.add(row); } String sheetName = "线下对比结果"; // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } @Override public XSSFWorkbook exportComparisonResultTemplate(SalaryComparisonResultExportParam exportParam) { ValidUtil.doValidator(exportParam); // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(exportParam.getSalaryAcctRecordId()); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } // 模板表头(默认必带"个税扣缴义务人"、"姓名") List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(85429, "姓名"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人")); //定位人员带“部门”,“手机号”,“工号” headerList.add("部门"); headerList.add("手机号"); headerList.add("工号"); // 查询薪资账套下的薪资项目 SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // // 员工信息 // for (SalarySobEmpFieldDTO item : salarySobItemAggregateDTO.getEmpFields()) { // if (!"姓名".equals(item.getFieldName()) && !"个税扣缴义务人".equals(item.getFieldName())) { // if ("手机".equals(item.getFieldName())) { // headerList.add("手机号"); // } else { // headerList.add(item.getFieldName()); // } // } // // } // 薪资项目分类下的新资项目 for (SalarySobItemGroupDTO itemGroup : salarySobItemAggregateDTO.getItemGroups()) { for (SalarySobItemDTO item : itemGroup.getItems()) { headerList.add(item.getName()); } } // 没有分类的薪资项目 for (SalarySobItemDTO item : salarySobItemAggregateDTO.getItems()) { headerList.add(item.getName()); } List> rows = new ArrayList<>(); rows.add(headerList); String sheetName = "线下对比结果导入模板"; // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } public Map importSalaryAcctResult(SalaryAcctImportParam param) { return batchImport(param, "importSalaryAcctResult"); } public Map importExcelAcctResult(SalaryAcctImportParam param) { return batchImport(param, "importExcelAcctResult"); } @Override public Map preview(SalaryAcctImportParam param) { //1、参数校验 ValidUtil.doValidator(param); Map map = new HashMap<>(); InputStream fileInputStream = null; 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)); return map; } finally { IOUtils.closeQuietly(fileInputStream); } } @Override public void cacheImportField(List salaryItems) { String cacheKey = user.getUID() + SalaryItemConstant.RESULT_IMPORT_FIELD_SIGN; Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems)); } @Override public Map previewImportSalaryAcctResult(SalaryAcctImportParam param) { //1、参数校验 ValidUtil.doValidator(param); Map map = new HashMap<>(); InputStream fileInputStream = null; try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId())); Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); map.put("headers", ExcelSupport.getSheetHeader(sheet, 1)); map.put("list", ExcelParseHelper.parse2List(sheet, 2, 1)); return map; } finally { IOUtils.closeQuietly(fileInputStream); } } private Map batchImport(SalaryAcctImportParam param, String importType) { Map apidatas = new HashMap(); ValidUtil.doValidator(param); Date now = new Date(); Long currentEmployeeId = (long) user.getUID(); //查询对于人员信息导入筛选的全局配置 SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; // 薪资核算记录的id Long salaryAcctRecordId = param.getSalaryAcctRecordId(); // 薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); if (salaryAcctRecordPO == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除")); } // 薪资账套下的薪资项目副本 List salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // 薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); List salaryItems = getSalaryItemService(user).listByIds(salaryItemIds); Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getName, SalaryItemPO::getId); // 薪资核算确认的人员 List salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordId); Map salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployees, e -> e.getEmployeeId() + "-" + e.getTaxAgentId()); // 租户下所有的人员 List salaryEmployees = getSalaryEmployeeService(user).listAllForReport(); Map salaryEmployeeMap = SalaryEntityUtil.convert2Map(salaryEmployees, DataCollectionEmployee::getUsername, DataCollectionEmployee::getEmployeeId); Map emps = SalaryEntityUtil.convert2Map(salaryEmployees, DataCollectionEmployee::getEmployeeId); // 租户下所有的个税扣缴义务人 List taxAgents = getTaxAgentService(user).listAll(); Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId); // 索引(用于计算进度) int index = 0; // 失败的数量 int failCount = 0; // 成功的数量 int successCount = 0; // 总数 // int total = message.getBatchFile().getExcelSheets().stream() // .filter(e -> CollectionUtils.isNotEmpty(e.getHeader()) && CollectionUtils.isNotEmpty(e.getData())) // .map(e -> BigDecimal.valueOf(e.getData().size())) // .reduce(BigDecimal.ZERO, BigDecimal::add) // .intValue(); // 包含错误提示信息的sheet页 List> errorExcelSheets = Lists.newArrayList(); // 解析excel List salaryAcctEmpIds = Lists.newArrayList(); // excel导入了哪些薪资项目 Set excelSalaryItemIds = Sets.newHashSet(); List salaryAcctResults = Lists.newArrayList(); List salaryAcctReports = Lists.newArrayList(); List newSalaryAcctEmployees = Lists.newArrayList(); List excelAcctResults = Lists.newArrayList(); InputStream fileInputStream = null; try { fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.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 headers; if (StringUtils.equals("importSalaryAcctResult", importType)) { headers = ExcelSupport.getSheetHeader(sheet, 1); } else { headers = ExcelSupport.getSheetHeader(sheet, 0); } // 处理数值 // List> data = ExcelParseHelper.parse2Map(sheet, 1); List> data; if (StringUtils.equals("importSalaryAcctResult", importType)) { data = ExcelParseHelper.parse2Map(sheet, 2, 1); } else { 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 + 3) + "行"; int usernameIndex = 0; boolean isError = false; Map map = data.get(i); Long employeeId = 0L; Long taxAgentId = 0L; List salaryAcctResultsOfOneEmp = Lists.newArrayListWithExpectedSize(headers.size() - 1); List salaryAcctResultReportOfOneEmp = Lists.newArrayListWithExpectedSize(headers.size() - 1); List excelAcctResultsOfOneEmp = Lists.newArrayListWithExpectedSize(headers.size() - 1); 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 workcode = (String) map.getOrDefault("工号", ""); if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(85429, "姓名"), dataKey.toString())) { usernameIndex = j; if (StringUtils.isEmpty(dataValue) && "0".equals(confValue)) { 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 = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, dataValue, deparmentName, mobile, workcode, null); 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()) || StringUtils.equals(SalaryI18nUtil.getI18nLabel(86186, "手机号"), dataKey.toString()) || StringUtils.equals(SalaryI18nUtil.getI18nLabel(86186, "工号"), 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 { Long salaryItemId = salaryItemMap.get(dataKey.toString()); if (salaryItemId == null || salaryItemId <= 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(102841, "表头错误,本次核算所用账套不包含该薪资项目"), i, i, j, j); } else { excelSalaryItemIds.add(salaryItemId); if (StringUtils.equals("importExcelAcctResult", importType)) { ExcelAcctResultPO excelAcctResult = ExcelAcctResultPO.builder() .salaryAcctRecordId(salaryAcctRecordPO.getId()) .salarySobId(salaryAcctRecordPO.getSalarySobId()) .salaryItemId(salaryItemId) .resultValue(dataValue) .creator(currentEmployeeId) .createTime(now) .updateTime(now) .deleteType(0) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); excelAcctResultsOfOneEmp.add(excelAcctResult); } if (StringUtils.equals("importSalaryAcctResult", importType)) { SalaryAcctResultPO salaryAcctResult = SalaryAcctResultPO.builder() .salaryAcctRecordId(salaryAcctRecordPO.getId()) .salarySobId(salaryAcctRecordPO.getSalarySobId()) .salaryItemId(salaryItemId) .resultValue(dataValue) .creator(currentEmployeeId) .createTime(now) .updateTime(now) .deleteType(0) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); salaryAcctResultsOfOneEmp.add(salaryAcctResult); SalaryAcctResultReportPO reportPO = SalaryAcctResultReportPO.builder() .id(IdGenerator.generate()) .salaryAcctRecordId(salaryAcctRecordPO.getId()) .salarySobId(salaryAcctRecordPO.getSalarySobId()) .salaryItemId(salaryItemId) .resultValue(dataValue) .creator(currentEmployeeId) .createTime(now) .updateTime(now) .deleteType(0) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); salaryAcctResultReportOfOneEmp.add(reportPO); } } } // (如果是线下对比)如果个税扣缴义务人+人员目前不在核算人员里面,不支持导入 if (StringUtils.equals("importExcelAcctResult", importType) && (employeeId != null && employeeId > 0) && (taxAgentId != null && taxAgentId > 0) && i == data.size() - 1 && !salaryAcctEmployeeMap.containsKey(employeeId + "-" + taxAgentId)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "本次薪资核算不包含该人员"))); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102842, "本次薪资核算不包含该人员"), i, i, usernameIndex, usernameIndex); } // 如果个税扣缴义务人+人员目前不在核算人员里面,不支持导入 if (StringUtils.equals("importSalaryAcctResult", importType) && (employeeId != null && employeeId > 0) && (taxAgentId != null && taxAgentId > 0) && i == data.size() - 1 && !salaryAcctEmployeeMap.containsKey(employeeId + "-" + taxAgentId)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, SalaryI18nUtil.getI18nLabel(102840, "本次薪资核算不包含该人员"))); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(102842, "本次薪资核算不包含该人员"), i, i, usernameIndex, usernameIndex); } } // 每处理50个数据更新一次进度 index++; // if (index % 50 == 0 || index >= total) { // salaryBatchService.sendImportRate(message.getBizId(), total, index); // } if (isError) { failCount++; errorDatas.add(map); continue; } SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(employeeId + "-" + taxAgentId); //多余的人 if (salaryAcctEmployee == null) { continue; } Long salaryAcctEmpId = Optional.ofNullable(salaryAcctEmployee).map(SalaryAcctEmployeePO::getId).orElse(0L); if (StringUtils.equals("importExcelAcctResult", importType)) { for (ExcelAcctResultPO excelAcctResultPO : excelAcctResultsOfOneEmp) { excelAcctResultPO.setEmployeeId(employeeId); excelAcctResultPO.setTaxAgentId(taxAgentId); excelAcctResultPO.setSalaryAcctEmpId(salaryAcctEmpId); } excelAcctResults.addAll(excelAcctResultsOfOneEmp); } if (StringUtils.equals("importSalaryAcctResult", importType)) { if (salaryAcctEmpId <= 0) { SalaryAcctEmployeePO acctEmployee = SalaryAcctEmployeePO.builder() .employeeId(employeeId) .salaryAcctRecordId(salaryAcctRecordId) .salarySobId(salaryAcctRecordPO.getSalarySobId()) .salaryMonth(salaryAcctRecordPO.getSalaryMonth()) .taxAgentId(taxAgentId) .creator(currentEmployeeId) .createTime(now) .updateTime(now) .deleteType(0) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); newSalaryAcctEmployees.add(acctEmployee); salaryAcctEmpId = acctEmployee.getId(); } for (SalaryAcctResultPO salaryAcctResultPO : salaryAcctResultsOfOneEmp) { salaryAcctResultPO.setEmployeeId(employeeId); salaryAcctResultPO.setTaxAgentId(taxAgentId); salaryAcctResultPO.setSalaryAcctEmpId(salaryAcctEmpId); } for (SalaryAcctResultReportPO po : salaryAcctResultReportOfOneEmp) { po.setEmployeeId(Util.null2String(employeeId)); po.setTaxAgentId(taxAgentId); po.setSalaryAcctEmpId(Util.null2String(salaryAcctEmpId)); DataCollectionEmployee emp = emps.get(employeeId); po.setSubcompanyId(emp.getSubcompanyid()); po.setDepartmentId(emp.getDepartmentId()); po.setCostcenterId(emp.getCostcenterId()); po.setJobtitleId(emp.getJobtitleId()); po.setLocationId(emp.getLocationId()); } salaryAcctEmpIds.add(salaryAcctEmpId); salaryAcctResults.addAll(salaryAcctResultsOfOneEmp); salaryAcctReports.addAll(salaryAcctResultReportOfOneEmp); } successCount++; } // 如果sheet包含错误数据 // if (CollectionUtils.isNotEmpty(errorDatas)) { // salaryBatchService.createErrorExcelSheet(headers, errorDatas, excelSheet.getName(), excelComments, errorExcelSheets); // } if (StringUtils.equals("importExcelAcctResult", importType)) { getSalaryComparisonResultService(user).deleteBySalaryAcctRecordIds(Collections.singleton(salaryAcctRecordId)); if (CollectionUtils.isNotEmpty(excelAcctResults)) { excelAcctResults.stream().forEach(result -> { if(StringUtils.isEmpty(result.getResultValue())){ result.setResultValue(" "); } }); getSalaryComparisonResultService(user).batchSave(excelAcctResults); } } if (StringUtils.equals("importSalaryAcctResult", importType)) { List deleteResults = new ArrayList<>(); if (CollectionUtils.isNotEmpty(salaryAcctEmpIds)) { // 获取删除的核算结果 deleteResults = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, excelSalaryItemIds); getSalaryAcctResultService(user).deleteByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, excelSalaryItemIds); //删除报表 getSalaryAcctReportService(user).deleteByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, excelSalaryItemIds); } if (CollectionUtils.isNotEmpty(salaryAcctResults)) { // 处理导入薪资项的回算值 handleOriginResultValue(deleteResults, salaryAcctResults); getSalaryAcctResultService(user).batchSave(salaryAcctResults); // 存储薪资核算结果数据来源日志 new Thread() { public void run() { handleSalaryAcctResultLog(salaryAcctResults); } }.start(); //报表 getSalaryAcctReportService(user).batchSave(salaryAcctReports); } if (CollectionUtils.isNotEmpty(newSalaryAcctEmployees)) { getSalaryAcctEmployeeService(user).batchSave(newSalaryAcctEmployees); } } SalarySysConfPO autoLock = getSalarySysConfService(user).getOneByCode(SalarySysConstant.EDIT_IMPORT_AUTO_LOCK); if(autoLock != null && StringUtils.equals(autoLock.getConfValue(),"1")){ // 导入的列都自动锁定 SalaryAcctResultUpdateLockStatusParam updateLockStatusParam = SalaryAcctResultUpdateLockStatusParam.builder() .salaryItemIds(excelSalaryItemIds) .salaryAcctRecordId(param.getSalaryAcctRecordId()) .lockStatus(LockStatusEnum.LOCK).build(); getSalaryAcctResultService(user).updateLockStatusByParam(updateLockStatusParam); } apidatas.put("successCount", successCount); apidatas.put("errorCount", failCount); apidatas.put("errorData", excelComments); } finally { IOUtils.closeQuietly(fileInputStream); } // 发送导入回调信息 // salaryBatchService.sendImportCallBackInfo(message, successCount, failCount, errorExcelSheets); return apidatas; } /** * 存储薪资核算结果数据来源日志 * @param salaryAcctResults */ private void handleSalaryAcctResultLog(List salaryAcctResults) { List salaryAcctEmpIds = salaryAcctResults.stream().map(SalaryAcctResultPO::getSalaryAcctEmpId).distinct().collect(Collectors.toList()); Set salaryItemIds = salaryAcctResults.stream().map(SalaryAcctResultPO::getSalaryItemId).collect(Collectors.toSet()); // 查询导入的薪资核算结果 List salaryAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); Long uid = Long.valueOf(user.getUID()); List needInsertList = SalaryAcctResultLogBO.buildSalaryAcctResultLog(salaryAcctResultList, uid, SalaryAcctResultDataSourceEnum.IMPORT); if(CollectionUtils.isNotEmpty(needInsertList)){ getSalaryAcctResultLogService(user).batchInsert(needInsertList); } } /** * @description * @return void * @author Harryxzy * @date 2022/12/26 22:36 */ private void handleOriginResultValue(List deleteResults, List salaryAcctResults) { Map> deleteMap = SalaryEntityUtil.group2Map(deleteResults, po -> po.getSalaryAcctEmpId() + "-" + po.getSalaryItemId()); salaryAcctResults.stream().forEach(result -> { List salaryAcctResultPOS = deleteMap.get(result.getSalaryAcctEmpId() + "-" + result.getSalaryItemId()); if(salaryAcctResultPOS != null && salaryAcctResultPOS.size() > 0 ){ result.setOriginResultValue(salaryAcctResultPOS.get(0).getOriginResultValue()); } }); } // @Override // public Map exportCheckResult( // SalaryCheckResultExportParam exportParam, // ) { // // 查询薪资核算结果校验异常 // List salaryCheckResults = salaryCheckResultService.listBySalaryAcctRecordId(exportParam.getSalaryAcctRecordId()); // List excelSheetData = Lists.newArrayListWithExpectedSize(salaryCheckResults.size()); // for (SalaryCheckResultPO salaryCheckResult : salaryCheckResults) { // excelSheetData.add(buildDetailExcelSheetData(salaryCheckResult, simpleEmployee.getEmployeeId())); // } // ExportExcelInfo exportExcelInfo = ExportExcelInfo.builder() // .fileName("校验异常") // .dataType("校验异常") // .function(excelExportParam.getFunction()) // .handlerName("salaryCheckResultHandler") // .flag(true) // .bizId(String.valueOf(excelExportParam.getBiz())) // .module(excelExportParam.getModule()) // .userId(simpleEmployee.getEmployeeId()) // .tenantKey(tenantKey) // .operator(simpleEmployee.getUsername()) // .eteamsId(eteamsId) // .build(); // return salaryBatchService.simpleExportExcel(exportExcelInfo, excelSheetData); // } // // @BatchExportHandler("salaryCheckResultHandler") // private void salaryCheckResultHandler() { // BatchCallbackMessage message = BatchExportContext.getBatchCallbackMessage(); // log.info("导出结束:{}", JsonUtil.toJsonString(message)); // } // // @Override // public Map exportCheckResultDetail( // Long checkResultId, // ) { // // 查询校验异常 // SalaryCheckResultPO checkResult = salaryCheckResultService.getById(checkResultId); // // 查询校验异常明细 // ExcelSheetData excelSheetData = buildDetailExcelSheetData(checkResult, simpleEmployee.getEmployeeId()); // ExportExcelInfo exportExcelInfo = ExportExcelInfo.builder() // .fileName("校验异常明细") // .dataType("校验异常明细") // .function(excelExportParam.getFunction()) // .handlerName("salaryCheckResultDetailHandler") // .flag(true) // .bizId(String.valueOf(excelExportParam.getBiz())) // .module(excelExportParam.getModule()) // .userId(simpleEmployee.getEmployeeId()) // .tenantKey(tenantKey) // .operator(simpleEmployee.getUsername()) // .eteamsId(eteamsId) // .build(); // return salaryBatchService.simpleExportExcel(exportExcelInfo, Collections.singletonList(excelSheetData)); // } // // @BatchExportHandler("salaryCheckResultDetailHandler") // private void salaryCheckResultDetailHandler() { // BatchCallbackMessage message = BatchExportContext.getBatchCallbackMessage(); // log.info("导出结束:{}", JsonUtil.toJsonString(message)); // } // // private ExcelSheetData buildDetailExcelSheetData(SalaryCheckResultPO checkResult, Long employeeId) { // // 查询校验异常中的校验规则 // SalarySobCheckRulePO checkRule = salarySobCheckRuleService.getById(checkResult.getSalaryCheckRuleId()); // // 查询校验异常明细 // List salaryCheckResultRecords = salaryCheckResultDetailService.listByCheckResultId(checkResult.getId()); // String[] headers = new String[]{"规则名称", "规则内容", "姓名"}; // List> rows = Lists.newArrayList(); // ExcelSheetData excelSheetData = new ExcelSheetData(); // excelSheetData.setSheetName("校验异常"); // excelSheetData.setHeaders(Collections.singletonList(headers)); // excelSheetData.setRows(rows); // if (CollectionUtils.isEmpty(salaryCheckResultRecords)) { // return excelSheetData; // } // List employeeIds = SalaryEntityUtil.properties(salaryCheckResultRecords, SalaryCheckResultRecordPO::getEmployeeId, Collectors.toList()); // List simpleEmployees = hrmCommonEmployeeService.getEmployeeByIds(employeeIds); // Map simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); // List expressFormulas = getSalaryFormulaService(user).listExpressFormula(Collections.singleton(checkResult.getFormulaId())); // Map formulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula); // for (SalaryCheckResultRecordPO salaryCheckResultRecord : salaryCheckResultRecords) { // List row = Lists.newArrayListWithExpectedSize(3); // row.add(checkRule.getName()); // row.add(formulaMap.getOrDefault(salaryCheckResultRecord.getFormulaId(), "")); // row.add(simpleEmployeeMap.getOrDefault(salaryCheckResultRecord.getEmployeeId(), "")); // rows.add(row); // } // return excelSheetData; // } }