from database import MySqlDao from fastapi import APIRouter, status, HTTPException import os from .request_body import EvalReportRequest import requests from utils import ReportUtils, FileStreamUtils from core import get_logger logger = get_logger("api.eval_report") dao = MySqlDao() router = APIRouter() @router.post('/eval_report') async def eval_report(request: EvalReportRequest): """生成并上传验证报告到阿里云文件数据库""" logger.info(f"Eval report request: cultivacation_id={request.cultivacation_id}, city={request.city_uuid}, product={request.product_code}") reports_dir = os.path.join('./data/reports', request.city_uuid, request.product_code) report_util = ReportUtils(request.city_uuid, request.product_code) # 获取report数据表中eval_table的file_id,如果不为空,直接返回结果,如果为空则先创建验证数据 eval_file_id = dao.get_report_file_id(request.cultivacation_id)['val_table'].item() if eval_file_id: logger.info(f"Existing eval report found: file_id={eval_file_id}") content = [ { "id": 1, "filename": "投放验证报告", "file_id": eval_file_id } ] return {"code": 200, "msg": "success", "data": {"evalReportInfo": content}} # 获取推荐列表 file_id = dao.get_report_file_id(request.cultivacation_id)['recommend_table'].item() if file_id is None: logger.error(f"Recommend table missing for cultivacation_id={request.cultivacation_id}") return {"code": 405, "msg": "推荐表丢失,生成验证报告失败!", "data": {"reportInfo": "推荐表丢失,生成验证报告失败!"}} logger.info(f"Downloading recommend data: file_id={file_id}") recommend_data = FileStreamUtils.download_file(file_id) if recommend_data is None: logger.error(f"Failed to download recommend data: file_id={file_id}") return {"code": 405, "msg": "下载推荐数据出错,生成验证报告失败!", "data": {"reportInfo": "下载推荐数据出错,生成验证报告失败!"}} # 生成验证报告 logger.info(f"Generating eval report for period {request.start_time} to {request.end_time}") report_util.generate_eval_data(request.start_time, request.end_time, recommend_data) # 上传报告 logger.info(f"Uploading eval report to {reports_dir}") eval_report = ['投放验证报告'] file_id_map = FileStreamUtils.upload_files(reports_dir, eval_report) dao.update_eval_report_data(request.cultivacation_id, file_id_map.get('投放验证报告')) logger.info(f"Eval report uploaded: file_id={file_id_map.get('投放验证报告')}") content = [ { "id": 1, "filename": "投放验证报告", "file_id": file_id_map.get('投放验证报告') } ] return {"code": 200, "msg": "success", "data": {"evalReportInfo": content}}