Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
2eb44c59
提交
2eb44c59
authored
11月 17, 2025
作者:
伍姿英
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'release/3.6.2'
上级
f17a1c9d
c7489bcf
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
39 行增加
和
26 行删除
+39
-26
data.xml
ccs_base/data/data.xml
+22
-0
batch_get_pod_info_wizard.py
ccs_base/wizard/batch_get_pod_info_wizard.py
+9
-25
batch_get_pod_info_wizard.py
ccs_connect_tiktok/wizard/batch_get_pod_info_wizard.py
+8
-1
没有找到文件。
ccs_base/data/data.xml
浏览文件 @
2eb44c59
...
@@ -49,5 +49,26 @@
...
@@ -49,5 +49,26 @@
<field
name=
"key"
>
time_warning_hours
</field>
<field
name=
"key"
>
time_warning_hours
</field>
<field
name=
"value"
>
24
</field>
<field
name=
"value"
>
24
</field>
</record>
</record>
<record
id=
"push_time_reg"
model=
"ir.config_parameter"
>
<field
name=
"key"
>
push_time_reg
</field>
<field
name=
"value"
>
[
# 有空格的情况
r'DATE[/\s]*TIME[/\s]*OF[/\s]*RELEASE[^\n]*?(\d{2}:\d{2})\s+(\d{2}-[A-Z]{3}-\d{4})',
# 无空格的情况,紧跟在RELEASE后面就是时间数字
r'DATETIMEOFRELEASE(\d{2})(\d{2})(\d{2})-([A-Z]{3})-(\d{4})',
# 增加容错,RELEASE可能被识别为其他形式
r'[Rr][Ee][Ll][Ee][Aa][Ss][Ee].*?(\d{2}:\d{2})\s+(\d{2}-[A-Z]{3}-\d{4})',
# 更宽松的无空格匹配
r'[Dd][Aa][Tt][Ee].*?[Tt][Ii][Mm][Ee].*?[Oo][Ff].*?[Rr][Ee][Ll][Ee][Aa][Ss][Ee](\d{2})(\d{2})(\d{2})-([A-Z]{3})-(\d{4})',
# OCR可能将:识别为数字,如"DATETIMEOFRELEASE163420-SEP-2025"
r'DATETIMEOFRELEASE(\d)(\d)(\d{2})(\d{2})-([A-Z]{3})-(\d{4})',
# OCR可能将:识别为多个空格,如"DATETIMEOFRELEASE 163420-SEP-2025"
r'DATETIMEOFRELEASE\s+(\d)(\d)(\d{2})(\d{2})-([A-Z]{3})-(\d{4})',
# OCR可能将:识别为多个空格,如"DATETIMEOFRELEASE 1623420-SEP-2025"把:识别成了2 1333113-NOV-2025,把:识别成了3
r'DATETIMEOFRELEASE\s+(\d)(\d)[2,3](\d{2})(\d{2})-([A-Z]{3})-(\d{4})',
r'DATETIMEQFRELEASE\s+(\d)(\d)[2,3](\d{2})(\d{2})-([A-Z]{3})-(\d{4})',
]
</field>
</record>
</data>
</data>
</odoo>
</odoo>
\ No newline at end of file
ccs_base/wizard/batch_get_pod_info_wizard.py
浏览文件 @
2eb44c59
...
@@ -1833,34 +1833,13 @@ class BatchGetPodInfoWizard(models.TransientModel):
...
@@ -1833,34 +1833,13 @@ class BatchGetPodInfoWizard(models.TransientModel):
if
not
file_data
:
if
not
file_data
:
logging
.
info
(
f
"提单 {bl.bl_no} 没有文件数据"
)
logging
.
info
(
f
"提单 {bl.bl_no} 没有文件数据"
)
continue
continue
try
:
# 如果已识别过OCR文本,则复用
ocr_texts
=
file_info
.
get
(
'ocr_texts'
)
# 解析PDF提取时间
extracted_times
=
self
.
_extract_time_from_pdf
(
file_data
,
bl
.
bl_no
,
ocr_texts
=
ocr_texts
)
if
extracted_times
:
# 取最早的时间作为节点操作时间
earliest_time
=
min
(
extracted_times
)
_logger
.
info
(
f
"提取到最早时间: {earliest_time},将作为节点操作时间,满足条件的小包数量: {len(valid_package_ids)},小包ID: {valid_package_ids}"
)
ship_packages
.
append
({
ship_packages
.
append
({
'bl_id'
:
bl
.
id
,
'bl_id'
:
bl
.
id
,
'id'
:
valid_package_ids
,
# 只包含满足条件的小包ID
'id'
:
valid_package_ids
,
# 只包含满足条件的小包ID
'tally_time'
:
str
(
earliest_time
)
'tally_time'
:
str
(
file_info
.
get
(
'tally_time'
)
)
})
})
else
:
_logger
.
warning
(
f
"提单 {bl.bl_no} 没有提取到时间信息"
)
error_bl
.
append
(
bl
)
except
Exception
as
e
:
_logger
.
error
(
f
"获取提单对应的节点以及时间失败,提单号: {bl.bl_no}, 错误: {str(e)}"
)
error_bl
.
append
(
bl
)
if
error_bl
:
_logger
.
warning
(
f
"提单 {', '.join([bl.bl_no for bl in error_bl])} 没有提取到时间信息"
)
if
not
self
.
_context
.
get
(
'is_skip_raise_error'
):
raise
ValidationError
(
_
(
'
%
s bill of loading cannot get node operation time,please manually upload push tk'
)
%
(
', '
.
join
([
bl
.
bl_no
for
bl
in
error_bl
])))
# xx提单号没有获取到节点操作时间,请手动上传推送提单到TK
return
ship_packages
,
pod_node
.
id
return
ship_packages
,
pod_node
.
id
def
_sync_match_node
(
self
,
ship_packages
,
pod_node_id
):
def
_sync_match_node
(
self
,
ship_packages
,
pod_node_id
):
...
@@ -1915,6 +1894,10 @@ class BatchGetPodInfoWizard(models.TransientModel):
...
@@ -1915,6 +1894,10 @@ class BatchGetPodInfoWizard(models.TransientModel):
# 匹配两种情况:
# 匹配两种情况:
# 1. 有空格: "DATE/TIME OF RELEASE 16:02 20-SEP-2025"
# 1. 有空格: "DATE/TIME OF RELEASE 16:02 20-SEP-2025"
# 2. 无空格: "DATETIMEOFRELEASE160220-SEP-2025"
# 2. 无空格: "DATETIMEOFRELEASE160220-SEP-2025"
release_time_patterns
=
self
.
env
[
'ir.config_parameter'
]
.
sudo
()
.
get_param
(
'push_time_reg'
)
if
release_time_patterns
:
release_time_patterns
=
eval
(
release_time_patterns
)
else
:
release_time_patterns
=
[
release_time_patterns
=
[
# 有空格的情况
# 有空格的情况
r'DATE[/\s]*TIME[/\s]*OF[/\s]*RELEASE[^\n]*?(\d{2}:\d{2})\s+(\d{2}-[A-Z]{3}-\d{4})'
,
r'DATE[/\s]*TIME[/\s]*OF[/\s]*RELEASE[^\n]*?(\d{2}:\d{2})\s+(\d{2}-[A-Z]{3}-\d{4})'
,
...
@@ -1928,8 +1911,9 @@ class BatchGetPodInfoWizard(models.TransientModel):
...
@@ -1928,8 +1911,9 @@ class BatchGetPodInfoWizard(models.TransientModel):
r'DATETIMEOFRELEASE(\d)(\d)(\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
r'DATETIMEOFRELEASE(\d)(\d)(\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
# OCR可能将:识别为多个空格,如"DATETIMEOFRELEASE 163420-SEP-2025"
# OCR可能将:识别为多个空格,如"DATETIMEOFRELEASE 163420-SEP-2025"
r'DATETIMEOFRELEASE\s+(\d)(\d)(\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
r'DATETIMEOFRELEASE\s+(\d)(\d)(\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
# OCR可能将:识别为多个空格,如"DATETIMEOFRELEASE 1623420-SEP-2025"把:识别成了2
# OCR可能将:识别为多个空格,如"DATETIMEOFRELEASE 1623420-SEP-2025"把:识别成了2 1333113-NOV-2025,把:识别成了3
r'DATETIMEOFRELEASE\s+(\d)(\d)2(\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
r'DATETIMEOFRELEASE\s+(\d)(\d)[2,3](\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
r'DATETIMEQFRELEASE\s+(\d)(\d)[2,3](\d{2})(\d{2})-([A-Z]{3})-(\d{4})'
,
]
]
for
idx
,
pattern
in
enumerate
(
release_time_patterns
):
for
idx
,
pattern
in
enumerate
(
release_time_patterns
):
...
...
ccs_connect_tiktok/wizard/batch_get_pod_info_wizard.py
浏览文件 @
2eb44c59
...
@@ -20,7 +20,7 @@ class BatchGetPodInfoWizard(models.TransientModel):
...
@@ -20,7 +20,7 @@ class BatchGetPodInfoWizard(models.TransientModel):
:return: 满足条件的文件数组
:return: 满足条件的文件数组
"""
"""
valid_files
=
[]
valid_files
=
[]
error_bl
=
[]
for
file_info
in
processed_files
:
for
file_info
in
processed_files
:
if
not
file_info
.
get
(
'bl'
):
if
not
file_info
.
get
(
'bl'
):
continue
continue
...
@@ -37,10 +37,12 @@ class BatchGetPodInfoWizard(models.TransientModel):
...
@@ -37,10 +37,12 @@ class BatchGetPodInfoWizard(models.TransientModel):
)
)
if
not
extracted_times
:
if
not
extracted_times
:
_logger
.
warning
(
f
"提单 {bl.bl_no} 未提取到时间信息,跳过节点推送"
)
_logger
.
warning
(
f
"提单 {bl.bl_no} 未提取到时间信息,跳过节点推送"
)
error_bl
.
append
(
bl
)
continue
continue
# 取最早时间作为提取时间(用户时区的本地时间)
# 取最早时间作为提取时间(用户时区的本地时间)
extract_time_local
=
min
(
extracted_times
)
extract_time_local
=
min
(
extracted_times
)
file_info
[
'tally_time'
]
=
extract_time_local
_logger
.
info
(
f
"提单 {bl.bl_no} 最早提取时间(本地): {extract_time_local}"
)
_logger
.
info
(
f
"提单 {bl.bl_no} 最早提取时间(本地): {extract_time_local}"
)
# 将提取时间从用户时区转换为UTC(0时区)
# 将提取时间从用户时区转换为UTC(0时区)
...
@@ -93,6 +95,11 @@ class BatchGetPodInfoWizard(models.TransientModel):
...
@@ -93,6 +95,11 @@ class BatchGetPodInfoWizard(models.TransientModel):
except
Exception
as
e
:
except
Exception
as
e
:
_logger
.
error
(
f
"验证提单 {bl.bl_no} 节点推送条件失败: {str(e)}"
)
_logger
.
error
(
f
"验证提单 {bl.bl_no} 节点推送条件失败: {str(e)}"
)
continue
continue
if
error_bl
:
if
not
self
.
_context
.
get
(
'is_skip_raise_error'
):
raise
ValidationError
(
_
(
'提单
%
s 没有提取到时间信息,请检查提单是否正确'
,
','
.
join
([
bl
.
bl_no
for
bl
in
error_bl
]))
)
return
valid_files
return
valid_files
def
_check_packages_same_status
(
self
,
ship_packages
):
def
_check_packages_same_status
(
self
,
ship_packages
):
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论