!10032 添加功能

Merge pull request !10032 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-03-20 12:58:28 +00:00
committed by Gitee
+61 -28
View File
@@ -657,44 +657,77 @@ class SoongWorkflowRecord(models.Model):
@api.model
def get_view(self, view_id=None, view_type='form', **options):
if view_type != 'list':
return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options)
current_user = self.env.user
all_records = self.search([
('users_ids', 'in', self.env.user.id),
('users_ids', 'in', current_user.id),
('reclaim_state', '=', False)
])
if not all_records:
return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options)
model_res_ids = {}
for record in all_records:
# 校验关联记录是否存在
if not record.res_model or not record.res_id:
continue
record_id = self.env[record.res_model].browse(record.res_id)
if record.res_model not in model_res_ids:
model_res_ids[record.res_model] = []
model_res_ids[record.res_model].append(record.res_id)
model_records = {}
for model, res_ids in model_res_ids.items():
model_records[model] = self.env[model].browse(res_ids).sudo().prefetch(['log_ids', 'log_ids2'])
record_state_map = {}
for record in all_records:
if not record.res_model or not record.res_id:
continue
record_id = model_records.get(record.res_model, self.env[model]).browse(record.res_id)
if not record_id or not hasattr(record_id, 'log_ids'):
continue
current_user_logs = record_id.log_ids.filtered(
lambda l: l.done_by.id == self.env.user.id
)
if not current_user_logs:
continue
approval_states = current_user_logs.mapped('approval_state')
if any(state in ['0', '1'] for state in approval_states):
record.write({'soong_state': 'to_do'})
elif all(state == '2' for state in approval_states):
record.write({'soong_state': 'done'})
for log in current_user_logs:
if log.name == '归档':
if log.approval_state == '0' or log.approval_state == '1':
record.write({'soong_state': 'to_active'})
elif log.approval_state == '2':
record.write({'soong_state': 'active'})
break
new_state = None
# 处理log_ids(批量过滤,无数据库查询)
current_user_logs = record_id.log_ids.filtered(lambda l: l.done_by.id == current_user.id)
if current_user_logs:
approval_states = current_user_logs.mapped('approval_state')
# 优先级:归档日志 > 普通日志
archive_log = current_user_logs.filtered(lambda l: l.name == '归档')
if archive_log:
if archive_log[0].approval_state in ['0', '1']:
new_state = 'to_active'
elif archive_log[0].approval_state == '2':
new_state = 'active'
else:
if any(state in ['0', '1'] for state in approval_states):
new_state = 'to_do'
elif all(state == '2' for state in approval_states):
new_state = 'done'
for log2 in record_id.log_ids2:
if log2.done_by.name == self.env.user.name:
if log2.approval_state == '2':
record.write({'soong_state': 'done'})
elif log2.approval_state in ['0', '1']:
record.write({'soong_state': 'to_do'})
record._compute_is_done()
record._compute_is_to_do()
# 处理log_ids2(批量过滤,用ID匹配而非name)
if not new_state and hasattr(record_id, 'log_ids2'):
user_logs2 = record_id.log_ids2.filtered(lambda l: l.done_by.id == current_user.id)
if user_logs2:
log2_states = user_logs2.mapped('approval_state')
if '2' in log2_states:
new_state = 'done'
elif any(s in ['0', '1'] for s in log2_states):
new_state = 'to_do'
if new_state:
record_state_map[record.id] = new_state
if record_state_map:
state_groups = {}
for rec_id, state in record_state_map.items():
if state not in state_groups:
state_groups[state] = []
state_groups[state].append(rec_id)
for state, rec_ids in state_groups.items():
self.browse(rec_ids).write({'soong_state': state})
if all_records:
all_records._compute_is_done()
all_records._compute_is_to_do()
return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options)
def to_do_process_reminders(self):