编写评级流程节点

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 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()
if not item:
return False
return nodes_to_return(list(item.nodes))
node_list=[]
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):

View File

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

View File

@ -1,3 +1,5 @@
import datetime
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
@ -8,6 +10,8 @@ from . import Crud
from . import Schemas
from .Models import RateFlow, RateFlowNode
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)):
node = db.query(RateFlowNode).filter(
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, "完成")
# todo:表单解析
return {"message": "保存成功", "code": 200}
@ -63,10 +67,12 @@ def func(req: Schemas.RateFormSaveReq,
def func(req: Schemas.LoadApiDataReq,
token: AdminUserTokenDataModel = Depends(admin_user_auth_util.token_data_depend),
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(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '三方数据录入').first()
# todo: 三方数据录入
data = {}
data = RateUtil.load_api_data_func(company_name)
Crud.save_rate_flow_node(node.id, data, db, mongodb)
Crud.change_rate_node_status(db, node.id, "完成")
return {"message": "保存成功", "code": 200}
@ -80,8 +86,7 @@ def func(req: Schemas.SaveManDataReq,
node = db.query(RateFlowNode).filter(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '后台审核校正').first()
# todo: 后台审核校正
data = {}
Crud.save_rate_flow_node(node.id, data, db, mongodb)
Crud.save_rate_flow_node(node.id, req.data, db, mongodb)
Crud.change_rate_node_status(db, node.id, "完成")
return {"message": "保存成功", "code": 200}
@ -94,11 +99,22 @@ def func(req: Schemas.DoRateReq,
node = db.query(RateFlowNode).filter(
RateFlowNode.rate_process_id == req.rate_flow_id and RateFlowNode.node_name == '评级').first()
# todo: 进行评级
data = {}
# inde
# Rate.merge_index_data()
Crud.save_rate_flow_node(node.id, data, db, mongodb)
nodes = Crud.get_rate_flow_all_nodes(req.rate_flow_id, db, mongodb, with_content=True)
nodes_dic = {item['node_name']: item for item in nodes}
index_data_merge = RateUtil.merge_index_data(nodes_dic['表单填报']['content']['填报解析数据'],
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.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}

View File

@ -1,123 +1,18 @@
from datetime import date, datetime
from enum import Enum, unique
from typing import List, Optional
from typing import List, Optional, LiteralString
from pydantic import BaseModel
@unique
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"
RateFlowStatus = LiteralString['进行', '完成', '失败', '取消']
RateFlowNodeStatus = LiteralString['进行', '完成', '失败', '取消']
class NodeInfo(BaseModel):
node_id: Optional[str]
node_num: Optional[int]
node_name: Optional[str]
status: Optional[str]
status: Optional[RateFlowNodeStatus]
content: {}
@ -127,7 +22,7 @@ class RateFlowInfo(BaseModel):
rate_level: Optional[str]
rate_scope: Optional[float]
company_name: Optional[str]
status: Optional[str]
status: Optional[RateFlowStatus]
publish: Optional[bool]
create_time: Optional[datetime]
nodes: Optional[List[Optional[NodeInfo, any]]]
@ -165,25 +60,24 @@ class DoRateReq(BaseModel):
###########
class RateFlowInfo(BaseModel):
id: Optional[str]
rate_date: Optional[datetime]
phone: Optional[str]
rate_level: Optional[str]
rate_scope: Optional[float]
company_name: Optional[str]
status: Optional[float]
publish: Optional[bool]
create_time: Optional[datetime]
# class RateFlowInfo(BaseModel):
# id: Optional[str]
# rate_date: Optional[datetime]
# rate_level: Optional[str]
# rate_scope: Optional[float]
# company_name: Optional[str]
# status: Optional[RateFlowStatus]
# publish: Optional[bool]
# create_time: Optional[datetime]
class RateFlowAddInfo(BaseModel):
rate_date: Optional[datetime]
phone: Optional[str]
rate_level: Optional[str]
rate_scope: Optional[float]
company_name: Optional[str]
status: Optional[float]
status: Optional[RateFlowStatus]
publish: Optional[bool]
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