from fastapi import APIRouter, File, UploadFile
|
from fastapi.responses import JSONResponse, FileResponse
|
from fastapi.exceptions import HTTPException
|
from werkzeug.utils import secure_filename
|
from app.utils.excelmerge.conformity import run_conformity
|
from pathlib import Path
|
import subprocess
|
import shutil
|
import os
|
|
|
router = APIRouter()
|
|
ALLOWED_EXTENSIONS = {'xlsx'}
|
EXCEL_FILES_PATH = 'data/output'
|
SOURCE_FILES_PATH = 'data/source'
|
output_path_value = None
|
|
|
def allowed_file(filename):
|
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
|
|
def create_dir_if_not_exists(path):
|
if not os.path.exists(path):
|
os.makedirs(path)
|
|
|
@router.post('/excel/upload')
|
async def upload_file(files: list[UploadFile] = File(...)):
|
if not any(file.filename for file in files):
|
return JSONResponse(content={"error": "没有文件部分"}, status_code=400)
|
|
create_dir_if_not_exists(SOURCE_FILES_PATH)
|
|
# 清空SOURCE_FILES_PATH目录
|
for filename in os.listdir(SOURCE_FILES_PATH):
|
file_path = os.path.join(SOURCE_FILES_PATH, filename)
|
try:
|
if os.path.isfile(file_path) or os.path.islink(file_path):
|
os.unlink(file_path)
|
elif os.path.isdir(file_path):
|
shutil.rmtree(file_path)
|
except Exception as e:
|
return JSONResponse(content={"error": "文件处理出错"}, status_code=500)
|
|
save_path_list = []
|
for file in files:
|
if file.filename == '':
|
return JSONResponse(content={"error": "没有选择文件"}, status_code=400)
|
if file and allowed_file(file.filename):
|
filename = secure_filename(file.filename)
|
save_path = os.path.join(SOURCE_FILES_PATH, filename)
|
with open(save_path, 'wb') as buffer:
|
shutil.copyfileobj(file.file, buffer)
|
save_path_list.append(save_path)
|
else:
|
return JSONResponse(content={"error": "不允许的文件类型"}, status_code=400)
|
return JSONResponse(content={"message": "文件上传成功", "paths": save_path_list}, status_code=201)
|
|
|
@router.post('/excel/conformity')
|
async def run_conformity_api():
|
global output_path_value # 声明全局变量
|
try:
|
create_dir_if_not_exists(EXCEL_FILES_PATH)
|
|
# 清空EXCEL_FILES_PATH目录
|
for filename in os.listdir(EXCEL_FILES_PATH):
|
file_path = os.path.join(EXCEL_FILES_PATH, filename)
|
try:
|
if os.path.isfile(file_path) or os.path.islink(file_path):
|
os.unlink(file_path)
|
elif os.path.isdir(file_path):
|
shutil.rmtree(file_path)
|
except Exception as e:
|
return JSONResponse(content={"error": "文件处理出错"}, status_code=500)
|
|
# 运行方法
|
output_path = run_conformity()
|
output_path_value = output_path
|
return JSONResponse(content={"message": "conformity.py 运行成功", "output_path": str(output_path)}, status_code=200)
|
except Exception as e:
|
return JSONResponse(content={"error": str(e)}, status_code=500)
|
|
|
@router.get('/excel/file/status')
|
async def get_file_status():
|
try:
|
return JSONResponse(content={"output_path": str(output_path_value)}, status_code=200)
|
except Exception as e:
|
return JSONResponse(content={"error": str(e)}, status_code=500)
|
|
|
@router.get('/excel/download_excel')
|
async def download_excel():
|
try:
|
files = os.listdir(EXCEL_FILES_PATH)
|
first_file = files[0]
|
return FileResponse(os.path.join(EXCEL_FILES_PATH, first_file), filename=first_file,
|
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
except FileNotFoundError:
|
raise HTTPException(status_code=404, detail="文件不存在")
|
except Exception as e:
|
raise HTTPException(status_code=500, detail="服务器错误")
|