diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 9efe74e09..60e69dd56 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -798,6 +798,16 @@ class SoongWorkflowMixin(models.AbstractModel): 'link_type': 'trans', 'record_id': self.id, }) + # 节点无可选审批人(employee_ids 为空)也跳过,避免生成无人可审的空流转节点 + approvers = self._get_approvers_for_link(link, self) + # 纯"结束"节点(无转交/加签/分发/下发按钮)不需要审批人,正常保留,避免误跳结束节点卡死流程 + node_approval_btns = node.button_ids.filtered( + lambda b: b.name in ('转交', '加签', '分发', '下发')) + if not approvers and node_approval_btns: + _logger.info(f"跳过节点: {node.name},无可选审批人(employee_ids 为空)") + skipped_node_names.append(node.name) + link.with_context(confirm_delete=True).unlink() + continue actual_path_links.append(link) if actual_path_links: @@ -909,11 +919,11 @@ class SoongWorkflowMixin(models.AbstractModel): for rec in self: # 仅匹配未回收的有效记录(回收站里的 reclaim_state=True 旧记录不参与), # 避免"同一张单 + 并发/state 多次写入"时重复 create - record_obj = self.env["soong.workflow.record"].search( + record_obj = rec.env["soong.workflow.record"].search( [("res_model", "=", rec._name), ("res_id", "=", rec.id), ('reclaim_state', '=', False)], limit=1) - record_id = self.env[rec._name].search([('id', '=', rec.id)]) - current_user_id = self.env.user.id + record_id = rec.env[rec._name].search([('id', '=', rec.id)]) + current_user_id = rec.env.user.id if rec.state in ['申请人', '拟办', '草稿', 'draft']: if not record_obj: values = { @@ -923,13 +933,13 @@ class SoongWorkflowMixin(models.AbstractModel): "res_id": rec.id, "workflow_id": rec.workflow_id.id, "node_id": rec.node_id.id, - "done_by": self.env.uid, + "done_by": rec.env.uid, "users_ids": [(4, current_user_id)], - "employee_ids": self.env.user.employee_id, + "employee_ids": rec.env.user.employee_id, "write_date2": fields.Datetime.now(), } # 查找匹配的字段 - matched_fields = self.find_fields_by_string(record_id) + matched_fields = rec.find_fields_by_string(record_id) # 提取"事由"或"正文"字段的值 text_fields = [f for f in matched_fields if '事由' in f['field_string'] or '正文' in f['field_string']] @@ -947,7 +957,7 @@ class SoongWorkflowMixin(models.AbstractModel): if attachment_ids: values["documents_ids"] = [(6, 0, attachment_ids.ids)] # 创建工作流记录 - self.env["soong.workflow.record"].create(values) + rec.env["soong.workflow.record"].create(values) if record_obj: # 获取上一节点的结束时间(即log_ids最后一条记录的lase_click_date)