milk_daily.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package crontab
  2. import (
  3. "kpt-pasture/model"
  4. "kpt-pasture/util"
  5. "time"
  6. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  7. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  8. "go.uber.org/zap"
  9. )
  10. func (e *Entry) InsertMilkDaily() error {
  11. pastureList := e.FindPastureList()
  12. if pastureList == nil || len(pastureList) == 0 {
  13. return nil
  14. }
  15. for _, pasture := range pastureList {
  16. // 获取最大记录日期或默认日期
  17. pastureId := pasture.Id
  18. var maxDateTime string
  19. if err := e.DB.Model(new(model.MilkDaily)).
  20. Where("pasture_id = ?", pastureId).
  21. Select("IFNULL(MAX(heat_date) + INTERVAL 1 DAY, CURDATE() - INTERVAL 1 MONTH) AS max_date_time").
  22. Scan(&maxDateTime).Error; err != nil {
  23. zaplog.Error("InsertMilkDaily", zap.Any("pastureId", pastureId), zap.Any("err", err))
  24. continue
  25. }
  26. maxDate, err := util.TimeParseLocal(model.LayoutDate2, maxDateTime)
  27. if err != nil {
  28. zaplog.Error("InsertMilkDaily", zap.Any("pastureId", pastureId), zap.Any("err", err))
  29. continue
  30. }
  31. e.ProcessMilkDaily(pastureId, maxDate)
  32. }
  33. return nil
  34. }
  35. func (e *Entry) ProcessMilkDaily(pastureId int64, maxDate time.Time) {
  36. nowTime := time.Now().Local()
  37. // 处理每一天的数据
  38. for maxDate.Before(nowTime) {
  39. // 处理有胎次的奶牛
  40. if err := e.processCowsWithLact(pastureId, maxDate); err != nil {
  41. zaplog.Error("ProcessMilkDaily", zap.Any("processCowsWithFetal", err))
  42. }
  43. // 处理无胎次的奶牛
  44. if err := e.processCowsWithNoLact(pastureId, maxDate); err != nil {
  45. zaplog.Error("ProcessMilkDaily", zap.Any("processCowsWithoutFetal", err))
  46. }
  47. // 日期加1天
  48. maxDate = maxDate.AddDate(0, 0, 1)
  49. }
  50. }
  51. func (e *Entry) UpdateMilkDaily(pastureId int64, maxDateTime string) error {
  52. //yesterday := time.Now().Local().AddDate(0, 0, -1).Format(model.LayoutDate2)
  53. return nil
  54. }
  55. // 处理有胎次的奶牛
  56. func (e *Entry) processCowsWithLact(pastureId int64, recordDate time.Time) error {
  57. // 查询有胎次且在记录日期前有记录的奶牛
  58. cowList := make([]*model.Cow, 0)
  59. if err := e.DB.Model(new(model.Cow)).
  60. Where("pasture_id = ?", pastureId).
  61. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  62. Where("lact > ?", 0).
  63. Where("last_calving_at <= ?", recordDate.Local().Unix()).
  64. Find(&cowList).Error; err != nil {
  65. return err
  66. }
  67. // 批量插入数据
  68. milkDailyList := make([]*model.MilkDaily, 0)
  69. for _, cow := range cowList {
  70. calvingDate := ""
  71. if cow.LastCalvingAt > 0 {
  72. calvingDate = time.Unix(cow.LastCalvingAt, 0).Local().Format(model.LayoutDate2)
  73. }
  74. milkDaily := &model.MilkDaily{
  75. CowId: cow.Id,
  76. Lact: cow.Lact,
  77. PastureId: cow.PastureId,
  78. EarNumber: cow.EarNumber,
  79. CalvingDate: calvingDate,
  80. HeatDate: recordDate.Format(model.LayoutDate2),
  81. LactationAge: cow.LactationAge,
  82. PenId: cow.PenId,
  83. PenName: cow.PenName,
  84. BreedStatus: cow.BreedStatus,
  85. }
  86. milkDailyList = append(milkDailyList, milkDaily)
  87. }
  88. if len(milkDailyList) > 0 {
  89. // 分批次插入数据
  90. for i := 0; i < len(milkDailyList); i += 100 {
  91. end := i + 100
  92. if end > len(milkDailyList) {
  93. end = len(milkDailyList)
  94. }
  95. if err := e.DB.Model(new(model.MilkDaily)).
  96. Create(milkDailyList[i:end]).Error; err != nil {
  97. return err
  98. }
  99. }
  100. }
  101. return nil
  102. }
  103. // 处理无胎次的奶牛
  104. func (e *Entry) processCowsWithNoLact(pastureId int64, recordDate time.Time) error {
  105. // 查询无胎次且EID1>0的奶牛
  106. cowList := make([]*model.Cow, 0)
  107. err := e.DB.Model(new(model.Cow)).
  108. //Select("c.intCowId as cow_id, c.intPastureId as pasture_id, c.varCowCode as cow_code,c.dateBirthDate as birth_date, c.intCurBar as cur_bar").
  109. //Where("(c.dateLeave IS NULL OR c.dateLeave > ?) AND c.intCurFetal = 0 AND c.EID1 > 0", recordDate).
  110. Where("pasture_id = ?", pastureId).
  111. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  112. Where("lact = ?", 0).
  113. Where("neck_ring_number != ?", "").
  114. Find(&cowList).Error
  115. if err != nil {
  116. return err
  117. }
  118. // 批量插入数据
  119. milkDailyList := make([]*model.MilkDaily, 0)
  120. for _, cow := range cowList {
  121. birthDate, calvingDate := "", ""
  122. if cow.BirthAt > 0 {
  123. birthDate = time.Unix(cow.BirthAt, 0).Local().Format(model.LayoutDate2)
  124. }
  125. if cow.LastCalvingAt > 0 {
  126. calvingDate = time.Unix(cow.LastCalvingAt, 0).Local().Format(model.LayoutDate2)
  127. }
  128. milkDaily := &model.MilkDaily{
  129. CowId: cow.Id,
  130. Lact: cow.Lact,
  131. PastureId: cow.PastureId,
  132. EarNumber: cow.EarNumber,
  133. BirthDate: birthDate,
  134. CalvingDate: calvingDate,
  135. LactationAge: cow.LactationAge,
  136. HeatDate: recordDate.Format(model.LayoutDate2),
  137. PenId: cow.PenId,
  138. PenName: cow.PenName,
  139. BreedStatus: cow.BreedStatus,
  140. }
  141. milkDailyList = append(milkDailyList, milkDaily)
  142. }
  143. if len(milkDailyList) > 0 {
  144. if err = e.DB.Model(new(model.MilkDaily)).
  145. Create(&milkDailyList).Error; err != nil {
  146. return err
  147. }
  148. }
  149. return nil
  150. }