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.IN_TRANSIT), (PalletFlowState.IN_TRANSIT, 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 not isinstance(current, PalletFlowState) or not isinstance(target, PalletFlowState): raise TypeError('current 和 target 必须是 PalletFlowState') if (current, target) not in cls._ALLOWED_TRANSITIONS: raise InvalidPalletTransition(f'不允许的托盘状态迁移:{current.value} -> {target.value}')