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

848 lines
43 KiB
Java
Raw Normal View History

2022-10-26 13:46:36 +08:00
package com.engine.salary.service.impl;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.biz.*;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.constant.SalaryItemConstant;
import com.engine.salary.entity.salaryarchive.bo.SalaryArchiveExcelBO;
import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveInitImportDTO;
import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveListDTO;
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionParam;
2022-10-26 13:46:36 +08:00
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportHandleParam;
import com.engine.salary.entity.salaryarchive.param.SalaryArchiveQueryParam;
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.taxagent.dto.TaxAgentEmployeeDTO;
import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO;
2022-12-07 20:15:52 +08:00
import com.engine.salary.entity.taxagent.param.TaxAgentRangeSaveParam;
2022-10-26 13:46:36 +08:00
import com.engine.salary.entity.taxagent.po.TaxAgentEmployeePO;
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
import com.engine.salary.enums.salaryarchive.SalaryArchiveImportTypeEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveListTypeEnum;
import com.engine.salary.enums.salaryarchive.SalaryArchiveStatusEnum;
import com.engine.salary.mapper.archive.SalaryArchiveMapper;
import com.engine.salary.service.*;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.excel.ExcelComment;
import com.engine.salary.util.excel.ExcelParseHelper;
import com.engine.salary.util.excel.ExcelSupport;
import com.engine.salary.util.excel.ExcelUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import weaver.file.ImageFileManager;
import weaver.hrm.User;
2022-10-26 13:46:36 +08:00
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;
import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX;
/**
* @Description: 薪资档案
* @Author: wangxiangzhong
* @Date: 2021-11-03 10:51
*/
public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArchiveExcelService {
private static final Logger log = LoggerFactory.getLogger(SalaryArchiveExcelServiceImpl.class);
private SalaryArchiveMapper getSalaryArchiveMapper() {
return MapperProxyFactory.getProxy(SalaryArchiveMapper.class);
}
private SalaryArchiveItemService salaryArchiveItemService(User user) {
2022-10-26 13:46:36 +08:00
return ServiceUtil.getService(SalaryArchiveItemServiceImpl.class, user);
}
private SalaryArchiveService salaryArchiveService(User user) {
2022-10-26 13:46:36 +08:00
return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
2022-10-26 13:46:36 +08:00
return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private SalaryEmployeeService getSalaryEmployeeService(User user) {
2022-10-26 13:46:36 +08:00
return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
}
2022-12-07 20:15:52 +08:00
public TaxAgentManageRangeService getTaxAgentManageRangeService(User user) {
return ServiceUtil.getService(TaxAgentManageRangeServiceImpl.class, user);
}
2022-10-26 13:46:36 +08:00
private SalaryArchiveBiz salaryArchiveMapper = new SalaryArchiveBiz();
private EmployBiz employBiz = new EmployBiz();
private SalaryArchiveItemBiz salaryArchiveItemMapper = new SalaryArchiveItemBiz();
private SalaryArchiveTaxAgentBiz salaryArchiveTaxAgentMapper = new SalaryArchiveTaxAgentBiz();
private SalaryArchiveDimissionBiz salaryArchiveDimissionMapper = new SalaryArchiveDimissionBiz();
private SalaryItemBiz salaryItemMapper = new SalaryItemBiz();
// private SalaryArchiveSobService salaryArchiveSobService;
//
// private SalaryEmployeeService salaryEmployeeService;
// @Autowired
// private HrmCommonHrmStatusService hrmCommonHrmStatusService;
// @Autowired
// private BaseEnvInfoService baseEnvInfoService;
// @Override
// public void exportList(Map<String, Object> map, SalaryArchiveQueryParam queryParam, Long employeeId, String tenantKey) {
// // 待定薪列表
// boolean isPendingList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.PENDING);
// // 定薪列表
// boolean isFixedList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.FIXED);
// // 待停薪列表
// boolean isSuspendList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.SUSPEND);
// // 停薪列表
// boolean isStopList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.STOP);
// if (isPendingList) {
// queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.PENDING.getValue()));
// } else if (isFixedList) {
// queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue()));
// } else if (isSuspendList) {
// queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.SUSPEND.getValue()));
// } else if (isStopList) {
// queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue(), SalaryArchiveStatusEnum.STOP_FROM_SUSPEND.getValue()));
// }
// String nameI18n = SalaryI18nUtil.getI18nLabel(85368, "薪资档案") +
// SalaryI18nUtil.getI18nLabel(queryParam.getListType().getLabelId(), queryParam.getListType().getDefaultLabel());
// String payStartDateI18n = SalaryI18nUtil.getI18nLabel(109527, "起始发薪日期");
// String payEndDateI18n = SalaryI18nUtil.getI18nLabel(109329, "最后发薪日期");
// String effectiveTimeI18n = SalaryI18nUtil.getI18nLabel(85904, "生效日期");
//
// List<ExcelSheetData> sheetList = new ArrayList<>();
// ExcelSheetData excelSheetData = new ExcelSheetData();
// // 1.工作簿名称
//// excelSheetData.setSheetName(nameI18n);
//// boolean enableHr = baseEnvInfoService.checkDisplayModule(HrmModuleConstancts.hr, tenantKey);
// List<String> headerList = Lists.newArrayList();
// headerList.add(SalaryI18nUtil.getI18nLabel(85429, "姓名"));
// headerList.add(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"));
// headerList.add(SalaryI18nUtil.getI18nLabel(121908, "收入所得项目"));
// headerList.add(SalaryI18nUtil.getI18nLabel(87889, "薪资账套"));
// headerList.add(SalaryI18nUtil.getI18nLabel(86319, "入职日期"));
// headerList.add(SalaryI18nUtil.getI18nLabel(86185, "部门"));
// headerList.add(SalaryI18nUtil.getI18nLabel(86186, "手机号"));
// headerList.add(SalaryI18nUtil.getI18nLabel(86317, "工号"));
//// if (enableHr) {
//// headerList.add(SalaryI18nUtil.getI18nLabel(106277, "身份证号码"));
//// }
// headerList.add(SalaryI18nUtil.getI18nLabel(109332, "人事状态"));
// headerList.add(payStartDateI18n);
// headerList.add(payEndDateI18n);
// if (isFixedList) {
// headerList.add(effectiveTimeI18n);
// }
// // 获取所有可被引用的薪资项目
// List<SalaryItemPO> salaryItems = salaryArchiveItemService.getCanAdjustSalaryItems(tenantKey);
// for (SalaryItemPO salaryItem : salaryItems) {
// headerList.add(salaryItem.getName());
// }
// // 2.表头
// excelSheetData.setHeaders(Collections.singletonList(headerList.toArray(new String[]{})));
// // 获取所有个税扣缴义务人
// Collection<TaxAgentListDTO> taxAgentList = getTaxAgentService().findAll(tenantKey);
// Collection<SalaryArchiveListDTO> salaryArchives = salaryArchiveMapper.list(queryParam, tenantKey);
// boolean isSearchIdNo = enableHr && StringUtils.isNotEmpty(queryParam.getIdNo());
// if (isSearchIdNo) {
// Map<Long, String> idNoEmpMap = salaryEmployeeService
// .mapByEmployeeIds(salaryArchives.stream().map(SalaryArchiveListDTO::getEmployeeId).distinct().collect(Collectors.toList()), tenantKey);
// salaryArchives = salaryArchives.stream().filter(f -> Optional.ofNullable(idNoEmpMap.get(f.getEmployeeId())).orElse("").contains(queryParam.getIdNo()))
// .collect(Collectors.toList());
// }
// // 开启分权并且不是薪酬模块总管理员
// boolean isChief = getTaxAgentService().isChief(employeeId, tenantKey);
// if (getTaxAgentService().isOpenDevolution(tenantKey) && !isChief) {
// List<TaxAgentEmployeeDTO> taxAgentEmployees = getTaxAgentService().listTaxAgentAndEmployee(employeeId, tenantKey);
// List<Long> taxAgentIdsAsAdmin = getTaxAgentService().listAllTaxAgentsAsAdmin(employeeId, tenantKey).stream().map(TaxAgentPO::getId).collect(Collectors.toList());
// salaryArchives = salaryArchives.stream().filter(f ->
// // 作为管理员
// taxAgentIdsAsAdmin.contains(f.getTaxAgentId())
// // 作为分管理员
// || TaxAgentBO.checkTaxAgentAndEmployee(taxAgentEmployees, f.getTaxAgentId(), f.getEmployeeId())
// || employeeId.equals(f.getModifier())
// ).collect(Collectors.toList());
// }
// Map<Long, String> idNoEmpMap =
// enableHr ? salaryEmployeeService.mapByEmployeeIds(salaryArchives.stream().map(SalaryArchiveListDTO::getEmployeeId).distinct().collect(Collectors.toList()), tenantKey)
// : new HashMap<>();
// List<Map<String, Object>> listMaps = salaryArchiveService
// .buildSalaryArchiveData(salaryArchives, taxAgentList, salaryItems, idNoEmpMap, employeeId, tenantKey, Boolean.FALSE);
// // 组装数据
// List<List<Object>> rows = new ArrayList<>();
// listMaps.forEach(e -> {
// List<Object> row = new ArrayList<>();
// row.add(Optional.ofNullable(e.get("username")).orElse("").toString());
// row.add(e.get("taxAgentName").toString());
// row.add(e.get("incomeCategory").toString());
// row.add(e.get("salarySob").toString());
// row.add(Optional.ofNullable(e.get("hiredate")).orElse("").toString());
// row.add(Optional.ofNullable(e.get("departmentName")).orElse("").toString());
// row.add(Optional.ofNullable(e.get("mobile")).orElse("").toString());
// row.add(Optional.ofNullable(e.get("jobNum")).orElse("").toString());
// if (enableHr) {
// row.add(Optional.ofNullable(e.get("idNo")).orElse("").toString());
// }
// row.add(e.get("employeeStatus").toString());
// row.add(e.get("payStartDate").toString());
// row.add(e.get("payEndDate").toString());
// if (isFixedList) {
// row.add(Optional.ofNullable(e.get("effectiveTime")).orElse("").toString());
// }
// // 薪资项目数据
// for (SalaryItemPO salaryItem : salaryItems) {
// row.add(e.containsKey(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX) ? (e.get(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX) == null ? ""
// : e.get(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX).toString()) : "");
// }
// rows.add(row);
// });
// // 3.表数据
// excelSheetData.setRows(rows);
//
// sheetList.add(excelSheetData);
//
// salaryBatchService.simpleExportExcel(ExportExcelInfo.builder()
// .bizId(map.get("biz").toString())
// .flag(true)
// .userId(employeeId)
// .eteamsId(map.get("eteamsId").toString())
// .tenantKey(tenantKey)
// .operator(map.get("username").toString())
// .module(map.get("module").toString())
// .fileName(nameI18n + SalaryDateUtil.getFormatLocalDateTime(LocalDateTime.now()))
// .handlerName("exportSalaryArchive")
// .dataType(nameI18n)
// .function("exportSalaryArchive").build(), sheetList);
// }
@Override
public XSSFWorkbook downloadTemplate(SalaryArchiveQueryParam queryParam) {
// 待定薪列表
boolean isPendingList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.PENDING);
// 定薪列表
boolean isFixedList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.FIXED);
// 待停薪列表
boolean isSuspendList = queryParam.getListType().equals(SalaryArchiveListTypeEnum.SUSPEND);
if (isPendingList) {
queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.PENDING.getValue()));
} else if (isFixedList) {
queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue()));
} else if (isSuspendList) {
queryParam.setRunStatusList(Arrays.asList(SalaryArchiveStatusEnum.SUSPEND.getValue()));
}
boolean isInit = queryParam.getImportType().equals(SalaryArchiveImportTypeEnum.INIT.getValue());
boolean isSalaryItemAdjust = queryParam.getImportType().equals(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getValue());
// 名称
String nameI18n = SalaryI18nUtil.getI18nLabel(101601, "薪资档案导入模板")
+ SalaryI18nUtil.getI18nLabel(queryParam.getListType().getLabelId(), queryParam.getListType().getDefaultLabel());
if (isFixedList) {
// 初始化
if (isInit) {
nameI18n +=
"-" + SalaryI18nUtil.getI18nLabel(SalaryArchiveImportTypeEnum.INIT.getLabelId(), SalaryArchiveImportTypeEnum.INIT.getDefaultLabel());
// 调薪
} else if (isSalaryItemAdjust) {
nameI18n += "-" + SalaryI18nUtil
.getI18nLabel(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getLabelId(), SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getDefaultLabel());
}
}
String finalNameI18n = nameI18n;
// 获取所有可被引用的薪资项目
List<SalaryItemPO> salaryItems = salaryArchiveItemService(user).getCanAdjustSalaryItems();
2022-10-26 13:46:36 +08:00
// boolean enableHr = baseEnvInfoService.checkDisplayModule(HrmModuleConstancts.hr, tenantKey);
List<Object> header = Lists.newArrayList();
header.add(SalaryI18nUtil.getI18nLabel(85429, "姓名"));
header.add(SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"));
// header.add(SalaryI18nUtil.getI18nLabel(121908, "收入所得项目"));
// header.add(SalaryI18nUtil.getI18nLabel(87889, "薪资账套"));
// header.add(SalaryI18nUtil.getI18nLabel(86319, "入职日期"));
header.add(SalaryI18nUtil.getI18nLabel(86185, "部门"));
header.add(SalaryI18nUtil.getI18nLabel(86186, "手机号"));
header.add(SalaryI18nUtil.getI18nLabel(86317, "工号"));
// if (enableHr) {
// header.add(SalaryI18nUtil.getI18nLabel(106277, "身份证号码"));
// }
// header.add(SalaryI18nUtil.getI18nLabel(109332, "人事状态"));
String payStartDateI18n = SalaryI18nUtil.getI18nLabel(109527, "起始发薪日期");
String payEndDateI18n = SalaryI18nUtil.getI18nLabel(109329, "最后发薪日期");
String adjustReasonI18n = SalaryI18nUtil.getI18nLabel(85431, "调整原因");
String effectiveTimeI18n = SalaryI18nUtil.getI18nLabel(85904, "生效日期");
if (isPendingList) {
header.add(payStartDateI18n);
header.add(payEndDateI18n);
} else if (isFixedList) {
if (isInit) {
header.add(payStartDateI18n);
header.add(payEndDateI18n);
header.add(effectiveTimeI18n);
} else if (isSalaryItemAdjust) {
header.add(adjustReasonI18n);
header.add(effectiveTimeI18n);
}
} else if (isSuspendList) {
header.add(payStartDateI18n);
header.add(payEndDateI18n);
}
for (SalaryItemPO salaryItem : salaryItems) {
header.add(salaryItem.getName());
}
// 2.表头
List<List<Object>> rows = new ArrayList<>();
rows.add(header);
// 获取所有个税扣缴义务人
Collection<TaxAgentPO> taxAgentList = getTaxAgentService(user).listAll();
2022-10-26 13:46:36 +08:00
Collection<SalaryArchiveListDTO> salaryArchives = getSalaryArchiveMapper().list(queryParam);
// boolean isSearchIdNo = enableHr && StringUtils.isNotEmpty(queryParam.getIdNo());
// if (isSearchIdNo) {
// Map<Long, String> idNoEmpMap = salaryEmployeeService
// .mapByEmployeeIds(salaryArchives.stream().map(SalaryArchiveListDTO::getEmployeeId).distinct().collect(Collectors.toList()), tenantKey);
// salaryArchives = salaryArchives.stream().filter(f -> Optional.ofNullable(idNoEmpMap.get(f.getEmployeeId())).orElse("").contains(queryParam.getIdNo()))
// .collect(Collectors.toList());
// }
// 开启分权并且不是薪酬模块总管理员
long employeeId = user.getUID();
if (getTaxAgentService(user).isNeedAuth(employeeId)) {
List<TaxAgentEmployeeDTO> taxAgentEmployees = getTaxAgentService(user).listTaxAgentAndEmployee(employeeId);
List<Long> taxAgentIdsAsAdmin = getTaxAgentService(user).listAllTaxAgentsAsAdmin(employeeId).stream().map(TaxAgentPO::getId).collect(Collectors.toList());
2022-10-26 13:46:36 +08:00
salaryArchives = salaryArchives.stream().filter(f ->
// 作为管理员
taxAgentIdsAsAdmin.contains(f.getTaxAgentId())
// 作为分管理员
// || TaxAgentBO.checkTaxAgentAndEmployee(taxAgentEmployees, f.getTaxAgentId(), f.getEmployeeId())
// || employeeId.equals(f.getModifier())
).collect(Collectors.toList());
}
Map<Long, String> idNoEmpMap =
// enableHr ? salaryEmployeeService.mapByEmployeeIds(salaryArchives.stream().map(SalaryArchiveListDTO::getEmployeeId).distinct().collect(Collectors.toList()), tenantKey)
// :
new HashMap<>();
2022-10-26 18:05:04 +08:00
if (queryParam.getHasData()) {
List<Map<String, Object>> listMaps = salaryArchiveService(user)
2022-10-26 18:05:04 +08:00
.buildSalaryArchiveData(salaryArchives, taxAgentList, salaryItems, Boolean.FALSE);
// 组装数据
listMaps.forEach(e -> {
List<Object> row = new ArrayList<>();
row.add(e.get("username").toString());
row.add(e.get("taxAgentName").toString());
2022-10-26 13:46:36 +08:00
// row.add(e.get("incomeCategory").toString());
// row.add(e.get("salarySob").toString());
// row.add(e.get("hiredate"));
2022-10-26 18:05:04 +08:00
row.add(e.get("departmentName"));
row.add(e.get("mobile") == null ? "" : e.get("mobile").toString());
row.add(Optional.ofNullable(e.get("jobNum")).orElse("").toString());
2022-10-26 13:46:36 +08:00
// if (enableHr) {
// row.add(Optional.ofNullable(e.get("idNo")).orElse("").toString());
// }
// row.add(e.get("employeeStatus").toString());
2022-10-26 18:05:04 +08:00
if (isPendingList) {
row.add(e.get("payStartDate").toString());
row.add(e.get("payEndDate").toString());
} else if (isFixedList) {
if (isInit) {
row.add(e.get("payStartDate").toString());
row.add(e.get("payEndDate").toString());
row.add(Optional.ofNullable(e.get("effectiveTime")).orElse("").toString());
} else if (isSalaryItemAdjust) {
row.add(Optional.ofNullable(e.get("adjustReason")).orElse("").toString());
row.add(Optional.ofNullable(e.get("effectiveTime")).orElse("").toString());
}
} else if (isSuspendList) {
2022-10-26 13:46:36 +08:00
row.add(e.get("payStartDate").toString());
row.add(e.get("payEndDate").toString());
}
2022-10-26 18:05:04 +08:00
// 薪资项目数据
for (SalaryItemPO salaryItem : salaryItems) {
row.add(e.containsKey(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX) ? (e.get(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX) == null ? ""
: e.get(salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX).toString()) : "");
}
rows.add(row);
});
}
2022-10-26 13:46:36 +08:00
// 4.注释
List<ExcelComment> excelComments = Lists.newArrayList();
String requireI18n = SalaryI18nUtil.getI18nLabel(100344, "必填");
excelComments.add(new ExcelComment(0, 0, 3, 2, requireI18n));
excelComments.add(new ExcelComment(1, 0, 4, 2, requireI18n));
//收入所得项目
// List<String> incomeCategoryOptions = Arrays.stream(IncomeCategoryEnum.values()).map(e ->
// SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel())
// ).collect(Collectors.toList());
// SalaryArchiveExcelBO
// .createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(121922, "必填,可填写如:") + Joiner.on(",").join(incomeCategoryOptions), 0, 0, 2, 2);
// SalaryArchiveExcelBO.createExcelComment(excelComments, requireI18n + '' + SalaryI18nUtil.getI18nLabel(127641, "多个账套之间用,分隔"), 0, 0, 3, 3);
// int i = enableHr ? 10 : 9;
if (isPendingList) {
2022-10-26 18:05:04 +08:00
excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'")));
2022-10-26 13:46:36 +08:00
// excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'")));
} else if (isFixedList) {
if (isInit) {
excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'")));
excelComments.add(new ExcelComment(6, 0, 9, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'")));
excelComments.add(new ExcelComment(7, 0, 10, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'")));
} else if (isSalaryItemAdjust) {
excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,可填写如:入职,转正,调薪,调岗调薪,离职,其他,初始化")));
excelComments.add(new ExcelComment(6, 0, 9, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'")));
}
} else if (isSuspendList) {
// SalaryArchiveExcelBO.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(109736, "格式样例为'2022-01-01'、'2022/1/1'"), 0, 0, i + 1, i + 1);
}
return ExcelUtil.genWorkbookV2(rows, finalNameI18n, excelComments);
}
// /**
// * 导入薪资档案
// */
// @BatchImportHandler("importSalaryArchive")
// @Transactional(rollbackFor = Exception.class)
// public void importSalaryArchive() {
// BatchDocumentMessage message = BatchImportContext.getBatchDocumentMessage();
// log.info("【薪资档案】接收到上传的数据:{}", String.format("batchTaskId=%s, fileName=%s", message.getBatchTaskId(), message.getBatchFile().getName()));
// // 租户key
// String tenantKey = message.getTenantKey().toLowerCase();
// try {
// // 加密用
// DSTenantKeyThreadVar.tenantKey.set(tenantKey);
// // 接收到解析的数据
// batchImportEbatch(message);
// } catch (Exception e) {
// log.error("【薪资档案】导入失败:{}", String.format("batchTaskId=%s,错误信息=%s", message.getBatchTaskId(), e.getMessage()));
// } finally {
// // 加密用
// DSTenantKeyThreadVar.tenantKey.remove();
// }
// }
public Map<String, Object> batchImportEbatch(SalaryArchiveImportHandleParam param) {
2022-10-26 13:46:36 +08:00
// 初始化国际化标签
SalaryArchiveExcelBO.initI18n();
String imageId = param.getImageId();
2022-12-05 16:01:08 +08:00
// 构建导入需要的数据
SalaryArchiveImportHandleParam importHandleParam = buildImportHandleParam(param);
2022-10-26 13:46:36 +08:00
InputStream fileInputStream = null;
try {
fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId));
Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX);
int total = 0;
//excel数据
List<Map<String, Object>> data = ExcelParseHelper.parse2Map(sheet, 1);
if (data != null) {
total += data.size();
}
int index = 0;
int successCount = 0;
int errorCount = 0;
// 错误excel内容
// List<ExcelSheet> errorExcelSheets = new ArrayList<>();
// 用于初始化导入的相同employeeId时的处理
List<SalaryArchiveInitImportDTO> initImportData = Lists.newArrayList();
// 用于调薪和调整个税扣缴义务人的相同employeeId时取第一条记录,如果是初始化导入则有重复
List<String> allTodoSalaryArchives = Lists.newArrayList();
// if (excelSheet.getHeader().size() == 0) {
// continue;
// }
List<String> headers = ExcelSupport.getSheetHeader(sheet, 0);
// 错误提示
List<Map<String, String>> excelComments = new ArrayList<>();
HashMap message = new HashMap();
boolean isValidHeader = checkHeaders(importHandleParam, message, headers);
if (!isValidHeader) {
excelComments.add(message);
Map<String, Object> apidatas = new HashMap<>();
apidatas.put("successCount", successCount);
apidatas.put("errorCount", errorCount);
apidatas.put("errorNotice", excelComments);
return apidatas;
}
int effectiveTimeIndex = 0;
for (int j = 0; j < headers.size(); j++) {
String header = headers.get(j);
String key = header;
if (key.equals(SalaryI18nUtil.getI18nLabel(85904, "生效日期"))) {
effectiveTimeIndex = j;
}
}
// 错误sheet数据
List<Map<String, Object>> errorData = new ArrayList<>();
Map<String, Object> map;
for (int i = 0; i < data.size(); i++) {
index += 1;
map = data.get(i);
map.put("index", i + 2);
// 3.校验行内容
boolean isError = SalaryArchiveExcelBO.singleRowCheck(allTodoSalaryArchives, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam);
if (isError) {
errorCount += 1;
// 添加错误数据
errorData.add(map);
} else {
successCount += 1;
}
// 初始化导入对重复记录校验
if (importHandleParam.isInit()) {
Map<String, Object> validMap = SalaryArchiveExcelBO
.validInitImportData(isError, i, map, excelComments, errorCount, successCount, errorData, initImportData, importHandleParam);
errorCount = Integer.parseInt(validMap.getOrDefault("errorCount", errorCount).toString());
successCount = Integer.parseInt(validMap.getOrDefault("successCount", successCount).toString());
}
// 导入进度
// if (index % 100 == 0 || index >= total) {
// salaryBatchService.sendImportRate(message.getBizId(), total, index);
// }
}
// 如果sheet包含错误数据
if (CollectionUtils.isNotEmpty(errorData)) {
// salaryBatchService.createErrorExcelSheet(headers, errorData, excelSheet.getName(), excelComments, errorExcelSheets);
}
// 4.数据入库处理
if (!param.isOnlyCheck()) {
handleImportData(importHandleParam);
}
2022-10-26 13:46:36 +08:00
Map<String, Object> apidatas = new HashMap<>();
apidatas.put("successCount", successCount);
apidatas.put("errorCount", errorCount);
apidatas.put("errorNotice", excelComments);
return apidatas;
// 发送导入回调信息
// salaryBatchService.sendImportCallBackInfo(message, successCount, errorCount, errorExcelSheets);
} finally {
IOUtils.closeQuietly(fileInputStream);
}
}
public Map<String, Object> processInit(SalaryArchiveImportActionParam param) {
// 初始化国际化标签
SalaryArchiveExcelBO.initI18n();
2022-12-05 16:01:08 +08:00
// 构建导入需要的数据
2022-12-06 18:08:50 +08:00
SalaryArchiveImportHandleParam importHandleParam = buildImportHandleParam(SalaryArchiveImportHandleParam.builder().isProcess(true).listType(param.getListType()).importType(param.getImportType()).build());
int total = 0;
//excel数据
// 需要导入的数据
List<Map<String, Object>> data = param.getImportDatas();
if (data != null) {
total += data.size();
}
int index = 0;
int successCount = 0;
int errorCount = 0;
// 错误excel内容
// List<ExcelSheet> errorExcelSheets = new ArrayList<>();
// 用于初始化导入的相同employeeId时的处理
List<SalaryArchiveInitImportDTO> initImportData = Lists.newArrayList();
// 用于调薪和调整个税扣缴义务人的相同employeeId时取第一条记录,如果是初始化导入则有重复
List<String> allTodoSalaryArchives = Lists.newArrayList();
// 错误提示
List<Map<String, String>> excelComments = new ArrayList<>();
HashMap message = new HashMap();
// 错误sheet数据
List<Map<String, Object>> errorData = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
Map<String, Object> map = data.get(i);
List<String> headers = Lists.newArrayList();
map.keySet().forEach(headers::add);
int effectiveTimeIndex = 0;
for (int j = 0; j < headers.size(); j++) {
String header = headers.get(j);
String key = header;
if (key.equals(SalaryI18nUtil.getI18nLabel(85904, "生效日期"))) {
effectiveTimeIndex = j;
}
}
boolean isValidHeader = checkHeaders(importHandleParam, message, headers);
if (!isValidHeader) {
excelComments.add(message);
Map<String, Object> apidatas = new HashMap<>();
apidatas.put("successCount", successCount);
apidatas.put("errorCount", errorCount);
apidatas.put("errorNotice", excelComments);
return apidatas;
}
index += 1;
map = data.get(i);
map.put("index", i + 2);
// 3.校验行内容
boolean isError = SalaryArchiveExcelBO.singleRowCheck(allTodoSalaryArchives, map, headers, effectiveTimeIndex, excelComments, errorCount, importHandleParam);
if (isError) {
errorCount += 1;
// 添加错误数据
errorData.add(map);
} else {
successCount += 1;
}
// 初始化导入对重复记录校验
if (importHandleParam.isInit()) {
Map<String, Object> validMap = SalaryArchiveExcelBO
.validInitImportData(isError, i, map, excelComments, errorCount, successCount, errorData, initImportData, importHandleParam);
errorCount = Integer.parseInt(validMap.getOrDefault("errorCount", errorCount).toString());
successCount = Integer.parseInt(validMap.getOrDefault("successCount", successCount).toString());
}
// 导入进度
// if (index % 100 == 0 || index >= total) {
// salaryBatchService.sendImportRate(message.getBizId(), total, index);
// }
}
// 如果sheet包含错误数据
if (CollectionUtils.isNotEmpty(errorData)) {
// salaryBatchService.createErrorExcelSheet(headers, errorData, excelSheet.getName(), excelComments, errorExcelSheets);
}
// 4.数据入库处理
if (param.isAddData()) {
handleImportData(importHandleParam);
}
Map<String, Object> apidatas = new HashMap<>();
apidatas.put("successCount", successCount);
apidatas.put("errorCount", errorCount);
apidatas.put("errorNotice", excelComments);
return apidatas;
// 发送导入回调信息
// salaryBatchService.sendImportCallBackInfo(message, successCount, errorCount, errorExcelSheets);
}
2022-10-26 13:46:36 +08:00
/**
* 构建导入处理参数
*
2022-12-05 16:01:08 +08:00
* @param param
2022-10-26 13:46:36 +08:00
* @return
*/
2022-12-05 16:01:08 +08:00
private SalaryArchiveImportHandleParam buildImportHandleParam(SalaryArchiveImportHandleParam param) {
// 列表类型
String listType = param.getListType();
// 导入类型
String importType = param.getImportType();
2022-10-26 13:46:36 +08:00
// 获取所有可被引用的薪资项目
List<SalaryItemPO> salaryItems = salaryArchiveItemService(user).getCanAdjustSalaryItems();
2022-10-26 13:46:36 +08:00
Collection<Long> salaryItemIds = salaryItems.stream().map(SalaryItemPO::getId).collect(Collectors.toList());
2022-12-05 16:01:08 +08:00
Collection<TaxAgentManageRangeEmployeeDTO> taxAgentList;
if (param.isProcess()) {
// 获取所有个税扣缴义务人
taxAgentList = getTaxAgentService(user).listTaxAgentAndEmployeeTree();
} else {
taxAgentList = getTaxAgentService(user).listTaxAgentAndEmployeeTree((long) user.getUID());
}
2022-10-26 13:46:36 +08:00
// 待定薪列表
boolean isPendingList = listType.equals(SalaryArchiveListTypeEnum.PENDING.getValue());
// 定薪列表
boolean isFixedList = listType.equals(SalaryArchiveListTypeEnum.FIXED.getValue());
// 待停薪列表
boolean isSuspendList = listType.equals(SalaryArchiveListTypeEnum.SUSPEND.getValue());
boolean isInit = isFixedList && importType.equals(SalaryArchiveImportTypeEnum.INIT.getValue());
boolean isSalaryItemAdjust = isFixedList && importType.equals(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getValue());
// 初始化导入是先删除后增的,起始可以只加载非加密的列
boolean isNoNeedSalaryItem = isPendingList || isInit;
List<String> runStatusList = Lists.newArrayList();// 初始化导入是全量
if (isPendingList) {
runStatusList = Arrays.asList(SalaryArchiveStatusEnum.PENDING.getValue());
} else if (isSalaryItemAdjust) {
runStatusList = Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue());
} else if (isSuspendList) {
runStatusList = Arrays.asList(SalaryArchiveStatusEnum.FIXED.getValue(), SalaryArchiveStatusEnum.SUSPEND.getValue());
}
List<SalaryArchivePO> salaryArchiveList = salaryArchiveService(user).listSome(SalaryArchivePO.builder().runStatusList(runStatusList).build());
2022-10-26 13:46:36 +08:00
List<Long> salaryArchiveIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
Map<String, SalaryArchivePO> salaryArchivesMap = SalaryEntityUtil.convert2Map(salaryArchiveList, k -> k.getEmployeeId() + "-" + k.getTaxAgentId());
List<TaxAgentEmployeePO> employees = getTaxAgentService(user).listEmployees();
2022-10-26 13:46:36 +08:00
// 查询人员状态
// List<HrmStatus> hrmStatusList = hrmCommonHrmStatusService.list(tenantKey);
return SalaryArchiveImportHandleParam.builder()
2022-12-07 20:15:52 +08:00
.isProcess(param.isProcess())
2022-10-26 13:46:36 +08:00
.listType(listType)
.importType(importType)
.currentEmployeeId((long) user.getUID())
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
// 待定薪列表
.isPendingList(isPendingList)
// 定薪列表
.isFixedList(isFixedList)
// 待停薪列表
.isSuspendList(isSuspendList)
// 初始化导入
.isInit(isInit)
// 调薪导入
.isSalaryItemAdjust(isSalaryItemAdjust)
// 获取租户下所有的人员
.employees(getSalaryEmployeeService(user).listAll())
2022-10-26 13:46:36 +08:00
// .hrmStatusList(hrmStatusList)
// 获取所有个税扣缴义务人
.taxAgentList(taxAgentList)
.salaryItems(salaryItems)
// 查询已有的薪资档案基本数据
.salaryArchivesMap(salaryArchivesMap)
.salaryItemIds(salaryItemIds)
// 查询已生效的薪资项目数据
.effectiveItemListMap(
isSuspendList ? Collections.emptyMap() : salaryArchiveItemService(user).getEffectiveItemListMap(salaryArchiveIds, isNoNeedSalaryItem, salaryItemIds))
2022-10-26 13:46:36 +08:00
// 查询未生效的薪资项目数据
.ineffectiveItemListMap(
isSuspendList ? Collections.emptyMap() : salaryArchiveItemService(user).getIneffectiveItemListMap(salaryArchiveIds, isNoNeedSalaryItem, salaryItemIds))
2022-10-26 13:46:36 +08:00
// 当前时间
.nowTime(new Date())
// 当天
.today(new Date())
// 待保存薪资档案
.salaryArchiveSaves(Lists.newArrayList())
// 待保存薪资档案-薪资项目
.salaryArchiveItemSaves(Lists.newArrayList())
// 待修改薪资档案-薪资项目
.salaryArchiveUpdates(Lists.newArrayList())
// 待删除薪资档案-薪资项目
.salaryArchiveItemDelSalaryItemIds(Lists.newArrayList())
2022-12-07 20:15:52 +08:00
//人员范围
.taxAgentRanges(Lists.newArrayList())
2022-10-26 13:46:36 +08:00
// 薪资账套
// .salarySobList(salaryArchiveService.getSalarySobList(employeeId, tenantKey))
// 待保存薪资档案-薪资账套
// .salaryArchiveSobSaves(Lists.newArrayList())
.build();
}
/**
* 检查参数
*
* @param message
* @param params
* @return
*/
private boolean checkParams(Map message, Map<String, Object> params) {
boolean isValid = true;
String errorMsg = SalaryArchiveExcelBO.handleCheckParams(message, params);
// 有错误信息发送
if (StringUtils.isNotEmpty(errorMsg)) {
// 发送导入回调信息
// salaryBatchService.sendImportCallBackInfo(message, errorMsg);
isValid = false;
}
return isValid;
}
/**
* 检查列头
*
* @param importHandleParam
* @param message
* @param headers
* @return
*/
private boolean checkHeaders(SalaryArchiveImportHandleParam importHandleParam, Map message, List<String> headers) {
boolean isValid = true;
String errorMsg = SalaryArchiveExcelBO.handleCheckHeaders(importHandleParam, message, headers);
// 有错误信息发送
if (StringUtils.isNotEmpty(errorMsg)) {
message.put("message", errorMsg);
// 发送导入回调信息
// salaryBatchService.sendImportCallBackInfo(message, errorMsg);
isValid = false;
}
return isValid;
}
/**
* 数据落库处理
*
* @param importHandleParam
*/
private void handleImportData(SalaryArchiveImportHandleParam importHandleParam) {
List<SalaryArchivePO> salaryArchiveSaves = importHandleParam.getSalaryArchiveSaves();
List<SalaryArchivePO> salaryArchiveUpdates = importHandleParam.getSalaryArchiveUpdates();
List<SalaryArchiveItemPO> salaryArchiveItemSaves = importHandleParam.getSalaryArchiveItemSaves();
List<Long> salaryArchiveItemDelSalaryItemIds = importHandleParam.getSalaryArchiveItemDelSalaryItemIds();
2022-12-07 20:15:52 +08:00
List<TaxAgentRangeSaveParam> taxAgentRanges = importHandleParam.getTaxAgentRanges();
2022-10-26 13:46:36 +08:00
// List<SalaryArchiveSobPO> salaryArchiveSobSaves = importHandleParam.getSalaryArchiveSobSaves();
2022-12-07 20:15:52 +08:00
//新增人员范围
if (CollectionUtils.isNotEmpty(taxAgentRanges)) {
taxAgentRanges.forEach(getTaxAgentManageRangeService(user)::save);
}
2022-10-26 13:46:36 +08:00
// 新增薪资档案
if (CollectionUtils.isNotEmpty(salaryArchiveSaves)) {
// 去除已经存在的,避免重复
if (CollectionUtils.isNotEmpty(salaryArchiveUpdates)) {
List<Long> salaryArchiveUpdateIds = salaryArchiveUpdates.stream().map(SalaryArchivePO::getId).distinct().collect(Collectors.toList());
salaryArchiveSaves = salaryArchiveSaves.stream().filter(save -> !salaryArchiveUpdateIds.contains(save.getId())).collect(Collectors.toList());
}
// 薪资档案
salaryArchiveMapper.batchInsert(salaryArchiveSaves);
}
// 修改薪资档案
if (CollectionUtils.isNotEmpty(salaryArchiveUpdates)) {
// 薪资档案
salaryArchiveMapper.batchUpdate(salaryArchiveUpdates);
}
// 薪资档案-薪资项目
if (CollectionUtils.isNotEmpty(salaryArchiveItemDelSalaryItemIds)) {
salaryArchiveItemMapper.deleteBatchIds(salaryArchiveItemDelSalaryItemIds);
}
// 薪资档案-薪资项目
if (CollectionUtils.isNotEmpty(salaryArchiveItemSaves)) {
salaryArchiveItemMapper.batchInsert(salaryArchiveItemSaves);
}
// 薪资档案-薪资账套
// salaryArchiveSaves.addAll(salaryArchiveUpdates);
// List<Long> salaryArchiveIds = salaryArchiveSaves.stream().map(SalaryArchivePO::getId).distinct().collect(Collectors.toList());
// if (CollectionUtils.isNotEmpty(salaryArchiveIds) && CollectionUtils.isNotEmpty(salaryArchiveSaves)) {
// this.salaryArchiveSobService.saveBatchBySalaryArchiveIdsAndSaves(salaryArchiveIds, salaryArchiveSobSaves, message.getTenantKey());
// }
}
}