#!/usr/bin/env python3 # -*- coding: utf-8 -*- from fastapi import APIRouter, Request, Depends, Query, HTTPException, status,WebSocket,WebSocketDisconnect from common.security import valid_access_token,valid_websocket_token from fastapi.responses import JSONResponse from sqlalchemy.orm import Session from sqlalchemy.sql import func from common.auth_user import * from sqlalchemy import text from pydantic import BaseModel from common.BigDataCenterAPI import * from database import get_db from typing import List from models import * from utils import * from utils.spatial import * from utils.ry_system_util import * from utils.resource_provision_util import * from common.websocketManager import * import json import traceback router = APIRouter() @router.post("/create") async def create_pattern( user_id=Depends(valid_access_token), body = Depends(remove_xss_json), db: Session = Depends(get_db) ): try: dept_info = user_id_get_user_info(db,user_id) new_dispatch = ResourceProvisionDispatch( id = new_guid(), dispatch_purpose=body['dispatch_purpose'], dispatch_person=user_id, dispatch_unit=dept_info.dept_id, dispatch_status = '1', create_by = user_id ) db.add(new_dispatch) serial_number=0 for info in body['detail']: serial_number+=1 material_into = material_id_get_material_info(db, info['material_code']) if material_into: material_name = material_into.material_name material_type_id = material_into.material_type warehouse_id=material_into.warehouse_id material_type_info = type_id_get_material_type_info(db, material_into.material_type) if material_type_info: material_category_name = material_type_info.material_category_name else: material_category_name = None else: material_type_id=None warehouse_id = None material_name = None material_category_name = None new_detail = ResourceProvisionDispatchDetail( id=new_guid(), serial_number=serial_number, dispatch_id = new_dispatch.id, warehouse_id = warehouse_id, material_type_id = material_type_id, material_type = material_category_name, material_code = info['material_code'], material_name = material_name, material_quantity = info['material_quantity'], material_purpose = info['material_purpose'], create_by = user_id ) db.add(new_detail) db.commit() return {"code": 200, "msg": "创建成功", "data": None} except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") @router.put("/update/{id}") async def update_dispatch( id :str , user_id=Depends(valid_access_token), body=Depends(remove_xss_json), db: Session = Depends(get_db) ): try: update_dispatch = dispatch_id_get_dispatch_info(db,id) if not update_dispatch: return JSONResponse(status_code=404,content={"code":404,"msg":"dispatch not found"}) if str(update_dispatch.dispatch_person) != str(user_id): return JSONResponse(status_code=404, content={"code": 404, "msg": "dispatch not permission"}) update_dispatch.dispatch_purpose = body['dispatch_purpose'] update_dispatch.update_by = user_id detail_list = [] serial_number=0 for info in body['detail']: serial_number+=1 material_into = material_id_get_material_info(db, info['material_code']) if material_into: material_name = material_into.material_name material_type_id = material_into.material_type warehouse_id = material_into.warehouse_id material_type_info = type_id_get_material_type_info(db, material_into.material_type) if material_type_info: material_category_name = material_type_info.material_category_name else: material_category_name = None else: material_type_id = None warehouse_id = None material_name = None material_category_name = None if info['id']=='': new_detail = ResourceProvisionDispatchDetail( id=new_guid(), serial_number=serial_number, dispatch_id=update_dispatch.id, warehouse_id=warehouse_id, material_type_id=material_type_id, material_type=material_category_name, material_code=info['material_code'], material_name=material_name, material_quantity=info['material_quantity'], material_purpose=info['material_purpose'], create_by=user_id ) db.add(new_detail) detail_list.append(new_detail.id) else: detail = detail_id_get_dispatch_detail_info(db,info['id']) if detail is None: new_detail = ResourceProvisionDispatchDetail( id=new_guid(), serial_number=serial_number, dispatch_id=update_dispatch.id, warehouse_id=warehouse_id, material_type_id=material_type_id, material_type=material_category_name, material_code=info['material_code'], material_name=material_name, material_quantity=info['material_quantity'], material_purpose=info['material_purpose'], create_by=user_id ) db.add(new_detail) detail_list.append(new_detail.id) else: detail.serial_number = serial_number detail.warehouse_id = warehouse_id detail.material_type_id = material_type_id detail.material_type = material_category_name detail.material_code = info['material_code'] detail.material_name = material_name detail.material_quantity = info['material_quantity'] detail.material_unit_price = info['material_unit_price'] detail.material_purpose = info['material_purpose'] detail.update_by = user_id detail_list.append(info['id']) query = db.query(ResourceProvisionDispatchDetail) query = query.filter_by(dispatch_id=id, del_flag='0').filter(~ResourceProvisionDispatchDetail.id.in_(detail_list)) for i in query.all(): i.del_flag='2' db.commit() return {"code": 200, "msg": "更新成功"} except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") @router.get("/info/{id}") async def get_pattern_info( id: str, user_id=Depends(valid_access_token), db: Session = Depends(get_db) ): try: info = dispatch_id_get_dispatch_info(db,id) if not info: return JSONResponse(status_code=404,content={"code":404,"msg":"dispatch not found"}) dept_info = dept_id_get_dept_info(db,info.dispatch_unit) user_info = user_id_get_user_info(db,info.dispatch_person) review_info = dispatch_id_get_dispatch_review_info(db,id) if review_info is None: dispatch_status = info.dispatch_status else: dispatch_status = review_info.review_result data = {"id": info.id, "dispatch_date": info.dispatch_date, "dispatch_purpose": info.dispatch_purpose, "dispatch_unit": info.dispatch_unit, "dispatch_unit_name": dept_info.dept_name, "dispatch_person": info.dispatch_person, "dispatch_person_name": user_info.nick_name, "dispatch_status": dispatch_status, "create_time": info.create_time} detail=[] for detail_info in dispatch_id_get_dispatch_detail_list(db,id): # material_type_info = type_id_get_material_type_info(db,detail_info.material_type) # if material_type_info: # material_category_name=material_type_info.material_category_name # else: # material_category_name = None # material_into = material_id_get_material_info(db,detail_info.material_code) # if material_into: # material_name = material_into.material_name # else: # material_name = None warehouse_info = warehouse_id_get_warehouse_info(db,detail_info.warehouse_id) if warehouse_info: warehouse_name = warehouse_info.warehouse_name else: warehouse_name = None detail.append({"id":detail_info.id, "serial_number":detail_info.serial_number, "warehouse_id":detail_info.warehouse_id, "warehouse_name":warehouse_name, "material_type":detail_info.material_type, "material_type_id":detail_info.material_type_id, "material_code":detail_info.material_code, "material_name":detail_info.material_name, "material_quantity":detail_info.material_quantity, "material_purpose":detail_info.material_purpose}) data['detail']=detail return {"code": 200, "msg": "获取成功", "data": data} except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") @router.get("/list") async def get_pattern_list( # dispatch_details: str = Query(None, description='名称'), user_id=Depends(valid_access_token), page: int = Query(1, gt=0, description='页码'), pageSize: int = Query(None, gt=0, description='每页条目数量'), db: Session = Depends(get_db) ): try: query = db.query(ResourceProvisionDispatch) query = query.filter_by(del_flag='0') total_items = query.count() # 排序 if pageSize is None: pageSize=total_items query = query.order_by(ResourceProvisionDispatch.dispatch_date.desc()) # 执行分页查询 lists = query.offset((page - 1) * pageSize).limit(pageSize).all() data = [] for info in lists: dept_info = dept_id_get_dept_info(db, info.dispatch_unit) user_info = user_id_get_user_info(db, info.dispatch_person) review_info = dispatch_id_get_dispatch_review_info(db, info.id) if review_info is None: dispatch_status = info.dispatch_status else: dispatch_status = review_info.review_result data .append( {"id": info.id, "dispatch_date": info.dispatch_date, "dispatch_purpose": info.dispatch_purpose, "dispatch_unit": info.dispatch_unit, "dispatch_unit_name": dept_info.dept_name, "dispatch_person": info.dispatch_person, "dispatch_person_name": user_info.nick_name, "dispatch_status": dispatch_status, "create_time": info.create_time}) return {"code": 200, "msg": "查询成功", "data": data, "total": total_items, "page": page, "pageSize": pageSize, "totalPages": (total_items + pageSize - 1) // pageSize } except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") # @router.delete("/delete/{id}") # async def delete_pattern( # id: str, # db: Session = Depends(get_db) # ): # try: # # 检查图案是否存在 # info = dispatch_id_get_dispatch_info(db, id) # if not info: # return JSONResponse(status_code=404, content={"code": 404, "msg": "type not found"}) # info.del_flag='2' # review_info = dispatch_id_get_dispatch_review_info(db, id) # review_info.del_flag ='2' # for detail_info in dispatch_id_get_dispatch_detail_list(db, id): # detail_info.del_flag='2' # db.commit() # return {"code": 200, "msg": "删除成功"} # except Exception as e: # traceback.print_exc() # raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") @router.post("/review") async def create_pattern( user_id=Depends(valid_access_token), body = Depends(remove_xss_json), db: Session = Depends(get_db) ): try: new_review = ResourceProvisionDispatchReview( id=new_guid(), reviewer=user_id, dispatch_id=body['dispatch_id'], review_result=body['review_result'], review_comments=body['review_comments'], create_by = user_id ) db.add(new_review) db.commit() return {"code": 200, "msg": "审核成功", "data": None} except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") @router.get("/review/list") async def get_pattern_list( user_id=Depends(valid_access_token), page: int = Query(1, gt=0, description='页码'), pageSize: int = Query(None, gt=0, description='每页条目数量'), db: Session = Depends(get_db) ): try: review_list = [info.dispatch_id for info in get_dispatch_review_list(db)] query = db.query(ResourceProvisionDispatch) query = query.filter_by(del_flag='0') query = query.filter(~ResourceProvisionDispatch.id.in_(review_list)) total_items = query.count() # 排序 if pageSize is None: pageSize=total_items query = query.order_by(ResourceProvisionDispatch.dispatch_date.desc()) # 执行分页查询 lists = query.offset((page - 1) * pageSize).limit(pageSize).all() data = [] for info in lists: dept_info = dept_id_get_dept_info(db, info.dispatch_unit) user_info = user_id_get_user_info(db, info.dispatch_person) # review_info = dispatch_id_get_dispatch_review_info(db, info.id) # if review_info is None: # dispatch_details = info.dispatch_details # else: # dispatch_details = review_info.review_result data = {"id": info.id, "dispatch_date": info.dispatch_date, "dispatch_purpose": info.dispatch_purpose, "dispatch_unit": info.dispatch_unit, "dispatch_unit_name": dept_info.dept_name, "dispatch_person": info.dispatch_person, "dispatch_person_name": user_info.nick_name, "dispatch_status": info.dispatch_status, "create_time": info.create_time} return {"code": 200, "msg": "查询成功", "data": data, "total": total_items, "page": page, "pageSize": pageSize, "totalPages": (total_items + pageSize - 1) // pageSize } except Exception as e: traceback.print_exc() raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")