weaver-hrm-salary/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl....

2144 lines
125 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
/**
* 薪资核算导入导出
* <p>Copyright: Copyright (c) 2022</p>
* <p>Company: 泛微软件</p>
*
* @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<Object> headerList = new ArrayList<>(Arrays.asList(header));
// 查询薪资核算人员
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam(queryParam);
// 组装数据
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
// 3.表数据
List<List<Object>> 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<Object> headerList = new ArrayList<>(Arrays.asList(header));
// 查询薪资核算人员(环比上月减少)
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam4Reduce(queryParam);
// 组装数据
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
// 3.表数据
List<List<Object>> 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<Object> headerList = new ArrayList<>(Arrays.asList(header));
// 查询薪资核算人员(环比上月增加)
List<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listByParam4Add(queryParam);
// 组装数据
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
// 3.表数据
List<List<Object>> 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<List<Object>> convert2ExcelRow(List<SalaryAcctEmployeePO> salaryAcctEmployees) {
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
return Collections.emptyList();
}
List<SalaryAccEmployeeListDTO> salaryAccEmployeeListDTOS = new ArrayList<>();
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployees, 1000);
for (List<SalaryAcctEmployeePO> tempList : partition) {
// 人员
List<Long> employeeIds = tempList.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList());
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIdsAll(employeeIds);
// 个税扣缴义务人
List<Long> taxAgentIds = tempList.stream().map(SalaryAcctEmployeePO::getTaxAgentId).distinct().collect(Collectors.toList());
List<TaxAgentPO> taxAgents = getTaxAgentService(user).listByIds(taxAgentIds);
// 转换成列表数据
salaryAccEmployeeListDTOS.addAll(SalaryAcctEmployeeBO.convert2EmployeeListDTO(tempList, taxAgents, simpleEmployees, user));
}
List<List<Object>> rows = Lists.newArrayListWithExpectedSize(salaryAccEmployeeListDTOS.size());
for (SalaryAccEmployeeListDTO dto : salaryAccEmployeeListDTOS) {
List<Object> 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<WeaTableColumnGroup> headerColumnGroup = Lists.newArrayList();
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
//判断是否按照自定义字段导出表头
List<WeaTableColumnGroup> finalWeaTableColumns = new ArrayList<>();
if (queryParam.getSalaryItemIds() != null) {
//获取人员基本信息字段(汇总)
Collection<Map<String, String>> empFieldList = getSalarySobItemWrapper(user).empFieldList();
List<String> 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<Object> headerRangeList = new ArrayList<>();
List<SalaryItemPO> 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<WeaTableColumnGroup> 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<Object> headerList = new ArrayList<>(weaTableColumns);
List<Object> headerList = new ArrayList<>(finalWeaTableColumns);
// 查询薪资核算结果
List<Map<String, Object>> 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<String, Object> 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<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
for (Map<String, Object> map : resultMapList) {
List<Object> 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<WeaTableColumnGroup> 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<WeaTableColumnGroup> 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<String, Object> listColumn(SalaryAcctRecordPO salaryAcctRecordPO) {
// 查询薪资账套下的薪资项目+员工信息字段
SalarySobItemAggregateDTO salarySobItemAggregateDTO = getSalarySobItemService(user).getAggregateBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 构建薪资核算结果列表表头
return SalaryAcctResultBO.buildColumns(salarySobItemAggregateDTO);
}
/**
* 解析表头
*
* @param headerList
* @param weaTableColumns
*/
private void parseHeader(List<WeaTableColumnGroup> headerList, List<WeaTableColumnGroup> 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<SalarySobItemPO> salarySobItems = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId);
// 查询薪资项目
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listByIds(salaryItemIds);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
Map<Long, List<SalarySobItemPO>> salarySobItemPOMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId);
// 查询薪资账套的薪资项目分类
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 对分组进行排序
salarySobItemGroupPOS = SalaryAcctResultBO.sortGroup(salarySobItemGroupPOS);
// 对分组内薪资项目排序
SalaryAcctResultBO.sortItem(salarySobItemPOMap);
// 根据账套分组封装薪资项目的值
List<SalaryAcctImportFieldDTO.ImportFieldByGroupDTO> itemsByGroup = new ArrayList<>();
for (SalarySobItemGroupPO groupPO : salarySobItemGroupPOS) {
List<SalarySobItemPO> groupItems = salarySobItemPOMap.getOrDefault(groupPO.getId(), Collections.emptyList());
List<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<SalarySobItemPO> noGroupItems = salarySobItemPOMap.getOrDefault(0L, Collections.emptyList());
if (CollectionUtils.isNotEmpty(noGroupItems)) {
List<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<Long> 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<SalarySobItemPO> salarySobItems = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId);
// 查询薪资项目
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listByIds(salaryItemIds);
Map<Long, SalaryItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId);
Map<Long, List<SalarySobItemPO>> salarySobItemPOMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId);
// 查询薪资账套的薪资项目分类
List<SalarySobItemGroupPO> salarySobItemGroupPOS = getSalarySobItemGroupService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 对分组进行排序
salarySobItemGroupPOS = SalaryAcctResultBO.sortGroup(salarySobItemGroupPOS);
// 对分组内薪资项目排序
SalaryAcctResultBO.sortItem(salarySobItemPOMap);
// 根据账套分组封装薪资项目的值
List<SalaryAcctImportFieldDTO.ImportFieldByGroupDTO> itemsByGroup = new ArrayList<>();
for (SalarySobItemGroupPO groupPO : salarySobItemGroupPOS) {
List<SalarySobItemPO> groupItems = salarySobItemPOMap.getOrDefault(groupPO.getId(), Collections.emptyList());
List<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<SalarySobItemPO> noGroupItems = salarySobItemPOMap.getOrDefault(0L, Collections.emptyList());
if (CollectionUtils.isNotEmpty(noGroupItems)) {
List<SalaryAcctImportFieldDTO.ImportFieldDTO> 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<Long> 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<Long> 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<SalarySobItemPO> salarySobItems = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
List<Long> 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<Object> 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<String> dataIndexList = Lists.newArrayList("username", "departmentName", "mobile", "workcode", "taxAgentName");
// // 查询薪资项目
// List<SalaryItemPO> salaryItemPOS = getSalaryItemService(user).listByIds(param.getSalaryItemIds());
// for (SalaryItemPO salaryItemPO : salaryItemPOS) {
// headerList.add(salaryItemPO.getName());
// dataIndexList.add("" + salaryItemPO.getId());
// }
//
// // 查询薪资核算结果
// List<Map<String, Object>> resultMapList = getSalaryAcctResultService(user).listByParam(param);
// // excel导出的数据
// List<List<Object>> rows = Lists.newArrayListWithExpectedSize(resultMapList.size());
// rows.add(headerList);
// for (Map<String, Object> map : resultMapList) {
// List<Object> 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<Object> headerRangeList = new ArrayList<>();
List<SalaryItemPO> 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<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
List<WeaTableColumnGroup> finalWeaTableColumns = new ArrayList<>();
for (WeaTableColumnGroup tableColumn : weaTableColumns) {
WeaTableColumnGroup columnGroupItem = (WeaTableColumnGroup) tableColumn;
if (columnGroupItem.getChildren() != null) {
List<WeaTableColumnGroup> 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<WeaTableColumnGroup> headerColumnGroup = Lists.newArrayList();
// 查询列表的表头
parseHeader(headerColumnGroup, finalWeaTableColumns);
List<Object> headerList = new ArrayList<>(finalWeaTableColumns);
// excel导出的数据
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
if (param.getImportType() != null && param.getImportType().equals("true")) {
// 需要导出现有数据,查询薪资核算结果
List<Map<String, Object>> resultMapList = getSalaryAcctResultService(user).listByParam(param);
for (Map<String, Object> map : resultMapList) {
List<Object> 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<Object> headerList = Lists.newArrayList();
// 查询薪资核算所用的薪资账套的员工信息字段
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
Set<String> employeeFieldCodeSet = SalaryEntityUtil.properties(salarySobEmpFieldPOS, SalarySobEmpFieldPO::getFieldCode);
// 查询薪资项目
List<SalaryItemPO> salaryItemPOS = getSalarySobItemService(user).listBySalarySobId4SalaryItem(salaryAcctRecordPO.getSalarySobId());
Set<String> salaryItemIds = SalaryEntityUtil.properties(salaryItemPOS, salaryItemPO -> "" + salaryItemPO.getId());
for (WeaTableColumnGroup weaTableColumnGroup : salaryComparisonResultListDTO.getWeaTableColumns()) {
// 员工信息字段
if (employeeFieldCodeSet.contains(weaTableColumnGroup.getColumn())) {
headerList.add(weaTableColumnGroup.getText());
} else {
// 薪资项目的表头
List<WeaTableColumnGroup> 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<Map<String, Object>> resultMapList = salaryComparisonResultListDTO.getData().getList();
// excel导出的数据
List<List<Object>> rows = new ArrayList<>();
rows.add(headerList);
for (Map<String, Object> map : resultMapList) {
List<Object> row = Lists.newArrayList();
for (WeaTableColumnGroup weaTableColumnGroup : salaryComparisonResultListDTO.getWeaTableColumns()) {
// 员工信息字段的值
if (employeeFieldCodeSet.contains(weaTableColumnGroup.getColumn())) {
row.add(map.get(weaTableColumnGroup.getColumn()));
}
// 薪资项目的值
List<WeaTableColumnGroup> 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<Object> 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<String> noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList());
// 查询列表的表头
List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
List<Object> finalWeaTableColumns = new ArrayList<>();
// 查询薪资核算所用的薪资账套的员工信息字段
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
List<SalarySobEmpFieldDTO> 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<List<Object>> 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<String, Object> importSalaryAcctResult(SalaryAcctImportParam param) {
return batchImport(param, "importSalaryAcctResult");
}
public Map<String, Object> importExcelAcctResult(SalaryAcctImportParam param) {
return batchImport(param, "importExcelAcctResult");
}
@Override
public Map<String, Object> preview(SalaryAcctImportParam param) {
//1、参数校验
ValidUtil.doValidator(param);
Map<String, Object> 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<Long> salaryItems) {
String cacheKey = user.getUID() + SalaryItemConstant.RESULT_IMPORT_FIELD_SIGN;
Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems));
}
@Override
public void cacheExportField(List<Long> salaryItems) {
String cacheKey = user.getUID() + SalaryItemConstant.RESULT_EXPORT_FIELD_SIGN;
Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryItems));
}
@Override
public Map<String, Object> previewImportSalaryAcctResult(SalaryAcctImportParam param) {
//1、参数校验
ValidUtil.doValidator(param);
Map<String, Object> 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<String, Object> batchImport(SalaryAcctImportParam param, String importType) {
Map<String, Object> apidatas = new HashMap<String, Object>();
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<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// 薪资项目
Set<Long> salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
List<SalaryItemPO> salaryItems = getSalaryItemService(user).listByIds(salaryItemIds);
//获取SalaryItemPO的id-name集合关系map
// Map<String, Long> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getName, SalaryItemPO::getId);
Map<String, Long> 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<SalaryAcctEmployeePO> salaryAcctEmployees = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordId(salaryAcctRecordId);
Map<String, SalaryAcctEmployeePO> salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(salaryAcctEmployees, e -> e.getEmployeeId() + "-" + e.getTaxAgentId());
// 租户下所有的人员
List<DataCollectionEmployee> salaryEmployees = getSalaryEmployeeService(user).listAllForReport();
Map<String, Long> salaryEmployeeMap = SalaryEntityUtil.convert2Map(salaryEmployees, DataCollectionEmployee::getUsername, DataCollectionEmployee::getEmployeeId);
Map<Long, DataCollectionEmployee> emps = SalaryEntityUtil.convert2Map(salaryEmployees, DataCollectionEmployee::getEmployeeId);
// 租户下所有的个税扣缴义务人
List<TaxAgentPO> taxAgents = getTaxAgentService(user).listAll();
Map<String, Long> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getName, TaxAgentPO::getId);
// 薪资核算人员信息字段
List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
List<String> salarySobEmpFields = SalaryEntityUtil.properties(new SalarySobItemAggregateBO().buildEmpField(salarySobEmpFieldPOS, user), SalarySobEmpFieldDTO::getFieldName, Collectors.toList());
List<String> 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<Map<String, String>> errorExcelSheets = Lists.newArrayList();
// 解析excel
List<Long> salaryAcctEmpIds = Lists.newArrayList();
// excel导入了哪些薪资项目
Set<Long> excelSalaryItemIds = Sets.newHashSet();
List<SalaryAcctResultPO> salaryAcctResults = Lists.newArrayList();
List<SalaryAcctResultReportPO> salaryAcctReports = Lists.newArrayList();
List<SalaryAcctEmployeePO> newSalaryAcctEmployees = Lists.newArrayList();
List<ExcelAcctResultPO> excelAcctResults = Lists.newArrayList();
InputStream fileInputStream = null;
try {
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId()));
Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
// 错误提示信息
List<Map> excelComments = Lists.newArrayList();
// 存在错误的那行数据
List<Map<String, Object>> errorDatas = Lists.newArrayList();
// 表头
// List<String> headers = ExcelSupport.getSheetHeader(sheet, 0);
List<String> headers;
// if (StringUtils.equals("importSalaryAcctResult", importType)) {
headers = ExcelSupport.getSheetHeader(sheet, 1);
// } else {
// headers = ExcelSupport.getSheetHeader(sheet, 0);
// }
// 处理数值
// List<Map<String, Object>> data = ExcelParseHelper.parse2Map(sheet, 1);
List<Map<String, Object>> 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<String, Object> map = data.get(i);
Long employeeId = 0L;
Long taxAgentId = 0L;
List<SalaryAcctResultPO> salaryAcctResultsOfOneEmp = Lists.newArrayListWithExpectedSize(headers.size() - 1);
List<SalaryAcctResultReportPO> salaryAcctResultReportOfOneEmp = Lists.newArrayListWithExpectedSize(headers.size() - 1);
List<ExcelAcctResultPO> 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<String, String> 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<DataCollectionEmployee> employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(confValue, salaryEmployees, dataValue, deparmentName, mobile, workcode, null);
if (CollectionUtils.isEmpty(employeeSameIds)) {
isError = true;
Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<SalaryAcctResultPO> 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<SalaryAcctResultPO> list4log = new ArrayList<>();
salaryAcctResults.stream().forEach(source -> {
SalaryAcctResultPO target = new SalaryAcctResultPO();
BeanUtils.copyProperties(source,target);
list4log.add(target);
});
getSalaryAcctResultService(user).batchSave(salaryAcctResults);
// 记录操作日志 TODO 这里的数据没有idid是自增的重新查数据太多效率太低
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<SalaryAcctResultPO> salaryAcctResults) {
List<Long> salaryAcctEmpIds = salaryAcctResults.stream().map(SalaryAcctResultPO::getSalaryAcctEmpId).distinct().collect(Collectors.toList());
Set<Long> salaryItemIds = salaryAcctResults.stream().map(SalaryAcctResultPO::getSalaryItemId).collect(Collectors.toSet());
// 查询导入的薪资核算结果
List<SalaryAcctResultPO> salaryAcctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds);
Long uid = Long.valueOf(user.getUID());
List<SalaryAcctResultLogPO> 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<SalaryAcctResultPO> deleteResults, List<SalaryAcctResultPO> salaryAcctResults) {
Map<String, List<SalaryAcctResultPO>> deleteMap = SalaryEntityUtil.group2Map(deleteResults, po -> po.getSalaryAcctEmpId() + "-" + po.getSalaryItemId());
salaryAcctResults.stream().forEach(result -> {
List<SalaryAcctResultPO> 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<SalaryAcctResultTemplatePO> templateBySobId = getSalaryAcctResultTemplateService(user).listBySalarySobId(saveParam.getSalarySobId());
if (saveParam.getId() != null) {
Optional<SalaryAcctResultTemplatePO> 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<SalaryAcctResultTemplatePO> 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<Long> templateIds) {
getSalaryAcctResultTemplateService(user).deleteByIds(templateIds);
}
@Override
public Map<String, Object> getExportTemplateForm(Long templateId) {
SalaryAcctResultTemplatePO salaryAcctResultTemplatePO = getSalaryAcctResultTemplateService(user).getById(templateId);
if (salaryAcctResultTemplatePO == null) {
throw new SalaryRunTimeException("模板不存在或已被删除");
}
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("checkItems", StringUtils.split(salaryAcctResultTemplatePO.getSalaryItemIds(), ","));
return resultMap;
}
@Override
public Map<String, Object> exportTemplateList(SalaryAcctResultTemplateSaveParam param) {
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(param.getSalaryAcctRecordId());
if (salaryAcctRecordPO == null){
throw new SalaryRunTimeException("薪资核算记录为空");
}
List<SalaryAcctResultTemplatePO> 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<SalaryAcctResultTemplateDTO> resultList = new ArrayList<>();
salaryAcctResultTemplatePOS.stream().forEach(po -> resultList.add(SalaryAcctResultTemplateDTO.builder().id(po.getId()).templateName(po.getTemplateName()).createTime(SalaryDateUtil.getFormatLocalDateTime(po.getCreateTime())).build()));
PageInfo<SalaryAcctResultTemplateDTO> pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), resultList, SalaryAcctResultTemplateDTO.class);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("pageInfo", pageInfo);
return resultMap;
}
// @Override
// public Map<String, Object> exportCheckResult(
// SalaryCheckResultExportParam exportParam,
// ) {
// // 查询薪资核算结果校验异常
// List<SalaryCheckResultPO> salaryCheckResults = salaryCheckResultService.listBySalaryAcctRecordId(exportParam.getSalaryAcctRecordId());
// List<ExcelSheetData> 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<String, Object> 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<SalaryCheckResultRecordPO> salaryCheckResultRecords = salaryCheckResultDetailService.listByCheckResultId(checkResult.getId());
// String[] headers = new String[]{"规则名称", "规则内容", "姓名"};
// List<List<Object>> rows = Lists.newArrayList();
// ExcelSheetData excelSheetData = new ExcelSheetData();
// excelSheetData.setSheetName("校验异常");
// excelSheetData.setHeaders(Collections.singletonList(headers));
// excelSheetData.setRows(rows);
// if (CollectionUtils.isEmpty(salaryCheckResultRecords)) {
// return excelSheetData;
// }
// List<Long> employeeIds = SalaryEntityUtil.properties(salaryCheckResultRecords, SalaryCheckResultRecordPO::getEmployeeId, Collectors.toList());
// List<DataCollectionEmployee> simpleEmployees = hrmCommonEmployeeService.getEmployeeByIds(employeeIds);
// Map<Long, String> simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername);
// List<ExpressFormula> expressFormulas = getSalaryFormulaService(user).listExpressFormula(Collections.singleton(checkResult.getFormulaId()));
// Map<Long, String> formulaMap = SalaryEntityUtil.convert2Map(expressFormulas, ExpressFormula::getId, ExpressFormula::getFormula);
// for (SalaryCheckResultRecordPO salaryCheckResultRecord : salaryCheckResultRecords) {
// List<Object> 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<pltxEmployeeDTO> pltxInitEmp(PltxInitEmployeeParam param) {
ValidUtil.doValidator(param);
List<pltxEmployeeDTO> 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<SalaryAcctEmployeePO> allEmps = new ArrayList<>();
// 查询所有义务人信息
List<TaxAgentPO> taxAgentPOS = getTaxAgentService(user).listAll();
Map<String, Long> taxAgentMap = SalaryEntityUtil.convert2Map(taxAgentPOS, TaxAgentPO::getName, TaxAgentPO::getId);
Map<Long, String> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgentPOS, TaxAgentPO::getId, TaxAgentPO::getName);
List<Long> 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<Long> empIds = allEmps.stream().map(SalaryAcctEmployeePO::getEmployeeId).collect(Collectors.toList());
// List<String> taxAgentEmpList = allEmps.stream().map(emp -> emp.getTaxAgentId() + "-" + emp.getEmployeeId()).collect(Collectors.toList());
List<SalaryArchivePO> 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<DataCollectionEmployee> employeeList = getSalaryEmployeeService(user).listByIds(empIds);
// 查询这些人的去年绩效分数
int lastYear = new Integer(param.getSxrq()) - 1;
List<List<Long>> partition = Lists.partition(empIds, 500);
Map<Long, Double> 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<String, String> gwEmpGwMap = new HashMap<>();
Map<String, Long> 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<Long, DataCollectionEmployee> employeeMap = SalaryEntityUtil.convert2Map(employeeList, DataCollectionEmployee::getEmployeeId);
// 过滤薪资档案 250206逻辑变更不再过滤个税扣缴义务人了展示所有义务人下的数据
// salaryArchivePOS = salaryArchivePOS.stream().filter(po -> taxAgentEmpList.contains(po.getTaxAgentId()+"-"+po.getEmployeeId())).collect(Collectors.toList());
Map<Long, List<SalaryArchivePO>> archiveGroupByEmp = SalaryEntityUtil.group2Map(salaryArchivePOS, SalaryArchivePO::getEmployeeId);
// key:义务人id-人员id value:薪资档案id
Map<String, Long> salaryArchiveMap = SalaryEntityUtil.convert2Map(salaryArchivePOS, s -> s.getTaxAgentId() + "-" + s.getEmployeeId(), SalaryArchivePO::getId);
List<Long> salaryItemList = new ArrayList<>();
salaryItemList.add(salaryItemId);
salaryItemList.add(gwgzItemId);
salaryItemList.add(jxgzId);
List<SalaryArchiveItemPO> salaryArchiveItemList = getSalaryArchiveService(user).getCurrentEffectiveItemList(salaryArchivePOS.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()), salaryItemList);
Map<String, SalaryArchiveItemPO> salaryArchiveItemMap = SalaryEntityUtil.convert2Map(salaryArchiveItemList, po -> po.getSalaryArchiveId()+"_"+po.getSalaryItemId());
allEmps.stream().forEach(emp -> {
DataCollectionEmployee e = employeeMap.getOrDefault(emp.getEmployeeId(), DataCollectionEmployee.builder().build());
// 获取该人员有几条档案
List<SalaryArchivePO> 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<Long, DataCollectionEmployee> 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<String, UfXzhlbPO> taxAgentHlMap = new HashMap<>();
// 获取所有币种信息
Map<Integer, String> bzMap = SalaryEntityUtil.convert2Map(getSalaryArchiveService(user).listAllBzInfo(), GwBzDTO::getId, GwBzDTO::getBz);
result.stream().map(pltxEmployeeDTO::getGskjywr).filter(StringUtils::isNotBlank).distinct().forEach(ywr -> {
List<UfXzhlbPO> 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<pltxEmployeeDTO> pltxFilterData(PltxInitEmployeeParam param) {
BaseBean baseBean = new BaseBean();
ValidUtil.doValidator(param);
RecordSet rs = new RecordSet();
List<String> fieldList = Arrays.asList("dxyjspr", "dxejspr", "dxsajspr", "dxsijspr", "dxwjspr", "dxljspr");
List<pltxEmployeeDTO> 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<Long> bdxrs = canManageList.stream().map(pltxEmployeeDTO::getEmployee).collect(Collectors.toList());
baseBean.writeLog("批量调薪过滤查看, 结果" + bdxrs);
return canManageList;
}
private void buildCanManageList(PltxInitEmployeeParam param, List<String> fieldList, List<pltxEmployeeDTO> 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<Integer> 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<TaxAgentPO> 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<SalaryArchivePO> 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<Long> salaryItemList = new ArrayList<>();
salaryItemList.add(salaryItemId);
salaryItemList.add(gwgzItemId);
salaryItemList.add(jxgzId);
List<SalaryArchiveItemPO> 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<SalaryArchiveItemPO> 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<SalaryArchiveItemPO> 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<UfXzhlbPO> 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<String, Object> resultMap = getSalaryAcctResultService(user).fygsdReport(queryParam);
List<Object> columns = (List<Object>) resultMap.get("column");
List<Map<String, String>> dataList = (List<Map<String, String>>) resultMap.get("dataList");
// List<Object> finalColumns = columns.stream().filter(column -> !"fylx2".equals(((WeaTableColumn)column).getColumn())).collect(Collectors.toList());
List<List<Object>> rows = new ArrayList<>();
rows.add(columns);
for (Map<String, String> dataMap : dataList) {
List<Object> datas = new ArrayList<>();
for (Object column : columns) {
WeaTableColumn weaTableColumn = (WeaTableColumn)column;
datas.add(dataMap.getOrDefault(weaTableColumn.getColumn(), ""));
}
rows.add(datas);
}
// // 无分类薪资项目id
// List<String> noGroupItemIds = salarySobItemAggregateDTO.getItems().stream().map(dto -> String.valueOf(dto.getSalaryItemId())).collect(Collectors.toList());
// // 查询列表的表头
// List<WeaTableColumnGroup> weaTableColumns = listWeaTableColumn(salaryAcctRecordPO);
// List<Object> finalWeaTableColumns = new ArrayList<>();
// // 查询薪资核算所用的薪资账套的员工信息字段
// List<SalarySobEmpFieldPO> salarySobEmpFieldPOS = getSalarySobEmpFieldService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
// List<SalarySobEmpFieldDTO> 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);
}
}