Files
ShiErFeng/shierfeng-fastapi-backend/module_business/domain/pallet_state_machine.py
T

41 lines
1.7 KiB
Python

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}')