From 96a42730162fb2b35e0f469caae8e0502628cc26 Mon Sep 17 00:00:00 2001 From: wcq <744800102@qq.com> Date: Mon, 18 Sep 2023 16:09:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9C=8B=E6=9D=BF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 6 ++++ .vscode/settings.json | 11 ++++++ main.py | 8 +++-- mods/rate/mods/rate_serve/router.py | 51 ++++++++++++++++++++++------ mods/rate/mods/rate_serve/schemas.py | 8 +++++ 5 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..fe0f413 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,6 @@ +{ + "version": "0.2.0", + "configurations": [ + {"name":"main","type":"python","request":"launch","program":"main.py","console":"integratedTerminal","justMyCode":true}, + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..83e6410 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.autopep8" + }, + "editor.defaultFormatter": null, + "editor.formatOnPaste": false, + "editor.formatOnSave": true, + "[jsonc]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, +} \ No newline at end of file diff --git a/main.py b/main.py index 2535c81..d7deb5a 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from starlette.staticfiles import StaticFiles from config.log import uvicorn_log_config -from context.common import conf, common_db, common_db_v2,common_db_base_v2 +from context.common import conf, common_db, common_db_v2, common_db_base_v2 from mods import router as main_router common_db.init_database(create_db=True) @@ -19,7 +19,8 @@ app = FastAPI( ) if not os.path.exists("static"): os.makedirs("static") -app.mount(f"/{sys_name}/static", StaticFiles(directory="static"), name="static") +app.mount(f"/{sys_name}/static", + StaticFiles(directory="static"), name="static") app.add_middleware( CORSMiddleware, allow_origins=["*"], @@ -32,4 +33,5 @@ app.router.prefix = f"/{sys_name}" app.include_router(main_router.router) print(f"接口文档链接: http://127.0.0.1:{conf['app']['port']}{app.docs_url}") if __name__ == '__main__': - uvicorn.run(app, log_config=uvicorn_log_config, host="0.0.0.0", port=int(conf['app']['port'])) + uvicorn.run(app, log_config=uvicorn_log_config, + host="0.0.0.0", port=int(conf['app']['port'])) diff --git a/mods/rate/mods/rate_serve/router.py b/mods/rate/mods/rate_serve/router.py index 8af5e1b..cd672a1 100644 --- a/mods/rate/mods/rate_serve/router.py +++ b/mods/rate/mods/rate_serve/router.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from fastapi import APIRouter, Depends, HTTPException, File from sqlalchemy.orm import Session @@ -11,9 +11,8 @@ from . import crud from . import schemas from .utils import RateServeFlow, get_node_if_not_finished, RateUtils, get_node from ...models import RateDataPreparationNode, RateServe, RateWorkNode, ReportWorkNode, CertWorkNode -from ...schemas import NodeState +from ...schemas import NodeState, RateServeState from fastapi import UploadFile as FastApiUploadFile, Form - router = APIRouter(tags=["评级服务"], prefix='') @@ -68,7 +67,8 @@ def pass_node(req: schemas.PassNodeReq, db: Session = Depends(get_db)): @router.post("/rate_serve/update_node_remark", summary="节点备注编辑接口") def update_node_remark(req: schemas.UpdateNodeRemarkReq, db: Session = Depends(get_db)): - RateServeFlow.update_node_remark(db, req.serve_id, req.node_name, req.remark) + RateServeFlow.update_node_remark( + db, req.serve_id, req.node_name, req.remark) return "保存成功" @@ -94,7 +94,8 @@ def rate_serve_cancel(req: schemas.RateServeCancelReq, db: Session = Depends(get @router.post("/rate_post_data_check_node/update_rate_sheet_data", summary="更新企业填报数据", tags=['企业提交材料审核节点']) def update_rate_sheet_data(req: schemas.UpdateRateSheetDataReq, db: Session = Depends(get_db)): - node, serve = get_node_if_not_finished(db, req.serve_id, 'rate_post_data_check_node') + node, serve = get_node_if_not_finished( + db, req.serve_id, 'rate_post_data_check_node') node.data = req.data db.commit() return "保存成功" @@ -104,8 +105,10 @@ def update_rate_sheet_data(req: schemas.UpdateRateSheetDataReq, db: Session = De @router.post("/rate_data_preparation_node/api_data/load", summary="导入三方接口数据", tags=['三方接口数据审核节点']) def api_data_load(req: schemas.ApiDataLoadReq, db: Session = Depends(get_db)): - node, serve = get_node_if_not_finished(db, req.serve_id, 'rate_data_preparation_node') - serve: RateServe = db.query(RateServe).filter(RateServe.serve_id == req.serve_id).first() + node, serve = get_node_if_not_finished( + db, req.serve_id, 'rate_data_preparation_node') + serve: RateServe = db.query(RateServe).filter( + RateServe.serve_id == req.serve_id).first() if not serve.company: raise HTTPException(status_code=303, detail='该评级申请未绑定公司信息') data, schema = RateUtils.load_api_data_by_company_name(serve.company.name) @@ -125,7 +128,8 @@ def api_data_get(req: schemas.ApiDataGetReq, db: Session = Depends(get_db)): @router.post("/rate_data_preparation_node/api_data/update", summary="更新三方接口数据", tags=['三方接口数据审核节点']) def api_data_update(req: schemas.ApiDataUpdateReq, db: Session = Depends(get_db)): - node, serve = get_node_if_not_finished(db, req.serve_id, 'rate_data_preparation_node') + node, serve = get_node_if_not_finished( + db, req.serve_id, 'rate_data_preparation_node') node.data = req.data db.commit() return "导入成功" @@ -155,7 +159,8 @@ def do_rate(req: schemas.DoRateReq, db: Session = Depends(get_db)): @router.post("/report_work_node/make_report", summary="报告生成接口", tags=['报告生成节点']) def make_report(req: schemas.MakeReportReq, db: Session = Depends(get_db)): - node, serve = get_node_if_not_finished(db, req.serve_id, 'report_work_node') + node, serve = get_node_if_not_finished( + db, req.serve_id, 'report_work_node') serve: RateServe node: ReportWorkNode company_name = serve.company.name @@ -172,7 +177,8 @@ def make_report(req: schemas.MakeReportReq, db: Session = Depends(get_db)): req.report_time, req.expiry_year) report_file_name = f"{company_name}评级报告.docx" - file = file_upload_by_content(db, report_file_name, content, 'application/docx', 'docx', sub_type='初版评级报告') + file = file_upload_by_content( + db, report_file_name, content, 'application/docx', 'docx', sub_type='初版评级报告') node.origin_file_id = file.id node.origin_create_time = datetime.now() db.commit() @@ -202,8 +208,31 @@ def make_cert(req: schemas.CertWorkNodeReq, db: Session = Depends(get_db)): node: CertWorkNode company_name = serve.company.name report_file_name = f"{company_name}证书.docx" - file = file_upload_by_content(db, report_file_name, b"", 'application/docx', 'docx', sub_type='评级证书') + file = file_upload_by_content( + db, report_file_name, b"", 'application/docx', 'docx', sub_type='评级证书') node.file_id = file.id node.cert_create_time = datetime.now() db.commit() return "报告生成成功" + + +@router.post("/rate_serve/dashboard_data/get", summary="看板数据获取", response_model=schemas.DashboardDataGetRes, + tags=['看板数据']) +def make_cert(db: Session = Depends(get_db)): + examining = db.query(RateServe).filter( + RateServe.status == RateServeState.examining).count() + rating = db.query(RateServe).filter( + RateServe.status == RateServeState.rating).count() + publish = 0 + published = 0 + work_days = [(item.finish_time-item.create_time).total_seconds()/24/60/60 for item in db.query( + RateServe).filter(RateServe.finish_time > (datetime.now()-timedelta(days=15)))] + average_work_day = round( + sum(work_days)/len(work_days), 1) if work_days else 0 + return { + "examining": examining, + "rating": rating, + "publish": publish, + "published": published, + "average_work_day": average_work_day + } diff --git a/mods/rate/mods/rate_serve/schemas.py b/mods/rate/mods/rate_serve/schemas.py index 1a78144..a58b3ce 100644 --- a/mods/rate/mods/rate_serve/schemas.py +++ b/mods/rate/mods/rate_serve/schemas.py @@ -203,3 +203,11 @@ class FinalReportUploadReq(RateServeId): class CertWorkNodeReq(RateServeId): cert_time: datetime expiry_year: Optional[int] = 2 + + +class DashboardDataGetRes(BaseModel): + examining: int + rating: int + publish: int + published: int + average_work_day: float