From 4f8f29e41a7247aebcd9914e7e6db01d0df53503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Thu, 19 Sep 2024 17:56:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jikimo_message_notify/__init__.py | 1 + jikimo_message_notify/__manifest__.py | 25 + jikimo_message_notify/models/__init__.py | 5 + .../models/jikimo_message_bussiness_node.py | 16 + .../models/jikimo_message_dispatch.py | 105 +++ .../models/jikimo_message_queue.py | 19 + .../models/jikimo_message_template.py | 58 ++ .../security/group_security.xml | 5 + .../security/ir.model.access.csv | 23 + .../views/sf_message_template_view.xml | 80 +++ jikimo_sale_order_message_notify/__init__.py | 1 + .../__manifest__.py | 26 + .../data/bussiness_node.xml | 9 + .../models/__init__.py | 2 + .../models/jikimo_message_template.py | 10 + .../models/sale_order.py | 11 + .../security/group_security.xml | 5 + .../security/ir.model.access.csv | 6 + .../views/sf_message_template_view.xml | 76 +++ sg_wechat_enterprise/.gitignore | 138 ---- sg_wechat_enterprise/__init__.py | 3 - sg_wechat_enterprise/__manifest__.py | 52 -- .../controllers/WXBizMsgCrypt.py | 273 -------- sg_wechat_enterprise/controllers/__init__.py | 3 - sg_wechat_enterprise/controllers/ierror.py | 20 - .../controllers/wechat_enterprise.py | 231 ------- sg_wechat_enterprise/data/data.xml | 16 - sg_wechat_enterprise/demo/we_config_demo.xml | 13 - sg_wechat_enterprise/models/__init__.py | 9 - .../models/client/__init__.py | 11 - .../models/client/api/__init__.py | 2 - .../models/client/api/jkm_oauth.py | 53 -- .../models/client/api/jkm_user.py | 21 - sg_wechat_enterprise/models/mail.py | 121 ---- sg_wechat_enterprise/models/res_users.py | 26 - sg_wechat_enterprise/models/we_app.py | 213 ------ sg_wechat_enterprise/models/we_conf.py | 62 -- .../models/we_receive_message.py | 143 ---- .../models/we_receive_message_process.py | 109 --- .../models/we_send_message.py | 108 --- sg_wechat_enterprise/models/we_tools.py | 89 --- sg_wechat_enterprise/requirements.txt | 1 - .../security/ir.model.access.csv | 13 - sg_wechat_enterprise/static/css/loading.css | 24 - .../static/description/icon.png | Bin 1660 -> 0 bytes .../static/description/qyh.png | Bin 3406 -> 0 bytes .../static/js/url_transfers.js | 26 - sg_wechat_enterprise/tests/__init__.py | 1 - sg_wechat_enterprise/views/app_view.xml | 84 --- sg_wechat_enterprise/views/mail_view.xml | 23 - sg_wechat_enterprise/views/menu_view.xml | 34 - sg_wechat_enterprise/views/res_users_view.xml | 20 - sg_wechat_enterprise/views/we_app_view.xml | 149 ----- sg_wechat_enterprise/views/we_config_view.xml | 48 -- sg_wechat_enterprise/views/we_menu.xml | 38 -- .../views/we_message_process_view.xml | 70 -- .../views/we_receive_message_view.xml | 98 --- .../views/we_send_message_view.xml | 105 --- sg_wechat_enterprise/views/we_templates.xml | 45 -- sg_wechat_enterprise/we_api/__init__.py | 33 - sg_wechat_enterprise/we_api/_compat.py | 21 - .../we_api/client/__init__.py | 140 ---- .../we_api/client/api/__init__.py | 23 - .../we_api/client/api/base.py | 29 - .../we_api/client/api/card.py | 431 ------------ .../we_api/client/api/customservice.py | 242 ------- .../we_api/client/api/datacube.py | 360 ---------- .../we_api/client/api/device.py | 284 -------- .../we_api/client/api/group.py | 148 ----- .../we_api/client/api/jsapi.py | 58 -- .../we_api/client/api/material.py | 167 ----- .../we_api/client/api/media.py | 126 ---- .../we_api/client/api/menu.py | 235 ------- .../we_api/client/api/merchant/__init__.py | 72 -- .../we_api/client/api/merchant/category.py | 30 - .../we_api/client/api/merchant/common.py | 17 - .../we_api/client/api/merchant/express.py | 48 -- .../we_api/client/api/merchant/group.py | 60 -- .../we_api/client/api/merchant/order.py | 52 -- .../we_api/client/api/merchant/shelf.py | 50 -- .../we_api/client/api/merchant/stock.py | 26 - .../we_api/client/api/message.py | 572 ---------------- .../we_api/client/api/misc.py | 51 -- sg_wechat_enterprise/we_api/client/api/poi.py | 97 --- .../we_api/client/api/qrcode.py | 87 --- .../we_api/client/api/scan.py | 171 ----- .../we_api/client/api/semantic.py | 59 -- .../we_api/client/api/shakearound.py | 376 ----------- .../we_api/client/api/template.py | 45 -- .../we_api/client/api/user.py | 143 ---- .../we_api/client/api/wifi.py | 195 ------ sg_wechat_enterprise/we_api/client/base.py | 251 ------- sg_wechat_enterprise/we_api/component.py | 431 ------------ .../we_api/crypto/__init__.py | 120 ---- sg_wechat_enterprise/we_api/crypto/base.py | 52 -- .../we_api/crypto/cryptography.py | 23 - sg_wechat_enterprise/we_api/crypto/pkcs7.py | 23 - .../we_api/crypto/pycrypto.py | 15 - .../we_api/enterprise/__init__.py | 7 - .../we_api/enterprise/client/__init__.py | 44 -- .../we_api/enterprise/client/api/__init__.py | 18 - .../we_api/enterprise/client/api/agent.py | 71 -- .../we_api/enterprise/client/api/batch.py | 134 ---- .../we_api/enterprise/client/api/chat.py | 273 -------- .../enterprise/client/api/department.py | 117 ---- .../we_api/enterprise/client/api/jsapi.py | 48 -- .../we_api/enterprise/client/api/material.py | 201 ------ .../we_api/enterprise/client/api/media.py | 73 -- .../we_api/enterprise/client/api/menu.py | 43 -- .../we_api/enterprise/client/api/message.py | 161 ----- .../we_api/enterprise/client/api/misc.py | 15 - .../we_api/enterprise/client/api/oauth.py | 51 -- .../we_api/enterprise/client/api/service.py | 45 -- .../enterprise/client/api/shakearound.py | 25 - .../we_api/enterprise/client/api/tag.py | 61 -- .../we_api/enterprise/client/api/user.py | 160 ----- .../we_api/enterprise/crypto.py | 46 -- .../we_api/enterprise/events.py | 163 ----- .../we_api/enterprise/exceptions.py | 9 - .../we_api/enterprise/messages.py | 50 -- .../we_api/enterprise/parser.py | 21 - .../we_api/enterprise/replies.py | 67 -- sg_wechat_enterprise/we_api/events.py | 629 ------------------ sg_wechat_enterprise/we_api/exceptions.py | 130 ---- sg_wechat_enterprise/we_api/fields.py | 237 ------- sg_wechat_enterprise/we_api/messages.py | 173 ----- sg_wechat_enterprise/we_api/oauth/__init__.py | 219 ------ sg_wechat_enterprise/we_api/parser.py | 47 -- sg_wechat_enterprise/we_api/pay/__init__.py | 199 ------ .../we_api/pay/api/__init__.py | 10 - sg_wechat_enterprise/we_api/pay/api/coupon.py | 82 --- sg_wechat_enterprise/we_api/pay/api/jsapi.py | 48 -- .../we_api/pay/api/micropay.py | 64 -- sg_wechat_enterprise/we_api/pay/api/order.py | 138 ---- .../we_api/pay/api/redpack.py | 125 ---- sg_wechat_enterprise/we_api/pay/api/refund.py | 61 -- sg_wechat_enterprise/we_api/pay/api/tools.py | 57 -- .../we_api/pay/api/transfer.py | 65 -- sg_wechat_enterprise/we_api/pay/base.py | 30 - sg_wechat_enterprise/we_api/pay/utils.py | 54 -- sg_wechat_enterprise/we_api/replies.py | 341 ---------- .../we_api/session/__init__.py | 23 - .../we_api/session/memcachedstorage.py | 35 - .../we_api/session/memorystorage.py | 20 - .../we_api/session/redisstorage.py | 35 - .../we_api/session/shovestorage.py | 34 - sg_wechat_enterprise/we_api/utils.py | 149 ----- 147 files changed, 483 insertions(+), 12766 deletions(-) create mode 100644 jikimo_message_notify/__init__.py create mode 100644 jikimo_message_notify/__manifest__.py create mode 100644 jikimo_message_notify/models/__init__.py create mode 100644 jikimo_message_notify/models/jikimo_message_bussiness_node.py create mode 100644 jikimo_message_notify/models/jikimo_message_dispatch.py create mode 100644 jikimo_message_notify/models/jikimo_message_queue.py create mode 100644 jikimo_message_notify/models/jikimo_message_template.py create mode 100644 jikimo_message_notify/security/group_security.xml create mode 100644 jikimo_message_notify/security/ir.model.access.csv create mode 100644 jikimo_message_notify/views/sf_message_template_view.xml create mode 100644 jikimo_sale_order_message_notify/__init__.py create mode 100644 jikimo_sale_order_message_notify/__manifest__.py create mode 100644 jikimo_sale_order_message_notify/data/bussiness_node.xml create mode 100644 jikimo_sale_order_message_notify/models/__init__.py create mode 100644 jikimo_sale_order_message_notify/models/jikimo_message_template.py create mode 100644 jikimo_sale_order_message_notify/models/sale_order.py create mode 100644 jikimo_sale_order_message_notify/security/group_security.xml create mode 100644 jikimo_sale_order_message_notify/security/ir.model.access.csv create mode 100644 jikimo_sale_order_message_notify/views/sf_message_template_view.xml delete mode 100644 sg_wechat_enterprise/.gitignore delete mode 100644 sg_wechat_enterprise/__init__.py delete mode 100644 sg_wechat_enterprise/__manifest__.py delete mode 100644 sg_wechat_enterprise/controllers/WXBizMsgCrypt.py delete mode 100644 sg_wechat_enterprise/controllers/__init__.py delete mode 100644 sg_wechat_enterprise/controllers/ierror.py delete mode 100644 sg_wechat_enterprise/controllers/wechat_enterprise.py delete mode 100644 sg_wechat_enterprise/data/data.xml delete mode 100644 sg_wechat_enterprise/demo/we_config_demo.xml delete mode 100644 sg_wechat_enterprise/models/__init__.py delete mode 100644 sg_wechat_enterprise/models/client/__init__.py delete mode 100644 sg_wechat_enterprise/models/client/api/__init__.py delete mode 100644 sg_wechat_enterprise/models/client/api/jkm_oauth.py delete mode 100644 sg_wechat_enterprise/models/client/api/jkm_user.py delete mode 100644 sg_wechat_enterprise/models/mail.py delete mode 100644 sg_wechat_enterprise/models/res_users.py delete mode 100644 sg_wechat_enterprise/models/we_app.py delete mode 100644 sg_wechat_enterprise/models/we_conf.py delete mode 100644 sg_wechat_enterprise/models/we_receive_message.py delete mode 100644 sg_wechat_enterprise/models/we_receive_message_process.py delete mode 100644 sg_wechat_enterprise/models/we_send_message.py delete mode 100644 sg_wechat_enterprise/models/we_tools.py delete mode 100644 sg_wechat_enterprise/requirements.txt delete mode 100644 sg_wechat_enterprise/security/ir.model.access.csv delete mode 100644 sg_wechat_enterprise/static/css/loading.css delete mode 100644 sg_wechat_enterprise/static/description/icon.png delete mode 100644 sg_wechat_enterprise/static/description/qyh.png delete mode 100644 sg_wechat_enterprise/static/js/url_transfers.js delete mode 100644 sg_wechat_enterprise/tests/__init__.py delete mode 100644 sg_wechat_enterprise/views/app_view.xml delete mode 100644 sg_wechat_enterprise/views/mail_view.xml delete mode 100644 sg_wechat_enterprise/views/menu_view.xml delete mode 100644 sg_wechat_enterprise/views/res_users_view.xml delete mode 100644 sg_wechat_enterprise/views/we_app_view.xml delete mode 100644 sg_wechat_enterprise/views/we_config_view.xml delete mode 100644 sg_wechat_enterprise/views/we_menu.xml delete mode 100644 sg_wechat_enterprise/views/we_message_process_view.xml delete mode 100644 sg_wechat_enterprise/views/we_receive_message_view.xml delete mode 100644 sg_wechat_enterprise/views/we_send_message_view.xml delete mode 100644 sg_wechat_enterprise/views/we_templates.xml delete mode 100644 sg_wechat_enterprise/we_api/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/_compat.py delete mode 100644 sg_wechat_enterprise/we_api/client/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/base.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/card.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/customservice.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/datacube.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/device.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/group.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/jsapi.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/material.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/media.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/menu.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/category.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/common.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/express.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/group.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/order.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/shelf.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/merchant/stock.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/message.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/misc.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/poi.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/qrcode.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/scan.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/semantic.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/shakearound.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/template.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/user.py delete mode 100644 sg_wechat_enterprise/we_api/client/api/wifi.py delete mode 100644 sg_wechat_enterprise/we_api/client/base.py delete mode 100644 sg_wechat_enterprise/we_api/component.py delete mode 100644 sg_wechat_enterprise/we_api/crypto/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/crypto/base.py delete mode 100644 sg_wechat_enterprise/we_api/crypto/cryptography.py delete mode 100644 sg_wechat_enterprise/we_api/crypto/pkcs7.py delete mode 100644 sg_wechat_enterprise/we_api/crypto/pycrypto.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/agent.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/batch.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/chat.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/department.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/jsapi.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/material.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/media.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/menu.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/message.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/misc.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/oauth.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/service.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/shakearound.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/tag.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/client/api/user.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/crypto.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/events.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/exceptions.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/messages.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/parser.py delete mode 100644 sg_wechat_enterprise/we_api/enterprise/replies.py delete mode 100644 sg_wechat_enterprise/we_api/events.py delete mode 100644 sg_wechat_enterprise/we_api/exceptions.py delete mode 100644 sg_wechat_enterprise/we_api/fields.py delete mode 100644 sg_wechat_enterprise/we_api/messages.py delete mode 100644 sg_wechat_enterprise/we_api/oauth/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/parser.py delete mode 100644 sg_wechat_enterprise/we_api/pay/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/coupon.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/jsapi.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/micropay.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/order.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/redpack.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/refund.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/tools.py delete mode 100644 sg_wechat_enterprise/we_api/pay/api/transfer.py delete mode 100644 sg_wechat_enterprise/we_api/pay/base.py delete mode 100644 sg_wechat_enterprise/we_api/pay/utils.py delete mode 100644 sg_wechat_enterprise/we_api/replies.py delete mode 100644 sg_wechat_enterprise/we_api/session/__init__.py delete mode 100644 sg_wechat_enterprise/we_api/session/memcachedstorage.py delete mode 100644 sg_wechat_enterprise/we_api/session/memorystorage.py delete mode 100644 sg_wechat_enterprise/we_api/session/redisstorage.py delete mode 100644 sg_wechat_enterprise/we_api/session/shovestorage.py delete mode 100644 sg_wechat_enterprise/we_api/utils.py diff --git a/jikimo_message_notify/__init__.py b/jikimo_message_notify/__init__.py new file mode 100644 index 00000000..9a7e03ed --- /dev/null +++ b/jikimo_message_notify/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/jikimo_message_notify/__manifest__.py b/jikimo_message_notify/__manifest__.py new file mode 100644 index 00000000..9af32625 --- /dev/null +++ b/jikimo_message_notify/__manifest__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': '机企猫智能工厂 消息提醒', + 'version': '1.0', + 'summary': '智能工厂消息提醒模块', + 'sequence': 1, + 'description': """ + + """, + 'category': 'sf', + 'website': 'https://www.sf.jikimo.com', + 'depends': ['base', 'sf_plan', 'sf_sale', 'wechat_enterprise_business_processing'], + 'data': [ + 'security/ir.model.access.csv', + 'views/sf_message_template_view.xml', + ], + 'test': [ + ], + 'license': 'LGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/jikimo_message_notify/models/__init__.py b/jikimo_message_notify/models/__init__.py new file mode 100644 index 00000000..04b9e069 --- /dev/null +++ b/jikimo_message_notify/models/__init__.py @@ -0,0 +1,5 @@ +from . import jikimo_message_template +from . import jikimo_message_queue +from . import jikimo_message_dispatch +from . import jikimo_message_bussiness_node + diff --git a/jikimo_message_notify/models/jikimo_message_bussiness_node.py b/jikimo_message_notify/models/jikimo_message_bussiness_node.py new file mode 100644 index 00000000..b24d4863 --- /dev/null +++ b/jikimo_message_notify/models/jikimo_message_bussiness_node.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +import logging +from odoo import models, fields, api +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + + +class JikimoMessageBussinessNode(models.Model): + _name = "jikimo.message.bussiness.node" + _description = '发送消息业务节点' + + name = fields.Char(string="节点名称") + model = fields.Char(string="模型") + + \ No newline at end of file diff --git a/jikimo_message_notify/models/jikimo_message_dispatch.py b/jikimo_message_notify/models/jikimo_message_dispatch.py new file mode 100644 index 00000000..ef6ac53c --- /dev/null +++ b/jikimo_message_notify/models/jikimo_message_dispatch.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +import logging +from odoo import models +from odoo import exceptions +from wechatpy.enterprise import WeChatClient +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + + +class JikimoMessageDispatch(models.AbstractModel): + _name = "jikimo.message.dispatch" + _description = '消息发送' + + def add_queue(self, bussiness_node, urgency="normal", **kwargs): + """ + 添加消息队列 + """ + bussiness_node_id = self.env["jikimo.message.bussiness.node"].search([ + ("model", "=", self._name), + ("name", "=", bussiness_node) + ]) + # 根据模型与紧急程度获取消息模板 + message_template_id = self.env["jikimo.message.template"].search([ + ("model", "=", self._name), + ("urgency", "=", urgency), + ("bussiness_node_id", "=", bussiness_node_id.id) + ]) + if not message_template_id: + _logger.warning(f"{self._name}消息推送模板未配置") + return False + + data_list = [] + for record in self: + data_list.append({ + 'res_id': record.id, + 'model': record._name, + 'message_template_id': message_template_id.id, + }) + return self.env["jikimo.message.queue"].create(data_list) + + def _merge_message_queue(self): + """ + 合并相同业务节点与相同模型的消息 + """ + pass + + def _get_message(self, message_queue_ids): + """ + 根据消息队列获取消息内容 + :param message_queue_ids: 消息队列ID列表 + :return: 消息内容 + """ + contents = [] + for message_queue_id in message_queue_ids: + content = message_queue_id.message_template_id.content + # 获取模板中带有{{}}的变量 + import re + variables = re.findall(r"{{[^{}]+}}", content) + if variables: + model_data = self.env[message_queue_id.model].browse(int(message_queue_id.res_id)) + for variable in variables: + # 获取变量对应的值 + variable_value = model_data[variable.strip("{{}}")] + # 将变量替换为值 + content = content.replace(variable, variable_value) + contents.append(content) + return contents + + def _send_message(self, message_content, we_user_list): + """ + 发送消息 + """ + enterprise = self.env['we.config'].search([('company_id', '=', 1)], limit=1) + if enterprise.odoo_app_id: + enterprise_app = self.env['we.app'].search([('agentid', '=', enterprise.odoo_app_id.agentid)]) + wechat = WeChatClient(corp_id=enterprise.corp_id, secret=enterprise_app.secret) + data = { + 'agentid': enterprise.odoo_app_id.agentid, + 'touser': we_user_list, + 'content': message_content + } + wechat.message.send_markdown(agent_id=data['agentid'], user_ids=data['touser'], content=data['content']) + else: + raise UserError('Odoo应用未配置. ') + + def _cron_dispatch(self): + """ + 定时发送消息 + """ + # 从消息队列中获取所有待发送消息的message_template_id + message_template_ids = self.env["jikimo.message.queue"].read_group([ + ("message_status", "=", "pending") + ], ['message_template_id'], ['message_template_id']) + # 根据模板类型来发送消息 + for message_template_id in message_template_ids[0]['message_template_id']: + message_queue_ids = self.env["jikimo.message.queue"].search([ + ("message_template_id", "=", message_template_id), + ("message_status", "=", "pending") + ]) + message_contents = self.env[message_queue_ids[0].message_template_id.model]._get_message(message_queue_ids) + # 发送消息 + for message_content in message_contents: + self._send_message(message_content, "HuYao") + return True \ No newline at end of file diff --git a/jikimo_message_notify/models/jikimo_message_queue.py b/jikimo_message_notify/models/jikimo_message_queue.py new file mode 100644 index 00000000..fe9defe4 --- /dev/null +++ b/jikimo_message_notify/models/jikimo_message_queue.py @@ -0,0 +1,19 @@ +from odoo import models, fields, api + +class JikimoMessageQueue(models.Model): + _name = "jikimo.message.queue" + _description = "消息队列" + + message_template_id = fields.Many2one("jikimo.message.template", string="消息模板") + res_id = fields.Text(string="单据ID") + model = fields.Char(String="模型") + message_status = fields.Selection([ + ("pending", "待发送"), + ("sent", "已发送"), + ("failed", "发送失败") + ], string="消息状态", default="pending") + message_error = fields.Text(string="错误信息") + send_date = fields.Datetime(string="创建时间") + message_updated_at = fields.Datetime(string="更新时间") + + diff --git a/jikimo_message_notify/models/jikimo_message_template.py b/jikimo_message_notify/models/jikimo_message_template.py new file mode 100644 index 00000000..d03c66b3 --- /dev/null +++ b/jikimo_message_notify/models/jikimo_message_template.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class JikimoMessageTemplate(models.Model): + _name = "jikimo.message.template" + _description = '消息模板' + + name = fields.Char(string="名称", required=True) + + description = fields.Char(string="描述") + content = fields.Html(string="内容", render_engine='qweb', translate=True, prefetch=True, sanitize=False) + msgtype = fields.Selection( + [('text', '文字'), ('markdown', 'Markdown')], '消息类型', + required=True, default='markdown') + notification_department_id = fields.Many2one('hr.department', '通知部门', required=True) + notification_employee_ids = fields.Many2many('hr.employee', string='员工', + domain="[('department_id', '=',notification_department_id)]", + required=True) + + urgency = fields.Selection([ + ("normal", "普通"), + ("urgent", "紧急"), + ("very_urgent", "非常紧急") + ], string="紧急程度") + active = fields.Boolean(string="是否有效", default=True) + + def _get_message_model(self): + """ + 获取通知的模型 + """ + return [] + + def _get_model(self): + return self.model + + model_id = fields.Many2one( + "ir.model", + string="关联模型", + domain=lambda self: [("model", "in", self._get_message_model())] + ) + model = fields.Char(related="model_id.model", index=True, store=True) + bussiness_node_id = fields.Many2one( + "jikimo.message.bussiness.node", + string="业务节点", + domain=lambda self: [("model", "=", self.model)], + required=True + ) + + @api.onchange('notification_department_id') + def _clear_employee_ids(self): + if self.notification_department_id: + self.notification_employee_ids = False + + def test_send_message(self): + self.env["jikimo.message.dispatch"]._cron_dispatch() + + \ No newline at end of file diff --git a/jikimo_message_notify/security/group_security.xml b/jikimo_message_notify/security/group_security.xml new file mode 100644 index 00000000..fdbc3ae5 --- /dev/null +++ b/jikimo_message_notify/security/group_security.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jikimo_message_notify/security/ir.model.access.csv b/jikimo_message_notify/security/ir.model.access.csv new file mode 100644 index 00000000..4011baed --- /dev/null +++ b/jikimo_message_notify/security/ir.model.access.csv @@ -0,0 +1,23 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_jikimo_message_template_group_sale_salemanager,jikimo_message_template,model_jikimo_message_template,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_template_group_purchase,jikimo_message_template,model_jikimo_message_template,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_template_group_sf_stock_user,jikimo_message_template,model_jikimo_message_template,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_template_group_sf_order_user,jikimo_message_template,model_jikimo_message_template,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_template_group_sf_tool_user,jikimo_message_template,model_jikimo_message_template,sf_base.group_sf_tool_user,1,1,1,0 + +access_jikimo_message_bussiness_node_group_sale_salemanager,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_bussiness_node_group_purchase,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_bussiness_node_group_sf_stock_user,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_bussiness_node_group_sf_order_user,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_bussiness_node_group_sf_tool_user,jikimo_message_bussiness_node,model_jikimo_message_bussiness_node,sf_base.group_sf_tool_user,1,1,1,0 + +access_jikimo_message_queue_group_sale_salemanager,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sale_salemanager,1,1,1,0 +access_jikimo_message_queue_group_purchase,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_purchase,1,1,1,0 +access_jikimo_message_queue_group_sf_stock_user,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sf_stock_user,1,1,1,0 +access_jikimo_message_queue_group_sf_order_user,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sf_order_user,1,1,1,0 +access_jikimo_message_queue_group_sf_tool_user,jikimo_message_queue,model_jikimo_message_queue,sf_base.group_sf_tool_user,1,1,1,0 + + + + + diff --git a/jikimo_message_notify/views/sf_message_template_view.xml b/jikimo_message_notify/views/sf_message_template_view.xml new file mode 100644 index 00000000..ec8243ce --- /dev/null +++ b/jikimo_message_notify/views/sf_message_template_view.xml @@ -0,0 +1,80 @@ + + + + + + + + sf.message.template.view.form + jikimo.message.template + +
+ +
+
+ + + + + + + + + + + +