This commit is contained in:
李鹏宇
2026-03-24 16:51:15 +08:00
parent bfedff5d7e
commit 20619a40ab
+19 -25
View File
@@ -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, [])
# 违约金收款金额:类型为“违约金”的金额之和