From 34f53d791dd6f1ae4343a6f6da82bd88db9e5f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Wed, 23 Sep 2026 11:15:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=A8=E6=9C=9F=E5=88=97=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yuthon_report/receivable_report.js | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/yuthon_report/static/src/components/yuthon_report/receivable_report.js b/yuthon_report/static/src/components/yuthon_report/receivable_report.js index e69cddfd8..b27f124da 100644 --- a/yuthon_report/static/src/components/yuthon_report/receivable_report.js +++ b/yuthon_report/static/src/components/yuthon_report/receivable_report.js @@ -113,8 +113,8 @@ class ReceivableReport extends Component { // 加载 ag-grid //await loadJS("https://cdn.jsdelivr.net/npm/ag-grid-community/dist/ag-grid-community.min.js"); - // 统一处理 columns:给所有列添加穿透渲染器 - const columns = this.config.columns || []; + // 统一处理 columns:先合并"应收开始/应收结束"为"应收周期",再给所有列添加穿透渲染器 + const columns = this._mergeDateRangeColumns(this.config.columns || []); columns.forEach((col) => { col.cellRenderer = this.linkRender.bind(this); // 对固定宽度列(如序号列)单独设置 minWidth,避免被 defaultColDef 覆盖 @@ -247,6 +247,48 @@ class ReceivableReport extends Component { }); } + /** + * 合并相邻的"应收开始/应收结束"两列为"应收周期"一列 + * 仅前端展示层合并,不动后端数据与搜索;违约金相关列(含"违约金")按用户要求保留原样 + */ + _mergeDateRangeColumns(columns) { + // 判断是否为"应收开始"列(兼容"应收开始日期",排除违约金) + const isStart = (f) => + !!f && (f === '应收开始' || f === '应收开始日期' || + f.endsWith('应收开始') || f.endsWith('应收开始日期')) && !f.includes('违约金'); + // 判断是否为"应收结束"列(兼容"应收结束日期",排除违约金) + const isEnd = (f) => + !!f && (f === '应收结束' || f === '应收结束日期' || + f.endsWith('应收结束') || f.endsWith('应收结束日期')) && !f.includes('违约金'); + + const result = []; + for (let i = 0; i < columns.length; i++) { + const cur = columns[i]; + const next = columns[i + 1]; + // 当前是开始列且紧邻下一是结束列 → 合并为一列 + if (isStart(cur.field) && next && isEnd(next.field)) { + result.push({ + ...cur, // 继承开始列的全部属性(含穿透渲染器等) + headerName: '应收周期', // 表头改为"应收周期" + field: cur.field, // 仍以开始字段为锚点(数据里该字段仍存在) + // 合并取值:开始 ~ 结束;单头为空只显另一头,不加兜底 + valueGetter: (params) => { + const start = params.data ? params.data[cur.field] : ''; + const end = params.data ? params.data[next.field] : ''; + if (start && end) return `${start} ~ ${end}`; + return start || end || ''; + }, + // 列宽取两列之和,保持原布局占比 + flex: (cur.flex || 0) + (next.flex || 0) || 1, + }); + i++; // 跳过已合并的结束列 + } else { + result.push(cur); + } + } + return result; + } + /** * 穿透渲染器:将对象格式的字段渲染为可点击的链接 * 如果字段值是对象(包含 model、id、display_name),则渲染为可点击链接