feat:工会报销-社团活动附件说明不再复用文体活动的附件说明

This commit is contained in:
2026-10-17 15:33:18 +08:00
parent 15c39aad69
commit 010d56e348
3 changed files with 19 additions and 18 deletions
@@ -25,6 +25,7 @@ import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
@@ -182,35 +183,37 @@ public class UnionReimburseExportServiceImpl implements UnionReimburseExportServ
* 历史单据也按申请时间参与排序,同一秒内用创建时间及主键确定顺序;
* 不按打印顺序编号,也不按当前用户或报销状态过滤申请。
*
* @param form 已通过导出权限校验的报销申请
* @param form 报销申请,使用其单据ID读取数据库中的申请日期
* @return 年月日加至少三位当日序号,例如 20261009001
*/
@Override
public String buildPrintSerialNo(UnionReimburse form) {
if (form.getCreateTime() == null || StrUtil.isBlank(form.getId())) {
throw new BaseException("报销申请时间或单据ID为空,无法生成打印流水号");
if (form == null || StrUtil.isBlank(form.getId())) {
throw new BaseException("报销单据ID为空,无法生成打印流水号");
}
Date startTime = DateUtil.beginOfDay(form.getCreateTime());
// 先对当日全部申请排序,再读取目标申请,避免过滤ID后序号始终为1。
// 日期范围和编号前缀均取数据库原值,避免Java日期转换及参数绑定影响当天范围。
// 先对目标申请当天的全部单据排序,再筛选目标ID,保持审核、汇总和打印的编号一致。
Sql sql = Sqls.create("""
SELECT numbered.seq
SELECT DATE_FORMAT(numbered.createTime, '%Y%m%d') AS serialDate, numbered.seq
FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY createTime, createdAt, id) AS seq
FROM union_reimburse
WHERE createTime >= @startTime AND createTime < @endTime
SELECT info.id, info.createTime,
ROW_NUMBER() OVER (ORDER BY info.createTime, info.createdAt, info.id) AS seq
FROM union_reimburse info
INNER JOIN union_reimburse target ON target.id = @id
WHERE info.createTime >= DATE(target.createTime)
AND info.createTime < DATE_ADD(DATE(target.createTime), INTERVAL 1 DAY)
) numbered
WHERE numbered.id = @id
""");
sql.setParam("startTime", startTime);
sql.setParam("endTime", DateUtil.offsetDay(startTime, 1));
sql.setParam("id", form.getId());
sql.setCallback(Sqls.callback.integer());
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
int sequence = sql.getInt();
if (sequence < 1) {
throw new BaseException("未找到报销申请,无法生成打印流水号");
NutMap result = sql.getObject(NutMap.class);
if (result == null || !(result.get("seq") instanceof Number sequence)
|| sequence.longValue() < 1 || StrUtil.isBlank(result.getString("serialDate"))) {
throw new BaseException("未找到报销申请或申请时间为空,无法生成打印流水号");
}
return DateUtil.format(form.getCreateTime(), "yyyyMMdd") + String.format(Locale.ROOT, "%03d", sequence);
return result.getString("serialDate") + String.format(Locale.ROOT, "%03d", sequence.longValue());
}
/** 平铺字段供两类模板复用,支付总额与发票总额分别计算,不使用第一条支付代替全部明细。 */
@@ -1978,7 +1978,6 @@ layout("/layouts/platform.html"){
},
// 根据当前选择的报销项目获取管理端配置的提示内容。
getProjectTipByProject(projectCode) {
if (projectCode === "UNION_REIMBURSE_PROJECT_5") projectCode = "UNION_REIMBURSE_PROJECT_2"
if (!this.descOptions || !Array.isArray(this.descOptions)) {
return '';
}
@@ -2531,7 +2531,6 @@ layout("/layouts/platform_h5.html"){
},
// 根据当前选择的报销项目获取管理端配置的提示内容。
getProjectTipByProject(projectCode) {
if (projectCode === "UNION_REIMBURSE_PROJECT_5") projectCode = "UNION_REIMBURSE_PROJECT_2"
if (!this.descOptions || !Array.isArray(this.descOptions)) {
return ""
}