group.go 10 KB

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