feat: complete SOP execution workflow
This commit is contained in:
@@ -278,10 +278,16 @@ func validateFieldInput(input fieldInput) error {
|
||||
if err := json.Unmarshal(input.Options, &options); err != nil || options == nil {
|
||||
return errors.New("字段选项必须是文本数组")
|
||||
}
|
||||
seen := map[string]bool{}
|
||||
for _, option := range options {
|
||||
if strings.TrimSpace(option) == "" {
|
||||
return errors.New("字段选项不能为空")
|
||||
}
|
||||
normalized := strings.TrimSpace(option)
|
||||
if seen[normalized] {
|
||||
return errors.New("字段选项不能重复")
|
||||
}
|
||||
seen[normalized] = true
|
||||
}
|
||||
if (input.FieldType == "select" || input.FieldType == "multiselect") && len(options) == 0 {
|
||||
return errors.New("单选或多选字段至少需要一个选项")
|
||||
@@ -290,14 +296,77 @@ func validateFieldInput(input fieldInput) error {
|
||||
return errors.New("单选或多选字段至少需要一个选项")
|
||||
}
|
||||
if len(input.Validation) > 0 {
|
||||
var validation map[string]interface{}
|
||||
var validation map[string]json.RawMessage
|
||||
if err := json.Unmarshal(input.Validation, &validation); err != nil || validation == nil {
|
||||
return errors.New("字段校验规则必须是 JSON 对象")
|
||||
}
|
||||
if err := validateFieldRules(input.FieldType, validation); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateFieldRules(fieldType string, validation map[string]json.RawMessage) error {
|
||||
allowed := map[string]bool{}
|
||||
switch fieldType {
|
||||
case "number":
|
||||
allowed["min"], allowed["max"] = true, true
|
||||
case "text", "textarea":
|
||||
allowed["min_length"], allowed["max_length"] = true, true
|
||||
}
|
||||
for key := range validation {
|
||||
if !allowed[key] {
|
||||
return errors.New("当前字段类型不支持校验规则 " + key)
|
||||
}
|
||||
}
|
||||
if fieldType == "number" {
|
||||
min, hasMin, err := jsonNumber(validation["min"])
|
||||
if err != nil {
|
||||
return errors.New("最小值必须是数字")
|
||||
}
|
||||
max, hasMax, err := jsonNumber(validation["max"])
|
||||
if err != nil {
|
||||
return errors.New("最大值必须是数字")
|
||||
}
|
||||
if hasMin && hasMax && min > max {
|
||||
return errors.New("最小值不能大于最大值")
|
||||
}
|
||||
}
|
||||
if fieldType == "text" || fieldType == "textarea" {
|
||||
min, hasMin, err := jsonInteger(validation["min_length"])
|
||||
if err != nil || (hasMin && min < 0) {
|
||||
return errors.New("最少字符必须是非负整数")
|
||||
}
|
||||
max, hasMax, err := jsonInteger(validation["max_length"])
|
||||
if err != nil || (hasMax && max < 1) {
|
||||
return errors.New("最多字符必须是正整数")
|
||||
}
|
||||
if hasMin && hasMax && min > max {
|
||||
return errors.New("最少字符不能大于最多字符")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func jsonNumber(raw json.RawMessage) (float64, bool, error) {
|
||||
if len(raw) == 0 {
|
||||
return 0, false, nil
|
||||
}
|
||||
var value float64
|
||||
err := json.Unmarshal(raw, &value)
|
||||
return value, true, err
|
||||
}
|
||||
|
||||
func jsonInteger(raw json.RawMessage) (int, bool, error) {
|
||||
if len(raw) == 0 {
|
||||
return 0, false, nil
|
||||
}
|
||||
var value int
|
||||
err := json.Unmarshal(raw, &value)
|
||||
return value, true, err
|
||||
}
|
||||
|
||||
func idParam(c *gin.Context, key string) (uint64, bool) {
|
||||
id, err := strconv.ParseUint(c.Param(key), 10, 64)
|
||||
if err != nil || id == 0 {
|
||||
|
||||
Reference in New Issue
Block a user