sql.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package crontab
  2. import (
  3. "errors"
  4. "kpt-pasture/model"
  5. "gorm.io/gorm"
  6. "go.uber.org/zap"
  7. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  8. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  9. "gitee.com/xuyiping_admin/pkg/xerr"
  10. )
  11. func (e *Entry) FindPastureList() []*model.AppPastureList {
  12. res := make([]*model.AppPastureList, 0)
  13. if err := e.DB.Model(new(model.AppPastureList)).
  14. Where("is_show = ?", pasturePb.IsShow_Ok).
  15. Find(&res).Error; err != nil {
  16. zaplog.Error("FindPastureList error", zap.Any("err", err))
  17. return res
  18. }
  19. return res
  20. }
  21. func (e *Entry) GetCowById(cowId int64) (*model.Cow, error) {
  22. cowInfo := &model.Cow{}
  23. if err := e.DB.Model(new(model.Cow)).
  24. Where("id = ?", cowId).
  25. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  26. First(cowInfo).Error; err != nil {
  27. return nil, err
  28. }
  29. return cowInfo, nil
  30. }
  31. func (e *Entry) GetPenMapList() (map[int32]*model.Pen, error) {
  32. penList := make([]*model.Pen, 0)
  33. if err := e.DB.Where("is_delete = ?", pasturePb.IsShow_Ok).Find(&penList).Error; err != nil {
  34. return nil, xerr.WithStack(err)
  35. }
  36. penMap := make(map[int32]*model.Pen)
  37. for _, v := range penList {
  38. penMap[v.Id] = v
  39. }
  40. return penMap, nil
  41. }
  42. // GetBeforeThreeDaysCowEstrus 获取值得时间之前三天内最大发情记录
  43. func (e *Entry) GetBeforeThreeDaysCowEstrus(cowId int64, activeTime string) *model.EventEstrus {
  44. eventEstrus := &model.EventEstrus{}
  45. if err := e.DB.Model(new(model.EventEstrus)).
  46. Select("MAX(max_high) as max_high,cow_id,MAX(day_high) as day_high").
  47. Select("MAX(IF(result=1,3,result)) AS result").
  48. Where("cow_id = ?", cowId).
  49. Where("active_date >= ?", activeTime).
  50. First(eventEstrus).Error; err != nil {
  51. return eventEstrus
  52. }
  53. return eventEstrus
  54. }
  55. // GetTwoEstrus 判断最近50天内是否存在发情记录(发情等级>=2),如果18~25天@xadjust21,如果36~50天@xadjust42
  56. func (e *Entry) GetTwoEstrus(pastureId, cowId int64, startActiveTime, endActiveTime string) *CowEstrus {
  57. newCowEstrus := &CowEstrus{}
  58. if err := e.DB.Model(new(model.EventEstrus)).
  59. Select("cow_id,MAX(active_date) as active_date").
  60. Where("cow_id = ?", cowId).
  61. Where("pasture_id = ?", pastureId).
  62. Where("active_date BETWEEN ? AND ?", startActiveTime, endActiveTime).
  63. Where("level >= ?", pasturePb.EstrusLevel_Middle).
  64. First(newCowEstrus).Error; err != nil {
  65. return newCowEstrus
  66. }
  67. return newCowEstrus
  68. }
  69. func (e *Entry) FindCowInfoByNeckRingNumber(neckRingNumber string) *model.Cow {
  70. res := &model.Cow{}
  71. if err := e.DB.Model(new(model.Cow)).
  72. Where("neck_ring_number = ?", neckRingNumber).
  73. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  74. First(res).Error; err != nil {
  75. return nil
  76. }
  77. return res
  78. }
  79. func (e *Entry) IsExistEventEstrus(pastureId, cowId int64) *model.EventEstrus {
  80. res := &model.EventEstrus{}
  81. if err := e.DB.Model(new(model.EventEstrus)).
  82. Where("cow_id = ?", cowId).
  83. Where("pasture_id = ?", pastureId).
  84. Where("expose_estrus_type = ?", pasturePb.ExposeEstrusType_Neck_Ring).
  85. Where("is_show = ?", pasturePb.IsShow_Ok).
  86. Order("id DESC").
  87. First(res).Error; err != nil {
  88. return nil
  89. }
  90. return res
  91. }
  92. func (e *Entry) IsExistNeckActiveHabit(neckRingNumber, heatDate string, frameId int32) (*model.NeckActiveHabit, int64) {
  93. count := int64(0)
  94. neckRingProcess := &model.NeckRingProcess{}
  95. if err := e.DB.Model(new(model.NeckRingProcess)).
  96. Where("neck_ring_number = ?", neckRingNumber).
  97. Where("active_date = ?", heatDate).
  98. Where("frameid = ?", frameId).
  99. Count(&count).
  100. First(neckRingProcess).Error; err != nil {
  101. return nil, 0
  102. }
  103. res := &model.NeckActiveHabit{}
  104. if neckRingProcess != nil {
  105. if neckRingProcess.HabitId > 0 {
  106. if err := e.DB.Model(new(model.NeckActiveHabit)).
  107. Where("id = ?", neckRingProcess.HabitId).
  108. First(res).Error; err != nil {
  109. return nil, 0
  110. }
  111. } else {
  112. if err := e.DB.Model(new(model.NeckActiveHabit)).
  113. Where("heat_date = ?", heatDate).
  114. Where("neck_ring_number = ?", neckRingNumber).
  115. Where("frameid = ?", frameId).
  116. First(res).Error; err != nil {
  117. return nil, 0
  118. }
  119. if err := e.DB.Model(new(model.NeckRingProcess)).
  120. Where("id = ?", neckRingProcess.Id).
  121. Where("frameid = ?", frameId).
  122. Update("habit_id", res.Id).Error; err != nil {
  123. return nil, 0
  124. }
  125. }
  126. }
  127. return res, count
  128. }
  129. func (e *Entry) GetSystemConfigure(pastureId int64, name string) (*model.SystemConfigure, error) {
  130. res := &model.SystemConfigure{}
  131. if err := e.DB.Model(new(model.SystemConfigure)).
  132. Where("name = ?", name).
  133. Where("pasture_id = ?", pastureId).
  134. Where("is_show = ?", pasturePb.IsShow_Ok).
  135. First(res).Error; err != nil {
  136. return nil, xerr.WithStack(err)
  137. }
  138. return res, nil
  139. }
  140. func (e *Entry) GetCowInfoByNeckRingNumber(pastureId int64, neckRingNumber string) *model.Cow {
  141. res := &model.Cow{}
  142. if err := e.DB.Model(new(model.Cow)).
  143. Where("pasture_id = ?", pastureId).
  144. Where("neck_ring_number = ?", neckRingNumber).
  145. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  146. First(res).Error; err != nil {
  147. return nil
  148. }
  149. return res
  150. }
  151. // GetMinIdByHeatDate 获取最小的id
  152. func (e *Entry) GetMinIdByHeatDate(heatDate string, defaultId int64) (int64, error) {
  153. xMinId := struct {
  154. Id int64
  155. }{}
  156. if err := e.DB.Model(new(model.NeckActiveHabit)).
  157. Select("MIN(id) as id").
  158. Where("heat_date = ?", heatDate).
  159. First(&xMinId).Error; err != nil {
  160. if errors.Is(err, gorm.ErrRecordNotFound) {
  161. xMinId.Id = defaultId
  162. } else {
  163. return 0, xerr.WithStack(err)
  164. }
  165. }
  166. return xMinId.Id, nil
  167. }