From cad2a034c0e5775376df075b55d48cfb7a9b7a40 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: Tue, 24 Mar 2026 10:34:28 +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 --- .../models/inherit_res_groups.py | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/yuthon_hr_employee/models/inherit_res_groups.py b/yuthon_hr_employee/models/inherit_res_groups.py index c8fc31159..7c914a88e 100644 --- a/yuthon_hr_employee/models/inherit_res_groups.py +++ b/yuthon_hr_employee/models/inherit_res_groups.py @@ -34,55 +34,57 @@ class ResGroups(models.Model): def _onchange_update_users(self): """动态更新 users 字段,基于员工、部门和角色的选择""" all_user_ids = set() + # 1. 添加选中员工对应的用户 for employee in self.employee_ids: if employee.user_id: all_user_ids.add(employee.user_id.id) # 2. 添加选中部门及其子部门的所有员工对应的用户 - def get_department_employees(department_id, is_initial_call=False): - """ - 递归获取指定部门及其所有子部门的员工对应的用户ID - is_initial_call: 是否为初始调用(控制是否使用id.origin) - """ + def get_department_employees(department): valid_user_ids = set() - # 处理不同类型的department_id输入 - if isinstance(department_id, int): - dept_id = department_id - elif hasattr(department_id, 'id'): - if is_initial_call and hasattr(department_id.id, 'origin'): - dept_id = department_id.id.origin - else: - dept_id = department_id.id - else: + if not department: return valid_user_ids - # 查询当前部门的员工 - employee_ids = self.env['hr.employee'].search([('department_id', '=', dept_id)]) - valid_user_ids.update([user.user_id.id for user in employee_ids if user.user_id]) - # 查询子部门并递归处理 - child_ids = self.env['hr.department'].search([('parent_id', '=', dept_id)]) - for child in child_ids: - valid_user_ids.update(get_department_employees(child, is_initial_call=False)) + + # 安全获取部门ID(自动兼容 int / record) + dept_id = department.id if isinstance(department, models.Model) else int(department) + + # 当前部门员工 + employees = self.env['hr.employee'].search([('department_id', '=', dept_id)]) + valid_user_ids.update([emp.user_id.id for emp in employees if emp.user_id]) + + # 递归子部门 + child_depts = self.env['hr.department'].search([('parent_id', '=', dept_id)]) + for child in child_depts: + valid_user_ids.update(get_department_employees(child)) + return valid_user_ids - for department_id in self.department_ids: - all_user_ids.update(get_department_employees(department_id, is_initial_call=True)) + for department in self.department_ids: + all_user_ids.update(get_department_employees(department)) - # 3. 添加选中角色对应的用户 + # 3. 添加选中角色对应的用户(已修复 origin) for user_role in self.user_role_ids: - user_employee_ids = self.env['hr.employee'].search( - ['|', ('user_role_id', '=', user_role.id.origin), ('user_role_ids', 'in', [user_role.id.origin])] - ) - all_user_ids.update([user.user_id.id for user in user_employee_ids if user.user_id]) - # 4. 添加角色组对应的用户 - for record in self: - group_role_ids = record.users_role_group_ids.user_role_ids - for user_role in group_role_ids: - user_employee_ids = self.env['hr.employee'].search( - ['|', ('user_role_id', '=', user_role.id.origin), ('user_role_ids', 'in', [user_role.id.origin])] - ) - all_user_ids.update([user.user_id.id for user in user_employee_ids if user.user_id]) + # 安全获取ID:有 origin 取 origin,没有就取 id + role_id = user_role.id.origin if hasattr(user_role.id, 'origin') else user_role.id + user_employees = self.env['hr.employee'].search([ + '|', + ('user_role_id', '=', role_id), + ('user_role_ids', 'in', [role_id]) + ]) + all_user_ids.update([emp.user_id.id for emp in user_employees if emp.user_id]) - # 更新 users 字段(使用 replace 操作) + # 4. 添加角色组对应的用户(已修复 origin) + group_role_ids = self.users_role_group_ids.user_role_ids + for user_role in group_role_ids: + role_id = user_role.id.origin if hasattr(user_role.id, 'origin') else user_role.id + + user_employees = self.env['hr.employee'].search([ + '|', + ('user_role_id', '=', role_id), + ('user_role_ids', 'in', [role_id]) + ]) + all_user_ids.update([emp.user_id.id for emp in user_employees if emp.user_id]) + + # 最终更新用户 self.users = [(6, 0, list(all_user_ids))] -