data_warning.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "strings"
  7. "gitee.com/xuyiping_admin/pkg/xerr"
  8. )
  9. func (s *StoreEntry) TestDataWaring(ctx context.Context, userId int64) error {
  10. dataWarningList := make([]*model.DataWarning, 0)
  11. if err := s.DB.Model(new(model.DataWarning)).Where("user_id = ?", userId).Error; err != nil {
  12. return xerr.WithStack(err)
  13. }
  14. for _, v := range dataWarningList {
  15. a, params, err := s.BuildQuery(v.Id)
  16. if err != nil {
  17. return xerr.WithStack(err)
  18. }
  19. var count int64
  20. if err = s.DB.Model(new(model.Cow)).Where(a, params...).Count(&count).Error; err != nil {
  21. return xerr.WithStack(err)
  22. }
  23. }
  24. return nil
  25. }
  26. func (s *StoreEntry) BuildQuery(warningId int64) (string, []interface{}, error) {
  27. conditionsMap := make(map[int32][]string)
  28. params := make([]interface{}, 0)
  29. res := make([]*model.DataWarningItems, 0)
  30. if err := s.DB.Model(new(model.DataWarningItems)).
  31. Where("warning_id = ?", warningId).
  32. Order("group_id").
  33. Find(&res).Error; err != nil {
  34. return "", nil, xerr.WithStack(err)
  35. }
  36. for _, v := range res {
  37. conditionsMap[v.GroupId] = append(conditionsMap[v.GroupId], fmt.Sprintf(" %s %s ? ", v.FieldName, v.Operator))
  38. params = append(params, v.Value)
  39. }
  40. if len(conditionsMap) == 0 {
  41. return "", nil, xerr.Custom("条件组不能为空")
  42. }
  43. var sqlConditions []string
  44. for _, groupConditions := range conditionsMap {
  45. if len(groupConditions) == 0 {
  46. continue // 跳过空组
  47. }
  48. // 同一个组内的条件用 OR 拼接
  49. groupQuery := strings.Join(groupConditions, " OR ")
  50. // 如果组内有多个条件,用括号包裹
  51. if len(groupConditions) > 1 {
  52. groupQuery = fmt.Sprintf("(%s)", groupQuery)
  53. }
  54. sqlConditions = append(sqlConditions, groupQuery)
  55. }
  56. return strings.Join(sqlConditions, " AND "), params, nil
  57. }