from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from common.vo import PageModel from module_business.dao.operation_dao import OperationDao from module_business.domain.test_batch_scope import TestBatchScope from module_business.entity.do.operation_do import BizShipmentOrder from module_business.entity.vo.shipment_receipt_vo import ShipmentReceiptQueryModel from utils.page_util import PageUtil class ShipmentReceiptDao: @staticmethod async def list_orders( db: AsyncSession, query: ShipmentReceiptQueryModel, scope: TestBatchScope, site_ids: list[int] | None ) -> PageModel: # 接收方只需要目标现场范围,不扩大原发货操作的双范围权限。 conditions = OperationDao._shipment_scope_conditions(None, site_ids, scope) conditions.append(BizShipmentOrder.status == 'CONFIRMED') if query.shipment_no: conditions.append(BizShipmentOrder.shipment_no.like(f'%{query.shipment_no}%')) if query.target_site_id: conditions.append(BizShipmentOrder.target_site_id == query.target_site_id) if query.source_warehouse_id: conditions.append(BizShipmentOrder.source_warehouse_id == query.source_warehouse_id) if query.receipt_state: conditions.append(BizShipmentOrder.receipt_state == query.receipt_state) conditions.extend( OperationDao._time_conditions(BizShipmentOrder.confirmed_at, query.begin_time, query.end_time) ) statement = ( select(BizShipmentOrder) .where(*conditions) .order_by(BizShipmentOrder.confirmed_at, BizShipmentOrder.shipment_id) ) return await PageUtil.paginate(db, statement, query.page_num, query.page_size, is_page=True)