package controllers import ( "basic.com/pubsub/protomsg.git" "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/logger.git" "sort" "strconv" "vamicro/sync-service/models" "vamicro/sync-service/vo" "vamicro/sync-service/service" "vamicro/extend/util" ) type Gb28181Controller struct { } // @Summary 更新摄像机 // @Description "用于更新摄像机操作" // @Accept json // @Produce json // @Tags camera // @Param cam body vo.CameraEditVo true "id:摄像机id default:cid0 (string), areaid:摄像机关联区域id default:1 (int), name:摄像机名字 default:Testname(string) 必填; 其他参数可配 " // @Success 200 {string} json "{"code":200, success:true, msg:"请求处理成功", data:"修改后的摄像机信息"}" // @Failure 500 {string} json "{"code":500, success:false msg:"null",data:"错误信息内容"}" // @Router /data/api-v/gb28181/camera/update [put] func (gbc Gb28181Controller) CameraUpdate(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var camVo vo.CameraEditVo err := c.BindJSON(&camVo) if err != nil { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } logger.Debug("update sensors:", camVo.Sensors) var sv service.CameraService if sv.CameraUpdate(camVo){ sv := service.NewGb28181Service(h.Bk) sv.AddDbChangeMsg(protomsg.DbAction_Update) return &bhomeclient.Reply{ Success: true, Data: camVo.Copy2Camera()} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Summary 显示摄像机 // @Description "显示摄像机" // @Produce json // @Tags camera // @Param cid path string true "摄像机id" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}" // @Router /data/api-v/camera/show [get] func (gbc Gb28181Controller) CameraSel(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var cam models.Camera cid := c.Query("cid") rows, err := cam.SelectById(cid) if err != nil { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } if rows == 0 { return &bhomeclient.Reply{ Success: false, Msg: "没有记录"} } m := util.Struct2Map(cam) var sor models.Sensor sensors, _ := sor.FindByCameraId(cid) if sensors != nil { m["sensors"] = sensors } else { m["sensors"] = []models.Sensor{} } return &bhomeclient.Reply{ Success: true, Data: m} } // @Summary 显示gb28181树形结构 // @Description 显示gb28181树形结构 // @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/gb28181/tree [get] func (gbc Gb28181Controller) CameraGb28181Tree(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") treeType := models.TYPE_GB28181_TREE //国标树 isPlatformStr := c.Query("isPlatform") isPlatform, _ := strconv.Atoi(isPlatformStr)//单机获取本机摄像机,平台获取所有摄像机 if searchTypeStr != "" { searchType, err = strconv.Atoi(searchTypeStr) if err != nil { logger.Debug("err:",err) return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } } 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_GB28181_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) 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) //if camera.RunType == models.TYPE_RUNTYPE_POLL || camera.RunType == models.TYPE_RUNTYPE_REALTIME { // isAI = true //} } arr = append(arr,models.TreeMenu{ Id:camE.Id, Type:"4", Name:camE.Name, IsRunning: isRunnig, IsAI: isAI, Rtsp:camE.Rtsp, CameraType: treeType, }) } } return &bhomeclient.Reply{ Success: true, Data: arr } } // @Summary 刷新Gb28181平台树 // @Description 刷新Gb28181平台树 // @Produce json // @Tags menu // @Param id formData string false "国标平台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/gb28181/treeRefresh [post] func (gbc Gb28181Controller) Gb28181TreeRefresh(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ id := c.PostForm("id") sv := service.NewGb28181Service(h.Bk) if sv.RefreshById(id) { return &bhomeclient.Reply{ Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Summary 删除Gb28181平台 // @Description 删除Gb28181平台 // @Produce json // @Tags menu // @Success 200 {string} json "{"code":200, data:"",msg:"请求成功", success:true}" // @Failure 200 {string} json "{"code":500, data:"",msg:"请求失败", success:false}" // @Router /data/api-v/gb28181/treeDelete [post] func (gbc Gb28181Controller) Gb28181TreeDelete(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ var sv service.Gb28181Service if sv.Delete() { return &bhomeclient.Reply{ Success: true, Msg: "删除成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "删除失败"} } } // @Summary 获取国标区域列表 // @Description 获取国标区域列表 // @Produce json // @Tags gb28181 // @Param parentId query int true "parentId" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:"成功信息"}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:"错误信息内容"}" // @Router /data/api-v/gb28181/findAreaByParentId [get] func (gbc Gb28181Controller) FindAreaByParentId(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ parentIdStr := c.Query("parentId") if parentIdStr == "" { parentIdStr = "0" } parentId, err := strconv.Atoi(parentIdStr) if err !=nil { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } var gbaE models.GbCodeArea list, _ := gbaE.FindByParentId(parentId) if list ==nil { list = []models.GbCodeArea{} } return &bhomeclient.Reply{ Success: true, Data: list} } // @Summary 生成新的国标id // @Description 生成新的国标id // @Produce json // @Tags gb28181 // @Param code query string true "行政区域编码" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:"成功信息"}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:"错误信息内容"}" // @Router /data/api-v/gb28181/newGbId [get] func (gbc Gb28181Controller) NewGbId(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ areaCode := c.Query("code") if areaCode == "" { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } //生成新的国标id,生成规则:系统编码 =中心编码(8位) + 行业编码(2) + 类型编码(11-13位) + 序号(最后7位) //1.code为6位行政区划编码,后面需要接2位的基层接入单位编号 if len(areaCode) >=6 { areaCode = areaCode[:6] } areaCode = areaCode + "00" newGbCode := areaCode //2.行业编码,第9、10位 //00 社会治安路面接入 //01 社会治安社区接入 //02 社会治安内部接入 //03 社会治安其他接入 //04 交通路面接入 //05 交通卡口接入 //06 交通内部接入 //07 交通其他接入 //08 城市管理接入 //09 卫生环保接入 //10 商检海关接入 //11 教育部门接入 newGbCode += "01" //设备或用户的具体类型,其中的前端设备包含公安系统和非公安系统的前端设备, //终端用户包含公安系统和非公安系统的终端用户。由3位数字组成,即20位国标编码中的第11、12、13位。 //3.设备或用户的具体类型,第11、12、13位 //111 DVR编码 //112 视频服务器编码 //113 编码器编码 //114 解码器编码 //115 视频切换矩阵编码 //116 音频切换矩阵编码 //117 报警控制器编码 //118 网络视频录像机(NVR)编码 //130 混合硬盘录像机(HVR)编码 //119~130 扩展的前端主设备类型 //131 摄像机编码 //132 网络摄像机(IPC)编码 //133 显示器编码 //134 报警输入设备编码(如红外、烟感、门禁等报警设备) //135 报警输出设备编码(如警灯、警铃等设备) //136 语音输入设备编码 //137 语音输出设备 //138 移动传输设备编码 newGbCode += "112" //4. 14位为网络标识 (0、1、2、3、4为监控报警专网,5为公安信息网,6为政务网,7为Internet网, // 8为社会资源接入网,9为预留) newGbCode += "1" //5.序号指设备或用户的序号。由6位数字组成,即20位国标编码中的15-20位。 newGbCode += "000001" logger.Debug("newGbCode:", newGbCode) return &bhomeclient.Reply{ Success: true, Data: newGbCode } } // @Summary GB28181设置查询 // @Description GB28181设置信息查询 // @Accept json // @Produce json // @Tags sysset // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/gb28181/configShow [GET] func (gbc Gb28181Controller) Gb28181ConfigShow(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ var conf models.Gb28181Config conf.Select() proId := "" cityId := "" zoneId := "" if conf.PublicId != "" && len(conf.PublicId) >6 { confAreaId := conf.PublicId[:6] var tmpArea models.GbCodeArea tId,_ := strconv.Atoi(confAreaId) rows,_ := tmpArea.SelectById(tId) if rows > 0 { if tmpArea.Level == 3 { zoneId = confAreaId cityId = strconv.Itoa(tmpArea.ParentId) var cityArea models.GbCodeArea crows,_ := cityArea.SelectById(tmpArea.ParentId) if crows > 0 { proId = strconv.Itoa(cityArea.ParentId) } } else if tmpArea.Level == 2 { cityId = confAreaId proId = strconv.Itoa(tmpArea.ParentId) } else if tmpArea.Level == 1 { proId = confAreaId } } } m := util.Struct2Map(conf) m["proId"] = proId m["cityId"] = cityId m["zoneId"] = zoneId return &bhomeclient.Reply{ Success: true, Data: m } } // @Summary GB28181设置信息修改 // @Description GB28181设置修改 // @Accept json // @Produce json // @Tags sysset // @Param config body models.Gb28181Config true "GB28181设置数据" // @Success 200 {string} json "{"code":200, msg:"目录结构数据", success:true}" // @Failure 500 {string} json "{"code":500, msg:"返回错误信息", success:false}" // @Router /data/api-v/gb28181/configEdit [POST] func (gbc Gb28181Controller) Gb28181ConfigEdit(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ var reqCon models.Gb28181Config // 前台数据绑定 if err :=c.BindJSON(&reqCon);err !=nil{ return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } logger.Debug("gbConfig:",reqCon) sv := service.NewGb28181Service(h.Bk) if sv.Edit(reqCon){ return &bhomeclient.Reply{ Success: true, Msg: "保存成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "保存失败"} } } // @Summary 获取运行类型获取摄像机列表 // @Description 获取运行类型获取摄像机列表 // @Produce json // @Tags camera // @Param runType query int true "0:查轮询,1:查实时" // @Param cameraName query string false "查询条件" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}" // @Router /data/api-v/gb28181/camera/getCamerasByRunType [get] func (gbc Gb28181Controller) GetCamerasByRunType(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { runTypeStr := c.Query("runType") cameraName := c.Query("cameraName") logger.Debug("runType:",runTypeStr) logger.Debug("cameraName:",cameraName) runType, err := strconv.Atoi(runTypeStr) if err !=nil || (runType !=0 && runType !=1) { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } var sv service.CameraService list,err := sv.GetCamerasByRunType(runType,cameraName) if err !=nil { return &bhomeclient.Reply{ Success: false, Msg: err.Error() } } else { return &bhomeclient.Reply{ Success: true, Data: list} } } // @Summary 切换摄像机运行实时或轮询的开关 // @Description 切换摄像机运行实时或轮询的开关 // @Produce json // @Tags camera // @Param cameraId formData string true "摄像机id" // @Param runEnable formData bool true "开启:true,关闭:false" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}" // @Router /data/api-v/gb28181/camera/updateRunEnable [post] func (gbc Gb28181Controller) UpdateRunEnable(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ cameraId := c.PostForm("cameraId") enableStr := c.PostForm("runEnable") runEnable, _ := strconv.ParseBool(enableStr) if cameraId == "" { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } var sv service.CameraService if sv.UpdateRunEnable(cameraId, runEnable){ sv := service.NewGb28181Service(h.Bk) sv.AddDbChangeMsg(protomsg.DbAction_Update) return &bhomeclient.Reply{ Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Summary 摄像机轮询和实时状态切换 // @Description 摄像机轮询和实时状态切换 // @Produce json // @Tags camera // @Param changeRunBody body vo.CameraChangeRunVo true "参数结构体,0:实时切轮询,1:轮询切实时" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}" // @Router /data/api-v/gb28181/camera/changeRunType [post] func (gbc Gb28181Controller) ChangeRunType(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ var ccrVo vo.CameraChangeRunVo if err := c.BindJSON(&ccrVo);err !=nil{ return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } var sv service.CameraService if sv.ChangeRunType(ccrVo){ sv := service.NewGb28181Service(h.Bk) sv.AddDbChangeMsg(protomsg.DbAction_Update) return &bhomeclient.Reply{ Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Summary 摄像机is_running状态切换 // @Description 摄像机is_running状态切换 // @Produce json // @Tags camera // @Param cameraId formData string true "摄像机id" // @Param is_running formData bool true "解码中:true,停止解码:false" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}" // @Router /data/api-v/gb28181/camera/updateIsRunningState [post] func (gbc Gb28181Controller) UpdateIsRunningState(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ cameraId := c.PostForm("cameraId") isRunningStr := c.PostForm("isRunning") isRunning, _ := strconv.ParseBool(isRunningStr) if cameraId == "" { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } var sv service.CameraService if sv.UpdateIsRunningState(cameraId,isRunning){ sv := service.NewGb28181Service(h.Bk) sv.AddDbChangeMsg(protomsg.DbAction_Update) return &bhomeclient.Reply{ Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Router /data/api-v/gb28181/camera/updateIsRunningAll [post] func (gbc Gb28181Controller) UpdateIsRunningAll(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ var reqBody IsRunningArg c.BindJSON(&reqBody) logger.Debug("UpdateIsRunningAll cameraId:", reqBody.CameraIds) var sv service.CameraService if sv.UpdateIsRunningAll(reqBody.CameraIds){ sv := service.NewGb28181Service(h.Bk) sv.AddDbChangeMsg(protomsg.DbAction_Update) return &bhomeclient.Reply{ Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Summary 更新摄像机快照 // @Description 更新摄像机快照 // @Produce json // @Tags camera // @Param cameraId formData string true "摄像机id" // @Param snapshot formData string true "快照地址" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}" // @Router /data/api-v/gb28181/camera/updateSnapshot [post] func (gbc Gb28181Controller) UpdateSnapshot(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{ cameraId := c.PostForm("cameraId") snapshot := c.PostForm("snapshot") logger.Debug("cameraId:",cameraId) logger.Debug("snapshot:",snapshot) if cameraId == "" || snapshot == "" { return &bhomeclient.Reply{ Success: false, Msg: "参数有误"} } var sv service.CameraService if sv.UpdateSnapshot(cameraId, snapshot){ return &bhomeclient.Reply{ Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{ Success: false, Msg: "更新失败"} } } // @Summary 根据server获取所有摄像机列表及信息 // @Description 根据server获取所有摄像机列表及信息 // @Produce json // @Tags camera // @Param serverId query string false "查本机传serverId,查所有传空" // @Param cameraName query string false "摄像机名称" // @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}" // @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}" // @Router /data/api-v/gb28181/getAllCamerasByServer [get] func (gbc Gb28181Controller) GetAllCamerasByServer(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { serverId := c.Query("serverId") cameraName := c.Query("cameraName") var sv service.CameraService cams,err := sv.GetAllCamerasByServer(serverId,cameraName) if err == nil { return &bhomeclient.Reply{ Success: true, Data: cams} } else { return &bhomeclient.Reply{ Success: false, Msg: err.Error()} } }