feat: complete SOP execution workflow

This commit is contained in:
Eric 1549169735@qq.com
2026-08-09 00:29:26 +08:00
parent e32025d2ca
commit c5ab886b70
63 changed files with 1229 additions and 215 deletions

View File

@@ -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 {