From 127f671af6c5b165f16b752169cbf83ebf849f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 5 Jun 2026 14:10:06 +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_ai_agent/models/ai_report_template.py | 31 ++++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/yuthon_ai_agent/models/ai_report_template.py b/yuthon_ai_agent/models/ai_report_template.py index c6fd49a62..f8dd5a33a 100644 --- a/yuthon_ai_agent/models/ai_report_template.py +++ b/yuthon_ai_agent/models/ai_report_template.py @@ -233,7 +233,7 @@ class AiReportTemplate(models.Model): {f.name: f.field_description for f in self.field_ids}, ensure_ascii=False ) - # 同步 column_ids:去重 + 删不在的 + 补缺失的 + # 同步 column_ids:去重 + 删不在的 + 补缺失的 + 修复空字段 if self.column_ids or self.field_ids: new_field_ids = set(self.field_ids.ids) cmds = [] @@ -247,11 +247,17 @@ class AiReportTemplate(models.Model): kept[fid] = col else: cmds.append((2, col.id)) # 重复的删掉 - # 2) 删掉不在 field_ids 里的 + # 2) 修复 kept 列中 field_name 为空的列 + for fid, col in kept.items(): + if not col.field_name: + f = self.field_ids.filtered(lambda r: r.id == fid) + fname = f.name if f else col.field_id.name + cmds.append((1, col.id, {'field_name': fname})) + # 3) 删掉不在 field_ids 里的 for fid, col in kept.items(): if fid not in new_field_ids: cmds.append((2, col.id)) - # 3) 补充 field_ids 里有但 column_ids 里没有的 + # 4) 补充 field_ids 里有但 column_ids 里没有的 seq = max((col.sequence for col in self.column_ids), default=0) + 10 for f in self.field_ids: if f.id not in kept: @@ -287,13 +293,14 @@ class AiReportTemplate(models.Model): if vals.get('field_ids'): self._sync_field_list_from_ids(vals) result = super().write(vals) - if vals.get('field_ids'): - for record in self: + # 任何 write 都触发 column 去重 + 同步(清理历史重复数据 + 确保一致性) + for record in self: + if record.field_ids: record._sync_column_ids_from_field_ids() return result def _sync_column_ids_from_field_ids(self): - """根据 field_ids 同步 column_ids:去重 + 删不在的 + 补缺失的""" + """根据 field_ids 同步 column_ids:去重 + 删不在的 + 补缺失的 + 修复空字段""" self.ensure_one() new_field_ids = set(self.field_ids.ids) cmds = [] @@ -302,16 +309,22 @@ class AiReportTemplate(models.Model): for col in self.column_ids: fid = col.field_id.id if col.field_id else None if not fid: - cmds.append((2, col.id)) + cmds.append((2, col.id)) # 没有 field_id 的脏数据直接删 elif fid not in kept: kept[fid] = col else: cmds.append((2, col.id)) # 重复的删掉 - # 2) 删掉不在 field_ids 里的 + # 2) 修复 kept 列中 field_name 为空的列(required=True 约束) + for fid, col in kept.items(): + if not col.field_name: + f = self.field_ids.filtered(lambda r: r.id == fid) + fname = f.name if f else col.field_id.name + cmds.append((1, col.id, {'field_name': fname})) + # 3) 删掉不在 field_ids 里的 for fid, col in kept.items(): if fid not in new_field_ids: cmds.append((2, col.id)) - # 3) 补充 field_ids 里有但 column_ids 里没有的 + # 4) 补充 field_ids 里有但 column_ids 里没有的 seq = max((col.sequence for col in self.column_ids), default=0) + 10 for f in self.field_ids: if f.id not in kept: