From fdd7ef4f4f6f712b01d1170cda2c8bd0445c85c8 Mon Sep 17 00:00:00 2001 From: ljm <1340053001@qq.com> Date: Wed, 27 Nov 2024 15:12:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soong_workflow/models/soong_workflow_log.py | 11 ++- soong_workflow/models/soong_workflow_mixin.py | 68 ++++++++++++++++++- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/soong_workflow/models/soong_workflow_log.py b/soong_workflow/models/soong_workflow_log.py index 36074a59b..561706ee6 100644 --- a/soong_workflow/models/soong_workflow_log.py +++ b/soong_workflow/models/soong_workflow_log.py @@ -19,9 +19,14 @@ class SoongWorkflowLog(models.Model): name = fields.Char(string="节点名称", compute="_compute_name") model = fields.Char(string="Related Document Model", index=True, required=True) res_id = fields.Integer(string="Related Document ID", index=True, required=True) - workflow_id = fields.Many2one(comodel_name="soong.workflow", related="node_btn_id.workflow_id") - node_id = fields.Many2one(comodel_name="soong.workflow.node", related="node_btn_id.node_id") - node_btn_id = fields.Many2one(comodel_name="soong.workflow.node.button", required=True, string="动作名称") + + w_res_id = fields.Many2oneReference(string='Workflow Ref.', index=True, model_field='w_res_model_id') + w_res_model_id = fields.Many2one('ir.model', string='Model', index=True, ondelete='cascade') + w_res_model = fields.Char('Workflow Ref Model', index=True, related='w_res_model_id.model', precompute=True, store=True, readonly=True) + + workflow_id = fields.Many2one(comodel_name="soong.workflow") + node_id = fields.Many2one(comodel_name="soong.workflow.node") + node_btn_id = fields.Many2one(comodel_name="soong.workflow.node.button", string="动作名称") done_by = fields.Many2one(comodel_name="res.users", string="审批人") lase_click_date = fields.Datetime(string="操作时间") diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 0390972c9..a90e3c94d 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -68,6 +68,39 @@ class SoongWorkflowMixin(models.AbstractModel): string="审批明细") approval_sign_ids = fields.Many2many('res.users', string="加签人员") + workflow_approver_ids = fields.One2many('soong.workflow.log', 'w_res_id', string="审批记录", compute='_compute_workflow_approver_ids') + + def _compute_workflow_approver_ids(self): + wkf_obj = self.env["soong.workflow"] + for rec in self: + log_ids = [] + # Variables + rec_model = rec._name + # Get Workflow + workflow_id = wkf_obj.search([("model_id", "=", rec_model), ('is_enable', '=', True)]) + node_ids = workflow_id.node_ids + for node_id in node_ids: + log_obj = self.env["soong.workflow.log"] + record_obj = log_obj.search( + [ + ("model", "=", self._name), + ("res_id", "=", self.id), + ("node_id", "=", node_id.id), + ] + ) + if not record_obj: + record_obj = log_obj.create( + { + "model": self._name, + "res_id": self.id, + "node_id": node_id.id, + "workflow_id": node_id.workflow_id.id, + "lase_click_date": fields.Datetime.now(), + } + ) + log_ids.append(record_obj.id) + rec.workflow_approver_ids = log_ids + @api.depends("state") def _compute_workflow_id(self): # Objects @@ -78,6 +111,7 @@ class SoongWorkflowMixin(models.AbstractModel): # Get Workflow rec.workflow_id = wkf_obj.search([("model_id", "=", rec_model), ('is_enable', '=', True)]) + node_id = fields.Many2one( comodel_name="soong.workflow.node", string="Workflow Node Ref.", @@ -116,7 +150,8 @@ class SoongWorkflowMixin(models.AbstractModel): [ ("model", "=", self._name), ("res_id", "=", self.id), - ("node_btn_id", "=", btn_rec.id), + ("node_id", "=", btn_rec.node_id.id), + # ("node_btn_id", "=", btn_rec.id), ] ) if not record_obj: @@ -124,12 +159,14 @@ class SoongWorkflowMixin(models.AbstractModel): { "model": self._name, "res_id": self.id, + "node_id": btn_rec.node_id.id, + "workflow_id": btn_rec.workflow_id.id, "node_btn_id": btn_rec.id, "done_by": self.env.uid, "lase_click_date": fields.Datetime.now(), } ) - record_obj.update({"done_by": self.env.uid, "lase_click_date": fields.Datetime.now()}) + record_obj.update({"workflow_id": btn_rec.workflow_id.id, "node_btn_id": btn_rec.id, "done_by": self.env.uid, "lase_click_date": fields.Datetime.now()}) return record_obj def btn_exec_action(self): @@ -322,6 +359,7 @@ class SoongWorkflowMixin(models.AbstractModel): # res = self._add_state_tree_view(view_type, res) res = self._add_soong_workflow_log(view_type, res, params) res = self._load_sign_view(view_type, res) + res = self._load_workflow_approver_view(view_type, res) return res # 收回 @@ -662,6 +700,32 @@ class SoongWorkflowMixin(models.AbstractModel): res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "") return res + def _load_workflow_approver_view(self, view_type, res): + arch = etree.fromstring(res["arch"]) + if view_type == "form": + sheet_el = arch.xpath("//sheet") + if sheet_el: + sheet_el = sheet_el[0] + else: + sheet_el = etree.Element("sheet") + arch.insert(0, sheet_el) + notebook_el = sheet_el.xpath(".//notebook") + if notebook_el: + notebook_el = notebook_el[0] + else: + notebook_el = etree.Element("notebook") + sheet_el.append(notebook_el) + page_el = etree.Element("page") + page_el.set("string", "审批流程") # 设置页面标签 + page_el.set("invisible", "1") # todo domain + field_m2m_el = etree.Element("field") + field_m2m_el.set("name", "workflow_approver_ids") + page_el.append(field_m2m_el) + notebook_el.append(page_el) + res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "") + return res + + def _update_fields_view(self, view_type, res): """ Updates fields attributes.