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 lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -182,35 +183,37 @@ public class UnionReimburseExportServiceImpl implements UnionReimburseExportServ
* 历史单据也按申请时间参与排序,同一秒内用创建时间及主键确定顺序; * 历史单据也按申请时间参与排序,同一秒内用创建时间及主键确定顺序;
* 不按打印顺序编号,也不按当前用户或报销状态过滤申请。 * 不按打印顺序编号,也不按当前用户或报销状态过滤申请。
* *
* @param form 已通过导出权限校验的报销申请 * @param form 报销申请,使用其单据ID读取数据库中的申请日期
* @return 年月日加至少三位当日序号,例如 20261009001 * @return 年月日加至少三位当日序号,例如 20261009001
*/ */
@Override @Override
public String buildPrintSerialNo(UnionReimburse form) { public String buildPrintSerialNo(UnionReimburse form) {
if (form.getCreateTime() == null || StrUtil.isBlank(form.getId())) { if (form == null || StrUtil.isBlank(form.getId())) {
throw new BaseException("报销申请时间或单据ID为空,无法生成打印流水号"); throw new BaseException("报销单据ID为空,无法生成打印流水号");
} }
Date startTime = DateUtil.beginOfDay(form.getCreateTime()); // 日期范围和编号前缀均取数据库原值,避免Java日期转换及参数绑定影响当天范围。
// 先对当日全部申请排序,再读取目标申请,避免过滤ID后序号始终为1。 // 先对目标申请当天的全部单据排序,再筛选目标ID,保持审核、汇总和打印的编号一致。
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT numbered.seq SELECT DATE_FORMAT(numbered.createTime, '%Y%m%d') AS serialDate, numbered.seq
FROM ( FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY createTime, createdAt, id) AS seq SELECT info.id, info.createTime,
FROM union_reimburse ROW_NUMBER() OVER (ORDER BY info.createTime, info.createdAt, info.id) AS seq
WHERE createTime >= @startTime AND createTime < @endTime 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 ) numbered
WHERE numbered.id = @id WHERE numbered.id = @id
"""); """);
sql.setParam("startTime", startTime);
sql.setParam("endTime", DateUtil.offsetDay(startTime, 1));
sql.setParam("id", form.getId()); sql.setParam("id", form.getId());
sql.setCallback(Sqls.callback.integer()); sql.setCallback(Sqls.callback.map());
dao.execute(sql); dao.execute(sql);
int sequence = sql.getInt(); NutMap result = sql.getObject(NutMap.class);
if (sequence < 1) { if (result == null || !(result.get("seq") instanceof Number sequence)
throw new BaseException("未找到报销申请,无法生成打印流水号"); || 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) { getProjectTipByProject(projectCode) {
if (projectCode === "UNION_REIMBURSE_PROJECT_5") projectCode = "UNION_REIMBURSE_PROJECT_2"
if (!this.descOptions || !Array.isArray(this.descOptions)) { if (!this.descOptions || !Array.isArray(this.descOptions)) {
return ''; return '';
} }
@@ -2531,7 +2531,6 @@ layout("/layouts/platform_h5.html"){
}, },
// 根据当前选择的报销项目获取管理端配置的提示内容。 // 根据当前选择的报销项目获取管理端配置的提示内容。
getProjectTipByProject(projectCode) { getProjectTipByProject(projectCode) {
if (projectCode === "UNION_REIMBURSE_PROJECT_5") projectCode = "UNION_REIMBURSE_PROJECT_2"
if (!this.descOptions || !Array.isArray(this.descOptions)) { if (!this.descOptions || !Array.isArray(this.descOptions)) {
return "" return ""
} }