From f42e08cd2ddeaf4c15adbdbeef695814beffb427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Tue, 24 Feb 2026 11:24:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93=E6=9C=9F=E5=BA=94=E6=94=B6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=A9=BF=E9=80=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/current_receivable_rent_report.py | 18 ++++++-- .../yuthon_report/receivable_report.js | 45 ++++++++++++++++++- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/yuthon_report/models/current_receivable_rent_report.py b/yuthon_report/models/current_receivable_rent_report.py index e33e1998c..9dad81e8f 100644 --- a/yuthon_report/models/current_receivable_rent_report.py +++ b/yuthon_report/models/current_receivable_rent_report.py @@ -77,7 +77,11 @@ class CurrentReceivableRentReport(models.Model): "序号": idx, "应收开始": rec.due_date.strftime("%Y-%m-%d") if rec.due_date else "", "应收结束": rec.due_date_end.strftime("%Y-%m-%d") if rec.due_date_end else "", - "承租方名称": rec.lessee_id.name if rec.lessee_id else "", + "承租方名称": { + 'model': 'property.tenant.information', + 'id': rec.lessee_id.id, + 'display_name': rec.lessee_id.name, + } if rec.lessee_id else "", "原始金额": round(amt, 2), "减免金额": round(discount, 2) if discount else "", "实际金额(含税)": round(actual_amt, 2), @@ -85,8 +89,16 @@ class CurrentReceivableRentReport(models.Model): "实际金额(不含税)": round(actual_amt_nt, 2), "物业名称": rec.property_name or "", "产权证": rec.title_deed or "", - "合同编号": rec.contract_id.contract_code if rec.contract_id else "", - "管理员": rec.admin_id.name if rec.admin_id else "", + "合同编号": { + 'model': 'property.lease.contract', + 'id': rec.contract_id.id, + 'display_name': rec.contract_id.contract_code, + } if rec.contract_id else "", + "管理员": { + 'model': 'res.users', + 'id': rec.admin_id.id, + 'display_name': rec.admin_id.name, + } if rec.admin_id else "", "acc_type": rec.acc_type if rec.acc_type else False, }) 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 77d6a3447..f2e3fc088 100644 --- a/yuthon_report/static/src/components/yuthon_report/receivable_report.js +++ b/yuthon_report/static/src/components/yuthon_report/receivable_report.js @@ -20,6 +20,7 @@ class ReceivableReport extends Component { console.log(this.props.action.context.report_config) this.serviceOrm = useService("orm") + this.actionService = useService("action"); // 获取 actionService 用于跳转 // 计算 本月的开始,结束 @@ -47,10 +48,16 @@ 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.forEach((col) => { + col.cellRenderer = this.linkRender.bind(this); + }); + this.gridOptions = { localeText: AG_GRID_LOCALE_CN, theme: agGrid.themeMaterial, - columnDefs: this.config.columns || [], + columnDefs: columns, rowData: [], rowClassRules: { 'ag-row-new-rent': function(params) { @@ -102,6 +109,9 @@ class ReceivableReport extends Component { const items = params.defaultItems.slice(); items.push("chartRange"); return items; + }, + context: { + actionService: this.actionService // 传递 actionService 用于穿透跳转 } }; @@ -110,6 +120,39 @@ class ReceivableReport extends Component { }); } + /** + * 穿透渲染器:将对象格式的字段渲染为可点击的链接 + * 如果字段值是对象(包含 model、id、display_name),则渲染为可点击链接 + * 否则直接显示原值 + */ + linkRender(params) { + if (!params.value) return ''; + + // 如果是对象格式(包含 model 和 id),渲染为可点击链接 + if (typeof params.value === 'object' && params.value.model && params.value.id) { + const { model, id, display_name } = params.value; + + const el = document.createElement('div'); + el.className = 'o_record_cell'; + el.innerText = display_name || ''; + el.classList.add('btn'); + el.classList.add('btn-link'); + el.onclick = () => { + params.context.actionService.doAction({ + type: 'ir.actions.act_window', + res_model: model, + res_id: id, + views: [[false, 'form']] + }); + }; + + return el; + } + + // 否则直接返回原值(纯文本/数字) + return params.value; + } + /** * 改变布尔值 * @param e