提交 1567de5b authored 作者: 贺阳's avatar 贺阳

提单巡查性能优化

上级 db3c7f82
...@@ -63,9 +63,13 @@ class BlPatrol(models.Model): ...@@ -63,9 +63,13 @@ class BlPatrol(models.Model):
_logger.info(f"提单巡查完成: {patrol.name}, 发现问题: {result['issue_count']}") _logger.info(f"提单巡查完成: {patrol.name}, 发现问题: {result['issue_count']}")
except MemoryError as e:
_logger.exception("提单巡查失败: MemoryError")
raise UserError("巡查失败: MemoryError(内存不足),请减少巡查范围或优化巡查逻辑")
except Exception as e: except Exception as e:
_logger.error(f"提单巡查失败: {str(e)}") _logger.exception("提单巡查失败")
raise UserError(f"巡查失败: {str(e)}") msg = str(e) or repr(e) or type(e).__name__
raise UserError(f"巡查失败: {msg}")
def _execute_patrol(self): def _execute_patrol(self):
""" """
......
...@@ -5,6 +5,7 @@ import logging ...@@ -5,6 +5,7 @@ import logging
import re import re
import ssl import ssl
from datetime import timedelta, datetime from datetime import timedelta, datetime
from types import SimpleNamespace
import aiohttp import aiohttp
import certifi import certifi
...@@ -622,6 +623,25 @@ class CcBl(models.Model): ...@@ -622,6 +623,25 @@ class CcBl(models.Model):
'bl_issues': '\n'.join(error_bl_issues) if error_bl_issues else '' 'bl_issues': '\n'.join(error_bl_issues) if error_bl_issues else ''
} }
def _read_latest_package_sync_logs(self, package_ids):
if not package_ids:
return {}
self.env.cr.execute("""
SELECT DISTINCT ON (package_id, process_code)
package_id, process_code, sync_time, operate_time
FROM cc_ship_package_sync_log
WHERE package_id = ANY(%s)
ORDER BY package_id, process_code, sync_time DESC NULLS LAST, id ASC
""", (list(package_ids),))
res = {}
for package_id, process_code, sync_time, operate_time in self.env.cr.fetchall():
res.setdefault(package_id, {})[process_code] = SimpleNamespace(
process_code=process_code,
sync_time=sync_time,
operate_time=operate_time,
)
return res
def _check_package_tracking_issues(self, bl): def _check_package_tracking_issues(self, bl):
""" """
检查小包轨迹问题 - 只检查真正的小包节点,不检查关务节点 检查小包轨迹问题 - 只检查真正的小包节点,不检查关务节点
...@@ -632,16 +652,10 @@ class CcBl(models.Model): ...@@ -632,16 +652,10 @@ class CcBl(models.Model):
missing_issues = {} # 漏推问题 missing_issues = {} # 漏推问题
# 获取该提单下所有小包的同步日志 # 获取该提单下所有小包的同步日志
ship_packages = bl.ship_package_ids ship_packages = bl.ship_package_ids
latest_logs_by_package = self._read_latest_package_sync_logs(ship_packages.ids)
for package in ship_packages: for package in ship_packages:
# 按节点编码分组,根据同步时间降序,得到对应的同步日志对象,然后再根据节点编码的顺序排序,得到同步日志对象数组 # 按节点编码分组,根据同步时间降序,得到对应的同步日志对象,然后再根据节点编码的顺序排序,得到同步日志对象数组
logs_by_process = {} logs_by_process = latest_logs_by_package.get(package.id, {})
for log in package.sync_log_ids:
if log.process_code not in logs_by_process:
logs_by_process[log.process_code] = log
else:
# 如果已有该节点的日志,比较sync_time,保留最新的
if log.sync_time and log.sync_time > logs_by_process[log.process_code].sync_time:
logs_by_process[log.process_code] = log
# 方法1: 根据节点的seq进行排序(推荐) # 方法1: 根据节点的seq进行排序(推荐)
sync_logs = [] sync_logs = []
bl_nodes = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('is_patrol_node', '=', True)], bl_nodes = self.env['cc.node'].sudo().search([('node_type', '=', 'package'), ('is_patrol_node', '=', True)],
...@@ -650,8 +664,9 @@ class CcBl(models.Model): ...@@ -650,8 +664,9 @@ class CcBl(models.Model):
for node in bl_nodes: for node in bl_nodes:
if node.is_default: if node.is_default:
continue continue
if node.tk_code in logs_by_process: log = logs_by_process.get(node.tk_code)
sync_logs.append(logs_by_process[node.tk_code]) if log:
sync_logs.append(log)
sync_logs = [log for log in sync_logs if log is not None] sync_logs = [log for log in sync_logs if log is not None]
# 根据key排序获取logs # 根据key排序获取logs
if len(sync_logs) >= 2: if len(sync_logs) >= 2:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论