sql.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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(pastureId, cowId int64) (*model.Cow, error) {
  25. cowInfo := &model.Cow{}
  26. if err := e.DB.Model(new(model.Cow)).
  27. Where("id = ?", cowId).
  28. Where("pasture_id = ?", pastureId).
  29. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  30. First(cowInfo).Error; err != nil {
  31. return nil, xerr.WithStack(err)
  32. }
  33. return cowInfo, nil
  34. }
  35. func (e *Entry) GetCowByIds(pastureId int64, cowIds []int64) ([]*model.Cow, error) {
  36. cowInfoList := make([]*model.Cow, 0)
  37. if err := e.DB.Model(new(model.Cow)).
  38. Where("pasture_id = ?", pastureId).
  39. Where("id IN (?)", cowIds).
  40. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  41. Find(&cowInfoList).Error; err != nil {
  42. return nil, xerr.WithStack(err)
  43. }
  44. return cowInfoList, nil
  45. }
  46. func (e *Entry) GetCowByEarNumber(pastureId int64, earNumber string) (*model.Cow, error) {
  47. cowInfo := &model.Cow{}
  48. if err := e.DB.Model(new(model.Cow)).
  49. Where("ear_number = ?", earNumber).
  50. Where("pasture_id = ?", pastureId).
  51. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  52. First(cowInfo).Error; err != nil {
  53. return nil, xerr.WithStack(err)
  54. }
  55. return cowInfo, nil
  56. }
  57. func (e *Entry) GetCowByNeckRingNumbers(pastureId int64, neckRingNumbers []string) ([]*model.Cow, error) {
  58. cowInfoList := make([]*model.Cow, 0)
  59. if err := e.DB.Model(new(model.Cow)).
  60. Where("pasture_id = ?", pastureId).
  61. Where("neck_ring_number IN (?)", neckRingNumbers).
  62. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  63. Find(&cowInfoList).Error; err != nil {
  64. return nil, xerr.WithStack(err)
  65. }
  66. return cowInfoList, nil
  67. }
  68. func (e *Entry) GetCowByNeckRingNumber(pastureId int64, neckRingNumber string) (*model.Cow, error) {
  69. cowInfo := &model.Cow{}
  70. if err := e.DB.Model(new(model.Cow)).
  71. Where("pasture_id = ?", pastureId).
  72. Where("neck_ring_number = ?", neckRingNumber).
  73. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  74. First(cowInfo).Error; err != nil {
  75. return nil, xerr.WithStack(err)
  76. }
  77. return cowInfo, nil
  78. }
  79. func (e *Entry) GetPenMapList(pastureId int64) (map[int32]*model.Pen, error) {
  80. penList := make([]*model.Pen, 0)
  81. if err := e.DB.Model(new(model.Pen)).
  82. Where("pasture_id = ?", pastureId).
  83. Where("is_delete = ?", pasturePb.IsShow_Ok).
  84. Find(&penList).Error; err != nil {
  85. return nil, xerr.WithStack(err)
  86. }
  87. penMap := make(map[int32]*model.Pen)
  88. for _, v := range penList {
  89. penMap[v.Id] = v
  90. }
  91. return penMap, nil
  92. }
  93. // GetBeforeThreeDaysCowEstrus 获取值得时间之前三天内最大发情记录
  94. func (e *Entry) GetBeforeThreeDaysCowEstrus(cowId int64, activeTime string) *model.NeckRingEstrus {
  95. neckRingEstrus := &model.NeckRingEstrus{}
  96. if err := e.DB.Model(new(model.NeckRingEstrus)).
  97. Select("MAX(max_high) as max_high,cow_id,MAX(day_high) as day_high").
  98. Select("MAX(IF(check_result=1,3,check_result)) AS check_result").
  99. Where("cow_id = ?", cowId).
  100. Where("active_time >= ?", activeTime).
  101. First(neckRingEstrus).Error; err != nil {
  102. return neckRingEstrus
  103. }
  104. return neckRingEstrus
  105. }
  106. // GetTwoEstrus 判断最近50天内是否存在发情记录(发情等级>=2),如果18~25天@xadjust21,如果36~50天@xadjust42
  107. func (e *Entry) GetTwoEstrus(pastureId, cowId int64, startActiveTime, endActiveTime string) *CowEstrus {
  108. newCowEstrus := &CowEstrus{}
  109. if err := e.DB.Model(new(model.NeckRingEstrus)).
  110. Select("cow_id,MAX(active_time) as active_date").
  111. Where("cow_id = ?", cowId).
  112. Where("pasture_id = ?", pastureId).
  113. Where("active_time BETWEEN ? AND ?", startActiveTime, endActiveTime).
  114. Where("active_level >= ?", pasturePb.EstrusLevel_Middle).
  115. First(newCowEstrus).Error; err != nil {
  116. return newCowEstrus
  117. }
  118. return newCowEstrus
  119. }
  120. func (e *Entry) IsExistEventEstrus(pastureId, cowId int64) *model.EventEstrus {
  121. res := &model.EventEstrus{}
  122. if err := e.DB.Model(new(model.EventEstrus)).
  123. Where("cow_id = ?", cowId).
  124. Where("pasture_id = ?", pastureId).
  125. Where("expose_estrus_type = ?", pasturePb.ExposeEstrusType_Neck_Ring).
  126. Where("is_show = ?", pasturePb.IsShow_Ok).
  127. Order("id DESC").
  128. First(res).Error; err != nil {
  129. return nil
  130. }
  131. return res
  132. }
  133. func (e *Entry) IsExistNeckActiveHabit(pastureId int64, neckRingNumber, heatDate string, frameId int32) (*model.NeckActiveHabit, int64) {
  134. count := int64(0)
  135. neckActiveHabit := &model.NeckActiveHabit{}
  136. if err := e.DB.Model(new(model.NeckActiveHabit)).
  137. Where("pasture_id = ?", pastureId).
  138. Where("neck_ring_number = ?", neckRingNumber).
  139. Where("heat_date = ?", heatDate).
  140. Where("frameid = ?", frameId).
  141. Count(&count).First(neckActiveHabit).Error; err != nil {
  142. return nil, 0
  143. }
  144. return neckActiveHabit, count
  145. }
  146. func (e *Entry) FindAppPastureReceiver() map[string]int64 {
  147. appPastureReceiverList := make([]*model.AppPastureReceiver, 0)
  148. if err := e.DB.Model(new(model.AppPastureReceiver)).
  149. Find(&appPastureReceiverList).Error; err != nil {
  150. zaplog.Error("FindAppPastureReceiver", zap.Any("err", err))
  151. }
  152. receiverMap := make(map[string]int64)
  153. for _, v := range appPastureReceiverList {
  154. receiverMap[v.ReceiverNumber] = v.PastureId
  155. }
  156. return receiverMap
  157. }
  158. func (e *Entry) FindSystemNeckRingConfigure(pastureId int64) ([]*model.NeckRingConfigure, error) {
  159. res := make([]*model.NeckRingConfigure, 0)
  160. if err := e.DB.Model(new(model.NeckRingConfigure)).
  161. Where("pasture_id = ?", pastureId).
  162. Where("is_show = ?", pasturePb.IsShow_Ok).
  163. Find(&res).Error; err != nil {
  164. return nil, xerr.WithStack(err)
  165. }
  166. return res, nil
  167. }
  168. func (e *Entry) FindMilkConfigure(pastureId int64) ([]*model.MilkConfigure, error) {
  169. res := make([]*model.MilkConfigure, 0)
  170. if err := e.DB.Model(new(model.MilkConfigure)).
  171. Where("pasture_id = ?", pastureId).
  172. Where("is_show = ?", pasturePb.IsShow_Ok).
  173. Find(&res).Error; err != nil {
  174. return nil, xerr.WithStack(err)
  175. }
  176. return res, nil
  177. }
  178. func (e *Entry) GetSystemNeckRingConfigure(pastureId int64, name string) (*model.NeckRingConfigure, error) {
  179. res := &model.NeckRingConfigure{}
  180. if err := e.DB.Model(new(model.NeckRingConfigure)).
  181. Where("pasture_id = ?", pastureId).
  182. Where("is_show = ?", pasturePb.IsShow_Ok).
  183. Where("name = ?", name).
  184. First(&res).Error; err != nil {
  185. return nil, xerr.WithStack(err)
  186. }
  187. return res, nil
  188. }
  189. func (e *Entry) UpdateSystemNeckRingConfigure(pastureId int64, name string, value int64) error {
  190. if err := e.DB.Model(new(model.NeckRingConfigure)).
  191. Where("pasture_id = ?", pastureId).
  192. Where("is_show = ?", pasturePb.IsShow_Ok).
  193. Where("name = ?", name).
  194. Update("value", value).Error; err != nil {
  195. return xerr.WithStack(err)
  196. }
  197. return nil
  198. }
  199. func (e *Entry) GetCowInfoByNeckRingNumber(pastureId int64, neckRingNumber string) *model.Cow {
  200. res := &model.Cow{}
  201. if err := e.DB.Model(new(model.Cow)).
  202. Where("pasture_id = ?", pastureId).
  203. Where("neck_ring_number = ?", neckRingNumber).
  204. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  205. First(res).Error; err != nil {
  206. return nil
  207. }
  208. return res
  209. }
  210. // GetMinIdByHeatDate 获取最小的id
  211. func (e *Entry) GetMinIdByHeatDate(heatDate string, defaultId int64) (int64, error) {
  212. xMinId := struct {
  213. Id int64
  214. }{}
  215. if err := e.DB.Model(new(model.NeckActiveHabit)).
  216. Select("MIN(id) as id").
  217. Where("heat_date = ?", heatDate).
  218. First(&xMinId).Error; err != nil {
  219. if errors.Is(err, gorm.ErrRecordNotFound) {
  220. xMinId.Id = defaultId
  221. } else {
  222. return 0, xerr.WithStack(err)
  223. }
  224. }
  225. return xMinId.Id, nil
  226. }
  227. func (e *Entry) FindFilterData(pastureId int64, neckRingNumber, heatDate string, frameId int32) *FilterData {
  228. firstFilterData := &FilterData{}
  229. if err := e.DB.Model(new(model.NeckActiveHabit)).
  230. Select("neck_ring_number", "filter_high", "filter_rumina", "filter_chew", "change_filter", "rumina_filter", "chew_filter").
  231. Where("neck_ring_number = ?", neckRingNumber).
  232. Where("heat_date = ?", heatDate).
  233. Where("frameid = ?", frameId).
  234. Where("pasture_id = ?", pastureId).
  235. First(firstFilterData).Error; err != nil {
  236. zaplog.Error("FirstFilterUpdate", zap.Any("err", err), zap.Any("NeckRingNumber", neckRingNumber), zap.Any("heatDate", heatDate), zap.Any("frameId", frameId))
  237. }
  238. return firstFilterData
  239. }
  240. func (e *Entry) FindWeekHabitData(pastureId int64, neckRingNumber, heatDate string, frameid int32, xToday *XToday) *WeekHabit {
  241. beginDayDate, _ := util.TimeParseLocal(model.LayoutDate2, heatDate)
  242. before7DayDate := beginDayDate.AddDate(0, 0, -7).Format(model.LayoutDate2)
  243. before1DayDate := beginDayDate.AddDate(0, 0, -1).Format(model.LayoutDate2)
  244. weekHabitData := &WeekHabit{}
  245. if err := e.DB.Model(new(model.NeckActiveHabit)).
  246. Select(
  247. "neck_ring_number",
  248. "IF(COUNT(1)>=3, ROUND((SUM(filter_high) -MIN(filter_high) -MAX(filter_high))/ABS(COUNT(1) -2),0), -1) as high_habit",
  249. "IF(COUNT(1)>=3, ROUND((SUM(filter_rumina) -MIN(filter_rumina) -MAX(filter_rumina))/ABS(COUNT(1) -2),0), -1) as rumina_habit",
  250. "IF(COUNT(1)>=3, ROUND((SUM(filter_chew) -MIN(filter_chew) -MAX(filter_chew))/ABS(COUNT(1) -2),0), -1) as chew_habit",
  251. "ROUND(AVG(intake),0) as intake_habit",
  252. "ROUND(AVG(inactive),0) as inactive_habit",
  253. ).Where("pasture_id = ?", pastureId).
  254. Where("heat_date BETWEEN ? AND ?", before7DayDate, before1DayDate).
  255. Where("neck_ring_number = ? ", neckRingNumber).
  256. Where("frameid = ?", frameid).
  257. Where("cow_id > ?", 0).
  258. Where(e.DB.Where("high > ?", xToday.High).Or("rumina >= ?", xToday.Rumina)).
  259. Group("neck_ring_number").
  260. First(weekHabitData).Error; err != nil {
  261. zaplog.Error("WeeklyActiveAvgUpdate-1",
  262. zap.Any("error", err),
  263. zap.Any("neckRingNumber", neckRingNumber),
  264. zap.Any("frameId", frameid),
  265. zap.Any("heatDate", heatDate),
  266. zap.Any("xToday", xToday),
  267. )
  268. }
  269. return weekHabitData
  270. }
  271. func (e *Entry) FindSumHabitData(pastureId int64, neckRingNumber, heatDate string, frameid int32, xToday *XToday) *SumHabit {
  272. beginDayDate, _ := util.TimeParseLocal(model.LayoutDate2, heatDate)
  273. before1DayDate := beginDayDate.AddDate(0, 0, -1).Format(model.LayoutDate2)
  274. activeTime := fmt.Sprintf("%s %02d:00:00", heatDate, frameid*2+1)
  275. activeStartTimeParse, _ := util.TimeParseLocal(model.LayoutTime, activeTime)
  276. activeStartTime := activeStartTimeParse.Add(-23 * time.Hour).Format(model.LayoutTime)
  277. // 累计24小时数值
  278. sumHabitData := &SumHabit{}
  279. if err := e.DB.Model(new(model.NeckActiveHabit)).
  280. Select(
  281. "neck_ring_number",
  282. "IF(COUNT(1)>6, ROUND(AVG(filter_rumina)*12,0), 0) as sum_rumina",
  283. "IF(COUNT(1)>6, ROUND(AVG(intake)*12,0), 0) as sum_intake",
  284. "IF(COUNT(1)>6, ROUND(AVG(inactive)*12,0), 0) as sum_inactive",
  285. "IF(COUNT(1)>6, ROUND(AVG(active)*12,0), 0) as sum_active",
  286. "MAX(change_filter) as sum_max_high",
  287. fmt.Sprintf("MIN(IF(change_filter > %d, change_filter, 0)) as sum_min_high", model.DefaultChangeFilter),
  288. 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),
  289. ).
  290. Where("pasture_id = ?", pastureId).
  291. Where("heat_date BETWEEN ? AND ?", before1DayDate, heatDate).
  292. Where("active_time BETWEEN ? AND ?", activeStartTime, activeTime).
  293. Where(e.DB.Where("high > ?", xToday.High).Or("rumina >= ?", xToday.Rumina)).
  294. Where("neck_ring_number = ?", neckRingNumber).
  295. Group("neck_ring_number").First(sumHabitData).Debug().Error; err != nil {
  296. zaplog.Error("WeeklyActiveAvgUpdate-2",
  297. zap.Any("error", err),
  298. zap.Any("neckRingNumber", neckRingNumber),
  299. zap.Any("frameId", frameid),
  300. zap.Any("heatDate", heatDate),
  301. zap.Any("xToday", xToday),
  302. )
  303. }
  304. return sumHabitData
  305. }
  306. func (e *Entry) FindBefore3DaysNeckActiveHabit(pastureId int64, neckRingNumber, heatDate string, frameid int32) *model.NeckActiveHabit {
  307. before3DaysNeckActiveHabit := &model.NeckActiveHabit{}
  308. beginDayDate, _ := util.TimeParseLocal(model.LayoutDate2, heatDate)
  309. before3DayDate := beginDayDate.AddDate(0, 0, -3).Format(model.LayoutDate2)
  310. if err := e.DB.Model(new(model.NeckActiveHabit)).
  311. Select("sum_rumina", "sum_intake").
  312. Where("pasture_id = ?", pastureId).
  313. Where("neck_ring_number = ?", neckRingNumber).
  314. Where("heat_date = ?", before3DayDate).
  315. Where("frameid = ? ", frameid).
  316. First(before3DaysNeckActiveHabit).Error; err != nil {
  317. zaplog.Error("WeeklyActiveAvgUpdate-3",
  318. zap.Any("error", err),
  319. zap.Any("neckRingNumber", neckRingNumber),
  320. zap.Any("frameId", frameid),
  321. zap.Any("heatDate", heatDate),
  322. )
  323. }
  324. return before3DaysNeckActiveHabit
  325. }
  326. // FindNeckRingEstrusByFirstTimeEmpty 查询firstTime为空的数据
  327. func (e *Entry) FindNeckRingEstrusByFirstTimeEmpty(pastureId int64) []*model.NeckRingEstrus {
  328. neckRingEstrusList := make([]*model.NeckRingEstrus, 0)
  329. if err := e.DB.Model(new(model.NeckRingEstrus)).
  330. Where("first_time = ?", "").
  331. Where("is_show = ?", pasturePb.IsShow_Ok).
  332. Where("pasture_id = ?", pastureId).
  333. Find(&neckRingEstrusList).Error; err != nil {
  334. zaplog.Error("FindNeckRingEstrusFirstTime", zap.Any("err", err))
  335. }
  336. return neckRingEstrusList
  337. }
  338. func (e *Entry) FindMilkHallList(pastureId int64) []*model.MilkHall {
  339. res := make([]*model.MilkHall, 0)
  340. if err := e.DB.Model(new(model.MilkHall)).
  341. Where("pasture_id = ?", pastureId).
  342. Where("is_show = ?", pasturePb.IsShow_Ok).
  343. Find(&res).Error; err != nil {
  344. zaplog.Error("FindMilkHallList", zap.Any("err", err))
  345. return res
  346. }
  347. return res
  348. }