data_warning.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "kpt-pasture/util"
  7. "strings"
  8. "time"
  9. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  10. "gitee.com/xuyiping_admin/pkg/xerr"
  11. )
  12. func (s *StoreEntry) TestDataWaring(ctx context.Context, userId int64) error {
  13. dataWarningList := make([]*model.DataWarning, 0)
  14. if err := s.DB.Model(new(model.DataWarning)).Where("user_id = ?", userId).Error; err != nil {
  15. return xerr.WithStack(err)
  16. }
  17. for _, v := range dataWarningList {
  18. a, params, err := s.BuildQuery(v.Id)
  19. if err != nil {
  20. return xerr.WithStack(err)
  21. }
  22. var count int64
  23. if err = s.DB.Model(new(model.Cow)).Where(a, params...).Count(&count).Error; err != nil {
  24. return xerr.WithStack(err)
  25. }
  26. }
  27. return nil
  28. }
  29. func (s *StoreEntry) NeckRingOriginalAsync(ctx context.Context, pastureId int64, pagination *pasturePb.PaginationModel) error {
  30. pastureData := &model.AppPastureList{}
  31. if err := s.DB.Model(new(model.AppPastureList)).
  32. Where("id = ?", pastureId).
  33. Where("is_show = ?", pasturePb.IsShow_Ok).
  34. First(pastureData).Error; err != nil {
  35. return xerr.WithStack(err)
  36. }
  37. hActiveOriginalList := make([]*model.HActiveOriginal, 0)
  38. if err := s.DB.Model(new(model.HActiveOriginal)).
  39. Where("intPastureId = ?", pastureId).
  40. Limit(int(pagination.PageSize)).
  41. Offset(int(pagination.PageOffset)).
  42. Find(&hActiveOriginalList).Error; err != nil {
  43. return xerr.WithStack(err)
  44. }
  45. neckRingOriginalList := make([]*model.NeckRingOriginal, 0)
  46. for _, v := range hActiveOriginalList {
  47. _, hours := util.GetNeckRingActiveTimer(v.FrameId)
  48. activeDate := ""
  49. if v.HeatDate != "" && len(v.HeatDate) > 10 {
  50. hd, _ := time.Parse(time.RFC3339, v.HeatDate)
  51. activeDate = hd.Format(model.LayoutDate2)
  52. }
  53. var count int64
  54. if err := s.DB.Model(new(model.NeckRingOriginal)).
  55. Where("pasture_id = ?", pastureId).
  56. Where("neck_ring_number = ?", v.EID1).
  57. Where("frameid = ?", v.FrameId).
  58. Where("active_date = ?", activeDate).
  59. Count(&count).Error; err != nil {
  60. return xerr.WithStack(err)
  61. }
  62. if count > 0 {
  63. continue
  64. }
  65. neckRingOriginalList = append(neckRingOriginalList,
  66. &model.NeckRingOriginal{
  67. PastureId: pastureId,
  68. Uuid: fmt.Sprintf("%d", v.UUID),
  69. NeckRingNumber: fmt.Sprintf("%d", v.EID1),
  70. ActiveDate: activeDate,
  71. Hours: int32(hours),
  72. Frameid: v.FrameId,
  73. Rumina: v.Rumina,
  74. Intake: v.Intake,
  75. Inactive: v.Inactive,
  76. Gasp: v.Gasp,
  77. High: v.High,
  78. Active: v.Active,
  79. Other: v.Other,
  80. FirmwareVersion: 10,
  81. HardwareVersion: 57,
  82. Remain: v.Remain,
  83. Voltage: v.Voltage,
  84. RestartReason: 0,
  85. Upper: 1,
  86. ActiveDateType: pasturePb.ActiveTimeType_Twenty_Minutes,
  87. IsShow: pasturePb.IsShow_No,
  88. Imei: fmt.Sprintf("%d", v.Imei),
  89. ReceiveNumber: fmt.Sprintf("%d", v.Imei),
  90. })
  91. }
  92. if len(neckRingOriginalList) > 0 {
  93. if err := s.DB.Model(new(model.NeckRingOriginal)).
  94. Create(neckRingOriginalList).Error; err != nil {
  95. return xerr.WithStack(err)
  96. }
  97. }
  98. return nil
  99. }
  100. func (s *StoreEntry) BuildQuery(warningId int64) (string, []interface{}, error) {
  101. conditionsMap := make(map[int32][]string)
  102. params := make([]interface{}, 0)
  103. res := make([]*model.DataWarningItems, 0)
  104. if err := s.DB.Model(new(model.DataWarningItems)).
  105. Where("warning_id = ?", warningId).
  106. Order("group_id").
  107. Find(&res).Error; err != nil {
  108. return "", nil, xerr.WithStack(err)
  109. }
  110. for _, v := range res {
  111. conditionsMap[v.GroupId] = append(conditionsMap[v.GroupId], fmt.Sprintf(" %s %s ? ", v.FieldName, v.Operator))
  112. params = append(params, v.Value)
  113. }
  114. if len(conditionsMap) == 0 {
  115. return "", nil, xerr.Custom("条件组不能为空")
  116. }
  117. var sqlConditions []string
  118. for _, groupConditions := range conditionsMap {
  119. if len(groupConditions) == 0 {
  120. continue // 跳过空组
  121. }
  122. // 同一个组内的条件用 OR 拼接
  123. groupQuery := strings.Join(groupConditions, " OR ")
  124. // 如果组内有多个条件,用括号包裹
  125. if len(groupConditions) > 1 {
  126. groupQuery = fmt.Sprintf("(%s)", groupQuery)
  127. }
  128. sqlConditions = append(sqlConditions, groupQuery)
  129. }
  130. return strings.Join(sqlConditions, " AND "), params, nil
  131. }