qixiaoning
2025-08-22 0f97177f258c67397b206b70e5aea2b24a4868c1
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
package controllers
 
import (
    "basic.com/valib/bhomeclient.git"
    "basic.com/valib/bhomedbapi.git"
    "basic.com/valib/logger.git"
    "vamicro/sync-service/models"
    "github.com/satori/go.uuid"
    "sort"
    "strconv"
    "vamicro/extend/util"
)
 
type AreaController struct {
 
}
 
// @Summary 显示树形结构
// @Description 显示左侧所有区域和摄像机
// @Produce json
// @Tags menu
// @Param parentId query string true "区域的id"
// @Param searchType query int true "查询类型(0:全部,1:分析摄像机,2:监控摄像机, 3:联动摄像机)"
// @Param cameraName query string false "摄像机名称"
// @Success 200 {string} json "{"code":200, msg:"目录结构数据"}"
// @Failure 500 {string} json "{"code":500,  msg:"返回错误信息"}"
// @Router /data/api-v/area/localmenu [get]
func (ac AreaController) CameraTree(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
    var aram models.Area
    var searchType = 0
    var err error
 
    parentId := c.Query("parentId")
    if parentId == "" {
        parentId = "0"
    }
    searchTypeStr := c.Query("searchType")
    cameraName := c.Query("cameraName")
    isPlatformStr := c.Query("isPlatform")
    isPlatform, _ := strconv.Atoi(isPlatformStr)//单机获取本机摄像机,平台获取所有摄像机
 
    treeType := models.TYPE_LOCAL_TREE //默认是本地树
 
    if searchTypeStr != "" {
        searchType, err = strconv.Atoi(searchTypeStr)
        if err != nil {
            return &bhomeclient.Reply{ Success:false, Msg: "参数有误", Data:""}
        }
    }
 
    areas, err := aram.Find(parentId,cameraName, util.FiledbyStuct(models.TreeNode{}),treeType)
    if err != nil {
        logger.Debug("area.Find err:",err)
        return &bhomeclient.Reply{ Success: false, Msg: err.Error()}
    }
 
    var cam models.Camera
 
    cams, err := cam.Find(searchType, cameraName, models.TYPE_LOCAL_CAMERA, isPlatform)
    if err != nil {
        logger.Debug("cam.Find err:",err)
        return &bhomeclient.Reply{ Success: false, Msg: err.Error()}
    }
    var totalCams models.CamTreeNodeList
    totalCams = cams
    sort.Sort(totalCams)
    rAreas := models.RecursiveArea(areas, cams, searchType)
 
    var totalAreas models.AreaList
    totalAreas = rAreas
    sort.Sort(totalAreas)
    logger.Debug("rAreas:",rAreas)
    arr := menuFormat(totalAreas, parentId, totalCams, treeType)
    var crApi bhomedbapi.CameraRuleApi
    for _,camE := range totalCams {
        if camE.Areaid == "0" {
            isRunnig := false
            isAI := false
            camera := models.Camera{}
            rows, e := camera.SelectById(camE.Id)
 
            if rows>0 && e==nil{
                isRunnig = camera.IsRunning
                isAI = crApi.ExistRunningTask(camE.Id) && (camera.RunType == models.TYPE_RUNTYPE_POLL || camera.RunType == models.TYPE_RUNTYPE_REALTIME)
            }
            arr = append(arr,models.TreeMenu{
                Id:camE.Id,
                Type:"4",
                Name:camE.Name,
                IsAI: isAI, //是否AI摄像机
                IsRunning: isRunnig,
                Rtsp:camE.Rtsp,
                CameraType: treeType,
            })
        }
    }
    return &bhomeclient.Reply{ Success: true, Data: arr }
}
 
// 将区域和摄像机数组转换目录树形结构
func menuFormat(dbArr models.AreaList, parentId string, dbCams []models.CameraTreeNode, treeType int) []models.TreeMenu {
    var arr []models.TreeMenu
    var crApi bhomedbapi.CameraRuleApi
    for _, area := range dbArr {
        if parentId == area.Parentid {
            tmp := models.TreeMenu{}
            tmp.Id = area.Id
            tmp.Type = "MENU"
            tmp.Name = area.Name
 
            sontmp := menuFormat(dbArr, area.Id, dbCams, treeType)
            tmp.Areanodes = sontmp
 
            for _, val := range dbCams {
                if val.Areaid == area.Id {
                    camtmp := models.TreeMenu{}
                    camtmp.Id = val.Id
                    camtmp.Name = val.Name
                    camtmp.Type = "4"
                    isRunnig := false
                    isAI := false
                    camera := models.Camera{}
                    rows, e := camera.SelectById(val.Id)
                    if rows>0 && e==nil{
                        isRunnig = camera.IsRunning
                        isAI = crApi.ExistRunningTask(val.Id) && (camera.RunType == models.TYPE_RUNTYPE_POLL || camera.RunType == models.TYPE_RUNTYPE_REALTIME)
                        //if camera.RunType == models.TYPE_RUNTYPE_POLL || camera.RunType == models.TYPE_RUNTYPE_REALTIME {
                        //    isAI = true
                        //}
                    }
                    camtmp.IsAI =  isAI
                    camtmp.IsRunning = isRunnig
                    camtmp.Rtsp = val.Rtsp
                    camtmp.CameraType = treeType
                    tmp.Areanodes = append(tmp.Areanodes, camtmp)
                }
            }
            arr = append(arr, tmp)
        }
    }
    return arr
}
 
 
 
