eval_report.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from config import load_service_config
  2. from database import MySqlDao
  3. from fastapi import APIRouter, status, HTTPException
  4. import os
  5. from .request_body import EvalReportRequest
  6. import requests
  7. from utils import ReportUtils, FileStreamUtils
  8. cfgs = load_service_config()
  9. dao = MySqlDao()
  10. router = APIRouter()
  11. @router.post('/eval_report')
  12. async def eval_report(request: EvalReportRequest):
  13. """生成并上传验证报告到阿里云文件数据库"""
  14. reports_dir = os.path.join('./data/reports', request.city_uuid, request.product_code)
  15. report_util = ReportUtils(request.city_uuid, request.product_code)
  16. # 获取report数据表中eval_table的file_id,如果不为空,直接返回结果,如果为空则先创建验证数据
  17. eval_file_id = dao.get_report_file_id(request.cultivacation_id)['val_table'].item()
  18. if eval_file_id:
  19. content = [
  20. {
  21. "id": 1,
  22. "filename": "投放验证报告",
  23. "file_id": eval_file_id
  24. }
  25. ]
  26. return {"code": 200, "msg": "success", "data": {"evalReportInfo": content}}
  27. # 获取推荐列表
  28. file_id = dao.get_report_file_id(request.cultivacation_id)['recommend_table'].item()
  29. if file_id is None:
  30. return {"code": 405, "msg": "推荐表丢失,生成验证报告失败!", "data": {"reportInfo": "推荐表丢失,生成验证报告失败!"}}
  31. recommend_data = FileStreamUtils.download_file(file_id)
  32. if recommend_data is None:
  33. return {"code": 405, "msg": "下载推荐数据出错,生成验证报告失败!", "data": {"reportInfo": "下载推荐数据出错,生成验证报告失败!"}}
  34. # 生成验证报告
  35. report_util.generate_eval_data(request.limit_cycle_name, recommend_data)
  36. # 上传报告
  37. eval_report = ['投放验证报告']
  38. file_id_map = FileStreamUtils.upload_files(reports_dir, eval_report)
  39. dao.update_eval_report_data(request.cultivacation_id, file_id_map.get('投放验证报告'))
  40. content = [
  41. {
  42. "id": 1,
  43. "filename": "投放验证报告",
  44. "file_id": file_id_map.get('投放验证报告')
  45. }
  46. ]
  47. return {"code": 200, "msg": "success", "data": {"evalReportInfo": content}}
  48. @router.post('/eval_report')
  49. async def eval_report(request: EvalReportRequest):
  50. """获取验证报告"""
  51. reports_dir = os.path.join('./data/reports', request.city_uuid, request.product_code)
  52. # 首先生成验证报告
  53. report_util = ReportUtils(request.city_uuid, request.product_code)
  54. report_util.generate_eval_data(request.start_time, request.end_time)
  55. # 其次上传验证报告到阿里云
  56. base_url = cfgs["aliyun"]["upload_url"]
  57. headers = {
  58. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
  59. "Accept": "*/*",
  60. }
  61. cookies = {
  62. "expires_in": "10800000",
  63. "ecp_token": "ZXlKamIyUmxJam9pT1dZNFltRTNOVGhrTW1WbVpUYzRaR05oWkRZME5ERTRPREU1TkRObU9EY2lMQ0p6WTI5d1pTSTZJbkJ5YjNSbFkzUmxaQ0lzSW1Oc2FXVnVkQ0k2SW1Oc2FXVnVkRjlzYjI1bmFta2lmUT09",
  64. "acw_tc": "0a067c4317466919842786603e2653311180a2a4fa0fd05acb99cf0458b890",
  65. "isg": "BDAwNyXyI9cQD__-0PkIodjTAfiCeRTD-vUtYyqmIw3d5bGP0Y0nUayWOe2F3syb",
  66. "dd-ztna-token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIwNTAwMzQzMDM4MjYxNDMwOTQiLCJjb3JwSWQiOiJkaW5nYzc2YTJhMzdiMjRhODYwYTRhYzVkNjk4MDg2NGQzMzUiLCJkZXB0SWRzIjoiW1s4Mzk0NzIxNjAsODM2MjQ1MTUzLDFdXSIsInJvbGVJZHMiOiJbMjEwNDk3MDY1OF0iLCJ1bmlvbklkIjoiVXFyYTB4U0VQcWNxdFNhQTFqSzRzZ2lFaUUiLCJleHAiOjE3NDcxODQ3MjksImlhdCI6MTc0NjU3OTkyOX0.dfv612-LwnIdoKL2G73gg7LYy8SBmvr3Zaan97Q5wGUbEFdWw0JUqOQQ1jdeom_Nd9FNCHlkZM32DvwyUrNnvbg1QQy2JeYEpAgysG4h0MT_OghE6-xGVQBIkg72GPTo_cvdMYG9SMfaCo5H-73zFfwMFASFoXCDoIPha6NioIskOJMmvQVsDkHtRXYh_gv0XaJxSWirDWhKC9vxPGaIwDff8doHwPdi9uO-tO9LFy9RXdyIsBXWem31rBSD3D6FmqZLZjOOZhCKMym1VenfIKC10Oa1zm8-Y8bGyMHG0LO_68AJstKYT4alJoBVDHXpMp3zvSXXQB6da_fIthQD4A"
  67. }
  68. eval_file_path = os.path.join(reports_dir, "投放验证报告.xlsx")
  69. try:
  70. with open(eval_file_path, 'rb') as f:
  71. files = {'file': (os.path.basename(eval_file_path), f)}
  72. response = requests.post(
  73. base_url,
  74. headers=headers,
  75. files=files,
  76. verify=True
  77. )
  78. if response.json()["success"]:
  79. file_id = response.json()["data"]["file_info"]["fileid"]
  80. return {"code": 200, "msg": "success", "data": {"reportInfo": {"id": 1, "filename": "投放验证报告", "file_id": file_id}}}
  81. else:
  82. raise HTTPException(
  83. status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
  84. detail="reports upload failed"
  85. )
  86. except requests.exceptions.RequestException as e:
  87. print("请求出错:", e)
  88. except Exception as e:
  89. print("发生错误:", e)
  90. # 最后将file_id返回给前端