81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
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: {},
|
|
},
|
|
}
|