group.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. if len(req.Body) <= 0 {
  14. return nil
  15. }
  16. feedTemplateList := make([]*models.FeedTemplate, 0)
  17. for _, b := range req.Body {
  18. feedTemplateList = append(feedTemplateList, &models.FeedTemplate{
  19. PastureId: req.PastureId,
  20. TCode: b.EncodeNumber,
  21. TName: b.Name,
  22. TColor: b.Colour,
  23. CCid: int64(b.CattleCategoryId),
  24. CCName: b.CattleCategoryName,
  25. FTType: b.FormulaTypeName,
  26. FTTypeId: b.FormulaTypeId,
  27. Source: "集团下发",
  28. Remark: b.Remarks,
  29. Enable: 1,
  30. Version: b.Version,
  31. SaveTime: time.Now().Format("2006-01-02 15:04:05"),
  32. IsIssue: 0,
  33. IssueVersion: 0,
  34. IssueId: 0,
  35. IsModify: b.IsModify,
  36. })
  37. }
  38. return module.DistributeFeedFormula(feedTemplateList)
  39. }
  40. func FeedFormulaIsModifyService(req *models.PastureFeedFormulaIsModifyRequest) error {
  41. return module.FeedFormulaIsModify(req)
  42. }
  43. // AnalysisAccuracyService 首页准确率分析
  44. func AnalysisAccuracyService(req *models.AnalysisAccuracyRequest) (*models.AnalysisAccuracyResponse, error) {
  45. response := &models.AnalysisAccuracyResponse{
  46. MixedFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  47. MixedFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  48. SprinkleFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  49. SprinkleFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  50. }
  51. // 混料和撒料准确率
  52. mixedFodderDataList, err := module.MixedFodderData(req)
  53. if err != nil {
  54. return nil, err
  55. }
  56. // 混料正确率
  57. mixedFodderCorrectDataList, err := module.MixedFodderCorrectData(req)
  58. if err != nil {
  59. return nil, err
  60. }
  61. // 撒料正确率
  62. sprinkleFodderCorrectDataList, err := module.SprinkleFodderCorrectData(req)
  63. timeList := util.TimeBetween(req.StartDate, req.EndDate)
  64. for _, dayTime := range timeList {
  65. var mixedInfo, mixedCorrectInfo, sprinkleInfo bool
  66. for _, mixed := range mixedFodderDataList {
  67. myDate := mixed.MyDate.Format(util.LayoutDateFormat)
  68. if myDate != dayTime {
  69. continue
  70. }
  71. // 混料准确率
  72. var mixedFodderAccurateRatio float64 = 0
  73. if mixed.Lweight > 0 && mixed.Iweight > 0 {
  74. mixedFodderAccurateRatio = float64(mixed.Iweight) / mixed.Lweight * 100
  75. }
  76. mixedValue := &models.PastureAnalysisAccuracyDataValue{
  77. DayTime: dayTime,
  78. Ratio: mixedFodderAccurateRatio,
  79. }
  80. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, mixedValue)
  81. // 撒料准确率
  82. var sprinkleFodderAccurateRatio float64 = 0
  83. if mixed.Lweight > 0 && mixed.Iweight > 0 {
  84. sprinkleFodderAccurateRatio = float64(mixed.Oweight) / mixed.Lweight * 100
  85. }
  86. sprinkleValue := &models.PastureAnalysisAccuracyDataValue{
  87. DayTime: dayTime,
  88. Ratio: sprinkleFodderAccurateRatio,
  89. }
  90. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, sprinkleValue)
  91. mixedInfo = true
  92. }
  93. if !mixedInfo {
  94. noInfo := &models.PastureAnalysisAccuracyDataValue{
  95. DayTime: dayTime,
  96. Ratio: 0,
  97. }
  98. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, noInfo)
  99. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, noInfo)
  100. }
  101. for _, mixedFodder := range mixedFodderCorrectDataList {
  102. myDate := strings.ReplaceAll(mixedFodder.Date, "T00:00:00+08:00", "")
  103. if myDate != dayTime {
  104. continue
  105. }
  106. if mixedFodder.MixedCorrectNumber == 0 || mixedFodder.UseMixedFodderOptionNumber == 0 {
  107. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  108. DayTime: dayTime,
  109. Ratio: 0,
  110. })
  111. } else {
  112. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  113. DayTime: dayTime,
  114. Ratio: float64(mixedFodder.MixedCorrectNumber) / float64(mixedFodder.UseMixedFodderOptionNumber) * 100,
  115. })
  116. }
  117. mixedCorrectInfo = true
  118. }
  119. if !mixedCorrectInfo {
  120. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  121. DayTime: dayTime,
  122. Ratio: 0,
  123. })
  124. }
  125. for _, sprinkle := range sprinkleFodderCorrectDataList {
  126. myDate := strings.ReplaceAll(sprinkle.Date, "T00:00:00+08:00", "")
  127. if myDate != dayTime {
  128. continue
  129. }
  130. if sprinkle.SprinkleCorrectNumber == 0 || sprinkle.UseSprinkleOptionNumber == 0 {
  131. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  132. DayTime: dayTime,
  133. Ratio: 0,
  134. })
  135. } else {
  136. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  137. DayTime: dayTime,
  138. Ratio: float64(sprinkle.SprinkleCorrectNumber) / float64(sprinkle.UseSprinkleOptionNumber) * 100,
  139. })
  140. }
  141. sprinkleInfo = true
  142. }
  143. if !sprinkleInfo {
  144. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  145. DayTime: dayTime,
  146. Ratio: 0,
  147. })
  148. }
  149. }
  150. return response, nil
  151. }
  152. // ProcessAnalysisService 过程分析
  153. func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.ProcessAnalysisResponse, error) {
  154. response := &models.ProcessAnalysisResponse{
  155. AddFeedTime: &models.ProcessAnalysisDataValue{},
  156. SprinkleTime: &models.ProcessAnalysisDataValue{},
  157. StirTime: &models.ProcessAnalysisDataValue{},
  158. }
  159. processDataList, err := module.ProcessAnalysisData(req)
  160. if err != nil {
  161. return nil, err
  162. }
  163. addFeedList := make([]int, 0)
  164. sprinkleFeedList := make([]int, 0)
  165. stirDelayList := make([]int, 0)
  166. for _, v := range processDataList {
  167. addFeedList = append(addFeedList, util.TimeParseToMinutes(v.ExecProcessTime))
  168. sprinkleFeedList = append(sprinkleFeedList, util.TimeParseToMinutes(v.L2ProcessTime))
  169. stirDelayList = append(stirDelayList, v.ExecStirDelay)
  170. }
  171. if len(addFeedList) > 0 {
  172. sort.Ints(addFeedList)
  173. response.AddFeedTime.MaxValue = fmt.Sprintf("%.2f", float64(addFeedList[len(addFeedList)-1])/60)
  174. response.AddFeedTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[len(addFeedList)/2+1:])/60)
  175. response.AddFeedTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList)/60)
  176. response.AddFeedTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[0:len(addFeedList)/2])/60)
  177. response.AddFeedTime.MinValue = fmt.Sprintf("%.2f", float64(addFeedList[0])/60)
  178. }
  179. if len(sprinkleFeedList) > 0 {
  180. sort.Ints(sprinkleFeedList)
  181. response.SprinkleTime.MaxValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[len(sprinkleFeedList)-1])/60)
  182. response.SprinkleTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[len(sprinkleFeedList)/2+1:])/60)
  183. response.SprinkleTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList)/60)
  184. response.SprinkleTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[0:len(sprinkleFeedList)/2])/60)
  185. response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)
  186. }
  187. if len(stirDelayList) > 0 {
  188. sort.Ints(stirDelayList)
  189. response.StirTime.MaxValue = fmt.Sprintf("%d", stirDelayList[len(stirDelayList)-1])
  190. response.StirTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[len(stirDelayList)/2+1:]))
  191. response.StirTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList))
  192. response.StirTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[0:len(stirDelayList)/2]))
  193. response.StirTime.MinValue = fmt.Sprintf("%d", stirDelayList[0])
  194. }
  195. return response, nil
  196. }
  197. // SprinkleStatisticsService 撒料统计
  198. func SprinkleStatisticsService(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {
  199. sprinkleDataList, err := module.SprinkleStatistics(req)
  200. if err != nil {
  201. return nil, err
  202. }
  203. return sprinkleDataList, nil
  204. }
  205. func AccountDistributionService(req *models.AccountDistributionRequest) error {
  206. return module.AccountDistribution(req)
  207. }
  208. func ForageCategoryDistributeService(req *models.CategoryRequest) error {
  209. feedClass := &models.FeedClass{
  210. PastureId: int64(req.PastureId),
  211. FCCode: req.Number,
  212. FCName: req.Name,
  213. Enable: req.IsShow,
  214. BigFeedClassId: req.ParentId,
  215. BigFeedClassName: req.ParentName,
  216. GroupId: int64(req.GroupId),
  217. }
  218. return module.ForageCategoryDistribute(feedClass)
  219. }
  220. func CattleCategoryDistributeService(req *models.CategoryRequest) error {
  221. cowClass := &models.CowClass{
  222. PastureId: int64(req.PastureId),
  223. ClassCode: req.Number,
  224. ClassName: req.Name,
  225. Enable: req.IsShow,
  226. ParentId: req.ParentId,
  227. ParentName: req.ParentName,
  228. GroupId: int64(req.GroupId),
  229. }
  230. return module.CattleCategoryDistribute(cowClass)
  231. }
  232. func CategoryDeleteService(keyWord string, req *models.CategoryDeleteRequest) error {
  233. switch keyWord {
  234. case "feed_delete":
  235. return module.ForageCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  236. case "cow_delete":
  237. return module.CowCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  238. }
  239. return nil
  240. }