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()}
|
}
|
}
|