困难帮扶阅览增加导出汇总表格功能

This commit is contained in:
2026-09-09 08:41:12 +08:00
parent facdb5f52a
commit 032507de66
4 changed files with 91 additions and 0 deletions
@@ -98,6 +98,21 @@ public class DifficultHelpReadingController {
return Result.success().addData(pagination);
}
/**
* 导出当前阅览筛选范围内全部申请记录的受助人信息。
*
* @param pageParam 年度、受助人姓名或工号关键字、工会ID、单位ID及申请日期范围;分页参数不限制导出条数
* @param response HTTP 下载响应,返回“困难补助人员信息.xlsx”的二进制内容,包含受助人、性别、申请模式、出生年月、所属工会、所属单位、手机号码和申请原因八列
* @throws IOException Excel 生成失败时抛出
*/
@At
@Ok("void")
@ApiOperation("导出困难补助人员信息Excel")
@SaCheckPermission("difficultHelp.reading")
public void exportExcel(DifficultHelpPageParam pageParam, HttpServletResponse response) throws IOException {
CommonDownloadUtil.download("困难补助人员信息.xlsx", difficultHelpCommonService.exportExcel(pageParam), response);
}
/**
* 导出当前阅览条件下困难补助申请人上传的附件。
*
@@ -15,6 +15,15 @@ import java.io.IOException;
*/
public interface DifficultHelpCommonService extends BaseService<DifficultHelpInfo> {
/**
* 按阅览页筛选条件及当前用户数据权限导出全部申请记录的受助人信息。
*
* @param pageParam 年度、受助人姓名或工号关键字、工会ID、单位ID及申请日期范围,忽略分页参数
* @return XLSX 二进制内容,依次包含受助人、性别、申请模式、出生年月、所属工会、所属单位、手机号码和申请原因
* @throws IOException Excel 写入或资源关闭失败时抛出
*/
byte[] exportExcel(DifficultHelpPageParam pageParam) throws IOException;
/**
* 按困难补助阅览页的查询条件生成分工会审核已同意申请的附件压缩包。
*
@@ -1,5 +1,10 @@
package com.budwk.app.zhgh.staffbenefit.difficulthelp.service.impl;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.service.impl.BaseServiceImpl;
@@ -10,15 +15,18 @@ import com.budwk.app.zhgh.staffbenefit.difficulthelp.models.DifficultHelpInfo;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.service.DifficultHelpCommonService;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.vo.DifficultHelpPageParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -46,6 +54,60 @@ public class DifficultHelpCommonServiceImpl extends BaseServiceImpl<DifficultHel
super(dao);
}
/**
* 将阅览范围内每条申请的受助人信息转换为八列 Excel,保留申请时保存的人员信息。
*
* @param pageParam 阅览页筛选参数;年度、姓名或工号、工会、单位、日期范围及数据权限由 buildSearch 统一处理
* @return XLSX 二进制内容;无记录时保留表头,缺失字段留空,出生年月显示为 yyyy-MM-dd
* @throws IOException Excel 写入或资源关闭失败时抛出
*/
@Override
public byte[] exportExcel(DifficultHelpPageParam pageParam) throws IOException {
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.desc("info.applyTime");
// 列表按申请ID展示,直接查询业务表避免 wf 多任务关联产生重复行,不增加审核状态限制。
Sql sql = Sqls.create("SELECT info.* FROM difficult_help_info info $condition");
sql.setCondition(cnd);
List<DifficultHelpInfo> helpInfoList = listEntity(sql);
List<NutMap> rows = new ArrayList<>();
for (DifficultHelpInfo helpInfo : helpInfoList) {
NutMap row = new NutMap();
String userName = StrUtil.nullToEmpty(helpInfo.getUserName());
String loginName = StrUtil.nullToEmpty(helpInfo.getLoginName());
row.put("recipient", StrUtil.isBlank(loginName) ? userName : userName + "" + loginName + "");
row.put("sex", StrUtil.nullToEmpty(helpInfo.getSex()));
// 申请模式1为本人申请、2为替他人申请;历史空值或未知值不误判为代申请。
row.put("mode", "1".equals(helpInfo.getMode()) ? "本人申请" : "2".equals(helpInfo.getMode()) ? "替他人申请" : "");
row.put("birthday", helpInfo.getBirthday() == null ? "" : DateUtil.format(helpInfo.getBirthday(), "yyyy-MM-dd"));
row.put("unionName", StrUtil.nullToEmpty(helpInfo.getUnionName()));
row.put("unitName", StrUtil.nullToEmpty(helpInfo.getUnitName()));
// 手机号以文本写入,保留原始号码,避免 Excel 数值格式改变显示。
row.put("mobile", StrUtil.nullToEmpty(helpInfo.getMobile()));
row.put("reason", StrUtil.nullToEmpty(helpInfo.getReason()));
rows.add(row);
}
List<ExcelExportEntity> columns = new ArrayList<>();
columns.add(new ExcelExportEntity("受助人(姓名工号)", "recipient", 25));
columns.add(new ExcelExportEntity("性别", "sex", 10));
columns.add(new ExcelExportEntity("申请模式", "mode", 18));
columns.add(new ExcelExportEntity("出生年月", "birthday", 18));
columns.add(new ExcelExportEntity("所属工会", "unionName", 30));
columns.add(new ExcelExportEntity("所属单位", "unitName", 30));
columns.add(new ExcelExportEntity("手机号码", "mobile", 20));
ExcelExportEntity reasonColumn = new ExcelExportEntity("申请原因", "reason", 60);
reasonColumn.setWrap(true);
columns.add(reasonColumn);
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, columns, rows);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
workbook.write(outputStream);
return outputStream.toByteArray();
}
}
/**
* 根据阅览页筛选结果下载分工会审核已同意的附件,并以受助人姓名和工号作为 ZIP 内目录。
* 无附件、文件记录不存在或文件下载失败的记录会跳过,避免单个异常附件影响其他附件导出。
@@ -42,6 +42,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never" class="mt10">
<table-tool label="数据列表">
<el-button type="primary" icon="el-icon-download" size="small" @click="exportExcel">导出Excel</el-button>
<el-button type="primary" icon="el-icon-download" size="small" @click="exportAttachmentZip">导出附件Zip</el-button>
</table-tool>
@@ -114,6 +115,10 @@ layout("/layouts/platform.html"){
'info': INFO
},
methods: {
// 按当前筛选条件导出全部申请记录,下载及加载状态由公共下载方法统一处理。
exportExcel() {
this.$downLoad(loc() + "/exportExcel", this.pageForm)
},
exportAttachmentZip() {
this.$axios.post(loc() + "/hasExportableAttachment", this.pageForm).then((res) => {
if (res.code === 0 && res.data) {