pengyuthon wechat

This commit is contained in:
李鹏宇
2024-12-01 14:35:08 +08:00
parent 0b6928ed9c
commit 5c6bc63f7d
20 changed files with 156 additions and 86 deletions
@@ -111,7 +111,7 @@
}
&.active {
background-color: #f6f6f6;
background-color: #b8d7f3;
}
}
}
+1 -1
View File
@@ -5,7 +5,7 @@
"author": "soong bo",
"license": "AGPL-3",
"version": "17.0.0.1.0",
"depends": ["base", "crnd_web_diagram_plus", "hr"],
"depends": ["base", "crnd_web_diagram_plus", "hr", 'mail'],
"data": [
"data/soong_workflow_note_data.xml",
"data/soong_workflow_inspector_code.xml",
@@ -17,4 +17,22 @@
</a>
</p>
</template>
<template id="message_soong_workflow_distribute">
<p style="margin: 0px;">
<span>尊敬的用户,</span>
<br/>
<span style="margin-top: 8px;">您有一条新的审批消息请及时查看
<t t-esc="object.name"/>
请查看详情。
</span>
</p>
<p style="margin-top: 24px; margin-bottom: 16px;">
<a t-att-href="access_link" t-att-data-oe-model="object.res_model" t-att-data-oe-id="object.id"
style="background-color:#2C65F7; padding: 10px; text-decoration: none; color: #fff; border-radius: 5px;">
查看
<t t-esc="model_description or 'document'"/>
</a>
</p>
</template>
</odoo>
@@ -208,10 +208,9 @@ class SoongWorkflowMixin(models.AbstractModel):
for employee in employee_ids:
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title=self.name,
description="您有新的审批单{}请及时处理".format(
self.name),
url=url, btntxt="详情")
title=self._description,
description="您有新的审批单 {} 请及时处理\n".format(self.name) + self.env.user.name + ' ' + str(fields.Datetime.now() + timedelta(hours=8)),
url=url, btntxt="查看详情")
partner_ids = employee_ids.user_id.partner_id.ids
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_users_data')
return btn_rec.with_context(cx).run()
+10 -1
View File
@@ -25,7 +25,16 @@ class SoongWorkflowRecord(models.Model):
users_ids = fields.Many2many('res.users', string="用户")
workflow_id = fields.Many2one(comodel_name="soong.workflow", string="审批类型", ondelete="restrict")
node_id = fields.Many2one(comodel_name="soong.workflow.node", string="当前节点")
approve_state = fields.Selection([("start", "开始"), ("pending", "审批中"), ("end", "结束")], default="start", string="审批状态", compute="_compute_node_id",)
approve_state = fields.Selection([("start", "开始"), ("pending", "审批中"), ("end", "结束")], default="start", string="审批状态", compute="_compute_node_id")
reclaim_state = fields.Boolean(string="回收")
def reclaim_record(self):
for rec in self:
rec.reclaim_state = True
def restore_record(self):
for rec in self:
rec.reclaim_state = False
@api.depends("node_id")
def _compute_node_id(self):
+17 -9
View File
@@ -2,24 +2,32 @@
<odoo>
<data>
<!--
Root Menu
-->
<menuitem id="menu_soong_workflow_root"
name="Workflow"
web_icon="soong_workflow,static/description/icon.png"
sequence="200"/>
<menuitem id="menu_workflow_approval_request_selector"
name="流程查询"
parent="menu_soong_workflow_root"
sequence="1"/>
<menuitem id="menu_workflow_approval_request_my"
name="我的流程"
parent="menu_workflow_approval_request_selector"
action="soong_workflow_record_action"
sequence="1"/>
<menuitem id="menu_workflow_approval_request_recycle"
name="流程回收站"
parent="menu_workflow_approval_request_selector"
action="soong_workflow_record_action_reclaim"
sequence="3"/>
<menuitem id="menu_workflow_approval_request_new"
name="新的流程"
parent="menu_soong_workflow_root"
action="action_kklw_workflow_approval_request"
sequence="1"/>
<menuitem id="menu_workflow_approval_request_my"
name="流程查询"
parent="menu_soong_workflow_root"
action="soong_workflow_record_action"
sequence="3"/>
<menuitem id="menu_soong_workflow_entrust"
+35 -7
View File
@@ -17,12 +17,34 @@
<field name="name">soong.workflow.record.tree</field>
<field name="model">soong.workflow.record</field>
<field name="arch" type="xml">
<tree string="WorkFollow Record" action="open_record" type="object" decoration-muted="approve_state == 'end'" decoration-warning="approve_state != 'end'" create="false">
<tree string="WorkFollow Record" action="open_record" delete="false" type="object"
decoration-muted="approve_state == 'end'" decoration-warning="approve_state != 'end'"
create="false">
<field name="name"/>
<field name="workflow_id" string="审批类型"/>
<field name="node_id" string="当前节点"/>
<field name="approve_state" string="审批状态"/>
<field name="write_date"/>
<field name="reclaim_state" column_invisible="1"/>
<button name="reclaim_record" type="object" string="回收" class="btn-primary"/>
</tree>
</field>
</record>
<record id="soong_workflow_record_tree_restore" model="ir.ui.view">
<field name="name">soong.workflow.record.tree.restore</field>
<field name="model">soong.workflow.record</field>
<field name="arch" type="xml">
<tree string="WorkFollow Record" action="open_record" type="object"
decoration-muted="approve_state == 'end'" decoration-warning="approve_state != 'end'"
create="false">
<field name="name"/>
<field name="workflow_id" string="审批类型"/>
<field name="node_id" string="当前节点"/>
<field name="approve_state" string="审批状态"/>
<field name="write_date"/>
<field name="reclaim_state" column_invisible="1"/>
<button name="restore_record" type="object" string="还原" class="btn-primary" groups="soong_workflow.group_soong_workflow_manager"/>
</tree>
</field>
</record>
@@ -32,13 +54,19 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">soong.workflow.record</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('users_ids', 'in', [uid])]</field>
<field name="domain">[('users_ids', 'in', [uid]), ('reclaim_state', '=', False)]</field>
</record>
<!-- <menuitem id="soong_workflow_record_menu"-->
<!-- name="WorkFollow Record"-->
<!-- parent="menu_soong_workflow_root"-->
<!-- action="soong_workflow_record_action"-->
<!-- sequence="3"/>-->
<record id="soong_workflow_record_action_reclaim" model="ir.actions.act_window">
<field name="name">工作流回收站</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">soong.workflow.record</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('users_ids', 'in', [uid]), ('reclaim_state', '=', True)]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('soong_workflow.soong_workflow_record_tree_restore')})]"/>
</record>
</data>
</odoo>
@@ -3,6 +3,7 @@
from odoo import fields, models, api
from odoo.exceptions import UserError, ValidationError
from datetime import datetime, date, time, timedelta
class SoongApprovalNoticeWizard(models.TransientModel):
@@ -13,7 +14,9 @@ class SoongApprovalNoticeWizard(models.TransientModel):
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")
@@ -112,11 +115,13 @@ class SoongWorkflowCommentWizard(models.TransientModel):
url = "https://oa.thtzjt.com/mail/view?model={}&res_id={}".format(self.res_model, record_id.id)
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title=record_id.name + "审批抄送提醒",
description="您有新的抄送提醒请及时查看",
url=url, btntxt="详细信息")
title=record_id._description,
description="您有新的抄送审批单 {} 请及时查看\n".format(
record_id.name) + self.env.user.name + ' ' + str(
fields.Datetime.now() + timedelta(hours=8)),
url=url, btntxt="查看详情")
partner_ids = self_node_id.employee_ids.user_id.partner_id.ids
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_users_data')
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_distribute')
# 转交逻辑--单线
if not self.node_link_len:
state = self.node_btn_id.node_id.out_link_ids.name.split('-> ')[-1]
@@ -126,23 +131,31 @@ class SoongWorkflowCommentWizard(models.TransientModel):
record_id.write({'state': 'end' if self.trans_link_id.name == '结束' else self.trans_link_id.name})
url = 'https://oa.thtzjt.com/mail/view?model={}&res_id={}'.format(self.res_model, self.res_id)
for employee in self.employee_ids:
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=employee.wecom_userid,
title=record_id.name,
description="您有新的审批单请及时处理",
url=url, btntxt="详情")
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="查看详情")
partner_ids = self.employee_ids.user_id.partner_id.ids
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_users_data')
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_distribute')
return self.node_btn_id.with_context(cx).run()
if self.node_btn_name == '退回':
record_id.write({'state': 'start' if self.return_link_id.name == '拟办' else self.return_link_id.name})
url = 'https://oa.thtzjt.com/mail/view?model={}&res_id={}'.format(self.res_model, self.res_id)
for employee in self.employee_ids:
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=employee.wecom_userid,
title=record_id.name,
description="您的审批单已被退回,请查看详情",
url=url, btntxt="详情")
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="查看详情")
partner_ids = self.employee_ids.user_id.partner_id.ids
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_users_data')
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_soong_workflow_distribute')
return self.node_btn_id.with_context(cx).run()
# 填写审批记录
if self.node_btn_name != '加签':
@@ -156,12 +169,13 @@ class SoongWorkflowCommentWizard(models.TransientModel):
for employee in self.circulated_employee_ids:
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title=record_id.name,
description="传阅审批单,请知晓",
url=url, btntxt="详情")
title=record_id._description,
description="您有新的传阅审批单 {} 请及时查看\n".format(
record_id.name) + self.env.user.name + ' ' + str(
fields.Datetime.now() + timedelta(hours=8)),
url=url, btntxt="查看详情")
partner_ids = self.circulated_employee_ids.user_id.partner_id.ids
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids,'soong_workflow.message_soong_workflow_users_data')
self.with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids,'soong_workflow.message_soong_workflow_distribute')
if self.employee_ids:
state = self.node_btn_id.node_id.out_link_ids.name.split('-> ')[-1]
record_id.write({'state': 'end' if state == '结束' else state})
@@ -9,6 +9,7 @@
<field name="arch" type="xml">
<form string="意见">
<group invisible="node_btn_name == '分发'">
<field name="comment_note_id"/>
<field name="node_btn_id" invisible="1"/>
<field name="node_btn_name" invisible="1"/>
<field name="node_link_len" invisible="1"/>
@@ -18,7 +19,6 @@
<field name="return_link_id" invisible="node_btn_name != '退回'" string="退回节点"/>
<!-- 转交人员 -->
<field name="trans_link_id" invisible="not node_link_len" string="转交节点"/>
<field name="comment_note_id"/>
<field name="employee_ids" widget="many2many_tags" string="人员范围"/>
</group>
<group string="流程选择" invisible="node_btn_name != '分发'">
@@ -32,7 +32,7 @@ class YuthonOfficialIncomingParty(models.Model):
string="状态", default='drft')
deadline = fields.Date(string="办理期限")
red_suit = fields.Char(string="套红")
official_documents_ids = fields.Many2many('documents.document', string="附件")
official_documents_ids = fields.Many2many('ir.attachment', string="附件")
is_issues = fields.Boolean(string="是否上会")
related_issues_id = fields.Many2one('issue.library', string="关联议题")
+1 -1
View File
@@ -34,7 +34,7 @@ class YuthonOfficial(models.Model):
is_official_incoming = fields.Boolean(string="是否收文")
red_suit = fields.Char(string="套红")
official_documents_ids = fields.Many2many('documents.document', string="发文附件")
official_documents_ids = fields.Many2many('ir.attachment', string="附件")
is_supervising = fields.Boolean(string="是否督办")
deadline = fields.Date(string="办理期限")
@@ -32,7 +32,7 @@ class YuthonOfficialIncomingLabor(models.Model):
string="状态", default='drft')
deadline = fields.Date(string="办理期限")
red_suit = fields.Char(string="套红")
official_documents_ids = fields.Many2many('documents.document', string="附件")
official_documents_ids = fields.Many2many('ir.attachment', string="附件")
is_issues = fields.Boolean(string="是否上会")
related_issues_id = fields.Many2one('issue.library', string="关联议题")
@@ -6,7 +6,7 @@ from odoo.exceptions import ValidationError, UserError
class YuthonOfficialIncomingNormal(models.Model):
_name = 'yuthon.official.incoming.normal'
_description = '行政收文'
_inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_rec_name = 'name'
name = fields.Char(string="标题")
@@ -37,7 +37,7 @@ class YuthonOfficialIncomingNormal(models.Model):
deadline = fields.Date(string="办理期限")
done_date = fields.Date(string="完成时间")
is_official_incoming = fields.Boolean(string="是否收文")
official_documents_ids = fields.Many2many('documents.document', string="附件")
official_documents_ids = fields.Many2many('ir.attachment', string="附件")
workflow_inspector_ids = fields.One2many('soong.workflow.inspector', 'incoming_normal_id', string="督办事项")
room_booking_ids = fields.One2many('room.booking', 'incoming_normal_id', string="会议关联")
@@ -12,24 +12,17 @@ class YuthonOfficialLabor(models.Model):
name = fields.Char(string="名称")
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('official_code'))
official_type_id = fields.Many2one('official.type', string="公文种类")
# official_type = fields.Selection([('go', '发文'), ('come', '收文')], string="公文类型")
reference_cold = fields.Integer(string="公文字号")
major_event_category = fields.Integer(string="重大事项所属类别")
# official_partner_id = fields.Many2one('official.partner', string="来文单位")
remarks = fields.Char(string="备注事项")
main_text = fields.Html(string='正文')
# come_file_id = fields.Char(string="来文编号")
# incoming_file_id = fields.Char(string="收文编号")
main_flats = fields.Char(string="主送")
copy_flats = fields.Char(string="抄送")
servings_number = fields.Integer(string="份数")
# urgency = fields.Selection([('normal', '一般'), ('urgent', '紧急'), ('extra_urgent', '特急')], string="紧急程度")
# secret_level = fields.Selection([('normal', '一般'), ('urgent', '秘密'), ('secret', '机密'), ('so_secret', '绝密')],
# string="密级")
date = fields.Datetime(string="日期", default=fields.Datetime.now)
department_id = fields.Many2one('hr.department', string="申请人部门")
statu = fields.Selection([('drft', '草稿'), ('going', '执行中'), ('cancel', '已取消'), ('done', '已完成')],
string="状态", default='drft')
deadline = fields.Date(string="办理期限")
red_suit = fields.Char(string="套红")
official_documents_ids = fields.Many2many('documents.document', string="公文相关文件")
official_documents_ids = fields.Many2many('ir.attachment', string="附件")
@@ -36,6 +36,7 @@
<field name="secret_level"/>
<field name="is_issues"/>
<field name="related_issues_id" invisible="not is_issues"/>
<field name="remarks"/>
</group>
<group>
<field name="department_id"/>
@@ -46,9 +47,6 @@
<field name="date"/>
</group>
</group>
<group>
<field name="remarks"/>
</group>
</sheet>
</form>
</field>
@@ -30,6 +30,7 @@
<field name="time_date"/>
<field name="is_issues"/>
<field name="related_issues_id" invisible="not is_issues"/>
<field name="remarks"/>
</group>
<group>
<field name="code"/>
@@ -42,9 +43,6 @@
<field name="deadline" invisible="not is_supervising"/>
<field name="done_date" invisible="not is_supervising"/>
</group>
<group>
<field name="remarks"/>
</group>
</group>
<notebook>
<page string="督办事项" invisible="not is_supervising">
@@ -35,6 +35,7 @@
<field name="secret_level"/>
<field name="is_issues"/>
<field name="related_issues_id" invisible="not is_issues"/>
<field name="remarks"/>
</group>
<group>
<field name="date"/>
@@ -45,9 +46,6 @@
<field name="deadline"/>
</group>
</group>
<group>
<field name="remarks"/>
</group>
</sheet>
</form>
</field>
@@ -35,11 +35,7 @@
<field name="major_event_category"/>
<field name="date"/>
<field name="deadline"/>
<field name="official_documents_ids">
<tree>
<field name="name"/>
</tree>
</field>
<field name="official_documents_ids" widget="preview_many2many"/>
</group>
<group>
<field name="department_id"/>
@@ -43,11 +43,7 @@
<field name="copy_flats"/>
<field name="servings_number"/>
<field name="deadline"/>
<field name="official_documents_ids">
<tree>
<field name="name"/>
</tree>
</field>
<field name="official_documents_ids" widget="preview_many2many"/>
</group>
</group>
<group>
+26 -11
View File
@@ -135,17 +135,32 @@ class WeComApps(models.Model):
:return:
"""
wecom_app = self.sudo().env["wecom.apps.config"].search([("wecom_apps_type", "=", "message_send"), ("wecom_apps_category", "=", category)], limit=1).wecom_apps_id
data = {
'touser': user_id,
'msgtype': 'textcard',
'agentid': wecom_app.agent_id,
"textcard": {
"title": title,
"description": description,
"url": url,
"btntxt": btntxt
},
}
# 类型,标题
# 人名:时间
if category == 'oa':
data = {
'touser': user_id,
'msgtype': 'textcard',
'agentid': wecom_app.agent_id,
"textcard": {
"title": title,
"description": description,
"url": url,
"btntxt": btntxt
},
}
else:
data = {
'touser': user_id,
'msgtype': 'textcard',
'agentid': wecom_app.agent_id,
"textcard": {
"title": title,
"description": description,
"url": url,
"btntxt": btntxt
},
}
result_data = self.sync_function_api("message_send", "MESSAGE_SEND", data, category)
if result_data.get("errcode", None) == 0:
return True, result_data