group.go 10 KB

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