""" 资产管理API路由 """ from typing import List, Optional from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from app.core.deps import get_db, get_current_user from app.schemas.asset import ( AssetCreate, AssetUpdate, AssetResponse, AssetWithRelations, AssetStatusHistoryResponse, AssetStatusTransition, AssetQueryParams ) from app.services.asset_service import asset_service router = APIRouter() @router.get("/", response_model=List[AssetResponse]) def get_assets( skip: int = Query(0, ge=0, description="跳过条数"), limit: int = Query(20, ge=1, le=100, description="返回条数"), keyword: Optional[str] = Query(None, description="搜索关键词"), device_type_id: Optional[int] = Query(None, description="设备类型ID"), organization_id: Optional[int] = Query(None, description="网点ID"), status: Optional[str] = Query(None, description="状态"), purchase_date_start: Optional[str] = Query(None, description="采购日期开始(YYYY-MM-DD)"), purchase_date_end: Optional[str] = Query(None, description="采购日期结束(YYYY-MM-DD)"), db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 获取资产列表 - **skip**: 跳过条数 - **limit**: 返回条数(最大100) - **keyword**: 搜索关键词(编码/名称/型号/序列号) - **device_type_id**: 设备类型ID筛选 - **organization_id**: 网点ID筛选 - **status**: 状态筛选 - **purchase_date_start**: 采购日期开始 - **purchase_date_end**: 采购日期结束 """ items, total = asset_service.get_assets( db=db, skip=skip, limit=limit, keyword=keyword, device_type_id=device_type_id, organization_id=organization_id, status=status, purchase_date_start=purchase_date_start, purchase_date_end=purchase_date_end ) return items @router.get("/statistics") def get_asset_statistics( organization_id: Optional[int] = Query(None, description="网点ID筛选"), db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 获取资产统计信息 - **organization_id**: 网点ID筛选 返回资产总数、总价值、状态分布等统计信息 """ return asset_service.get_statistics(db, organization_id) @router.get("/{asset_id}", response_model=AssetWithRelations) def get_asset( asset_id: int, db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 获取资产详情 - **asset_id**: 资产ID 返回资产详情及其关联信息 """ return asset_service.get_asset(db, asset_id) @router.get("/scan/{asset_code}", response_model=AssetWithRelations) def scan_asset( asset_code: str, db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 扫码查询资产 - **asset_code**: 资产编码 通过扫描二维码查询资产详情 """ return asset_service.scan_asset_by_code(db, asset_code) @router.post("/", response_model=AssetResponse, status_code=status.HTTP_201_CREATED) def create_asset( obj_in: AssetCreate, db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 创建资产 - **asset_name**: 资产名称 - **device_type_id**: 设备类型ID - **brand_id**: 品牌ID(可选) - **model**: 规格型号 - **serial_number**: 序列号 - **supplier_id**: 供应商ID - **purchase_date**: 采购日期 - **purchase_price**: 采购价格 - **warranty_period**: 保修期(月) - **organization_id**: 所属网点ID - **location**: 存放位置 - **dynamic_attributes**: 动态字段值 - **remark**: 备注 """ return asset_service.create_asset( db=db, obj_in=obj_in, creator_id=current_user.id ) @router.put("/{asset_id}", response_model=AssetResponse) def update_asset( asset_id: int, obj_in: AssetUpdate, db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 更新资产 - **asset_id**: 资产ID - **asset_name**: 资产名称 - **brand_id**: 品牌ID - **model**: 规格型号 - **serial_number**: 序列号 - **supplier_id**: 供应商ID - **purchase_date**: 采购日期 - **purchase_price**: 采购价格 - **warranty_period**: 保修期 - **organization_id**: 所属网点ID - **location**: 存放位置 - **dynamic_attributes**: 动态字段值 - **remark**: 备注 """ return asset_service.update_asset( db=db, asset_id=asset_id, obj_in=obj_in, updater_id=current_user.id ) @router.delete("/{asset_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_asset( asset_id: int, db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 删除资产 - **asset_id**: 资产ID 软删除资产 """ asset_service.delete_asset( db=db, asset_id=asset_id, deleter_id=current_user.id ) return None # ===== 状态管理 ===== @router.post("/{asset_id}/status", response_model=AssetResponse) def change_asset_status( asset_id: int, status_transition: AssetStatusTransition, db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 变更资产状态 - **asset_id**: 资产ID - **new_status**: 目标状态 - **remark**: 备注 - **extra_data**: 额外数据 状态说明: - pending: 待入库 - in_stock: 库存中 - in_use: 使用中 - transferring: 调拨中 - maintenance: 维修中 - pending_scrap: 待报废 - scrapped: 已报废 - lost: 已丢失 """ return asset_service.change_asset_status( db=db, asset_id=asset_id, status_transition=status_transition, operator_id=current_user.id, operator_name=current_user.real_name ) @router.get("/{asset_id}/history", response_model=List[AssetStatusHistoryResponse]) def get_asset_status_history( asset_id: int, skip: int = Query(0, ge=0, description="跳过条数"), limit: int = Query(50, ge=1, le=100, description="返回条数"), db: Session = Depends(get_db), current_user = Depends(get_current_user) ): """ 获取资产状态历史 - **asset_id**: 资产ID - **skip**: 跳过条数 - **limit**: 返回条数 返回资产的所有状态变更记录 """ return asset_service.get_asset_status_history(db, asset_id, skip, limit)