@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user