You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
5.4 KiB

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))