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.
128 lines
3.9 KiB
128 lines
3.9 KiB
# -*- coding:utf-8 -*-
|
|
"""
|
|
@Created on : 2023/5/22 13:55
|
|
@Author: hxl
|
|
@Des: 货架管理
|
|
"""
|
|
import uuid
|
|
|
|
import httpx
|
|
from fastapi import APIRouter, Request, Depends
|
|
from fastapi.encoders import jsonable_encoder
|
|
from pydantic import BaseModel
|
|
from tortoise.expressions import Q
|
|
|
|
from conf import setting
|
|
from helper import respond_to, login_required
|
|
from helper.log import logger_wrapper
|
|
from helper.cabinet import calculate_today_data
|
|
from models import Cabinet, Terminal, Drawer
|
|
|
|
router = APIRouter(prefix='/cabinets', dependencies=[Depends(login_required)])
|
|
|
|
|
|
class ProfileRegister(BaseModel):
|
|
mac_addr: str # 货架序号
|
|
label: str # 标签
|
|
matrix: int # 层数
|
|
location: str # 物理位置
|
|
type: int = 3 # 类型 3货架
|
|
|
|
|
|
class ProfileEdit(BaseModel):
|
|
label: str = None
|
|
location: str = None
|
|
matrix: str = None
|
|
|
|
|
|
@router.get('', summary='货架管理列表')
|
|
async def index(page_no: int = 1, page_size: int = 10, keyword: str = None):
|
|
"""
|
|
货架管理列表
|
|
:param page_no: ProfileEdit
|
|
:param page_size: ProfileEdit
|
|
:param keyword: ProfileEdit
|
|
:return:
|
|
"""
|
|
# 壁挂终端templateid修改
|
|
terminal = await Terminal.get(id=setting.TERMINAL_ID)
|
|
query = Cabinet.filter(terminal_id=terminal.id)
|
|
if keyword:
|
|
query = query.filter(Q(username__istartswith=keyword) | Q(name__startswith=keyword))
|
|
|
|
offset = (page_no - 1) * page_size
|
|
count = await query.count()
|
|
cabinets = await query.limit(page_size).offset(offset).order_by('-created_at')
|
|
result = list()
|
|
for cabinet in jsonable_encoder(cabinets):
|
|
cabinet["today"] = await calculate_today_data(cabinet.get("id", ""))
|
|
result.append(cabinet)
|
|
return respond_to(data=dict(count=count, cabinets=result))
|
|
|
|
|
|
@router.post('/register', summary='货架注册')
|
|
async def create(request: Request, model: ProfileRegister):
|
|
"""
|
|
货架注册
|
|
:param model: ProfileEdit
|
|
:return:
|
|
"""
|
|
terminal = await Terminal.get(id=setting.TERMINAL_ID)
|
|
cabinet_obj = await Cabinet.get_or_none(mac_addr=model.mac_addr)
|
|
drawer_count = model.matrix
|
|
# 有则更新无则创建
|
|
if cabinet_obj:
|
|
for attr, value in model.dict(exclude_unset=True).items():
|
|
if attr == 'matrix':
|
|
value = f"{value}*1"
|
|
setattr(cabinet_obj, attr, value)
|
|
# 保存更改
|
|
await cabinet_obj.save()
|
|
else:
|
|
model.matrix = f"{model.matrix}*1"
|
|
# 壁挂终端大类添加
|
|
model_dict = model.dict()
|
|
if request.state and request.state.archive_id:
|
|
model_dict["archive_id"] = request.state.archive_id
|
|
model_dict["terminal_id"] = setting.TERMINAL_ID
|
|
cabinet_obj = await Cabinet.create(**model_dict, terminal=terminal)
|
|
# 货架层创建
|
|
for i in range(int(drawer_count)):
|
|
label = f"{i+1}层"
|
|
await Drawer.create(rank=i+1, line_no=0, label=label, cabinet_id=cabinet_obj.id)
|
|
return respond_to(desc='success')
|
|
|
|
|
|
@router.put('/{cabinet_id}', summary='货架信息编辑')
|
|
@logger_wrapper
|
|
async def update(cabinet_id: str, model: ProfileEdit):
|
|
"""
|
|
货架信息编辑
|
|
:param cabinet_id: str
|
|
:param model: ProfileEdit
|
|
:return:
|
|
"""
|
|
cabinet = await Cabinet.get(id=cabinet_id)
|
|
# 更新记录中存在的属性
|
|
for attr, value in model.dict(exclude_unset=True).items():
|
|
if attr == 'matrix':
|
|
value = f"{value}*1"
|
|
setattr(cabinet, attr, value)
|
|
# 保存更改
|
|
await cabinet.save()
|
|
return respond_to(200, desc=f"{cabinet.label}货架信息修改成功")
|
|
|
|
@router.delete('/{cabinet_id}', summary='货架信息删除')
|
|
@logger_wrapper
|
|
async def delete(cabinet_id: str):
|
|
"""
|
|
货架信息删除
|
|
:param cabinet_id: str
|
|
:return:
|
|
"""
|
|
cabinet_obj = await Cabinet.get_or_none(id=cabinet_id)
|
|
if not cabinet_obj:
|
|
return respond_to(code=400, desc='未查询到该货架')
|
|
await cabinet_obj.delete()
|
|
return respond_to(desc='删除成功')
|