提交 6c370518 authored 作者: 贺阳's avatar 贺阳

修改接口,同步小包进度的优化

上级 bd7afa21
...@@ -1068,19 +1068,23 @@ class CcBL(models.Model): ...@@ -1068,19 +1068,23 @@ class CcBL(models.Model):
# print(wizard_obj.get_order()) # print(wizard_obj.get_order())
wizard_obj.submit() wizard_obj.submit()
def try_callback_track(self, max_retries=3): def try_callback_track(self, max_retries=3, ship_package_ids=[]):
""" 封装的重试逻辑 """ """ 封装的重试逻辑 """
for i in range(max_retries): for i in range(max_retries):
if not ship_package_ids:
is_ok = self.callback_track() is_ok = self.callback_track()
else:
is_ok = self.package_callback_func(ship_package_ids)
if is_ok: if is_ok:
return True return True
logging.warning(f"Attempt {i + 1}/{max_retries} failed. Retrying...") logging.warning(f"Attempt {i + 1}/{max_retries} failed. Retrying...")
return False return False
def mail_auto_push(self, mail_time): def mail_auto_push(self, mail_time=False, ship_packages=[], action_type='tally'):
self = self.with_context(dict(self._context, is_mail=True)) self = self.with_context(dict(self._context, is_mail=True))
for item in self: for item in self:
try: try:
if mail_time:
utc_time = datetime.strptime(mail_time, "%Y-%m-%d %H:%M:%S") 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 10 before_min = self.env['ir.config_parameter'].sudo().get_param('before_min') or 10
before_utc_time = utc_time - timedelta(minutes=int(before_min)) before_utc_time = utc_time - timedelta(minutes=int(before_min))
...@@ -1093,6 +1097,39 @@ class CcBL(models.Model): ...@@ -1093,6 +1097,39 @@ class CcBL(models.Model):
logging.error(f"Failed to push item after {3} attempts.") logging.error(f"Failed to push item after {3} attempts.")
else: else:
logging.error(f"Failed to start process for item after {3} attempts.") logging.error(f"Failed to start process for item after {3} attempts.")
elif ship_packages:
ship_package_ids = [ship_package_dict['id'] for ship_package_dict in ship_packages if
ship_package_dict['id']]
tally_state = 'checked_goods' if action_type == 'tally' else 'handover_completed'
node_obj = self.env['cc.node'].sudo().search([
('node_type', '=', 'package'),
('tally_state', '=', tally_state) # Check for both states
], order='seq asc') # Order by sequence and creation date ascending
if node_obj:
for index, node in enumerate(node_obj):
for ship_package_dict in ship_packages:
ship_package_id = ship_package_dict['id']
ship_package = self.env['cc.ship.package'].browse(ship_package_id) # 小包
tally_time = ship_package_dict['tally_time']
operation_time = (datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S') + timedelta(
minutes=20 * (index + 1))) if tally_time else fields.Datetime.now() + timedelta(
minutes=20 * (index + 1)) # Increment time by 20 minutes for each node
state_node_obj = self.env['cc.node'].sudo().search(
[('node_type', '=', 'package'), ('name', '=', ship_package.state.name)],
limit=1)
if state_node_obj.seq < node.seq: # Ensure the current state is valid
ship_package.write({
'state': node.id,
'process_time': operation_time,
'state_explain': node.desc,
'is_sync': True if node.is_default else False
})
if self.state == 'draft' and self.ship_package_ids.filtered(
lambda line: line.state.tk_code == 'cb_imcustoms_start'):
self.ccing_func()
# 同步状态
# 尝试调用 callback_track
self.try_callback_track(max_retries=2, ship_package_ids=ship_package_ids)
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))
......
...@@ -170,13 +170,13 @@ class OrderController(http.Controller): ...@@ -170,13 +170,13 @@ class OrderController(http.Controller):
tally_time = package_item.get('tally_time') tally_time = package_item.get('tally_time')
if package_type == 'ship': if package_type == 'ship':
ship_packages.append({ ship_packages.append({
'id': package_obj, 'id': package_obj.id,
'tally_time': tally_time}) 'tally_time': tally_time})
else: else:
# if package.tally_state == 'unprocessed_goods' # if package.tally_state == 'unprocessed_goods'
for package in package_obj: for package in package_obj:
ship_packages += [{ ship_packages += [{
'id': ship_package, 'id': ship_package.id,
'tally_time': tally_time} for ship_package in 'tally_time': tally_time} for ship_package in
package.ship_package_ids if package.ship_package_ids if
package.tally_state == 'unprocessed_goods'] # 小包 package.tally_state == 'unprocessed_goods'] # 小包
...@@ -239,43 +239,16 @@ class OrderController(http.Controller): ...@@ -239,43 +239,16 @@ class OrderController(http.Controller):
'ship package', [exception_id], ship_package_ids=ship_package, send_email=True, 'ship package', [exception_id], ship_package_ids=ship_package, send_email=True,
email_language=lang) email_language=lang)
ship_wizard_obj.confirm() # 发送邮件 ship_wizard_obj.confirm() # 发送邮件
res['state'] = 200
# 更新小包状态 # 有小包 就更新小包状态和同步
if ship_packages: if ship_packages:
tally_state = 'checked_goods' if action_type == 'tally' else 'handover_completed'
node_obj = request.env['cc.node'].sudo().search([
('node_type', '=', 'package'),
('tally_state', '=', tally_state) # Check for both states
], order='seq asc') # Order by sequence and creation date ascending
if node_obj:
for index, node in enumerate(node_obj):
for ship_package_dict in ship_packages:
ship_package = ship_package_dict['id']
tally_time = ship_package_dict['tally_time']
operation_time = (datetime.strptime(tally_time, '%Y-%m-%d %H:%M:%S') + timedelta(
minutes=20 * (index + 1))) if tally_time else fields.Datetime.now() + timedelta(
minutes=20 * (index + 1)) # Increment time by 20 minutes for each node
state_node_obj = request.env['cc.node'].sudo().search(
[('node_type', '=', 'package'), ('name', '=', ship_package.state.name)],
limit=1)
if state_node_obj.seq < node.seq: # Ensure the current state is valid
ship_package.write({
'state': node.id,
'process_time': operation_time,
'state_explain': node.desc,
'is_sync': True if node.is_default else False
})
if bl_obj.state == 'draft' and bl_obj.ship_package_ids.filtered(
lambda line: line.state.tk_code == 'cb_imcustoms_start'):
bl_obj.ccing_func()
ship_package_ids = tuple(
ship_package_dict['id'].id for ship_package_dict in ship_packages if
ship_package_dict['id'])
redis_conn = request.env['common.common'].sudo().get_redis() redis_conn = request.env['common.common'].sudo().get_redis()
if redis_conn and redis_conn != 'no': if redis_conn and redis_conn != 'no':
redis_conn.lpush('push_ship_package_state', json.dumps( # redis_conn.lpush('push_ship_package_state', json.dumps(
{'bl_id': bl_obj.id, 'ship_package_ids': ship_package_ids})) # {'bl_id': bl_obj.id, 'ship_package_ids': ship_package_ids}))
res['state'] = 200 redis_conn.lpush('mail_push_package_list', json.dumps(
{'id': bl_obj.id, 'ship_packages': str(ship_packages), 'action_type': action_type}))
else: else:
res['message'] = bill_noexist_msg_dic[pda_lang] # 提单不存在 res['message'] = bill_noexist_msg_dic[pda_lang] # 提单不存在
else: else:
......
...@@ -131,7 +131,7 @@ class CcShipPackageSyncLog(models.Model): ...@@ -131,7 +131,7 @@ class CcShipPackageSyncLog(models.Model):
class CcShipPackage(models.Model): class CcShipPackage(models.Model):
_inherit = "cc.ship.package" _inherit = "cc.ship.package"
is_sync = fields.Boolean('Is Sync', default=False) is_sync = fields.Boolean('Is Sync', default=False, index=True)
tk_code = fields.Char(related='state.tk_code', store=True, string='TK Code', help='TK Code') tk_code = fields.Char(related='state.tk_code', store=True, string='TK Code', help='TK Code')
# 增加同步日志纪录字段 # 增加同步日志纪录字段
...@@ -270,6 +270,7 @@ class CcBl(models.Model): ...@@ -270,6 +270,7 @@ class CcBl(models.Model):
同步小包状态 同步小包状态
""" """
ship_packages = self.env['cc.ship.package'].search([('id', 'in', ship_package_ids), ('is_sync', '=', False)]) ship_packages = self.env['cc.ship.package'].search([('id', 'in', ship_package_ids), ('is_sync', '=', False)])
logging.info('package_callback_func ship_packages:%s' % len(ship_packages))
is_ok = True is_ok = True
tt_api_obj = self.env["ao.tt.api"].sudo() tt_api_obj = self.env["ao.tt.api"].sudo()
...@@ -278,6 +279,7 @@ class CcBl(models.Model): ...@@ -278,6 +279,7 @@ class CcBl(models.Model):
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context), async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context),
timeout=aiohttp.ClientTimeout(total=60)) as session: timeout=aiohttp.ClientTimeout(total=60)) as session:
tasks = [] tasks = []
logging.info('------123')
for index, package in enumerate(ship_packages): for index, package in enumerate(ship_packages):
if not package.is_sync and package.state and package.state.tk_code: if not package.is_sync and package.state and package.state.tk_code:
data = package.get_callback_track_data() data = package.get_callback_track_data()
......
# coding=utf-8 # coding=utf-8
import json import json
import logging import logging
import odoorpc
import redis import redis
import time
import requests import requests
import odoorpc import time
from requests.adapters import HTTPAdapter
from datetime import datetime from datetime import datetime
import config from requests.adapters import HTTPAdapter
import config
# 默认字符gbk # 默认字符gbk
# logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO) logging.basicConfig(filename='./push_data_logger.log', level=logging.INFO)
# 设置文件字符为utf-8 # 设置文件字符为utf-8
logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')], # logging.basicConfig(handlers=[logging.FileHandler('logs/mail_push.log', 'a', 'utf-8')],
format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) # format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
class Order_dispose(object): class Order_dispose(object):
...@@ -29,11 +31,13 @@ class Order_dispose(object): ...@@ -29,11 +31,13 @@ class Order_dispose(object):
try: try:
data = json.loads(data) data = json.loads(data)
logging.info('mail_push_data: %s', data) logging.info('mail_push_data: %s', data)
ship_packages = eval(data['ship_packages']) if data.get('ship_packages') else [] # 小包
action_type = data.get('action_type') # 类型
bl_obj = self.odoo_db.env['cc.bl'] bl_obj = self.odoo_db.env['cc.bl']
bl_record = bl_obj.browse(data['id']) bl_record = bl_obj.browse(data['id'])
# utc_time = datetime.strptime(data['utc_time'], "%Y-%m-%d %H:%M:%S") # utc_time = datetime.strptime(data['utc_time'], "%Y-%m-%d %H:%M:%S")
utc_time = data['utc_time'] utc_time = data.get('utc_time')
bl_record.mail_auto_push(utc_time) bl_record.mail_auto_push(utc_time, ship_packages, action_type)
except Exception as ex: except Exception as ex:
logging.error('mail_auto_push error:%s' % str(ex)) logging.error('mail_auto_push error:%s' % str(ex))
return res_data return res_data
......
...@@ -35,7 +35,10 @@ class Order_dispose(object): ...@@ -35,7 +35,10 @@ class Order_dispose(object):
bl_id = result['bl_id'] bl_id = result['bl_id']
logging.info('push_ship_package_state kw: %s', result) logging.info('push_ship_package_state kw: %s', result)
bl_obj = self.odoo_db.env['cc.bl'].browse(bl_id) # 提单 bl_obj = self.odoo_db.env['cc.bl'].browse(bl_id) # 提单
logging.info('bl_obj:%s' % bl_obj)
logging.info('ship_package_ids:%s' % len(ship_package_ids))
is_ok = bl_obj.package_callback_func(ship_package_ids) # 调用同步包裹状态 is_ok = bl_obj.package_callback_func(ship_package_ids) # 调用同步包裹状态
logging.info('is_ok:%s' % is_ok)
# 失败的重复推送 重复推2次 # 失败的重复推送 重复推2次
for i in range(2): for i in range(2):
if not is_ok: if not is_ok:
......
[program:push_ship_consumer_1] [program:push_ship_package_state_consumer_1]
process_name=%(program_name)s_%(process_num)02d ; 进程名称 process_name=%(program_name)s_%(process_num)02d ; 进程名称
directory = /mnt/extra-addons ; 程序的启动目录 directory = /mnt/extra-addons ; 程序的启动目录
command = /usr/bin/python3 /mnt/extra-addons/push_ship_package_state.py ; 启动命令 command = /usr/bin/python3 /mnt/extra-addons/push_ship_package_state.py ; 启动命令
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论