group.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package group
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "sort"
  6. "strings"
  7. "time"
  8. "tmr-watch/models"
  9. "tmr-watch/module"
  10. "tmr-watch/pkg/util"
  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. func FeedFormulaIsModifyService(req *models.PastureFeedFormulaIsModifyRequest) error {
  42. return module.FeedFormulaIsModify(req)
  43. }
  44. // AnalysisAccuracyService 首页准确率分析
  45. func AnalysisAccuracyService(req *models.AnalysisAccuracyRequest) (*models.AnalysisAccuracyResponse, error) {
  46. response := &models.AnalysisAccuracyResponse{
  47. MixedFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  48. MixedFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  49. SprinkleFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  50. SprinkleFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  51. }
  52. // 混料准确率
  53. mixedFodderDataList, err := module.MixedFodderData(req)
  54. if err != nil {
  55. return nil, err
  56. }
  57. // 撒料准确率
  58. sprinkleFodderDataList, err := module.SprinkleFodderData(req)
  59. if err != nil {
  60. return nil, err
  61. }
  62. b, _ := json.Marshal(mixedFodderDataList)
  63. fmt.Println("=======mixedFodderDataList======", string(b))
  64. c, _ := json.Marshal(sprinkleFodderDataList)
  65. fmt.Println("=======sprinkleFodderDataList======", string(c))
  66. // 混料正确率
  67. mixedFodderCorrectDataList, err := module.MixedFodderCorrectData(req)
  68. if err != nil {
  69. return nil, err
  70. }
  71. // 撒料正确率
  72. sprinkleFodderCorrectDataList, err := module.SprinkleFodderCorrectData(req)
  73. timeList := util.TimeBetween(req.StartDate, req.EndDate)
  74. for _, dayTime := range timeList {
  75. var mixedInfo, sprinkleInfo, mixedCorrectInfo, sprinkleCorrectInfo bool
  76. for _, mixed := range mixedFodderDataList {
  77. myDate := mixed.Date.Format(util.LayoutDateFormat)
  78. if myDate != dayTime {
  79. continue
  80. }
  81. // 混料准确率
  82. var mixedFodderAccurateRatio float64 = 0
  83. if mixed.Lweight > 0 && mixed.ActualWeightMinus > 0 {
  84. if mixed.Lweight > mixed.ActualWeightMinus {
  85. mixedFodderAccurateRatio = mixed.Lweight / mixed.ActualWeightMinus * 100
  86. } else {
  87. mixedFodderAccurateRatio = mixed.ActualWeightMinus / mixed.Lweight * 100
  88. }
  89. fmt.Println("===========dayTime=========", dayTime)
  90. fmt.Println("===========mixed.ActualWeightMinus=========", mixed.ActualWeightMinus)
  91. fmt.Println("===========mixed.Lweight=========", mixed.Lweight)
  92. fmt.Println("===========mixedFodderAccurateRatio=========", mixedFodderAccurateRatio)
  93. }
  94. mixedValue := &models.PastureAnalysisAccuracyDataValue{
  95. DayTime: dayTime,
  96. Ratio: mixedFodderAccurateRatio,
  97. }
  98. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, mixedValue)
  99. mixedInfo = true
  100. }
  101. if !mixedInfo {
  102. noInfo := &models.PastureAnalysisAccuracyDataValue{
  103. DayTime: dayTime,
  104. Ratio: 0,
  105. }
  106. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, noInfo)
  107. }
  108. for _, sprinkle := range sprinkleFodderDataList {
  109. myDate := sprinkle.Date.Format(util.LayoutDateFormat)
  110. if myDate != dayTime {
  111. continue
  112. }
  113. // 撒料准确率
  114. var sprinkleFodderAccurateRatio float64 = 0
  115. if sprinkle.Lweight > 0 && sprinkle.ActualWeightMinus > 0 {
  116. if sprinkle.Lweight > sprinkle.ActualWeightMinus {
  117. sprinkleFodderAccurateRatio = sprinkle.Lweight / sprinkle.ActualWeightMinus * 100
  118. } else {
  119. sprinkleFodderAccurateRatio = sprinkle.ActualWeightMinus / sprinkle.Lweight * 100
  120. }
  121. }
  122. sprinkleValue := &models.PastureAnalysisAccuracyDataValue{
  123. DayTime: dayTime,
  124. Ratio: sprinkleFodderAccurateRatio,
  125. }
  126. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, sprinkleValue)
  127. sprinkleInfo = true
  128. }
  129. if !sprinkleInfo {
  130. noInfo := &models.PastureAnalysisAccuracyDataValue{
  131. DayTime: dayTime,
  132. Ratio: 0,
  133. }
  134. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, noInfo)
  135. }
  136. for _, mixedFodder := range mixedFodderCorrectDataList {
  137. myDate := strings.ReplaceAll(mixedFodder.Date, "T00:00:00+08:00", "")
  138. if myDate != dayTime {
  139. continue
  140. }
  141. if mixedFodder.MixedCorrectNumber == 0 || mixedFodder.UseMixedFodderOptionNumber == 0 {
  142. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  143. DayTime: dayTime,
  144. Ratio: 0,
  145. })
  146. } else {
  147. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  148. DayTime: dayTime,
  149. Ratio: float64(mixedFodder.MixedCorrectNumber) / float64(mixedFodder.UseMixedFodderOptionNumber) * 100,
  150. })
  151. }
  152. mixedCorrectInfo = true
  153. }
  154. if !mixedCorrectInfo {
  155. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  156. DayTime: dayTime,
  157. Ratio: 0,
  158. })
  159. }
  160. for _, sprinkle := range sprinkleFodderCorrectDataList {
  161. myDate := strings.ReplaceAll(sprinkle.Date, "T00:00:00+08:00", "")
  162. if myDate != dayTime {
  163. continue
  164. }
  165. if sprinkle.SprinkleCorrectNumber == 0 || sprinkle.UseSprinkleOptionNumber == 0 {
  166. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  167. DayTime: dayTime,
  168. Ratio: 0,
  169. })
  170. } else {
  171. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  172. DayTime: dayTime,
  173. Ratio: float64(sprinkle.SprinkleCorrectNumber) / float64(sprinkle.UseSprinkleOptionNumber) * 100,
  174. })
  175. }
  176. sprinkleCorrectInfo = true
  177. }
  178. if !sprinkleCorrectInfo {
  179. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  180. DayTime: dayTime,
  181. Ratio: 0,
  182. })
  183. }
  184. }
  185. d, _ := json.Marshal(response)
  186. fmt.Println("=======response======", string(d))
  187. return response, nil
  188. }
  189. // ProcessAnalysisService 过程分析
  190. func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.ProcessAnalysisResponse, error) {
  191. response := &models.ProcessAnalysisResponse{
  192. AddFeedTime: &models.ProcessAnalysisDataValue{},
  193. SprinkleTime: &models.ProcessAnalysisDataValue{},
  194. StirTime: &models.ProcessAnalysisDataValue{},
  195. }
  196. processDataList, err := module.ProcessAnalysisData(req)
  197. if err != nil {
  198. return nil, err
  199. }
  200. addFeedList := make([]int, 0)
  201. sprinkleFeedList := make([]int, 0)
  202. stirDelayList := make([]int, 0)
  203. for _, v := range processDataList {
  204. addFeedList = append(addFeedList, util.TimeParseToMinutes(v.ExecProcessTime))
  205. sprinkleFeedList = append(sprinkleFeedList, util.TimeParseToMinutes(v.L2ProcessTime))
  206. stirDelayList = append(stirDelayList, v.ExecStirDelay)
  207. }
  208. if len(addFeedList) > 0 {
  209. sort.Ints(addFeedList)
  210. response.AddFeedTime.MaxValue = fmt.Sprintf("%.2f", float64(addFeedList[len(addFeedList)-1])/60)
  211. response.AddFeedTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[len(addFeedList)/2+1:])/60)
  212. response.AddFeedTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList)/60)
  213. response.AddFeedTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[0:len(addFeedList)/2])/60)
  214. response.AddFeedTime.MinValue = fmt.Sprintf("%.2f", float64(addFeedList[0])/60)
  215. }
  216. if len(sprinkleFeedList) > 0 {
  217. sort.Ints(sprinkleFeedList)
  218. response.SprinkleTime.MaxValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[len(sprinkleFeedList)-1])/60)
  219. response.SprinkleTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[len(sprinkleFeedList)/2+1:])/60)
  220. response.SprinkleTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList)/60)
  221. response.SprinkleTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[0:len(sprinkleFeedList)/2])/60)
  222. response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)
  223. }
  224. if len(stirDelayList) > 0 {
  225. sort.Ints(stirDelayList)
  226. response.StirTime.MaxValue = fmt.Sprintf("%d", stirDelayList[len(stirDelayList)-1])
  227. response.StirTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[len(stirDelayList)/2+1:]))
  228. response.StirTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList))
  229. response.StirTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[0:len(stirDelayList)/2]))
  230. response.StirTime.MinValue = fmt.Sprintf("%d", stirDelayList[0])
  231. }
  232. return response, nil
  233. }
  234. // SprinkleStatisticsService 撒料统计
  235. func SprinkleStatisticsService(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {
  236. sprinkleDataList, err := module.SprinkleStatistics(req)
  237. if err != nil {
  238. return nil, err
  239. }
  240. return sprinkleDataList, nil
  241. }
  242. func AccountDistributionService(req *models.AccountDistributionRequest) error {
  243. return module.AccountDistribution(req)
  244. }
  245. func ForageCategoryDistributeService(req *models.CategoryRequest) error {
  246. feedClass := &models.FeedClass{
  247. PastureId: int64(req.PastureId),
  248. FCCode: req.Number,
  249. FCName: req.Name,
  250. Enable: req.IsShow,
  251. BigFeedClassId: req.ParentId,
  252. BigFeedClassName: req.ParentName,
  253. GroupId: int64(req.GroupId),
  254. }
  255. return module.ForageCategoryDistribute(feedClass)
  256. }
  257. func CattleCategoryDistributeService(req *models.CategoryRequest) error {
  258. cowClass := &models.CowClass{
  259. PastureId: int64(req.PastureId),
  260. ClassCode: req.Number,
  261. ClassName: req.Name,
  262. Enable: req.IsShow,
  263. ParentId: req.ParentId,
  264. ParentName: req.ParentName,
  265. GroupId: int64(req.GroupId),
  266. }
  267. return module.CattleCategoryDistribute(cowClass)
  268. }
  269. func CategoryDeleteService(keyWord string, req *models.CategoryDeleteRequest) error {
  270. switch keyWord {
  271. case "feed_delete":
  272. return module.ForageCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  273. case "cow_delete":
  274. return module.CowCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  275. }
  276. return nil
  277. }