package com.engine.salary.service.impl; import cn.hutool.core.util.NumberUtil; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.cloudstore.dev.api.util.Util_DataCache; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.hrmelog.entity.dto.LoggerContext; import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.config.SalaryElogConfig; 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.*; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.*; import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO; import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.bo.SalarySobItemAggregateBO; import com.engine.salary.entity.salarysob.dto.SalarySobEmpFieldDTO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; 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.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.OperateTypeEnum; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum; import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum; import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.SQLMapper; 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.*; import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.excel.ExcelParseHelper; import com.engine.salary.util.excel.ExcelSupport; import com.engine.salary.util.excel.ExcelUtilPlus; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.ValidUtil; import com.engine.salary.wrapper.SalarySobItemWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.wbi.util.Util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import weaver.conn.RecordSet; import weaver.file.ImageFileManager; import weaver.general.BaseBean; import weaver.hrm.User; import java.io.InputStream; import java.math.BigDecimal; 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.sys.constant.SalarySysConstant.SALARY_ACCT_FIXED_COLUMNS; 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 SalarySobService getSalarySobService(User user) { return ServiceUtil.getService(SalarySobServiceImpl.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 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 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); } private SalarySobItemWrapper getSalarySobItemWrapper(User user) { return ServiceUtil.getService(SalarySobItemWrapper.class, user); } private SalaryArchiveService getSalaryArchiveService(User user) { return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user); } private SalaryAcctResultTemplateService getSalaryAcctResultTemplateService(User user) { return ServiceUtil.getService(SalaryAcctResultTemplateServiceImpl.class, user); } public UfXzhlbService getUfXzhlbService(User user) { return ServiceUtil.getService(UfXzhlbServiceImpl.class, user); } private SQLMapper getSQLMapper() { return MapperProxyFactory.getProxy(SQLMapper.class); } @Override public XSSFWorkbook exportSalaryAcctEmployee(SalaryAcctEmployeeQueryParam queryParam) { ValidUtil.doValidator(queryParam); SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); if (salaryAcctRecordPO == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0,"薪资核算记录不存在或已被删除")); } // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542307, "核算人员范围"); // 2.表头 String[] header = { SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),15890, "员工状态"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),1516, "入职日期") // SalaryI18nUtil.getI18nLabel(user.getLanguage(),15961, "离职日期") }; 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); // 记录日志 SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()); SalaryLoggerUtil.recordExportSingleLog(SalaryElogConfig.salaryAcctRecordLoggerTemplate, queryParam.getSalaryAcctRecordId(), targetName, SalaryI18nUtil.getI18nLabel(0, "导出薪资核算人员"), SalaryI18nUtil.getI18nLabel(0, "导出薪资核算人员") + ":" + targetName, user ); // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } @Override public XSSFWorkbook exportReducedEmployee(SalaryAcctEmployeeQueryParam queryParam) { ValidUtil.doValidator(queryParam); SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); if (salaryAcctRecordPO == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "薪资核算记录不存在或已被删除")); } // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542308, "环比上月减少人员"); // 2.表头 String[] header = { SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),15890, "员工状态"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),1516, "入职日期") // SalaryI18nUtil.getI18nLabel(user.getLanguage(),15961, "离职日期") }; 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); // 记录日志 SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()); SalaryLoggerUtil.recordExportSingleLog(SalaryElogConfig.salaryAcctRecordLoggerTemplate, queryParam.getSalaryAcctRecordId(), targetName, SalaryI18nUtil.getI18nLabel(0, "导出环比上月减少人员"), SalaryI18nUtil.getI18nLabel(0, "导出环比上月减少人员") + ":" + targetName, user ); // return ExcelUtil.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookV2(rows, sheetName); } @Override public XSSFWorkbook exportAddedEmployee(SalaryAcctEmployeeQueryParam queryParam) { ValidUtil.doValidator(queryParam); // 1.工作簿名称 String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542309, "环比上月增加人员"); // 2.表头 String[] header = { SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),15890, "员工状态"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),1516, "入职日期") // SalaryI18nUtil.getI18nLabel(user.getLanguage(),15961, "离职日期") }; 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); // 记录日志 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()); LoggerContext loggerContext = new LoggerContext<>(); loggerContext.setUser(user); loggerContext.setTargetId("" + salaryAcctRecordPO.getId()); loggerContext.setTargetName(targetName); loggerContext.setOperateType(OperateTypeEnum.ADD.getValue()); loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(0, "导出环比增加人员")); loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(0, "导出环比增加人员") + ":" + targetName); SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext); 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, user)); } 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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // excel导出的表头 List headerColumnGroup = Lists.newArrayList(); // 查询列表的表头 List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); //判断是否按照自定义字段导出表头 List finalWeaTableColumns = new ArrayList<>(); if (queryParam.getSalaryItemIds() != null) { //获取人员基本信息字段(汇总) Collection> empFieldList = getSalarySobItemWrapper(user).empFieldList(); List empFieldIdList = new ArrayList<>(); empFieldList.forEach(f -> empFieldIdList.add(f.get("id"))); // 必须选择导出所需的薪资项目 if (CollectionUtils.isEmpty(queryParam.getSalaryItemIds())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542311, "参数错误,请选择导入模板所需的薪资项目")); } 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 (empFieldIdList.contains(tableColumn.getColumn()) || headerRangeList.contains(tableColumn.getColumn())) { finalWeaTableColumns.add(columnGroupItem); } } } else { finalWeaTableColumns = weaTableColumns; } // parseHeader(headerColumnGroup, weaTableColumns); parseHeader(headerColumnGroup, finalWeaTableColumns); // // excel导出的表头 // List headerList = new ArrayList<>(weaTableColumns); List headerList = new ArrayList<>(finalWeaTableColumns); // 查询薪资核算结果 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.forEach((k, v) -> { if (NumberUtils.isCreatable(v.toString())) { sumRow.put(k, new BigDecimal(v.toString())); } }); } if (sumRow != null) { sumRow.put("taxAgentName", SalaryI18nUtil.getI18nLabel(user.getLanguage(),523, "总计")); resultMapList.add(sumRow); } } // excel导出的数据 String DATA_TYPE_SUFFIX = "_type"; List> rows = new ArrayList<>(); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayListWithExpectedSize(headerColumnGroup.size()); for (WeaTableColumnGroup weaTableColumn : headerColumnGroup) { String fieldType = (String) map.getOrDefault(weaTableColumn.getColumn().toString() + DATA_TYPE_SUFFIX, StringUtils.EMPTY); if (StringUtils.equals("number", fieldType)&& map.get(weaTableColumn.getColumn()) != null && NumberUtil.isNumber(map.get(weaTableColumn.getColumn()).toString())) { row.add(new BigDecimal(StringUtils.isBlank(map.get(weaTableColumn.getColumn()).toString()) ? "0" : map.get(weaTableColumn.getColumn()).toString())); } else { row.add(map.getOrDefault(weaTableColumn.getColumn(), StringUtils.EMPTY)); } } rows.add(row); } // 记录日志 SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()); SalaryLoggerUtil.recordExportSingleLog(SalaryElogConfig.salaryAcctRecordLoggerTemplate, queryParam.getSalaryAcctRecordId(), targetName, SalaryI18nUtil.getI18nLabel(0, "导出薪资核算结果"), SalaryI18nUtil.getI18nLabel(0, "导出薪资核算结果") + ":" + targetName, user ); String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542310, "薪资核算结果"); // return ExcelUtil.genWorkbookV2(rows, sheetName, total); return ExcelUtilPlus.genWorkbookWithChildTitleColumnWithExcelFormat(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); // 构建薪资核算结果列表表头 List columnList = SalaryAcctResultBO.buildTableColumns(salarySobItemAggregateDTO, ListUtils.emptyIfNull(salaryAcctRecordPO.getLockSalaryItemIds())); // 获取固定列头数 SalarySysConfPO salaryAcctFixedColumns = getSalarySysConfMapper().getOneByCode(SALARY_ACCT_FIXED_COLUMNS); if (salaryAcctFixedColumns != null) { int fixedNum = NumberUtils.isCreatable(salaryAcctFixedColumns.getConfValue()) ? Integer.valueOf(salaryAcctFixedColumns.getConfValue()) : 3; if (fixedNum == 0) { fixedNum = 3; } for (int i = 0; i < fixedNum; i++) { columnList.get(i).setFixed("left"); } } return columnList; } /** * 报表表头 * * @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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // 查询薪资核算记录所用的薪资账套的薪资项目副本 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 -> { //获取name(多语言) SalaryItemPO salaryItemPO = salaryItemMap.get(salarySobItemPO.getSalaryItemId()); String name = ""; if (salaryItemPO != null) { // name = salaryItemPO.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(),salaryItemPO.getLabelId(),salaryItemPO.getName()) : salaryItemPO.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name name = weaver.general.Util.formatMultiLang(salaryItemPO.getName(), String.valueOf(user.getLanguage())); } return SalaryAcctImportFieldDTO.ImportFieldDTO.builder() .salaryItemId(salarySobItemPO.getSalaryItemId()) .salaryItemName(name) .dataType(Optional.ofNullable(salaryItemMap.get(salarySobItemPO.getSalaryItemId())).map(SalaryItemPO::getDataType).orElse(SalaryDataTypeEnum.NUMBER.getValue())) .build(); }) .collect(Collectors.toList()); //获取name(多语言) String groupName = ""; // groupName = groupPO.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(), groupPO.getLabelId(), groupPO.getName()) : groupPO.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name groupName = Util.formatMultiLang(groupPO.getName(), String.valueOf(user.getLanguage())); itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder() .salarySobItemGroupId(groupPO.getId()) .salarySobItemGroupName(groupName) .salaryItems(items) .sortedIndex(groupPO.getSortedIndex()).build()); } // 未分类 List noGroupItems = salarySobItemPOMap.getOrDefault(0L, Collections.emptyList()); if (CollectionUtils.isNotEmpty(noGroupItems)) { List items = noGroupItems.stream() .map(salarySobItemPO -> { //获取name(多语言) SalaryItemPO salaryItemPO = salaryItemMap.get(salarySobItemPO.getSalaryItemId()); String name = ""; if (salaryItemPO != null) { // name = salaryItemPO.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(),salaryItemPO.getLabelId(),salaryItemPO.getName()) : salaryItemPO.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name name = weaver.general.Util.formatMultiLang(salaryItemPO.getName(), String.valueOf(user.getLanguage())); } return SalaryAcctImportFieldDTO.ImportFieldDTO.builder() .salaryItemId(salarySobItemPO.getSalaryItemId()) .salaryItemName(name) .dataType(Optional.ofNullable(salaryItemMap.get(salarySobItemPO.getSalaryItemId())).map(SalaryItemPO::getDataType).orElse(SalaryDataTypeEnum.NUMBER.getValue())) .build(); }) .collect(Collectors.toList()); itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder() .salarySobItemGroupId(0L) .salarySobItemGroupName(SalaryI18nUtil.getI18nLabel(user.getLanguage(), 388970,"未分类")) .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 SalaryAcctImportFieldDTO getExportField(Long salaryAcctRecordId) { // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // 查询薪资核算记录所用的薪资账套的薪资项目副本 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 -> { //获取name(多语言) SalaryItemPO salaryItemPO = salaryItemMap.get(salarySobItemPO.getSalaryItemId()); String name = ""; if (salaryItemPO != null) { // name = salaryItemPO.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(),salaryItemPO.getLabelId(),salaryItemPO.getName()) : salaryItemPO.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name name = weaver.general.Util.formatMultiLang(salaryItemPO.getName(), String.valueOf(user.getLanguage())); } return SalaryAcctImportFieldDTO.ImportFieldDTO.builder() .salaryItemId(salarySobItemPO.getSalaryItemId()) .salaryItemName(name) .build(); }) .collect(Collectors.toList()); //获取name(多语言) String groupName = ""; // groupName = groupPO.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(), groupPO.getLabelId(), groupPO.getName()) : groupPO.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name groupName = Util.formatMultiLang(groupPO.getName(), String.valueOf(user.getLanguage())); itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder() .salarySobItemGroupId(groupPO.getId()) .salarySobItemGroupName(groupName) .salaryItems(items) .sortedIndex(groupPO.getSortedIndex()).build()); } // 未分类 List noGroupItems = salarySobItemPOMap.getOrDefault(0L, Collections.emptyList()); if (CollectionUtils.isNotEmpty(noGroupItems)) { List items = noGroupItems.stream() .map(salarySobItemPO -> { //获取name(多语言) SalaryItemPO salaryItemPO = salaryItemMap.get(salarySobItemPO.getSalaryItemId()); String name = ""; if (salaryItemPO != null) { // name = salaryItemPO.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(),salaryItemPO.getLabelId(),salaryItemPO.getName()) : salaryItemPO.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name name = weaver.general.Util.formatMultiLang(salaryItemPO.getName(), String.valueOf(user.getLanguage())); } return SalaryAcctImportFieldDTO.ImportFieldDTO.builder() .salaryItemId(salarySobItemPO.getSalaryItemId()) .salaryItemName(name) .build(); }) .collect(Collectors.toList()); itemsByGroup.add(SalaryAcctImportFieldDTO.ImportFieldByGroupDTO.builder() .salarySobItemGroupId(0L) .salarySobItemGroupName(SalaryI18nUtil.getI18nLabel(user.getLanguage(), 388970,"未分类")) .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); // 从缓存中获取所选的薪资项目 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); // 必须选择导入模板所需的薪资项目 if (CollectionUtils.isEmpty(checkItems)) { // 获取所有可以选择的薪资项目 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId()); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(), 542300, "薪资核算记录不存在或已被删除")); } // 查询薪资核算记录所用的薪资账套的薪资项目副本 List salarySobItems = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); List salaryItemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId, Collectors.toList()); if (CollectionUtils.isEmpty(salaryItemIds)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(), 545752, "该核算记录不存在薪资项目")); } checkItems = salaryItemIds; } param.setSalaryItemIds(checkItems); // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId()); if (Objects.isNull(salaryAcctRecordPO)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // // 模板表头(默认必带"个税扣缴义务人"、"姓名") // List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名"), // SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门"), // SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号"), // SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号"), // SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人")); // 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); // excel导出的数据 List> rows = new ArrayList<>(); rows.add(headerList); if (param.getImportType() != null && param.getImportType().equals("true")) { // 需要导出现有数据,查询薪资核算结果 List> resultMapList = getSalaryAcctResultService(user).listByParam(param); 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 = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542312, "薪资核算导入模板"); 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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // 查询线下对比结果 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 (WeaTableColumnGroup weaTableColumnGroup : salaryComparisonResultListDTO.getWeaTableColumns()) { // 员工信息字段 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() + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542313, " (线上值)")); headerList.add(weaTableColumnGroup.getText() + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542314, " (线下值)")); } } else { for (WeaTableColumnGroup children : childrenList) { if (salaryItemIds.contains(children.getColumn())) { headerList.add(children.getText() + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542313, " (线上值)")); headerList.add(children.getText() + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542314, " (线下值)")); } } } } } List> resultMapList = salaryComparisonResultListDTO.getData().getList(); // excel导出的数据 List> rows = new ArrayList<>(); rows.add(headerList); for (Map map : resultMapList) { List row = Lists.newArrayList(); for (WeaTableColumnGroup weaTableColumnGroup : salaryComparisonResultListDTO.getWeaTableColumns()) { // 员工信息字段的值 if (employeeFieldCodeSet.contains(weaTableColumnGroup.getColumn())) { row.add(map.get(weaTableColumnGroup.getColumn())); } // 薪资项目的值 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); } // 记录日志 SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()); SalaryLoggerUtil.recordExportSingleLog(SalaryElogConfig.salaryAcctRecordLoggerTemplate, queryParam.getSalaryAcctRecordId(), targetName, SalaryI18nUtil.getI18nLabel(0, "导出线下对比结果"), SalaryI18nUtil.getI18nLabel(0, "导出线下对比结果") + ":" + targetName, user ); String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542315, "线下对比结果"); // 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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // // 模板表头(默认必带"个税扣缴义务人"、"姓名") // List headerList = Lists.newArrayList(SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人")); // //定位人员带“部门”,“手机号”,“工号” // headerList.add(SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门")); // headerList.add(SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号")); // headerList.add(SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号")); // 查询薪资账套下的薪资项目 SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // // 员工信息 // for (SalarySobEmpFieldDTO item : salarySobItemAggregateDTO.getEmpFields()) { // if (!SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名").equals(item.getFieldName()) && !SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人").equals(item.getFieldName())) { // if ("手机".equals(item.getFieldName())) { // headerList.add(SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号")); // } 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()); // } // 无分类薪资项目id List noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList()); // 查询列表的表头 List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); List finalWeaTableColumns = new ArrayList<>(); // 查询薪资核算所用的薪资账套的员工信息字段 List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); List salarySobEmpFieldDTOS = new SalarySobItemAggregateBO().buildEmpField(salarySobEmpFieldPOS, user); salarySobEmpFieldDTOS.stream().forEach(empField -> finalWeaTableColumns.add(new WeaTableColumnGroup("150", SalaryI18nUtil.getI18nLabel(0, empField.getFieldName()), SalaryI18nUtil.getI18nLabel(0, empField.getFieldName())))); 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(finalWeaTableColumns); String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542316, "线下对比结果导入模板"); // return ExcelUtil.genWorkbookV2(rows, sheetName); // return ExcelUtilPlus.genWorkbookV2(rows, sheetName); return ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, false); } 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, 1)); map.put("list", ExcelParseHelper.parse2List(sheet, 2, 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 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) { //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(user.getLanguage(),542300, "薪资核算记录不存在或已被删除")); } // 薪资账套下的薪资项目副本 List salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // 薪资项目 Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId); List salaryItems = getSalaryItemService(user).listByIds(salaryItemIds); //获取SalaryItemPO的id-name集合关系map // Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getName, SalaryItemPO::getId); Map salaryItemMap = new HashMap<>(); for (SalaryItemPO po : salaryItems) { String name = ""; // name = po.getLabelId() != null ? SalaryI18nUtil.getI18nLabel(user.getLanguage(),po.getLabelId(),po.getName()) : po.getName(); //20231113逻辑变更,对福利险种、薪资项目、薪资项目分组的名称舍弃基于labelId的多语言适配逻辑,直接以多语言命名方式设置name name = weaver.general.Util.formatMultiLang(po.getName(), String.valueOf(user.getLanguage())); if (StringUtils.isNotBlank(name)) { salaryItemMap.put(name, po.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); // 薪资核算人员信息字段 List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); List salarySobEmpFields = SalaryEntityUtil.properties(new SalarySobItemAggregateBO().buildEmpField(salarySobEmpFieldPOS, user), SalarySobEmpFieldDTO::getFieldName, Collectors.toList()); List excludeFields = Arrays.asList(SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门"), SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034,"姓名")); salarySobEmpFields = salarySobEmpFields.stream().filter(field -> !excludeFields.contains(field)).collect(Collectors.toList()); // 索引(用于计算进度) 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(SalaryI18nUtil.getI18nLabel(user.getLanguage(),542317,"表头为空")); } if (CollectionUtils.isEmpty(data)) { throw new RuntimeException(SalaryI18nUtil.getI18nLabel(user.getLanguage(),508873,"无数据")); } for (int i = 0; i < data.size(); i++) { // String row = "第" + (i + 3) + "行"; String row = SalaryI18nUtil.getI18nLabel(user.getLanguage(),542129,"错误行") + (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(SalaryI18nUtil.getI18nLabel(user.getLanguage(),27511,"部门"), ""); String mobile = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号"), ""); String workcode = (String) map.getOrDefault(SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号"), ""); if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(user.getLanguage(),25034, "姓名"), dataKey.toString())) { usernameIndex = j; if (StringUtils.isEmpty(dataValue) && "0".equals(confValue)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542130,"姓名不能为空")); excelComments.add(errorMessageMap); //salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),542130,"姓名不能为空"), i, i, j, j); } else { //筛选导入人员信息可以在人力资源池中匹配到的人员信息 List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(confValue, salaryEmployees, dataValue, deparmentName, mobile, workcode, null); if (CollectionUtils.isEmpty(employeeSameIds)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542133,"姓名错误,系统内不存在该姓名")); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),542133, "姓名错误,系统内不存在该姓名"), 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 + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542132,"员工信息不存在或者存在多个员工")); 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(user.getLanguage(),27511,"部门"), dataKey.toString()) || StringUtils.equals(SalaryI18nUtil.getI18nLabel(user.getLanguage(),125238, "手机号"), dataKey.toString()) || StringUtils.equals(SalaryI18nUtil.getI18nLabel(user.getLanguage(),1933,"工号"), dataKey.toString()) || salarySobEmpFields.contains(dataKey.toString())) { } else if (StringUtils.equals(SalaryI18nUtil.getI18nLabel(user.getLanguage(),537996, "个税扣缴义务人"), dataKey.toString())) { if (StringUtils.isEmpty(dataValue)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542134,"个税扣缴义务人不能为空")); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),542134, "个税扣缴义务人不能为空"), 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(user.getLanguage(),542318, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人")); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),542318, "个税扣缴义务人错误,系统内不存在该个税扣缴义务人"), 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(user.getLanguage(),542319, "本次核算所用账套不包含该薪资项目")); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),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) && j == headers.size() - 1 && !salaryAcctEmployeeMap.containsKey(employeeId + "-" + taxAgentId)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542320, "本次薪资核算不包含该人员")); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),542320, "本次薪资核算不包含该人员"), i, i, usernameIndex, usernameIndex); } // 如果个税扣缴义务人+人员目前不在核算人员里面,不支持导入 if (StringUtils.equals("importSalaryAcctResult", importType) && (employeeId != null && employeeId > 0) && (taxAgentId != null && taxAgentId > 0) && j == headers.size() - 1 && !salaryAcctEmployeeMap.containsKey(employeeId + "-" + taxAgentId)) { isError = true; Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(user.getLanguage(),542320, "本次薪资核算不包含该人员")); excelComments.add(errorMessageMap); // salaryBatchService.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(user.getLanguage(),542320, "本次薪资核算不包含该人员"), 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); // 备份一份加密前的值 List list4log = new ArrayList<>(); salaryAcctResults.stream().forEach(source -> { SalaryAcctResultPO target = new SalaryAcctResultPO(); BeanUtils.copyProperties(source,target); list4log.add(target); }); getSalaryAcctResultService(user).batchSave(salaryAcctResults); // 记录操作日志 TODO 这里的数据没有id,id是自增的重新查数据太多效率太低 SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId()); String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth()); LoggerContext loggerContext = new LoggerContext<>(); loggerContext.setUser(user); loggerContext.setTargetId(param.getSalaryAcctRecordId().toString()); loggerContext.setTargetName(targetName); loggerContext.setOperateType(OperateTypeEnum.EXCEL_IMPORT.getValue()); loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel( 0, "导入薪资核算数据")); loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel( 0, "导入薪资核算数据 ") + targetName); loggerContext.setOldValueList(list4log); SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext); // 存储薪资核算结果数据来源日志 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); } } /** * @return void * @description * @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()); } }); } /** * 保存导出模板 * @param saveParam */ @Override public void saveExportTemplate(SalaryAcctResultTemplateSaveParam saveParam) { ValidUtil.doValidator(saveParam); Long salaryAcctRecordId = saveParam.getSalaryAcctRecordId(); SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId); if (salaryAcctRecordPO == null) { throw new SalaryRunTimeException("薪资核算记录不存在"); } saveParam.setSalarySobId(salaryAcctRecordPO.getSalarySobId()); List templateBySobId = getSalaryAcctResultTemplateService(user).listBySalarySobId(saveParam.getSalarySobId()); if (saveParam.getId() != null) { Optional saveNameOptional = templateBySobId.stream().filter(po -> po.getTemplateName().equals(saveParam.getTemplateName()) && !po.getId().equals(saveParam.getId())).findFirst(); if (saveNameOptional.isPresent()) { throw new SalaryRunTimeException("该账套中已经存在同名模板,请重新设置后保存"); } // 更新 SalaryAcctResultTemplatePO salaryAcctResultTemplatePO = getSalaryAcctResultTemplateService(user).getById(saveParam.getId()); if (salaryAcctResultTemplatePO == null) { throw new SalaryRunTimeException("模板不存在,或已被删除"); } salaryAcctResultTemplatePO.setSalaryItemIds(StringUtils.join(saveParam.getSalaryItemIds(), ",")); salaryAcctResultTemplatePO.setTemplateName(saveParam.getTemplateName()); salaryAcctResultTemplatePO.setUpdateTime(new Date()); getSalaryAcctResultTemplateService(user).update(salaryAcctResultTemplatePO); } else { Optional saveNameOptional = templateBySobId.stream().filter(po -> po.getTemplateName().equals(saveParam.getTemplateName())).findFirst(); if (saveNameOptional.isPresent()) { throw new SalaryRunTimeException("该账套中已经存在同名模板,请重新设置后保存"); } // 新建 Date now = new Date(); getSalaryAcctResultTemplateService(user).insertIgnoreNull(SalaryAcctResultTemplatePO.builder() .id(IdGenerator.generate()) .salarySobId(saveParam.getSalarySobId()) .salaryItemIds(StringUtils.join(saveParam.getSalaryItemIds(), ",")) .templateName(saveParam.getTemplateName()) .creator(Long.valueOf(user.getUID())) .createTime(now) .updateTime(now) .deleteType(0) .build()); } } @Override public void deleteExportTemplate(List templateIds) { getSalaryAcctResultTemplateService(user).deleteByIds(templateIds); } @Override public Map getExportTemplateForm(Long templateId) { SalaryAcctResultTemplatePO salaryAcctResultTemplatePO = getSalaryAcctResultTemplateService(user).getById(templateId); if (salaryAcctResultTemplatePO == null) { throw new SalaryRunTimeException("模板不存在或已被删除"); } Map resultMap = new HashMap<>(); resultMap.put("checkItems", StringUtils.split(salaryAcctResultTemplatePO.getSalaryItemIds(), ",")); return resultMap; } @Override public Map exportTemplateList(SalaryAcctResultTemplateSaveParam param) { SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId()); if (salaryAcctRecordPO == null){ throw new SalaryRunTimeException("薪资核算记录为空"); } List salaryAcctResultTemplatePOS = getSalaryAcctResultTemplateService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); if (StringUtils.isNotBlank(param.getTemplateName())) { salaryAcctResultTemplatePOS = salaryAcctResultTemplatePOS.stream().filter(po -> po.getTemplateName().contains(param.getTemplateName())).collect(Collectors.toList()); } List resultList = new ArrayList<>(); salaryAcctResultTemplatePOS.stream().forEach(po -> resultList.add(SalaryAcctResultTemplateDTO.builder().id(po.getId()).templateName(po.getTemplateName()).createTime(SalaryDateUtil.getFormatLocalDateTime(po.getCreateTime())).build())); PageInfo pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), resultList, SalaryAcctResultTemplateDTO.class); Map resultMap = new HashMap<>(); resultMap.put("pageInfo", pageInfo); return resultMap; } // @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; // } /** * 选择调薪层级、审批人后带出人员 * @param param */ @Override public List pltxInitEmp(PltxInitEmployeeParam param) { ValidUtil.doValidator(param); List result = new ArrayList<>(); RecordSet rs = new RecordSet(); BaseBean bb = new BaseBean(); if (StringUtils.isBlank(param.getSxrq())) { throw new SalaryRunTimeException("生效日期不能为空"); } // 查询港湾职位信息 BaseBean baseBean = new BaseBean(); String gwFieldId = baseBean.getPropValue("shgwSalary", "gw_field_id"); if (param.getTxcj() == 0) { // 第一层级,带出所有的被调薪人 rs.execute("select bdxr from uf_pltxjzgljmb "); List allEmps = new ArrayList<>(); // 查询所有义务人信息 List taxAgentPOS = getTaxAgentService(user).listAll(); Map taxAgentMap = SalaryEntityUtil.convert2Map(taxAgentPOS, TaxAgentPO::getName, TaxAgentPO::getId); Map taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgentPOS, TaxAgentPO::getId, TaxAgentPO::getName); List empIds = new ArrayList<>(); while (rs.next()) { // Long taxAgentId = taxAgentMap.getOrDefault(StringUtils.isBlank(rs.getString("gskjywr")) ? "" : rs.getString("gskjywr"), -1L); if (!empIds.contains(Long.valueOf(rs.getInt("bdxr")))) { allEmps.add(SalaryAcctEmployeePO.builder().employeeId(Long.valueOf(rs.getInt("bdxr"))).build()); empIds.add(Long.valueOf(rs.getInt("bdxr"))); } } // 查询这些人的基本工资 Long salaryItemId = Long.valueOf(bb.getPropValue("shgwSalary", "pltxSalaryItemId").trim()); Long gwgzItemId = Long.valueOf(bb.getPropValue("shgwSalary", "gwgzId").trim()); Long jxgzId = Long.valueOf(bb.getPropValue("shgwSalary", "jxgzId").trim()); SalaryItemPO salaryItemPO = getSalaryItemService(user).getById(salaryItemId); if (ObjectUtils.isEmpty(salaryItemPO)) { throw new SalaryRunTimeException("薪资项目不存在"); } // 查询这些人的薪资档案 // List empIds = allEmps.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList()); // List taxAgentEmpList = allEmps.stream().map(emp -> emp.getTaxAgentId() + "-" + emp.getEmployeeId()).collect(Collectors.toList()); List salaryArchivePOS = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeIds(empIds).build()); // 过滤停薪的 salaryArchivePOS = salaryArchivePOS.stream().filter(archivePO -> (!archivePO.getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue())) && !(archivePO.getRunStatus().equals(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue()))).collect(Collectors.toList()); List employeeList = getSalaryEmployeeService(user).listByIds(empIds); // 查询这些人的去年绩效分数 int lastYear = new Integer(param.getSxrq()) - 1; List> partition = Lists.partition(empIds, 500); Map lastYearJxMap = new HashMap<>(); partition.forEach(part -> { String empIdStr = StringUtils.join(part, ","); rs.execute("select jxjg,ygxm from uf_jxjjmb where nd = '" + lastYear +"' and ygxm in ( "+ empIdStr + " )"); while (rs.next()) { double jxjg = rs.getDouble("jxjg") == -1 ? 0 : rs.getDouble("jxjg"); int ygxm = rs.getInt("ygxm"); lastYearJxMap.put(Long.valueOf(ygxm), jxjg); } }); Map gwEmpGwMap = new HashMap<>(); Map gwEmpGwIdMap = new HashMap<>(); partition.forEach(part -> { // 查询港湾职位信息 String empIdStr = StringUtils.join(part, ","); rs.execute("SELECT a.id as id,zwmc,b.id as zwid FROM cus_fielddata a left join uf_zwxxjmb b on a.field"+gwFieldId+"=b.id where a.scopeid=3 and a.id in ( "+ empIdStr + " )"); while (rs.next()) { String empId = rs.getString("id"); int zwId = rs.getInt("zwid"); String zwmc = rs.getString("zwmc"); gwEmpGwMap.put(empId, zwmc); gwEmpGwIdMap.put(empId, Long.valueOf(zwId)); } }); Map employeeMap = SalaryEntityUtil.convert2Map(employeeList, DataCollectionEmployee::getEmployeeId); // 过滤薪资档案 250206逻辑变更:不再过滤个税扣缴义务人了,展示所有义务人下的数据 // salaryArchivePOS = salaryArchivePOS.stream().filter(po -> taxAgentEmpList.contains(po.getTaxAgentId()+"-"+po.getEmployeeId())).collect(Collectors.toList()); Map> archiveGroupByEmp = SalaryEntityUtil.group2Map(salaryArchivePOS, SalaryArchivePO::getEmployeeId); // key:义务人id-人员id value:薪资档案id Map salaryArchiveMap = SalaryEntityUtil.convert2Map(salaryArchivePOS, s -> s.getTaxAgentId() + "-" + s.getEmployeeId(), SalaryArchivePO::getId); List salaryItemList = new ArrayList<>(); salaryItemList.add(salaryItemId); salaryItemList.add(gwgzItemId); salaryItemList.add(jxgzId); List salaryArchiveItemList = getSalaryArchiveService(user).getCurrentEffectiveItemList(salaryArchivePOS.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()), salaryItemList); Map salaryArchiveItemMap = SalaryEntityUtil.convert2Map(salaryArchiveItemList, po -> po.getSalaryArchiveId()+"_"+po.getSalaryItemId()); allEmps.stream().forEach(emp -> { DataCollectionEmployee e = employeeMap.getOrDefault(emp.getEmployeeId(), DataCollectionEmployee.builder().build()); // 获取该人员有几条档案 List salaryArchivePOList = archiveGroupByEmp.get(emp.getEmployeeId()); if (salaryArchivePOList == null) { pltxEmployeeDTO dto = pltxEmployeeDTO.builder().employee(emp.getEmployeeId()) .employeeName(e.getUsername()) .bmId(e.getDepartmentId()) .bmName(e.getDepartmentName()) .jobTitleId(gwEmpGwIdMap.getOrDefault(weaver.general.Util.null2String(emp.getEmployeeId()), 0L)) .jobTitleName(gwEmpGwMap.getOrDefault(weaver.general.Util.null2String(emp.getEmployeeId()), "")) .build(); Double lastYearJxValue = lastYearJxMap.get(emp.getEmployeeId()) == null ? new Double(0) : lastYearJxMap.get(emp.getEmployeeId()); dto.setQnjxfs(lastYearJxValue); result.add(dto); } else { for (SalaryArchivePO salaryArchivePO : salaryArchivePOList) { // 获取他的薪资档案id Long archiveId = salaryArchiveMap.get(salaryArchivePO.getTaxAgentId() + "-" + emp.getEmployeeId()); pltxEmployeeDTO dto = pltxEmployeeDTO.builder().employee(emp.getEmployeeId()) .employeeName(e.getUsername()) .bmId(e.getDepartmentId()) .bmName(e.getDepartmentName()) .jobTitleId(gwEmpGwIdMap.getOrDefault(weaver.general.Util.null2String(emp.getEmployeeId()), 0L)) .jobTitleName(gwEmpGwMap.getOrDefault(weaver.general.Util.null2String(emp.getEmployeeId()), "")) .gskjywr(taxAgentNameMap.get(salaryArchivePO.getTaxAgentId())).build(); Double lastYearJxValue = lastYearJxMap.get(emp.getEmployeeId()) == null ? new Double(0) : lastYearJxMap.get(emp.getEmployeeId()); dto.setQnjxfs(lastYearJxValue); if (archiveId != null) { SalaryArchiveItemPO salaryArchiveItemPO = salaryArchiveItemMap.get(archiveId + "_" + salaryItemId); if (salaryArchiveItemPO != null) { Double jbgz = Double.valueOf(StringUtils.isBlank(salaryArchiveItemPO.getItemValue()) ? "0" : salaryArchiveItemPO.getItemValue()); Double gwgz = new Double(0); SalaryArchiveItemPO gwgzArchiveItemPO = salaryArchiveItemMap.get(archiveId + "_" + gwgzItemId); if (gwgzArchiveItemPO != null) { gwgz = Double.valueOf(StringUtils.isBlank(gwgzArchiveItemPO.getItemValue()) ? "0" : gwgzArchiveItemPO.getItemValue()); } Double jxgz = new Double(0); SalaryArchiveItemPO jxgzArchiveItemPO = salaryArchiveItemMap.get(archiveId + "_" + jxgzId); if (jxgzArchiveItemPO != null) { jxgz = Double.valueOf(StringUtils.isBlank(jxgzArchiveItemPO.getItemValue()) ? "0" : jxgzArchiveItemPO.getItemValue()); } dto.setJbgz(jbgz); dto.setHjgz(jbgz+gwgz+jxgz); } } result.add(dto); } } }); } else { // 是二、三、四、五、六层级,获取中间建模的值直接拉过来 if (StringUtils.isBlank(param.getSxrq())) { throw new SalaryRunTimeException("生效日期不能为空"); } RecordSet gwBmRs = new RecordSet(); rs.execute("select id from uf_txjlgljmb where nd='"+ param.getSxrq()+ "'"); rs.next(); int mainId = rs.getInt("id"); // 获取明细3数据 rs.execute("select dxbl from uf_txjlgljmb_dt3 where mainid="+mainId); BigDecimal dxysblValue= null; while (rs.next()) { String dxysbl = rs.getString("dxbl"); if (StringUtils.isNotBlank(dxysbl) && NumberUtils.isCreatable(dxysbl)) { dxysblValue = new BigDecimal(dxysbl); } } // 获取明细数据 rs.execute("select * from uf_txjlgljmb_dt1 where mainid="+mainId); Map empMap = SalaryEntityUtil.convert2Map(getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ORG), DataCollectionEmployee::getEmployeeId); while (rs.next()) { Long empId = Long.valueOf(rs.getInt("xm")); DataCollectionEmployee emp = empMap.getOrDefault(empId, DataCollectionEmployee.builder().username("").departmentName("").departmentId(0L).build()); gwBmRs.execute("SELECT a.id as id,zwmc,b.id as zwid FROM cus_fielddata a left join uf_zwxxjmb b on a.field"+gwFieldId+"=b.id where a.scopeid=3 and a.id =" + weaver.general.Util.null2String(empId)); Long zwId=0L; String zwmc=""; while (gwBmRs.next()) { zwId = Long.valueOf(gwBmRs.getInt("zwid")); zwmc = gwBmRs.getString("zwmc"); } result.add(pltxEmployeeDTO.builder() .employee(empId) .employeeName(emp.getUsername()) .bmId(emp.getDepartmentId()) .bmName(emp.getDepartmentName()) .jobTitleId(zwId) .jobTitleName(zwmc) .gskjywr(rs.getString("gskjywr")) .qnjxfs(rs.getDouble("qnjxfs") == -1 ? null : rs.getDouble("qnjxfs")) .jbgz(rs.getDouble("jbgz") == -1 ? null : rs.getDouble("jbgz")) .dx(rs.getDouble("dx") == -1 ? null : rs.getDouble("dx")) .dxhjbgz(rs.getDouble("dxhjbgz") == -1 ? null : rs.getDouble("dxhjbgz")) .dxbl(rs.getDouble("dxbl") == -1 ? null : rs.getDouble("dxbl")) .hjgz(rs.getDouble("hjgz") == -1 ? null : rs.getDouble("hjgz")) .bz(rs.getString("bz")) .nzjj(rs.getDouble("nzjj") == -1 ? null : rs.getDouble("nzjj")) .txysbl(dxysblValue == null ? null : dxysblValue.toString()) .build()); } } // 获取人民币对应的义务人 Long rmbTaxAgentId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) : null; TaxAgentPO rmbTaxAgent = getTaxAgentService(user).getById(rmbTaxAgentId); String rmbTaxAgentName = rmbTaxAgent == null ? "" : rmbTaxAgent.getName(); // 处理汇率币种信息 if (param.getBzSxrq() != null && StringUtils.isNotBlank(rmbTaxAgentName)) { Map taxAgentHlMap = new HashMap<>(); // 获取所有币种信息 Map bzMap = SalaryEntityUtil.convert2Map(getSalaryArchiveService(user).listAllBzInfo(), GwBzDTO::getId, GwBzDTO::getBz); result.stream().map(pltxEmployeeDTO::getGskjywr).filter(StringUtils::isNotBlank).distinct().forEach(ywr -> { List ufXzhlbList = getUfXzhlbService(user).listByTaxAgentName(ywr, rmbTaxAgentName, param.getBzSxrq()); if (CollectionUtils.isNotEmpty(ufXzhlbList)) { UfXzhlbPO ufXzhlbPO = ufXzhlbList.get(0); ufXzhlbPO.setYbzName(bzMap.getOrDefault(ufXzhlbPO.getYbz(), "")); taxAgentHlMap.put(ywr, ufXzhlbPO); } }); for (pltxEmployeeDTO dto : result) { UfXzhlbPO ufXzhlbPO = taxAgentHlMap.get(dto.getGskjywr()); if (ufXzhlbPO != null) { dto.setHl(ufXzhlbPO.getHl().doubleValue()); dto.setBiZhong(ufXzhlbPO.getYbz()); dto.setBiZhongName(ufXzhlbPO.getYbzName()); } } } return result.stream().filter(r -> r.getEmployee() != -1).collect(Collectors.toList()); } /** * 根据审批人,过滤能够看到、编辑的明细数据 * @param param */ @Override public List pltxFilterData(PltxInitEmployeeParam param) { BaseBean baseBean = new BaseBean(); ValidUtil.doValidator(param); RecordSet rs = new RecordSet(); List fieldList = Arrays.asList("dxyjspr", "dxejspr", "dxsajspr", "dxsijspr", "dxwjspr", "dxljspr"); List canManageList = new ArrayList<>(); baseBean.writeLog("批量调薪过滤查看, 查看人:" + param.getSpr() + ",查看时间:" + SalaryDateUtil.getFormatLocalDate(new Date()) + ",层级:" + param.getTxcj()); if (param.getTxcj() == 0) { // 一级 String sql = " SELECT bdxr FROM uf_pltxjzgljmb where dxyjspr= " + param.getSpr(); rs.execute(sql); baseBean.writeLog("exc sql1 => " + sql); while (rs.next()) { int bdxr = rs.getInt("bdxr"); String bdxr1 = rs.getString("bdxr"); baseBean.writeLog("exc sql1 bdxr:" + bdxr +"bdxr1:"+bdxr1); // String gskjywr = rs.getString("gskjywr"); canManageList.add(pltxEmployeeDTO.builder().employee(Long.valueOf(bdxr)).build()); } } else { buildCanManageList(param, fieldList, canManageList); } List bdxrs = canManageList.stream().map(pltxEmployeeDTO::getEmployee).collect(Collectors.toList()); baseBean.writeLog("批量调薪过滤查看, 结果" + bdxrs); return canManageList; } private void buildCanManageList(PltxInitEmployeeParam param, List fieldList, List canManageList ) { BaseBean baseBean = new BaseBean(); Integer txcj = param.getTxcj(); RecordSet rs = new RecordSet(); String sql = "SELECT bdxr FROM uf_pltxjzgljmb where " + fieldList.get(txcj) + "=" + param.getSpr(); rs.execute(sql); baseBean.writeLog("exc sql2 => " + sql); // List sprList = new ArrayList<>(); // for (int i = txcj; i > 0 ; i--) { // if (i == txcj) { // rs.execute(" SELECT " + fieldList.get(i-1) + " FROM uf_pltxjzgljmb where "+ fieldList.get(i)+"= " + param.getSpr()); // while (rs.next()) { // sprList.add(rs.getInt(fieldList.get(i-1))); // } // } else { // rs.execute(" SELECT " + fieldList.get(i-1) + " FROM uf_pltxjzgljmb where "+ fieldList.get(i)+ " in ( " + StringUtils.join(sprList, ",") + ")"); // while (rs.next()) { // sprList.add(rs.getInt(fieldList.get(i-1))); // } // } // } // // // 不包含当前审批人 // String sprStrWithoutCurrent = StringUtils.join(sprList, ","); // // 加上当前审批人 // sprList.add(param.getSpr()); // String sprStrs = StringUtils.join(sprList, ","); // // StringBuilder selectConditionStr = new StringBuilder(); // for (int i = 0; i <= txcj; i++) { // if (i != txcj) { // selectConditionStr.append(fieldList.get(i) + " in (" + sprStrs + ") or "); // } else { // selectConditionStr.append(fieldList.get(i) + " in (" + sprStrs + ") "); // } // } // rs.execute(" SELECT bdxr,gskjywr FROM uf_pltxjzgljmb where " + selectConditionStr.toString()); while (rs.next()) { int bdxr = rs.getInt("bdxr"); String bdxr1 = rs.getString("bdxr"); baseBean.writeLog("exc sql2 bdxr:" + bdxr +"bdxr1:"+bdxr1); // String gskjywr = rs.getString("gskjywr"); canManageList.add(pltxEmployeeDTO.builder().employee(Long.valueOf(bdxr)).build()); } } @Override public pltxEmployeeDTO pltxGetJbgz(PltxInitEmployeeParam param) { if (StringUtils.isBlank(param.getGskjywr())) { return pltxEmployeeDTO.builder().build(); } List taxAgentPOList = getTaxAgentService(user).list(TaxAgentQueryParam.builder().name(param.getGskjywr()).build()); taxAgentPOList = taxAgentPOList.stream().filter(po -> po.getName().equals(param.getGskjywr())).collect(Collectors.toList()); if (CollectionUtils.isEmpty(taxAgentPOList)) { return pltxEmployeeDTO.builder().build(); } List salaryArchivePOS = getSalaryArchiveService(user).listSome(SalaryArchivePO.builder().employeeId(Long.valueOf(param.getXm())).taxAgentId(taxAgentPOList.get(0).getId()).build()); if (CollectionUtils.isEmpty(salaryArchivePOS)) { return pltxEmployeeDTO.builder().build(); } BaseBean bb = new BaseBean(); Long salaryItemId = Long.valueOf(bb.getPropValue("shgwSalary", "pltxSalaryItemId").trim()); Long gwgzItemId = Long.valueOf(bb.getPropValue("shgwSalary", "gwgzId").trim()); Long jxgzId = Long.valueOf(bb.getPropValue("shgwSalary", "jxgzId").trim()); List salaryItemList = new ArrayList<>(); salaryItemList.add(salaryItemId); salaryItemList.add(gwgzItemId); salaryItemList.add(jxgzId); List salaryArchiveItemList = getSalaryArchiveService(user).getCurrentEffectiveItemList(salaryArchivePOS.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()), Collections.singletonList(salaryItemId)); pltxEmployeeDTO build = pltxEmployeeDTO.builder().build(); BaseBean baseBean = new BaseBean(); if (CollectionUtils.isNotEmpty(salaryArchiveItemList)) { SalaryArchiveItemPO salaryArchiveItemPO = salaryArchiveItemList.get(0); Double jbgz = Double.valueOf(StringUtils.isEmpty(salaryArchiveItemPO.getItemValue()) ? "0" : salaryArchiveItemPO.getItemValue()); Double gwgz = new Double(0); List gwgzArchiveItemList = getSalaryArchiveService(user).getCurrentEffectiveItemList(salaryArchivePOS.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()), Collections.singletonList(gwgzItemId)); if (CollectionUtils.isNotEmpty(gwgzArchiveItemList)) { SalaryArchiveItemPO itemPO = gwgzArchiveItemList.get(0); gwgz = Double.valueOf(StringUtils.isEmpty(itemPO.getItemValue()) ? "0" : itemPO.getItemValue()); } Double jxgz = new Double(0); List jxgzArchiveItemList = getSalaryArchiveService(user).getCurrentEffectiveItemList(salaryArchivePOS.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()), Collections.singletonList(jxgzId)); if (CollectionUtils.isNotEmpty(jxgzArchiveItemList)) { SalaryArchiveItemPO itemPO = jxgzArchiveItemList.get(0); jxgz = Double.valueOf(StringUtils.isEmpty(itemPO.getItemValue()) ? "0" : itemPO.getItemValue()); } // 获取员工信息 DataCollectionEmployee emp = getSalaryEmployeeService(user).getEmployeeById(salaryArchiveItemPO.getEmployeeId()); int lastYear = new Integer(param.getSxrq()) - 1; RecordSet rs = new RecordSet(); rs.execute("select jxjg,ygxm from uf_jxjjmb where nd = '" + lastYear +"' and ygxm in ( "+ salaryArchiveItemPO.getEmployeeId() + " )"); double jxjg = 0; if (rs.next()) { jxjg = rs.getDouble("jxjg") == -1 ? 0 : rs.getDouble("jxjg"); } // 查询港湾职位信息 String gwFieldId = baseBean.getPropValue("shgwSalary", "gw_field_id"); RecordSet gwBmRs = new RecordSet(); gwBmRs.execute("SELECT a.id as id,zwmc,b.id as zwid FROM cus_fielddata a left join uf_zwxxjmb b on a.field"+gwFieldId+"=b.id where a.scopeid=3 and a.id =" + param.getXm()); Long zwId=0L; String zwmc=""; while (gwBmRs.next()) { zwId = Long.valueOf(gwBmRs.getInt("zwid")); zwmc = gwBmRs.getString("zwmc"); } build.setEmployee(salaryArchiveItemPO.getEmployeeId()); build.setEmployeeName(emp.getUsername()); build.setBmId(emp.getDepartmentId()); build.setBmName(emp.getDepartmentName()); build.setJobTitleId(zwId); build.setJobTitleName(zwmc); build.setGskjywr(param.getGskjywr()); build.setJbgz(jbgz); build.setHjgz(jbgz + gwgz + jxgz); build.setQnjxfs(jxjg); } // 获取人民币对应的义务人 Long rmbTaxAgentId = NumberUtils.isCreatable(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) ? Long.valueOf(baseBean.getPropValue("shgwSalaryBz", "rmb_tax_agent_id")) : null; TaxAgentPO rmbTaxAgent = getTaxAgentService(user).getById(rmbTaxAgentId); String rmbTaxAgentName = rmbTaxAgent == null ? "" : rmbTaxAgent.getName(); // 处理汇率币种信息 if (param.getBzSxrq() != null && StringUtils.isNotBlank(rmbTaxAgentName)) { List ufXzhlbList = getUfXzhlbService(user).listByTaxAgentName(param.getGskjywr(), rmbTaxAgentName, param.getBzSxrq()); if (CollectionUtils.isNotEmpty(ufXzhlbList)) { UfXzhlbPO ufXzhlbPO = ufXzhlbList.get(0); build.setHl(ufXzhlbPO.getHl().doubleValue()); GwBzDTO bzInfoById = getSalaryArchiveService(user).getBzInfoById(ufXzhlbPO.getYbz()); build.setBiZhong(bzInfoById == null ? null : bzInfoById.getId()); build.setBiZhongName(bzInfoById == null ? "" : bzInfoById.getBz()); } } return build; } @Override public XSSFWorkbook exportFygsdReport(SalaryAcctRecordQueryParam queryParam) { Map resultMap = getSalaryAcctResultService(user).fygsdReport(queryParam); List columns = (List) resultMap.get("column"); List> dataList = (List>) resultMap.get("dataList"); // List finalColumns = columns.stream().filter(column -> !"fylx2".equals(((WeaTableColumn)column).getColumn())).collect(Collectors.toList()); List> rows = new ArrayList<>(); rows.add(columns); for (Map dataMap : dataList) { List datas = new ArrayList<>(); for (Object column : columns) { WeaTableColumn weaTableColumn = (WeaTableColumn)column; datas.add(dataMap.getOrDefault(weaTableColumn.getColumn(), "")); } rows.add(datas); } // // 无分类薪资项目id // List noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList()); // // 查询列表的表头 // List weaTableColumns = listWeaTableColumn(salaryAcctRecordPO); // List finalWeaTableColumns = new ArrayList<>(); // // 查询薪资核算所用的薪资账套的员工信息字段 // List salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId()); // List salarySobEmpFieldDTOS = new SalarySobItemAggregateBO().buildEmpField(salarySobEmpFieldPOS, user); // salarySobEmpFieldDTOS.stream().forEach(empField -> finalWeaTableColumns.add(new WeaTableColumnGroup("150", SalaryI18nUtil.getI18nLabel(0, empField.getFieldName()), SalaryI18nUtil.getI18nLabel(0, empField.getFieldName())))); // 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); // } // } String sheetName = SalaryI18nUtil.getI18nLabel(user.getLanguage(),0, "费用归属地"); return ExcelUtilPlus.genFygsdWorkbook(rows, sheetName, false); } }