#!/usr/bin/env python3 """ 简单的上传与触发服务(FastAPI) 提供: GET / -> 上传页面 POST /upload -> 上传文件(multipart) POST /run -> 手动触发 process_report.py 部署时请确保 INPUT_DIR 与 OUTPUT_DIR 与 process_report.py 一致 """ import os import shutil import subprocess from fastapi import FastAPI, UploadFile, File, Form from fastapi.responses import HTMLResponse, JSONResponse import uvicorn INPUT_DIR = os.environ.get('INPUT_DIR', '/data/uploads') OUTPUT_DIR = os.environ.get('OUTPUT_DIR', '/data/outputs') os.makedirs(INPUT_DIR, exist_ok=True) os.makedirs(OUTPUT_DIR, exist_ok=True) app = FastAPI() @app.get('/', response_class=HTMLResponse) async def index(): # 这里直接返回 HTML 内容,不需要 templates 文件夹 return HTMLResponse(''' 采购执行表自动化 - 上传

采购执行表自动化 - 上传页面

上传后,系统将按计划自动处理或可通过API手动触发。

''') @app.post('/upload') async def upload(file: UploadFile = File(...)): save_path = os.path.join(INPUT_DIR, file.filename) with open(save_path, 'wb') as f: content = await file.read() f.write(content) return JSONResponse({'status': 'ok', 'saved': save_path, 'message': f'文件 {file.filename} 上传成功!'}) @app.post('/run') async def run_once(): # 调用核心处理脚本 proc = subprocess.run(['python', '/workspace/process_report.py'], capture_output=True, text=True) if proc.returncode == 0: return JSONResponse({'status': 'ok', 'returncode': proc.returncode, 'stdout': proc.stdout, 'stderr': proc.stderr}) else: return JSONResponse({'status': 'error', 'returncode': proc.returncode, 'stdout': proc.stdout, 'stderr': proc.stderr}, status_code=500) if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=7860)