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

# -*- 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='删除成功')