编写评级流程节点

This commit is contained in:
wcq 2023-06-16 10:30:19 +08:00
parent ee4eff252f
commit f3575b1461
6 changed files with 117 additions and 348 deletions

View File

@ -1,200 +0,0 @@
from bson import ObjectId
from .Types import RateRes
from Utils.DataUtils import JsDict
from Utils.MongoUtils import MongoConnect
class Rate:
# 需要实现的方法
@staticmethod
def parse_excel_file_to_data(file_path):
"""
解析excel文件数据
:param file_path:
:return:
"""
org_excel_data = {}
return org_excel_data
@staticmethod
def parse_org_excel_data_func(org_excel_data):
"""
解析原始excel数据为指标所需数据
:param org_excel_data:
:return:
"""
index_excel_data = {}
return index_excel_data
@staticmethod
def parse_org_form_data_func(org_from_data):
"""
解析原始填报表单数据为指标所需数据
:param org_from_data:
:return:
"""
index_form_data = {}
return index_form_data
@staticmethod
def load_api_data_func():
"""
加载三方api数据
:return:
"""
api_data = {}
return api_data
@staticmethod
def merge_index_data(index_form_data, api_data, man_data):
def filter_not_none(data):
return (data and {k: v for k, v in data.items() if v is not None}) or {}
mgr_data = {
**filter_not_none(index_form_data),
**filter_not_none(api_data),
**filter_not_none(man_data)
}
return mgr_data
# 进行打分
@staticmethod
def cal_index(index_data):
rate_res = {}
return rate_res
# class Rate:
# def __init__(self, mongo_db: MongoConnect, doc_id: str = None, db_name: str = "评级数据", create_new=False):
# that = self
# if doc_id:
# self.doc_id = ObjectId(doc_id)
# else:
# if create_new:
# self.doc_id = self.create_rate_doc()
# else:
# raise Exception("doc_id为空")
# self.mongo_db = mongo_db
# self.db_name = db_name
#
# class RateData:
# org_excel_data = JsDict({})
# index_excel_data = JsDict({})
# org_form_data = JsDict({})
# index_form_data = JsDict({})
# api_data = JsDict({})
# man_data = JsDict({})
# rate_res: RateRes = JsDict({})
#
# def __init__(self):
# pass
#
# def load_data(self):
# data = that.mongo_db.db[that.db_name].find_one({'_id': that.doc_id})
# if not data:
# raise Exception(f"{that.doc_id}文档未创建")
# for key in self.__dict__.keys():
# super().__setattr__(key, data.get(key))
#
# def __setattr__(self, key, value):
# if value:
# value = JsDict(value)
# that.mongo_db.db[that.db_name].find_one_and_update({'_id': that.doc_id}, {"$set": {key: value}})
# super().__setattr__(key, value)
#
# self.rate_data = RateData()
# self.rate_data.load_data()
# # 配置部分
# self.index_model = None
#
# # 需要实现的方法
# @staticmethod
# def parse_excel_file_to_data(file_path):
# """
# 解析excel文件数据
# :param file_path:
# :return:
# """
# org_excel_data = {}
# return org_excel_data
#
# @staticmethod
# def parse_org_excel_data_func(org_excel_data):
# """
# 解析原始excel数据为指标所需数据
# :param org_excel_data:
# :return:
# """
# index_excel_data = {}
# return index_excel_data
#
# @staticmethod
# def parse_org_form_data_func(org_from_data):
# """
# 解析原始填报表单数据为指标所需数据
# :param org_from_data:
# :return:
# """
# index_form_data = {}
# return index_form_data
#
# @staticmethod
# def load_api_data_func():
# """
# 加载三方api数据
# :return:
# """
# api_data = {}
# return api_data
#
# def create_rate_doc(self):
# new_doc = self.mongo_db.db[self.db_name].insert_one({})
# return new_doc.inserted_id
#
# def cal_index_func(self, data):
# """
# 评级接口
# :param data:
# :return:
# """
# rate_res = {}
# return rate_res
#
# # 以下为业务接口,无需自定义实现
#
# def parse_org_excel_data(self, org_excel_data):
# index_excel_data = self.parse_org_excel_data_func(org_excel_data)
# self.rate_data.index_excel_data = index_excel_data
# self.rate_data.org_excel_data = org_excel_data
# return self.rate_data.index_excel_data
#
# def parse_org_form_data(self, org_from_data):
# index_form_data = self.parse_org_form_data(org_from_data)
# self.rate_data.index_form_data = index_form_data
# self.rate_data.org_form_data = org_from_data
# return self.rate_data.index_form_data
#
# def load_api_data(self):
# api_data = self.load_api_data_func()
# self.rate_data.api_data = api_data
# return self.rate_data.api_data
#
# def merge_index_data(self):
# def filter_not_none(data):
# return (data and {k: v for k, v in data.items() if v is not None}) or {}
#
# mgr_data = {
# **filter_not_none(self.rate_data.index_form_data),
# **filter_not_none(self.rate_data.index_form_data),
# **filter_not_none(self.rate_data.api_data),
# **filter_not_none(self.rate_data.man_data)
# }
# return mgr_data
#
# # 进行打分
# def cal_index(self):
# mgr_data = self.rate_data.index_form_data
# rate_res = self.cal_index_func(mgr_data)
# self.rate_data.rate_res = rate_res
# return self.rate_data.rate_res
#
#

