package com.engine.salary.report.wrapper; import com.cloudstore.eccom.constant.WeaBoolAttr; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.component.SalaryWeaTable; import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryarchive.dto.SalaryArchiveListDTO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.setting.param.PageListTemplateQueryParam; import com.engine.salary.entity.setting.po.PageListTemplatePO; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.report.common.constant.SalaryConstant; import com.engine.salary.report.entity.bo.SalaryStatisticsReportBO; import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeDetailResultDTO; import com.engine.salary.report.entity.dto.SalaryStatisticsEmployeeListDTO; import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeDetailQueryParam; import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeQueryParam; import com.engine.salary.report.entity.param.SalaryStatisticsEmployeeSalaryQueryParam; import com.engine.salary.report.service.SalaryStatisticsEmployeeService; import com.engine.salary.report.service.impl.SalaryStatisticsEmployeeServiceImpl; import com.engine.salary.report.util.ReportDataUtil; import com.engine.salary.service.SalaryItemService; import com.engine.salary.service.SettingService; import com.engine.salary.service.impl.SalaryItemServiceImpl; import com.engine.salary.service.impl.SettingServiceImpl; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.excel.ExcelFillUtils; import com.engine.salary.util.excel.ExcelUtilPlus; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; import java.io.InputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import static com.engine.salary.enums.setting.PageListSettingPageEnum.SALARY_DETAILS_REPORT; import static com.engine.salary.sys.constant.SalarySysConstant.SALARY_DETAILS_REPORT_SHOW_TYPE; /** * 薪酬统计员工明细 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* * @author qiantao * @version 1.0 **/ public class SalaryStatisticsEmployeeWrapper extends Service { private SalaryStatisticsEmployeeService getSalaryStatisticsEmployeeService(User user) { return ServiceUtil.getService(SalaryStatisticsEmployeeServiceImpl.class, user); } private SalaryItemService getSalaryItemService(User user) { return ServiceUtil.getService(SalaryItemServiceImpl.class, user); } private SettingService getSettingService(User user) { return ServiceUtil.getService(SettingServiceImpl.class, user); } private SalarySysConfService getSalarySysConfService(User user) { return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } //是否模板显示 private final boolean templateShow = "1".equals(getSalarySysConfService(user).getValueByCode(SALARY_DETAILS_REPORT_SHOW_TYPE)); /** * 员工列表 * * @param queryParam * @return */ public PageInfo list(SalaryStatisticsEmployeeQueryParam queryParam) { return getSalaryStatisticsEmployeeService(user).listPage(queryParam); } /** * 员工详情列表 * * @param queryParam * @return */ public Map detailList(SalaryStatisticsEmployeeDetailQueryParam queryParam) { // 获取核算数据 SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult = getSalaryStatisticsEmployeeService(user).getDetailSalaryAcctResult(queryParam); List> records = getSalaryStatisticsEmployeeService(user).listDetailPage(salaryStatisticsEmployeeDetailResult, queryParam); Map countResultMap = Maps.newHashMap(); if (CollectionUtils.isNotEmpty(records)) { List salaryItems = salaryStatisticsEmployeeDetailResult.getSalaryItemList(); for (SalaryItemPO item : salaryItems) { BigDecimal sumBigDecimal = new BigDecimal(SalaryStatisticsReportBO.ZERO); String itemKey = item.getId() + SalaryConstant.DYNAMIC_SUFFIX; for (Map record : records) { if (record.containsKey(itemKey)) { if (Objects.nonNull(record.get(itemKey)) && StringUtils.isNotEmpty(record.get(itemKey).toString()) && NumberUtils.isCreatable(record.get(itemKey).toString())) { sumBigDecimal = sumBigDecimal.add(new BigDecimal(record.get(itemKey).toString())); record.put(itemKey, ReportDataUtil.thousandthConvert(record.get(itemKey).toString())); } } } if (item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())) { countResultMap.put(itemKey, ReportDataUtil.thousandthConvert(sumBigDecimal.toString())); } } } PageInfo> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), records); // 列表columns List weaTableColumns = buildDetailTableColumns(salaryStatisticsEmployeeDetailResult, false); SalaryWeaTable table = new SalaryWeaTable(user, SalaryStatisticsEmployeeDetailResultDTO.class); table.setColumns(weaTableColumns); WeaResultMsg result = new WeaResultMsg(false); result.putAll(table.makeDataResult()); result.success(); // 结果 Map resultMap = Maps.newHashMap(); // resultMap.put("columns", weaTableColumns); resultMap.put("dataKey", result.getResultMap()); resultMap.put("pageInfo", pageInfo); resultMap.put("countResult", countResultMap); return resultMap; } private List buildDetailTableColumns(SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult, boolean isSalaryList) { // 表格表头 List columns = new ArrayList<>(); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(87614, "薪资所属月"), "salaryMonth")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), "taxAgent")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "账套"), "salarySob")); if (isSalaryList) { columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "姓名"), "userName")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "分部"), "subCompany")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "部门"), "department")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "岗位"), "jobTitle")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "员工状态"), "status")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "工号"), "workCode")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(0, "入职日期"), "companystartdate")); } columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86184, "次数"), "acctTimes").setDisplay(WeaBoolAttr.FALSE)); // columns.add(new WeaTableColumn("100px",SalaryI18nUtil.getI18nLabel( 121908, "收入所得项目"), "incomeCategory")); salaryStatisticsEmployeeDetailResult.getSalaryItemList().forEach(item -> { columns.add(new WeaTableColumn("100px", item.getName(), item.getId() + SalaryConstant.DYNAMIC_SUFFIX)); }); return columns; } /** * 获取员工发薪明细列表 * * @param queryParam */ public Map salaryList(SalaryStatisticsEmployeeSalaryQueryParam queryParam) { Map resultMap = Maps.newHashMap(); if (StringUtils.isBlank(queryParam.getStartDateStr()) || StringUtils.isBlank(queryParam.getEndDateStr())) { return resultMap; } // 获取发薪人员 PageInfo salaryAcctEmployeePageInfo = getSalaryStatisticsEmployeeService(user).listSalaryAcctEmp(queryParam); // 获取薪资核算结果 SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult = getSalaryStatisticsEmployeeService(user).getDetailSalaryAcctResultByAcctEmp(salaryAcctEmployeePageInfo.getList()); List> records = getSalaryStatisticsEmployeeService(user).listDetailPage(salaryStatisticsEmployeeDetailResult, null); PageInfo> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize()); pageInfo.setList(records); pageInfo.setTotal(salaryAcctEmployeePageInfo.getTotal()); List weaTableColumns = getSettingService(user).getPageListColumns(SALARY_DETAILS_REPORT.getValue()); List pageListTemplates = getSettingService(user).getPageListTemplates(PageListTemplateQueryParam.builder().page(SALARY_DETAILS_REPORT.getValue()).build()); Integer fileId = pageListTemplates.stream().filter(PageListTemplatePO::getChecked).findFirst().map(PageListTemplatePO::getFileId).orElse(null); // 结果 resultMap.put("columns", weaTableColumns); resultMap.put("pageInfo", pageInfo); resultMap.put("fileId", fileId); if (queryParam.isExport()) { Map countResultMap = Maps.newHashMap(); List salaryItems = salaryStatisticsEmployeeDetailResult.getSalaryItemList(); if (CollectionUtils.isNotEmpty(records)) { for (SalaryItemPO item : salaryItems) { BigDecimal sumBigDecimal = new BigDecimal(SalaryStatisticsReportBO.ZERO); String itemKey = item.getId() + SalaryConstant.DYNAMIC_SUFFIX; for (Map record : records) { if (Objects.nonNull(record.get(itemKey)) && NumberUtils.isCreatable(record.get(itemKey).toString())) { sumBigDecimal = sumBigDecimal.add(new BigDecimal(record.get(itemKey).toString())); } } countResultMap.put(itemKey, sumBigDecimal.toString()); } } resultMap.put("salaryItems", salaryStatisticsEmployeeDetailResult.getSalaryItemList()); resultMap.put("countResult", countResultMap); } return resultMap; } /** * 获取员工发薪明细列表 * * @param queryParam */ public Map salaryListSum(SalaryStatisticsEmployeeSalaryQueryParam queryParam) { Map resultMap = Maps.newHashMap(); Map sumResultMap = Maps.newHashMap(); resultMap.put("sumRow", sumResultMap); if (StringUtils.isBlank(queryParam.getStartDateStr()) || StringUtils.isBlank(queryParam.getEndDateStr())) { return resultMap; } queryParam.setExport(true); // 获取发薪人员 PageInfo salaryAcctEmployeePageInfo = getSalaryStatisticsEmployeeService(user).listSalaryAcctEmp(queryParam); List employeePOS = salaryAcctEmployeePageInfo.getList(); if (CollectionUtils.isEmpty(employeePOS)) { return resultMap; } List> empParts = Lists.partition(employeePOS, 500); for (int i = 0; i < empParts.size(); i++) { // 获取薪资核算结果 SalaryStatisticsEmployeeDetailResultDTO salaryStatisticsEmployeeDetailResult = getSalaryStatisticsEmployeeService(user).getDetailSalaryAcctResultByAcctEmp(empParts.get(i)); List> records = getSalaryStatisticsEmployeeService(user).listDetailPage(salaryStatisticsEmployeeDetailResult, null); if (CollectionUtils.isNotEmpty(records)) { List salaryItems = salaryStatisticsEmployeeDetailResult.getSalaryItemList(); // 过滤只统计数值型薪资项目 salaryItems = salaryItems.stream().filter(salaryItemPO -> salaryItemPO.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList()); for (SalaryItemPO item : salaryItems) { BigDecimal sumBigDecimal = new BigDecimal(SalaryStatisticsReportBO.ZERO); String itemKey = item.getId() + SalaryConstant.DYNAMIC_SUFFIX; for (Map record : records) { if (record.containsKey(itemKey)) { if (Objects.nonNull(record.get(itemKey)) && NumberUtils.isCreatable(record.get(itemKey).toString())) { sumBigDecimal = sumBigDecimal.add(new BigDecimal(record.get(itemKey).toString())); } } } Object o = sumResultMap.get(itemKey + "_n"); if (o != null) { sumBigDecimal = sumBigDecimal.add((BigDecimal) o); } sumResultMap.put(itemKey + "_n", sumBigDecimal); // 薪资项目合计 sumResultMap.put(itemKey, ReportDataUtil.thousandthConvert(sumBigDecimal.toString())); } } } resultMap.put("sumRow", sumResultMap); return resultMap; } public XSSFWorkbook exportSalaryList(SalaryStatisticsEmployeeSalaryQueryParam queryParam) { queryParam.setCurrent(1); queryParam.setExport(true); Map resultMap = salaryList(queryParam); List columns = (List) resultMap.get("columns"); List> resultList = ((PageInfo>) resultMap.get("pageInfo")).getList(); //根据上传的模板导出 Object fileId = resultMap.get("fileId"); if (fileId != null) { InputStream inputStream = ImageFileManager.getInputStreamById((Integer) fileId); XSSFWorkbook workbook = ExcelFillUtils.fillOneSheet(inputStream, 0, resultList); return workbook; } //根据显示列表导出 Map countResult = (Map) resultMap.get("countResult"); Map columnMap = SalaryEntityUtil.convert2Map(columns, WeaTableColumn::getColumn); // 获取薪资项目保留小数位数 List salaryItemPOList = getSalaryItemService(user).listAll(); Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItemPOList, item -> item.getId() + "_salaryItem"); List finalColumns = new ArrayList<>(); queryParam.getColumns().forEach(col -> { WeaTableColumn column = columnMap.get(col); if (column != null) { SalaryItemPO salaryItemPO = salaryItemMap.get(column.getColumn()); Integer pattern = salaryItemPO == null ? 0 : salaryItemPO.getPattern(); String dataType = salaryItemPO == null ? SalaryDataTypeEnum.STRING.getValue() : salaryItemPO.getDataType(); finalColumns.add(new WeaTableColumnGroup("100px", Util.formatMultiLang(column.getText()), column.getColumn(), "false", pattern, dataType)); } }); List> rowList = new ArrayList<>(); // 表头 rowList.add(finalColumns); // 数据 for (Map valueMap : resultList) { List list = new ArrayList<>(); for (Object column : finalColumns) { WeaTableColumnGroup col = (WeaTableColumnGroup) column; if (col.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())) { try { list.add(new BigDecimal(Util.null2String(valueMap.get(col.getColumn())))); } catch (Exception e) { list.add(Util.null2String(valueMap.get(col.getColumn()))); } } else { list.add(Util.null2String(valueMap.get(col.getColumn()))); } } rowList.add(list); } // 合计 List sumRow = new ArrayList<>(); sumRow.add("总计"); for (int i = 1; i < finalColumns.size(); i++) { WeaTableColumnGroup weaTableColumnGroup = (WeaTableColumnGroup) finalColumns.get(i); if (weaTableColumnGroup.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())) { try { sumRow.add(new BigDecimal(Util.null2String(countResult.get(weaTableColumnGroup.getColumn())))); } catch (Exception e) { sumRow.add(Util.null2String(countResult.get(weaTableColumnGroup.getColumn()))); } } else { sumRow.add(""); } } rowList.add(sumRow); return ExcelUtilPlus.genWorkbookV2WithPattern(rowList, "薪资明细", true); } // public Map exportDetailList(SalaryStatisticsEmployeeDetailQueryParam queryParam) { // SalaryAssert.notNull(queryParam.getEmployeeId(), SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 163974, "人员id不能为空")); // // 构建异步导出参数 // Map map = salaryBatchService.buildeExportParam("exportSalaryStatisticsEmployeeDetailList"); // LocalRunnable localRunnable = new LocalRunnable() { // @Override // public void execute() { // try { // DSTenantKeyThreadVar.tenantKey.set(currentTenantKey); // getSalaryStatisticsEmployeeService(user).exportDetailList(map, queryParam); // } finally { // DSTenantKeyThreadVar.tenantKey.remove(); // } // } // }; // ThreadPoolUtil.execute(localRunnable); // // return map; // } }