Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
44f8c7da
提交
44f8c7da
authored
11月 27, 2024
作者:
刘擎阳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.优化自动推送
上级
9e26995e
显示空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
279 行增加
和
48 行删除
+279
-48
cc_bill_loading.py
ccs_base/models/cc_bill_loading.py
+53
-1
common_common.py
ccs_base/models/common_common.py
+9
-2
fetch_mail.py
ccs_base/models/fetch_mail.py
+4
-0
order_state_change_rule.py
ccs_base/models/order_state_change_rule.py
+6
-45
redis_connection.py
ccs_base/models/redis_connection.py
+52
-0
config.py
consumers/config.py
+48
-0
mail_push.py
consumers/mail_push.py
+57
-0
mail_push.conf
consumers/supervisord_conf/conf.d/mail_push.conf
+16
-0
supervisord.conf
consumers/supervisord_conf/supervisord.conf
+34
-0
没有找到文件。
ccs_base/models/cc_bill_loading.py
浏览文件 @
44f8c7da
...
@@ -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
):
...
...
ccs_base/models/common_common.py
浏览文件 @
44f8c7da
...
@@ -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
ccs_base/models/fetch_mail.py
浏览文件 @
44f8c7da
...
@@ -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
:
...
...
ccs_base/models/order_state_change_rule.py
浏览文件 @
44f8c7da
...
@@ -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
(
)
i
s_ok
=
bl_obj
.
callback_track
()
i
f
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
):
"""
"""
获取月份
获取月份
...
...
ccs_base/models/redis_connection.py
0 → 100644
浏览文件 @
44f8c7da
# -*- 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'
consumers/config.py
0 → 100644
浏览文件 @
44f8c7da
# 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
# )
consumers/mail_push.py
0 → 100644
浏览文件 @
44f8c7da
# 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
)
consumers/supervisord_conf/conf.d/mail_push.conf
0 → 100644
浏览文件 @
44f8c7da
[
program
:
mail_push_consumer_1
]
process_name
=%(
program_name
)
s_
%(
process_num
)
02
d
; 进程名称
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
=
20
MB
;
stdout
日志文件大小,默认
50
MB
stdout_logfile_backups
=
20
;
stdout
日志文件备份数
;
stdout
日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(
supervisord
会自动创建日志文件)
stdout_logfile
= /
var
/
log
/
supervisor
/
mail_push
.
log
consumers/supervisord_conf/supervisord.conf
0 → 100644
浏览文件 @
44f8c7da
;
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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论