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

1.优化自动推送

上级 9e26995e
......@@ -2,7 +2,7 @@
import ast
import base64
import re
from datetime import timedelta
from datetime import timedelta, datetime
from pygtrans import Translate
import xlrd
import pytz
......@@ -898,6 +898,58 @@ class CcBL(models.Model):
# 定义清关国家,关联到国家字段
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, 用于管理业务数据.业务数据包括提单号、清关节点(业务对象)、进度日期、进度描述、更新人
class CcProgress(models.Model):
......
......@@ -3,9 +3,9 @@ import datetime
import re
from odoo import fields, models, exceptions, api, tools
import logging
from .redis_connection import redis_connection
__author__ = 'zd'
r = redis_connection()
_logger = logging.getLogger(__name__)
......@@ -22,3 +22,10 @@ class CommonCommon(models.Model):
d = dt + datetime.timedelta(hours=8)
nTime = d.strftime("%Y-%m-%d %H:%M:%S")
return nTime
def get_redis(self):
"""
连接redis
:return:
"""
return r
......@@ -152,8 +152,12 @@ class FetchmailServer(models.Model):
server.name, e, exc_info=True)
finally:
if imap_server:
imap_server.close()
imap_server.logout()
try:
imap_server.close()
imap_server.logout()
except OSError:
_logger.warning('Failed to properly finish imap connection: %s.', server.name,
exc_info=True)
elif server.server_type == 'pop':
try:
while True:
......
......@@ -5,6 +5,7 @@ from datetime import datetime
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, Warning
import logging
import json
import re
import demjson
from datetime import datetime, timedelta
......@@ -94,8 +95,6 @@ class OrderStateChangeRule(models.Model):
local_time = datetime.strptime(date_str, "%Y-%m-%d %H:%M")
# 调整时区
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}' " \
"and transport_tool_name='{1}' order by create_date desc limit 1".format(order_no.replace(' ', '').replace('-', '').replace('/', ''), voyage_name)
self._cr.execute(sql)
......@@ -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([('id', '=', result[0][0])]) if result else False
if bl_obj and bl_obj.state != 'done':
self.push_clear_customs_start(bl_obj, before_utc_time)
is_ok = bl_obj.callback_track()
if is_ok:
self.push_clear_customs_end(bl_obj, utc_time)
bl_obj.callback_track()
redis_conn = self.env['common.common'].sudo().get_redis()
if redis_conn == 'no':
raise ValidationError('未连接redis')
else:
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:
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):
"""
获取月份
......
# -*- 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论