This commit is contained in:
王思川 2022-11-20 11:13:46 +08:00
parent e11b166d5f
commit 6a04c303ab
3 changed files with 17 additions and 333 deletions

View File

@ -20,8 +20,23 @@ router = APIRouter(
@router.post("/create", summary='新建评级流程', tags=["评级流程"])
def func(schema: RatingFlowSchema.CreateRatingFlowReqBody, token: str = Header(...),
db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)):
def func(schema: RatingFlowSchema.CreateRatingFlowReqBody, token: str = Header(...), db: Session = Depends(get_db)):
# 检查企业信息
res = request_to_post(
url="http://test.fecribd.com/api/wide_data/company/search_name_by_cid/",
data={"cid": schema.company_id}
)
if not res:
raise HTTPException(status_code=202, detail="CompanyID Incorrect")
# 检查打分卡信息
res = request_to_post(
url="http://test.fecribd.com/api/model_store/scorecard/search_name_by_id/",
data={"id": schema.scorecard_id}
)
if not res:
raise HTTPException(status_code=202, detail="ScorecardID Incorrect")
# 存储新建的流程
rating_flow_obj = Crud.create_rating_flow(db=db, schema=schema)

View File

@ -1,258 +0,0 @@
import requests
from fastapi import APIRouter, Depends, HTTPException, Header
from sqlalchemy.orm import Session
from App.Crud import RatingFlowCrud as Crud, RatingFlowParticipantCrud, RatingFlowNodeCrud
from App.Schemas import RatingFlowSchema
from Utils.AccessControl.AccessUtil import rbac
from Utils.Authentication.TokenUtil import decode_token
from Utils.Common.RegisterUtils import request_to_get, request_to_post
from Utils.Common.Utils import CommonUtils
from Utils.DataBase.MongoHelperUtils import get_mongodb, MongoHelper
from Utils.DataBase.SqlAlchemyUtils import get_db
router = APIRouter(
prefix="/api/rating_flow",
dependencies=[Depends(rbac)]
)
@router.post("/create", summary='新建评级流程', tags=["评级流程"])
def func(schema: RatingFlowSchema.CreateRatingFlowReqBody, token: str = Header(...),
db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)):
# 存储新建的流程
rating_flow_obj = Crud.create_rating_flow(db=db, schema=schema)
# 新建流程节点
nodes = ["填报数据", "基本信用状况", "个体信用状况", "主体信用等级"]
for i in range(len(nodes)):
node_num = i + 1
Crud.create_rating_flow_node(db=db, node_num=node_num, node_name=nodes[i], rating_process_id=rating_flow_obj.id)
# 存储创建用户信息
decoded_info = decode_token(token=token)
user_info = decoded_info.get("user_info")
participant_schema = RatingFlowSchema.CreateParticipantReqBody()
participant_schema.participant = user_info.get("name")
participant_schema.user_id = user_info.get("uid")
participant_schema.rating_process_id = rating_flow_obj.id
Crud.create_rating_flow_participant(db=db, schema=participant_schema)
return {"rating_flow_id": rating_flow_obj.id}
@router.post("/get", summary="所有流程节点", tags=["评级流程"])
def func(_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)):
# 返回流程信息
nodes = Crud.get_rating_flow_all_nodes(db=db, mongodb=mongodb, _id=_id)
if not nodes:
raise HTTPException(status_code=400, detail="RatingFlow Not Found")
return nodes
@router.post("/save", summary="保存节点数据", tags=["评级流程"])
def func(schema: RatingFlowSchema.SaveRatingFlowNodeReqBody, db: Session = Depends(get_db),
mongodb: MongoHelper = Depends(get_mongodb)):
# 保存流程节点数据
rating_process_id = Crud.save_rating_flow_node(db=db, mongodb=mongodb, node_id=schema.node_id, data=schema.data)
if not rating_process_id:
raise HTTPException(status_code=400, detail="RatingFlowNode Not Found")
# 返回流程信息
nodes = Crud.get_rating_flow_all_nodes(db=db, mongodb=mongodb, _id=rating_process_id)
if not nodes:
raise HTTPException(status_code=400, detail="RatingFlow Not Found")
return nodes
<<<<<<< HEAD
@router.post("/list", summary="获取用户参与的所有评级流程", tags=["评级流程"])
def func(token: str = Header(...), db: Session = Depends(get_db)):
decoded_info = decode_token(token=token)
user_info = decoded_info.get("user_info")
user_id = user_info.get("uid")
items = RatingFlowParticipantCrud.list_users_rating_flows(db=db, user_id=user_id)
_list = []
for item in items:
rating_flow = {
"测评ID": item.rating_process_id,
"测评企业": item.rating_flow.company,
"测评模型": item.rating_flow.scorecard,
"测评状态": item.rating_flow.status.value
}
_list.append(rating_flow)
return _list
@router.post("/node_data", summary="获取流程节点数据", tags=["评级流程"])
def func(schema, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)):
return RatingFlowNodeCrud.get_rating_node_data(_id=schema.node_id, db=db, mongodb=mongodb)
@router.post("/import/input_data", summary="导入填报数据", tags=["评级节点"])
def func(schema: RatingFlowSchema.GetRatingDataReqBody, db: Session = Depends(get_db),
mongodb: MongoHelper = Depends(get_mongodb)):
score_card_id = schema.scorecard_id
=======
@router.get("/import/input_data", summary="导入填报数据", tags=["评级节点"])
def func(rating_flow_id: str, year: int, db: Session = Depends(get_db)):
# 获取打分卡id
node = Crud.get_rating_flow(db=db, rating_flow_id=rating_flow_id)
if not node:
raise HTTPException(status_code=400, detail="RatingFlow Not Found")
scorecard_id = node.scorecard_id
company_id = node.company_id
report_date = list()
frist_year = str(node.report_date)
report_date.append(frist_year)
for y in range(1, year):
report_date.append(str(int(frist_year[:4]) - y) + '-12-31')
>>>>>>> ps01
# 获取打分卡配置
score_card_url = 'http://test.fecribd.com:5004/api/model_store/scorecard/view?_id={}'.format(scorecard_id)
res = request_to_get(score_card_url)
if not res:
raise HTTPException(status_code=400, detail="ScoreCard Not Found")
data_table = res.get('data_table')
if not data_table:
raise HTTPException(status_code=400, detail="DataTable Not Found")
# 获取填报数据
data_url = 'http://test.fecribd.com/api/wide_data/query/fiancial_data'
data = {"cid": company_id, "report_date": report_date}
result = request_to_post(data_url, data)
if not result:
raise HTTPException(status_code=400, detail="Data Not Found")
# 整合结果
data_result = dict()
for table_name, content in data_table.items():
year_dict = dict()
for item in report_date:
data_result[table_name] = dict()
year = CommonUtils.date_conversion(item)
if table_name == '资产负债表':
balance = result.get('balance_sheet_data')
for b in balance:
insert = dict()
if b.get('截止日期') == item:
for cont in content:
insert[cont] = b.get(cont)
year_dict[year] = insert
data_result[table_name] = year_dict
if table_name == '利润表':
income = result.get('income_sheet_data')
for b in income:
insert = dict()
if b.get('截止日期') == item:
for cont in content:
insert[cont] = b.get(cont)
year_dict[year] = insert
data_result[table_name] = year_dict
if table_name == '现金流量表':
pass
return data_result
@router.get("/import/index_data", summary="导入定性定量指标", tags=["评级节点"])
def func(rating_flow_id: str, db: Session = Depends(get_db)):
# 根据评级
node = Crud.get_rating_flow(db=db, rating_flow_id=rating_flow_id)
if not node:
raise HTTPException(status_code=400, detail="RatingFlow Not Found")
scorecard_id = node.scorecard_id
company_id = node.company_id
year = node.report_date
# 根据流程节点获取数据表
data_sheets = {}
# 获取定性定量指标配置表
score_card_url = 'http://test.fecribd.com:5004/api/model_store/scorecard/view?_id={}'.format(scorecard_id)
res = request_to_get(score_card_url)
if not res:
raise HTTPException(status_code=400, detail="ScoreCard Not Found")
index_table = res.get('index_table')
score_table = res.get('rank_table')
if not index_table and not score_table:
raise HTTPException(status_code=400, detail="ScoreCard Not Found")
# 计算定性定量指标值
try:
# 读取请求参数
n = len(index_table)
score_data = score_table.get('指标及权重')
# 生成indicator的value表
indicator_values = []
for num in range(n):
judge = list()
if score_data:
gear = score_data[num].get('档位', {})
for k, v in gear.items():
item_dict = dict()
item_dict['case'] = v
item_dict['level'] = CommonUtils.get_level(k)
judge.append(item_dict)
indicator_value = {
"indicator": index_table[num].get('指标'),
"value": None,
"nature": 'quality' if index_table[num].get('指标类型') == '定性' else 'quantity',
"weight": float(score_data[num].get('权重')) * 0.01,
"judge": judge,
"reason": None
}
indicator_values.append(indicator_value)
# 依次计算指标值
for i in range(n):
if indicator_values[i]["nature"] == "quantity":
params_list = list()
# 计算指标参数
params = index_table[i].get('指标参数', [])
for param in params:
param_dict = dict()
param_dict['param'] = param['参数']
# 将year替换成年报期
report_date = CommonUtils.date_conversion(year)
y = report_date if param['加载路径'][0] == 'year' else str(
int(report_date[:4]) - int(param['加载路径'][0][-1])) + '00'
param['加载路径'][0] = y
param_dict['path'] = param['加载路径']
params_list.append(param_dict)
func_name = indicator_values[i]["indicator"]
func_args = {}
for param in [dict(item) for item in params_list]:
year, sheet, subject = param["path"][0], param["path"][1], param["path"][2]
func_args = {**func_args, **{param["param"]: data_sheets[sheet][year][subject]}}
req_url = "http://test.fecribd.com/api/index_function/{}/"
res = requests.post(req_url.format(func_name), json=func_args)
indicator_values[i]['value'] = res.json()
return indicator_values
except Exception:
raise HTTPException(status_code=400, detail="Calculate Failed")
@router.post("/import/index_score", summary="导入定性定量得分", tags=["评级节点"])
def func(schema):
pass
@router.post("/import/adjust_factors", summary="导入调整因素", tags=["评级节点"])
def func(schema):
pass
@router.post("/import/external_support", summary="导入外部支持", tags=["评级节点"])
def func(schema):
pass

View File

@ -1,73 +0,0 @@
from datetime import date
from enum import Enum, unique
from pydantic import BaseModel
@unique
class RatingFlowStatusEnum(Enum):
enum01 = "进行"
enum02 = "完成"
enum03 = "取消"
@unique
class RankLevelEnum(Enum):
enum01 = "AAA"
enum02 = "AA+"
enum03 = "AA"
enum04 = "AA-"
enum05 = "A+"
enum06 = "A"
enum07 = "A-"
enum08 = "BBB+"
enum09 = "BBB"
enum10 = "BBB-"
enum11 = "BB+"
enum12 = "BB"
enum13 = "BB-"
enum14 = "B+"
enum15 = "B"
enum16 = "B-"
enum17 = "CCC"
enum18 = "CC"
enum19 = "C"
enum20 = "-"
class CreateRatingFlowReqBody(BaseModel):
company: str = None
company_id: str = None
scorecard: str = None
scorecard_id: str = None
report_date: date = None
class CreateParticipantReqBody(BaseModel):
participant: str = None
user_id: str = None
rating_process_id: str = None
class SaveRatingFlowNodeReqBody(BaseModel):
node_id: str = None
data: dict = {}
class GetRatingDataReqBody(BaseModel):
company_id: str = None
scorecard_id: str = None
report_date: list = None
class GetIndicatorReqBody(BaseModel):
scorecard_id: str = None
<<<<<<< HEAD
class ListRatingFlowsReqBody(BaseModel):
status: RatingFlowStatusEnum = None
page: int = 1
pagesize: int = 10
=======
>>>>>>> ps01