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

完成异步处理小包状态

上级 50fbbe32
*.pyc *.pyc
.idea/ .idea/
*.log
import asyncio
import base64 import base64
import json import json
import logging import logging
import ssl
import aiohttp
import certifi
import pytz import pytz
from datetime import datetime from datetime import datetime
from lxml import etree from lxml import etree
...@@ -244,8 +249,45 @@ class CcBl(models.Model): ...@@ -244,8 +249,45 @@ class CcBl(models.Model):
def callback_track(self): def callback_track(self):
for item in self: for item in self:
ship_packages = self.env['cc.ship.package'].search([('bl_id', '=', item.id), ('is_sync', '=', False)]) ship_packages = self.env['cc.ship.package'].search([('bl_id', '=', item.id), ('is_sync', '=', False)])
for package in ship_packages: # for package in ship_packages:
package.callback_track() # 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 return True
def deal_ship_package_state(self): def deal_ship_package_state(self):
......
...@@ -110,3 +110,41 @@ class TT(models.Model): ...@@ -110,3 +110,41 @@ class TT(models.Model):
# response = {'code': 0} # response = {'code': 0}
return response 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论