From 99722c8e90cbe8a2f5eac335b81d1cef1f81329e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Fri, 26 Jun 2026 18:14:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soong_workflow/models/soong_workflow.py | 18 ++------ .../models/soong_workflow_record.py | 46 +++++++++++++++++-- .../views/soong_workflow_record.xml | 24 +++++----- soong_workflow/views/soong_workflow_views.xml | 1 + 4 files changed, 57 insertions(+), 32 deletions(-) diff --git a/soong_workflow/models/soong_workflow.py b/soong_workflow/models/soong_workflow.py index 862866cff..8f890237d 100644 --- a/soong_workflow/models/soong_workflow.py +++ b/soong_workflow/models/soong_workflow.py @@ -49,16 +49,18 @@ class SoongWorkflow(models.Model): text = fields.Text(string="描述") end_date = fields.Date(string="失效日期", copy=False, default=fields.Date.from_string('2099-01-01')) is_enable = fields.Boolean(string="是否启用", compute="compute_is_enable", store=True) + is_department_query = fields.Boolean(string="支持部门查询", default=True) is_enable_return_button = fields.Boolean(string="是否启用收回", default=True) is_enable_transmitted_button = fields.Boolean(string="是否启用转交", default=True) is_ease = fields.Boolean(string="是否简化流程") approvals_group_id = fields.Many2one('soong.approval.group', string="审批分组") department_role_ids = fields.Many2many('hr.department', string="授权部门范围", store=True) - user_role_ids = fields.Many2many('soong.user.role', 'soong_workflow_user_role_rel', 'workflow_id', 'user_role_id', string="授权范围", store=True) + user_role_ids = fields.Many2many('soong.user.role', 'soong_workflow_user_role_rel', 'workflow_id', 'user_role_id', string="流程管理员", store=True) is_user_department_role = fields.Boolean(string="是否有权限查看", store=False, search="_search_is_user_department_role") archive_type = fields.Selection([('applicant', '当前申请人'), ('employee', '人员'), ('role', '角色')], string="归档类型", default="applicant") employee_ids = fields.Many2many('hr.employee', string="人员") excel_template = fields.Binary(string="Excel模板", attachment=True, help="上传自定义的Excel模板文件") + excel_template_name = fields.Char(string="模板文件名") role_ids = fields.Many2many('soong.user.role', 'soong_workflow_role_rel', 'workflow_id', 'user_role_id', string="角色") @@ -124,20 +126,6 @@ class SoongWorkflow(models.Model): def _search_is_user_department_role(self, operator, value): id_list = [] if self.env.user.has_group("soong_workflow.group_soong_workflow_user"): - # 查询主权限的 - for user_role_id in self.env.user.employee_id.user_role_id.ids: - child_list = [user_role_id] - self.search_user_role_child_ids(user_role_id, child_list) - for child_id in child_list: - id_list += self.sudo().with_context(active_test=False).search([("user_role_ids", "in", [child_id])]).ids - - # 查询辅助权限 - for user_role_id in self.env.user.employee_id.user_role_ids.ids: - child_list = [user_role_id] - self.search_user_role_child_ids(user_role_id, child_list) - for child_id in child_list: - id_list += self.sudo().with_context(active_test=False).search([("user_role_ids", "in", [child_id])]).ids - # 查询部门的权限 for department_id in self.env.user.employee_id.department_id.ids: child_list = [department_id] diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 8dfaf196c..7e29c7be2 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -484,9 +484,14 @@ class SoongWorkflowRecord(models.Model): return [('company_id', 'not in', company_ids)] @api.depends_context('uid', 'company') - @api.depends('department_id', 'employee_ids') + @api.depends('department_id', 'employee_ids', 'workflow_id') def _compute_part_of_department(self): user_employee = self._get_valid_employee_for_user() + # 当前用户的所有角色(主角色 + 辅助角色) + user_all_role_ids = set( + user_employee.user_role_id.ids + user_employee.user_role_ids.ids + ) + active_company_ids = self.env.companies active_department = user_employee.department_id department_ids = [] if active_department: @@ -498,9 +503,17 @@ class SoongWorkflowRecord(models.Model): ]) for record in self: record.member_of_department = False - if record.employee_ids and valid_employee_ids: - has_valid_employee = bool(record.employee_ids & valid_employee_ids) - record.member_of_department = has_valid_employee + # 1. 流程管理员:角色在 workflow_id.user_role_ids 中,按本公司判断 + if user_all_role_ids and record.workflow_id.user_role_ids: + if set(record.workflow_id.user_role_ids.ids) & user_all_role_ids: + record.member_of_department = record.company_id in active_company_ids + continue + # 2. 支持部门查询:普通用户按本部门判断 + if record.workflow_id.is_department_query: + if record.employee_ids and valid_employee_ids: + record.member_of_department = bool(record.employee_ids & valid_employee_ids) + continue + # 3. 不支持部门查询且非管理员:False @api.depends('create_uid', 'employee_ids') def _compute_is_unlink(self): @@ -566,13 +579,36 @@ class SoongWorkflowRecord(models.Model): def _search_part_of_department(self, operator, value): user_employee = self._get_valid_employee_for_user() + user_all_role_ids = user_employee.user_role_id.ids + user_employee.user_role_ids.ids + + # 本部门逻辑(仅支持部门查询的流程) active_department = user_employee.department_id department_ids = [] if active_department: department_ids = self.env['hr.department'].search([ ('id', 'child_of', active_department.id) ]).ids - domain = [('department_id', 'in', department_ids)] + # 支持部门查询 + 本部门 + dept_domain = [ + '&', + ('workflow_id.is_department_query', '=', True), + ('department_id', 'in', department_ids), + ] + + # 流程管理员逻辑:角色匹配且同公司(不限部门查询) + company_ids = self.env.companies.ids + admin_domain = [ + '&', + ('workflow_id.user_role_ids', 'in', user_all_role_ids), + ('company_id', 'in', company_ids), + ] + + # 管理员 OR 部门查询 + if user_all_role_ids: + domain = ['|'] + admin_domain + dept_domain + else: + domain = dept_domain + if (operator == '=' and not value) or (operator == '!=' and value): domain = ['!'] + domain return domain diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml index 9a4283683..4f6099746 100644 --- a/soong_workflow/views/soong_workflow_record.xml +++ b/soong_workflow/views/soong_workflow_record.xml @@ -459,22 +459,22 @@ ir.actions.act_window soong.workflow.record tree,kanban,search - [('reclaim_state', '=', False), ('approve_state','!=','start'),('approvals_group_id.name', 'not in', ['考勤', '人事']), '|', ('users_ids', 'in', [uid]), ('member_of_department', '=', True)] + [('reclaim_state', '=', False), ('approve_state','!=','start'), '|', ('users_ids', 'in', [uid]), ('member_of_department', '=', True)] {'search_default_my_department_shifts': True, 'default_order': 'display_end_time desc'} - - 人事相关流程 - ir.actions.act_window - soong.workflow.record - tree,kanban,search - [('is_company', '=', True), ('reclaim_state', '=', False), '|', ('approvals_group_id.name', '=', '人力资源'), - ('approvals_group_id.name', 'in', ['考勤','人事']), ('approve_state', '!=', 'start')] - - {'default_order': 'display_end_time desc'} - - + + + + + + + + + + + 流程查询 ir.actions.act_window diff --git a/soong_workflow/views/soong_workflow_views.xml b/soong_workflow/views/soong_workflow_views.xml index add87fa70..334e48d46 100644 --- a/soong_workflow/views/soong_workflow_views.xml +++ b/soong_workflow/views/soong_workflow_views.xml @@ -42,6 +42,7 @@ +