提交 86981303 authored 作者: 郑笛's avatar 郑笛

完成异步处理小包状态

上级 50fbbe32
import asyncio
import base64
import json
import logging
import ssl
import aiohttp
import certifi
import pytz
from datetime import datetime
from lxml import etree
......@@ -244,8 +249,45 @@ class CcBl(models.Model):
def callback_track(self):
for item in self:
ship_packages = self.env['cc.ship.package'].search([('bl_id', '=', item.id), ('is_sync', '=', False)])
for package in ship_packages:
package.callback_track()
# for package in ship_packages:
# package.callback_track()
tt_api_obj = self.env["ao.tt.api"].sudo()
async def perform_requests():
ssl_context = ssl.create_default_context(cafile=certifi.where())
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context)) as session:
tasks = []
for index, package in enumerate(ship_packages):
if not package.is_sync and package.state and package.state.tk_code:
data = package.get_callback_track_data()
tasks.append(tt_api_obj.async_callback_track(session, data, package.id))
responses = await asyncio.gather(*tasks)
return responses
# 在 Odoo 中运行异步任务
responses = asyncio.run(perform_requests())
for response_item in responses:
response_data = response_item[0]
logging.info('response_data response:%s' % response_data)
data = response_item[1]
package_id = response_item[2]
package_order = self.env['cc.ship.package'].sudo().browse(package_id)
if response_data['code'] != 0:
package_order.is_sync = False
error_msg = response_data['msg']
request_id = response_data['requestID']
code = response_data['code']
self.env['ao.tt.api.log'].sudo().create_api_log(
package_order.tracking_no or '', '小包状态轨迹回传:' + error_msg, data, code, request_id,
source='推出')
else:
# 回传成功
package_order.is_sync = True
self.env['cc.ship.package.sync.log'].sudo().create_sync_log(
package_order.id, 'Tiktok', package_order.state.tk_code, package_order.state_explain,
package_order.process_time.strftime('%Y-%m-%d %H:%M:%S'))
request_id = response_data['requestID']
self.env['ao.tt.api.log'].sudo().create_api_log(
package_order.tracking_no or '', '', data, 0, request_id, source='推出')
return True
def deal_ship_package_state(self):
......
......@@ -110,3 +110,41 @@ class TT(models.Model):
# response = {'code': 0}
return response
async def async_get_response(self, session, url, sign, timestamp, push_data):
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
app_key = self.env["ir.config_parameter"].sudo().get_param('tt_app_key') or ''
version = self.env["ir.config_parameter"].sudo().get_param('tt_version') or '3.0'
tt_url = self.env["ir.config_parameter"].sudo().get_param('tt_url') or ''
parameter = {
'sign': sign,
'param_json': json.dumps(push_data, ensure_ascii=False),
'timestamp': timestamp,
'version': version,
'app_key': app_key
}
request_url = tt_url + url
logging.info('request_url: %s' % request_url)
logging.info('request_data: %s' % parameter)
async with session.post(request_url, headers=headers, data=parameter) as response:
response_data = await response.json()
logging.info('response: %s', response_data)
# print(response.json())
return response_data
async def async_callback_track_callback(self, session, push_data, package_id):
"""包裹轨迹回传"""
url = '/logistics/provider/cross_border/callback_track?country=GB'
# cb_excustoms_finished 出口清关完毕
# cb_transport_assigned 干线揽收
timestamp = int(time.time())
sign = self.generate_sign(timestamp, push_data)
response = await self.async_get_response(session, url, sign, timestamp, push_data)
logging.info('callback_track response:%s' % response)
return response, push_data, package_id
async def async_callback_track(self, session, data, package_id):
"""异步调用推送接口"""
# async with semaphore:
return await self.async_callback_track_callback(session, data, package_id)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论