group.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package group
  2. import (
  3. "fmt"
  4. "sort"
  5. "time"
  6. "tmr-watch/models"
  7. "tmr-watch/module"
  8. "tmr-watch/pkg/logger/zaplog"
  9. "tmr-watch/pkg/util"
  10. "go.uber.org/zap"
  11. )
  12. // DistributeFeedFormulaService 饲料配方下发牧场端
  13. func DistributeFeedFormulaService(req *models.PastureBodyRequest) error {
  14. if len(req.Body) <= 0 {
  15. return nil
  16. }
  17. feedTemplateList := make([]*models.FeedTemplate, 0)
  18. for _, b := range req.Body {
  19. feedTemplateList = append(feedTemplateList, &models.FeedTemplate{
  20. PastureId: req.PastureId,
  21. TCode: b.EncodeNumber,
  22. TName: b.Name,
  23. TColor: b.Colour,
  24. CCid: int64(b.CattleCategoryId),
  25. CCName: b.CattleCategoryName,
  26. FTType: b.FormulaTypeName,
  27. FTTypeId: b.FormulaTypeId,
  28. Source: "集团下发",
  29. Remark: b.Remarks,
  30. Enable: 1,
  31. Version: b.Version,
  32. SaveTime: time.Now().Format("2006-01-02 15:04:05"),
  33. IsIssue: 0,
  34. IssueVersion: 0,
  35. IssueId: 0,
  36. IsModify: b.IsModify,
  37. })
  38. }
  39. return module.DistributeFeedFormula(feedTemplateList)
  40. }
  41. func FeedFormulaIsModifyService(req *models.PastureFeedFormulaIsModifyRequest) error {
  42. return module.FeedFormulaIsModify(req)
  43. }
  44. func FeedFormulaList(req *models.FeedFormulaListRequest) (*models.FeedFormulaData, error) {
  45. res := &models.FeedFormulaData{
  46. Total: 0,
  47. Page: req.Page,
  48. PageSize: req.PageSize,
  49. List: make([]*models.FeedTemplate, 0),
  50. }
  51. dataList, total, err := module.FeedTemplateList(req)
  52. if err != nil {
  53. return nil, err
  54. }
  55. res.Total = int32(total)
  56. res.List = dataList
  57. return res, nil
  58. }
  59. // AnalysisAccuracyService 首页准确率分析
  60. func AnalysisAccuracyService(req *models.AnalysisAccuracyRequest) (*models.AnalysisAccuracyResponse, error) {
  61. response := &models.AnalysisAccuracyResponse{
  62. MixedFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  63. MixedFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  64. SprinkleFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  65. SprinkleFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  66. }
  67. // 混料准确率和正确率
  68. mixedFodderDataList, err := module.MixedFodderData(req)
  69. if err != nil {
  70. return nil, err
  71. }
  72. // 撒料准确率和撒料正确率
  73. sprinkleFodderDataList, err := module.SprinkleFodderData(req)
  74. if err != nil {
  75. return nil, err
  76. }
  77. timeList := util.TimeBetween(req.StartDate, req.EndDate)
  78. for _, dayTime := range timeList {
  79. var mixedInfo, sprinkleInfo bool
  80. for _, mixed := range mixedFodderDataList {
  81. myDate := mixed.PlanTime.Format(util.LayoutDateFormat)
  82. if myDate != dayTime {
  83. continue
  84. }
  85. // 混料准确率
  86. mixedAccurateValue := &models.PastureAnalysisAccuracyDataValue{
  87. DayTime: dayTime,
  88. Ratio: mixed.MixedFodderAccurateRatio,
  89. }
  90. // 混料正确率
  91. mixedCorrectValue := &models.PastureAnalysisAccuracyDataValue{
  92. DayTime: dayTime,
  93. Ratio: mixed.MixedFodderCorrectRatio,
  94. }
  95. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, mixedAccurateValue)
  96. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, mixedCorrectValue)
  97. mixedInfo = true
  98. }
  99. if !mixedInfo {
  100. noInfo := &models.PastureAnalysisAccuracyDataValue{
  101. DayTime: dayTime,
  102. Ratio: 0,
  103. }
  104. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, noInfo)
  105. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, noInfo)
  106. }
  107. for _, sprinkle := range sprinkleFodderDataList {
  108. smyDate := sprinkle.PlanTime.Format(util.LayoutDateFormat)
  109. if smyDate != dayTime {
  110. continue
  111. }
  112. // 撒料准确率
  113. sprinkleAccurateValue := &models.PastureAnalysisAccuracyDataValue{
  114. DayTime: dayTime,
  115. Ratio: sprinkle.SprinkleFodderAccurateRatio,
  116. }
  117. // 撒料正确率
  118. sprinkleCorrectValue := &models.PastureAnalysisAccuracyDataValue{
  119. DayTime: dayTime,
  120. Ratio: sprinkle.SprinkleFodderCorrectRatio,
  121. }
  122. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, sprinkleCorrectValue)
  123. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, sprinkleAccurateValue)
  124. sprinkleInfo = true
  125. }
  126. if !sprinkleInfo {
  127. noInfo := &models.PastureAnalysisAccuracyDataValue{
  128. DayTime: dayTime,
  129. Ratio: 0,
  130. }
  131. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, noInfo)
  132. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, noInfo)
  133. }
  134. }
  135. return response, nil
  136. }
  137. // ProcessAnalysisService 过程分析-执行时间
  138. func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.ProcessAnalysisResponse, error) {
  139. response := &models.ProcessAnalysisResponse{
  140. AddFeedTime: &models.ProcessAnalysisDataValue{},
  141. SprinkleTime: &models.ProcessAnalysisDataValue{},
  142. StirTime: &models.ProcessAnalysisDataValue{},
  143. }
  144. // 获取指定时间段内tmr设备列表
  145. tmrList, err := module.TMRList(req)
  146. if err != nil {
  147. return nil, err
  148. }
  149. addFeedList := make([]int, 0)
  150. sprinkleFeedList := make([]int, 0)
  151. stirDelayList := make([]int, 0)
  152. for _, v := range tmrList {
  153. mixedProcessTimeList, err := module.MixedProcessTimeList(req.PastureId, v.Id)
  154. if err != nil {
  155. zaplog.Error("ProcessAnalysisService", zap.Any("MixedProcessTimeList", err))
  156. } else {
  157. tmrMixAllTime := 0
  158. for _, t := range mixedProcessTimeList {
  159. tmrMixAllTime += util.TimeParseToMinutes(t.ProcessTime)
  160. }
  161. addFeedList = append(addFeedList, tmrMixAllTime)
  162. }
  163. sprinkleProcessTimeList, err := module.SprinkleProcessTimeList(req.PastureId, v.Id)
  164. if err != nil {
  165. zaplog.Error("ProcessAnalysisService", zap.Any("SprinkleProcessTimeList", err))
  166. } else {
  167. tmrSprinkleAllTime := 0
  168. for _, s := range sprinkleProcessTimeList {
  169. tmrSprinkleAllTime += util.TimeParseToMinutes(s.ProcessTime)
  170. }
  171. sprinkleFeedList = append(sprinkleFeedList, tmrSprinkleAllTime)
  172. }
  173. }
  174. if len(addFeedList) > 0 {
  175. sort.Ints(addFeedList)
  176. response.AddFeedTime.MaxValue = fmt.Sprintf("%.2f", float64(addFeedList[len(addFeedList)-1])/60)
  177. response.AddFeedTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[len(addFeedList)/2+1:])/60)
  178. response.AddFeedTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList)/60)
  179. response.AddFeedTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[0:len(addFeedList)/2])/60)
  180. response.AddFeedTime.MinValue = fmt.Sprintf("%.2f", float64(addFeedList[0])/60)
  181. }
  182. if len(sprinkleFeedList) > 0 {
  183. sort.Ints(sprinkleFeedList)
  184. response.SprinkleTime.MaxValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[len(sprinkleFeedList)-1])/60)
  185. response.SprinkleTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[len(sprinkleFeedList)/2+1:])/60)
  186. response.SprinkleTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList)/60)
  187. response.SprinkleTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[0:len(sprinkleFeedList)/2])/60)
  188. response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)
  189. }
  190. if len(stirDelayList) > 0 {
  191. sort.Ints(stirDelayList)
  192. response.StirTime.MaxValue = fmt.Sprintf("%d", stirDelayList[len(stirDelayList)-1])
  193. response.StirTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[len(stirDelayList)/2+1:]))
  194. response.StirTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList))
  195. response.StirTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[0:len(stirDelayList)/2]))
  196. response.StirTime.MinValue = fmt.Sprintf("%d", stirDelayList[0])
  197. }
  198. return response, nil
  199. }
  200. // SprinkleStatisticsService 撒料统计
  201. func SprinkleStatisticsService(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {
  202. sprinkleDataList, err := module.SprinkleStatistics(req)
  203. if err != nil {
  204. return nil, err
  205. }
  206. return sprinkleDataList, nil
  207. }
  208. func AccountDistributionService(req *models.AccountDistributionRequest) error {
  209. return module.AccountDistribution(req)
  210. }
  211. func ForageCategoryDistributeService(req *models.CategoryRequest) error {
  212. feedClass := &models.FeedClass{
  213. PastureId: int64(req.PastureId),
  214. FCCode: req.Number,
  215. FCName: req.Name,
  216. Enable: req.IsShow,
  217. BigFeedClassId: req.ParentId,
  218. BigFeedClassName: req.ParentName,
  219. GroupId: int64(req.GroupId),
  220. }
  221. return module.ForageCategoryDistribute(feedClass)
  222. }
  223. func CattleCategoryDistributeService(req *models.CategoryRequest) error {
  224. cowClass := &models.CowClass{
  225. PastureId: int64(req.PastureId),
  226. ClassCode: req.Number,
  227. ClassName: req.Name,
  228. Enable: req.IsShow,
  229. ParentId: req.ParentId,
  230. ParentName: req.ParentName,
  231. GroupId: int64(req.GroupId),
  232. }
  233. return module.CattleCategoryDistribute(cowClass)
  234. }
  235. func CategoryDeleteService(keyWord string, req *models.CategoryDeleteRequest) error {
  236. switch keyWord {
  237. case "feed_delete":
  238. return module.ForageCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  239. case "cow_delete":
  240. return module.CowCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  241. }
  242. return nil
  243. }
  244. func FeedUsageService(req *models.FeedFormulaUsageRequest) (*models.FeedFormulaUsageResponse, error) {
  245. return module.FeedTemplateUsageDetail(req)
  246. }