71 lines
2.2 KiB
Python
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="生成报告失败")
|