Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组

    Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

    开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

    如果您登录系统碰到问题,请在微信公众号留言:

    odoo中有自带的实现后台主动通知客户端的功能嘛??

    Odoo 开发与实施交流
    2
    2
    287
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Q
      qiaogang 最后由 编辑

      我现在的项目需要定期检查商品的效期,然后低于某个值之后需要通知到客户端有弹窗提醒。我不清楚odoo有没有自带的后台主动通知客户端的功能。我本来是准备是用websocket试试的,结果有些问题,代码如下:

      import asyncio
      
      from tornado import websocket, web, ioloop
      import logging
      import threading
      
      _logger = logging.getLogger(__name__)
      
      
      class EchoWebSocket(websocket.WebSocketHandler):
          live_web_sockets = set()
      
          def check_origin(self, origin):
              return True
      
          def open(self):
              _logger.info("连接打开")
              self.set_nodelay(True)
              self.live_web_sockets.add(self)
              self.write_message("你已经连接上WS服务")
      
          def on_message(self, message):
              self.write_message(u"你发送的数据: " + message)
      
          @classmethod
          def send_message(cls, message):
              removable = set()
              for ws in cls.live_web_sockets:
                  if not ws.ws_connection or not ws.ws_connection.stream.socket:
                      removable.add(ws)
                  else:
                      ws.write_message(message)
              for ws in removable:
                  cls.live_web_sockets.remove(ws)
      
          def on_close(self):
              _logger.info("连接关闭")
      
      
      class WebSocketServer(threading.Thread):
          def run(self) -> None:
              asyncio.set_event_loop(asyncio.new_event_loop())
              application = web.Application([
                  (r'/websocket', EchoWebSocket)
              ])
              application.listen(8888)
              ioloop.IOLoop.instance().start()
      
      
      WebSocketServer().start()
      
      

      然后在编写了检查效期的方法:

      import datetime
      
      from odoo import models, fields, api
      from .socketserver import EchoWebSocket
      
      
      class CronJob(models.Model):
          _inherit = "cron.job"
      
          def check_endvalidate(self):
              """
              近效期查询弹窗提示
              :return:
              """
              records = self.env['bicon_press_doc_v'].search([])
              for record in records:
                  endvalidate = record.endvalidate
                  now = datetime.date.today()
                  limit = self.env['sys.params'].search([('key', '=', 'endvalidate_limit')]).value
                  if (endvalidate - now).days < int(limit):
                      EchoWebSocket.send_message('存在近效期小于一年的商品,请前往业务大厅中的药品近效期促销表中查看!')
      

      js中就在右上角的UserMenu中添加了如下代码占时测试:

      var host = "ws://" + window.location.hostname + ":8888/websocket";
              var ws = new WebSocket(host);
              ws.onmessage = function (evt) {
                  alert(evt.data);
              };
      

      之后页面打开会有你已经连接上WS服务的弹窗提醒,说明websocket是连接上的,然后,在odoo自带的定时器中设置定时执行check_endvalidate方法后就会报错:ValueError: <class 'RuntimeError'>: "There is no current event loop in thread 'odoo.service.cron.cron0'." while evaluating
      'model.check_endvalidate()'
      我很懵逼呀!
      所以想问下odoo自带的有没有后台主动通知客户端的功能,我需要定时执行一些逻辑后通知页面。希望各位大佬指点一哈!!!

      1 条回复 最后回复 回复 引用 0
      • 卓忆
        卓忆 最后由 卓忆 编辑

        有几种方式,
        一:
        Odoo可以使用Automated Actions 来实现邮件通知等,
        而且 非常的灵活,
        可以参考:https://www.odoo.net.cn/topic/4569/休假申请自动邮件通知/3

        还有:https://www.cnblogs.com/odoouse/p/4690369.html

        二:还有种,就是参考 calendar 中的Remind 写法,这个可以浏览器弹窗(浏览器需要允许下),
        odoo apps 里面搜v12的 remind : http://www.odoo.com/apps/modules/browse/page/2?search=remind&series=12.0 给您参考下;

        三:Odoo11 开始,又多了个 Activities ;

        恬淡

        1 条回复 最后回复 回复 引用 0
        • First post
          Last post