group.go 11 KB

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