cow_indicators_base.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package crontab
  2. import (
  3. "errors"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "time"
  7. "gorm.io/gorm"
  8. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  9. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  10. "go.uber.org/zap"
  11. )
  12. // FindPastureAllCow 查询所有牧场牛只总数
  13. func (e *Entry) FindPastureAllCow(pastureList []*model.AppPastureList) map[int64]string {
  14. res := make(map[int64]string)
  15. for _, pasture := range pastureList {
  16. var count int64
  17. if err := e.DB.Model(new(model.Cow)).
  18. Where("pasture_id = ?", pasture.Id).
  19. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  20. Count(&count).Error; err != nil {
  21. zaplog.Error("FindAllCow", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  22. }
  23. res[pasture.Id] = fmt.Sprintf("%d", count)
  24. }
  25. return res
  26. }
  27. // FindPastureAdultCow 成母牛头数
  28. func (e *Entry) FindPastureAdultCow(pastureList []*model.AppPastureList) map[int64]string {
  29. res := make(map[int64]string)
  30. for _, pasture := range pastureList {
  31. var count int64
  32. if err := e.DB.Model(new(model.Cow)).
  33. Where("pasture_id = ?", pasture.Id).
  34. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  35. Where("lact > ?", 0).
  36. Count(&count).Error; err != nil {
  37. zaplog.Error("FindPastureAdultCow", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  38. }
  39. res[pasture.Id] = fmt.Sprintf("%d", count)
  40. }
  41. return res
  42. }
  43. // FindAvgCalvingInterval 平均产犊间隔
  44. func (e *Entry) FindAvgCalvingInterval(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  45. res := make(map[int64]string)
  46. for _, pasture := range pastureList {
  47. eventCalvingList := make([]*model.EventCalving, 0)
  48. if err := e.DB.Model(new(model.EventCalving)).
  49. Where("pasture_id = ?", pasture.Id).
  50. Where("status = ?", pasturePb.IsShow_Ok).
  51. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  52. Find(&eventCalvingList).Error; err != nil {
  53. zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  54. }
  55. cowInterval := make(map[int64]int64)
  56. allInterval := int64(0)
  57. for _, v := range eventCalvingList {
  58. preEventCalving := &model.EventCalving{}
  59. if err := e.DB.Model(new(model.EventCalving)).
  60. Where("pasture_id = ?", pasture.Id).
  61. Where("cow_id = ?", v.CowId).
  62. Where("status = ?", pasturePb.IsShow_Ok).
  63. Where("reality_day < ?", v.RealityDay).
  64. Order("reality_day DESC").
  65. First(&preEventCalving).Error; err != nil {
  66. if errors.Is(err, gorm.ErrRecordNotFound) {
  67. continue
  68. } else {
  69. zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  70. }
  71. }
  72. if preEventCalving.RealityDay > 0 {
  73. interval := v.RealityDay - preEventCalving.RealityDay
  74. cowInterval[v.CowId] = interval
  75. allInterval += interval
  76. }
  77. }
  78. if len(cowInterval) > 0 {
  79. res[pasture.Id] = fmt.Sprintf("%d", int32(allInterval/int64(len(cowInterval))))
  80. }
  81. }
  82. return res
  83. }
  84. // FindOutputNumber 本月销售牛只
  85. func (e *Entry) FindOutputNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  86. res := make(map[int64]string)
  87. for _, pasture := range pastureList {
  88. var count int64
  89. if err := e.DB.Model(new(model.EventSale)).
  90. Where("pasture_id = ?", pasture.Id).
  91. Where("sale_at BETWEEN ? AND ?", startTime, endTime).
  92. Count(&count).Error; err != nil {
  93. zaplog.Error("FindOutputNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  94. }
  95. res[pasture.Id] = fmt.Sprintf("%d", count)
  96. }
  97. return res
  98. }
  99. // FindInputNumber 入栏量(购入)
  100. func (e *Entry) FindInputNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  101. res := make(map[int64]string)
  102. for _, pasture := range pastureList {
  103. var count int64
  104. if err := e.DB.Model(new(model.EventEnter)).
  105. Where("pasture_id = ?", pasture.Id).
  106. Where("cow_source = ?", pasturePb.CowSource_Buy).
  107. Where("enter_at BETWEEN ? AND ?", startTime, endTime).
  108. Count(&count).Error; err != nil {
  109. zaplog.Error("FindInputNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  110. }
  111. res[pasture.Id] = fmt.Sprintf("%d", count)
  112. }
  113. return res
  114. }
  115. // FindSalesVolume 销售额
  116. func (e *Entry) FindSalesVolume(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  117. res := make(map[int64]string)
  118. for _, pasture := range pastureList {
  119. saleAllAmount := struct {
  120. SaleAllAmount int64 `json:"sale_all_amount"`
  121. }{
  122. SaleAllAmount: 0,
  123. }
  124. if err := e.DB.Model(new(model.EventSale)).
  125. Select("SUM(sale_all_amount) as sale_all_amount").
  126. Where("pasture_id = ?", pasture.Id).
  127. Where("sale_at BETWEEN ? AND ?", startTime, endTime).
  128. First(&saleAllAmount).Error; err != nil {
  129. zaplog.Error("FindSalesVolume", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  130. }
  131. res[pasture.Id] = fmt.Sprintf("%d", saleAllAmount.SaleAllAmount)
  132. }
  133. return res
  134. }
  135. func (e *Entry) FattenCattleNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  136. res := make(map[int64]string)
  137. for _, pasture := range pastureList {
  138. var fattenCattleNumber int64
  139. if err := e.DB.Model(new(model.Cow)).
  140. Select("COUNT(id) as fatten_cattle_number").
  141. Where("pasture_id = ?", pasture.Id).
  142. Where("purpose_kind = ?", pasturePb.Purpose_Fatten).
  143. Count(&fattenCattleNumber).Error; err != nil {
  144. zaplog.Error("FindFattenCattleNumber", zap.Any("err", err), zap.Any("pasture", pasture))
  145. }
  146. }
  147. return res
  148. }
  149. // UpdatePastureIndicators 指标收集,不存在时创建,存在时更新
  150. func (e *Entry) UpdatePastureIndicators(pastureId int64, indicatorsDetails *model.IndicatorsDetails, dateTime int64, value string) {
  151. date := time.Unix(dateTime, 0).Local().Format(model.LayoutMonth)
  152. where := &model.IndicatorsData{
  153. PastureId: pastureId,
  154. Date: date,
  155. Kind: indicatorsDetails.Kind,
  156. }
  157. data := &model.IndicatorsData{
  158. PastureId: pastureId,
  159. CategoryType: indicatorsDetails.CategoryType,
  160. CategoryName: indicatorsDetails.CategoryName,
  161. Date: date,
  162. Kind: indicatorsDetails.Kind,
  163. Value: value,
  164. }
  165. var existData model.IndicatorsData
  166. if err := e.DB.Model(new(model.IndicatorsData)).
  167. Where(where).
  168. First(&existData).Error; err != nil {
  169. if errors.Is(err, gorm.ErrRecordNotFound) {
  170. if err = e.DB.Model(new(model.IndicatorsData)).Create(data).Error; err != nil {
  171. zaplog.Error("UpdatePastureIndicators", zap.Any("Create", err))
  172. }
  173. } else {
  174. zaplog.Error("UpdatePastureIndicators", zap.Any("Find", err))
  175. return
  176. }
  177. }
  178. if err := e.DB.Model(new(model.IndicatorsData)).
  179. Where("id = ?", existData.Id).
  180. Update("value", value).Error; err != nil {
  181. zaplog.Error("UpdatePastureIndicators", zap.Any("Update", err))
  182. }
  183. }