Files
gzth/soong_workflow/wizard/soong_workflow_comment_wizard.py
T
2025-02-21 09:13:03 +08:00

227 lines
14 KiB
Python

# -*- 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_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 = ['拟办' if i.node_name == 'start' else 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:
if '分发' in self.trans_link_id.name:
self.employee_ids = record_id.users_id.employee_id
else:
workflow_id = self.trans_link_id.node_button_id.workflow_id
state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in workflow_id.node_ids]
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)])
# 自动匹配
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)])
self.employee_ids = employee_user_role_ids if not next_is_automatic else employee_user_role_id
if self.node_btn_name == '退回':
next_list = []
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
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)])
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,
"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"
})
else:
now_record_obj.write({"comment": self.comment_note_id.name, "approval_state": "2", "lase_click_date": fields.Datetime.now()})
# 遍历出所有的工作流路径
for next in record_id.workflow_id.link_ids:
self_link = next.name.split('-> ')[0].strip()
next_link = next.name.split('-> ')[-1].strip()
if record_id.state == self_link and next_link == self.trans_link_id.name.strip():
next_node_id = record_id.workflow_id.node_ids.search([('name', 'ilike', self.trans_link_id.name), ('workflow_id', '=', record_id.workflow_id.id)])
# 分发判断
if '分发' not in next_node_id.name:
is_automatic = next_node_id.button_ids[0].is_automatic
next_state = next_node_id.button_ids[0]
employee_user_role_ids = self.env['hr.employee'].search(['|', ('user_role_id', '=', next_state.users_role_id.id),
('user_role_ids', 'in', next_state.users_role_id.id)])
employee_user_role_id = self.env['hr.employee'].search(
['|', ('user_role_id', '=', next_state.users_role_id.id), ('user_role_ids', 'in', next_state.users_role_id.id), '|',
('department_id', '=', record_id.department_id.id), ('department_ids', 'in', record_id.department_id.id)])
employee_ids = employee_user_role_ids if not is_automatic else employee_user_role_id
else:
employee_ids = record_id.users_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": employee_ids[0].user_id.id if employee_ids else None,
"node_btn_name": "0",
})
if self.trans_link_id.name == '分发':
state = '分发/督办'
else:
state = self.trans_link_id.name
record_id.write({'state': state})
# 抄送传阅日志
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="查看详情")
return self.node_btn_id.with_context(cx).run()
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),
# ("workflow_id", "=", record_id.workflow_id.id),
# ("node_btn_name", "=", "0"),
# ("node_btn_id", "=", self.node_btn_id.id),
# ], order="lase_click_date DESC", limit=1)
# if now_record_obj:
# now_record_obj.write({"comment": self.comment_note_id.name})
record_id.write({'state': 'start' if self.return_link_id.name in ['拟办', '申请人'] else self.return_link_id.name})
# 退回创建记录
next_node_id = record_id.workflow_id.link_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
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.env.user.id,
"approval_state": "0",
"node_btn_name": "1",
"comment": self.comment_note_id.name,
"node_btn_id": self.node_btn_id.id,
"lase_click_date": fields.Datetime.now(),
})
return self.node_btn_id.with_context(cx).run()
return self.node_btn_id.with_context(cx).run()