milk_daily.go 4.4 KB

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