eval_report.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from database import MySqlDao
  2. from fastapi import APIRouter, status, HTTPException
  3. import os
  4. from .request_body import EvalReportRequest
  5. import requests
  6. from utils import ReportUtils, FileStreamUtils
  7. from core import get_logger
  8. logger = get_logger("api.eval_report")
  9. dao = MySqlDao()
  10. router = APIRouter()
  11. @router.post('/eval_report')
  12. async def eval_report(request: EvalReportRequest):
  13. """生成并上传验证报告到阿里云文件数据库"""
  14. logger.info(f"Eval report request: cultivacation_id={request.cultivacation_id}, city={request.city_uuid}, product={request.product_code}")
  15. reports_dir = os.path.join('./data/reports', request.city_uuid, request.product_code)
  16. report_util = ReportUtils(request.city_uuid, request.product_code)
  17. # 获取report数据表中eval_table的file_id,如果不为空,直接返回结果,如果为空则先创建验证数据
  18. eval_file_id = dao.get_report_file_id(request.cultivacation_id)['val_table'].item()
  19. if eval_file_id:
  20. logger.info(f"Existing eval report found: file_id={eval_file_id}")
  21. content = [
  22. {
  23. "id": 1,
  24. "filename": "投放验证报告",
  25. "file_id": eval_file_id
  26. }
  27. ]
  28. return {"code": 200, "msg": "success", "data": {"evalReportInfo": content}}
  29. # 获取推荐列表
  30. file_id = dao.get_report_file_id(request.cultivacation_id)['recommend_table'].item()
  31. if file_id is None:
  32. logger.error(f"Recommend table missing for cultivacation_id={request.cultivacation_id}")
  33. return {"code": 405, "msg": "推荐表丢失,生成验证报告失败!", "data": {"reportInfo": "推荐表丢失,生成验证报告失败!"}}
  34. logger.info(f"Downloading recommend data: file_id={file_id}")
  35. recommend_data = FileStreamUtils.download_file(file_id)
  36. if recommend_data is None:
  37. logger.error(f"Failed to download recommend data: file_id={file_id}")
  38. return {"code": 405, "msg": "下载推荐数据出错,生成验证报告失败!", "data": {"reportInfo": "下载推荐数据出错,生成验证报告失败!"}}
  39. # 生成验证报告
  40. logger.info(f"Generating eval report for period {request.start_time} to {request.end_time}")
  41. report_util.generate_eval_data(request.start_time, request.end_time, recommend_data)
  42. # 上传报告
  43. logger.info(f"Uploading eval report to {reports_dir}")
  44. eval_report = ['投放验证报告']
  45. file_id_map = FileStreamUtils.upload_files(reports_dir, eval_report)
  46. dao.update_eval_report_data(request.cultivacation_id, file_id_map.get('投放验证报告'))
  47. logger.info(f"Eval report uploaded: file_id={file_id_map.get('投放验证报告')}")
  48. content = [
  49. {
  50. "id": 1,
  51. "filename": "投放验证报告",
  52. "file_id": file_id_map.get('投放验证报告')
  53. }
  54. ]
  55. return {"code": 200, "msg": "success", "data": {"evalReportInfo": content}}