# -*- coding: utf-8 -*- # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from email.policy import default from odoo import fields, models, api from odoo.exceptions import UserError, ValidationError from datetime import datetime, date, time, timedelta class SoongWorkflowCommentWizard(models.TransientModel): _name = "soong.workflow.comment.wizard" _description = "Soong Workflow Comment Wizard" _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin'] name = fields.Char(string="name") res_model = fields.Char() res_id = fields.Integer() log_ids = fields.Many2many(comodel_name="soong.workflow.log") node_btn_id = fields.Many2one(comodel_name="soong.workflow.node.button") node_btn_name = fields.Char(string="动作名称", related='node_btn_id.name') node_link_len = fields.Char(string="转交2") is_supervising = fields.Boolean(string="是否督办") comment_note_id = fields.Many2one('soong.note', string="意见", default='妥否,呈领导审批') state_list = fields.Char(string="状态列表") record_id = fields.Integer() trans_link_id = fields.Many2one('trans.link', string='转交节点') return_link_id = fields.Many2one('trans.link', string='退回节点') employee_trans_domain_ids = fields.Many2many('hr.employee', 'employee_trans_domain_ids_rel', string="传阅人员", store=True) employee_ids = fields.Many2many('hr.employee', 'employee_ids_rel', 'custom_id', 'employee_id', string="传阅人员", store=True) circulated_employee_ids = fields.Many2many('hr.employee', 'circulated_employee_rel', 'custom_id', 'employee_id', string="传阅人员", store=True) supervising_employee_ids = fields.Many2many('hr.employee', 'supervising_employee_rel', 'custom_id', 'employee_id', string="督办人员", store=True) is_automatic = fields.Boolean('是否自动匹配') @api.onchange('record_id') def _onchange_record_id(self): record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) self.record_id = record_id @api.onchange('return_link_id') def onchange_employee_ids(self): record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) for ret in self.return_link_id: if ret.name in ['拟办', '申请人']: self.employee_ids = record_id.users_id.employee_id elif self.node_btn_name == '退回': next_list = [] workflow_id = self.return_link_id.node_button_id.workflow_id state_list = [i.node_name for i in workflow_id.node_ids] self_state = state_list.index(ret.name) button_ids = workflow_id.node_ids[self_state].button_ids for btn in button_ids: next_list.append(btn.name) if '转交' not in next_list: raise UserError('配置错误,请配置当前{}的转交按钮'.format(btn.name)) else: if btn.is_automatic: employee_user_role_id = self.env['hr.employee'].search( [('user_role_id', '=', btn.users_role_id.id), ('department_id', '=', record_id.department_id.id)]) self.employee_ids = employee_user_role_id else: employee_user_role_ids = self.env['hr.employee'].search( [('user_role_id', '=', btn.users_role_id.id)]) self.employee_ids = employee_user_role_ids @api.onchange('trans_link_id') def onchange_trans_employee_ids(self): record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) for ret in self.trans_link_id: workflow_id = self.trans_link_id.node_button_id.workflow_id link_users_id = workflow_id.node_ids.search([('name', '=', self.trans_link_id.name), ('workflow_id', '=', workflow_id.id)]).button_ids[0].users_role_id next_is_automatic = workflow_id.node_ids.search([('name', '=', self.trans_link_id.name), ('workflow_id', '=', workflow_id.id)]).button_ids[0].is_automatic # 不自动匹配 employee_user_role_ids = self.env['hr.employee'].search(['|', ('user_role_id', '=', link_users_id.id), ('user_role_ids', 'in', link_users_id.id), ('yuthon_company', '=', record_id.create_uid.employee_id.yuthon_company)]) # 自动匹配 employee_user_role_id = self.env['hr.employee'].search(['|', ('user_role_id', '=', link_users_id.id), ('user_role_ids', 'in', link_users_id.id), '|', ('department_id', '=', record_id.department_id.id), ('department_ids', 'in', record_id.department_id.id), ('yuthon_company', '=', record_id.create_uid.employee_id.yuthon_company)]) if not employee_user_role_id: employee_user_role_id = self.env['hr.employee'].search( ['|', ('user_role_id', '=', link_users_id.id), ('user_role_ids', 'in', link_users_id.id), '|', ('department_id', '=', record_id.department_id.parent_id.id), ('department_ids', 'in', record_id.department_id.parent_id.id), ('yuthon_company', '=', record_id.create_uid.employee_id.yuthon_company)]) self.employee_trans_domain_ids = employee_user_role_ids if not next_is_automatic else employee_user_role_id self.employee_ids = employee_user_role_ids if not next_is_automatic else employee_user_role_id if '分发' in ret.name: self.employee_ids = record_id.users_id.employee_id def add_comment(self): self.ensure_one() cx = self.env.context.copy() or {} record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) if self.node_btn_name == '转交': self_node_id = record_id.workflow_id.node_ids.search( [('name', '=', record_id.state), ('workflow_id', '=', record_id.workflow_id.id)]) now_record_obj = self.sudo().env["soong.workflow.log"].search( [("model", "=", self.res_model), ("res_id", "=", self.res_id), ("node_id", "=", self.node_btn_id.node_id.id)]) first_node = self.sudo().env["soong.workflow.log"].search([("model", "=", self.res_model), ("res_id", "=", self.res_id)]) if not now_record_obj: self.sudo().env["soong.workflow.log"].create({ "model": self.res_model, "res_id": self.res_id, "node_id": self.node_btn_id.node_id.id if first_node else record_id.workflow_id.node_ids[0].id, "workflow_id": self.node_btn_id.workflow_id.id, "done_by": self.env.user.id, "node_btn_name": "0", "node_btn_id": self.node_btn_id.id, "lase_click_date": fields.Datetime.now(), "approval_state": "2", "comment": self.comment_note_id.name, }) else: now_record_obj.write({"comment": self.comment_note_id.name, "approval_state": "2", "lase_click_date": fields.Datetime.now()}) next_node_id = record_id.workflow_id.node_ids.search([('name', 'ilike', self.trans_link_id.name), ('workflow_id', '=', record_id.workflow_id.id)]) self.sudo().env["soong.workflow.log"].create({ "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": self.employee_ids.user_id.id, "node_btn_name": "0", }) workflow_record_id = self.env['soong.workflow.record'].search([('code', '=', record_id.code)]) workflow_record_id.users_ids = [(4, self.employee_ids.user_id.id)] workflow_record_id.employee_ids = self.employee_ids record_id.write({'state': self.trans_link_id.name}) # 抄送传阅日志 if self_node_id.is_carbon_copy: for employee in self_node_id.employee_ids: if not employee.wecom_userid: raise ("请同步{}的企业微信".format(employee.name)) record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) self.sudo().env["soong.workflow.record.copy"].create({ "code": record_id.code, "name": record_id.name, "res_model": self.res_model, "workflow_id": self.node_btn_id.workflow_id.id, "res_id": self.res_id, "done_by": employee.user_id.id, "approval_state_copy": "0", }) self.sudo().env["soong.workflow.log2"].create({ "model": self.res_model, "res_id": self.res_id, "node_id": self.node_btn_id.node_id.id, "workflow_id": self.node_btn_id.workflow_id.id, "done_by": employee.user_id.id, "node_btn_id": self.node_btn_id.id, "approval_state": "0", }) url = "https://oa.thtzjt.com/mail/view?model={}&res_id={}".format(self.res_model, record_id.id) description = "标题: {}\n".format(record_id.name) + self.env.user.name + ' ' + str( fields.Datetime.now() + timedelta(hours=8)) 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="查看详情") self.env['soong.workflow.record'].search([('code', '=', record_id.code)]).write({'approve_state': 'pending'}) return self.node_btn_id.with_context(cx).run() if self.node_btn_name == '退回': record_id.write({'state': self.return_link_id.name}) next_node_id = record_id.workflow_id.node_ids.search([('name', '=', self.return_link_id.name), ('workflow_id', '=', record_id.workflow_id.id)]) for next_link in record_id.workflow_id.link_ids: if next_link.name.split('-> ')[0].strip() == self.return_link_id.name.strip(): next_node_id = next_link.node_from record_id.log_ids[-1].write({'approval_state': '2', "lase_click_date": fields.Datetime.now(), "comment": self.comment_note_id.name, "node_btn_name": "1"}) # if not self.sudo().env["soong.workflow.log"].search([('node_id', '=', next_node_id.id)]): self.sudo().env["soong.workflow.log"].create({ "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": self.employee_ids[0].user_id.id, "approval_state": "0", "node_btn_id": self.node_btn_id.id, }) workflow_record_id = self.env['soong.workflow.record'].search([('code', '=', record_id.code)]) workflow_record_id.employee_ids = self.employee_ids return self.node_btn_id.with_context(cx).run() if self.node_btn_name == '结束': record_id.log_ids[-1].comment = self.comment_note_id.name record_id.log_ids[-1].approval_state = "3" record_id.log_ids[-1].lase_click_date = fields.Datetime.now() record_id.work_end = True self.env['soong.workflow.record'].search([('code', '=', record_id.code)]).write({'approve_state': 'end', "employee_ids": False, "node_id": False,}) if self.node_btn_name == "分发": if self.employee_ids: record_id.log_ids[-1].write({"comment": self.comment_note_id.name, "approval_state": "2", "lase_click_date": fields.Datetime.now()}) self.sudo().env["soong.workflow.log"].create({ "model": self.res_model, "res_id": self.res_id, "node_id": record_id.workflow_id.node_ids[-1].id, "workflow_id": self.node_btn_id.workflow_id.id, "done_by": self.employee_ids.user_id.id, "node_btn_name": "0", }) if self.circulated_employee_ids: for employee in self.circulated_employee_ids: if not employee.wecom_userid: raise ("请同步{}的企业微信".format(employee.name)) record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) self.sudo().env["soong.workflow.record.copy"].create({ "code": record_id.code, "name": record_id.name, "res_model": self.res_model, "workflow_id": self.node_btn_id.workflow_id.id, "res_id": self.res_id, "done_by": employee.user_id.id, "approval_state_copy": "0", }) self.sudo().env["soong.workflow.log2"].create({ "model": self.res_model, "res_id": self.res_id, "node_id": self.node_btn_id.node_id.id, "workflow_id": self.node_btn_id.workflow_id.id, "done_by": employee.user_id.id, "node_btn_id": self.node_btn_id.id, "approval_state": "0", }) url = "https://oa.thtzjt.com/mail/view?model={}&res_id={}".format(self.res_model, record_id.id) description = "标题: {}\n".format(record_id.name) + self.env.user.name + ' ' + str( fields.Datetime.now() + timedelta(hours=8)) 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="查看详情") if self.node_btn_name == "收回": log_ids = record_id.log_ids.sorted('sequence') if log_ids[-1].approval_state == '2': raise UserError('当前状态不可以收回') self.env['soong.workflow.record'].search([('code', '=', record_id.code)]).write({"employee_ids": self.env.user.employee_id.id,}) log_ids[-1].unlink() log_ids[-2].write({'approval_state': '1'}) record_id.write({'state': log_ids[-2].name}) url = 'https://oa.thtzjt.com/mail/view?model={}&res_id={}'.format(self._name, record_id.id) for employee in self.employee_ids: self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=employee.wecom_userid, title=self._description, description="标题: {}\n".format( self.name) + self.env.user.name + ' ' + str( fields.Datetime.now() + timedelta( hours=8)), url=url, btntxt="查看详情") return self.node_btn_id.with_context(cx).run()