40 lines
1.7 KiB
Python
40 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.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}')
|