提交 136d8ac1 authored 作者: 刘擎阳's avatar 刘擎阳

Merge branch 'develop' of http://gitlab.f.yizuo.ltd/heyang/hh_ccs into develop

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