qixiaoning
2025-07-31 1fda1e433489e43387dbd082f8aba37d136755b2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package models
 
import (
    "strings"
)
 
type AreaList []Area
func (al AreaList) Len()int {
    return len(al)
}
func (al AreaList) Swap(i,j int) {
    al[i],al[j] = al[j],al[i]
}
func (al AreaList) Less(i,j int) bool {
    return al[i].Id < al[j].Id
}
 
type CamTreeNodeList []CameraTreeNode
func (al CamTreeNodeList) Len()int {
    return len(al)
}
func (al CamTreeNodeList) Swap(i,j int) {
    al[i],al[j] = al[j],al[i]
}
func (al CamTreeNodeList) Less(i,j int) bool {
    return al[i].Id < al[j].Id
}
 
type TreeMenu struct {
    Id        string     `json:"id" `
    Type      string     `json:"type"` // 如果不是MENU,区分本地摄像机(分析和监控)以及国标摄像机
    Name      string     `json:"name"`
    IsAI      bool     `json:"isAI"` //摄像机配置有任务,则有AI图标
    Areanodes []TreeMenu `json:"children"`
    CameraType int     `json:"cameraType"`//0:本地摄像机,1:国标摄像机
    IsRunning bool     `json:"isRunning"`//是否正在解码
    Rtsp      string   `json:"rtsp"`
}
 
type TreeNode struct {
    Id       string
    Name     string
    Parentid string
}
 
 
func RecursiveArea(areas []Area, cams []CameraTreeNode, searchType int) (arr []Area){
    var areaE Area
    allAreas, _ := areaE.FindAll()
    allMap := make(map[string]Area,0)
    for _,ae :=range allAreas{
        allMap[ae.Id] = ae
    }
 
    m := make(map[string]Area,0)
 
    for _,camE :=range cams {
        if camE.Areaid !="" && camE.Areaid !="0" {
            if a,ok := allMap[camE.Areaid];ok{
                if _,f :=m[camE.Areaid];!f{
                    m[camE.Areaid] = a
                }
                pidArr := strings.Split(a.Parentids, ",")
                for _,pid :=range pidArr {
                    if pid !="" && pid !="0" {
                        if _,k :=m[pid];!k{
                            m[pid] = allMap[pid]
                        }
                    }
                }
            }
        }
    }
    for _,fArea := range areas {
        if _,ok :=m[fArea.Id];!ok{
            m[fArea.Id] = fArea
        }
        pArr := strings.Split(fArea.Parentids, ",")
        for _,id := range pArr {
            if _,ok := m[id];!ok {
                if va, in := allMap[id]; in {
                    m[id] = va
                }
            }
        }
    }
 
    for _,v := range m {
        arr = append(arr,v)
    }
 
    //if searchType == 0 {
    //    for _,fArea :=range areas {
    //        if _,ok :=m[fArea.Id];!ok{
    //            arr = append(arr,fArea)
    //        }
    //    }
    //}
 
    return arr
}