ai-business-write/upload_template_to_minio.py
2025-12-04 14:41:20 +08:00

193 lines
5.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
将初步核实审批表模板上传到MinIO并更新数据库
"""
import pymysql
from minio import Minio
from minio.error import S3Error
from datetime import datetime
import os
from urllib.parse import urlparse
# MinIO连接配置
MINIO_CONFIG = {
'endpoint': 'minio.datacubeworld.com:9000',
'access_key': 'JOLXFXny3avFSzB0uRA5',
'secret_key': 'G1BR8jStNfovkfH5ou39EmPl34E4l7dGrnd3Cz0I',
'secure': True # 使用HTTPS
}
# 数据库连接配置
DB_CONFIG = {
'host': '152.136.177.240',
'port': 5012,
'user': 'finyx',
'password': '6QsGK6MpePZDE57Z',
'database': 'finyx',
'charset': 'utf8mb4'
}
# 固定值
TENANT_ID = 615873064429507639
UPDATED_BY = 655162080928945152
CURRENT_TIME = datetime.now()
# 文件配置
TEMPLATE_FILE = '模板/初步核实审批表模板.docx'
BUCKET_NAME = 'finyx' # 存储桶名称
TENANT_ID = '615873064429507639'
# MinIO中的对象名称相对路径按照现有目录结构组织
from datetime import datetime
now = datetime.now()
OBJECT_NAME = f'{TENANT_ID}/TEMPLATE/{now.year}/{now.month:02d}/初步核实审批表模板.docx'
def upload_to_minio():
"""上传文件到MinIO"""
print("="*60)
print("开始上传文件到MinIO...")
print("="*60)
try:
# 创建MinIO客户端
client = Minio(
MINIO_CONFIG['endpoint'],
access_key=MINIO_CONFIG['access_key'],
secret_key=MINIO_CONFIG['secret_key'],
secure=MINIO_CONFIG['secure']
)
# 检查存储桶是否存在
found = client.bucket_exists(BUCKET_NAME)
if not found:
raise Exception(f"存储桶 '{BUCKET_NAME}' 不存在,请先创建")
else:
print(f"✓ 存储桶 '{BUCKET_NAME}' 已存在")
# 检查文件是否存在
if not os.path.exists(TEMPLATE_FILE):
raise FileNotFoundError(f"模板文件不存在: {TEMPLATE_FILE}")
file_size = os.path.getsize(TEMPLATE_FILE)
print(f"\n文件信息:")
print(f" 本地路径: {TEMPLATE_FILE}")
print(f" 文件大小: {file_size} 字节")
print(f" 存储桶: {BUCKET_NAME}")
print(f" 对象名称: {OBJECT_NAME}")
# 上传文件
print(f"\n正在上传文件...")
client.fput_object(
BUCKET_NAME,
OBJECT_NAME,
TEMPLATE_FILE,
content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document'
)
# 生成访问URL相对路径用于数据库存储
# 根据接口文档file_path应该存储相对路径不包含存储桶名称
file_path = f"/{OBJECT_NAME}"
print(f"✓ 文件上传成功!")
print(f" 文件路径(相对): {file_path}")
return file_path
except S3Error as e:
print(f"MinIO错误: {e}")
raise
except Exception as e:
print(f"上传文件时发生错误: {e}")
raise
def update_database(file_path):
"""更新数据库中的文件路径"""
print("\n" + "="*60)
print("开始更新数据库...")
print("="*60)
try:
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()
# 查找初步核实审批表的配置记录
select_sql = """
SELECT id, name, file_path
FROM f_polic_file_config
WHERE tenant_id = %s AND name = '初步核实审批表'
"""
cursor.execute(select_sql, (TENANT_ID,))
record = cursor.fetchone()
if not record:
print("错误: 未找到'初步核实审批表'的配置记录")
print("请先运行 init_preliminary_verification_fields.py 创建配置记录")
conn.close()
return False
record_id, record_name, old_path = record
print(f"找到配置记录:")
print(f" ID: {record_id}")
print(f" 名称: {record_name}")
print(f" 旧路径: {old_path}")
print(f" 新路径: {file_path}")
# 更新文件路径
update_sql = """
UPDATE f_polic_file_config
SET file_path = %s, updated_time = %s, updated_by = %s
WHERE id = %s AND tenant_id = %s
"""
cursor.execute(update_sql, (file_path, CURRENT_TIME, UPDATED_BY, record_id, TENANT_ID))
conn.commit()
print(f"\n✓ 数据库更新成功!")
# 验证更新
cursor.execute(select_sql, (TENANT_ID,))
updated_record = cursor.fetchone()
if updated_record and updated_record[2] == file_path:
print(f"✓ 验证成功: 文件路径已更新为 {updated_record[2]}")
else:
print(f"⚠ 警告: 验证失败,请手动检查")
conn.close()
return True
except Exception as e:
print(f"更新数据库时发生错误: {e}")
import traceback
traceback.print_exc()
return False
def main():
"""主函数"""
try:
# 上传文件到MinIO
file_path = upload_to_minio()
# 更新数据库
success = update_database(file_path)
if success:
print("\n" + "="*60)
print("所有操作完成!")
print("="*60)
print(f"\n文件已上传到MinIO路径: {file_path}")
print(f"数据库已更新")
else:
print("\n" + "="*60)
print("操作完成,但数据库更新失败,请检查")
print("="*60)
except Exception as e:
print(f"\n错误: {e}")
import traceback
traceback.print_exc()
if __name__ == '__main__':
main()