diff --git a/soong_workflow/models/soong_user_role.py b/soong_workflow/models/soong_user_role.py index 1b38387ac..5fa79a7e1 100644 --- a/soong_workflow/models/soong_user_role.py +++ b/soong_workflow/models/soong_user_role.py @@ -106,6 +106,35 @@ class YuthonUserRole(models.Model): new_user_role_ids = employee.user_role_ids.ids + [self.id.origin] employee.write({'user_role_ids': [(6, 0, new_user_role_ids)],}) + def write(self, vals): + """覆盖 write,personnel_ids 变更时双向同步到员工的主/辅助角色字段""" + # 记录变更前的 personnel_ids + old_personnel_map = {rec.id: set(rec.personnel_ids.ids) for rec in self} + result = super().write(vals) + if 'personnel_ids' not in vals: + return result + for rec in self: + new_ids = set(rec.personnel_ids.ids) + old_ids = old_personnel_map.get(rec.id, set()) + added_ids = new_ids - old_ids # 新增的员工 + removed_ids = old_ids - new_ids # 移除的员工 + if rec.is_main: + # 主角色:新增员工 → 设为主角色;移除员工 → 清空主角色(若仍是该角色) + for emp in self.env['hr.employee'].browse(list(added_ids)): + emp.write({'user_role_id': rec.id}) + for emp in self.env['hr.employee'].browse(list(removed_ids)): + if emp.user_role_id.id == rec.id: + emp.write({'user_role_id': False}) + else: + # 辅助角色:新增员工 → 添加到辅助角色;移除员工 → 从辅助角色移除 + for emp in self.env['hr.employee'].browse(list(added_ids)): + if rec.id not in emp.user_role_ids.ids: + emp.write({'user_role_ids': [(4, rec.id)]}) + for emp in self.env['hr.employee'].browse(list(removed_ids)): + if rec.id in emp.user_role_ids.ids: + emp.write({'user_role_ids': [(3, rec.id)]}) + return result + class YuthonUserRoleGroup(models.Model): _name = 'soong.user.role.group' _order = 'number asc' diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index b3021fa57..4e8a6bd8d 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -375,6 +375,46 @@ class YuthonHrEmployee(models.Model): ]) groups_by_role_group.write({'users': [(4, employee.user_id.id)]}) + def write(self, vals): + """覆盖 write,user_role_id / user_role_ids 变更时反向同步到角色的 personnel_ids""" + role_fields = {'user_role_id', 'user_role_ids'} + if not role_fields.intersection(vals.keys()): + return super().write(vals) + # 记录变更前的角色状态 + old_role_id_map = {emp.id: emp.user_role_id.id for emp in self} # 主角色 id + old_role_ids_map = {emp.id: set(emp.user_role_ids.ids) for emp in self} # 辅助角色 ids + result = super().write(vals) + for emp in self: + # --- 主角色反向同步 --- + if 'user_role_id' in vals: + old_rid = old_role_id_map.get(emp.id) + new_rid = emp.user_role_id.id if emp.user_role_id else False + # 从旧主角色 personnel_ids 移除 + if old_rid and old_rid != new_rid: + old_role = self.env['soong.user.role'].browse(old_rid) + if emp.id in old_role.personnel_ids.ids: + old_role.write({'personnel_ids': [(3, emp.id)]}) + # 加入新主角色 personnel_ids + if new_rid and new_rid != old_rid: + new_role = self.env['soong.user.role'].browse(new_rid) + if emp.id not in new_role.personnel_ids.ids: + new_role.write({'personnel_ids': [(4, emp.id)]}) + # --- 辅助角色反向同步 --- + if 'user_role_ids' in vals: + old_rids = old_role_ids_map.get(emp.id, set()) + new_rids = set(emp.user_role_ids.ids) + added = new_rids - old_rids + removed = old_rids - new_rids + for rid in added: + role = self.env['soong.user.role'].browse(rid) + if emp.id not in role.personnel_ids.ids: + role.write({'personnel_ids': [(4, emp.id)]}) + for rid in removed: + role = self.env['soong.user.role'].browse(rid) + if emp.id in role.personnel_ids.ids: + role.write({'personnel_ids': [(3, emp.id)]}) + return result + def update_trade_union(self): records = self.env['hr.employee'].search([('is_membership', '=', True)]) for record in records: