changes
This commit is contained in:
parent
e11b166d5f
commit
6a04c303ab
|
@ -20,8 +20,23 @@ router = APIRouter(
|
||||||
|
|
||||||
|
|
||||||
@router.post("/create", summary='新建评级流程', tags=["评级流程"])
|
@router.post("/create", summary='新建评级流程', tags=["评级流程"])
|
||||||
def func(schema: RatingFlowSchema.CreateRatingFlowReqBody, token: str = Header(...),
|
def func(schema: RatingFlowSchema.CreateRatingFlowReqBody, token: str = Header(...), db: Session = Depends(get_db)):
|
||||||
db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)):
|
|
||||||
|
# 检查企业信息
|
||||||
|
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)
|
rating_flow_obj = Crud.create_rating_flow(db=db, schema=schema)
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
Loading…
Reference in New Issue