321 lines
20 KiB
Python
321 lines
20 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"
|
|
|
|
name = fields.Char(string="name")
|
|
res_model = fields.Char()
|
|
res_id = fields.Integer()
|
|
code = fields.Char()
|
|
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')
|
|
user_id = fields.Many2one('res.users',string='用户',default=lambda self: self.env.user)
|
|
user_role_ids = fields.Many2many('soong.user.role', string="角色", compute='_compute_user_role_ids', store=True)
|
|
node_link_len = fields.Char(string="转交2")
|
|
is_supervising = fields.Boolean(string="是否督办")
|
|
comment_note_id = fields.Many2one('soong.note', string="常用意见", default='妥否,呈领导审批')
|
|
comment_note = fields.Char(string="意见")
|
|
comment = fields.Char(compute='_compute_comment', store=True)
|
|
state_list = fields.Char(string="状态列表")
|
|
record_id = fields.Integer()
|
|
trans_link_id = fields.Many2one('trans.link', string='转交节点')
|
|
document_ids = fields.Many2many('ir.attachment', 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('是否自动匹配')
|
|
|
|
employee_ids1 = fields.Many2many(
|
|
'hr.employee',
|
|
'employee_ids1_rel',
|
|
'custom_id1',
|
|
'employee_id1',
|
|
string="转交人员",
|
|
store=True
|
|
)
|
|
|
|
@api.onchange('employee_ids1')
|
|
def _onchange_employee_ids1(self):
|
|
if len(self.employee_ids1) == 1:
|
|
self.employee_ids = self.employee_ids1
|
|
|
|
@api.constrains('employee_ids')
|
|
def _check_employee_ids(self):
|
|
if not self.employee_ids and self.node_btn_name != '结束':
|
|
raise ValidationError("必须有转交人员")
|
|
|
|
@api.depends('comment_note_id', 'comment_note')
|
|
def _compute_comment(self):
|
|
for record in self:
|
|
comment_parts = []
|
|
if record.comment_note_id:
|
|
comment_parts.append(record.comment_note_id.name)
|
|
if record.comment_note:
|
|
comment_parts.append(record.comment_note)
|
|
record.comment = " ".join(comment_parts) if comment_parts else ""
|
|
|
|
@api.depends('user_id.employee_ids.user_role_ids')
|
|
def _compute_user_role_ids(self):
|
|
for record in self:
|
|
if record.user_id:
|
|
record.user_role_ids = record.user_id.employee_ids.user_role_ids
|
|
else:
|
|
record.user_role_ids = False
|
|
|
|
@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_ids1 = record_id.users_id.employee_ids
|
|
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),
|
|
('user_role_id', 'in', btn.users_role_group_ids.user_role_ids.ids),
|
|
('department_id', '=', record_id.department_id.id)])
|
|
self.employee_ids1 = employee_user_role_id
|
|
else:
|
|
employee_user_role_ids = self.env['hr.employee'].search(
|
|
['|', ('user_role_id', '=', btn.users_role_id.id),
|
|
('user_role_id', 'in', btn.users_role_group_ids.user_role_ids.ids),
|
|
])
|
|
self.employee_ids1 = 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
|
|
link_users_group_ids = workflow_id.node_ids.search([('name', '=', self.trans_link_id.name), ('workflow_id', '=', workflow_id.id)]).button_ids[0].users_role_group_ids
|
|
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 = employee_user_role_id = False
|
|
if link_users_id:
|
|
employee_user_role_ids = self.env['hr.employee'].sudo().search(['|', ('user_role_id', '=', link_users_id.id), ('user_role_ids', 'in', link_users_id.id), ('company_id', '=', self.env.user.company_id.id)]) # 自动匹配
|
|
employee_user_role_id = self.env['hr.employee'].sudo().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), ('company_id', '=', self.env.user.company_id.id)]) # 不自动匹配
|
|
elif link_users_group_ids:
|
|
# 不自动匹配
|
|
employee_user_role_ids = self.env['hr.employee'].sudo().search(['|', ('user_role_id', 'in', link_users_group_ids.user_role_ids.ids), ('user_role_ids', 'in', link_users_group_ids.user_role_ids.ids)])
|
|
# 自动匹配
|
|
employee_user_role_id = self.env['hr.employee'].sudo().search([('id', 'in', employee_user_role_ids.ids),
|
|
'|', ('department_id', '=', record_id.department_id.id),
|
|
('department_ids', 'in', record_id.department_id.id),
|
|
('company_id', '=', self.env.user.company_id.id)]) # 自动匹配
|
|
self.employee_trans_domain_ids = employee_user_role_ids if not next_is_automatic else employee_user_role_id
|
|
self.employee_ids1 = employee_user_role_ids if not next_is_automatic else employee_user_role_id
|
|
if '分发' in ret.name:
|
|
self.employee_ids1 = 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)])
|
|
for employee in self.employee_ids:
|
|
action_id = self.env['ir.actions.act_window'].search([('res_model', '=', self.res_model)])[0]
|
|
url = f'https://oa.thtzjt.com/web?wecom_fields={employee.user_id.wecom_fields}&oauth_uid={employee.wecom_userid}#id={record_id.id}&cids=2&action={action_id.id}&model={record_id._name}&view_type=form'
|
|
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
|
|
user_id=employee.wecom_userid,
|
|
title=record_id._description,
|
|
description="标题: {}\n".format(
|
|
record_id.name) + self.env.user.name + ' ' + str(
|
|
fields.Datetime.now() + timedelta(hours=8)),
|
|
url=url, btntxt="查看详情")
|
|
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({
|
|
"code": self.code,
|
|
"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",
|
|
"document_ids": self.document_ids,
|
|
"comment": self.comment,
|
|
})
|
|
else:
|
|
now_record_obj.write({"comment": self.comment,
|
|
"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({
|
|
"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": 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({
|
|
"code": self.code,
|
|
"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 = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={record_id.action.id}&model={self.res_model}&view_type=from&menu_id={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,
|
|
"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({
|
|
"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": 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
|
|
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,
|
|
"approval_state": "2",
|
|
"lase_click_date": fields.Datetime.now()})
|
|
self.sudo().env["soong.workflow.log"].create({
|
|
"code": self.code,
|
|
"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({
|
|
"code": self.code,
|
|
"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 = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={record_id.action.id}&model={self.res_model}&view_type=from&menu_id={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})
|
|
return self.node_btn_id.with_context(cx).run()
|