diff --git a/App/Crud/ProcessTableCrud.py b/App/Crud/ProcessTableCrud.py new file mode 100644 index 0000000..a4e1778 --- /dev/null +++ b/App/Crud/ProcessTableCrud.py @@ -0,0 +1,29 @@ +from sqlalchemy.orm import Session + +from App.Model import RatingConfigModel as Model +from Utils.UniqueCoder.TimeSerialNumUtils import create_time_serial_num + + +def create_process_table(db: Session, mongodb, _id, content): + item = Model.ScoreCardProcessTable() + item.id = create_time_serial_num() + item.scorecard_id = _id + obj_id = mongodb.insert_data(dbname="打分卡配置", sheet="流程表", data=content) + item.obj_id = obj_id + db.add(item) + db.commit() + return True + + +def delete_process_table(db: Session, mongodb, _id): + item = db.query(Model.ScoreCardProcessTable).filter_by(scorecard_id=_id).first() + mongodb.delete_data_by_id(dbname="打分卡配置", sheet="流程表", _id=item.obj_id) + db.query(Model.ScoreCardProcessTable).filter_by(id=item.id).delete() + db.commit() + return True + + +def get_process_table(db: Session, mongodb, _id): + item = db.query(Model.ScoreCardProcessTable).filter_by(scorecard_id=_id).first() + data = mongodb.find_data_by_id(dbname="打分卡配置", sheet="流程表", _id=item.obj_id) + return data diff --git a/App/Crud/ScoreCardCrud.py b/App/Crud/ScoreCardCrud.py index bef55af..d176001 100644 --- a/App/Crud/ScoreCardCrud.py +++ b/App/Crud/ScoreCardCrud.py @@ -4,6 +4,8 @@ from sqlalchemy.orm import Session from App.Model import RatingConfigModel as Model from App.Schema import ScoreCardSchema as Schema +from App.Schema import CategorySchema +from Utils.DataBase.MongoHelperUtils import MongoHelper from Utils.UniqueCoder.MysqlColumnIDUtils import set_next_id @@ -61,3 +63,9 @@ def search_scorecard(db: Session, schema: Schema.SearchScoreCardReqBody): ).count() return items, count + + +def get_sub_table_data(mongodb: MongoHelper, tablename: str, obj_id: str): + CategorySchema.GetSubTableDataQueryBody(**{"tablename": tablename, "obj_id": obj_id}) + item = mongodb.find_data_by_id(dbname="打分卡配置", sheet=tablename, _id=obj_id) + return item.get("data") diff --git a/App/Model/RatingConfigModel.py b/App/Model/RatingConfigModel.py index 5e072d5..7102289 100644 --- a/App/Model/RatingConfigModel.py +++ b/App/Model/RatingConfigModel.py @@ -2,7 +2,6 @@ from sqlalchemy.dialects.mysql import LONGTEXT from sqlalchemy.orm import relationship from sqlalchemy import Column, String, ForeignKey -from Utils.DataBase.MongoHelperUtils import get_mongodb from Utils.DataBase.SqlAlchemyUtils import Base, engine @@ -23,23 +22,6 @@ class ScoreCard(Base): process_table = relationship("ScoreCardProcessTable", backref="scorecard", uselist=False) scorecard_dp_ac_auth = relationship("ScoreCardDpAcAuth", back_populates="scorecard") - def search_result_format(self): - __dict = {c.name: getattr(self, c.name, None) for c in self.__table__.columns} - __dict.update({"major_category": self.major_category.__str__()}) - __dict.update({"subcategory": self.subcategory.__str__()}) - __dict.pop("subcategory_id") - __dict.pop("description") - return __dict - - def dict(self): - __dict = {c.name: getattr(self, c.name, None) for c in self.__table__.columns} - __dict.update({"major_category": self.major_category.__str__()}) - __dict.update({"subcategory": self.subcategory.__str__()}) - __dict.update({"data_table": None if not self.data_table else self.data_table.dict()}) - __dict.update({"index_table": None if not self.index_table else self.index_table.dict()}) - __dict.update({"rank_table": None if not self.rank_table else self.rank_table.dict()}) - return __dict - class ScoreCardDataTable(Base): __tablename__ = "scorecard_data_table" @@ -48,11 +30,6 @@ class ScoreCardDataTable(Base): obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id")) - def dict(self): - mongodb = get_mongodb() - item = mongodb.find_data_by_id(dbname="打分卡配置", sheet="数据表", _id=self.obj_id) - return item.get("data") - class ScoreCardIndexTable(Base): __tablename__ = "scorecard_index_table" @@ -61,11 +38,6 @@ class ScoreCardIndexTable(Base): obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id")) - def dict(self): - mongodb = get_mongodb() - item = mongodb.find_data_by_id(dbname="打分卡配置", sheet="指标表", _id=self.obj_id) - return item.get("data") - class ScoreCardRankTable(Base): __tablename__ = "scorecard_rank_table" @@ -74,11 +46,6 @@ class ScoreCardRankTable(Base): obj_id = Column(String(24)) scorecard_id = Column(String(16), ForeignKey("scorecard.id")) - def dict(self): - mongodb = get_mongodb() - item = mongodb.find_data_by_id(dbname="打分卡配置", sheet="评级表", _id=self.obj_id) - return item.get("data") - class ScoreCardProcessTable(Base): __tablename__ = "scorecard_process_table" diff --git a/App/Router/DataTableRouter.py b/App/Router/DataTableRouter.py index 968955b..8ab3932 100644 --- a/App/Router/DataTableRouter.py +++ b/App/Router/DataTableRouter.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import Session from App.Crud import ScoreCardCrud, DataTableCrud from Utils.AccessControl.AccessUtil import rbac -from Utils.DataBase.MongoHelperUtils import get_mongodb +from Utils.DataBase.MongoHelperUtils import get_mongodb, MongoHelper from Utils.DataBase.SqlAlchemyUtils import get_db router = APIRouter( @@ -16,7 +16,7 @@ router = APIRouter( @router.post("/create", summary="新建数据表") -async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db)): +async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") @@ -26,27 +26,19 @@ async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get _file = await file.read() content = json.loads(_file.decode('utf-8')) - mongodb = get_mongodb() - DataTableCrud.create_data_table(db=db, mongodb=mongodb, _id=_id, content={"data": content}) - mongodb.client.close() - return {"info": "Success"} @router.post("/delete", summary="删除数据表") -def func(_id: str, db: Session = Depends(get_db)): +def func(_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") if not item.data_table: raise HTTPException(status_code=202, detail="DataTable Not Found") - mongodb = get_mongodb() - DataTableCrud.delete_data_table(db=db, mongodb=mongodb, _id=_id) - mongodb.client.close() - return {"info": "Success"} diff --git a/App/Router/IndexTableRouter.py b/App/Router/IndexTableRouter.py index c79f3bf..70ea400 100644 --- a/App/Router/IndexTableRouter.py +++ b/App/Router/IndexTableRouter.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import Session from App.Crud import ScoreCardCrud, IndexTableCrud from Utils.AccessControl.AccessUtil import rbac -from Utils.DataBase.MongoHelperUtils import get_mongodb +from Utils.DataBase.MongoHelperUtils import get_mongodb, MongoHelper from Utils.DataBase.SqlAlchemyUtils import get_db router = APIRouter( @@ -16,7 +16,7 @@ router = APIRouter( @router.post("/create", summary="新建指标表") -async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db)): +async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") @@ -26,27 +26,19 @@ async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get _file = await file.read() content = json.loads(_file.decode('utf-8')) - mongodb = get_mongodb() - IndexTableCrud.create_index_table(db=db, mongodb=mongodb, _id=_id, content={"data": content}) - mongodb.client.close() - return {"info": "Success"} @router.post("/delete", summary="删除指标表") -def func(_id: str, db: Session = Depends(get_db)): +def func(_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") if not item.index_table: raise HTTPException(status_code=202, detail="IndexTable Not Found") - mongodb = get_mongodb() - IndexTableCrud.delete_index_table(db=db, mongodb=mongodb, _id=_id) - mongodb.client.close() - return {"info": "Success"} diff --git a/App/Router/ProcessTableRouter.py b/App/Router/ProcessTableRouter.py new file mode 100644 index 0000000..afba57e --- /dev/null +++ b/App/Router/ProcessTableRouter.py @@ -0,0 +1,57 @@ +import json + +from fastapi import APIRouter, Depends, HTTPException, UploadFile, File +from sqlalchemy.orm import Session + +from App.Crud import ScoreCardCrud, ProcessTableCrud +from Utils.AccessControl.AccessUtil import rbac +from Utils.DataBase.MongoHelperUtils import MongoHelper, get_mongodb +from Utils.DataBase.SqlAlchemyUtils import get_db + +router = APIRouter( + tags=["打分卡流程表"], + prefix="/api/model_store/scorecard/process_table", + dependencies=[Depends(rbac)] +) + + +@router.post("/create", summary="新建流程表") +async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): + item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) + if not item: + raise HTTPException(status_code=404, detail="ScoreCard Not Found") + if item.process_table: + raise HTTPException(status_code=202, detail="ProcessTable Already Existed") + + _file = await file.read() + content = json.loads(_file.decode('utf-8')) + + ProcessTableCrud.create_process_table(db=db, mongodb=mongodb, _id=_id, content={"data": content}) + + return {"info": "Success"} + + +@router.post("/delete", summary="删除流程表") +def func(_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): + item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) + if not item: + raise HTTPException(status_code=404, detail="ScoreCard Not Found") + if not item.process_table: + raise HTTPException(status_code=202, detail="ProcessTable Not Found") + + ProcessTableCrud.delete_process_table(db=db, mongodb=mongodb, _id=_id) + + return {"info": "Success"} + + +@router.post("/view", summary="查看流程表") +def func(_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): + item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) + if not item: + raise HTTPException(status_code=404, detail="ScoreCard Not Found") + if not item.process_table: + raise HTTPException(status_code=202, detail="ProcessTable Not Found") + + item = ProcessTableCrud.get_process_table(db=db, mongodb=mongodb, _id=_id) + + return item.get("data") diff --git a/App/Router/RankTableRouter.py b/App/Router/RankTableRouter.py index 9e69751..03f24e1 100644 --- a/App/Router/RankTableRouter.py +++ b/App/Router/RankTableRouter.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import Session from App.Crud import ScoreCardCrud, RankTableCrud from Utils.AccessControl.AccessUtil import rbac -from Utils.DataBase.MongoHelperUtils import get_mongodb +from Utils.DataBase.MongoHelperUtils import get_mongodb, MongoHelper from Utils.DataBase.SqlAlchemyUtils import get_db router = APIRouter( @@ -16,7 +16,7 @@ router = APIRouter( @router.post("/create", summary="新建评级表") -async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db)): +async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") @@ -26,27 +26,19 @@ async def func(_id: str, file: UploadFile = File(...), db: Session = Depends(get _file = await file.read() content = json.loads(_file.decode('utf-8')) - mongodb = get_mongodb() - RankTableCrud.create_rank_table(db=db, mongodb=mongodb, _id=_id, content={"data": content}) - mongodb.client.close() - return {"info": "Success"} @router.post("/delete", summary="删除评级表") -def func(_id: str, db: Session = Depends(get_db)): +def func(_id: str, db: Session = Depends(get_db), mongodb: MongoHelper = Depends(get_mongodb)): item = ScoreCardCrud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") if not item.rank_table: raise HTTPException(status_code=202, detail="RankTable Not Found") - mongodb = get_mongodb() - RankTableCrud.delete_rank_table(db=db, mongodb=mongodb, _id=_id) - mongodb.client.close() - return {"info": "Success"} diff --git a/App/Router/ScoreCardRouter.py b/App/Router/ScoreCardRouter.py index b33ea05..e685d4f 100644 --- a/App/Router/ScoreCardRouter.py +++ b/App/Router/ScoreCardRouter.py @@ -5,6 +5,7 @@ from App.Crud import ScoreCardCrud as Crud from App.Crud import CategoryCrud from App.Schema import ScoreCardSchema as Schema from Utils.AccessControl.AccessUtil import rbac +from Utils.DataBase.MongoHelperUtils import MongoHelper, get_mongodb from Utils.DataBase.SqlAlchemyUtils import get_db router = APIRouter( @@ -14,6 +15,17 @@ router = APIRouter( ) +def scorecard_to_dict(scorecard, mongodb: MongoHelper): + __dict = {c.name: getattr(scorecard, c.name, None) for c in scorecard.__table__.columns} + __dict.update({"major_category": scorecard.major_category.__str__()}) + __dict.update({"subcategory": scorecard.subcategory.__str__()}) + __dict.update({"data_table": None if not scorecard.data_table else Crud.get_sub_table_data(mongodb, "数据表", scorecard.data_table.obj_id)}) + __dict.update({"index_table": None if not scorecard.index_table else Crud.get_sub_table_data(mongodb, "指标表", scorecard.index_table.obj_id)}) + __dict.update({"rank_table": None if not scorecard.rank_table else Crud.get_sub_table_data(mongodb, "评级表", scorecard.rank_table.obj_id)}) + __dict.update({"process_table": None if not scorecard.process_table else Crud.get_sub_table_data(mongodb, "流程表", scorecard.process_table.obj_id)}) + return __dict + + @router.post("/create", summary="新建打分卡") def func(schema: Schema.CreateScoreCardReqBody, db: Session = Depends(get_db)): item = Crud.get_scorecard_by_name(db=db, name=schema.name) @@ -67,18 +79,26 @@ def func(_id: str, schema: Schema.EditScoreCardReqBody, db: Session = Depends(ge @router.get("/view", summary="查看打分卡") -def func(_id: str, db: Session = Depends(get_db)): +def func(_id: str, db: Session = Depends(get_db), mongodb=Depends(get_mongodb)): item = Crud.get_scorecard_by_id(db=db, _id=_id) if not item: raise HTTPException(status_code=404, detail="ScoreCard Not Found") - return item.dict() + return scorecard_to_dict(item, mongodb=mongodb) @router.post("/search", summary="查询打分卡", response_model=Schema.SearchScoreCardResBody) def func(schema: Schema.SearchScoreCardReqBody, db: Session = Depends(get_db)): scorecards, total = Crud.search_scorecard(db=db, schema=schema) - items = [scorecard.search_result_format() for scorecard in scorecards] + def search_result_format(obj): + __dict = {c.name: getattr(obj, c.name, None) for c in obj.__table__.columns} + __dict.update({"major_category": obj.major_category.__str__()}) + __dict.update({"subcategory": obj.subcategory.__str__()}) + __dict.pop("subcategory_id") + __dict.pop("description") + return __dict + + items = [search_result_format(scorecard) for scorecard in scorecards] return {"items": items, "total": total} diff --git a/App/Schema/ScoreCardSchema.py b/App/Schema/ScoreCardSchema.py index 2dbe956..297c690 100644 --- a/App/Schema/ScoreCardSchema.py +++ b/App/Schema/ScoreCardSchema.py @@ -1,9 +1,17 @@ +from enum import Enum from typing import List from pydantic import BaseModel from Utils.Schemas.CommonSchema import EditBaseModel +class SubTableNameEnum(Enum): + enum01 = "数据表" + enum02 = "指标表" + enum03 = "评级表" + enum04 = "流程表" + + class CreateScoreCardDpAcAuthReqBody(BaseModel): department_id: str = None scorecard_id: str = None @@ -41,3 +49,11 @@ class SearchScoreCardResItem(BaseModel): class SearchScoreCardResBody(BaseModel): items: List[SearchScoreCardResItem] = [] total: int = 0 + + +class GetSubTableDataQueryBody(BaseModel): + tablename: SubTableNameEnum = None + obj_id: str = None + + class Config: + use_enum_values = True diff --git a/Utils/DataBase/MongoHelperUtils.py b/Utils/DataBase/MongoHelperUtils.py index 2c76b7c..c36309f 100644 --- a/Utils/DataBase/MongoHelperUtils.py +++ b/Utils/DataBase/MongoHelperUtils.py @@ -44,5 +44,8 @@ class MongoHelper: def get_mongodb(): - db = MongoHelper("test") - return db + try: + db = MongoHelper("test") + yield db + finally: + db.client.close() diff --git a/main.py b/main.py index 4eef437..67c80e7 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,8 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from App.Router import ScoreCardRouter, CategoryRouter, DataTableRouter, IndexTableRouter, RankTableRouter +from App.Router import ScoreCardRouter, CategoryRouter, DataTableRouter, IndexTableRouter, RankTableRouter, \ + ProcessTableRouter app = FastAPI( title="模型仓库", @@ -22,3 +23,4 @@ app.include_router(CategoryRouter.router) app.include_router(DataTableRouter.router) app.include_router(IndexTableRouter.router) app.include_router(RankTableRouter.router) +app.include_router(ProcessTableRouter.router)