提交 44f8c7da authored 作者: 刘擎阳's avatar 刘擎阳

1.优化自动推送

上级 9e26995e
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import ast import ast
import base64 import base64
import re import re
from datetime import timedelta from datetime import timedelta, datetime
from pygtrans import Translate from pygtrans import Translate
import xlrd import xlrd
import pytz import pytz
...@@ -898,6 +898,58 @@ class CcBL(models.Model): ...@@ -898,6 +898,58 @@ class CcBL(models.Model):
# 定义清关国家,关联到国家字段 # 定义清关国家,关联到国家字段
cc_country_id = fields.Many2one('res.country', string='CC Country') cc_country_id = fields.Many2one('res.country', string='CC Country')
def push_clear_customs_start(self, utc_time):
# 创建向导
push_node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_start')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)], order='seq desc',
limit=1)
vals = {
'bl_id': self.id,
'bl_count': 1,
'current_status': node_obj.id,
'update_status': push_node_obj.id,
'process_time': utc_time,
'is_ok': True
}
wizard_obj = self.env['batch.input.ship.package.status.wizard'].sudo().create(vals)
wizard_obj.change_ship_package_ids()
wizard_obj = wizard_obj.with_context(dict(self._context, active_id=self.id))
wizard_obj.submit()
def push_clear_customs_end(self, utc_time):
# 创建向导
push_node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_finished')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)],
order='seq desc',
limit=1)
vals = {
'bl_id': self.id,
'bl_count': 1,
'current_status': node_obj.id,
'update_status': push_node_obj.id,
'process_time': utc_time,
'is_ok': True
}
wizard_obj = self.env['batch.input.ship.package.status.wizard'].sudo().create(vals)
wizard_obj.change_ship_package_ids()
wizard_obj = wizard_obj.with_context(dict(self._context, active_id=self.id))
# print(wizard_obj.get_order())
wizard_obj.submit()
def mail_auto_push(self, mail_time):
for item in self:
try:
utc_time = datetime.strptime(mail_time, "%Y-%m-%d %H:%M:%S")
before_min = self.env['ir.config_parameter'].sudo().get_param('before_min') or 20
before_utc_time = utc_time - timedelta(minutes=int(before_min))
item.push_clear_customs_start(before_utc_time)
is_ok = item.callback_track()
if is_ok:
item.push_clear_customs_end(utc_time)
item.callback_track()
except Exception as err:
logging.error('fetch_mail_dlv--error:%s' % str(err))
# 增加一个清关进度的业务对象,继承自models.Model, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人 # 增加一个清关进度的业务对象,继承自models.Model, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人
class CcProgress(models.Model): class CcProgress(models.Model):
......
...@@ -3,9 +3,9 @@ import datetime ...@@ -3,9 +3,9 @@ import datetime
import re import re
from odoo import fields, models, exceptions, api, tools from odoo import fields, models, exceptions, api, tools
import logging import logging
from .redis_connection import redis_connection
__author__ = 'zd' __author__ = 'zd'
r = redis_connection()
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -22,3 +22,10 @@ class CommonCommon(models.Model): ...@@ -22,3 +22,10 @@ class CommonCommon(models.Model):
d = dt + datetime.timedelta(hours=8) d = dt + datetime.timedelta(hours=8)
nTime = d.strftime("%Y-%m-%d %H:%M:%S") nTime = d.strftime("%Y-%m-%d %H:%M:%S")
return nTime return nTime
def get_redis(self):
"""
连接redis
:return:
"""
return r
...@@ -152,8 +152,12 @@ class FetchmailServer(models.Model): ...@@ -152,8 +152,12 @@ class FetchmailServer(models.Model):
server.name, e, exc_info=True) server.name, e, exc_info=True)
finally: finally:
if imap_server: if imap_server:
try:
imap_server.close() imap_server.close()
imap_server.logout() imap_server.logout()
except OSError:
_logger.warning('Failed to properly finish imap connection: %s.', server.name,
exc_info=True)
elif server.server_type == 'pop': elif server.server_type == 'pop':
try: try:
while True: while True:
......
...@@ -5,6 +5,7 @@ from datetime import datetime ...@@ -5,6 +5,7 @@ from datetime import datetime
from odoo import models, fields, api, _ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, Warning from odoo.exceptions import ValidationError, Warning
import logging import logging
import json
import re import re
import demjson import demjson
from datetime import datetime, timedelta from datetime import datetime, timedelta
...@@ -94,8 +95,6 @@ class OrderStateChangeRule(models.Model): ...@@ -94,8 +95,6 @@ class OrderStateChangeRule(models.Model):
local_time = datetime.strptime(date_str, "%Y-%m-%d %H:%M") local_time = datetime.strptime(date_str, "%Y-%m-%d %H:%M")
# 调整时区 # 调整时区
utc_time = local_time - timedelta(hours=timezone_offset) utc_time = local_time - timedelta(hours=timezone_offset)
before_min = self.env['ir.config_parameter'].sudo().get_param('before_min') or 20
before_utc_time = utc_time - timedelta(minutes=int(before_min))
sql = "select id from cc_bl where UPPER(REPLACE(REPLACE(REPLACE(bl_no, ' ', ''), '-', ''), '/', '')) = '{0}' " \ sql = "select id from cc_bl where UPPER(REPLACE(REPLACE(REPLACE(bl_no, ' ', ''), '-', ''), '/', '')) = '{0}' " \
"and transport_tool_name='{1}' order by create_date desc limit 1".format(order_no.replace(' ', '').replace('-', '').replace('/', ''), voyage_name) "and transport_tool_name='{1}' order by create_date desc limit 1".format(order_no.replace(' ', '').replace('-', '').replace('/', ''), voyage_name)
self._cr.execute(sql) self._cr.execute(sql)
...@@ -104,52 +103,14 @@ class OrderStateChangeRule(models.Model): ...@@ -104,52 +103,14 @@ class OrderStateChangeRule(models.Model):
# bl_obj = self.env['cc.bl'].sudo().search([('bl_no', '=', order_no), ('transport_tool_name', '=', voyage_name)], order='create_date desc', limit=1) # bl_obj = self.env['cc.bl'].sudo().search([('bl_no', '=', order_no), ('transport_tool_name', '=', voyage_name)], order='create_date desc', limit=1)
bl_obj = self.env['cc.bl'].sudo().search([('id', '=', result[0][0])]) if result else False bl_obj = self.env['cc.bl'].sudo().search([('id', '=', result[0][0])]) if result else False
if bl_obj and bl_obj.state != 'done': if bl_obj and bl_obj.state != 'done':
self.push_clear_customs_start(bl_obj, before_utc_time) redis_conn = self.env['common.common'].sudo().get_redis()
is_ok = bl_obj.callback_track() if redis_conn == 'no':
if is_ok: raise ValidationError('未连接redis')
self.push_clear_customs_end(bl_obj, utc_time) else:
bl_obj.callback_track() redis_conn.lpush('mail_push_package_list', json.dumps({'id': bl_obj.id, 'utc_time': utc_time.strftime("%Y-%m-%d %H:%M:%S")}))
except Exception as err: except Exception as err:
logging.error('fetch_mail_dlv--error:%s' % str(err)) logging.error('fetch_mail_dlv--error:%s' % str(err))
def push_clear_customs_start(self, order, utc_time):
# 创建向导
push_node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_start')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)], order='seq desc',
limit=1)
vals = {
'bl_id': order.id,
'bl_count': 1,
'current_status': node_obj.id,
'update_status': push_node_obj.id,
'process_time': utc_time,
'is_ok': True
}
wizard_obj = self.env['batch.input.ship.package.status.wizard'].sudo().create(vals)
wizard_obj.change_ship_package_ids()
wizard_obj = wizard_obj.with_context(dict(self._context, active_id=order.id))
wizard_obj.submit()
def push_clear_customs_end(self, order, utc_time):
# 创建向导
push_node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('tk_code', '=', 'cb_imcustoms_finished')], limit=1)
node_obj = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('seq', '<', push_node_obj.seq)],
order='seq desc',
limit=1)
vals = {
'bl_id': order.id,
'bl_count': 1,
'current_status': node_obj.id,
'update_status': push_node_obj.id,
'process_time': utc_time,
'is_ok': True
}
wizard_obj = self.env['batch.input.ship.package.status.wizard'].sudo().create(vals)
wizard_obj.change_ship_package_ids()
wizard_obj = wizard_obj.with_context(dict(self._context, active_id=order.id))
# print(wizard_obj.get_order())
wizard_obj.submit()
def calc_date(self, pick_date_text): def calc_date(self, pick_date_text):
""" """
获取月份 获取月份
......
# -*- coding: utf-8 -*-
from odoo.tools import config
import redis
import logging
import psycopg2
_logger = logging.getLogger(__name__)
def redis_connection():
# 连接redis
redis_config = config.misc.get("redis", {})
if redis_config:
try:
redis_options = dict(
host=redis_config.get('redis_host'),
port=redis_config.get('redis_port'),
password=redis_config.get('password'),
decode_responses=True,
db=redis_config.get('db'),
)
pool = redis.ConnectionPool(**redis_options)
r = redis.Redis(connection_pool=pool)
return r
except Exception as e:
_logger.error(u'连接redis失败,原因:%s' % str(e))
return 'no'
else:
_logger.error(u'conf文件中未配置redis连接信息')
return 'no'
# def yhj_psql_connection():
# # 连接yhj数据库
# yhj_config = config.misc.get("yhj", {})
# if yhj_config:
# try:
# db_ip = yhj_config.get('db_ip')
# db_port = yhj_config.get('db_port')
# database = yhj_config.get('db_name')
# password = yhj_config.get('db_password')
# username = yhj_config.get('db_user')
# psql_connection = psycopg2.connect(user=username, password=password, dbname=database, host=db_ip,
# port=db_port)
# # psql_cur = psql_connection.cursor()
# return psql_connection
# except Exception as e:
# _logger.error(u'连接yhj数据库失败,原因:%s' % str(e))
# return 'no'
# else:
# _logger.error(u'conf文件中未配置yhj数据库连接信息')
# return 'no'
# coding=utf-8
# 本地
db_ip = "127.0.0.1"
db_port = "8888"
db_name = "hh_ccs_test"
db_user = "admin"
db_password = "admin"
redis_options = dict(
host='127.0.0.1',
port=6379,
# password='topodoo1314',
decode_responses=True,
db=0
)
# 测试
# db_ip = "121.199.167.133"
# db_port = "8369"
# db_name = "airorder0309"
# db_user = "admin"
# db_password = "123123"
#
# redis_options = dict(
# host='172.18.0.6',
# port=6379,
# # password='top123',
# decode_responses=True,
# db=3
# )
# product
# db_ip = "172.18.183.214"
# db_port = "9169"
# db_name = "air_order"
# db_user = "admin"
# db_password = "YHB1408ups"
#
# redis_options = dict(
# host='172.18.183.214',
# port=32768,
# password='top123',
# decode_responses=True,
# db=3
# )
# coding=utf-8
import json
import logging
import redis
import time
import requests
import odoorpc
from requests.adapters import HTTPAdapter
from datetime import datetime
import config
# 默认字符gbk
# logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO)
# 设置文件字符为utf-8
logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
class Order_dispose(object):
def __init__(self):
# rpc连接
self.odoo_db = odoorpc.ODOO(config.db_ip, port=config.db_port)
self.odoo_db.login(config.db_name, config.db_user, config.db_password)
def order_data(self, data):
res_data = []
try:
data = json.loads(data)
logging.info('mail_push_data: %s', data)
bl_obj = self.odoo_db.env['cc.bl']
bl_record = bl_obj.browse(data['id'])
# utc_time = datetime.strptime(data['utc_time'], "%Y-%m-%d %H:%M:%S")
utc_time = data['utc_time']
bl_record.mail_auto_push(utc_time)
except Exception as ex:
logging.error('mail_auto_push error:%s' % str(ex))
return res_data
try:
pool = redis.ConnectionPool(**config.redis_options)
r = redis.Redis(connection_pool=pool)
logging.info(u'redis连接成功')
Order_dispose = Order_dispose()
while 1:
try:
result = r.brpop('mail_push_package_list', 0)
data1 = result[1]
response_data = Order_dispose.order_data(data1)
except Exception as e:
logging.error(e)
continue
except Exception as e:
logging.error("登录失败")
logging.error(e)
[program:mail_push_consumer_1]
process_name=%(program_name)s_%(process_num)02d ; 进程名称
directory = /mnt/extra-addons ; 程序的启动目录
command = /usr/bin/python3 /mnt/extra-addons/mail_push.py ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
numprocs=1 ; 进程数
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/supervisor/mail_push.log
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[inet_http_server]
port=9001
username=admin
password=admin
[include]
files = /mnt/extra-addons/supervisord_conf/conf.d/*.conf
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论