from module_business.domain.enums import PalletFlowState class InvalidPalletTransition(ValueError): """托盘状态迁移不符合业务规则。""" class PalletStateMachine: _ALLOWED_TRANSITIONS = frozenset( { (PalletFlowState.UNSTOCKED, PalletFlowState.EMPTY_IN_WAREHOUSE), ( PalletFlowState.EMPTY_IN_WAREHOUSE, PalletFlowState.FILLED_IN_WAREHOUSE, ), (PalletFlowState.FILLED_IN_WAREHOUSE, PalletFlowState.AT_SITE_UNUSED), (PalletFlowState.AT_SITE_UNUSED, PalletFlowState.AT_SITE_PARTIAL), (PalletFlowState.AT_SITE_UNUSED, PalletFlowState.AT_SITE_EMPTY), (PalletFlowState.AT_SITE_UNUSED, PalletFlowState.RETURNING), (PalletFlowState.AT_SITE_PARTIAL, PalletFlowState.AT_SITE_PARTIAL), (PalletFlowState.AT_SITE_PARTIAL, PalletFlowState.AT_SITE_EMPTY), (PalletFlowState.AT_SITE_PARTIAL, PalletFlowState.RETURNING), (PalletFlowState.AT_SITE_EMPTY, PalletFlowState.RETURNING), (PalletFlowState.RETURNING, PalletFlowState.FILLED_IN_WAREHOUSE), (PalletFlowState.RETURNING, PalletFlowState.EMPTY_IN_WAREHOUSE), } ) @classmethod def ensure_transition( cls, current: PalletFlowState, target: PalletFlowState, ) -> None: if (current, target) not in cls._ALLOWED_TRANSITIONS: raise InvalidPalletTransition( f'不允许的托盘状态迁移:{current.value} -> {target.value}' )