diff --git a/src/com/engine/salary/entity/salaryacct/po/WzDhReportSetPO.java b/src/com/engine/salary/entity/salaryacct/po/WzDhReportSetPO.java new file mode 100644 index 000000000..d23428856 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/po/WzDhReportSetPO.java @@ -0,0 +1,33 @@ +package com.engine.salary.entity.salaryacct.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author Harryxzy + * @ClassName WzDhReportSetPO + * @date 2025/02/25 17:41 + * @description + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WzDhReportSetPO { + // 人员类型 + private String rylx; + + // 统计项目名称 + private String tjxmmc; + + // 统计薪资项 + private List tjxzx; + + // 排序 + private Integer px; + +} diff --git a/src/com/engine/salary/service/SalaryAcctExcelService.java b/src/com/engine/salary/service/SalaryAcctExcelService.java index de7c05e62..6d34210cd 100644 --- a/src/com/engine/salary/service/SalaryAcctExcelService.java +++ b/src/com/engine/salary/service/SalaryAcctExcelService.java @@ -155,6 +155,7 @@ public interface SalaryAcctExcelService { */ Map exportTemplateList(SalaryAcctResultTemplateSaveParam param); + // // /** // * 薪资核算结果校验异常导出 diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index a89785586..93987eab4 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -7,8 +7,10 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.util.page.PageInfo; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Map; @@ -230,4 +232,8 @@ public interface SalaryAcctResultService { String handleWzResult(); String handleWzResult2(); + + Map dhSalaryReportList(Date salaryMonth); + + XSSFWorkbook exportDhSalaryReport(Date salaryMonth); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java index 5a805cf57..5a1c5b4e3 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctExcelServiceImpl.java @@ -7,16 +7,14 @@ import com.cloudstore.dev.api.util.Util_DataCache; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.hrmelog.entity.dto.LoggerContext; +import com.engine.salary.common.LocalDateRange; 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.SalaryAcctConfig; -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.bo.*; import com.engine.salary.entity.salaryacct.dto.SalaryAccEmployeeListDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctImportFieldDTO; import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultTemplateDTO; @@ -35,6 +33,7 @@ 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.salaryaccounting.LockStatusEnum; +import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; @@ -72,7 +71,9 @@ import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.util.StopWatch; +import weaver.conn.RecordSet; import weaver.file.ImageFileManager; +import weaver.general.BaseBean; import weaver.hrm.User; import java.io.InputStream; diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index cf15d3f7a..c63daccfd 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -6,6 +6,7 @@ import com.engine.core.impl.Service; import com.engine.hrmelog.entity.dto.LoggerContext; import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.common.LocalDateRange; +import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.config.SalaryElogConfig; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; @@ -56,6 +57,7 @@ import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.IdGenerator; import com.engine.salary.util.db.MapperProxyFactory; +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; @@ -70,10 +72,13 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.ibatis.session.SqlSession; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.util.StopWatch; +import weaver.conn.RecordSet; import weaver.conn.mybatis.MyBatisFactory; import weaver.general.BaseBean; +import weaver.general.Util; import weaver.hrm.User; import java.math.BigDecimal; @@ -1469,4 +1474,190 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } return "success"; } + + + @Override + public Map dhSalaryReportList(Date salaryMonth) { + Map resultMap = new HashMap<>(); + if (salaryMonth == null) { + return null; + } + BaseBean baseBean = new BaseBean(); + List salarySobIds = Arrays.stream(baseBean.getPropValue("sxwzDhSalaryReport", "dh_report_salary_sob_id").split(",")) + .filter(NumberUtils::isCreatable) + .map(Long::valueOf) + .collect(Collectors.toList()); + // 查询薪资核算记录 + LocalDateRange salaryMonthRange = LocalDateRange.builder().fromDate(salaryMonth).endDate(salaryMonth).build(); + List salaryAcctRecordList = getSalaryAcctRecordService(user).listBySalarySobIdsAndSalaryMonth(salarySobIds, salaryMonthRange); + // 过滤未归档数据 + salaryAcctRecordList = salaryAcctRecordList.stream().filter(record -> record.getStatus() > SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()).collect(Collectors.toList()); + List salaryAcctRecordIds = salaryAcctRecordList.stream().map(SalaryAcctRecordPO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(salaryAcctRecordIds)) { + return resultMap; + } + // 查询薪资核算人员 + List salaryAcctEmployeePOList = getSalaryAcctEmployeeService(user).listBySalaryAcctRecordIds(salaryAcctRecordIds); + if (CollectionUtils.isEmpty(salaryAcctEmployeePOList)) { + return resultMap; + } + // 获取员工信息 + List salaryAcctEmpIds = salaryAcctEmployeePOList.stream().map(SalaryAcctEmployeePO::getId).distinct().collect(Collectors.toList()); + // 获取需要统计的项目信息 + List cwReportMappingList = listAllCwReportMappingInfo(); + Long rylxItemId = NumberUtils.isCreatable(baseBean.getPropValue("sxwzDhSalaryReport", "rylx_salary_item_id")) ? Long.valueOf(baseBean.getPropValue("sxwzDhSalaryReport", "rylx_salary_item_id")) : 0L; + + // 获取需要统计的薪资项目 + List salaryItemIds = cwReportMappingList.stream().map(setPO -> setPO.getTjxzx()).flatMap(Collection::stream).collect(Collectors.toList()); + salaryItemIds.add(rylxItemId); + List salaryItemList = getSalaryItemService(user).listByIds(salaryItemIds); + List numberItems = salaryItemList.stream().filter(item -> item.getDataType().equals(SalaryDataTypeEnum.NUMBER.getValue())).collect(Collectors.toList()); + // 查询薪资核算结果 + List acctResultList = getSalaryAcctResultService(user).listByAcctEmployeeIdsAndSalaryItemIds(salaryAcctEmpIds, salaryItemIds); + List> acctResultMap = buildData4WZ(salaryItemList, salaryAcctEmployeePOList, acctResultList); + + // 根据人员类型分组 + Map>> acctResultGroupMap = SalaryEntityUtil.group2Map(acctResultMap, map -> Util.null2String(map.getOrDefault(rylxItemId.toString(), ""))); + LinkedHashMap> sumResultByGroup = getSumResultByGroup(acctResultGroupMap, Collections.emptyList(), numberItems, cwReportMappingList); + + // 构建表头 + List columns = new ArrayList<>(); + columns.add(new WeaTableColumnGroup("150px", "人员类型", "rylx")); + columns.add(new WeaTableColumnGroup("150px", "明细", "mx")); + columns.add(new WeaTableColumnGroup("150px", "金额", "je")); + List> resultList = new ArrayList<>(); + for (Map.Entry> entry : sumResultByGroup.entrySet()) { + String rylx = entry.getKey(); + entry.getValue().forEach((key, value) -> { + LinkedHashMap singleRowMap = new LinkedHashMap<>(); + singleRowMap.put("rylx", rylx); + singleRowMap.put("mx", key); + singleRowMap.put("je", value); + resultList.add(singleRowMap); + }); + } + Map map = new HashMap<>(); + map.put("column", columns); + map.put("data", resultList); + return map; + } + + @Override + public XSSFWorkbook exportDhSalaryReport(Date salaryMonth) { + Map resultMap = dhSalaryReportList(salaryMonth); + List columns = resultMap.get("column") == null ? new ArrayList() : (List)resultMap.get("column"); + List> data = resultMap.get("data") == null ? new ArrayList>() : (List>) resultMap.get("data"); + if (CollectionUtils.isNotEmpty(columns) && CollectionUtils.isNotEmpty(data)) { + List> rows = new ArrayList<>(); + rows.add(columns.stream().map(WeaTableColumnGroup::getText).collect(Collectors.toList())); + for (LinkedHashMap rowMap : data) { + List rowList = new ArrayList<>(); + for (WeaTableColumnGroup column : columns) { + if (column.getColumn().equals("je") && NumberUtils.isCreatable(Util.null2String(rowMap.getOrDefault(column.getColumn(), "")))) { + rowList.add(new BigDecimal(Util.null2String(rowMap.getOrDefault(column.getColumn(), "")))); + } else { + rowList.add(Util.null2String(rowMap.getOrDefault(column.getColumn(), ""))); + } + } + rows.add(rowList); + } + + return ExcelUtilPlus.genWorkbook4Wz(rows, "薪酬报表", false); + } + return null; + } + + /** + * 获取德闳薪酬财务报表映射配置信息 + * @return + */ + private List listAllCwReportMappingInfo() { + List resultList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.execute("select rylx,tjxmmc,tjxzx,px from uf_dhcwbbyspz"); + while (rs.next()) { + String rylx = rs.getString("rylx"); + String tjxmmc = rs.getString("tjxmmc"); + String tjxzx = rs.getString("tjxzx"); + List tjxzxIds = Arrays.stream(tjxzx.split(",")).filter(NumberUtils::isCreatable).map(Long::valueOf).collect(Collectors.toList()); + int px = rs.getInt("px"); + resultList.add(WzDhReportSetPO.builder() + .rylx(rylx) + .tjxmmc(tjxmmc) + .tjxzx(tjxzxIds) + .px(px) + .build()); + } + return resultList; + } + + public List> buildData4WZ(List salaryItems, + List salaryAcctEmployees, + List salaryAccountingResults) { + if (CollectionUtils.isEmpty(salaryAcctEmployees)) { + return Collections.emptyList(); + } + SalaryI18nUtil.i18nList(salaryAcctEmployees); + Map> acctResultMap = SalaryEntityUtil.group2Map(salaryAccountingResults, SalaryAcctResultPO::getSalaryAcctEmpId); + return salaryAcctEmployees.stream().map(e -> { + Map resultValueMap = SalaryEntityUtil.convert2Map(acctResultMap.getOrDefault(e.getId(), Collections.emptyList()), + SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue); + // 薪资项目的值 + Map map = SalaryEntityUtil.convert2Map(salaryItems, o -> "" + o.getId(), o -> resultValueMap.getOrDefault(o.getId(), StringUtils.EMPTY)); + // 主键id + map.put("id", e.getId()); + //人员id + map.put("employeeId", e.getEmployeeId()); + return map; + }).collect(Collectors.toList()); + } + + + + private LinkedHashMap> getSumResultByGroup(Map>> groupBy, + List salarySobItemPOS, + List numberItems, + List cwReportMappingList) { + LinkedHashMap>> sortedGroupBy = new LinkedHashMap<>(); + groupBy.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .forEachOrdered(x -> sortedGroupBy.put(x.getKey(), x.getValue())); + // 本次薪资核算所用的薪资账套下的薪资项目 + Map> tjxmMappingGroup = SalaryEntityUtil.group2Map(cwReportMappingList, WzDhReportSetPO::getRylx); + LinkedHashMap> resultMap = new LinkedHashMap<>(); + for(Map.Entry>> entrySet : sortedGroupBy.entrySet()){ + List> value = entrySet.getValue(); + // 获取该分组有哪些统计项 + List wzDhReportSetList = tjxmMappingGroup.get(entrySet.getKey()); + if (CollectionUtils.isEmpty(wzDhReportSetList)) { + continue; + } + wzDhReportSetList = wzDhReportSetList.stream().sorted(Comparator.comparing(WzDhReportSetPO::getPx)).collect(Collectors.toList()); + Map sumMap = new HashMap<>(); + for (WzDhReportSetPO setPO : wzDhReportSetList) { + // 某个统计项 + if (CollectionUtils.isEmpty(setPO.getTjxzx())) { + continue; + } + // 一个统计项的合计 + BigDecimal itemSumValue = new BigDecimal("0"); + for (Map valueMap : value) { + // 一个统计项可能由多个薪资项加起来 + BigDecimal personSumValue = setPO.getTjxzx().stream().filter(itemId -> valueMap.get(itemId.toString()) != null) + .map(itemId -> (String) valueMap.get(itemId.toString())) + .filter(NumberUtils::isCreatable) + .map(BigDecimal::new) + .reduce(BigDecimal.ZERO, BigDecimal::add); + itemSumValue = itemSumValue.add(personSumValue); + } + sumMap.put(setPO.getTjxmmc(), itemSumValue); + } + LinkedHashMap sortedSumMap = new LinkedHashMap<>(); + sumMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .forEachOrdered(x -> sortedSumMap.put(x.getKey(), x.getValue())); + resultMap.put(entrySet.getKey(), sortedSumMap); + } + return resultMap; + } } \ No newline at end of file diff --git a/src/com/engine/salary/util/excel/ExcelUtilPlus.java b/src/com/engine/salary/util/excel/ExcelUtilPlus.java index 9da402ce7..bd50fd913 100644 --- a/src/com/engine/salary/util/excel/ExcelUtilPlus.java +++ b/src/com/engine/salary/util/excel/ExcelUtilPlus.java @@ -3,9 +3,11 @@ package com.engine.salary.util.excel; import com.engine.salary.component.WeaTableColumnGroup; import com.engine.salary.util.SalaryDateUtil; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; +import weaver.wechat.util.Utils; import java.awt.Color; import java.math.BigDecimal; @@ -864,6 +866,150 @@ public class ExcelUtilPlus { return workbook; } + public static XSSFWorkbook genWorkbook4Wz(List> rowList, String sheetName, boolean lastRowRed) { + XSSFWorkbook workbook = new XSSFWorkbook(); + + // 设置title样式 + XSSFCellStyle titleCellStyle = workbook.createCellStyle(); + XSSFFont titleFont = workbook.createFont(); + titleFont.setBold(true); + titleFont.setFontName("仿宋"); + titleFont.setFontHeightInPoints((short) 15); + titleCellStyle.setFont(titleFont); + titleCellStyle.setAlignment(HorizontalAlignment.CENTER); + titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景色 + titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + titleCellStyle.setBorderLeft(BorderStyle.THIN); + titleCellStyle.setBorderRight(BorderStyle.THIN); + titleCellStyle.setBorderTop(BorderStyle.THIN); + titleCellStyle.setBorderBottom(BorderStyle.THIN); + + + // 设置主体样式 + XSSFCellStyle cellStyle = workbook.createCellStyle(); + XSSFFont font = workbook.createFont(); + font.setFontName("宋体"); + font.setFontHeightInPoints((short) 10);// 设置字体大小 + cellStyle.setFont(font);// 选择需要用到的字体格式 + cellStyle.setWrapText(true); + + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setFillPattern(FillPatternType.NO_FILL); + + XSSFCellStyle redCellStyle = workbook.createCellStyle(); + XSSFFont redFont = workbook.createFont(); + redFont.setFontName("宋体"); + redFont.setFontHeightInPoints((short) 10);// 设置字体大小 + redFont.setColor(new XSSFColor(new Color(0xFF3333), null)); + redFont.setBold(true); + redCellStyle.setWrapText(true); + redCellStyle.setFont(redFont);// 选择需要用到的字体格式 + + redCellStyle.setBorderLeft(BorderStyle.THIN); + redCellStyle.setBorderRight(BorderStyle.THIN); + redCellStyle.setBorderTop(BorderStyle.THIN); + redCellStyle.setBorderBottom(BorderStyle.THIN); + + + XSSFCellStyle childTitleCellStyle = workbook.createCellStyle(); + childTitleCellStyle.setFont(font); + childTitleCellStyle.setAlignment(HorizontalAlignment.CENTER); + childTitleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + childTitleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + childTitleCellStyle.setBorderLeft(BorderStyle.THIN); + childTitleCellStyle.setBorderRight(BorderStyle.THIN); + childTitleCellStyle.setBorderTop(BorderStyle.THIN); + childTitleCellStyle.setBorderBottom(BorderStyle.THIN); + + XSSFSheet sheet = workbook.createSheet(sheetName); + //自适应宽度 + sheet.autoSizeColumn(0, true); + //默认列宽 + sheet.setDefaultColumnWidth(20); + //默认行高 + sheet.setDefaultRowHeightInPoints(18); + + for (int rowIndex = 0; rowIndex < rowList.size(); rowIndex++) { + List infoList = rowList.get(rowIndex); + XSSFRow row = sheet.createRow(rowIndex); + float height = 18; + float finalHeight = 18; + + for (int cellIndex = 0; cellIndex < infoList.size(); cellIndex++) { + XSSFCell cell = row.createCell(cellIndex); + + if (rowIndex == 0) { + cell.setCellStyle(titleCellStyle); + } else { + if (cellIndex == 0) { + cell.setCellStyle(childTitleCellStyle); + } else { + if (lastRowRed && rowIndex == rowList.size() - 1) { + cell.setCellStyle(redCellStyle); + } else { + cell.setCellStyle(cellStyle); + } + } + } + Object o = infoList.get(cellIndex); + if (o instanceof String) { + cell.setCellType(CellType.STRING); + cell.setCellValue(String.valueOf(o)); + } else if (o instanceof BigDecimal) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(o == null ? 0 : ((BigDecimal) o).doubleValue()); + } else if (o instanceof Boolean) { + cell.setCellType(CellType.BOOLEAN); + cell.setCellValue(String.valueOf(o)); + } else if (o instanceof Date) { + cell.setCellType(CellType.STRING); + cell.setCellValue(SalaryDateUtil.getFormatLocalDate((Date) o)); + } else { + cell.setCellType(CellType.STRING); + cell.setCellValue(o == null ? "" : o.toString()); + } + + //判断是否要调整高度 + int width = sheet.getColumnWidth(cellIndex) / 256; + finalHeight = getFinalHeight(o, width, finalHeight, height); + } + row.setHeightInPoints(finalHeight); + } + + + //处理合并单元格 + int startIndex = 1; + String oldRylx = ""; + for (int i = 1; i < rowList.size(); i++) { + List infoList = rowList.get(i); + String rylx = Utils.null2String(infoList.get(0)); + if (StringUtils.isBlank(oldRylx) || !oldRylx.equals(rylx)) { + // 查询有几个相同的人员类型 + int mergeCol = 1; + for (int j = i+1;j < rowList.size(); j++) { + String nextRylx = Utils.null2String(rowList.get(j).get(0)); + if (nextRylx.equals(rylx)) { + mergeCol++; + } else { + break; + } + } + int endIndex = startIndex + mergeCol - 1; + + if (endIndex > startIndex) { + sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, 0, 0)); + } + startIndex += mergeCol; + oldRylx = rylx; + } + } + return workbook; + } + public static float getFinalHeight(Object o, int width, float finalHeight, float height) { if (o != null && getStrlength(o.toString()) > width) { float remainder = getStrlength(o.toString()) % width; diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index c61dd39bd..0b74112d7 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -31,10 +31,7 @@ import javax.ws.rs.core.StreamingOutput; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -1051,4 +1048,44 @@ public class SalaryAcctController { } /**********************************线下对比 end*********************************/ + + @POST + @Path("/dhSalaryReport/list") + @Produces(MediaType.APPLICATION_JSON) + public String dhSalaryReportList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctRecordQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + Date salaryMonth = SalaryDateUtil.dateStrToLocalYearMonth(param.getStartMonthStr()); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::dhSalaryReportList, salaryMonth); + } + + @GET + @Path("/dhSalaryReport/export") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response exportDhSalaryReport(@Context HttpServletRequest request, @Context HttpServletResponse response) { + try { + User user = HrmUserVarify.getUser(request, response); + String startMonthStr = request.getParameter("startMonthStr"); + Date salaryMonth = null; + if (StringUtils.isNotBlank(startMonthStr)) { + salaryMonth = SalaryDateUtil.dateStrToLocalYearMonth(startMonthStr); + } + XSSFWorkbook workbook = getSalaryAcctResultWrapper(user).exportDhSalaryReport(salaryMonth); + String time = LocalDate.now().toString(); + String 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/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 92bf38bb2..93d87ac20 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.hrm.User; import java.math.BigDecimal; @@ -415,6 +416,14 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult return getSalaryAcctResultService(user).handleWzResult2(); } + public Map dhSalaryReportList(Date salaryMonth) { + return getSalaryAcctResultService(user).dhSalaryReportList(salaryMonth); + } + + public XSSFWorkbook exportDhSalaryReport(Date salaryMonth) { + return getSalaryAcctResultService(user).exportDhSalaryReport(salaryMonth); + } + /** * 薪资核算-校验 *