@@ -4,6 +4,7 @@ from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError, UserError
|
||||
import logging
|
||||
from datetime import datetime, date, time, timedelta
|
||||
import re
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -52,7 +53,85 @@ class SoongWorkflowRecord(models.Model):
|
||||
member_of_department = fields.Boolean("是否是本部门数据", compute='_compute_part_of_department', search='_search_part_of_department')
|
||||
|
||||
def admin_end(self):
|
||||
pass
|
||||
workflow_ids = self.env["soong.workflow.record"].browse(
|
||||
self._context.get('active_ids', self._context.get('active_id', []))
|
||||
)
|
||||
current_datetime = fields.Datetime.now()
|
||||
for workflow in workflow_ids:
|
||||
record_id = self.env[workflow.res_model].search([('id', '=', workflow.res_id)])
|
||||
if not record_id:
|
||||
continue
|
||||
log_records = None
|
||||
if record_id.log_ids2:
|
||||
log_records = record_id.log_ids2
|
||||
elif record_id.log_ids:
|
||||
log_records = record_id.log_ids
|
||||
last_log = log_records[-1:]
|
||||
if last_log:
|
||||
last_log.write({
|
||||
'approval_state': '3',
|
||||
'lase_click_date': current_datetime,
|
||||
})
|
||||
end_node = self.env["soong.workflow.node"].search(
|
||||
[('workflow_id', '=', workflow.workflow_id.id), ('is_end', '=', True)],
|
||||
limit=1
|
||||
)
|
||||
end_btn = self.env["soong.workflow.node.button"].search(
|
||||
[('node_id', '=', end_node.id),
|
||||
('name', '=', '结束')],
|
||||
limit=1
|
||||
)
|
||||
if end_btn:
|
||||
self.execute_button_code(end_btn.id, workflow.res_model, workflow.res_id)
|
||||
workflow.approve_state = 'end'
|
||||
|
||||
def execute_button_code(self, button_id, res_model, res_id):
|
||||
|
||||
"""
|
||||
执行按钮code字段中的代码,动态解析并验证方法是否存在
|
||||
:param button_id: soong.workflow.node.button的记录ID
|
||||
:param res_model: 模型名称
|
||||
"""
|
||||
button = self.env["soong.workflow.node.button"].browse(button_id)
|
||||
if not button or not button.code:
|
||||
return
|
||||
workflow = button.node_id.workflow_id if button.node_id else None
|
||||
obj = self.env[res_model].browse(res_id)
|
||||
if not obj:
|
||||
raise UserError(f"找不到{res_model}模型中ID为{res_id}的记录")
|
||||
# 从code中提取obj调用的方法名(匹配obj.xxx()格式)
|
||||
method_match = re.search(r'obj\.(\w+)\(\)', button.code)
|
||||
if not method_match:
|
||||
raise UserError("该按钮没有配置结束的方法,请先配置!")
|
||||
|
||||
# 准备代码执行的上下文环境
|
||||
local_context = {
|
||||
'time': time,
|
||||
'date': date,
|
||||
'datetime': datetime,
|
||||
'timedelta': timedelta,
|
||||
'env': self.env,
|
||||
'model': self.env[res_model],
|
||||
'obj': obj,
|
||||
'user': self.env.user,
|
||||
'workflow': workflow,
|
||||
'syslog': self._log_debug,
|
||||
'warning': self._get_warning_exception,
|
||||
'action': None
|
||||
}
|
||||
exec(button.code, globals(), local_context)
|
||||
# 如果有返回的action,处理它
|
||||
if local_context.get('action'):
|
||||
return local_context['action']
|
||||
|
||||
def _log_debug(self, message):
|
||||
"""用于syslog的实现"""
|
||||
self.env.logger.debug(message)
|
||||
|
||||
def _get_warning_exception(self, message):
|
||||
"""用于warning的实现"""
|
||||
return Warning(message)
|
||||
|
||||
|
||||
def update_self_users_ids(self):
|
||||
record_ids = self.env["soong.workflow.record"].browse(
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
decoration-danger="approve_state == 'end'" delete="false"
|
||||
create="false" default_order="write_date2 desc, id desc" expand="1">
|
||||
<header>
|
||||
<button name="admin_end" type="object" string="管理员强制结束" class="oe_highlight"/>
|
||||
<button name="admin_end" type="object" string="管理员强制结束" class="oe_highlight" groups="soong_workflow.group_soong_workflow_manager"/>
|
||||
<button name="delete_record" type="object" string="删除" class="oe_highlight" groups="soong_workflow.group_soong_workflow_manager"/>
|
||||
</header>
|
||||
<field name="code"/>
|
||||
@@ -172,7 +172,7 @@
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">soong.workflow.record</field>
|
||||
<field name="view_mode">tree,kanban,search</field>
|
||||
<field name="domain">[('reclaim_state', '=', False), '|', ('approvals_group_id.name', '=', '人力资源'), ('approvals_group_id.name', '=', '考勤')]</field>
|
||||
<field name="domain">[('reclaim_state', '=', False), '|', ('approvals_group_id.name', '=', '人力资源'), ('approvals_group_id.name', '=', '考勤'), ('approve_state', '!=', 'start')]</field>
|
||||
<field name="search_view_id" ref="soong_workflow_record_search"/>
|
||||
</record>
|
||||
<record id="soong_workflow_other_record_action" model="ir.actions.act_window">
|
||||
|
||||
@@ -24,7 +24,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
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_note = fields.Char(string="意见", default='同意')
|
||||
comment = fields.Char(compute='_compute_comment', store=True)
|
||||
state_list = fields.Char(string="状态列表")
|
||||
record_id = fields.Integer()
|
||||
@@ -492,13 +492,32 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
related_record.self_users_ids = [(6, 0, user_ids)] if user_ids else [(5,)]
|
||||
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,})
|
||||
# 获取当前登录用户
|
||||
current_user = self.env.user
|
||||
# 获取当前时间
|
||||
current_datetime = fields.Datetime.now()
|
||||
log_records = None
|
||||
if record_id.log_ids2:
|
||||
log_records = record_id.log_ids2
|
||||
elif record_id.log_ids:
|
||||
log_records = record_id.log_ids
|
||||
if log_records:
|
||||
# 查找当前用户的日志记录
|
||||
user_log = log_records.filtered(lambda log: log.done_by == current_user)
|
||||
if user_log:
|
||||
user_log.write({
|
||||
'comment': self.comment,
|
||||
'approval_state': "3",
|
||||
'lase_click_date': current_datetime
|
||||
})
|
||||
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,
|
||||
})
|
||||
|
||||
# 给申请人发消息
|
||||
biz_record = self.env[self.res_model].browse(self.res_id)
|
||||
|
||||
Reference in New Issue
Block a user