2144 lines
125 KiB
Java
2144 lines
125 KiB
Java
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 这里的数据没有id,id是自增的重新查数据太多效率太低
|
||
SalarySobPO salarySobPO = getSalarySobService(user).getById(salaryAcctRecordPO.getSalarySobId());
|
||
String targetName = salarySobPO.getName() + ":" + SalaryDateUtil.localDate2YearMonth(salaryAcctRecordPO.getSalaryMonth());
|
||
LoggerContext loggerContext = new LoggerContext<>();
|
||
loggerContext.setUser(user);
|
||
loggerContext.setTargetId(param.getSalaryAcctRecordId().toString());
|
||
loggerContext.setTargetName(targetName);
|
||
loggerContext.setOperateType(OperateTypeEnum.EXCEL_IMPORT.getValue());
|
||
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel( 0, "导入薪资核算数据"));
|
||
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel( 0, "导入薪资核算数据 ") + targetName);
|
||
loggerContext.setOldValueList(list4log);
|
||
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext);
|
||
|
||
// 存储薪资核算结果数据来源日志
|
||
new Thread() {
|
||
public void run() {
|
||
handleSalaryAcctResultLog(salaryAcctResults);
|
||
}
|
||
}.start();
|
||
//报表
|
||
getSalaryAcctReportService(user).batchSave(salaryAcctReports);
|
||
}
|
||
if (CollectionUtils.isNotEmpty(newSalaryAcctEmployees)) {
|
||
getSalaryAcctEmployeeService(user).batchSave(newSalaryAcctEmployees);
|
||
}
|
||
}
|
||
SalarySysConfPO autoLock = getSalarySysConfService(user).getOneByCode(SalarySysConstant.EDIT_IMPORT_AUTO_LOCK);
|
||
if (autoLock != null && StringUtils.equals(autoLock.getConfValue(), "1")) {
|
||
// 导入的列都自动锁定
|
||
SalaryAcctResultUpdateLockStatusParam updateLockStatusParam = SalaryAcctResultUpdateLockStatusParam.builder()
|
||
.salaryItemIds(excelSalaryItemIds)
|
||
.salaryAcctRecordId(param.getSalaryAcctRecordId())
|
||
.lockStatus(LockStatusEnum.LOCK).build();
|
||
getSalaryAcctResultService(user).updateLockStatusByParam(updateLockStatusParam);
|
||
}
|
||
|
||
apidatas.put("successCount", successCount);
|
||
apidatas.put("errorCount", failCount);
|
||
apidatas.put("errorData", excelComments);
|
||
|
||
} finally {
|
||
IOUtils.closeQuietly(fileInputStream);
|
||
}
|
||
|
||
// 发送导入回调信息
|
||
// salaryBatchService.sendImportCallBackInfo(message, successCount, failCount, errorExcelSheets);
|
||
return apidatas;
|
||
}
|
||
|
||
/**
|
||
* 存储薪资核算结果数据来源日志
|
||
*
|
||
* @param salaryAcctResults
|
||
*/
|
||
private void handleSalaryAcctResultLog(List<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);
|
||
}
|
||
}
|