sql.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package crontab
  2. import (
  3. "errors"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "kpt-pasture/util"
  7. "time"
  8. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  9. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  10. "gitee.com/xuyiping_admin/pkg/xerr"
  11. "go.uber.org/zap"
  12. "gorm.io/gorm"
  13. )
  14. func (e *Entry) FindPastureList() []*model.AppPastureList {
  15. res := make([]*model.AppPastureList, 0)
  16. if err := e.DB.Model(new(model.AppPastureList)).
  17. Where("is_show = ?", pasturePb.IsShow_Ok).
  18. Find(&res).Error; err != nil {
  19. zaplog.Error("FindPastureList error", zap.Any("err", err))
  20. return res
  21. }
  22. return res
  23. }
  24. func (e *Entry) GetCowById(cowId int64) (*model.Cow, error) {
  25. cowInfo := &model.Cow{}
  26. if err := e.DB.Model(new(model.Cow)).
  27. Where("id = ?", cowId).
  28. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  29. First(cowInfo).Error; err != nil {
  30. return nil, err
  31. }
  32. return cowInfo, nil
  33. }
  34. func (e *Entry) GetPenMapList(pastureId int64) (map[int32]*model.Pen, error) {
  35. penList := make([]*model.Pen, 0)
  36. if err := e.DB.Model(new(model.Pen)).
  37. Where("pasture_id = ?", pastureId).
  38. Where("is_delete = ?", pasturePb.IsShow_Ok).
  39. Find(&penList).Error; err != nil {
  40. return nil, xerr.WithStack(err)
  41. }
  42. penMap := make(map[int32]*model.Pen)
  43. for _, v := range penList {
  44. penMap[v.Id] = v
  45. }
  46. return penMap, nil
  47. }
  48. // GetBeforeThreeDaysCowEstrus 获取值得时间之前三天内最大发情记录
  49. func (e *Entry) GetBeforeThreeDaysCowEstrus(cowId int64, activeTime string) *model.NeckRingEstrus {
  50. neckRingEstrus := &model.NeckRingEstrus{}
  51. if err := e.DB.Model(new(model.NeckRingEstrus)).
  52. Select("MAX(max_high) as max_high,cow_id,MAX(day_high) as day_high").
  53. Select("MAX(IF(check_result=1,3,check_result)) AS check_result").
  54. Where("cow_id = ?", cowId).
  55. Where("active_time >= ?", activeTime).
  56. First(neckRingEstrus).Error; err != nil {
  57. return neckRingEstrus
  58. }
  59. return neckRingEstrus
  60. }
  61. // GetTwoEstrus 判断最近50天内是否存在发情记录(发情等级>=2),如果18~25天@xadjust21,如果36~50天@xadjust42
  62. func (e *Entry) GetTwoEstrus(pastureId, cowId int64, startActiveTime, endActiveTime string) *CowEstrus {
  63. newCowEstrus := &CowEstrus{}
  64. if err := e.DB.Model(new(model.NeckRingEstrus)).
  65. Select("cow_id,MAX(active_time) as active_date").
  66. Where("cow_id = ?", cowId).
  67. Where("pasture_id = ?", pastureId).
  68. Where("active_time BETWEEN ? AND ?", startActiveTime, endActiveTime).
  69. Where("active_level >= ?", pasturePb.EstrusLevel_Middle).
  70. First(newCowEstrus).Error; err != nil {
  71. return newCowEstrus
  72. }
  73. return newCowEstrus
  74. }
  75. func (e *Entry) FindCowInfoByCowId(cowId int64) *model.Cow {
  76. res := &model.Cow{}
  77. if err := e.DB.Model(new(model.Cow)).
  78. Where("id = ?", cowId).
  79. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  80. First(res).Error; err != nil {
  81. zaplog.Error("FindCowInfoByCowId", zap.Any("cowId", cowId), zap.Any("err", err))
  82. return nil
  83. }
  84. return res
  85. }
  86. func (e *Entry) IsExistEventEstrus(pastureId, cowId int64) *model.EventEstrus {
  87. res := &model.EventEstrus{}
  88. if err := e.DB.Model(new(model.EventEstrus)).
  89. Where("cow_id = ?", cowId).
  90. Where("pasture_id = ?", pastureId).
  91. Where("expose_estrus_type = ?", pasturePb.ExposeEstrusType_Neck_Ring).
  92. Where("is_show = ?", pasturePb.IsShow_Ok).
  93. Order("id DESC").
  94. First(res).Error; err != nil {
  95. return nil
  96. }
  97. return res
  98. }
  99. func (e *Entry) IsExistNeckActiveHabit(pastureId int64, neckRingNumber, heatDate string, frameId int32) (*model.NeckActiveHabit, int64) {
  100. count := int64(0)
  101. neckActiveHabit := &model.NeckActiveHabit{}
  102. if err := e.DB.Model(new(model.NeckActiveHabit)).
  103. Where("pasture_id = ?", pastureId).
  104. Where("neck_ring_number = ?", neckRingNumber).
  105. Where("heat_date = ?", heatDate).
  106. Where("frameid = ?", frameId).
  107. Count(&count).First(neckActiveHabit).Error; err != nil {
  108. return nil, 0
  109. }
  110. return neckActiveHabit, count
  111. }
  112. func (e *Entry) FindAppPastureReceiver() map[string]int64 {
  113. appPastureReceiverList := make([]*model.AppPastureReceiver, 0)
  114. if err := e.DB.Model(new(model.AppPastureReceiver)).
  115. Find(&appPastureReceiverList).Error; err != nil {
  116. zaplog.Error("FindAppPastureReceiver", zap.Any("err", err))
  117. }
  118. receiverMap := make(map[string]int64)
  119. for _, v := range appPastureReceiverList {
  120. receiverMap[v.ReceiverNumber] = v.PastureId
  121. }
  122. return receiverMap
  123. }
  124. func (e *Entry) FindSystemNeckRingConfigure(pastureId int64) ([]*model.NeckRingConfigure, error) {
  125. res := make([]*model.NeckRingConfigure, 0)
  126. if err := e.DB.Model(new(model.NeckRingConfigure)).
  127. Where("pasture_id = ?", pastureId).
  128. Where("is_show = ?", pasturePb.IsShow_Ok).
  129. Find(&res).Error; err != nil {
  130. return nil, xerr.WithStack(err)
  131. }
  132. return res, nil
  133. }
  134. func (e *Entry) GetSystemNeckRingConfigure(pastureId int64, name string) (*model.NeckRingConfigure, error) {
  135. res := &model.NeckRingConfigure{}
  136. if err := e.DB.Model(new(model.NeckRingConfigure)).
  137. Where("pasture_id = ?", pastureId).
  138. Where("is_show = ?", pasturePb.IsShow_Ok).
  139. Where("name = ?", name).
  140. First(&res).Error; err != nil {
  141. return nil, xerr.WithStack(err)
  142. }
  143. return res, nil
  144. }
  145. func (e *Entry) GetCowInfoByNeckRingNumber(pastureId int64, neckRingNumber string) *model.Cow {
  146. res := &model.Cow{}
  147. if err := e.DB.Model(new(model.Cow)).
  148. Where("pasture_id = ?", pastureId).
  149. Where("neck_ring_number = ?", neckRingNumber).
  150. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  151. First(res).Error; err != nil {
  152. return nil
  153. }
  154. return res
  155. }
  156. // GetMinIdByHeatDate 获取最小的id
  157. func (e *Entry) GetMinIdByHeatDate(heatDate string, defaultId int64) (int64, error) {
  158. xMinId := struct {
  159. Id int64
  160. }{}
  161. if err := e.DB.Model(new(model.NeckActiveHabit)).
  162. Select("MIN(id) as id").
  163. Where("heat_date = ?", heatDate).
  164. First(&xMinId).Error; err != nil {
  165. if errors.Is(err, gorm.ErrRecordNotFound) {
  166. xMinId.Id = defaultId
  167. } else {
  168. return 0, xerr.WithStack(err)
  169. }
  170. }
  171. return xMinId.Id, nil
  172. }
  173. func (e *Entry) FindFilterData(pastureId int64, neckRingNumber, heatDate string, frameId int32) *FilterData {
  174. firstFilterData := &FilterData{}
  175. if err := e.DB.Model(new(model.NeckActiveHabit)).
  176. Select("neck_ring_number", "filter_high", "filter_rumina", "filter_chew", "change_filter", "rumina_filter", "chew_filter").
  177. Where("neck_ring_number = ?", neckRingNumber).
  178. Where("heat_date = ?", heatDate).
  179. Where("frameid = ?", frameId).
  180. Where("pasture_id = ?", pastureId).
  181. First(firstFilterData).Error; err != nil {
  182. zaplog.Error("FirstFilterUpdate", zap.Any("err", err), zap.Any("NeckRingNumber", neckRingNumber), zap.Any("heatDate", heatDate), zap.Any("frameId", frameId))
  183. }
  184. return firstFilterData
  185. }
  186. func (e *Entry) FindWeekHabitData(pastureId int64, neckRingNumber, heatDate string, frameid int32, xToday *XToday) *WeekHabit {
  187. beginDayDate, _ := util.TimeParseLocal(model.LayoutDate2, heatDate)
  188. before7DayDate := beginDayDate.AddDate(0, 0, -7).Format(model.LayoutDate2)
  189. before1DayDate := beginDayDate.AddDate(0, 0, -1).Format(model.LayoutDate2)
  190. weekHabitData := &WeekHabit{}
  191. if err := e.DB.Model(new(model.NeckActiveHabit)).
  192. Select(
  193. "neck_ring_number",
  194. "IF(COUNT(1)>=3, ROUND((SUM(filter_high) -MIN(filter_high) -MAX(filter_high))/ABS(COUNT(1) -2),0), -1) as high_habit",
  195. "IF(COUNT(1)>=3, ROUND((SUM(filter_rumina) -MIN(filter_rumina) -MAX(filter_rumina))/ABS(COUNT(1) -2),0), -1) as rumina_habit",
  196. "IF(COUNT(1)>=3, ROUND((SUM(filter_chew) -MIN(filter_chew) -MAX(filter_chew))/ABS(COUNT(1) -2),0), -1) as chew_habit",
  197. "ROUND(AVG(intake),0) as intake_habit",
  198. "ROUND(AVG(inactive),0) as inactive_habit",
  199. ).Where("pasture_id = ?", pastureId).
  200. Where("heat_date BETWEEN ? AND ?", before7DayDate, before1DayDate).
  201. Where("neck_ring_number = ? ", neckRingNumber).
  202. Where("frameid = ?", frameid).
  203. Where("cow_id > ?", 0).
  204. Where(e.DB.Where("high > ?", xToday.High).Or("rumina >= ?", xToday.Rumina)).
  205. Group("neck_ring_number").
  206. First(weekHabitData).Error; err != nil {
  207. zaplog.Error("WeeklyActiveAvgUpdate-1",
  208. zap.Any("error", err),
  209. zap.Any("neckRingNumber", neckRingNumber),
  210. zap.Any("frameId", frameid),
  211. zap.Any("heatDate", heatDate),
  212. zap.Any("xToday", xToday),
  213. )
  214. }
  215. return weekHabitData
  216. }
  217. func (e *Entry) FindSumHabitData(pastureId int64, neckRingNumber, heatDate string, frameid int32, xToday *XToday) *SumHabit {
  218. beginDayDate, _ := util.TimeParseLocal(model.LayoutDate2, heatDate)
  219. before1DayDate := beginDayDate.AddDate(0, 0, -1).Format(model.LayoutDate2)
  220. activeTime := fmt.Sprintf("%s %02d:00:00", heatDate, frameid*2+1)
  221. activeStartTimeParse, _ := util.TimeParseLocal(model.LayoutTime, activeTime)
  222. activeStartTime := activeStartTimeParse.Add(-23 * time.Hour).Format(model.LayoutTime)
  223. // 累计24小时数值
  224. sumHabitData := &SumHabit{}
  225. if err := e.DB.Model(new(model.NeckActiveHabit)).
  226. Select(
  227. "neck_ring_number",
  228. "IF(COUNT(1)>6, ROUND(AVG(filter_rumina)*12,0), 0) as sum_rumina",
  229. "IF(COUNT(1)>6, ROUND(AVG(intake)*12,0), 0) as sum_intake",
  230. "IF(COUNT(1)>6, ROUND(AVG(inactive)*12,0), 0) as sum_inactive",
  231. "IF(COUNT(1)>6, ROUND(AVG(active)*12,0), 0) as sum_active",
  232. "MAX(change_filter) as sum_max_high",
  233. fmt.Sprintf("MIN(IF(change_filter > %d, change_filter, 0)) as sum_min_high", model.DefaultChangeFilter),
  234. fmt.Sprintf("MIN( CASE WHEN filter_chew > %d THEN filter_chew WHEN filter_rumina >= %d THEN filter_rumina ELSE 0 END) as sum_min_chew", model.DefaultChangeFilter, model.DefaultRuminaFilter),
  235. ).
  236. Where("pasture_id = ?", pastureId).
  237. Where("heat_date BETWEEN ? AND ?", before1DayDate, heatDate).
  238. Where("active_time BETWEEN ? AND ?", activeStartTime, activeTime).
  239. Where(e.DB.Where("high > ?", xToday.High).Or("rumina >= ?", xToday.Rumina)).
  240. Where("neck_ring_number = ?", neckRingNumber).
  241. Group("neck_ring_number").First(sumHabitData).Debug().Error; err != nil {
  242. zaplog.Error("WeeklyActiveAvgUpdate-2",
  243. zap.Any("error", err),
  244. zap.Any("neckRingNumber", neckRingNumber),
  245. zap.Any("frameId", frameid),
  246. zap.Any("heatDate", heatDate),
  247. zap.Any("xToday", xToday),
  248. )
  249. }
  250. return sumHabitData
  251. }
  252. func (e *Entry) FindBefore3DaysNeckActiveHabit(pastureId int64, neckRingNumber, heatDate string, frameid int32) *model.NeckActiveHabit {
  253. before3DaysNeckActiveHabit := &model.NeckActiveHabit{}
  254. beginDayDate, _ := util.TimeParseLocal(model.LayoutDate2, heatDate)
  255. before3DayDate := beginDayDate.AddDate(0, 0, -3).Format(model.LayoutDate2)
  256. if err := e.DB.Model(new(model.NeckActiveHabit)).
  257. Select("sum_rumina", "sum_intake").
  258. Where("pasture_id = ?", pastureId).
  259. Where("neck_ring_number = ?", neckRingNumber).
  260. Where("heat_date = ?", before3DayDate).
  261. Where("frameid = ? ", frameid).
  262. First(before3DaysNeckActiveHabit).Error; err != nil {
  263. zaplog.Error("WeeklyActiveAvgUpdate-3",
  264. zap.Any("error", err),
  265. zap.Any("neckRingNumber", neckRingNumber),
  266. zap.Any("frameId", frameid),
  267. zap.Any("heatDate", heatDate),
  268. )
  269. }
  270. return before3DaysNeckActiveHabit
  271. }
  272. // FindNeckRingEstrusByFirstTimeEmpty 查询firstTime为空的数据
  273. func (e *Entry) FindNeckRingEstrusByFirstTimeEmpty(pastureId int64) []*model.NeckRingEstrus {
  274. neckRingEstrusList := make([]*model.NeckRingEstrus, 0)
  275. if err := e.DB.Model(new(model.NeckRingEstrus)).
  276. Where("first_time = ?", "").
  277. Where("is_show = ?", pasturePb.IsShow_Ok).
  278. Where("pasture_id = ?", pastureId).
  279. Find(&neckRingEstrusList).Error; err != nil {
  280. zaplog.Error("FindNeckRingEstrusFirstTime", zap.Any("err", err))
  281. }
  282. return neckRingEstrusList
  283. }