From 823a603355d2e12001d6687f7403bbe7e0102a6e 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, 20 Mar 2026 20:28:20 +0800 Subject: [PATCH 1/3] =?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_notice/models/yuthon_notice.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/yuthon_notice/models/yuthon_notice.py b/yuthon_notice/models/yuthon_notice.py index 64b8cdc62..7ccbd4290 100644 --- a/yuthon_notice/models/yuthon_notice.py +++ b/yuthon_notice/models/yuthon_notice.py @@ -195,11 +195,13 @@ class YuthonNotice(models.Model): self.sequence = 0 def notice_publish(self): + self.ensure_one() if self.is_change_notice: self.notice_state = 'yes' - conf_old = self.env['yuthon.confirm.users'].search( - [('notice_id', '=', self.id), ('employee_id', 'in', self.users_ids.mapped('employee_ids.id'))] - ) + conf_old = self.env['yuthon.confirm.users'].search([ + ('notice_id', '=', self.id), + ('employee_id', 'in', self.users_ids.mapped('employee_ids.id')) + ]) if conf_old: conf_old.write({'state': 'no'}) user_wecom_mapping = [] @@ -210,20 +212,30 @@ class YuthonNotice(models.Model): url = f'https://phone.thtzjt.com/phone/Notice/{self.id}?employee_id={employee.id}' result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard( category='notice', - user_id=user_id.employee_id.wecom_userid, + touser=user_id.employee_id.wecom_userid, title="通知公告", - description=self.name + '发布人:' + self.users_id.name, + description=f"{self.name} 发布人: {self.users_id.name}", url=url, btntxt="详细信息" ) + msg_id = None if result_data and isinstance(result_data, tuple) and len(result_data) >= 2: res_dict = result_data[1] if res_dict.get('errcode') == 0 and res_dict.get('errmsg') == 'ok' and 'msgid' in res_dict: msg_id = res_dict['msgid'] + user_wecom_mapping.append({ + 'emp_id': employee.id, + 'msg_id': msg_id + }) + for mapping in user_wecom_mapping: emp_id = mapping['emp_id'] - is_exist = self.env['yuthon.confirm.users'].search([('notice_id', '=', self.id), ('employee_id', '=', emp_id)],limit=1) + msg_id = mapping['msg_id'] + is_exist = self.env['yuthon.confirm.users'].search([ + ('notice_id', '=', self.id), + ('employee_id', '=', emp_id) + ], limit=1) if not is_exist: self.env['yuthon.confirm.users'].create({ 'notice_id': self.id, @@ -234,8 +246,6 @@ class YuthonNotice(models.Model): 'state': 'no', 'msg_id': msg_id, }) - else: - raise UserError('该公告不允许通知,请勾选通知') def look_up_notice_users(self): return { From d8625d23ea16e63bca22491ea5e9f05fc5b1a143 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, 20 Mar 2026 20:41:54 +0800 Subject: [PATCH 2/3] =?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/soong_workflow_record.py | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index bce7f00a4..27d95184c 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -657,22 +657,44 @@ class SoongWorkflowRecord(models.Model): @api.model def get_view(self, view_id=None, view_type='form', **options): - current_user_id = self.env.user.id - current_employee = self.env['hr.employee'].search([('user_id', '=', current_user_id)], limit=1) - view = super().get_view(view_id, view_type, **options) - if not current_employee: - return view - if view_type == 'list': - all_records = self.search([ - '|', - ('employee_ids', 'in', [current_employee.id]), - ('employee2_ids', 'in', [current_employee.id]), - ('reclaim_state', '=', False) # 补回丢失的过滤条件 - ]) # 限制最大记录数,避免性能问题 - if all_records: - all_records._compute_is_done() - all_records._compute_is_to_do() - return view + all_records = self.search([ + ('users_ids', 'in', self.env.user.id), + ]) + for record in all_records: + # 校验关联记录是否存在 + if not record.res_model or not record.res_id: + continue + record_id = self.env[record.res_model].browse(record.res_id) + if not record_id or not hasattr(record_id, 'log_ids'): + continue + + current_user_logs = record_id.log_ids.filtered( + lambda l: l.done_by.id == self.env.user.id + ) + if not current_user_logs: + continue + approval_states = current_user_logs.mapped('approval_state') + if any(state in ['0', '1'] for state in approval_states): + record.write({'soong_state': 'to_do'}) + elif all(state == '2' for state in approval_states): + record.write({'soong_state': 'done'}) + for log in current_user_logs: + if log.name == '归档': + if log.approval_state == '0' or log.approval_state == '1': + record.write({'soong_state': 'to_active'}) + elif log.approval_state == '2': + record.write({'soong_state': 'active'}) + break + + for log2 in record_id.log_ids2: + if log2.done_by.name == self.env.user.name: + if log2.approval_state == '2': + record.write({'soong_state': 'done'}) + elif log2.approval_state in ['0', '1']: + record.write({'soong_state': 'to_do'}) + record._compute_is_done() + record._compute_is_to_do() + return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options) def to_do_process_reminders(self): workflow_records = self.env['soong.workflow.record'].search([ From 4132e5c8098087c9bf8f62983b71cf25c0671db7 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, 20 Mar 2026 20:43:05 +0800 Subject: [PATCH 3/3] =?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 | 1 + 1 file changed, 1 insertion(+) diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 27d95184c..174438abb 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -659,6 +659,7 @@ class SoongWorkflowRecord(models.Model): def get_view(self, view_id=None, view_type='form', **options): all_records = self.search([ ('users_ids', 'in', self.env.user.id), + ('reclaim_state', '=', False) ]) for record in all_records: # 校验关联记录是否存在