group.go 10 KB

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