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 @@
+