|
@@ -0,0 +1,262 @@
|
|
|
+package service
|
|
|
+
|
|
|
+import (
|
|
|
+ "iot_manager_service/app/device/dao"
|
|
|
+ "iot_manager_service/app/operation/edge_service"
|
|
|
+ "iot_manager_service/app/operation/model"
|
|
|
+ "iot_manager_service/util/common"
|
|
|
+ "sort"
|
|
|
+)
|
|
|
+
|
|
|
+// 归属地统计
|
|
|
+var CaptureAreaService = new(captureAreaService)
|
|
|
+
|
|
|
+type captureAreaService struct{}
|
|
|
+type tmpCaptureArea struct {
|
|
|
+ Name string `json:"name"`
|
|
|
+ Value int `json:"value"`
|
|
|
+}
|
|
|
+
|
|
|
+type TypeList struct {
|
|
|
+ Name1 string `json:"name1"`
|
|
|
+ Name2 string `json:"name2"`
|
|
|
+ Name3 string `json:"name3"`
|
|
|
+ Name4 string `json:"name4"`
|
|
|
+ Name5 string `json:"name5"`
|
|
|
+ Name6 string `json:"name6"`
|
|
|
+ Name7 string `json:"name7"`
|
|
|
+ Name8 string `json:"name8"`
|
|
|
+ Name9 string `json:"name9"`
|
|
|
+ Name10 string `json:"name10"`
|
|
|
+ Value1 int `json:"value1"`
|
|
|
+ Value2 int `json:"value2"`
|
|
|
+ Value3 int `json:"value3"`
|
|
|
+ Value4 int `json:"value4"`
|
|
|
+ Value5 int `json:"value5"`
|
|
|
+ Value6 int `json:"value6"`
|
|
|
+ Value7 int `json:"value7"`
|
|
|
+ Value8 int `json:"value8"`
|
|
|
+ Value9 int `json:"value9"`
|
|
|
+ Value10 int `json:"value10"`
|
|
|
+}
|
|
|
+type tmpCaptureAreas struct {
|
|
|
+ tmpCaptureAreasData []tmpCaptureArea
|
|
|
+ CountTime string `json:"time"`
|
|
|
+ TypeList
|
|
|
+}
|
|
|
+
|
|
|
+type IntSlice []tmpCaptureArea
|
|
|
+
|
|
|
+func (p IntSlice) Len() int { return len(p) }
|
|
|
+func (p IntSlice) Less(i, j int) bool { return p[i].Value < p[j].Value }
|
|
|
+func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
|
+
|
|
|
+//得到下方前10的详细数据
|
|
|
+func (s captureAreaService) GetAreaList(tenantId int, req model.RequestCaptureFilter) (interface{}, error) {
|
|
|
+ //得到全部数据
|
|
|
+ flag, countTimes, list, forData, err := s.getData(tenantId, req)
|
|
|
+ //得到排名前10的省或城市
|
|
|
+ getTop10 := s.getTop10(forData, req.Type)
|
|
|
+ var topArr []string
|
|
|
+ for _, area := range getTop10 {
|
|
|
+ topArr = append(topArr, area.Name)
|
|
|
+ }
|
|
|
+ mdata := make(map[string][]tmpCaptureArea)
|
|
|
+ m := map[string]int{}
|
|
|
+ for _, datum := range forData {
|
|
|
+ time := datum.Time
|
|
|
+ if flag == 1 {
|
|
|
+ time += "-01"
|
|
|
+ }
|
|
|
+ name := datum.City
|
|
|
+ if req.Type == 1 {
|
|
|
+ name = datum.Province
|
|
|
+ }
|
|
|
+ m[name] = datum.Total
|
|
|
+ mm := tmpCaptureArea{
|
|
|
+ Name: name,
|
|
|
+ Value: m[name],
|
|
|
+ }
|
|
|
+ mdata[time] = append(mdata[time], mm)
|
|
|
+ }
|
|
|
+ //fmt.Printf("mdata = %v \n", mdata)
|
|
|
+ //fmt.Printf("getTop10 = %v \n", getTop10)
|
|
|
+ for _, countTime := range countTimes {
|
|
|
+ var tmpsData []tmpCaptureArea
|
|
|
+ for _, area := range getTop10 {
|
|
|
+ value := mdata[countTime]
|
|
|
+ val := 0
|
|
|
+ for _, i := range value {
|
|
|
+ if area.Name == i.Name {
|
|
|
+ val += i.Value
|
|
|
+ }
|
|
|
+ i.Value = 0
|
|
|
+ }
|
|
|
+ tmpsData = append(tmpsData, tmpCaptureArea{
|
|
|
+ Name: area.Name,
|
|
|
+ Value: val,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ list = append(list, tmpCaptureAreas{
|
|
|
+ CountTime: countTime,
|
|
|
+ tmpCaptureAreasData: tmpsData,
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
+ var list2 []tmpCaptureAreas
|
|
|
+ for _, areas := range list {
|
|
|
+ data := s.viewData(areas)
|
|
|
+ if len(data.tmpCaptureAreasData) > 0 {
|
|
|
+ list2 = append(list2, data)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return list2, nil
|
|
|
+}
|
|
|
+
|
|
|
+//得到全部数据
|
|
|
+func (s captureAreaService) getData(tenantId int, req model.RequestCaptureFilter) (int, []string, []tmpCaptureAreas, []edge_service.ForCaptureItsData, error) {
|
|
|
+ flag := 0
|
|
|
+ if req.QueryType == "month" {
|
|
|
+ flag = 1
|
|
|
+ }
|
|
|
+ unit := dao.CaptureUnit{
|
|
|
+ TenantId: tenantId,
|
|
|
+ ID: req.CaptureId,
|
|
|
+ }
|
|
|
+ unit.GetDevice()
|
|
|
+ var codes []string
|
|
|
+ codes = append(codes, unit.CaptureSn)
|
|
|
+ var countTimes []string
|
|
|
+ if flag == 1 {
|
|
|
+ countTimes = common.GetTimeMonths(req.StartTime, req.EndTime) //时间范围 月
|
|
|
+ } else {
|
|
|
+ countTimes = common.GetTimeDays(req.StartTime, req.EndTime) //时间范围 天
|
|
|
+ }
|
|
|
+ var list []tmpCaptureAreas
|
|
|
+ forCaptureIts := edge_service.ForCaptureIts{}
|
|
|
+ var forData []edge_service.ForCaptureItsData
|
|
|
+ var err error
|
|
|
+ if req.Type == 1 {
|
|
|
+ //按省
|
|
|
+ forData, err = forCaptureIts.Province(edge_service.ForCaptureItsReq{
|
|
|
+ Codes: codes,
|
|
|
+ Start: req.StartTime,
|
|
|
+ End: req.EndTime,
|
|
|
+ Flag: flag,
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ //按城市
|
|
|
+ forData, err = forCaptureIts.City(edge_service.ForCaptureItsReq{
|
|
|
+ Codes: codes,
|
|
|
+ Start: req.StartTime,
|
|
|
+ End: req.EndTime,
|
|
|
+ Flag: flag,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return flag, countTimes, list, forData, err
|
|
|
+}
|
|
|
+
|
|
|
+//渲染出10个前10的数据
|
|
|
+func (s captureAreaService) viewData(tmp tmpCaptureAreas) tmpCaptureAreas {
|
|
|
+ tmpNew := tmp
|
|
|
+ for i, datum := range tmpNew.tmpCaptureAreasData {
|
|
|
+ switch i + 1 {
|
|
|
+ case 1:
|
|
|
+ tmpNew.Name1 = datum.Name
|
|
|
+ tmpNew.Value1 = datum.Value
|
|
|
+ case 2:
|
|
|
+ tmpNew.Name2 = datum.Name
|
|
|
+ tmpNew.Value2 = datum.Value
|
|
|
+ case 3:
|
|
|
+ tmpNew.Name3 = datum.Name
|
|
|
+ tmpNew.Value3 = datum.Value
|
|
|
+ case 4:
|
|
|
+ tmpNew.Name4 = datum.Name
|
|
|
+ tmpNew.Value4 = datum.Value
|
|
|
+ case 5:
|
|
|
+ tmpNew.Name5 = datum.Name
|
|
|
+ tmpNew.Value5 = datum.Value
|
|
|
+ case 6:
|
|
|
+ tmpNew.Name6 = datum.Name
|
|
|
+ tmpNew.Value6 = datum.Value
|
|
|
+ case 7:
|
|
|
+ tmpNew.Name7 = datum.Name
|
|
|
+ tmpNew.Value7 = datum.Value
|
|
|
+ case 8:
|
|
|
+ tmpNew.Name8 = datum.Name
|
|
|
+ tmpNew.Value8 = datum.Value
|
|
|
+ case 9:
|
|
|
+ tmpNew.Name9 = datum.Name
|
|
|
+ tmpNew.Value9 = datum.Value
|
|
|
+ case 10:
|
|
|
+ tmpNew.Name10 = datum.Name
|
|
|
+ tmpNew.Value10 = datum.Value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return tmpNew
|
|
|
+}
|
|
|
+
|
|
|
+//前10的地区 和 数量
|
|
|
+func (s captureAreaService) GetAreaTypeList(tenantId int, req model.RequestCaptureFilter) (interface{}, error) {
|
|
|
+ //得到全部数据
|
|
|
+ _, _, _, forData, err := s.getData(tenantId, req)
|
|
|
+ // 得到排名前10的省或城市
|
|
|
+ getTop10 := s.getTop10(forData, req.Type)
|
|
|
+ var tmp tmpCaptureAreas
|
|
|
+ tmp.tmpCaptureAreasData = getTop10
|
|
|
+ data := s.viewData(tmp)
|
|
|
+ return data, err
|
|
|
+}
|
|
|
+
|
|
|
+//得到 前10
|
|
|
+func (s captureAreaService) getTop10(data []edge_service.ForCaptureItsData, typeInt int) PairList {
|
|
|
+ //fmt.Printf("typeInt = %v \n", typeInt)
|
|
|
+ //fmt.Printf("data = %v \n", data)
|
|
|
+ topData := make(map[string]int)
|
|
|
+ for _, datum := range data {
|
|
|
+ if typeInt == 1 {
|
|
|
+ topData[datum.Province] += datum.Total
|
|
|
+ } else {
|
|
|
+ topData[datum.City] += datum.Total
|
|
|
+ }
|
|
|
+ }
|
|
|
+ count := rankByWordCount(topData)
|
|
|
+ //fmt.Printf("count = %v \n", count)
|
|
|
+ if len(count) > 0 {
|
|
|
+ count = count[:10]
|
|
|
+ }
|
|
|
+ return count
|
|
|
+}
|
|
|
+
|
|
|
+//排序功能
|
|
|
+func rankByWordCount(wordFrequencies map[string]int) PairList {
|
|
|
+ pl := make(PairList, len(wordFrequencies))
|
|
|
+ i := 0
|
|
|
+ for k, v := range wordFrequencies {
|
|
|
+ pl[i] = tmpCaptureArea{k, v}
|
|
|
+ i++
|
|
|
+ }
|
|
|
+ //从小到大排序
|
|
|
+ //sort.Sort(pl)
|
|
|
+ //从大到小排序
|
|
|
+ sort.Sort(sort.Reverse(pl))
|
|
|
+ return pl
|
|
|
+}
|
|
|
+
|
|
|
+type PairList []tmpCaptureArea
|
|
|
+
|
|
|
+func (p PairList) Len() int { return len(p) }
|
|
|
+func (p PairList) Less(i, j int) bool { return p[i].Value < p[j].Value }
|
|
|
+func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
|
+
|
|
|
+func (c captureAreaService) IsContain(items []string, item string) bool {
|
|
|
+ for _, eachItem := range items {
|
|
|
+ if eachItem == item {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|