group.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package group
  2. import (
  3. "fmt"
  4. "net/http"
  5. "sort"
  6. "time"
  7. "tmr-watch/models"
  8. "tmr-watch/module"
  9. "tmr-watch/pkg/util"
  10. )
  11. // DistributeFeedFormulaService 饲料配方下发牧场端
  12. func DistributeFeedFormulaService(req *models.PastureBodyRequest) error {
  13. if len(req.Body) <= 0 {
  14. return nil
  15. }
  16. feedTemplateList := make([]*models.FeedTemplate, 0)
  17. for _, b := range req.Body {
  18. feedTemplateList = append(feedTemplateList, &models.FeedTemplate{
  19. PastureId: req.PastureId,
  20. TCode: b.EncodeNumber,
  21. TName: b.Name,
  22. TColor: b.Colour,
  23. CCid: int64(b.CattleCategoryId),
  24. CCName: b.CattleCategoryName,
  25. FTType: b.FormulaTypeName,
  26. FTTypeId: b.FormulaTypeId,
  27. Source: "集团下发",
  28. Remark: b.Remarks,
  29. Enable: 1,
  30. Version: b.Version,
  31. SaveTime: time.Now().Format("2006-01-02 15:04:05"),
  32. IsIssue: 0,
  33. IssueVersion: 0,
  34. IssueId: 0,
  35. IsModify: b.IsModify,
  36. })
  37. }
  38. return module.DistributeFeedFormula(feedTemplateList)
  39. }
  40. func FeedFormulaIsModifyService(req *models.PastureFeedFormulaIsModifyRequest) error {
  41. return module.FeedFormulaIsModify(req)
  42. }
  43. func FeedFormulaList(req *models.FeedFormulaListRequest) (*models.FeedFormulaListResponse, error) {
  44. res := &models.FeedFormulaListResponse{
  45. Code: http.StatusOK,
  46. Msg: "ok",
  47. Data: &models.FeedFormulaData{
  48. Total: 0,
  49. Page: req.Page,
  50. PageSize: req.PageSize,
  51. List: make([]*models.FeedTemplate, 0),
  52. },
  53. }
  54. dataList, total, err := module.FeedTemplateList(req)
  55. if err != nil {
  56. return nil, err
  57. }
  58. res.Data.Total = int32(total)
  59. res.Data.List = dataList
  60. return res, nil
  61. }
  62. // AnalysisAccuracyService 首页准确率分析
  63. func AnalysisAccuracyService(req *models.AnalysisAccuracyRequest) (*models.AnalysisAccuracyResponse, error) {
  64. response := &models.AnalysisAccuracyResponse{
  65. MixedFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  66. MixedFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  67. SprinkleFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  68. SprinkleFodderCorrectRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),
  69. }
  70. // 混料准确率
  71. mixedFodderDataList, err := module.MixedFodderData(req)
  72. if err != nil {
  73. return nil, err
  74. }
  75. // 撒料准确率
  76. sprinkleFodderDataList, err := module.SprinkleFodderData(req)
  77. if err != nil {
  78. return nil, err
  79. }
  80. // 混料正确率
  81. mixedFodderCorrectDataList, err := module.MixedFodderCorrectData(req)
  82. if err != nil {
  83. return nil, err
  84. }
  85. // 撒料正确率
  86. sprinkleFodderCorrectDataList, err := module.SprinkleFodderCorrectData(req)
  87. timeList := util.TimeBetween(req.StartDate, req.EndDate)
  88. for _, dayTime := range timeList {
  89. var mixedInfo, sprinkleInfo, mixedCorrectInfo, sprinkleCorrectInfo bool
  90. for _, mixed := range mixedFodderDataList {
  91. myDate := mixed.Date.Format(util.LayoutDateFormat)
  92. if myDate != dayTime {
  93. continue
  94. }
  95. // 混料准确率
  96. var mixedFodderAccurateRatio float64 = 0
  97. if mixed.Lweight > 0 && mixed.ActualWeightMinus > 0 {
  98. if mixed.Lweight > mixed.ActualWeightMinus {
  99. mixedFodderAccurateRatio = mixed.ActualWeightMinus / mixed.Lweight * 100
  100. } else {
  101. mixedFodderAccurateRatio = mixed.Lweight / mixed.ActualWeightMinus * 100
  102. }
  103. }
  104. mixedValue := &models.PastureAnalysisAccuracyDataValue{
  105. DayTime: dayTime,
  106. Ratio: mixedFodderAccurateRatio,
  107. }
  108. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, mixedValue)
  109. mixedInfo = true
  110. }
  111. if !mixedInfo {
  112. noInfo := &models.PastureAnalysisAccuracyDataValue{
  113. DayTime: dayTime,
  114. Ratio: 0,
  115. }
  116. response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, noInfo)
  117. }
  118. for _, sprinkle := range sprinkleFodderDataList {
  119. myDate := sprinkle.Date.Format(util.LayoutDateFormat)
  120. if myDate != dayTime {
  121. continue
  122. }
  123. // 撒料准确率
  124. var sprinkleFodderAccurateRatio float64 = 0
  125. if sprinkle.Lweight > 0 && sprinkle.ActualWeightMinus > 0 {
  126. if sprinkle.Lweight > sprinkle.ActualWeightMinus {
  127. sprinkleFodderAccurateRatio = sprinkle.ActualWeightMinus / sprinkle.Lweight * 100
  128. } else {
  129. sprinkleFodderAccurateRatio = sprinkle.Lweight / sprinkle.ActualWeightMinus * 100
  130. }
  131. }
  132. sprinkleValue := &models.PastureAnalysisAccuracyDataValue{
  133. DayTime: dayTime,
  134. Ratio: sprinkleFodderAccurateRatio,
  135. }
  136. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, sprinkleValue)
  137. sprinkleInfo = true
  138. }
  139. if !sprinkleInfo {
  140. noInfo := &models.PastureAnalysisAccuracyDataValue{
  141. DayTime: dayTime,
  142. Ratio: 0,
  143. }
  144. response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, noInfo)
  145. }
  146. for _, mixedFodder := range mixedFodderCorrectDataList {
  147. mixDateStr, _ := time.ParseInLocation(time.RFC3339, mixedFodder.Date, time.Local)
  148. mixDate := mixDateStr.Format("2006-01-02")
  149. if mixDate != dayTime {
  150. continue
  151. }
  152. if mixedFodder.MixedCorrectNumber == 0 || mixedFodder.UseMixedFodderOptionNumber == 0 {
  153. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  154. DayTime: dayTime,
  155. Ratio: 0,
  156. })
  157. } else {
  158. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  159. DayTime: dayTime,
  160. Ratio: float64(mixedFodder.MixedCorrectNumber) / float64(mixedFodder.UseMixedFodderOptionNumber) * 100,
  161. })
  162. }
  163. mixedCorrectInfo = true
  164. }
  165. if !mixedCorrectInfo {
  166. response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  167. DayTime: dayTime,
  168. Ratio: 0,
  169. })
  170. }
  171. for _, sprinkle := range sprinkleFodderCorrectDataList {
  172. myDateStr, _ := time.ParseInLocation(time.RFC3339, sprinkle.Date, time.Local)
  173. myDate := myDateStr.Format("2006-01-02")
  174. if myDate != dayTime {
  175. continue
  176. }
  177. if sprinkle.SprinkleCorrectNumber == 0 || sprinkle.UseSprinkleOptionNumber == 0 {
  178. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  179. DayTime: dayTime,
  180. Ratio: 0,
  181. })
  182. } else {
  183. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  184. DayTime: dayTime,
  185. Ratio: float64(sprinkle.SprinkleCorrectNumber) / float64(sprinkle.UseSprinkleOptionNumber) * 100,
  186. })
  187. }
  188. sprinkleCorrectInfo = true
  189. }
  190. if !sprinkleCorrectInfo {
  191. response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, &models.PastureAnalysisAccuracyDataValue{
  192. DayTime: dayTime,
  193. Ratio: 0,
  194. })
  195. }
  196. }
  197. return response, nil
  198. }
  199. // ProcessAnalysisService 过程分析
  200. func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.ProcessAnalysisResponse, error) {
  201. response := &models.ProcessAnalysisResponse{
  202. AddFeedTime: &models.ProcessAnalysisDataValue{},
  203. SprinkleTime: &models.ProcessAnalysisDataValue{},
  204. StirTime: &models.ProcessAnalysisDataValue{},
  205. }
  206. processDataList, err := module.ProcessAnalysisData(req)
  207. if err != nil {
  208. return nil, err
  209. }
  210. addFeedList := make([]int, 0)
  211. sprinkleFeedList := make([]int, 0)
  212. stirDelayList := make([]int, 0)
  213. for _, v := range processDataList {
  214. addFeedList = append(addFeedList, util.TimeParseToMinutes(v.ExecProcessTime))
  215. sprinkleFeedList = append(sprinkleFeedList, util.TimeParseToMinutes(v.L2ProcessTime))
  216. stirDelayList = append(stirDelayList, v.ExecStirDelay)
  217. }
  218. if len(addFeedList) > 0 {
  219. sort.Ints(addFeedList)
  220. response.AddFeedTime.MaxValue = fmt.Sprintf("%.2f", float64(addFeedList[len(addFeedList)-1])/60)
  221. response.AddFeedTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[len(addFeedList)/2+1:])/60)
  222. response.AddFeedTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList)/60)
  223. response.AddFeedTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[0:len(addFeedList)/2])/60)
  224. response.AddFeedTime.MinValue = fmt.Sprintf("%.2f", float64(addFeedList[0])/60)
  225. }
  226. if len(sprinkleFeedList) > 0 {
  227. sort.Ints(sprinkleFeedList)
  228. response.SprinkleTime.MaxValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[len(sprinkleFeedList)-1])/60)
  229. response.SprinkleTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[len(sprinkleFeedList)/2+1:])/60)
  230. response.SprinkleTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList)/60)
  231. response.SprinkleTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[0:len(sprinkleFeedList)/2])/60)
  232. response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)
  233. }
  234. if len(stirDelayList) > 0 {
  235. sort.Ints(stirDelayList)
  236. response.StirTime.MaxValue = fmt.Sprintf("%d", stirDelayList[len(stirDelayList)-1])
  237. response.StirTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[len(stirDelayList)/2+1:]))
  238. response.StirTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList))
  239. response.StirTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[0:len(stirDelayList)/2]))
  240. response.StirTime.MinValue = fmt.Sprintf("%d", stirDelayList[0])
  241. }
  242. return response, nil
  243. }
  244. // SprinkleStatisticsService 撒料统计
  245. func SprinkleStatisticsService(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {
  246. sprinkleDataList, err := module.SprinkleStatistics(req)
  247. if err != nil {
  248. return nil, err
  249. }
  250. return sprinkleDataList, nil
  251. }
  252. func AccountDistributionService(req *models.AccountDistributionRequest) error {
  253. return module.AccountDistribution(req)
  254. }
  255. func ForageCategoryDistributeService(req *models.CategoryRequest) error {
  256. feedClass := &models.FeedClass{
  257. PastureId: int64(req.PastureId),
  258. FCCode: req.Number,
  259. FCName: req.Name,
  260. Enable: req.IsShow,
  261. BigFeedClassId: req.ParentId,
  262. BigFeedClassName: req.ParentName,
  263. GroupId: int64(req.GroupId),
  264. }
  265. return module.ForageCategoryDistribute(feedClass)
  266. }
  267. func CattleCategoryDistributeService(req *models.CategoryRequest) error {
  268. cowClass := &models.CowClass{
  269. PastureId: int64(req.PastureId),
  270. ClassCode: req.Number,
  271. ClassName: req.Name,
  272. Enable: req.IsShow,
  273. ParentId: req.ParentId,
  274. ParentName: req.ParentName,
  275. GroupId: int64(req.GroupId),
  276. }
  277. return module.CattleCategoryDistribute(cowClass)
  278. }
  279. func CategoryDeleteService(keyWord string, req *models.CategoryDeleteRequest) error {
  280. switch keyWord {
  281. case "feed_delete":
  282. return module.ForageCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  283. case "cow_delete":
  284. return module.CowCategoryDelete(int64(req.PastureId), int64(req.GroupId))
  285. }
  286. return nil
  287. }