from typing import Annotated from fastapi import Path, Query, Request, Response from sqlalchemy.ext.asyncio import AsyncSession from common.annotation.log_annotation import Log from common.aspect.db_seesion import DBSessionDependency from common.aspect.interface_auth import UserInterfaceAuthDependency from common.aspect.pre_auth import CurrentUserDependency, PreAuthDependency from common.enums import BusinessType from common.router import APIRouterPro from common.vo import DataResponseModel, PageResponseModel, ResponseBaseModel from module_admin.entity.vo.user_vo import CurrentUserModel from module_business.dependency.test_batch_dependency import TestBatchScopeDependency from module_business.domain.test_batch_scope import TestBatchScope from module_business.entity.vo.master_summary_vo import PalletDetailModel, PalletListItemModel from module_business.entity.vo.master_vo import ( DeletePalletModel, PalletCreateModel, PalletEditModel, PalletPageQueryModel, ) from module_business.service.master_summary_service import MasterSummaryService from module_business.service.pallet_service import PalletService from utils.response_util import ResponseUtil pallet_controller = APIRouterPro( prefix='/master/pallet', tags=['基础资料-托盘管理'], dependencies=[PreAuthDependency()] ) @pallet_controller.get( '/list', summary='获取托盘分页列表接口', description='用于获取托盘分页列表', response_model=PageResponseModel[PalletListItemModel], dependencies=[UserInterfaceAuthDependency('master:pallet:list')], ) async def get_master_pallet_list( request: Request, pallet_page_query: Annotated[PalletPageQueryModel, Query()], query_db: Annotated[AsyncSession, DBSessionDependency()], scope: Annotated[TestBatchScope, TestBatchScopeDependency()], ) -> Response: result = await PalletService.list_pallet(query_db, pallet_page_query, scope, is_page=True) result = await MasterSummaryService.enrich_page(query_db, 'pallet', result, scope) return ResponseUtil.success(model_content=result) @pallet_controller.get( '/{pallet_id}/qrcode', summary='补打托盘二维码接口', description='使用托盘原有固定标识重新生成二维码', response_class=Response, responses={200: {'content': {'image/png': {}}}}, dependencies=[UserInterfaceAuthDependency('master:pallet:print')], ) async def query_master_pallet_qrcode( request: Request, pallet_id: Annotated[int, Path(gt=0, description='托盘ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], scope: Annotated[TestBatchScope, TestBatchScopeDependency()], ) -> Response: png = await PalletService.get_pallet_qrcode(query_db, pallet_id, scope) return Response(content=png, media_type='image/png') @pallet_controller.get( '/{pallet_id}', summary='获取托盘详情接口', description='用于获取指定托盘的详细信息', response_model=DataResponseModel[PalletDetailModel], dependencies=[UserInterfaceAuthDependency('master:pallet:query')], ) async def query_detail_master_pallet( request: Request, pallet_id: Annotated[int, Path(gt=0, description='托盘ID')], query_db: Annotated[AsyncSession, DBSessionDependency()], scope: Annotated[TestBatchScope, TestBatchScopeDependency()], ) -> Response: result = await PalletService.detail_pallet(query_db, pallet_id, scope) result = await MasterSummaryService.pallet_detail(query_db, result, scope) return ResponseUtil.success(data=result) @pallet_controller.post( '', summary='新增托盘接口', description='用于新增托盘及初始库存', response_model=ResponseBaseModel, dependencies=[UserInterfaceAuthDependency('master:pallet:add')], ) @Log(title='托盘管理', business_type=BusinessType.INSERT) async def add_master_pallet( request: Request, add_pallet: PalletCreateModel, query_db: Annotated[AsyncSession, DBSessionDependency()], current_user: Annotated[CurrentUserModel, CurrentUserDependency()], scope: Annotated[TestBatchScope, TestBatchScopeDependency(write=True)], ) -> Response: result = await PalletService.add_pallet(query_db, add_pallet, current_user, scope) return ResponseUtil.success(msg=result.message) @pallet_controller.put( '', summary='编辑托盘接口', description='仅编辑托盘容量、资产状态和备注', response_model=ResponseBaseModel, dependencies=[UserInterfaceAuthDependency('master:pallet:edit')], ) @Log(title='托盘管理', business_type=BusinessType.UPDATE) async def edit_master_pallet( request: Request, edit_pallet: PalletEditModel, query_db: Annotated[AsyncSession, DBSessionDependency()], current_user: Annotated[CurrentUserModel, CurrentUserDependency()], scope: Annotated[TestBatchScope, TestBatchScopeDependency(write=True)], ) -> Response: result = await PalletService.edit_pallet(query_db, edit_pallet, current_user, scope) return ResponseUtil.success(msg=result.message) @pallet_controller.delete( '/{pallet_ids}', summary='兼容旧接口,固定拒绝,请使用测试数据批次清理', description='兼容旧接口,固定拒绝单条物理删除,请使用测试数据批次清理', response_model=ResponseBaseModel, dependencies=[UserInterfaceAuthDependency('master:pallet:list')], ) @Log(title='托盘管理', business_type=BusinessType.DELETE) async def delete_master_pallet( request: Request, pallet_ids: Annotated[ str, Path(pattern=r'^[1-9]\d*(,[1-9]\d*)*$', description='需要删除的托盘ID'), ], query_db: Annotated[AsyncSession, DBSessionDependency()], current_user: Annotated[CurrentUserModel, CurrentUserDependency()], ) -> Response: delete_pallet = DeletePalletModel(palletIds=[int(pallet_id) for pallet_id in pallet_ids.split(',')]) result = await PalletService.remove_pallet(query_db, delete_pallet) return ResponseUtil.success(msg=result.message)