// @Summary 添加menu的区域
// @Description 添加目录上区域
// @Produce json
// @Tags menu
// @Param name formData string true "区域名字"
// @Param parentid formData string true "上一级父id"
// @Success 200 {string} json "{"code":200, data:"添加的区域信息",msg:"请求成功", success:true}"
// @Failure 200 {string} json "{"code":"错误码", data:"出错信息",msg:"请求失败", success:false}"
// @Router /data/api-v/area/add [post]
func (ac AreaController) AreaAdd(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
    var pArea models.Area
    var cArea models.Area
    name := c.PostForm("name")
    parentId := c.PostForm("parentId")
    if parentId == "" || parentId == "0" {
        cArea.Parentids = ",0,"
    } else {
        if _, err := pArea.SelectbyId(parentId); err != nil {
            return &bhomeclient.Reply{ Success:false, Msg: "参数有误"}
        }
        cArea.Parentids = pArea.Parentids + parentId+","
    }
    cArea.Id = uuid.NewV4().String()
    cArea.Name = name
    cArea.Parentid = parentId
    cArea.Type = models.TYPE_LOCAL_TREE
    if err := cArea.Insert(); err != nil {
        return &bhomeclient.Reply{ Success:false, Msg:err.Error() }
    }
    return &bhomeclient.Reply{ Success: true, Data: cArea}
}
 
// @Summary 修改名字
// @Description 修改区域名字
// @Accept  json
// @Produce json
// @Tags menu
// @Param id formData string true "区域id"
// @Param name formData string true "区域名字"
// @Param parentId formData string true "上一级父id"
// @Param alias formData string false "备注名称"
// @Success 200 {string} json "{"code":200, data:"删除的区域信息",msg:"请求成功", success:true}"
// @Failure 200 {string} json "{"code":"错误码", data:"出错信息",msg:"请求失败", success:false}"
// @Router /data/api-v/area/update [post]
func (ac AreaController) AreaUpdate(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
    var aram models.Area
 
    id := c.PostForm("id")
    if id == ""{
        return &bhomeclient.Reply{ Success: false, Msg: "参数有误"}
    }
    name := c.PostForm("name")
    parentId := c.PostForm("parentId")
    if parentId == "" {
        return &bhomeclient.Reply{ Success: false, Msg: "参数有误"}
    }
    alias := c.PostForm("alias")
    rows, err := aram.SelectbyId(id)
    if err != nil {
        return &bhomeclient.Reply{ Success: false, Msg: err.Error()}
    }
    if rows == 0 {
        return &bhomeclient.Reply{ Success: false, Msg: "没有记录"}
    }
 
    err = aram.Update(id, name, parentId, alias)
    if err != nil {
        return &bhomeclient.Reply{ Success: false, Msg: err.Error()}
    }
    return &bhomeclient.Reply{ Success: true, Data: aram}
}
 
// @Summary 删除一个区域
// @Description 点击删除按钮时删除一个区域
// @Produce json
// @Tags menu
// @Param id formData string true "当前id"
// @Success 200 {string} json "{"code":200, data:"删除的区域信息",msg:"请求成功", success:true}"
// @Failure 200 {string} json "{"code":"500", data:"出错信息",msg:"请求失败", success:false}"
// @Router /data/api-v/area/del [post]
func (ac AreaController) AreaDelete(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
    var aram models.Area
    id := c.PostForm("id")
    logger.Debug("AreaDelete id:",id)
    if id == "" {
        return &bhomeclient.Reply{ Success: false, Msg: "参数有误"}
    }
 
    rows, err := aram.SelectbyId(id)
    if err != nil {
        return &bhomeclient.Reply{ Success: false, Msg: "参数有误"}
    }
    if rows == 0 {
        return &bhomeclient.Reply{ Success: false, Msg: "没有记录"}
    }
 
    //如果存在子节点或者摄像机
    msg, ishas := aram.IsHasCnode(id)
    if ishas {
        return &bhomeclient.Reply{ Success: false, Msg: msg}
    }
 
    if err := aram.Delete(id); err != nil {
        return &bhomeclient.Reply{ Success: false, Msg: err.Error()}
    } else {
        return &bhomeclient.Reply{ Success: true, Msg: "删除成功"}
    }
}