疗休养台账中加一个导出按钮,根据查询条件导出
This commit is contained in:
+65
@@ -319,6 +319,59 @@ public class TourLedgerController {
|
|||||||
CommonDownloadUtil.download("参加人员导入模板.xlsx", workbook, response);
|
CommonDownloadUtil.download("参加人员导入模板.xlsx", workbook, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按台账页面当前查询条件导出全部匹配记录。
|
||||||
|
*
|
||||||
|
* @param startYear 开始年度,传四位年度数字
|
||||||
|
* @param endYear 结束年度,传四位年度数字
|
||||||
|
* @param keyword 姓名或工号关键字,可为空
|
||||||
|
* @param unionId 所属工会ID,可为空
|
||||||
|
* @param lineId 线路ID;历史线路使用legacy:线路名称,可为空
|
||||||
|
* @param travelPeriod 出行时段,格式为开始时间 至 结束时间,可为空
|
||||||
|
* @param lineType 线路类型字典名称,可为空
|
||||||
|
* @param directFamilyOnly 是否仅导出参加直系亲属单位线路人员
|
||||||
|
* @param overCostOnly 是否仅导出申请超出费用由单位承担人员
|
||||||
|
* @param response HTTP响应,返回XSSF格式的Excel文件流
|
||||||
|
*/
|
||||||
|
@At
|
||||||
|
@Ok("void")
|
||||||
|
@SaCheckPermission("tour.ledger")
|
||||||
|
public void exportData(Integer startYear, Integer endYear, String keyword, String unionId, String lineId,
|
||||||
|
String travelPeriod, String lineType, Boolean directFamilyOnly, Boolean overCostOnly,
|
||||||
|
HttpServletResponse response) {
|
||||||
|
Cnd cnd = buildQueryCnd(startYear, endYear, keyword, unionId, lineId, travelPeriod, lineType,
|
||||||
|
directFamilyOnly, overCostOnly);
|
||||||
|
List<NutMap> rows = tourLedgerService.queryExportRows(cnd);
|
||||||
|
for (int i = 0; i < rows.size(); i++) {
|
||||||
|
NutMap row = rows.get(i);
|
||||||
|
row.put("index", i + 1);
|
||||||
|
row.put("groupInfo", formatGroupInfo(row));
|
||||||
|
row.put("joinedName", row.getBoolean("joined", false) ? "是" : "否");
|
||||||
|
row.put("overCostReimbursedName", row.getBoolean("overCostReimbursed", false) ? "是" : "否");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ExcelExportEntity> entities = new ArrayList<>();
|
||||||
|
entities.add(new ExcelExportEntity("序号", "index", 8));
|
||||||
|
entities.add(new ExcelExportEntity("年度", "year", 12));
|
||||||
|
entities.add(new ExcelExportEntity("工号", "jobNo", 18));
|
||||||
|
entities.add(new ExcelExportEntity("姓名", "userName", 16));
|
||||||
|
entities.add(new ExcelExportEntity("所在单位", "unitName", 28));
|
||||||
|
entities.add(new ExcelExportEntity("报名线路", "lineName", 30));
|
||||||
|
entities.add(new ExcelExportEntity("出行时段", "travelPeriod", 30));
|
||||||
|
entities.add(new ExcelExportEntity("线路类型", "lineType", 16));
|
||||||
|
entities.add(new ExcelExportEntity("成团信息", "groupInfo", 20));
|
||||||
|
entities.add(new ExcelExportEntity("领办工会", "undertakeUnionName", 24));
|
||||||
|
entities.add(new ExcelExportEntity("报名时间", "signupTime", 24));
|
||||||
|
entities.add(new ExcelExportEntity("携带家属人数", "familyCount", 16));
|
||||||
|
entities.add(new ExcelExportEntity("是否参加", "joinedName", 14));
|
||||||
|
entities.add(new ExcelExportEntity("是否申请超出费用由单位承担", "overCostReimbursedName", 28));
|
||||||
|
|
||||||
|
ExportParams exportParams = new ExportParams();
|
||||||
|
exportParams.setType(ExcelType.XSSF);
|
||||||
|
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, rows);
|
||||||
|
CommonDownloadUtil.download("疗休养台账.xlsx", workbook, response);
|
||||||
|
}
|
||||||
|
|
||||||
@At
|
@At
|
||||||
@SaCheckPermission("tour.ledger")
|
@SaCheckPermission("tour.ledger")
|
||||||
@Ok("void")
|
@Ok("void")
|
||||||
@@ -420,6 +473,18 @@ public class TourLedgerController {
|
|||||||
return unionRows;
|
return unionRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将成团编码和成团名称合并为列表一致的展示内容,任一字段为空时保留已有信息。
|
||||||
|
*/
|
||||||
|
private String formatGroupInfo(NutMap row) {
|
||||||
|
String groupCode = row.getString("groupCode", "");
|
||||||
|
String groupName = row.getString("groupName", "");
|
||||||
|
if (StrUtil.isBlank(groupCode)) {
|
||||||
|
return groupName;
|
||||||
|
}
|
||||||
|
return StrUtil.isBlank(groupName) ? groupCode : groupCode + " " + groupName;
|
||||||
|
}
|
||||||
|
|
||||||
private Workbook buildUnionSignupWorkbook(String unionName, List<NutMap> rows) {
|
private Workbook buildUnionSignupWorkbook(String unionName, List<NutMap> rows) {
|
||||||
HSSFWorkbook workbook = new HSSFWorkbook();
|
HSSFWorkbook workbook = new HSSFWorkbook();
|
||||||
Sheet sheet = workbook.createSheet("报名汇总表");
|
Sheet sheet = workbook.createSheet("报名汇总表");
|
||||||
|
|||||||
@@ -20,6 +20,15 @@ public interface TourLedgerService extends BaseService<TourLedger> {
|
|||||||
*/
|
*/
|
||||||
List<NutMap> queryGroupOptions(Cnd cnd);
|
List<NutMap> queryGroupOptions(Cnd cnd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按疗休养台账页面的完整查询条件获取导出数据,不进行分页。
|
||||||
|
*
|
||||||
|
* @param cnd 台账查询条件,包含年度范围、姓名或工号、所属工会、线路、出行时段、线路类型、
|
||||||
|
* 直系亲属单位线路人员、超出费用由单位承担人员及审批完成状态限制
|
||||||
|
* @return 台账导出数据列表;每项包含年度、人员、线路、成团、领办工会、报名、家属及参加状态信息
|
||||||
|
*/
|
||||||
|
List<NutMap> queryExportRows(Cnd cnd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按事项最大成团人数,将当前事项下未成团的报名教职工及家属整体自动分配到成团中。
|
* 按事项最大成团人数,将当前事项下未成团的报名教职工及家属整体自动分配到成团中。
|
||||||
*
|
*
|
||||||
|
|||||||
+68
@@ -56,6 +56,74 @@ public class TourLedgerServiceImpl extends BaseServiceImpl<TourLedger> implement
|
|||||||
return sql.getList(NutMap.class);
|
return sql.getList(NutMap.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合台账页面筛选条件的全部导出数据,关联线路、事项和家属数据以保持导出结果与列表一致。
|
||||||
|
*
|
||||||
|
* @param cnd 已包含页面全部筛选项和审批完成状态限制的台账查询条件
|
||||||
|
* @return 未分页的台账导出数据列表,每项为一名教职工的一条有效台账记录
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<NutMap> queryExportRows(Cnd cnd) {
|
||||||
|
Sql sql = Sqls.create("""
|
||||||
|
SELECT
|
||||||
|
t.`year`,
|
||||||
|
t.jobNo,
|
||||||
|
t.userName,
|
||||||
|
t.unitName,
|
||||||
|
COALESCE(NULLIF(l.lineName, ''), t.lineName) AS lineName,
|
||||||
|
CASE
|
||||||
|
WHEN IFNULL(m.travelStartTime, '') <> '' AND IFNULL(m.travelEndTime, '') <> ''
|
||||||
|
THEN CONCAT(m.travelStartTime, ' 至 ', m.travelEndTime)
|
||||||
|
ELSE tp.travelPeriod
|
||||||
|
END AS travelPeriod,
|
||||||
|
t.lineType,
|
||||||
|
t.groupCode,
|
||||||
|
t.groupName,
|
||||||
|
t.undertakeUnionName,
|
||||||
|
t.signupTime,
|
||||||
|
IFNULL(f.familyCount, 0) AS familyCount,
|
||||||
|
t.joined,
|
||||||
|
t.overCostReimbursed
|
||||||
|
FROM tour_ledger t
|
||||||
|
LEFT JOIN wf_process_instance ins ON ins.businessNo = t.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT ledgerId, COUNT(1) AS familyCount
|
||||||
|
FROM tour_ledger_family
|
||||||
|
WHERE delFlag = 0
|
||||||
|
GROUP BY ledgerId
|
||||||
|
) f ON f.ledgerId = t.id
|
||||||
|
LEFT JOIN tour_matter m ON m.id = t.matterId AND m.delFlag = 0
|
||||||
|
LEFT JOIN tour_line l ON l.id = t.lineId AND l.delFlag = 0
|
||||||
|
LEFT JOIN tour_ledger_direct_relative dr ON dr.ledgerId = t.id AND dr.delFlag = 0
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
`year`,
|
||||||
|
lineId,
|
||||||
|
GROUP_CONCAT(
|
||||||
|
DISTINCT CASE
|
||||||
|
WHEN IFNULL(travelStartTime, '') <> '' AND IFNULL(travelEndTime, '') <> ''
|
||||||
|
THEN CONCAT(travelStartTime, ' 至 ', travelEndTime)
|
||||||
|
ELSE NULL
|
||||||
|
END
|
||||||
|
ORDER BY travelStartTime ASC
|
||||||
|
SEPARATOR ';'
|
||||||
|
) AS travelPeriod
|
||||||
|
FROM tour_matter
|
||||||
|
WHERE delFlag = 0
|
||||||
|
AND lineId IS NOT NULL
|
||||||
|
AND lineId <> ''
|
||||||
|
GROUP BY `year`, lineId
|
||||||
|
) tp ON (t.matterId IS NULL OR t.matterId = '') AND tp.`year` = t.`year` AND tp.lineId = t.lineId
|
||||||
|
$condition
|
||||||
|
GROUP BY t.id
|
||||||
|
ORDER BY t.`year` DESC, t.signupTime DESC, t.createdAt DESC
|
||||||
|
""");
|
||||||
|
sql.setCondition(cnd);
|
||||||
|
sql.setCallback(Sqls.callback.maps());
|
||||||
|
dao().execute(sql);
|
||||||
|
return sql.getList(NutMap.class);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自动分配当前事项下未成团的教职工台账,分配过程中出现容量不合法时整体中止。
|
* 自动分配当前事项下未成团的教职工台账,分配过程中出现容量不合法时整体中止。
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ layout("/layouts/platform.html"){
|
|||||||
<div class="tour-ledger-actions">
|
<div class="tour-ledger-actions">
|
||||||
<el-button size="medium" type="primary" icon="el-icon-upload2" @click="showImportDialog = true">参加人员导入</el-button>
|
<el-button size="medium" type="primary" icon="el-icon-upload2" @click="showImportDialog = true">参加人员导入</el-button>
|
||||||
<el-button size="medium" type="primary" icon="el-icon-check" @click="setParticipants">设置参加人员</el-button>
|
<el-button size="medium" type="primary" icon="el-icon-check" @click="setParticipants">设置参加人员</el-button>
|
||||||
|
<el-button size="medium" type="primary" icon="el-icon-download" @click="exportData">导出</el-button>
|
||||||
<el-button size="medium" type="primary" icon="el-icon-download" @click="exportUnionSignupZip">导出分工会报名压缩包</el-button>
|
<el-button size="medium" type="primary" icon="el-icon-download" @click="exportUnionSignupZip">导出分工会报名压缩包</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="tour-ledger-scope">
|
<div class="tour-ledger-scope">
|
||||||
@@ -448,6 +449,23 @@ layout("/layouts/platform.html"){
|
|||||||
}
|
}
|
||||||
window.location.href = loc() + "/exportUnionSignupZip?" + params.toString()
|
window.location.href = loc() + "/exportUnionSignupZip?" + params.toString()
|
||||||
},
|
},
|
||||||
|
// 导出台账时完整传递当前页面筛选项,两个特殊人员范围按钮也作为查询条件参与导出。
|
||||||
|
exportData() {
|
||||||
|
const params = new URLSearchParams()
|
||||||
|
;["startYear", "endYear", "keyword", "unionId", "lineId", "travelPeriod", "lineType"].forEach(key => {
|
||||||
|
const value = this.pageForm[key]
|
||||||
|
if (value !== undefined && value !== null && value !== "") {
|
||||||
|
params.append(key, value)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (this.pageForm.directFamilyOnly) {
|
||||||
|
params.append("directFamilyOnly", "true")
|
||||||
|
}
|
||||||
|
if (this.pageForm.overCostOnly) {
|
||||||
|
params.append("overCostOnly", "true")
|
||||||
|
}
|
||||||
|
window.location.href = loc() + "/exportData?" + params.toString()
|
||||||
|
},
|
||||||
afterImport() {
|
afterImport() {
|
||||||
this.showImportDialog = false
|
this.showImportDialog = false
|
||||||
this.clearTableSelection()
|
this.clearTableSelection()
|
||||||
|
|||||||
Reference in New Issue
Block a user