diff --git a/yuthon_report/models/receivable_flow_report.py b/yuthon_report/models/receivable_flow_report.py index edd881859..098959a02 100644 --- a/yuthon_report/models/receivable_flow_report.py +++ b/yuthon_report/models/receivable_flow_report.py @@ -69,37 +69,31 @@ class ReceivableFlowReport(models.Model): modify_map.setdefault(ml.receivable_id.id, []).append(ml) # 2. 批量查违约金wizard(sudo跳过多公司权限) + # 每个 receivable_id 只保留最新的一个 wizard(每次点按都会新建记录) all_wizards = self.env['penalty.line.wizard'].sudo().search([ ('receivable_id', 'in', rec_ids), - ]) - # 按 receivable_id 分组 - wizard_map = {} # {receivable_id: [wizards]} + ], order='id desc') + # 按 receivable_id 分组,只取最新一条 + wizard_map = {} # {receivable_id: wizard} for wz in all_wizards: - wizard_map.setdefault(wz.receivable_id.id, []).append(wz) - # 预取所有 pay_line_ids 和 penalty_line_ids - all_pay_lines = all_wizards.mapped('pay_line_ids') - all_wizards.mapped('penalty_line_ids') # 预加载违约金计算明细 - # 预先触发 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: - pay_line_map.setdefault(pl.penalty_id.id, []).append(pl) - - # 3. 直接批量查 penalty.pay.line,按 receivable_id 建索引(违约金收款持久化数据源) - all_penalty_pay_lines = self.env['penalty.pay.line'].sudo().search([ - ('penalty_id.receivable_id', 'in', rec_ids), - ]) + if wz.receivable_id.id not in wizard_map: + wizard_map[wz.receivable_id.id] = wz + latest_wizards = list(wizard_map.values()) + latest_wizard_ids = [wz.id for wz in latest_wizards] + # 批量查 penalty.pay.line,通过最新 wizard_ids 查询 + if latest_wizard_ids: + all_penalty_pay_lines = self.env['penalty.pay.line'].sudo().search([ + ('penalty_id', 'in', latest_wizard_ids), + ]) + else: + all_penalty_pay_lines = self.env['penalty.pay.line'] all_penalty_pay_lines.mapped('management_type_id') # 预加载类型 # 按 receivable_id 分组 {receivable_id: [penalty_pay_lines]} penalty_pay_map = {} for ppl in all_penalty_pay_lines: - rid = ppl.penalty_id.receivable_id.id - penalty_pay_map.setdefault(rid, []).append(ppl) + rid = ppl.penalty_id.receivable_id.id if ppl.penalty_id and ppl.penalty_id.receivable_id else None + if rid: + penalty_pay_map.setdefault(rid, []).append(ppl) # ===== 预加载结束 ===== rows = [] @@ -178,7 +172,7 @@ class ReceivableFlowReport(models.Model): if rec.submitted == 0: charge_status = "已收" - wz_list = wizard_map.get(rec.id, []) + wz_list = [wizard_map[rec.id]] if rec.id in wizard_map else [] # 违约金收款:直接从 penalty.pay.line 取(持久化数据源) rec_penalty_pay_lines = penalty_pay_map.get(rec.id, []) # 违约金收款金额:类型为“违约金”的金额之和