提交 5ab84684 authored 作者: 贺阳's avatar 贺阳

不删除物理文件

上级 4cd82dd3
......@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论