group.go 11 KB

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