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