@@ -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))]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user