package backend import ( "context" "fmt" "kpt-pasture/model" "strings" "gitee.com/xuyiping_admin/pkg/xerr" ) func (s *StoreEntry) TestDataWaring(ctx context.Context, userId int64) error { dataWarningList := make([]*model.DataWarning, 0) if err := s.DB.Model(new(model.DataWarning)).Where("user_id = ?", userId).Error; err != nil { return xerr.WithStack(err) } for _, v := range dataWarningList { a, params, err := s.BuildQuery(v.Id) if err != nil { return xerr.WithStack(err) } var count int64 if err = s.DB.Model(new(model.Cow)).Where(a, params...).Count(&count).Error; err != nil { return xerr.WithStack(err) } } return nil } func (s *StoreEntry) BuildQuery(warningId int64) (string, []interface{}, error) { conditionsMap := make(map[int32][]string) params := make([]interface{}, 0) res := make([]*model.DataWarningItems, 0) if err := s.DB.Model(new(model.DataWarningItems)). Where("warning_id = ?", warningId). Order("group_id"). Find(&res).Error; err != nil { return "", nil, xerr.WithStack(err) } for _, v := range res { conditionsMap[v.GroupId] = append(conditionsMap[v.GroupId], fmt.Sprintf(" %s %s ? ", v.FieldName, v.Operator)) params = append(params, v.Value) } if len(conditionsMap) == 0 { return "", nil, xerr.Custom("条件组不能为空") } var sqlConditions []string for _, groupConditions := range conditionsMap { if len(groupConditions) == 0 { continue // 跳过空组 } // 同一个组内的条件用 OR 拼接 groupQuery := strings.Join(groupConditions, " OR ") // 如果组内有多个条件,用括号包裹 if len(groupConditions) > 1 { groupQuery = fmt.Sprintf("(%s)", groupQuery) } sqlConditions = append(sqlConditions, groupQuery) } return strings.Join(sqlConditions, " AND "), params, nil }