提交 351a9d6e authored 作者: 刘擎阳's avatar 刘擎阳

1.服务提交

上级 e2472b49
......@@ -41,6 +41,7 @@ _logger = logging.getLogger(__name__)
@api.route('/temu/create/order', methods=['post'])
# @check_customer
def temu_create_order():
"""创建订单"""
res = {
"success": True,
"errorCode": 0,
......@@ -91,74 +92,102 @@ def temu_create_order():
@api.route('/temu/update/order', methods=['post'])
# @check_customer
def temu_update_order():
"""更新订单"""
# 接收提单信息、大包与小包的关联信息
res = {
"code": 0,
"msg": "success",
"success": True,
"errorCode": 0,
"errorMsg": "success",
"requestID": "202312251715021060522200417739B9",
"ts": "2023-12-25 17:15:03"
"serverTimeMs": int(time.time() * 1000),
"result": None,
}
request_time = datetime.utcnow()
timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
# res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp)
request_data = request.form['param_json']
_logger.info('mawb_declare kw:%s' % request_data)
request_data = request.get_json()
_logger.info('temu_create_order:%s' % request_data)
result = {}
if request_data:
request_data = json.loads(request_data)
request_data['request_id'] = res['requestID']
master_waybill_no = request_data['master_waybill_no'] if request_data.get('master_waybill_no') else ''
mwb_info = request_data['mwb_info'] if request_data.get('mwb_info') else ''
if not master_waybill_no:
res['code'] = 1007
res['msg'] = '提单号必填'
if not mwb_info:
res['code'] = 1007
res['msg'] = '提单信息必传'
if res['code'] == 0:
logging.info('推入redis')
push_data = {'type': 'mawb', 'result': request_data}
r_conn.lpush('tiktok_parcel_data', json.dumps(push_data))
# return_res = rpc.customs_tiktok.mawb_declare(**request_data)
# if return_res:
# if return_res['err_msg']:
# res['code'] = 5000
# res['msg'] = return_res['err_msg']
# print(type(request_data))
data = request_data
result['request_id'] = res['requestID']
result['data'] = data
provider_order_no = data['orderNo'] if data.get('orderNo') else ''
sequence = data['sequence'] if data.get('sequence') else ''
if not provider_order_no:
res['errorCode'] = 1007
res['errorMsg'] = 'TEMU发货单号必填'
res['success'] = False
if not sequence:
res['errorCode'] = 1007
res['errorMsg'] = '版本号必填'
res['success'] = False
if res['errorCode'] == 0:
# logging.info('推入redis')
# push_data = {'type': 'package', 'result': result}
# r_conn.lpush('tiktok_parcel_data', json.dumps(push_data))
# tiktok_package_declare.delay(**result)
return_res = rpc.temu_service.temu_create_order_service(**result)
if return_res:
if return_res['msg']:
res['success'] = False
res['errorCode'] = 1008
res['errorMsg'] = return_res['msg']
else:
res['result'] = return_res['result']
else:
res['code'] = 5000
res['msg'] = '参数未传'
res['errorCode'] = 5000
res['errorMsg'] = '参数未传'
return jsonify(res)
@api.route('/temu/query/order', methods=['post'])
# @check_customer
def temu_query_order():
# 接收提单的附件信息
"""查询箱贴"""
res = {
"code": 0,
"msg": "success",
"success": True,
"errorCode": 0,
"errorMsg": "success",
"requestID": "202312251715021060522200417739B9",
"ts": "2023-12-25 17:15:03"
"serverTimeMs": int(time.time() * 1000),
"result": None,
"sequence": ""
}
request_time = datetime.utcnow()
timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp)
request_data = request.form['param_json']
_logger.info('mawb_copy_upload kw:%s' % request_data)
request_data = request.get_json()
_logger.info('temu_query_order kw:%s' % request_data)
result = {}
if request_data:
request_data = json.loads(request_data)
request_data['request_id'] = res['requestID']
master_waybill_no = request_data['master_waybill_no'] if request_data.get('master_waybill_no') else ''
if not master_waybill_no:
res['code'] = 1007
res['msg'] = '提单号必填'
if res['code'] == 0:
return_res = rpc.customs_tiktok.mawb_copy_upload(**request_data)
result['request_id'] = res['requestID']
order_no = request_data['orderNo']
result['data'] = request_data
logistics_order_no = request_data['logisticsOrderNo']
version_no = request_data['sequence']
carton_arr = request_data['cartonInfo']
if not order_no:
res['errorCode'] = 1007
res['errorMsg'] = 'TEMU发货单号必填'
res['success'] = False
if not version_no:
res['errorCode'] = 1007
res['errorMsg'] = '版本号必填'
res['success'] = False
if res['errorCode'] == 0:
return_res = rpc.temu_service.temu_query_order_service(**result)
if return_res:
if return_res['msg']:
res['code'] = return_res['code']
res['msg'] = return_res['msg']
res['errorCode'] = 1008
res['errorMsg'] = return_res['msg']
res['success'] = False
else:
res['result'] = return_res['result']
res['sequence'] = return_res['sequence']
else:
res['code'] = 5000
res['msg'] = '参数未传'
......@@ -180,63 +209,31 @@ def temu_cancel_order():
timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp)
request_data = request.form['param_json']
request_data = request.get_json()
_logger.info('temu_cancel_order kw:%s' % request_data)
result = {}
if request_data:
data = json.loads(request_data)
result['request_id'] = res['requestID']
result['data'] = data
provider_order_no = data['orderNo'] if data.get('orderNo') else ''
logistics_order_no = data['logisticsOrderNo'] if data.get('logisticsOrderNo') else ''
result['data'] = request_data
provider_order_no = request_data['orderNo'] if request_data.get('orderNo') else ''
logistics_order_no = request_data['logisticsOrderNo'] if request_data.get('logisticsOrderNo') else ''
if not provider_order_no:
res['errorCode'] = 1007
res['errorMsg'] = 'TEMU发货单号必填'
res['success'] = False
if not logistics_order_no:
res['errorCode'] = 1007
res['errorMsg'] = '服务商发货单号必填'
if res['code'] == 0:
res['success'] = False
if res['errorCode'] == 0:
return_res = rpc.temu_service.temu_cancel_order_service(**result)
if return_res:
if return_res['msg']:
res['errorCode'] = 1008
res['errorMsg'] = return_res['msg']
res['success'] = False
else:
res['code'] = 5000
res['msg'] = '参数未传'
return jsonify(res)
@api.route('/logistics/provider/customs/mawb_cancel', methods=['post'])
# @check_customer
def mawb_cancel():
# 接收提单取消
res = {
"code": 0,
"msg": "success",
"requestID": "202312251715021060522200417739B9",
"ts": "2023-12-25 17:15:03"
}
request_time = datetime.utcnow()
timestamp = int(time.time())
res['ts'] = request_time.strftime("%Y-%m-%d %H:%M:%S")
res['requestID'] = request_time.strftime("%Y%m%d%H%M%S") + str(timestamp)
request_data = request.form['param_json']
_logger.info('mawb_cancel kw:%s' % request_data)
if request_data:
request_data = json.loads(request_data)
request_data['request_id'] = res['requestID']
master_waybill_no = request_data['master_waybill_no'] if request_data.get('master_waybill_no') else ''
if not master_waybill_no:
res['code'] = 1007
res['msg'] = '提单号必传'
if res['code'] == 0:
return_res = rpc.customs_tiktok.mawb_cancel(**request_data)
if return_res:
if return_res['msg']:
res['code'] = return_res['code']
res['msg'] = return_res['msg']
else:
res['code'] = 5000
res['msg'] = '参数未传'
return jsonify(res)
......@@ -17,4 +17,4 @@ swagger_config['description'] = config.description
Swagger(app)
CORS(app, supports_credentials=True)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=int(parse_args.port), debug=True)
app.run(host="0.0.0.0", port=int(parse_args.port), debug=False)
# !/usr/bin/python
# -*- coding:utf-8 -*-
import ast
import copy
import json
import sys
import time
import requests
import logging
from dependence.services.util import YhjCommon, Order_dispose
from dependence.services import config
import redis
logging.basicConfig(handlers=[logging.FileHandler('logs/create_pdf.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
_logger = logging.getLogger(__name__)
# 初始化连接(建议放在外面,或者是单例)
odoo_conn = Order_dispose()
class CreateCartonPdf(object):
def start_worker(self, order_no):
"""
启动守护进程循环
:param interval: 每次循环的休眠时间(秒)
"""
_logger.info(f">>>订单{order_no} PDF 生成服务已启动 <<<")
try:
# --- 执行业务逻辑 ---
# 调用 Odoo 端的方法 (假设 cron_create_pdf 内部会自动查找 draft 状态的记录并处理)
# 注意:这里保留了您原本的传参 ["self"],请确保 Odoo 端方法能接收此参数
result = odoo_conn.odoo_db.execute("temu.order.carton", "cron_create_pdf", ["self"])
# 如果 Odoo 返回了处理的数量,可以打个日志
if result:
_logger.info(f"本次执行结果: {result}")
except Exception as err:
# --- 异常处理 ---
# 捕获所有异常,确保脚本不会崩掉退出
_logger.error(f"发生异常,将在 10秒 后重试。错误详情: {str(err)}")
time.sleep(1) # 出错后多睡一会儿,防止日志刷屏
try:
pool = redis.ConnectionPool(**config.redis_options)
r = redis.Redis(connection_pool=pool)
logging.info(u'redis连接成功')
pdf_obj = CreateCartonPdf()
while 1:
try:
result = r.brpop(['create_pdf_data'], 0)
data1 = result[1]
task_data = json.loads(data1)
if result:
pdf_obj.start_worker(task_data.get('order_no'))
else:
logging.error('未找到数据类型')
except Exception as e:
logging.error('error: %s' % str(e))
continue
except Exception as e:
logging.error("登录失败:%s" % e)
......@@ -27,7 +27,7 @@ db_password = "qq166349"
# odoorpc配置
rpc_db_ip = '127.0.0.1'
rpc_db_port = "8069"
rpc_db_name = "hh_ccs_425"
rpc_db_name = "test_xqhwaybill"
rpc_db_user = "admin"
rpc_db_password = "admin"
......
......@@ -43,8 +43,8 @@ class DbService(object):
username=config.db_user, password=config.db_password,
host=config.db_ip, port=config.db_port, database=config.db_name
),
pool_size=15,
max_overflow=5,
pool_size=20,
max_overflow=10,
pool_recycle=3600 # 1小时回收连接,防止 MySQL/PG 断连
)
......
......@@ -205,9 +205,9 @@ class YhjCommon(object):
return nTime
# class Order_dispose(object):
#
# def __init__(self):
# # rpc连接
# self.odoo_db = odoorpc.ODOO(config.rpc_db_ip, port=config.rpc_db_port)
# self.odoo_db.login(config.rpc_db_name, config.rpc_db_user, config.rpc_db_password)
\ No newline at end of file
class Order_dispose(object):
def __init__(self):
# rpc连接
self.odoo_db = odoorpc.ODOO(config.rpc_db_ip, port=config.rpc_db_port)
self.odoo_db.login(config.rpc_db_name, config.rpc_db_user, config.rpc_db_password)
This source diff could not be displayed because it is too large. You can view the blob instead.
[program:tiktok_queue_1]
[program:create_pdf_1]
process_name=%(program_name)s_%(process_num)02d ; 进程名称
directory = /mnt/extra-addons ; 程序的启动目录
command = /usr/local/bin/python3 /mnt/extra-addons/tiktok_queue.py ; 启动命令
command = /usr/local/bin/python3 /mnt/extra-addons/create_pdf.py ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
numprocs=1 ; 进程数
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/tiktok_queue.log
\ No newline at end of file
stdout_logfile = /var/log/supervisor/create_pdf.log
\ No newline at end of file
[program:tiktok_service_1]
[program:temu_service_1]
process_name=%(program_name)s_%(process_num)02d ; 进程名称
directory = /mnt/extra-addons ; 程序的启动目录
command = nameko run tiktok_service --config foobar.yaml ; 启动命令
command = nameko run temu_service --config foobar.yaml ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
......@@ -12,5 +12,5 @@ redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/supervisor/tiktok_service.log
stdout_logfile = /var/log/supervisor/temu_service.log
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论