group.go 8.1 KB

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