diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 73f422097..87f0a571b 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -97,7 +97,6 @@ class SoongWorkflowMixin(models.AbstractModel): def _compute_is_show_add_sign(self): for record in self: record.is_show_add_sign = True - domain_hide_01 = [ ('workflow_id', '=', record.workflow_id.id), ('res_id', '=', record.id), @@ -115,10 +114,13 @@ class SoongWorkflowMixin(models.AbstractModel): ] has_done = record.log_ids.search(domain_hide_done) - # 如果有日志,取【第一个节点】的经办人 == 当前登录人 → 隐藏 + # 如果有日志,取【第一个节点】的经办人 == 当前登录人 → 隐藏 (归档待办的除外) has_first_user = False - if record.log_ids: - first_log = record.log_ids.sorted('sequence')[:1] + valid_logs = record.log_ids.filtered( + lambda l: l.name != '归档' and l.approval_state in ['0', '1'] + ) + if valid_logs: + first_log = valid_logs.sorted('sequence')[:1] if first_log and first_log.done_by == self.env.user: has_first_user = True @@ -184,8 +186,9 @@ class SoongWorkflowMixin(models.AbstractModel): record.is_back = True same_node_logs = record.log_ids.filtered(lambda log: log.name == next_log.name) - if same_node_logs and any(log.approval_state in ['1', '2'] for log in same_node_logs): - record.is_back = False + if next_log.name != '加签': + if same_node_logs and any(log.approval_state in ['1', '2'] for log in same_node_logs): + record.is_back = False if record._name in ['yuthon.official.incoming.normal', 'yuthon.sub.enterprises']: current_user_in_logs2 = any(log.done_by.id == self.env.uid for log in record.log_ids2) @@ -1248,7 +1251,7 @@ class SoongWorkflowMixin(models.AbstractModel): id_el = etree.Element("field") id_el.set("name", "log_ids") id_el.set("invisible", "1") - invisible += " or not is_end" + invisible += " or not is_end or is_show_transfer" if button.name == "退回": btn_exec_action_el.set("class", "btn btn-return") id_el = etree.Element("field") diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index 67ccf8da7..294dca6ee 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -621,19 +621,7 @@ class SoongWorkflowCommentWizard(models.TransientModel): if self.node_btn_name == '加签': - if not is_admin: - current_node_log = self.sudo().env["soong.workflow.log"].search( - [ - ("model", "=", self.res_model), - ("res_id", "=", self.res_id), - ("done_by", "=", self.env.user.id), - ("node_id", "=", self.node_btn_id.node_id.id), - ], - order="create_date DESC", - limit=1 - ) - else: - current_node_log = record_id.log_ids[-1] + current_node_log = record_id.log_ids[-1] current_node_log.write({ "comment": self.comment, "approval_state": "2", # 已完成 @@ -709,10 +697,18 @@ class SoongWorkflowCommentWizard(models.TransientModel): last_sign_log = log_obj.search([ ("model", "=", self.res_model), ("res_id", "=", self.res_id), - ("node_id", "=", node_id), - ("name", "!=", "加签"), + ("name", "=", "归档"), ], order="create_date DESC", limit=1) + # 没找到归档,再取原来的最后一条(非加签) + if not last_sign_log: + last_sign_log = log_obj.search([ + ("model", "=", self.res_model), + ("res_id", "=", self.res_id), + ("node_id", "=", node_id), + ("name", "!=", "加签"), + ], order="create_date DESC", limit=1) + # 如果没有加签日志,直接跳过 if not last_sign_log: return @@ -732,15 +728,21 @@ class SoongWorkflowCommentWizard(models.TransientModel): all_other_done = all(log.approval_state == "2" for log in all_logs) # 4. 如果满足 → 创建一条新日志给【最新加签的经办人】 if all_other_done: - log_obj.create({ + # 判断是否需要设置为归档 + log_name = last_sign_log.name if last_sign_log.name == '归档' else False + log_vals = { "model": self.res_model, "res_id": self.res_id, "workflow_id": self.node_btn_id.workflow_id.id, "node_id": node_id, - "done_by": last_sign_user.id, # 最新加签的经办人 + "done_by": last_sign_user.id, "approval_state": "0", "create_date": fields.Datetime.now(), - }) + } + # 如果是归档,自动写入 name = 归档 + if log_name: + log_vals["name"] = log_name + log_obj.create(log_vals) workflow_record_id = self.env['soong.workflow.record'].sudo().search([('res_id', '=', record_id.id), ( 'res_model', '=', record_id._name) @@ -1047,9 +1049,19 @@ class SoongWorkflowCommentWizard(models.TransientModel): record = self.env[self.res_model].search([('id', '=', self.res_id)]) is_admin = current_user.has_group('base.group_system') or current_user.has_group('base.group_admin') log_ids = record.log_ids.sorted('sequence') - has_sign_log = log_ids.filtered(lambda log: log.name == '加签' and log.node_id.name == record.state) + last_normal_log = log_ids.filtered(lambda l: l.name != '加签').sorted('create_date')[-1:] + # 2. 如果有最后正常节点,只取【这个时间之后】的加签 + if last_normal_log: + last_create_date = last_normal_log.create_date + has_sign_log = log_ids.filtered(lambda log: + log.name == '加签' + and log.node_id.name == record.state + and log.create_date > last_create_date # 关键:只取最后正常节点之后的加签 + ) + else: + has_sign_log = log_ids.filtered(lambda log: log.name == '加签' and log.node_id.name == record.state) + # 3. 判断这些加签是否已处理 if has_sign_log: - # 加签日志 for log in has_sign_log: if log.approval_state != '0': raise UserError('加签流程已处理,不可收回!') @@ -1111,10 +1123,11 @@ class SoongWorkflowCommentWizard(models.TransientModel): prev_log.write({'approval_state': '1'}) # 回退状态 - record.write({ - 'state': prev_log.name, - 'work_end': False, - }) + if prev_log.name != '归档': + record.write({ + 'state': prev_log.name, + 'work_end': False, + }) if self.node_btn_name == '归档': menu_id = self.env['ir.ui.menu'].search([('name', '=', '行政收文')], limit=1)