package domain import ( "errors" "time" ) var ErrInvalidAuthorizationTransition = errors.New("invalid authorization status transition") type AuthorizationStatus string const ( AuthorizationStatusActive AuthorizationStatus = "ACTIVE" AuthorizationStatusClaimed AuthorizationStatus = "CLAIMED" AuthorizationStatusFenced AuthorizationStatus = "FENCED" AuthorizationStatusConsumed AuthorizationStatus = "CONSUMED" AuthorizationStatusExpired AuthorizationStatus = "EXPIRED" AuthorizationStatusAbandoned AuthorizationStatus = "ABANDONED" ) type OrderAuthorization struct { ID string TaskID string TaskVersion int StartKey string GoodsID string SKUColor string SKUSize string Quantity int TotalPriceCap string Status AuthorizationStatus CreatedBy string CreatedAt time.Time ExpiresAt time.Time } // CanTransitionTo 围栏后的授权只能消费,不能回到可领取或可过期状态,以防重复采购。 func (status AuthorizationStatus) CanTransitionTo(next AuthorizationStatus) bool { _, allowed := authorizationTransitions[status][next] return allowed } // TransitionAuthorization 返回下一状态;未定义的授权状态转移一律失败。 func TransitionAuthorization(current, next AuthorizationStatus) (AuthorizationStatus, error) { if !current.CanTransitionTo(next) { return current, ErrInvalidAuthorizationTransition } return next, nil } var authorizationTransitions = map[AuthorizationStatus]map[AuthorizationStatus]struct{}{ AuthorizationStatusActive: { AuthorizationStatusClaimed: {}, AuthorizationStatusExpired: {}, AuthorizationStatusAbandoned: {}, }, AuthorizationStatusClaimed: { AuthorizationStatusFenced: {}, AuthorizationStatusExpired: {}, AuthorizationStatusAbandoned: {}, }, AuthorizationStatusFenced: { AuthorizationStatusConsumed: {}, }, }