package domain import ( "errors" "time" ) var ErrInvalidAuthorizationTransition = errors.New("invalid authorization status transition") type AuthorizationStatus string const ( AuthorizationStatusPendingDelivery AuthorizationStatus = "PENDING_DELIVERY" AuthorizationStatusDelivered AuthorizationStatus = "DELIVERED" AuthorizationStatusAcknowledged AuthorizationStatus = "ACKNOWLEDGED" AuthorizationStatusExecuting AuthorizationStatus = "EXECUTING" AuthorizationStatusFenced AuthorizationStatus = "FENCED" AuthorizationStatusConsumed AuthorizationStatus = "CONSUMED" AuthorizationStatusSuperseded AuthorizationStatus = "SUPERSEDED" AuthorizationStatusExpired AuthorizationStatus = "EXPIRED" ) type OrderAuthorization struct { ID string TaskID string SpecTrialID string Version int GoodsID string SKUColor string SKUSize string Quantity int AuthorizedUnitPrice string TotalPriceCap string Note *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{}{ AuthorizationStatusPendingDelivery: { AuthorizationStatusDelivered: {}, AuthorizationStatusSuperseded: {}, AuthorizationStatusExpired: {}, }, AuthorizationStatusDelivered: { AuthorizationStatusAcknowledged: {}, AuthorizationStatusSuperseded: {}, AuthorizationStatusExpired: {}, }, AuthorizationStatusAcknowledged: { AuthorizationStatusExecuting: {}, AuthorizationStatusSuperseded: {}, AuthorizationStatusExpired: {}, }, AuthorizationStatusExecuting: { AuthorizationStatusFenced: {}, AuthorizationStatusSuperseded: {}, AuthorizationStatusExpired: {}, }, AuthorizationStatusFenced: { AuthorizationStatusConsumed: {}, }, }