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

134 lines
6.6 KiB
Python

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}取消成功"