From 05888b2dc70692c17d7c16c5781e7dc004217da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 7 Feb 2025 19:18:42 +0800 Subject: [PATCH] 1 --- .../controllers/home.py | 1 + soong_workflow/__manifest__.py | 1 + soong_workflow/models/__init__.py | 1 + soong_workflow/models/soong_workflow_log.py | 3 +- soong_workflow/models/soong_workflow_mixin.py | 108 +++++++----------- .../models/soong_workflow_record_copy.py | 40 +++++++ soong_workflow/security/ir.model.access.csv | 1 + .../templates/soong_workflow_templates.xml | 1 - soong_workflow/views/menuitem.xml | 2 +- .../views/soong_workflow_record.xml | 10 +- .../soong_workflow_record_copy_views.xml | 37 ++++++ .../wizard/soong_workflow_comment_wizard.py | 55 ++++++--- .../soong_workflow_comment_wizard_view.xml | 2 +- 13 files changed, 170 insertions(+), 92 deletions(-) create mode 100644 soong_workflow/models/soong_workflow_record_copy.py create mode 100644 soong_workflow/views/soong_workflow_record_copy_views.xml diff --git a/sh_backmate_theme_adv_enterprise/controllers/home.py b/sh_backmate_theme_adv_enterprise/controllers/home.py index 1b8dc7679..efd495e14 100644 --- a/sh_backmate_theme_adv_enterprise/controllers/home.py +++ b/sh_backmate_theme_adv_enterprise/controllers/home.py @@ -18,6 +18,7 @@ MENU_BADGE_MODEL_FUNC_ENUM = { 'base.menu_action_res_users': {'model': 'file.preview.test', 'func': 'get_menu_badge_count'}, 'yuthon_notice.yuthon_notice_my_menu': {'model': 'yuthon.notice', 'func': 'get_no_read_count'}, 'soong_workflow.menu_workflow_approval_request_my': {'model': 'soong.workflow.record', 'func': 'get_no_read_count'}, + 'soong_workflow.menu_workflow_approval_request_copy': {'model': 'soong.workflow.record.copy', 'func': 'get_no_read_count'}, 'yuthon_will_task.menu_yuthon_will_task_root': {'model': 'yuthon.will.task', 'func': 'read_number'}, 'yuthon_property_approval.property_lease_contract_coming_menu': {'model': 'property.lease.contract', 'func': 'read_coming_count'}, 'yuthon_property_approval.property_lease_contract_coming_due_menu': {'model': 'property.lease.contract', 'func': 'read_due_count'}, diff --git a/soong_workflow/__manifest__.py b/soong_workflow/__manifest__.py index 3c3e832ce..dfd406128 100644 --- a/soong_workflow/__manifest__.py +++ b/soong_workflow/__manifest__.py @@ -29,6 +29,7 @@ "views/soong_workflow_entrust_views.xml", "views/soong_workflow_inspector_views.xml", "views/soong_workflow_log_views.xml", + "views/soong_workflow_record_copy_views.xml", "wizard/soong_workflow_comment_wizard_view.xml", "wizard/soong_workflow_apostille_wizard_view.xml", "wizard/soong_workflow_apostille_ok_wizard_view.xml", diff --git a/soong_workflow/models/__init__.py b/soong_workflow/models/__init__.py index 785ed5b37..f27b21a33 100644 --- a/soong_workflow/models/__init__.py +++ b/soong_workflow/models/__init__.py @@ -5,6 +5,7 @@ from . import soong_workflow_node from . import soong_workflow_link from . import ir_model from . import soong_workflow_record +from . import soong_workflow_record_copy from . import soong_workflow_mixin from . import soong_approval_users from . import soong_hr_employee diff --git a/soong_workflow/models/soong_workflow_log.py b/soong_workflow/models/soong_workflow_log.py index 7d4af76d5..aa84d666e 100644 --- a/soong_workflow/models/soong_workflow_log.py +++ b/soong_workflow/models/soong_workflow_log.py @@ -23,7 +23,7 @@ class SoongWorkflowLog(models.Model): node_btn_name = fields.Selection([('0', ' '), ('1', '退回'), ('2', '加签')], string='节点功能', default='0') done_by = fields.Many2one(comodel_name="res.users", string="审批人") lase_click_date = fields.Datetime(string="操作时间") - approval_state = fields.Selection([('0', '待办'), ('1', '办理中'), ('2', '已办结')], string='审批状态', default='0') + approval_state = fields.Selection([('0', '待办'), ('1', '办理中'), ('2', '已办结'), ('3', '结束')], string='审批状态', default='0') comment = fields.Char(string="意见") date_create = fields.Datetime(string="时间", default=lambda self: fields.Datetime.now()) @@ -46,6 +46,7 @@ class SoongWorkflowLog(models.Model): logs_obj = self.sudo().search([("res_id", "=", record.res_id), ("model", "=", record.model), ("workflow_id", "=", record.workflow_id.id), ("date_create", "<", record.date_create)]) record.sequence = len(logs_obj) + 1 + class SoongWorkflowLog2(models.Model): _name = "soong.workflow.log2" _description = "Soong Workflow Log2" diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index e4b40c310..4fb1b125b 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -206,7 +206,7 @@ class SoongWorkflowMixin(models.AbstractModel): # } # ) - if btn_rec.name not in ['转交', '加签', '加签确认', '退回']: + if btn_rec.name not in ['转交', '加签', '加签确认', '退回', '收回']: record_obj = log_obj.search( [ ("model", "=", self._name), @@ -231,7 +231,6 @@ class SoongWorkflowMixin(models.AbstractModel): } ) record_obj.write({"node_btn_id": btn_rec.id, "done_by": self.env.uid, "approval_state": "2"}) - record_obj = log_obj.search( [ ("model", "=", self._name), @@ -416,7 +415,7 @@ class SoongWorkflowMixin(models.AbstractModel): "default_is_automatic": next_state.is_automatic, "default_employee_ids": employee_ids, "default_node_btn_id": btn_rec.id, - "default_trans_link_id": trans_link_id.id, + "default_trans_link_id": trans_link_id.id if btn_rec.name == '转交' else False, "default_node_link_len": '转交2' if len(btn_rec.node_id.out_link_ids) > 1 and btn_rec.name == '转交' else '', }, } @@ -425,14 +424,13 @@ class SoongWorkflowMixin(models.AbstractModel): def _update_wkf_records(self): for rec in self: record_obj = self.env["soong.workflow.record"].search([("res_model", "=", rec._name), ("res_id", "=", rec.id)]) + record_id = self.env[rec._name].search([('id', '=', rec.id)]) current_user_id = self.env.user.id button_ids = self.workflow_id.node_ids.search([('node_name', '=', self.state), ('workflow_id', '=', self.workflow_id.id)]).button_ids - # state_list = [i.node_name for i in self.workflow_id.node_ids] - # self_state = state_list.index(self.state) - # next_state = self.workflow_id.node_ids[self_state + 1].button_ids[0] if self.state in ['申请人', 'start', '拟办']: if not record_obj: self.env["soong.workflow.record"].create({ + "code": record_id.code, "res_model": rec._name, "res_id": rec.id, "workflow_id": rec.workflow_id.id, @@ -442,43 +440,41 @@ class SoongWorkflowMixin(models.AbstractModel): "self_users": self.env.user.name, }) elif self.state not in ['end']: - if button_ids: - self_state = button_ids[0] - else: - raise UserError('请配置节点按钮') - employee_user_role_ids = self.env['hr.employee'].search(['|', ('user_role_id', '=', self_state.users_role_id.id), - ('user_role_ids', 'in', self_state.users_role_id.id)]) - employee_user_role_id = self.env['hr.employee'].search(['|', ('user_role_id', '=', self_state.users_role_id.id), - ('user_role_ids', 'in', self_state.users_role_id.id), '|', - ('department_id', '=', self.department_id.id), - ('department_ids', 'in', self.department_id.id)]) - employee_ids = employee_user_role_ids if not self_state.is_automatic else employee_user_role_id - user_ids_list = [] - for employee in employee_ids: - if employee.user_id: - user_ids_list.append((4, employee.user_id.id)) - if not record_obj: - record_obj = self.env["soong.workflow.record"].create({ - "res_model": rec._name, - "res_id": rec.id, - "workflow_id": rec.workflow_id.id, - "node_id": rec.node_id.id, - "done_by": self.env.uid, - "users_ids": [(4, current_user_id)], - "self_users": self.env.user.name, - }) - record_obj.update({"workflow_id": rec.workflow_id.id, - "node_id": rec.node_id.id, - "done_by": self.env.uid, - "users_ids": user_ids_list, - "self_users": ','.join([employee.name for employee in employee_ids]), - }) + if button_ids: + self_state = button_ids[0] + else: + raise UserError('请配置节点按钮') + employee_user_role_ids = self.env['hr.employee'].search(['|', ('user_role_id', '=', self_state.users_role_id.id), + ('user_role_ids', 'in', self_state.users_role_id.id)]) + employee_user_role_id = self.env['hr.employee'].search(['|', ('user_role_id', '=', self_state.users_role_id.id), + ('user_role_ids', 'in', self_state.users_role_id.id), '|', + ('department_id', '=', self.department_id.id), + ('department_ids', 'in', self.department_id.id)]) + employee_ids = employee_user_role_ids if not self_state.is_automatic else employee_user_role_id + user_ids_list = [] + for employee in employee_ids: + if employee.user_id: + user_ids_list.append((4, employee.user_id.id)) + if not record_obj: + record_obj = self.env["soong.workflow.record"].create({ + "res_model": rec._name, + "res_id": rec.id, + "workflow_id": rec.workflow_id.id, + "node_id": rec.node_id.id, + "done_by": self.env.uid, + "users_ids": [(4, current_user_id)], + "self_users": self.env.user.name, + }) + record_obj.update({"workflow_id": rec.workflow_id.id, + "node_id": rec.node_id.id, + "done_by": self.env.uid, + "users_ids": user_ids_list, + "self_users": ','.join([employee.name for employee in employee_ids]), + }) def unlink(self): self.mapped("log_ids").unlink() - record_objs = self.env["soong.workflow.record"].search( - [("res_model", "=", self._name), ("res_id", "in", self.ids)] - ) + record_objs = self.env["soong.workflow.record"].search([("res_model", "=", self._name), ("res_id", "in", self.ids)]) record_objs.unlink() return super().unlink() @@ -526,35 +522,13 @@ class SoongWorkflowMixin(models.AbstractModel): return res # 收回 + # 状态变化的时候会出现一条记录是谁操作的? def action_withdraw(self): for record in self: - if self.state == 'start': - raise UserError('当前节点不允许收回') - employee_id = self.env['hr.employee'] - state_list = [] - for state in record.workflow_id.node_ids: - if state.name in ['拟办', '申请人']: - state_list.append('start') - elif state.name == '结束': - state_list.append('end') - else: - state_list.append(state.name) - self_node_id = record.workflow_id.node_ids.search( - [('name', '=', self.state), ('workflow_id', '=', record.workflow_id.id)]) - transmitted = self_node_id.button_ids.search([('name', '=', '转交'), ('node_id', '=', self_node_id.id)])[0] - if transmitted.btn_hide: - if transmitted.review_type == 'user_role': - user_ids_list = employee_id.search(['|', ('user_role_id', '=', transmitted.users_role_id.id), - ('user_role_ids', 'in', [transmitted.users_role_id.id])]).ids - if self.env.user.employee_id.id in user_ids_list: - raise UserError('当前节点不允许收回') - else: - state_index = state_list.index(self.state) - self.write({'state': state_list[state_index - 1]}) - else: - raise UserError('请配置节点角色') - else: - raise UserError('当前节点不允许收回') + log_ids = record.log_ids.sorted('sequence') + log_ids[-1].unlink() + log_ids[-2].write({'approval_state': '1'}) + record.write({'state': log_ids[-2].name}) def _remove_default_header(self, view_type, res): """ diff --git a/soong_workflow/models/soong_workflow_record_copy.py b/soong_workflow/models/soong_workflow_record_copy.py new file mode 100644 index 000000000..d41c658f0 --- /dev/null +++ b/soong_workflow/models/soong_workflow_record_copy.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError, UserError + + +class SoongWorkflowRecordCopy(models.Model): + _name = "soong.workflow.record.copy" + _description = "工作流记录传阅/抄送" + _order = 'lase_click_date' + + def get_no_read_count(self): + return self.search_count([('approval_state_copy', '=', '0'), ('done_by', '=', self.env.user.id)]) + + code = fields.Char(string="流水号") + name = fields.Char(string="流程名称", store=True) + workflow_id = fields.Many2one(comodel_name="soong.workflow", string="审批类型", ondelete="restrict") + res_model = fields.Char(string="Res Model", required=True) + res_id = fields.Integer(string="Res ID", required=True) + done_by = fields.Many2one(comodel_name="res.users", string="抄送/传阅人") + approval_state_copy = fields.Selection([('0', '未读'), ('1', '已读')], string='状态', default='0') + lase_click_date = fields.Datetime(string="操作时间") + + def open_record(self): + return { + "type": "ir.actions.act_window", + "res_model": self.res_model, + "res_id": self.res_id, + "name": self.name, + "view_mode": "form", + } + + def read(self, fields=None, load='_classic_read'): + for i in self.search([('approval_state_copy', '=', '0'), ('done_by', '=', self.env.user.id)]): + record_id = self.env[i.res_model].search([('id', '=', i.res_id)]) + j = record_id.log_ids2.search([('done_by', '=', self.env.user.id), ('res_id', '=', record_id.id)]) + i.write({'approval_state_copy': '1'}) + j.write({'approval_state': '1'}) + # j.write({'approval_state': '1', 'lase_click_date': fields.Datetime.now()}) + return super(SoongWorkflowRecordCopy, self).read(fields=fields, load=load) \ No newline at end of file diff --git a/soong_workflow/security/ir.model.access.csv b/soong_workflow/security/ir.model.access.csv index 861deaefa..74cfed400 100644 --- a/soong_workflow/security/ir.model.access.csv +++ b/soong_workflow/security/ir.model.access.csv @@ -15,6 +15,7 @@ access_soong_workflow_node_button_manager,soong_workflow_node_button_manager,mod access_soong_workflow_link_manager,soong_workflow_link_manager,model_soong_workflow_link,soong_workflow.group_soong_workflow_manager,1,1,1,1 ,,,,,,, access_soong_workflow_record_user,soong_workflow_record_user,model_soong_workflow_record,soong_workflow.group_soong_workflow_user,1,1,1,1 +access_soong_workflow_record_copy,soong_workflow_record_copy,model_soong_workflow_record_copy,soong_workflow.group_soong_workflow_user,1,1,1,1 access_soong_user_role,soong_user_role,model_soong_user_role,group_soong_workflow_user,1,1,1,1 access_soong_approval_users,soong_approval_users,model_soong_approval_users,soong_workflow.group_soong_workflow_user,1,1,1,1 access_soong_note,soong_note,model_soong_note,soong_workflow.group_soong_workflow_user,1,1,1,1 diff --git a/soong_workflow/templates/soong_workflow_templates.xml b/soong_workflow/templates/soong_workflow_templates.xml index e5fe7fad8..1c4c207c3 100644 --- a/soong_workflow/templates/soong_workflow_templates.xml +++ b/soong_workflow/templates/soong_workflow_templates.xml @@ -21,7 +21,6 @@ - diff --git a/soong_workflow/views/menuitem.xml b/soong_workflow/views/menuitem.xml index 27b85493e..90110981f 100644 --- a/soong_workflow/views/menuitem.xml +++ b/soong_workflow/views/menuitem.xml @@ -14,7 +14,7 @@ - + -