wd-smebiz/mods/smebiz_rate/company_rate/router.py

269 lines
13 KiB
Python

import datetime
import json
from pathlib import Path
from urllib.parse import quote
import requests
from fastapi import APIRouter, Depends, HTTPException, Response
from sqlalchemy import func, distinct
from sqlalchemy.orm import Session
from starlette.responses import FileResponse
from context.common import common_db, CompanyUserTokenDataModel, company_user_auth_util, auth_util, conf
from . import schemas
from . import crud
from utils.sqlalchemy_common_utils import QueryParams, query_common
from .models import CompanyRate
from .rate_utils.utils import load_report_need_data
from ..company_user.models import CompanyUser
from ..form_file.model import FormFile
router = APIRouter(tags=["公司评级数据"])
@router.post("/company_rate/add", summary="添加公司评级数据", response_model=schemas.CompanyRateAddRes)
def company_rate_add(req: schemas.CompanyRateAddReq, db: Session = Depends(common_db.get_db),
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend)):
req.company_name = token_data.company_name
item = crud.company_rate_add(db, req)
return schemas.CompanyRateAddRes(**item.to_dict())
@router.post("/company_rate/create", summary="创建公司评级", response_model=schemas.CompanyRateAddRes)
def company_rate_add(req: schemas.CompanyRateAddReq, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)):
item = crud.company_rate_add(db, req)
return schemas.CompanyRateAddRes(**item.to_dict())
@router.post("/company_rate/upload_file", summary="问卷数据上传")
def company_rate_file_data_load(req: schemas.CompanyRateFileDataLoadReq, db: Session = Depends(common_db.get_db)):
item = crud.company_rate_file_data_load(db, req.id, req.file_md)
return "成功"
@router.post("/company_rate/upload_report_file", summary="报告文件上传")
def company_rate_report_file_data_load(req: schemas.CompanyRateFileDataLoadReq, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)):
crud.company_rate_update_report_file_md(db, req.id, req.file_md)
return "成功"
@router.post("/company_rate/delete", summary="删除公司评级数据")
def company_rate_delete(req: schemas.CompanyRateDeleteReq, db: Session = Depends(common_db.get_db)
, token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
crud.company_rate_delete(db, req.id)
return "删除成功"
@router.post("/company_rate/update", summary="更新公司评级数据", response_model=schemas.CompanyRateUpdateRes)
def company_rate_update(req: schemas.CompanyRateUpdateReq, db: Session = Depends(common_db.get_db)
, token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
item = crud.company_rate_update(db, req)
return schemas.CompanyRateUpdateRes(**item.to_dict())
@router.post("/company_rate/get", summary="获取公司评级数据", response_model=schemas.CompanyRateGetRes)
def company_rate_get(req: schemas.CompanyRateGetReq, db: Session = Depends(common_db.get_db)):
item = crud.company_rate_get(db, req.id)
if not item:
raise HTTPException(detail="未查询到信息", status_code=404)
return schemas.CompanyRateGetRes(**item.to_dict())
@router.post("/company_rate/query", summary="查询公司评级数据", response_model=schemas.CompanyRateQueryRes)
def company_rate_query(req: schemas.CompanyRateQueryReq, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)):
count, query = crud.company_rate_query(db, req)
items = [schemas.CompanyRateInfo(**item.to_lite_dict()) for item in query]
return schemas.CompanyRateQueryRes(count=count, items=items)
@router.post("/company_rate/published/query", summary="查询公司披露后的评级数据",
response_model=schemas.CompanyRateQueryRes)
def company_rate_query(req: schemas.CompanyRatePublishedQueryReq, db: Session = Depends(common_db.get_db)):
req.publish_state = "已披露"
count, query = crud.company_rate_query(db, req)
items = [schemas.CompanyRateInfo(**item.to_lite_dict()) for item in query]
return schemas.CompanyRateQueryRes(count=count, items=items)
@router.post("/company_rate/ranking", summary="查询公司评级排名数据", response_model=schemas.CompanyRateQueryRes)
def company_rate_query(req: schemas.CompanyRateQueryReq, db: Session = Depends(common_db.get_db)):
params_dict = req.dict()
query = db.query(CompanyRate).filter(CompanyRate.publish_state == '已披露').order_by(CompanyRate.rate_scope.desc())
db_model = CompanyRate
for key, value in params_dict.items():
if key not in ['page', 'page_size'] and value is not None:
if key == 'rate_level':
query = query.filter(getattr(db_model, key) == value)
continue
if type(value) == str:
query = query.filter(getattr(db_model, key).like(f'%{value}%'))
elif type(value) in [int, float, bool]:
query = query.filter_by(**{key: value})
else:
query = query.filter(getattr(db_model, key) == value)
count = query.count()
page = None
page_size = None
if 'page' in params_dict:
page = params_dict['page']
if 'page_size' in params_dict:
page_size = params_dict['page_size']
# 页数不超过100
if page is not None and page_size is not None:
page_size = min(page_size, 100)
query = query.offset((page - 1) * page_size).limit(page_size).all()
items = [schemas.CompanyRateInfo(**item.to_rank_dict()) for item in query]
return schemas.CompanyRateQueryRes(count=count, items=items)
@router.post("/company_rate/query_common", summary="通用查询公司评级数据",
response_model=schemas.CompanyRateQueryRes)
def company_rate_query_common(req: QueryParams, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)):
count, query = query_common(db, CompanyRate, req)
items = [schemas.CompanyRateInfo(**item.to_lite_dict()) for item in query]
return schemas.CompanyRateQueryRes(count=count, items=items)
@router.post("/company_rate/company_rate", summary="评级")
def company_rate(req: schemas.CompanyRateReq, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
res = crud.company_rate(db, req.id)
return res
@router.post("/company_rate/load_api_data_to_db", summary="三方接口数据导入", response_model=schemas.CompanyRateGetRes)
def company_rate(req: schemas.CompanyRateGetReq, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
res = crud.load_api_data_to_db(db, req.id)
return res.to_dict()
@router.post("/company_rate/load_api_data", summary="三方接口数据获取")
def company_rate(req: schemas.CompanyRateGetReq, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
item = db.query(CompanyRate).filter(CompanyRate.id == req.id).first()
if item:
res = crud.load_api_data(item.company_name)
return res
else:
raise HTTPException(detail="未查询到公司信息", status_code=404)
@router.post("/company_rate/get_full_info", summary="获取详细信息")
def company_rate(req: schemas.CompanyRateGetReq, db: Session = Depends(common_db.get_db)):
res = crud.get_full_info(db, req.id)
return res
@router.post("/company_rate/get_report_admin", summary="管理端获取评级报告")
def get_report(req: schemas.GetReport, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
data = load_report_need_data(db, req.id)
json.dump(data, open('ttt.json', 'w', encoding='utf-8'), ensure_ascii=False)
response = requests.post(f'{conf["rate_utils"]["host"]}/api/report_generation/generation', json.dumps(
data), timeout=15)
# print(response.json())
return Response(content=response.content, headers=dict(response.headers))
@router.post("/company_rate/get_report", summary="报告下载")
def get_report(req: schemas.GetReport, db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)
):
item = crud.company_rate_get(db, req.id)
if not (item and item.report_file_md):
raise HTTPException(status_code=404, detail="无报告文件")
file = db.query(FormFile).filter(FormFile.md == item.report_file_md).first()
if not file:
raise HTTPException(status_code=404, detail="未找到报告文件,路径不存在")
return FileResponse(Path("./" + file.file_url),
headers={"Content-Disposition": f"attachment; filename={quote(file.file_name)}"})
@router.post("/company_rate/company_user/get_report", summary="报告下载")
def get_report(req: schemas.GetReport, db: Session = Depends(common_db.get_db),
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend)
):
item = crud.company_rate_get(db, req.id)
if not (item and item.report_file_md):
raise HTTPException(status_code=404, detail="无报告文件")
if token_data.company_name != item.company_name:
raise HTTPException(status_code=403, detail="无报告查看权限")
file = db.query(FormFile).filter(FormFile.md == item.report_file_md).first()
if not file:
raise HTTPException(status_code=404, detail="未找到报告文件,路径不存在")
return FileResponse(Path("./" + file.file_url),
headers={"Content-Disposition": f"attachment; filename={quote(file.file_name)}"})
#########
@router.post("/company_rate/get_dashboard_data", summary="获取看板数据")
def get_dashboard_data(db: Session = Depends(common_db.get_db),
token_data: auth_util.tokenDataModel = Depends(auth_util.token_data_depend)):
企业总数 = db.query(CompanyUser).filter(CompanyUser.verified == True).count()
昨日新增 = db.query(CompanyUser).filter(CompanyUser.verified == True, func.date(
CompanyUser.create_time) == datetime.datetime.now().date()).count()
待处理申请 = db.query(CompanyRate).filter(CompanyRate.man_data.isnot(None),
CompanyRate.mgr_data_state != '已就绪').count()
申请企业数 = db.query((distinct(CompanyRate.company_name))).filter(CompanyRate.man_data.isnot(None),
CompanyRate.mgr_data_state != '已就绪',
).count()
待评级企业 = db.query((distinct(CompanyRate.company_name))).filter(CompanyRate.man_data.isnot(None),
CompanyRate.mgr_data_state != '已就绪').count()
总申请数 = db.query(CompanyRate).filter(CompanyRate.man_data.isnot(None)).count()
待披露企业 = db.query(CompanyRate).filter(CompanyRate.rate_state == '已评级',
CompanyRate.publish_state != '已披露').count()
披露企业数 = db.query(CompanyRate).filter(CompanyRate.publish_state == '已披露').count()
已披露企业评级等级扇形数据 = [[item[0],item[1]] for item in
db.query(CompanyRate.rate_level, func.count(CompanyRate.rate_level)).filter(
CompanyRate.publish_state == '已披露').group_by(
CompanyRate.rate_level).all()]
# 计算七天前的日期
seven_days_ago = datetime.datetime.now() - datetime.timedelta(days=7)
# 查询七天内每天创建的评级申请数量
daily_user_counts = db.query(
func.date(CompanyRate.create_time).label('date'),
func.count(CompanyRate.id).label('count')
).filter(
CompanyRate.create_time >= seven_days_ago
).group_by(
func.date(CompanyRate.create_time)
).order_by(
func.date(CompanyRate.create_time)
).all()
七日评级申请趋势数据 = [[item.date, item.count] for item in daily_user_counts]
data = {
"企业总数": 企业总数,
"昨日新增": 昨日新增,
"待处理申请": 待处理申请,
"申请企业数": 申请企业数,
"待评级企业": 待评级企业,
"总申请数": 总申请数,
"待披露企业": 待披露企业,
"披露企业数": 披露企业数,
"七日评级申请趋势数据": 七日评级申请趋势数据,
"已披露企业评级等级扇形数据": 已披露企业评级等级扇形数据
}
print(data)
return data