This commit is contained in:
李鹏宇
2026-06-05 14:10:06 +08:00
parent ab0d2359cd
commit 127f671af6
+22 -9
View File
@@ -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: