captureAreaService.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package service
  2. import (
  3. "iot_manager_service/app/device/dao"
  4. "iot_manager_service/app/operation/edge_service"
  5. "iot_manager_service/app/operation/model"
  6. "iot_manager_service/util/common"
  7. )
  8. // 归属地统计
  9. var CaptureAreaService = new(captureAreaService)
  10. type captureAreaService struct{}
  11. //得到下方前10的详细数据
  12. func (s captureAreaService) GetAreaList(tenantId int, req model.RequestCaptureFilter) (interface{}, error) {
  13. //得到全部数据
  14. flag, countTimes, forData, err := s.getData(tenantId, req)
  15. //得到排名前10的省或城市
  16. getTop10 := s.getTop10(forData, req.Type)
  17. var topArr []string
  18. for _, area := range getTop10 {
  19. topArr = append(topArr, area.Name)
  20. }
  21. mdata := make(map[string][]model.TmpCapture)
  22. for _, datum := range forData {
  23. time := datum.Time
  24. if flag == 1 {
  25. time += "-01"
  26. }
  27. name := datum.City
  28. if req.Type == 1 {
  29. name = datum.Province
  30. }
  31. mm := model.TmpCapture{
  32. Name: name,
  33. Value: datum.Total,
  34. }
  35. mdata[time] = append(mdata[time], mm)
  36. }
  37. var list []model.TmpCaptures
  38. //fmt.Printf("mdata = %v \n", mdata)
  39. //fmt.Printf("getTop10 = %v \n", getTop10)
  40. for _, countTime := range countTimes {
  41. var tmpsData []model.TmpCapture
  42. for _, area := range getTop10 {
  43. value := mdata[countTime]
  44. val := 0
  45. for _, i := range value {
  46. if area.Name == i.Name {
  47. val += i.Value
  48. }
  49. i.Value = 0
  50. }
  51. tmpsData = append(tmpsData, model.TmpCapture{
  52. Name: area.Name,
  53. Value: val,
  54. })
  55. }
  56. list = append(list, model.TmpCaptures{
  57. CountTime: countTime,
  58. TmpCapturesData: tmpsData,
  59. })
  60. }
  61. var list2 []model.TmpCaptures
  62. for _, areas := range list {
  63. data := model.ViewData(areas)
  64. if len(data.TmpCapturesData) > 0 {
  65. list2 = append(list2, data)
  66. }
  67. }
  68. if err != nil {
  69. return nil, err
  70. }
  71. return list2, nil
  72. }
  73. //前10的地区 和 数量
  74. func (s captureAreaService) GetAreaTypeList(tenantId int, req model.RequestCaptureFilter) (interface{}, error) {
  75. //得到全部数据
  76. _, _, forData, err := s.getData(tenantId, req)
  77. // 得到排名前10的省或城市
  78. getTop10 := s.getTop10(forData, req.Type)
  79. var tmp model.TmpCaptures
  80. tmp.TmpCapturesData = getTop10
  81. data := model.ViewData(tmp)
  82. return data, err
  83. }
  84. //得到全部数据
  85. func (s captureAreaService) getData(tenantId int, req model.RequestCaptureFilter) (int, []string, []edge_service.ForCaptureItsData, error) {
  86. flag := 0
  87. if req.QueryType == "month" {
  88. flag = 1
  89. }
  90. unit := dao.CaptureUnit{
  91. TenantId: tenantId,
  92. ID: req.CaptureId,
  93. }
  94. unit.GetDevice()
  95. var codes []string
  96. codes = append(codes, unit.CaptureSn)
  97. var countTimes []string
  98. if flag == 1 {
  99. countTimes = common.GetTimeMonths(req.StartTime, req.EndTime) //时间范围 月
  100. } else {
  101. countTimes = common.GetTimeDays(req.StartTime, req.EndTime) //时间范围 天
  102. }
  103. forCaptureIts := edge_service.ForCaptureIts{}
  104. var forData []edge_service.ForCaptureItsData
  105. var err error
  106. if req.Type == 1 {
  107. //按省
  108. forData, err = forCaptureIts.Province(edge_service.ForCaptureItsReq{
  109. Codes: codes,
  110. Start: req.StartTime,
  111. End: req.EndTime,
  112. Flag: flag,
  113. })
  114. } else {
  115. //按城市
  116. forData, err = forCaptureIts.City(edge_service.ForCaptureItsReq{
  117. Codes: codes,
  118. Start: req.StartTime,
  119. End: req.EndTime,
  120. Flag: flag,
  121. })
  122. }
  123. return flag, countTimes, forData, err
  124. }
  125. //得到 前10
  126. func (s captureAreaService) getTop10(data []edge_service.ForCaptureItsData, typeInt int) model.PairList {
  127. //fmt.Printf("typeInt = %v \n", typeInt)
  128. //fmt.Printf("data = %v \n", data)
  129. topData := make(map[string]int)
  130. for _, datum := range data {
  131. if typeInt == 1 {
  132. topData[datum.Province] += datum.Total
  133. } else {
  134. topData[datum.City] += datum.Total
  135. }
  136. }
  137. count := model.RankByWordCount(topData)
  138. //fmt.Printf("count = %v \n", count)
  139. if len(count) >= 10 {
  140. count = count[:10]
  141. }
  142. return count
  143. }