diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index a89a501e2..9a2ebea18 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -505,9 +505,73 @@ class SoongWorkflowCommentWizard(models.TransientModel): ]) for other_node_log in other_node_logs: other_node_log.unlink() + # 印章分组审批:章内串审,删除同章其他人的待办 + if getattr(current_node_log, 'stamp_id', False): + same_stamp_logs = self.sudo().env["soong.workflow.log"].search( + [("model", "=", self.res_model), + ("res_id", "=", self.res_id), + ("id", "!=", current_node_log.id), + ("node_id", "=", self.node_btn_id.node_id.id), + ("stamp_id", "=", current_node_log.stamp_id.id), + ("approval_state", "in", ['0', '1']), + ]) + same_stamp_logs.unlink() - # 检查是否为并审模式 - if self.approval_concatenation == 'bing': # 并审模式考勤异常 + # 印章分组审批:模型有 type_stamp_ids 字段且转交目标是「印章管理员」节点 + record_has_stamps = hasattr(record_id, 'type_stamp_ids') and bool(record_id.type_stamp_ids) + is_transfer_to_stamp = self.trans_link_id and self.trans_link_id.name == '印章管理员' + is_stamp_reviewer = bool(current_node_log and getattr(current_node_log, 'stamp_id', False)) + + if is_transfer_to_stamp and record_has_stamps: + # 场景1:转交到印章管理员节点,按章分组建待办(章间并审、章内串审) + next_node_id = record_id.workflow_id.node_ids.search([ + ('name', '=', self.trans_link_id.name), + ('workflow_id', '=', record_id.workflow_id.id) + ], limit=1) + all_user_ids = [] + all_employee_ids = [] + for stamp in record_id.type_stamp_ids: + for user in stamp.user_ids: + if user.id not in all_user_ids: + all_user_ids.append(user.id) + employee = self.env['hr.employee'].sudo().search([('user_id', '=', user.id)], limit=1) + if employee and employee.id not in all_employee_ids: + all_employee_ids.append(employee.id) + self.sudo().env["soong.workflow.log"].create({ + "code": self.code, + "model": self.res_model, + "res_id": self.res_id, + "node_id": next_node_id.id, + "workflow_id": self.node_btn_id.workflow_id.id, + "done_by": user.id, + "node_btn_name": "4", + "stamp_id": stamp.id, + "approval_state": "0", + }) + related_record = self.env[self.res_model].browse(self.res_id) + if hasattr(related_record, 'self_users_ids'): + related_record.self_users_ids = [(6, 0, all_user_ids)] if all_user_ids else [(5,)] + record_id.write({'state': self.trans_link_id.name}) + workflow_record_id = self.env['soong.workflow.record'].sudo().search([('res_id', '=', record_id.id), + ('res_model', '=', record_id._name)]) + workflow_record_id.users_ids = [(4, uid) for uid in all_user_ids] + workflow_record_id.employee_ids = all_employee_ids + workflow_record_id.approve_state = "pending" + action_id = self.env['ir.actions.act_window'].search([('res_model', '=', self.res_model)])[0] + description = "标题: {}\n".format(record_id.name) + self.env.user.name + ' ' + str(fields.Datetime.now() + timedelta(hours=8)) + for uid in all_user_ids: + employee = self.env['hr.employee'].sudo().search([('user_id', '=', uid)], limit=1) + if not employee: + continue + url = f'https://oa.thtzjt.com/web#id={record_id.id}&cids=2&menu_id={record_id.id}&action={action_id.id}&model={self.res_model}&view_type=form' + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', + user_id=employee.wecom_userid, + title=record_id._description + "印章审批", + description=description, url=url, + btntxt="查看详情") + + # 检查是否为并审模式(印章节点的人提交时也走并审,实现章间并审) + elif is_stamp_reviewer or self.approval_concatenation == 'bing': # 并审模式 expected_employees = self.employee_ids if record_id.log_ids2: log_employee_ids = record_id.log_ids2.mapped('done_by.employee_id.id') diff --git a/yuthon_trade/models/yuthon_trade_setting.py b/yuthon_trade/models/yuthon_trade_setting.py index 66e0f2ccf..ab10c9c2b 100644 --- a/yuthon_trade/models/yuthon_trade_setting.py +++ b/yuthon_trade/models/yuthon_trade_setting.py @@ -52,6 +52,11 @@ class SealsTypeSetting(models.Model): else: record.is_effect = record.start_date <= today <= record.end_date +class SoongWorkflowLog(models.Model): + _inherit = 'soong.workflow.log' + stamp_id = fields.Many2one('seals.type.setting', string='用章') + + class SealsScopeSetting(models.Model): _name = 'seals.scope.setting' _description = '用章范围'