添加功能

This commit is contained in:
李鹏宇
2026-01-08 18:41:43 +08:00
parent c1a31d9bfa
commit 4eff73f6be
8 changed files with 130 additions and 62 deletions
+2 -1
View File
@@ -19,6 +19,7 @@ class SoongWorkflowLog(models.Model):
workflow_id = fields.Many2one(comodel_name="soong.workflow")
node_id = fields.Many2one(comodel_name="soong.workflow.node")
msg_id = fields.Char(string="Msg_id")
node_btn_id = fields.Many2one(comodel_name="soong.workflow.node.button", string="动作名称")
node_btn_name = fields.Selection([('0', ' '), ('1', '退回'), ('2', '加签'), ('3', '串'), ('4', '并'), ('5', '董事长'), ('6', '承办')], store=True, string='节点功能', default='0')
done_by = fields.Many2one(comodel_name="res.users", string="审批人")
@@ -78,7 +79,7 @@ class SoongWorkflowLog2(models.Model):
res_id = fields.Integer(string="Related Document ID", index=True, required=True)
node_id = fields.Many2one(comodel_name="soong.workflow.node")
node_btn_id = fields.Many2one(comodel_name="soong.workflow.node.button", string="动作名称")
msg_id = fields.Char(string="Msg_id")
sequence = fields.Integer(string="序号", compute="_compute_sequence")
done_by = fields.Many2one(comodel_name="res.users", string="审批人")
name = fields.Char(string="节点名称", compute="_compute_name", store=True)
@@ -17,7 +17,7 @@
</field>
</page>
<page string="审批详情" invisible="not work_end">
<field name="log_ids" style="width:100%; margin-top: 10px;" domain="[('node_btn_name', '!=', '1')]">
<field name="log_ids" style="width:100%; margin-top: 10px;" domain="[('node_btn_name', '!=', '1')]" context="{'kanban_view_ref':'soong_workflow.soong_workflow_log_kanban'}">
<tree editable="bottom">
<field name="sequence" string="" widget="handle"
groups="soong_workflow.group_soong_workflow_manager"/>
@@ -32,9 +32,9 @@
</tree>
</field>
</page>
<page string="抄送/传阅记录" invisible="not log_ids2">
<page string="抄送/传阅记录" invisible="not log_ids2" mode="kanban,tree" context="{'kanban_view_ref':'soong_workflow.soong_workflow_log2_kanban'}">
<field name="log_ids2" style="width:100%; margin-top: 10px;">
<tree editable="bottom">
<tree editable="bottom" >
<field name="done_by" string=""/>
<field name="commit" string=""/>
<!-- <field name="name" string=""/>-->
@@ -85,7 +85,7 @@
</tree>
</field>
</page>
<page string="抄送/传阅记录" invisible="not log_ids2">
<page string="抄送/传阅记录" invisible="not log_ids2" context="{'kanban_view_ref':'soong_workflow.soong_workflow_log2_kanban'}">
<field name="log_ids2" style="width:100%%; margin-top: 10px;">
<tree create="false" edit="false" delete="false" editable="bottom">
<field name="done_by" string=""/>
@@ -120,4 +120,91 @@
</page>
</notebook>
</template>
<record id="soong_workflow_log_kanban" model="ir.ui.view">
<field name="name">soong.workflow.log.kanban</field>
<field name="model">soong.workflow.log</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="name"/>
<field name="comment"/>
<field name="done_by"/>
<field name="lase_click_date"/>
<field name="approval_state"/>
<field name="node_btn_name"/>
<templates>
<t t-name="kanban-box">
<div class="o_kanban_record d-md-none card h-100">
<div class="card-body">
<div class="mb-2">
<small>
节点:<field name="name" />
</small>
</div>
<div class="mb-2">
<small>
状态:<field name="approval_state"/>
</small>
</div>
<div class="mb-2">
<small>
经办人:<field name="done_by"/>
</small>
</div>
<div class="mb-2">
<small>
意见:<field name="comment"/>
</small>
</div>
<div class="mb-2">
<small>
附件:<field name="document_ids" widget="preview_many2many"/>
</small>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="soong_workflow_log2_kanban" model="ir.ui.view">
<field name="name">soong.workflow.log2.kanban</field>
<field name="model">soong.workflow.log2</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="done_by"/>
<field name="commit"/>
<field name="approval_state"/>
<field name="lase_click_date"/>
<templates>
<t t-name="kanban-box">
<div class="o_kanban_record d-md-none card h-100">
<div class="card-body">
<div class="mb-2">
<small>
姓名:<field name="done_by" />
</small>
</div>
<div class="mb-2">
<small>
意见:<field name="commit"/>
</small>
</div>
<div class="mb-2">
<small>
状态:<field name="approval_state"/>
</small>
</div>
<div class="mb-2">
<small>
时间:<field name="lase_click_date"/>
</small>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
</odoo>
@@ -1,52 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="soong_workflow_log_kanban" model="ir.ui.view">
<field name="name">soong.workflow.log.kanban</field>
<field name="model">soong.workflow.log</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="name"/>
<field name="comment"/>
<field name="done_by"/>
<field name="lase_click_date"/>
<field name="approval_state"/>
<field name="node_btn_name"/>
<templates>
<t t-name="kanban-box">
<div class="o_kanban_record d-md-none card h-100">
<div class="card-body">
<div class="mb-2">
<small>
节点:<field name="name" />
</small>
</div>
<div class="mb-2">
<small>
状态:<field name="approval_state"/>
</small>
</div>
<div class="mb-2">
<small>
经办人:<field name="done_by"/>
</small>
</div>
<div class="mb-2">
<small>
意见:<field name="comment"/>
</small>
</div>
<div class="mb-2">
<small>
附件:<field name="document_ids" widget="preview_many2many"/>
</small>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Views -->
<record id="view_soong_workflow_log_tree" model="ir.ui.view">
<field name="name">soong.workflow.log.tree</field>
@@ -59,6 +12,7 @@
<field name="workflow_id" string="审批类型"/>
<field name="node_btn_id"/>
<field name="done_by"/>
<field name="msg_id"/>
<field name="lase_click_date"/>
<field name="comment"/>
<field name="active" column_invisible="1"/>
@@ -82,6 +36,7 @@
<field name="workflow_id" string="审批类型"/>
<field name="node_btn_id"/>
<field name="done_by"/>
<field name="msg_id"/>
<field name="lase_click_date"/>
<field name="commit"/>
</tree>
@@ -176,8 +176,8 @@
<field name="soong_state"/>
<field name="is_manager" column_invisible="1"/>
<field name="is_unlink" column_invisible="1"/>
<button name="delete_record" type="object" string="删除" class="btn-primary" confirm="你确定要删除吗?"
invisible="not is_unlink"/>
<!-- <button name="delete_record" type="object" string="删除" class="btn-primary" confirm="你确定要删除吗?"-->
<!-- invisible="not is_unlink"/>-->
<button name="reminders_record" type="object" string="催办" class="btn-primary" invisible="soong_state != 'done' or create_uid != uid or approve_state == 'end'"/>
<button name="revoke_record" type="object" string="撤销" class="btn-primary"
groups="soong_workflow.group_soong_workflow_manager"/>
@@ -43,8 +43,12 @@ class SoongBouncedWizard(models.Model):
"users_ids": [(6, 0, done_by_list)],
'soong_state': 'to_do'
})
for log_delete in log_to_delete:
self.sudo().env["wecom.apps"].back_message(log_delete.msg_id, category='approval')
log_to_delete.unlink()
if record.log_ids2:
for log_id2 in record.log_ids2:
self.sudo().env["wecom.apps"].back_message(log_id2.msg_id, category='approval')
record.log_ids2.unlink()
prev_log.write({'approval_state': '1'})
record.write({'state': prev_log.name,
@@ -415,7 +415,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
if not next_node_employee_log:
# 创建初步记录,状态为"待审批"
next_node_employee_log = self.sudo().env["soong.workflow.log"].create({
self.sudo().env["soong.workflow.log"].create({
"code": self.code,
"model": self.res_model,
"res_id": self.res_id,
@@ -439,14 +439,18 @@ class SoongWorkflowCommentWizard(models.TransientModel):
action_id = self.env['ir.actions.act_window'].search([('res_model', '=', self.res_model)])[0]
url = f'https://oa.thtzjt.com/web#id={record_id.id}&cids=2&active_id={action_id.id}&model={record_id._name}&view_type=form'
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
user_id='18562027762',
title=record_id._description,
description="标题: {}\n".format(
record_id.name) + self.env.user.name + ' ' + str(
fields.Datetime.now() + timedelta(
hours=8)),
url=url, btntxt="查看详情")
# next_node_employee_log.msg_id = result_data[1]['msgid']
msg_id = result_data[-1]['msgid']
target_logs = record_id.log_ids.filtered(lambda l: l.done_by == employee.user_id.id)
if target_logs:
target_logs.msg_id = msg_id
else: # 串审模式 (沿用原有逻辑)
# 查找下一个节点
next_node_id = record_id.workflow_id.node_ids.search([
@@ -675,7 +679,11 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"done_by": self.employee_ids.user_id.id,
"node_btn_name": "0",
})
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=self.employee_ids.wecom_userid, title=record_id._description, description=description, url=url, btntxt="查看详情")
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id='18562027762', title=record_id._description, description=description, url=url, btntxt="查看详情")
msg_id = result_data[-1]['msgid']
target_logs = record_id.log_ids.filtered(lambda l: l.done_by == employee.user_id.id)
if target_logs:
target_logs.msg_id = msg_id
for emp in self.dep_manager_employee_ids:
workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.dep_manager_employee_ids if employee.user_id]
next_node_id = record_id.workflow_id.node_ids.search([('name', '=', '承办'), ('workflow_id', '=', record_id.workflow_id.id)])
@@ -688,7 +696,11 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"done_by": emp.user_id.id,
"node_btn_name": "0",
})
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=emp.wecom_userid, title=record_id._description + "承办", description=description, url=url, btntxt="查看详情")
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=emp.wecom_userid, title=record_id._description + "承办", description=description, url=url, btntxt="查看详情")
msg_id = result_data[-1]['msgid']
target_logs = record_id.log_ids.filtered(lambda l: l.done_by == employee.user_id.id)
if target_logs:
target_logs.msg_id = msg_id
for employee in self.circulated_employee_ids:
workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.circulated_employee_ids if employee.user_id]
record_id = self.env[self.res_model].search([('id', '=', self.res_id)])
@@ -711,7 +723,11 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"node_btn_id": self.node_btn_id.id,
"approval_state": "0",
})
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="查看详情")
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id='18562027762', title=record_id._description + "传阅/抄送",description=description, url=url, btntxt="查看详情")
msg_id = result_data[-1]['msgid']
target_logs = record_id.log_ids2.filtered(lambda l: l.done_by == employee.user_id.id)
if target_logs:
target_logs.msg_id = msg_id
workflow_record_id.employee_ids = self.dep_manager_employee_ids + self.employee_ids + self.circulated_employee_ids
record_id.log_ids[-1].write({"comment": self.comment, "approval_state": "2", "lase_click_date": fields.Datetime.now()})
if self.node_btn_name == "收回":
@@ -749,4 +765,4 @@ class SoongWorkflowCommentWizard(models.TransientModel):
related_record = self.env[self.res_model].browse(self.res_id)
if hasattr(related_record, 'self_users_ids'):
user_ids = [employee.user_id.id for employee in self.employee_ids if employee.user_id]
related_record.self_users_ids = [(6, 0, user_ids)] if user_ids else [(5,)]
related_record.self_users_ids = [(6, 0, user_ids)] if user_ids else [(5,)]
+5
View File
@@ -103,6 +103,11 @@ class WeComApps(models.Model):
data = {'msgid': msg_id}
url = f'https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token={token}'
requests.post(url=url, data=json.dumps(data))
if category == 'approval':
token = self.env['wecom.apps'].search([('name', '=', '审批消息通知')])['access_token']
data = {'msgid': msg_id}
url = f'https://qyapi.weixin.qq.com/cgi-bin/message/recall?access_token={token}'
requests.post(url=url, data=json.dumps(data))
def sync_send_message_textcard(self, content_item='', touser='', category='default', user_id=None, title="", description="", url="", btntxt="详情"):
"""
+1 -1
View File
@@ -204,7 +204,7 @@ class YuthonWillTask(models.Model):
title="日程事项提醒", description=data, url=url, btntxt="详细信息")
test_msg_id = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id="18562027762",
title="日程事项提醒", description=data, url=url, btntxt="详细信息")
# self.write({'msg_id': test_msg_id[-1]['msgid']})
self.write({'msg_id': test_msg_id[-1]['msgid']})
return {
'type': 'ir.actions.client',
'tag': 'display_notification',