diff --git a/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java b/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java index 83f07aa3a..aefc6cd69 100644 --- a/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java +++ b/src/com/engine/salary/report/entity/bo/SalaryStatisticsReportBO.java @@ -6,6 +6,8 @@ import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.report.common.constant.SalaryStatisticsDimensionConstant; import com.engine.salary.report.entity.dto.SalaryStatisticsItemRuleDTO; +import com.engine.salary.report.entity.param.ExportColumn; +import com.engine.salary.report.entity.param.ExportCommonParam; import com.engine.salary.report.entity.param.SalaryStatisticsDimensionSaveParam; import com.engine.salary.report.entity.param.SalaryStatisticsReportDataQueryParam; import com.engine.salary.report.entity.po.SalaryStatisticsDimensionPO; @@ -598,7 +600,7 @@ public class SalaryStatisticsReportBO { } public static List> po2map(List list, Map> salaryAcctResultValueMap) { - if(CollectionUtils.isEmpty(list)){ + if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } return list.stream().map(sa -> salaryAcctResultValueMap.get(sa.getId())).collect(Collectors.toList()); @@ -952,30 +954,30 @@ public class SalaryStatisticsReportBO { return result; } -// public static ExportCommonParam buildExportParam(String dimName, List weaTableColumns, List> records) { -// List columns = com.google.common.collect.Lists.newArrayList(); -// weaTableColumns.forEach(column -> { -// WeaTableColumnGroup WeaTableColumnGroup = (WeaTableColumnGroup) column; -// ExportColumn exportColumn = new ExportColumn(); -// exportColumn.setKeyIndex(WeaTableColumnGroup.getDataIndex()); -// exportColumn.setValue(WeaTableColumnGroup.getTitle()); -// if (CollectionUtils.isNotEmpty(WeaTableColumnGroup.getChildren())) { -// List subColumns = com.google.common.collect.Lists.newArrayList(); -// for (WeaTableColumnGroup sub : WeaTableColumnGroup.getChildren()) { -// ExportColumn subColumn = new ExportColumn(); -// subColumn.setKeyIndex(sub.getDataIndex()); -// subColumn.setValue(sub.getTitle()); -// subColumns.add(subColumn); -// } -// exportColumn.setChildren(subColumns); -// } -// columns.add(exportColumn); -// }); -// ExportCommonParam exportParam = new ExportCommonParam(); -// exportParam.setDimensionName(dimName); -// exportParam.setColumns(columns); -// exportParam.setData(records); -// -// return exportParam; -// } + public static ExportCommonParam buildExportParam(String dimName, List weaTableColumns, List> records) { + List columns = com.google.common.collect.Lists.newArrayList(); + weaTableColumns.forEach(column -> { + WeaTableColumnGroup WeaTableColumnGroup = (WeaTableColumnGroup) column; + ExportColumn exportColumn = new ExportColumn(); + exportColumn.setKeyIndex(WeaTableColumnGroup.getColumn()); + exportColumn.setValue(WeaTableColumnGroup.getText()); + if (CollectionUtils.isNotEmpty(WeaTableColumnGroup.getChildren())) { + List subColumns = com.google.common.collect.Lists.newArrayList(); + for (WeaTableColumnGroup sub : WeaTableColumnGroup.getChildren()) { + ExportColumn subColumn = new ExportColumn(); + subColumn.setKeyIndex(sub.getColumn()); + subColumn.setValue(sub.getText()); + subColumns.add(subColumn); + } + exportColumn.setChildren(subColumns); + } + columns.add(exportColumn); + }); + ExportCommonParam exportParam = new ExportCommonParam(); + exportParam.setDimensionName(dimName); + exportParam.setColumns(columns); + exportParam.setData(records); + + return exportParam; + } } diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsDimensionServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsDimensionServiceImpl.java index 50b793261..8c22c6f00 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsDimensionServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsDimensionServiceImpl.java @@ -49,13 +49,13 @@ public class SalaryStatisticsDimensionServiceImpl extends Service implements Sal List defaultDimensionNames = Arrays.asList( SalaryI18nUtil.getI18nLabel(87614, "薪资所属月"), SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), - SalaryI18nUtil.getI18nLabel(145212, "收入所得类型"), +// SalaryI18nUtil.getI18nLabel(145212, "收入所得类型"), SalaryI18nUtil.getI18nLabel(107369, "分部"), SalaryI18nUtil.getI18nLabel(86185, "部门"), - SalaryI18nUtil.getI18nLabel(90633, "岗位"), - SalaryI18nUtil.getI18nLabel(98623, "职级"), - SalaryI18nUtil.getI18nLabel(109332, "人事状态"), - SalaryI18nUtil.getI18nLabel(151914, "人员类型"), +// SalaryI18nUtil.getI18nLabel(90633, "岗位"), +// SalaryI18nUtil.getI18nLabel(98623, "职级"), +// SalaryI18nUtil.getI18nLabel(109332, "人事状态"), +// SalaryI18nUtil.getI18nLabel(151914, "人员类型"), SalaryI18nUtil.getI18nLabel(100133, "人员"), SalaryI18nUtil.getI18nLabel(157163, "年度"), SalaryI18nUtil.getI18nLabel(173199, "半年度"), @@ -64,13 +64,13 @@ public class SalaryStatisticsDimensionServiceImpl extends Service implements Sal List defaultDimensionCodes = Arrays.asList( SalaryStatisticsDimensionConstant.DM_SALARY_MONTH, SalaryStatisticsDimensionConstant.DM_TAX_AGENT, - SalaryStatisticsDimensionConstant.DM_INCOME_CATEGORY, +// SalaryStatisticsDimensionConstant.DM_INCOME_CATEGORY, SalaryStatisticsDimensionConstant.DM_SUB_COMPANY, SalaryStatisticsDimensionConstant.DM_DEPARTMENT, - SalaryStatisticsDimensionConstant.DM_POSITION, - SalaryStatisticsDimensionConstant.DM_GRADE, - SalaryStatisticsDimensionConstant.DM_HRM_STATUS, - SalaryStatisticsDimensionConstant.DM_EMPLOYEE_TYPE, +// SalaryStatisticsDimensionConstant.DM_POSITION, +// SalaryStatisticsDimensionConstant.DM_GRADE, +// SalaryStatisticsDimensionConstant.DM_HRM_STATUS, +// SalaryStatisticsDimensionConstant.DM_EMPLOYEE_TYPE, SalaryStatisticsDimensionConstant.DM_EMPLOYEE, SalaryStatisticsDimensionConstant.DM_YEAR, SalaryStatisticsDimensionConstant.DM_HALF_YEAR, diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java index 36966b7c4..444966603 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java @@ -410,7 +410,7 @@ public class SalaryStatisticsReportServiceImpl extends Service implements Salary List salaryMonthList = listMap.keySet().stream().sorted().collect(Collectors.toList()); salaryMonthList.forEach(k -> { Map temp = new HashMap<>(); - temp.put(DM, k); + temp.put(DM, SalaryDateUtil.getFormatYearMonth(k)); temp.putAll(SalaryStatisticsReportBO.calculateItem(listMap.get(k), lastListMap.get(ReportTimeUtil.getLastYearMonth(k)), sameListMap.get(ReportTimeUtil.getSameYearMonth(k)), salaryAcctResultValueMap, data.getSalaryStatisticsItemList())); records.add(temp); }); diff --git a/src/com/engine/salary/report/web/SalaryStatisticsReportController.java b/src/com/engine/salary/report/web/SalaryStatisticsReportController.java index 906452801..363227bb3 100644 --- a/src/com/engine/salary/report/web/SalaryStatisticsReportController.java +++ b/src/com/engine/salary/report/web/SalaryStatisticsReportController.java @@ -8,6 +8,8 @@ import com.engine.salary.report.entity.param.SalaryStatisticsSearchConditionSave import com.engine.salary.report.wrapper.SalaryStatisticsReportWrapper; import com.engine.salary.util.ResponseResult; import io.swagger.v3.oas.annotations.parameters.RequestBody; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; @@ -16,6 +18,11 @@ import javax.servlet.http.HttpServletResponse; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.time.LocalDate; import java.util.Collection; import java.util.List; import java.util.Map; @@ -28,6 +35,7 @@ import java.util.Map; * @author qiantao * @version 1.0 **/ +@Slf4j public class SalaryStatisticsReportController { private SalaryStatisticsReportWrapper getSalaryStatisticsReportWrapper(User user) { @@ -133,15 +141,37 @@ public class SalaryStatisticsReportController { return new ResponseResult>(user).run(getSalaryStatisticsReportWrapper(user)::getData, param); } -// /** -// * 导出报表数据 -// * -// * @param param -// * @return -// */ -// @PostMapping("/exportData") -// @ApiOperation("导出报表数据") -// @WeaPermission(publicPermission = true) -// public WeaResult> exportData(@RequestBody SalaryStatisticsReportDataQueryParam param) { -// return WeaResult.success(salaryStatisticsReportWrapper.exportData(param, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey())); + /** + * 导出报表数据 + * + * @param param + * @return + */ + @POST + @Path("/acctemployee/export") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryStatisticsReportDataQueryParam param) { + try { + + User user = HrmUserVarify.getUser(request, response); + Map map = getSalaryStatisticsReportWrapper(user).exportData(param); + XSSFWorkbook workbook = (XSSFWorkbook) map.get("workbook"); + String time = LocalDate.now().toString(); + String fileName = map.get("fileName") + "-" + time; + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); + } catch (Exception e) { + log.error("核算人员范围导出异常", e); + throw e; + } + } } diff --git a/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java b/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java index 0201de093..15746671c 100644 --- a/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java +++ b/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java @@ -23,9 +23,14 @@ import com.engine.salary.report.service.impl.SalaryStatisticsItemServiceImpl; import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl; import com.engine.salary.report.service.impl.SubTableExportServiceImpl; import com.engine.salary.util.*; +import com.engine.salary.util.excel.ExcelUtilPlus; import com.engine.salary.util.page.PageInfo; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Component; import weaver.hrm.User; @@ -225,42 +230,59 @@ public class SalaryStatisticsReportWrapper extends Service { * 导出报表数据 * * @param param - * @param employeeId - * @param tenantKey * @return */ - public Map exportData(SalaryStatisticsReportDataQueryParam param, Long employeeId, String tenantKey) { -// if (param.getId() == null || param.getDimensionId() == null) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); -// } -// -// SalaryStatisticsReportPO po = this.getSalaryStatisticsReportService(user).getById(param.getId()); -// if (po == null) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(161845, "薪酬统计报表不存在")); -// } -// SalaryStatisticsDimensionPO dimension = getSalaryStatisticsDimensionService(user).getById(param.getDimensionId()); -// if (dimension == null) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(161300, "统计维度不存在")); -// } -// // 查询自定义统计项目 -// List salaryStatisticsItemList = this.getSalaryStatisticsItemService(user).listByStatisticsReportId(po.getId()); -// // 列表data -// Page> page = this.getSalaryStatisticsReportService(user).buildReportRecords(dimension, param, po, salaryStatisticsItemList); -// // 组装合计 -// Map countResultMap = SalaryStatisticsReportBO.buildTotal(page, salaryStatisticsItemList); -// if (CollectionUtils.isNotEmpty(page.getRecords()) && MapUtils.isNotEmpty(countResultMap)) { -// page.getRecords().add(countResultMap); -// } -// // 获取数据 -// List> records = CollectionUtils.emptyIfNull(page.getRecords()).stream().map(m -> m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() + StringUtils.EMPTY))).collect(Collectors.toList()); -// -// // 获取列头 -// List weaTableColumns = SalaryStatisticsReportBO.buildReportColumns(dimension.getDimName(), salaryStatisticsItemList); -// -// // 组装导出参数 + public Map exportData(SalaryStatisticsReportDataQueryParam param) { + if (param.getId() == null || param.getDimensionId() == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + } + + SalaryStatisticsReportPO po = this.getSalaryStatisticsReportService(user).getById(param.getId()); + if (po == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(161845, "薪酬统计报表不存在")); + } + SalaryStatisticsDimensionPO dimension = getSalaryStatisticsDimensionService(user).getById(param.getDimensionId()); + if (dimension == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(161300, "统计维度不存在")); + } + // 查询自定义统计项目 + List salaryStatisticsItemList = this.getSalaryStatisticsItemService(user).listByStatisticsReportId(po.getId()); + // 列表data + PageInfo> page = this.getSalaryStatisticsReportService(user).buildReportRecords(dimension, param, po, salaryStatisticsItemList); + // 组装合计 + Map countResultMap = SalaryStatisticsReportBO.buildTotal(page, salaryStatisticsItemList, (long) user.getUID()); + List> list = page.getList(); + if (CollectionUtils.isNotEmpty(list) && MapUtils.isNotEmpty(countResultMap)) { + list.add(countResultMap); + } + // 获取数据 + List> records = list.stream().map(m -> m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() + StringUtils.EMPTY))).collect(Collectors.toList()); + + // 获取列头 + List weaTableColumns = SalaryStatisticsReportBO.buildReportColumns(dimension.getDimName(), salaryStatisticsItemList); + + // 组装导出参数 // ExportCommonParam exportParam = SalaryStatisticsReportBO.buildExportParam(dimension.getDimName(), weaTableColumns, records); // exportParam.setSheetName(SalaryI18nUtil.getI18nLabel(179263, "薪酬统计报表") + "-" + exportParam.getDimensionName()); -// return getSubTableExportService(user).exportCommon(exportParam, UserContext.getCurrentUser(), TenantContext.get()); - return null; +// + + List rows = new ArrayList<>(); + rows.add(weaTableColumns); + for (Map map : records) { + List row = Lists.newArrayListWithExpectedSize(records.size()); + for (String k : map.keySet()) { + row.add(map.getOrDefault(k, StringUtils.EMPTY)); + } + rows.add(row); + } + + String sheetName = SalaryI18nUtil.getI18nLabel(179263, "薪酬统计报表") + "-" + dimension.getDimName(); + XSSFWorkbook book = ExcelUtilPlus.genWorkbookWithChildTitleColumn(rows, sheetName, true); + + Map map = new HashMap<>(); + map.put("workbook",book); + map.put("fileName",sheetName); + + return map; } }