group.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package group
  2. import (
  3. "fmt"
  4. "sort"
  5. "strings"
  6. "time"
  7. "tmr-watch/http/handle/restful"
  8. "tmr-watch/models"
  9. "tmr-watch/module"
  10. "tmr-watch/pkg/util"
  11. )
  12. // DistributeFeedFormulaService 饲料配方下发牧场端
  13. func DistributeFeedFormulaService(req *models.PastureBodyRequest) error {
  14. feedTemplateList := make([]*models.FeedTemplate, len(req.Body))
  15. for i, b := range req.Body {
  16. feedTemplateList[i] = &models.FeedTemplate{
  17. PastureId: req.PastureId,
  18. TCode: b.EncodeNumber,
  19. TName: b.Name,
  20. TColor: b.Colour,
  21. CCid: int64(b.CattleCategoryId),
  22. CCName: b.CattleCategoryName,
  23. FTType: "",
  24. Source: "",
  25. Remark: b.Remarks,
  26. Enable: 1,
  27. Weight: 0,
  28. DryWeight: 0,
  29. Version: b.Version,
  30. SaveTime: time.Now().Format("2006-01-02 15:04:05"),
  31. IsIssue: 0,
  32. IssueVersion: 0,
  33. IssueId: 0,
  34. }
  35. }
  36. if _, err := restful.Engine.Insert(feedTemplateList); err != nil {
  37. return err
  38. }
  39. return nil
  40. }
  41. // AnalysisAccuracyService 首页准确率分析
  42. func AnalysisAccuracyService(req *models.AnalysisAccuracyRequest) (*models.AnalysisAccuracyResponse, error) {
  43. response := &models.AnalysisAccuracyResponse{
  44. MixedFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  45. MixedFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  46. SprinkleFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  47. SprinkleFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  48. }
  49. // 混料和撒料准确率
  50. mixedFodderDataList, err := module.MixedFodderData(req)
  51. if err != nil {
  52. return nil, err
  53. }
  54. // 混料正确率
  55. mixedFodderCorrectDataList, err := module.MixedFodderCorrectData(req)
  56. if err != nil {
  57. return nil, err
  58. }
  59. // 撒料正确率
  60. sprinkleFodderCorrectDataList, err := module.SprinkleFodderCorrectData(req)
  61. timeList := util.TimeBetween(req.StartDate, req.EndDate)
  62. for _, dayTime := range timeList {
  63. var mixedInfo, mixedCorrectInfo, sprinkleInfo bool
  64. for _, mixed := range mixedFodderDataList {
  65. myDate := mixed.MyDate.Format(util.LayoutDateFormat)
  66. if myDate != dayTime {
  67. continue
  68. }
  69. // 混料准确率
  70. var mixedFodderAccurateRatio float64 = 0
  71. if mixed.Lweight > 0 && mixed.Iweight > 0 {
  72. mixedFodderAccurateRatio = float64(mixed.Iweight) / mixed.Lweight * 100
  73. }
  74. mixedValue := &models.PastureAnalysisAccuracyDataValue{
  75. DayTime: dayTime,
  76. Ratio: mixedFodderAccurateRatio,
  77. }
  78. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, mixedValue)
  79. // 撒料准确率
  80. var sprinkleFodderAccurateRatio float64 = 0
  81. if mixed.Lweight > 0 && mixed.Iweight > 0 {
  82. sprinkleFodderAccurateRatio = float64(mixed.Oweight) / mixed.Lweight * 100
  83. }
  84. sprinkleValue := &models.PastureAnalysisAccuracyDataValue{
  85. DayTime: dayTime,
  86. Ratio: sprinkleFodderAccurateRatio,
  87. }
  88. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, sprinkleValue)
  89. mixedInfo = true
  90. }
  91. if !mixedInfo {
  92. noInfo := &models.PastureAnalysisAccuracyDataValue{
  93. DayTime: dayTime,
  94. Ratio: 0,
  95. }
  96. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, noInfo)
  97. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, noInfo)
  98. }
  99. for _, mixedFodder := range mixedFodderCorrectDataList {
  100. myDate := strings.ReplaceAll(mixedFodder.Date, "T00:00:00+08:00", "")
  101. if myDate != dayTime {
  102. continue
  103. }
  104. if mixedFodder.MixedCorrectNumber == 0 || mixedFodder.UseMixedFodderOptionNumber == 0 {
  105. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  106. DayTime: dayTime,
  107. Ratio: 0,
  108. })
  109. } else {
  110. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  111. DayTime: dayTime,
  112. Ratio: float64(mixedFodder.MixedCorrectNumber) / float64(mixedFodder.UseMixedFodderOptionNumber) * 100,
  113. })
  114. }
  115. mixedCorrectInfo = true
  116. }
  117. if !mixedCorrectInfo {
  118. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  119. DayTime: dayTime,
  120. Ratio: 0,
  121. })
  122. }
  123. for _, sprinkle := range sprinkleFodderCorrectDataList {
  124. myDate := strings.ReplaceAll(sprinkle.Date, "T00:00:00+08:00", "")
  125. if myDate != dayTime {
  126. continue
  127. }
  128. if sprinkle.SprinkleCorrectNumber == 0 || sprinkle.UseSprinkleOptionNumber == 0 {
  129. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  130. DayTime: dayTime,
  131. Ratio: 0,
  132. })
  133. } else {
  134. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  135. DayTime: dayTime,
  136. Ratio: float64(sprinkle.SprinkleCorrectNumber) / float64(sprinkle.UseSprinkleOptionNumber) * 100,
  137. })
  138. }
  139. sprinkleInfo = true
  140. }
  141. if !sprinkleInfo {
  142. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  143. DayTime: dayTime,
  144. Ratio: 0,
  145. })
  146. }
  147. }
  148. return response, nil
  149. }
  150. // ProcessAnalysisService 过程分析
  151. func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.ProcessAnalysisResponse, error) {
  152. response := &models.ProcessAnalysisResponse{
  153. AddFeedTime: &models.ProcessAnalysisDataValue{},
  154. SprinkleTime: &models.ProcessAnalysisDataValue{},
  155. StirTime: &models.ProcessAnalysisDataValue{},
  156. }
  157. processDataList, err := module.ProcessAnalysisData(req)
  158. if err != nil {
  159. return nil, err
  160. }
  161. addFeedList := make([]int, 0)
  162. sprinkleFeedList := make([]int, 0)
  163. for _, v := range processDataList {
  164. addFeedList = append(addFeedList, util.TimeParseToMinutes(v.ExecProcessTime))
  165. sprinkleFeedList = append(sprinkleFeedList, util.TimeParseToMinutes(v.L2ProcessTime))
  166. }
  167. if len(addFeedList) > 0 {
  168. sort.Ints(addFeedList)
  169. response.AddFeedTime.MaxValue = fmt.Sprintf("%.2f", float64(addFeedList[len(addFeedList)-1])/60)
  170. response.AddFeedTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[len(addFeedList)/2+1:])/60)
  171. response.AddFeedTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList)/60)
  172. response.AddFeedTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[0:len(addFeedList)/2])/60)
  173. response.AddFeedTime.MinValue = fmt.Sprintf("%.2f", float64(addFeedList[0])/60)
  174. }
  175. if len(sprinkleFeedList) > 0 {
  176. sort.Ints(sprinkleFeedList)
  177. response.SprinkleTime.MaxValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[len(sprinkleFeedList)-1])/60)
  178. response.SprinkleTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[len(sprinkleFeedList)/2+1:])/60)
  179. response.SprinkleTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList)/60)
  180. response.SprinkleTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[0:len(sprinkleFeedList)/2])/60)
  181. response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)
  182. }
  183. return response, nil
  184. }