269 lines
13 KiB
Python
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
|