!5074 添加功能

Merge pull request !5074 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2025-09-11 02:49:06 +00:00
committed by Gitee
27 changed files with 353 additions and 77 deletions
+80 -1
View File
@@ -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)