View File

@ -31,26 +31,22 @@ def create_rate_flow_node(db: Session, node_num, node_name, rate_process_id):
def get_rate_flow_all_nodes(_id: str, db: Session, mongodb: MongoConnect, with_content=False): def get_rate_flow_all_nodes(_id: str, db: Session, mongodb: MongoConnect, with_content=False):
def nodes_to_return(objs):
__list = list()
for obj in objs:
__dict = dict()
__dict.update({"node_id": obj.id})
__dict.update({"node_num": obj.node_num})
__dict.update({"node_name": obj.node_name})
__dict.update({"status": obj.status})
if with_content:
__dict.update(
{"content": mongodb.find_data_by_id(dbname="打分评级流程", sheet=obj.node_name, _id=obj.obj_id)})
__list.append(__dict)
return __list
item = db.query(RateFlow).filter_by(id=_id).first() item = db.query(RateFlow).filter_by(id=_id).first()
if not item: if not item:
return False return False
node_list=[]
return nodes_to_return(list(item.nodes)) for node in item.nodes:
node_data = {
"node_id": node.id,
"node_num": node.node_num,
"node_name": node.node_name,
"status": node.status,
}
if with_content:
node_data['content'] = mongodb.find_data_by_id(dbname="打分评级流程", sheet=node.node_name, _id=node.obj_id)
node_list.append(node_data)
return node_list
def save_rate_flow_node(node_id: str, data: dict, db: Session, mongodb: MongoConnect): def save_rate_flow_node(node_id: str, data: dict, db: Session, mongodb: MongoConnect):

View File

@ -2,7 +2,6 @@ from sqlalchemy import Column, String, Date, Enum, ForeignKey, Integer,Float, Bo
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from Utils.TimeSerialNumUtils import create_time_serial_num from Utils.TimeSerialNumUtils import create_time_serial_num
from .Schemas import RankLevelEnum, RateFlowStatusEnum
from Context.common import common_db from Context.common import common_db

View File

