From 6e1eff61655725374fed06c800c70b34994ce66c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Tue, 24 Mar 2026 16:22:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_report/models/receivable_flow_report.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/yuthon_report/models/receivable_flow_report.py b/yuthon_report/models/receivable_flow_report.py index f39ebae4e..83dd69030 100644 --- a/yuthon_report/models/receivable_flow_report.py +++ b/yuthon_report/models/receivable_flow_report.py @@ -82,6 +82,9 @@ class ReceivableFlowReport(models.Model): # 预先触发 compute 字段,避免循环内惰性计算 all_wizards.mapped('days_overdue') all_wizards.mapped('total_penalty') + all_wizards.mapped('collected_penalty') # 预加载已收违约金 + # 预加载 pay_line management_type_id + all_pay_lines.mapped('management_type_id') # 按 wizard_id 分组 pay_line_map = {} # {wizard_id: [pay_lines]} for pl in all_pay_lines: @@ -168,11 +171,14 @@ class ReceivableFlowReport(models.Model): penalty_pay_lines = [] for wz in wz_list: penalty_pay_lines.extend(pay_line_map.get(wz.id, [])) - total_penalty_collected = sum(line.amount for line in penalty_pay_lines) - latest_penalty_payment = sorted( - [l for l in penalty_pay_lines if l.date], - key=lambda l: l.date, reverse=True - ) + # 违约金收款金额:取 wizard 的 collected_penalty(已 compute) + total_penalty_collected = sum(wz.collected_penalty for wz in wz_list) + # 违约金收款时间:取 pay_line_ids 中类型为“违约金”的记录的最新 date + penalty_type_pay_lines = [ + l for l in penalty_pay_lines + if l.management_type_id and l.management_type_id.name == '违约金' and l.date + ] + latest_penalty_payment = sorted(penalty_type_pay_lines, key=lambda l: l.date, reverse=True) penalty_payment_date = latest_penalty_payment[0].date if latest_penalty_payment else None # 复用 _onchange_calculation_date 逻辑计算违约金时间区间、逆期天数、违约金