commercialcompany/App/Router/ReportV2Router.py

71 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
import os
import time
from docx import Document
from docxtpl import DocxTemplate
from fastapi import APIRouter, HTTPException
from starlette.background import BackgroundTask
from starlette.responses import FileResponse
from App.Controllers.report_controller import report_data_handler, table_is_none_text_supplement, handle_table_data
from App.Schemas import ReportV3Schemas
from logger import logger
router = APIRouter(
prefix="/api/report_generation_v3"
)
def del_file(path):
os.remove(path)
# 文件路径
file_template = os.path.join(os.getcwd(), 'Utils', 'File', 'template', '信用报告模板_v3.docx')
file_path = os.path.join(os.getcwd(), 'Utils', 'File', 'generate', '信用报告.docx')
@router.post("/generate_report", summary="生成word报告v2", tags=["报告生成v2"])
def func(schemas: ReportV3Schemas.ReportData):
# 获取报告模板
doc = DocxTemplate(file_template)
# 获取填报数据
report_content = schemas.dict()
file_name = '{}信用报告.docx'.format(report_content.get('企业名称'))
# 处理填报数据相关问题
report_content = report_data_handler(report_content)
# 调用openai api优化填报数据
# report_content = openai_api(report_content)
# 替换除表格以外的数据
try:
doc.render(report_content)
doc.save(file_path)
# 处理表格数据
file = Document(file_path)
tables = file.tables
# 处理表格相关数据
tables = handle_table_data(tables, report_content)
# 删除数据为空的表格
# file.tables = table_is_none(tables, report_content)
# 表格数据为空时新增描述性文字
file = table_is_none_text_supplement(file, report_content)
# 保存文件
file.save(file_path)
task = BackgroundTask(del_file, file_path)
logger.info('报告生成成功:' + file_path + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
return FileResponse(file_path, filename=file_name, media_type='application/octet-stream', background=task)
except Exception as e:
del_file(file_path)
logger.warning(e)
raise HTTPException(status_code=500, detail="生成报告失败")