Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
hh_ccs
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
贺阳
hh_ccs
Commits
5ab84684
提交
5ab84684
authored
10月 31, 2025
作者:
贺阳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
不删除物理文件
上级
4cd82dd3
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
7 行增加
和
107 行删除
+7
-107
batch_get_pod_info_wizard.py
ccs_base/wizard/batch_get_pod_info_wizard.py
+7
-107
没有找到文件。
ccs_base/wizard/batch_get_pod_info_wizard.py
浏览文件 @
5ab84684
...
...
@@ -101,8 +101,6 @@ class BatchGetPodInfoWizard(models.TransientModel):
# 序列化并存储处理后的文件数据
if
processed_files
:
self
.
processed_files_data
=
self
.
_serialize_processed_files
(
processed_files
)
logging
.
info
(
f
"processed_files_data: {self.processed_files_data}"
)
_logger
.
info
(
f
"预览完成,已处理 {len(processed_files)} 个文件"
)
else
:
self
.
processed_files_data
=
''
...
...
@@ -208,18 +206,15 @@ class BatchGetPodInfoWizard(models.TransientModel):
# 回写到附件信息
if
processed_files
and
(
self
.
sync_last_mile_pod
or
self
.
sync_match_node
):
logging
.
info
(
f
"回写PDF文件到清关文件,共 {len(processed_files)} 个文件"
)
# 回写PDF文件到清关文件
self
.
_write_pdf_file
(
processed_files
)
# 再同步和回写
if
self
.
sync_last_mile_pod
and
processed_files
:
logging
.
info
(
f
"同步和回写尾程POD信息,共 {len(processed_files)} 个文件"
)
self
.
_sync_last_mile_pod
(
processed_files
)
# 同步推送匹配节点
if
self
.
sync_match_node
and
processed_files
:
logging
.
info
(
f
"同步推送匹配节点,共 {len(processed_files)} 个文件"
)
#且需先对比小包当前节点的操作时间是否小于提取时间(同时区对比)若大于则不能推送,
# 若需补推节点,则需判断提取时间-写入节点(不取写入第一个节点)的前序间隔时间是否大于小包当前节点的操作时间。
# 若不满足以上条件,则不执行生成和自动推送节点,并在小包上新增推送备注(新增该字段)回写备注信息:获取尾程POD,自动推送节点失败,有风险产生倒挂。请手动操作205-10-20 10:20:20(获取时间)
...
...
@@ -229,8 +224,9 @@ class BatchGetPodInfoWizard(models.TransientModel):
else
:
_logger
.
info
(
f
"没有满足条件的文件,不执行生成和自动推送节点"
)
# 清理所有临时文件(包括数据库记录和物理文件)
self
.
_cleanup_all_temp_files
(
bl_objs
)
# 清理所有临时文件(包括数据库记录和物理文件),不能删,不然回写的时候没有文件了
self
.
_cleanup_temp_attachments
(
bl_objs
)
end_time
=
time
.
time
()
_logger
.
info
(
f
"批量获取POD信息操作完成,耗时: {end_time - start_time}秒"
)
...
...
@@ -335,8 +331,6 @@ class BatchGetPodInfoWizard(models.TransientModel):
Write PDF file to clearance files # 回写PDF文件到清关文件
:param processed_files: 处理后的文件数组
"""
logging
.
info
(
'processed_files:
%
s'
%
processed_files
)
logging
.
info
(
'processed_files type:
%
s'
%
type
(
processed_files
))
for
file_info
in
processed_files
:
if
not
file_info
.
get
(
'bl'
):
_logger
.
warning
(
"跳过没有提单信息的文件"
)
...
...
@@ -344,11 +338,9 @@ class BatchGetPodInfoWizard(models.TransientModel):
bl
=
file_info
[
'bl'
]
file_name
=
file_info
.
get
(
'file_name'
,
''
)
file_data
=
file_info
.
get
(
'file_data'
,
''
)
_logger
.
info
(
f
"处理提单 {bl.bl_no}, 文件名: {file_name}, 文件数据长度: {len(file_data) if file_data else 0}"
)
if
not
file_data
:
_logger
.
warning
(
f
"提单 {bl.bl_no} 的文件数据为空,跳过回写"
)
continue
# 如果有文件为空的就回写,否则就创建新的清关文件记录
...
...
@@ -1825,97 +1817,14 @@ class BatchGetPodInfoWizard(models.TransientModel):
(
'res_id'
,
'in'
,
bl_objs
.
ids
),
(
'name'
,
'like'
,
'temp_pod_
%
'
)
])
if
attachments
:
attachment_names
=
[
att
.
name
for
att
in
attachments
]
# 删除物理文件(服务器和本地开发环境)
for
attachment
in
attachments
:
try
:
# 获取附件的物理文件路径
if
hasattr
(
attachment
,
'store_fname'
)
and
attachment
.
store_fname
:
# Odoo 12+ 使用 store_fname
file_path
=
attachment
.
store_fname
elif
hasattr
(
attachment
,
'datas_fname'
)
and
attachment
.
datas_fname
:
# 旧版本使用 datas_fname
file_path
=
attachment
.
datas_fname
else
:
# 尝试从 name 字段构建路径
file_path
=
attachment
.
name
# 构建完整的文件路径
import
os
from
odoo.tools
import
config
# 获取 Odoo 数据目录
data_dir
=
config
.
filestore
(
self
.
env
.
cr
.
dbname
)
if
data_dir
and
file_path
:
full_path
=
os
.
path
.
join
(
data_dir
,
file_path
)
if
os
.
path
.
exists
(
full_path
):
os
.
remove
(
full_path
)
_logger
.
info
(
f
"已删除物理文件: {full_path}"
)
else
:
_logger
.
warning
(
f
"物理文件不存在: {full_path}"
)
# 检查本地开发环境的文件(如果存在)
local_paths
=
[
f
"./temp_pod_files/{attachment.name}"
,
f
"./addons/ccs_base/wizard/temp_files/{attachment.name}"
,
f
"./temp_files/{attachment.name}"
,
f
"./ccs_base/wizard/temp_files/{attachment.name}"
,
f
"../temp_files/{attachment.name}"
,
]
for
local_path
in
local_paths
:
try
:
if
os
.
path
.
exists
(
local_path
):
os
.
remove
(
local_path
)
_logger
.
info
(
f
"已删除本地文件: {local_path}"
)
except
Exception
as
local_e
:
_logger
.
warning
(
f
"删除本地文件失败 {local_path}: {str(local_e)}"
)
except
Exception
as
file_e
:
_logger
.
warning
(
f
"删除物理文件失败 {attachment.name}: {str(file_e)}"
)
# 删除数据库记录
attachments
.
unlink
()
_logger
.
info
(
f
"已清理临时附件: {attachment_names}"
)
except
Exception
as
e
:
_logger
.
error
(
f
"清理临时附件失败: {str(e)}"
)
def
_cleanup_all_temp_files
(
self
,
bl_objs
=
None
):
"""
清理所有临时文件,包括数据库记录和物理文件
"""
try
:
# 清理临时附件
self
.
_cleanup_temp_attachments
(
bl_objs
)
# 清理可能存在的其他临时文件
import
os
import
glob
# 清理当前目录下的临时文件
temp_patterns
=
[
"./temp_pod_*.pdf"
,
"./temp_files/temp_pod_*.pdf"
,
"./addons/ccs_base/wizard/temp_files/temp_pod_*.pdf"
,
"./ccs_base/wizard/temp_files/temp_pod_*.pdf"
,
]
for
pattern
in
temp_patterns
:
try
:
files
=
glob
.
glob
(
pattern
)
for
file_path
in
files
:
if
os
.
path
.
exists
(
file_path
):
os
.
remove
(
file_path
)
_logger
.
info
(
f
"已删除临时文件: {file_path}"
)
except
Exception
as
e
:
_logger
.
warning
(
f
"清理临时文件失败 {pattern}: {str(e)}"
)
except
Exception
as
e
:
_logger
.
error
(
f
"清理所有临时文件失败: {str(e)}"
)
def
_serialize_processed_files
(
self
,
processed_files
):
"""
将processed_files序列化为JSON字符串,文件数据存储到临时附件中
...
...
@@ -2051,11 +1960,8 @@ class BatchGetPodInfoWizard(models.TransientModel):
try
:
# 计算1天前的时间(前一天23:59:59)
today
=
datetime
.
now
()
.
replace
(
hour
=
0
,
minute
=
0
,
second
=
0
,
microsecond
=
0
)
one_day_ago
=
today
-
timedelta
(
seconds
=
1
)
# 前一天23:59:59
one_day_ago
=
today
+
timedelta
(
days
=
2
)
-
timedelta
(
seconds
=
1
)
# 前一天23:59:59
_logger
.
info
(
f
"开始执行定时清理临时附件任务,清理时间点: {one_day_ago.strftime('
%
Y-
%
m-
%
d
%
H:
%
M:
%
S')}"
)
# 使用SQL查询查找1天之前创建的临时附件
_logger
.
info
(
"使用SQL查询查找临时附件"
)
# 构建SQL查询
sql_query
=
"""
SELECT id, name, res_model, res_id, create_date, store_fname
...
...
@@ -2102,18 +2008,12 @@ class BatchGetPodInfoWizard(models.TransientModel):
full_path
=
os
.
path
.
join
(
data_dir
,
file_path
)
if
os
.
path
.
exists
(
full_path
):
os
.
remove
(
full_path
)
_logger
.
info
(
f
"已删除物理文件: {full_path}"
)
else
:
_logger
.
warning
(
f
"物理文件不存在: {full_path}"
)
except
Exception
as
file_e
:
_logger
.
warning
(
f
"删除物理文件失败 {attachment.name}: {str(file_e)}"
)
# 删除数据库记录
temp_attachments
.
unlink
()
_logger
.
info
(
f
"定时清理完成,共删除 {attachment_count} 个{one_day_ago.strftime('
%
Y-
%
m-
%
d')}之前创建的临时附件: {', '.join(attachment_names[:5])}{'...' if len(attachment_names) > 5 else ''}"
)
else
:
_logger
.
info
(
f
"没有找到{one_day_ago.strftime('
%
Y-
%
m-
%
d')}之前创建的临时附件需要清理"
)
except
Exception
as
e
:
_logger
.
error
(
f
"定时清理临时附件失败: {str(e)}"
)
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论