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: {}, }, }