From 5eee857ce9f081ff7804b86e0c59b9de057e6891 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:56:08 +0800 Subject: [PATCH 1/6] =?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 | 4 ---- .../models/yuthon_hr_employee.py | 20 ------------------- 2 files changed, 24 deletions(-) diff --git a/yuthon_hr_employee/models/inherit_res_groups.py b/yuthon_hr_employee/models/inherit_res_groups.py index 7c914a88e..589927d2d 100644 --- a/yuthon_hr_employee/models/inherit_res_groups.py +++ b/yuthon_hr_employee/models/inherit_res_groups.py @@ -46,7 +46,6 @@ class ResGroups(models.Model): if not department: return valid_user_ids - # 安全获取部门ID(自动兼容 int / record) dept_id = department.id if isinstance(department, models.Model) else int(department) # 当前部门员工 @@ -63,9 +62,7 @@ class ResGroups(models.Model): for department in self.department_ids: all_user_ids.update(get_department_employees(department)) - # 3. 添加选中角色对应的用户(已修复 origin) for user_role in self.user_role_ids: - # 安全获取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([ '|', @@ -74,7 +71,6 @@ class ResGroups(models.Model): ]) all_user_ids.update([emp.user_id.id for emp in user_employees if emp.user_id]) - # 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 diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 964a09861..9b09caaff 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -318,26 +318,6 @@ class YuthonHrEmployee(models.Model): btntxt="详细信息" ) - - @api.onchange('user_role_id', 'user_role_ids') - def _onchange_user_roles(self): - selected_role_ids = [] - if self.user_role_id: - selected_role_ids.append(self.user_role_id.id) - - if self.user_role_ids: - selected_role_ids += self.user_role_ids.ids - if not selected_role_ids: - self.role_group_ids = [(5,)] - return - role_groups = self.env['soong.user.role.group'].search([ - ('user_role_ids', 'in', selected_role_ids) - ]) - if role_groups: - self.role_group_ids = [(6, 0, role_groups.ids)] - else: - self.role_group_ids = [(5,)] - def update_trade_union(self): records = self.env['hr.employee'].search([('is_membership', '=', True)]) for record in records: From b98c5438abbefe839a93d5604011dabd2413ebce 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:58:04 +0800 Subject: [PATCH 2/6] =?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/yuthon_hr_employee.py | 70 ++++++++++++------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 9b09caaff..1a0e30006 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -318,6 +318,26 @@ class YuthonHrEmployee(models.Model): btntxt="详细信息" ) + + @api.onchange('user_role_id', 'user_role_ids') + def _onchange_user_roles(self): + selected_role_ids = [] + if self.user_role_id: + selected_role_ids.append(self.user_role_id.id) + + if self.user_role_ids: + selected_role_ids += self.user_role_ids.ids + if not selected_role_ids: + self.role_group_ids = [(5,)] + return + role_groups = self.env['soong.user.role.group'].search([ + ('user_role_ids', 'in', selected_role_ids) + ]) + if role_groups: + self.role_group_ids = [(6, 0, role_groups.ids)] + else: + self.role_group_ids = [(5,)] + def update_trade_union(self): records = self.env['hr.employee'].search([('is_membership', '=', True)]) for record in records: @@ -659,16 +679,16 @@ class YuthonHrEmployee(models.Model): pass return recs - def write(self, values): - for record in self: - try: - if "department_id" in values: - record.do_group_department_id(values.get("department_id")) - if "user_role_id" in values: - record.do_group_user_role_id(values.get("user_role_id")) - except Exception as e: - pass - return super().write(values) + # def write(self, values): + # for record in self: + # try: + # if "department_id" in values: + # record.do_group_department_id(values.get("department_id")) + # if "user_role_id" in values: + # record.do_group_user_role_id(values.get("user_role_id")) + # except Exception as e: + # pass + # return super().write(values) def do_group_department_id(self, department_id): user_ids = self.user_id.ids @@ -688,21 +708,21 @@ class YuthonHrEmployee(models.Model): "users": [(4, id) for id in user_ids] }) - def do_group_user_role_id(self, user_role_id): - # 移除原来的数据 - user_ids = self.user_id.ids - old_res_groups_objs = self.sudo().env["res.groups"].search([("user_role_ids", "in", self.user_role_id.ids)]) - if old_res_groups_objs: - for res_groups_obj in old_res_groups_objs: - res_groups_obj.sudo().write({"users": [(3, id) for id in user_ids]}) - # 增加新的元素 - role_obj = self.sudo().env["soong.user.role"].search([("id", "=", user_role_id)], limit=1) - res_groups_objs = self.sudo().env["res.groups"].search([("user_role_ids", "in", role_obj.ids)]) - if res_groups_objs: - for res_groups_obj in res_groups_objs: - res_groups_obj.sudo().write({ - "users": [(4, id) for id in user_ids] - }) + # def do_group_user_role_id(self, user_role_id): + # # 移除原来的数据 + # user_ids = self.user_id.ids + # old_res_groups_objs = self.sudo().env["res.groups"].search([("user_role_ids", "in", self.user_role_id.ids)]) + # if old_res_groups_objs: + # for res_groups_obj in old_res_groups_objs: + # res_groups_obj.sudo().write({"users": [(3, id) for id in user_ids]}) + # # 增加新的元素 + # role_obj = self.sudo().env["soong.user.role"].search([("id", "=", user_role_id)], limit=1) + # res_groups_objs = self.sudo().env["res.groups"].search([("user_role_ids", "in", role_obj.ids)]) + # if res_groups_objs: + # for res_groups_obj in res_groups_objs: + # res_groups_obj.sudo().write({ + # "users": [(4, id) for id in user_ids] + # }) @api.onchange('number') def onchange_number(self): From 345d0e81501238df3f72121c3463af7c6d6d7bdb 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 11:14:32 +0800 Subject: [PATCH 3/6] =?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 --- yuthon_issue/models/inherit_room_booking.py | 157 +++++++++----------- 1 file changed, 72 insertions(+), 85 deletions(-) diff --git a/yuthon_issue/models/inherit_room_booking.py b/yuthon_issue/models/inherit_room_booking.py index f327eee50..af3f12f70 100644 --- a/yuthon_issue/models/inherit_room_booking.py +++ b/yuthon_issue/models/inherit_room_booking.py @@ -273,103 +273,90 @@ class IssueMeetingLine(models.Model): @api.constrains('decision_results', 'meeting_booking_id', 'issue_library_id') def _check_decision_results(self): - if not self.meeting_booking_id.meeting_type_id: - return + # 核心修复:遍历每一条记录,单条处理 + for record in self: + if not record.meeting_booking_id.meeting_type_id: + continue - meeting_type_name = str(self.meeting_booking_id.meeting_type_id.name).strip() - suffix_list = ['(通过)', '(未通过)'] - self.meeting_booking_id._check_name() - if self.decision_results == 'agree': - is_agree = 'pass' - agree_name = '(通过)' - is_push = True - else: - is_agree = 'reject' - agree_name = '(未通过)' - is_push = False + meeting_type_name = str(record.meeting_booking_id.meeting_type_id.name).strip() + suffix_list = ['(通过)', '(未通过)'] + record.meeting_booking_id._check_name() - # 2. 党委会相关:先清理旧后缀,再拼接新后缀 - if '党' in meeting_type_name: - if self.issue_library_id.is_class: - self.issue_library_id.is_push_class = is_push - elif self.issue_library_id.is_boss: - self.issue_library_id.is_push_boss = is_push - - self.issue_library_id.is_party_passed = is_agree - original_party_char = self.issue_library_id.party_char or "" - # 清理原有后缀(避免重复拼接) - clean_party_char = original_party_char - for suffix in suffix_list: - clean_party_char = clean_party_char.removesuffix(suffix) - self.issue_library_id.party_char = clean_party_char + agree_name - if is_push: - self.issue_library_id.issue_state_party = 'on_meet' + # 统一处理通过/不通过标识 + if record.decision_results == 'agree': + is_agree = 'pass' + agree_name = '(通过)' + is_push = True else: - self.issue_library_id.issue_state_party = 'will' + is_agree = 'reject' + agree_name = '(未通过)' + is_push = False - # 3. 班子会相关:先清理旧后缀,再拼接新后缀 - if '班子' in meeting_type_name: - if self.issue_library_id.is_boss: - self.issue_library_id.is_push_boss = is_push - self.issue_library_id.is_class_passed = is_agree - original_class_char = self.issue_library_id.class_char or "" - # 清理原有后缀 - clean_class_char = original_class_char - for suffix in suffix_list: - clean_class_char = clean_class_char.removesuffix(suffix) - # 拼接新后缀 - self.issue_library_id.class_char = clean_class_char + agree_name - if is_push: - self.issue_library_id.issue_state_class = 'on_meet' - else: - self.issue_library_id.issue_state_class = 'will' + # 2. 党委会相关 + if '党' in meeting_type_name: + if record.issue_library_id.is_class: + record.issue_library_id.is_push_class = is_push + elif record.issue_library_id.is_boss: + record.issue_library_id.is_push_boss = is_push - # 4. 董事会相关:先清理旧后缀,再拼接新后缀 - if '董事' in meeting_type_name: - self.issue_library_id.is_push_boss = is_push - self.issue_library_id.is_boss_passed = is_agree - original_boss_char = self.issue_library_id.boss_char or "" - # 清理原有后缀 - clean_boss_char = original_boss_char - for suffix in suffix_list: - clean_boss_char = clean_boss_char.removesuffix(suffix) - # 拼接新后缀 - self.issue_library_id.boss_char = clean_boss_char + agree_name - if is_push: - self.issue_library_id.issue_state_boss = 'on_meet' - else: - self.issue_library_id.issue_state_boss = 'will' - - if '套' in meeting_type_name: - if (self.issue_library_id.is_party and - (self.issue_library_id.is_party_passed == 'reject' or not self.issue_library_id.is_party_passed)): - if self.issue_library_id.is_class: - self.issue_library_id.is_push_class = is_push - - self.issue_library_id.is_party_passed = is_agree - original_party_char = self.issue_library_id.party_char or "" + record.issue_library_id.is_party_passed = is_agree + original_party_char = record.issue_library_id.party_char or "" clean_party_char = original_party_char for suffix in suffix_list: clean_party_char = clean_party_char.removesuffix(suffix) - self.issue_library_id.party_char = clean_party_char + agree_name - if is_push: - self.issue_library_id.issue_state_party = 'on_meet' - else: - self.issue_library_id.issue_state_party = 'will' + record.issue_library_id.party_char = clean_party_char + agree_name + record.issue_library_id.issue_state_party = 'on_meet' if is_push else 'will' - elif (self.issue_library_id.is_class and - (self.issue_library_id.is_class_passed == 'reject' or not self.issue_library_id.is_class_passed)): - # 复用班子会的修改逻辑 - self.issue_library_id.is_class_passed = is_agree - original_class_char = self.issue_library_id.class_char or "" + # 3. 班子会相关 + if '班子' in meeting_type_name: + if record.issue_library_id.is_boss: + record.issue_library_id.is_push_boss = is_push + record.issue_library_id.is_class_passed = is_agree + original_class_char = record.issue_library_id.class_char or "" clean_class_char = original_class_char for suffix in suffix_list: clean_class_char = clean_class_char.removesuffix(suffix) - self.issue_library_id.class_char = clean_class_char + agree_name - if is_push: - self.issue_library_id.issue_state_class = 'on_meet' - else: - self.issue_library_id.issue_state_class = 'will' + record.issue_library_id.class_char = clean_class_char + agree_name + record.issue_library_id.issue_state_class = 'on_meet' if is_push else 'will' + + # 4. 董事会相关 + if '董事' in meeting_type_name: + record.issue_library_id.is_push_boss = is_push + record.issue_library_id.is_boss_passed = is_agree + original_boss_char = record.issue_library_id.boss_char or "" + clean_boss_char = original_boss_char + for suffix in suffix_list: + clean_boss_char = clean_boss_char.removesuffix(suffix) + record.issue_library_id.boss_char = clean_boss_char + agree_name + record.issue_library_id.issue_state_boss = 'on_meet' if is_push else 'will' + + # 套开相关 + if '套' in meeting_type_name: + if (record.issue_library_id.is_party and + ( + record.issue_library_id.is_party_passed == 'reject' or not record.issue_library_id.is_party_passed)): + if record.issue_library_id.is_class: + record.issue_library_id.is_push_class = is_push + + record.issue_library_id.is_party_passed = is_agree + original_party_char = record.issue_library_id.party_char or "" + clean_party_char = original_party_char + for suffix in suffix_list: + clean_party_char = clean_party_char.removesuffix(suffix) + record.issue_library_id.party_char = clean_party_char + agree_name + record.issue_library_id.issue_state_party = 'on_meet' if is_push else 'will' + + elif (record.issue_library_id.is_class and + ( + record.issue_library_id.is_class_passed == 'reject' or not record.issue_library_id.is_class_passed)): + # 班子会逻辑 + record.issue_library_id.is_class_passed = is_agree + original_class_char = record.issue_library_id.class_char or "" + clean_class_char = original_class_char + for suffix in suffix_list: + clean_class_char = clean_class_char.removesuffix(suffix) + record.issue_library_id.class_char = clean_class_char + agree_name + record.issue_library_id.issue_state_class = 'on_meet' if is_push else 'will' def unlink(self): delete_lines = self.filtered(lambda l: l.issue_library_id and l.meeting_booking_id) From 82707f70d2945553a97c36c750d2718d4f4dbf4e 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 11:15:33 +0800 Subject: [PATCH 4/6] =?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 --- yuthon_issue/models/inherit_room_booking.py | 1 - 1 file changed, 1 deletion(-) diff --git a/yuthon_issue/models/inherit_room_booking.py b/yuthon_issue/models/inherit_room_booking.py index af3f12f70..474461637 100644 --- a/yuthon_issue/models/inherit_room_booking.py +++ b/yuthon_issue/models/inherit_room_booking.py @@ -273,7 +273,6 @@ class IssueMeetingLine(models.Model): @api.constrains('decision_results', 'meeting_booking_id', 'issue_library_id') def _check_decision_results(self): - # 核心修复:遍历每一条记录,单条处理 for record in self: if not record.meeting_booking_id.meeting_type_id: continue From cae2ef81e8585a77e30823580be0ea21f43a30cb 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 11:24:14 +0800 Subject: [PATCH 5/6] =?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_record.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 1e9add9bd..dd3769b67 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -183,7 +183,7 @@ class SoongWorkflowRecord(models.Model): # 初始化所有记录为非待办(上下文流畅,保留原有初始化逻辑) self.is_to_do = False valid_records = self.filtered( - lambda r: (current_employee.id in r.employee_ids.ids or current_employee.id in r.employee2_ids.ids) + lambda r: (current_uid in r.users_ids.ids) and not r.reclaim_state ) if not valid_records: @@ -228,13 +228,8 @@ class SoongWorkflowRecord(models.Model): def _search_is_to_do(self, operator, value): current_uid = self.env.user.id - current_employee = self.env['hr.employee'].search([('user_id', '=', current_uid)], limit=1) - if not current_employee: - return [('id', '=', False)] base_domain = [ - '|', - ('employee_ids', 'in', [current_employee.id]), - ('employee2_ids', 'in', [current_employee.id]), + ('users_ids', 'in', current_uid), ('reclaim_state', '=', False) ] candidate_records = self.search(base_domain) From 9f5332c78877757f98223a8b400665bbe1a2ecb7 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 11:25:06 +0800 Subject: [PATCH 6/6] =?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_record.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index dd3769b67..7a69c8c0c 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -173,14 +173,6 @@ class SoongWorkflowRecord(models.Model): 'employee2_ids') def _compute_is_to_do(self): current_uid = self.env.user.id - # 关键修改:不再查users_ids,改为查当前用户对应的hr.employee记录 - current_employee = self.env['hr.employee'].search([('user_id', '=', current_uid)], limit=1) - if not current_employee: - # 若当前用户无对应员工记录,所有记录均为非待办 - for rec in self: - rec.is_to_do = False - return - # 初始化所有记录为非待办(上下文流畅,保留原有初始化逻辑) self.is_to_do = False valid_records = self.filtered( lambda r: (current_uid in r.users_ids.ids)