@ -1,3 +1,5 @@
import datetime
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@ -8,6 +10,8 @@ from . import Crud
from . import Schemas from . import Schemas
from .Models import RateFlow, RateFlowNode from .Models import RateFlow, RateFlowNode
from Utils.MongoUtils import MongoConnect from Utils.MongoUtils import MongoConnect
from ..RateUtil import RateUtil
from ..Types.RateRes import RateRes
""" """
一个流程所需的基本接口 一个流程所需的基本接口
@ -52,9 +56,9 @@ def func(req: Schemas.RateFormSaveReq,
db: Session = Depends(common_db.get_db), mongodb: MongoConnect = Depends(mg_db.get_db)): db: Session = Depends(common_db.get_db), mongodb: MongoConnect = Depends(mg_db.get_db)):
node = db.query(RateFlowNode).filter( node = db.query(RateFlowNode).filter(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '表单填报').first() RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '表单填报').first()
Crud.save_rate_flow_node(node.id, req.data, db, mongodb) index_from_data = RateUtil.parse_org_form_data_func(req.data)
Crud.save_rate_flow_node(node.id, {"原始填报数据": req.data, "填报解析数据": index_from_data}, db, mongodb)
Crud.change_rate_node_status(db, node.id, "完成") Crud.change_rate_node_status(db, node.id, "完成")
# todo:表单解析
return {"message": "保存成功", "code": 200} return {"message": "保存成功", "code": 200}
@ -63,10 +67,12 @@ def func(req: Schemas.RateFormSaveReq,
def func(req: Schemas.LoadApiDataReq, def func(req: Schemas.LoadApiDataReq,
token: AdminUserTokenDataModel = Depends(admin_user_auth_util.token_data_depend), token: AdminUserTokenDataModel = Depends(admin_user_auth_util.token_data_depend),
db: Session = Depends(common_db.get_db), mongodb: MongoConnect = Depends(mg_db.get_db)): db: Session = Depends(common_db.get_db), mongodb: MongoConnect = Depends(mg_db.get_db)):
rate_flow = Crud.get_rate_flow(db, req.rate_flow_id)
company_name = rate_flow.company_name
node = db.query(RateFlowNode).filter( node = db.query(RateFlowNode).filter(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '三方数据录入').first() RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '三方数据录入').first()
# todo: 三方数据录入 # todo: 三方数据录入
data = {} data = RateUtil.load_api_data_func(company_name)
Crud.save_rate_flow_node(node.id, data, db, mongodb) Crud.save_rate_flow_node(node.id, data, db, mongodb)
Crud.change_rate_node_status(db, node.id, "完成") Crud.change_rate_node_status(db, node.id, "完成")
return {"message": "保存成功", "code": 200} return {"message": "保存成功", "code": 200}
@ -80,8 +86,7 @@ def func(req: Schemas.SaveManDataReq,
node = db.query(RateFlowNode).filter( node = db.query(RateFlowNode).filter(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '后台审核校正').first() RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '后台审核校正').first()
# todo: 后台审核校正 # todo: 后台审核校正
data = {} Crud.save_rate_flow_node(node.id, req.data, db, mongodb)
Crud.save_rate_flow_node(node.id, data, db, mongodb)
Crud.change_rate_node_status(db, node.id, "完成") Crud.change_rate_node_status(db, node.id, "完成")
return {"message": "保存成功", "code": 200} return {"message": "保存成功", "code": 200}
@ -94,11 +99,22 @@ def func(req: Schemas.DoRateReq,
node = db.query(RateFlowNode).filter( node = db.query(RateFlowNode).filter(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '评级').first() RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '评级').first()
# todo: 进行评级 # todo: 进行评级
data = {} nodes = Crud.get_rate_flow_all_nodes(req.rate_flow_id, db, mongodb, with_content=True)
# inde nodes_dic = {item['node_name']: item for item in nodes}
# Rate.merge_index_data() index_data_merge = RateUtil.merge_index_data(nodes_dic['表单填报']['content']['填报解析数据'],
Crud.save_rate_flow_node(node.id, data, db, mongodb) nodes_dic['三方数据']['content'],
nodes_dic['后台审核校正']['content'])
rate_res = RateUtil.cal_index(index_data_merge)
Crud.save_rate_flow_node(node.id, rate_res, db, mongodb)
Crud.change_rate_node_status(db, node.id, "完成") Crud.change_rate_node_status(db, node.id, "完成")
Crud.rate_flow_update(db,
Schemas.RateFlowUpdateInfo(
rate_date=datetime.datetime.now(),
rate_level=rate_res.content.level,
rate_scope=rate_res.content.total_score,
status="完成"
)
)
return {"message": "保存成功", "code": 200} return {"message": "保存成功", "code": 200}

View File

@ -1,123 +1,18 @@
from datetime import date, datetime from datetime import date, datetime
from enum import Enum, unique from enum import Enum, unique
from typing import List, Optional from typing import List, Optional, LiteralString
from pydantic import BaseModel from pydantic import BaseModel
RateFlowStatus = LiteralString['进行', '完成', '失败', '取消']
@unique RateFlowNodeStatus = LiteralString['进行', '完成', '失败', '取消']
class RateFlowStatusEnum(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 CreateRateFlowReqBody(BaseModel):
company: str = None
scorecard: str = None
scorecard_id: str = None
report_date: date = None
class Participant(BaseModel):
participant: str = None
user_id: str = None
class CreateRateFlowReqBodys(BaseModel):
company: str = None
company_id: str = None
scorecard: str = None
scorecard_id: str = None
report_date: date = None
participant_list: List[Participant]
class AddParticipantReqBody(BaseModel):
rate_flow_id: str = None
participant_list: List[Participant]
class CreateParticipantReqBody(BaseModel):
participant: str = None
user_id: str = None
rate_process_id: str = None
class SaveRateFlowNodeReqBody(BaseModel):
node_id: str = None
data: dict = {}
class GetRateDataReqBody(BaseModel):
company_id: str = None
scorecard_id: str = None
report_date: list = None
class GetIndicatorReqBody(BaseModel):
scorecard_id: str = None
class ListRateFlowsReqBody(BaseModel):
status: RateFlowStatusEnum = None
page: int = 1
pagesize: int = 10
class GetRateFlowNodeContentReqBody(BaseModel):
node_id: str = None
class CalculationAdjustReqBody(BaseModel):
rate_flow_id: str
adjustment: list
class ChangeStatusReqBody(BaseModel):
rate_flow_id: str
node_name: str
status: bool
class RateFlowListReqBody(BaseModel):
page: int = 1
pagesize: int = 10
class SearchFlowReqBody(BaseModel):
id: str = "评级流程ID"
class NodeInfo(BaseModel): class NodeInfo(BaseModel):
node_id: Optional[str] node_id: Optional[str]
node_num: Optional[int] node_num: Optional[int]
node_name: Optional[str] node_name: Optional[str]
status: Optional[str] status: Optional[RateFlowNodeStatus]
content: {} content: {}
@ -127,7 +22,7 @@ class RateFlowInfo(BaseModel):
rate_level: Optional[str] rate_level: Optional[str]
rate_scope: Optional[float] rate_scope: Optional[float]
company_name: Optional[str] company_name: Optional[str]
status: Optional[str] status: Optional[RateFlowStatus]
publish: Optional[bool] publish: Optional[bool]
create_time: Optional[datetime] create_time: Optional[datetime]
nodes: Optional[List[Optional[NodeInfo, any]]] nodes: Optional[List[Optional[NodeInfo, any]]]
@ -165,25 +60,24 @@ class DoRateReq(BaseModel):
########### ###########
class RateFlowInfo(BaseModel):
id: Optional[str] # class RateFlowInfo(BaseModel):
rate_date: Optional[datetime] # id: Optional[str]
phone: Optional[str] # rate_date: Optional[datetime]
rate_level: Optional[str] # rate_level: Optional[str]
rate_scope: Optional[float] # rate_scope: Optional[float]
company_name: Optional[str] # company_name: Optional[str]
status: Optional[float] # status: Optional[RateFlowStatus]
publish: Optional[bool] # publish: Optional[bool]
create_time: Optional[datetime] # create_time: Optional[datetime]
class RateFlowAddInfo(BaseModel): class RateFlowAddInfo(BaseModel):
rate_date: Optional[datetime] rate_date: Optional[datetime]
phone: Optional[str]
rate_level: Optional[str] rate_level: Optional[str]
rate_scope: Optional[float] rate_scope: Optional[float]
company_name: Optional[str] company_name: Optional[str]
status: Optional[float] status: Optional[RateFlowStatus]
publish: Optional[bool] publish: Optional[bool]
create_time: Optional[datetime] create_time: Optional[datetime]

64
Mods/Rate/RateUtil.py Normal file
View File

@ -0,0 +1,64 @@
from bson import ObjectId
from .Types.RateRes import RateRes
from Utils.DataUtils import JsDict
from Utils.MongoUtils import MongoConnect
class RateUtil:
# 需要实现的方法
@staticmethod
def parse_excel_file_to_data(file_path):
"""
解析excel文件数据
:param file_path:
:return:
"""
org_excel_data = {}
return org_excel_data
@staticmethod
def parse_org_excel_data_func(org_excel_data):
"""
解析原始excel数据为指标所需数据
:param org_excel_data:
:return:
"""
index_excel_data = {}
return index_excel_data
@staticmethod
def parse_org_form_data_func(org_from_data):
"""
解析原始填报表单数据为指标所需数据
:param org_from_data:
:return:
"""
index_form_data = {}
return index_form_data
@staticmethod
def load_api_data_func(company_name):
"""
加载三方api数据
:return:
"""
api_data = {}
return api_data
@staticmethod
def merge_index_data(index_form_data, api_data, man_data):
def filter_not_none(data):
return (data and {k: v for k, v in data.items() if v is not None}) or {}
mgr_data = {
**filter_not_none(index_form_data),
**filter_not_none(api_data),
**filter_not_none(man_data)
}
return mgr_data
# 进行打分
@staticmethod
def cal_index(index_data) -> RateRes:
rate_res: RateRes = JsDict({})
return rate_res