From f3575b1461ef7e9bec61dbe5ba6b18c4b6a9be72 Mon Sep 17 00:00:00 2001 From: wcq <744800102@qq.com> Date: Fri, 16 Jun 2023 10:30:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E5=86=99=E8=AF=84=E7=BA=A7=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mods/Rate/Rate.py | 200 ---------------------------------- Mods/Rate/RateFlow/Crud.py | 28 ++--- Mods/Rate/RateFlow/Models.py | 1 - Mods/Rate/RateFlow/Router.py | 34 ++++-- Mods/Rate/RateFlow/Schemas.py | 138 +++-------------------- Mods/Rate/RateUtil.py | 64 +++++++++++ 6 files changed, 117 insertions(+), 348 deletions(-) delete mode 100644 Mods/Rate/Rate.py create mode 100644 Mods/Rate/RateUtil.py diff --git a/Mods/Rate/Rate.py b/Mods/Rate/Rate.py deleted file mode 100644 index 7065762..0000000 --- a/Mods/Rate/Rate.py +++ /dev/null @@ -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 -# -# diff --git a/Mods/Rate/RateFlow/Crud.py b/Mods/Rate/RateFlow/Crud.py index dcfcf38..2eb2210 100644 --- a/Mods/Rate/RateFlow/Crud.py +++ b/Mods/Rate/RateFlow/Crud.py @@ -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): diff --git a/Mods/Rate/RateFlow/Models.py b/Mods/Rate/RateFlow/Models.py index 53e71cf..8ac0065 100644 --- a/Mods/Rate/RateFlow/Models.py +++ b/Mods/Rate/RateFlow/Models.py @@ -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 diff --git a/Mods/Rate/RateFlow/Router.py b/Mods/Rate/RateFlow/Router.py index eb61bc4..fd5afdb 100644 --- a/Mods/Rate/RateFlow/Router.py +++ b/Mods/Rate/RateFlow/Router.py @@ -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} diff --git a/Mods/Rate/RateFlow/Schemas.py b/Mods/Rate/RateFlow/Schemas.py index e615a55..47b4e34 100644 --- a/Mods/Rate/RateFlow/Schemas.py +++ b/Mods/Rate/RateFlow/Schemas.py @@ -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] diff --git a/Mods/Rate/RateUtil.py b/Mods/Rate/RateUtil.py new file mode 100644 index 0000000..3af82a4 --- /dev/null +++ b/Mods/Rate/RateUtil.py @@ -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