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