wd-smebiz-client/mods/rate/client/rate_serve/router.py

134 lines
6.6 KiB
Python
Raw Normal View History

2023-09-11 10:37:07 +08:00
import os
from pathlib import Path
from fastapi import APIRouter, Depends, Header, UploadFile as FastApiUploadFile, File, HTTPException
from sqlalchemy.orm import Session
from context.common import CompanyUserTokenDataModel, company_user_auth_util
from utils.common_utils import file_md5
from utils.print_utils import print_error
from . import schemas
from ...models import UploadFile, RateServe, CompanyUser, RatePostDataCheckNode, RateDataPreparationNode, RateWorkNode, \
ReportWorkNode, RateServeStatusLog, CertWorkNode
from ...common import get_db
from ...schemas import RateServeState, NodeState
from ...utils.rate_utils import sheet_parse
from ...mods.upload_file.crud import file_upload, types_dic_rev
from ...mods.rate_serve import crud as rate_serve_crud
from ...mods.rate_serve_status_log import crud as rate_serve_status_log_crud
router = APIRouter(tags=["评级服务"])
@router.post('/rate_post_data_check_node/rate_sheet_upload', response_model=schemas.RateSheetUploadRes,
summary='评级服务问卷上传接口')
def func(file: FastApiUploadFile = File(...),
db: Session = Depends(get_db),
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend)
):
if types_dic_rev.get(file.content_type) != 'xlsx':
raise HTTPException(status_code=303, detail='请上传.xlsx文件')
new_item = file_upload(file, db, sub_type='填报问卷', user_id=token_data.id)
return new_item.to_dict()
@router.post('/rate_serve/apply', summary='评级服务申请接口', response_model=schemas.RateServeApplyRes)
def func(req: schemas.RateServeApplyReq,
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend),
db: Session = Depends(get_db)):
# 获取上传的填报表格
# 填报文件验证
sheet_file = db.query(UploadFile).filter(
UploadFile.user_id == token_data.id , UploadFile.id == req.file_id , UploadFile.sub_type == '填报问卷').first()
if not sheet_file:
raise HTTPException(status_code=303, detail='未上传文件或文件错误,请重新上传')
try:
# 文件路径需要去掉第一个'/'
file_path = sheet_file.path[1:]
wb_data = sheet_parse(file_path)
except Exception as e:
print_error(e)
raise HTTPException(status_code=303, detail='分析问卷失败,请在原问卷上按规范填报')
# 评级服务申请创建接口
item = RateServe()
user = db.query(CompanyUser).filter(CompanyUser.id == token_data.id).first()
if not user:
raise HTTPException(status_code=303, detail="用户不存在")
if not user.company_id:
raise HTTPException(status_code=303, detail="用户未绑定公司")
item.company_id = user.company_id
item.serve_id = rate_serve_crud.make_rate_serve_id(db)
item.apply_user_id = user.id
item.project = '评级服务'
item.status = RateServeState.examining
item.rate_post_data_check_node = RatePostDataCheckNode(file_id=req.file_id, parsed_data=wb_data, data=wb_data,
status=NodeState.incomplete)
item.rate_data_preparation_node = RateDataPreparationNode(status=NodeState.incomplete)
item.rate_work_node = RateWorkNode(status=NodeState.incomplete)
item.report_work_node = ReportWorkNode(status=NodeState.incomplete)
item.cert_work_node = CertWorkNode(status=NodeState.incomplete)
db.add(item)
db.commit()
db.refresh(item)
rate_serve_status_log_crud.add_rate_serve_status_log(db, serve_id=item.serve_id, detail="评级申请成功,待审核",
status=RateServeState.examining)
return schemas.RateServeApplyRes(serve_id=item.serve_id)
@router.post('/rate_serve/query', summary='评价服务信息筛选接口', response_model=schemas.RateServeQueryRes)
def func(req: schemas.RateServeQueryReq,
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend),
db: Session = Depends(get_db)):
if not req.query:
req.query = schemas.RateServeInfoLite(company_id=token_data.company_id)
else:
req.query.company_id = token_data.company_id
count, query = rate_serve_crud.rate_serve_query(db, req)
items = [schemas.RateServeInfoLite(**item.to_full_dict(include=req.include,
ex_include=req.ex_include,
relation_use_id=req.relation_use_id)) for
item in query]
return schemas.RateServeQueryRes(count=count, items=items)
@router.post('/rate_serve/get', summary='评级服务信息获取接口', response_model=schemas.RateServeGetRes)
def func(req: schemas.RateServeGetReq,
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend),
db: Session = Depends(get_db)):
item = db.query(RateServe).filter(
RateServe.company_id == token_data.company_id, RateServe.serve_id == req.serve_id).first()
if not item:
raise HTTPException(status_code=403, detail='未查询到数据')
return schemas.RateServeInfoLite(**item.to_full_dict())
@router.post('/rate_serve/status_logs_get', summary='评级服务信息状态日志获取接口',
response_model=schemas.RateServeStatusLogsGetRes)
def func(req: schemas.RateServeStatusLogsGetReq,
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend),
db: Session = Depends(get_db)):
item = db.query(RateServe).filter(
RateServe.company_id == token_data.company_id , RateServe.serve_id == req.serve_id).first()
if not item:
raise HTTPException(status_code=403, detail='未查询到数据')
return schemas.RateServeStatusLogsGetRes(items=[log.to_dict() for log in item.status_logs])
@router.post('/rate_serve/cancel', summary='评级服务取消接口')
def func(req: schemas.RateServeCancelReq,
token_data: CompanyUserTokenDataModel = Depends(company_user_auth_util.token_data_depend),
db: Session = Depends(get_db)):
item = db.query(RateServe).filter(
RateServe.company_id == token_data.company_id , RateServe.serve_id == req.serve_id).first()
if item.status == RateServeState.cancel:
raise HTTPException(status_code=303, detail="已经取消,无需重复操作")
if not item:
raise HTTPException(status_code=403, detail='未查询到数据')
item.status = RateServeState.cancel
item.status_logs.add(RateServeStatusLog(detail=req.remark, status=RateServeState.cancel))
db.commit()
return f"服务单号{req.serve_id}取消成功"