data_warning.go 4.5 KB

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