from fastapi import APIRouter from pydantic import BaseModel from typing import Optional, List, Any from starlette.requests import Request from tortoise.queryset import QuerySet, Prefetch import traceback from models.warehouse import ( Vacancy, Connection, ) from helper import respond_to from conf import setting from tortoise.transactions import in_transaction warehouse_router = APIRouter(prefix='/warehouse') class VacancyM(BaseModel): number: str traynum: Optional[str] = None memo: Optional[Any] = None is_empty: Optional[str] = "false" orderids: Optional[List[str]] = [] class ConnectionM(BaseModel): name: str vacancies: list[VacancyM] memo: Optional[Any] = None class SchelveM(BaseModel): name: str vacancies: list[VacancyM] memo: Optional[Any] = None class WarehouseM(BaseModel): name: str schelves: list[SchelveM] memo: Optional[Any] = None class WarehouseMClear(BaseModel): name: str schelvenames: Optional[list[str]] = [] class ConnectionM(BaseModel): name: str vacancies: list[VacancyM] memo: Optional[Any] = None class ConnectionMClear(BaseModel): name: str @warehouse_router.get("/") def read_root(): return {"Hello": "World"} @warehouse_router.post('/addcon', summary='仓库添加AGV库存') async def createcon(request: Request, connectionM: ConnectionM): # print("orderm: ", orderm) print("connectionM: ", connectionM.name, connectionM.memo) for vacancy in connectionM.vacancies: print("vacancy ", vacancy.number) async with in_transaction() as conn: try: connection = None qs1 = await Connection.filter(name = connectionM.name, is_active = True, is_valid = True) print("qs1: ", qs1, connectionM.name, connectionM.memo) if len(qs1) > 0: connection = qs1[0] else: connection = await Connection.create( name = connectionM.name, memo = connectionM.memo, connection=conn ) for vacancy in connectionM.vacancies: vacancyObj = None qs3 = await Vacancy.filter(number = vacancy.number, is_active = True, is_valid = True) if len(qs3) > 0: vacancyObj = qs3[0] else: vacancyObj = await Vacancy.create( number = vacancy.number, traynum = vacancy.traynum, memo = vacancy.memo, is_empty = True if "true" == vacancy.is_empty else False, is_connect = True, connection=conn ) #add to connection await connection.vacancies.add(vacancyObj) except Exception as e: # printing stack trace traceback.print_exc() msg = "Something wrong when creating connection: {}".format(e) print(msg) return respond_to(code=404, desc="失败", data={"state": msg}) return respond_to(data={"state": "success"}) @warehouse_router.post('/clearcon', summary='仓库清空AGV库存') async def clearcon(request: Request, connectionMClear: ConnectionMClear): # print("orderm: ", orderm) print("connectionMClear: ", connectionMClear.name) try: connection = None qs1 = await Connection.filter(name = connectionMClear.name, is_active = True, is_valid = True) print("qs1: ", qs1) if len(qs1) > 0: connection = qs1[0] else: raise Exception("Cannot find connection name {}".format(connectionMClear.name)) await connection.fetch_related("vacancies") for vacancy in connection.vacancies: vacancy.is_valid = False vacancy.is_active = False await vacancy.save() except Exception as e: # printing stack trace traceback.print_exc() msg = "Something wrong when creating connection: {}".format(e) print(msg) return respond_to(code=404, desc="失败", data={"state": msg}) return respond_to(data={"state": "success"}) @warehouse_router.get('/listcon', summary="列出所有AGV库存") async def index(request: Request, page_no: int = 1, page_size: int = 20): """ 列出所有AGV库存 :param page_no: 1 :param page_size: 20 :return: """ offset = (page_no - 1) * page_size query = QuerySet(Connection).filter(is_active=True).prefetch_related( Prefetch('vacancies', queryset=Vacancy.filter(is_active = True)) ) count = await query.count() connections = await query.limit(page_size).offset(offset) resData = [] for connection in connections: vacancies = await connection.vacancies.filter(is_active = True) vacancyList = [] for vacancy in vacancies: holes = await vacancy.holes.filter(is_active = True) vacancyj = vacancy.as_json() vacancyj["holes"] = holes vacancyList.append(vacancyj) connectionj = connection.as_json() # connectionj["vacancies"] = vacancies connectionj["vacancies"] = vacancyList resData.append(connectionj) return respond_to(code=200, data=dict(count=count, data=resData))