package alert_lifecycle import ( "errors" "strings" "unicode/utf8" ) var ( ErrNotFound = errors.New("预警不存在") ErrAlreadyHandled = errors.New("预警已由其他人员开始处理") ErrInvalidTransition = errors.New("当前状态不能执行此操作") ErrOutcomeRequired = errors.New("请选择有效的现场结果") ErrForbidden = errors.New("您无权完成此预警") ) type CloseInput struct { Outcome string `json:"outcome"` Note string `json:"note"` } func normalizeClose(input CloseInput) (CloseInput, error) { input.Outcome = strings.TrimSpace(input.Outcome) input.Note = strings.TrimSpace(input.Note) switch input.Outcome { case "danger_confirmed", "false_positive", "site_normal", "unable_to_confirm": default: return CloseInput{}, ErrOutcomeRequired } if !utf8.ValidString(input.Note) || utf8.RuneCountInString(input.Note) > 500 || strings.ContainsAny(input.Note, "\x00\r") { return CloseInput{}, ErrOutcomeRequired } return input, nil }