57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
var ErrInvalidSubmissionTransition = errors.New("invalid submission status transition")
|
|
|
|
type SubmissionStatus string
|
|
|
|
const (
|
|
SubmissionStatusFenced SubmissionStatus = "FENCED"
|
|
SubmissionStatusSubmitted SubmissionStatus = "SUBMITTED"
|
|
SubmissionStatusReconciliationRequired SubmissionStatus = "RECONCILIATION_REQUIRED"
|
|
SubmissionStatusManualResolved SubmissionStatus = "MANUAL_RESOLVED"
|
|
)
|
|
|
|
type OrderSubmission struct {
|
|
ID string
|
|
TaskID string
|
|
AuthorizationID string
|
|
AttemptID string
|
|
Status SubmissionStatus
|
|
Gate1UnitPrice string
|
|
Gate2UnitPrice string
|
|
QuantityRead int
|
|
ConfirmAmount string
|
|
CreatedAt time.Time
|
|
ResolvedAt *time.Time
|
|
}
|
|
|
|
// CanTransitionTo 只允许围栏记录向最终观察结果调和,拒绝回退以防触发第二次真实动作。
|
|
func (status SubmissionStatus) CanTransitionTo(next SubmissionStatus) bool {
|
|
_, allowed := submissionTransitions[status][next]
|
|
return allowed
|
|
}
|
|
|
|
// TransitionSubmission 返回下一状态;未定义的提交记录状态转移一律失败。
|
|
func TransitionSubmission(current, next SubmissionStatus) (SubmissionStatus, error) {
|
|
if !current.CanTransitionTo(next) {
|
|
return current, ErrInvalidSubmissionTransition
|
|
}
|
|
|
|
return next, nil
|
|
}
|
|
|
|
var submissionTransitions = map[SubmissionStatus]map[SubmissionStatus]struct{}{
|
|
SubmissionStatusFenced: {
|
|
SubmissionStatusSubmitted: {},
|
|
SubmissionStatusReconciliationRequired: {},
|
|
},
|
|
SubmissionStatusReconciliationRequired: {
|
|
SubmissionStatusManualResolved: {},
|
|
},
|
|
}
|