liuxiaolong
2020-06-05 7c811247ecf143e08c576986a884bedadc57dd66
controllers/camera.go
@@ -1,37 +1,71 @@
package controllers
import (
   "basic.com/pubsub/protomsg.git"
   "encoding/json"
   "fmt"
   "strconv"
   "basic.com/valib/logger.git"
   "strings"
   "webserver/cache"
   "github.com/gin-gonic/gin"
   "basic.com/dbapi.git"
   "webserver/extend/code"
   "webserver/extend/util"
    "webserver/service"
)
type CameraController struct{}
type CameraVo struct {
   Id        string  `json:"id"`
   Name      string  `json:"name"`
   Alias     string  `json:"alias"` //摄像机的别名
   Type      int     `json:"type" `
   Addr      string  `json:"addr"`
   Areaid    string  `json:"areaid"`
   Longitude float32 `json:"longitude"`
   Latitude  float32 `json:"latitude"`
   Rtsp      string  `json:"rtsp"`
   Ip        string  `json:"ip"`
   Port      int     `json:"port"`
   Username  string  `json:"username"`
   Password  string  `json:"password"`
   Brand     string  `json:"brand"`
   Reserved  string  `json:"reserved"`
   IsRunning   bool   `json:"is_running"`    //是否正在解码
   RunEnable   bool   `json:"run_enable"`    //控制实时处理或轮询处理的开关
   RunType     int    `json:"run_type"`      //处理类型:0:轮询,1:实时
   RunServerId string `json:"run_server_id"` //当前正在处理的分析服务器id
   ResolutionWidth  int   `json:"resolution_width"`//分辨率宽
   ResolutionHeight int   `json:"resolution_height"`//分辨率高
   Sensors []SensorVo `json:"sensors"` //传感器列表
}
type Resolution struct {
   Width int `json:"width"`
   Height int `json:"height"`
}
type SensorVo struct {
   Id        string       `json:"id"`
   Name      string       `json:"name"`
   Type      int          `json:"type" `
   Addr      string       `json:"addr"`
   Areaid    uint         `json:"areaid"`
   Longitude float64      `json:"longitude"`
   Latitude  float64      `json:"latitude"`
   Rtsp      string       `json:"rtsp"`
   Ip        string       `json:"ip"`
   Port      int          `json:"port"`
   Type      string       `json:"type"`
   Ip         string       `json:"ip"`
   Port      int          `json:"port"`
   Username  string       `json:"username"`
   Password  string       `json:"password"`
   Brand     string       `json:"brand"`
   Reserved  string       `json:"reserved"`
   Password  string       `json:"password"`
   Threshold int          `json:"threshold"`
   Enable      bool          `json:"enable"`
}
// @Summary 添加摄像机
// @Description  "传入区域的id(areaid)和摄像机名字(name) 必须, 其他参数可以在摄像机配置点击保存进行添加"
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Tags camera
@@ -39,7 +73,7 @@
// @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/camera/add [post]
func (ac CameraController) CameraAdd(c *gin.Context) {
func (cc CameraController) CameraAdd(c *gin.Context) {
   var cam CameraVo
   var api dbapi.CameraApi
@@ -48,10 +82,10 @@
      util.ResponseFormat(c, code.RequestParamError, "参数错误")
      return
   }
   cam.Id = util.PseudoUuid()
   paramBody :=util.Struct2Map(cam)
   if api.CameraAdd(paramBody) {
      util.ResponseFormat(c, code.Success, cam)
   paramBody := util.Struct2Map(cam)
   b, data := api.CameraAdd(paramBody)
   if b {
      util.ResponseFormat(c, code.Success, data)
      return
   }
   util.ResponseFormat(c, code.ComError, err)
@@ -60,6 +94,7 @@
// @Summary 更新摄像机
// @Description "用于更新摄像机操作"
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Tags camera
@@ -67,17 +102,19 @@
// @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/camera/update [put]
func (ac CameraController) CameraUpdate(c *gin.Context) {
func (cc CameraController) CameraUpdate(c *gin.Context) {
   var cam CameraVo
   var api dbapi.CameraApi
   err := c.BindJSON(&cam)
   if err != nil {
      logger.Debug("err:",err)
      util.ResponseFormat(c, code.RequestParamError, "参数错误")
      return
   }
   paramBody :=util.Struct2Map(cam)
   if api.CameraAdd(paramBody) {
   logger.Debug("camera sensors:", cam.Sensors)
   paramBody := util.Struct2Map(cam)
   if api.CameraUpdate(paramBody) {
      util.ResponseFormat(c, code.Success, cam)
      return
   }
@@ -87,41 +124,86 @@
// @Summary "删除摄像机"
// @Description "根据摄像机id删除摄像机"
// @Security ApiKeyAuth
// @Produce json
// @Tags camera
// @Param cid path string true "摄像机id example: cid0"
// @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/del/{cid} [delete]
func (ac CameraController) CameraDel(c *gin.Context) {
func (cc CameraController) CameraDel(c *gin.Context) {
   var api dbapi.CameraApi
   cid := c.Param("cid")
   if api.CameraDelete(cid){
   logger.Debug("CameraDel.cid:",cid)
   if api.CameraDelete(cid) {
      util.ResponseFormat(c, code.Success, "删除成功")
      return
   }
   util.ResponseFormat(c, code.ComError,"删除失败")
   util.ResponseFormat(c, code.ComError, "删除失败")
}
// @Summary 显示摄像机
// @Description "显示摄像机"
// @Security ApiKeyAuth
// @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:"错误信息内容"}"
// @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/{cid} [get]
func (ac CameraController) CameraSel(c *gin.Context) {
func (cc CameraController) CameraSel(c *gin.Context) {
   var api dbapi.CameraApi
   cid := c.Param("cid")
   camera,err := api.GetCameraById(cid)
   if err !=nil {
      util.ResponseFormat(c,code.ComError,"查询失败")
   camera, err := api.GetCameraById(cid)
   if err != nil {
      util.ResponseFormat(c, code.ComError, "查询失败")
      return
   }
   util.ResponseFormat(c, code.Success, camera)
   //2019-11-02新增需求,显示每个摄像机的处理服务器信息,归属的节点服务器名称
   m := util.Struct2Map(camera)
   m["runServerName"] = ""
   m["resolution_width"] = camera.ResolutionWidth
   m["resolution_height"] = camera.ResolutionHeight
   //摄像机分辨率
   dRe0 := Resolution{
      Width: 0,
      Height: 0,
   }
   dRe1 := Resolution{
      Width: 1920,
      Height: 1080,
   }
   dRe2 := Resolution{
      Width: 2688,
      Height: 1520,
   }
   m["resolutions"] = []Resolution{ dRe0, dRe1, dRe2 }
   if camera.RunServerId !="" {
      localConf, e := cache.GetServerInfo()
      if e ==nil {
         if camera.RunServerId == localConf.ServerId {//归属本台服务器
            m["runServerName"] = localConf.ServerName
         } else {//属于其他服务器
            var clusterApi dbapi.ClusterApi
            b, data := clusterApi.FindCluster()
            if b && data !=nil {
               cb, _ := json.Marshal(data)
               var clu ClusterDb
               if err := json.Unmarshal(cb, &clu);err ==nil {
                  if len(clu.Nodes) >0 {
                     for _,n :=range clu.Nodes {
                        if camera.RunServerId == n.NodeId {
                           m["runServerName"] = n.NodeName
                           break
                        }
                     }
                  }
               }
            }
         }
      }
   }
   util.ResponseFormat(c, code.Success, m)
}
@@ -156,22 +238,33 @@
   return json.Marshal(test)
}
// @Security ApiKeyAuth
// @Summary 将摄像机挂到指定的目录树下
// @Description 将摄像机挂到指定的目录树下
// @Accept x-www-form-urlencoded
// @Produce json
// @Tags camera
// @Param cameraId path string true "摄像机id"
// @Param areaId path string true "目录区域id"
// @Param cameraId formData string true "摄像机id"
// @Param areaId formData 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/cameraAreaAdd [get]
func (ac CameraController) CameraAreaAdd(c *gin.Context) {
   cameraId := c.Param("cameraId")
   areaId := c.Param("areaId")
   fmt.Println(cameraId)
   fmt.Println(areaId)
// @Router /data/api-v/camera/updateCameraArea [post]
func (cc CameraController) UpdateCameraArea(c *gin.Context) {
   cameraId := c.PostForm("cameraId")
   areaId := c.PostForm("areaId")
    if cameraId == "" || areaId == "" {
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    }
    var api dbapi.CameraApi
    if api.UpdateCameraArea(cameraId, areaId) {
        util.ResponseFormat(c,code.Success,"更新成功")
    } else {
        util.ResponseFormat(c,code.ComError,"")
    }
}
// @Security ApiKeyAuth
// @Summary 删除某一个目录树下的指定摄像机
// @Description 删除某一个目录树下的指定摄像机
// @Produce json
@@ -181,9 +274,210 @@
// @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/cameraAreaDel [get]
func (ac CameraController) CameraAreaDel(c *gin.Context) {
func (cc CameraController) CameraAreaDel(c *gin.Context) {
   cameraId := c.Param("cameraId")
   areaId := c.Param("areaId")
   fmt.Println(cameraId)
   fmt.Println(areaId)
}
// @Security ApiKeyAuth
// @Summary 根据server获取所有摄像机列表及信息
// @Description 根据server获取所有摄像机列表及信息
// @Produce json
// @Tags camera
// @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/camera/getAllCamerasByServer [get]
func (cc CameraController) GetAllCamerasByServer(c *gin.Context) {
   localConf, err2 := cache.GetServerInfo()
   if err2 !=nil || localConf.ServerId == "" {
      logger.Debug("localConfig is wrong!!!")
      util.ResponseFormat(c,code.ComError,"服务器本机未配置serverId")
      return
   }
   var api dbapi.CameraApi
   cameraName := c.Query("cameraName")
   b,d := api.GetAllCamerasByServer(localConf.ServerId, cameraName)
   if b {
      util.ResponseFormat(c,code.Success, d)
   } else {
      util.ResponseFormat(c,code.ComError, "")
   }
}
// @Security ApiKeyAuth
// @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/camera/getCamerasByRunType [get]
func (cc CameraController) GetCamerasByRunType(c *gin.Context) {
   runTypeStr := c.Query("runType")
   cameraName := c.Query("cameraName")
   fmt.Println("runType:", runTypeStr)
   fmt.Println("cameraName:", cameraName)
   runType, err := strconv.Atoi(runTypeStr)
   if err != nil || (runType != 0 && runType != 1) {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   var api dbapi.CameraApi
   b, list := api.GetCamerasByRunType(runType, cameraName)
   if b {
      dataBytes, _ := json.Marshal(list)
      var cams []CameraVo
      json.Unmarshal(dataBytes, &cams)
      util.ResponseFormat(c, code.Success, cams)
   } else {
      util.ResponseFormat(c, code.ComError, err)
   }
}
// @Security ApiKeyAuth
// @Summary 切换摄像机运行实时或轮询的开关
// @Description 切换摄像机运行实时或轮询的开关
// @Accept x-www-form-urlencoded
// @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/camera/updateRunEnable [post]
func (cc CameraController) UpdateRunEnable(c *gin.Context) {
   cameraId := c.PostForm("cameraId")
   enableStr := c.PostForm("runEnable")
   runEnable, err := strconv.ParseBool(enableStr)
   if cameraId == "" || err != nil {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   var api dbapi.CameraApi
   b, data := api.UpdateRunEnable(cameraId, runEnable)
   fmt.Println("data:", data)
   if b {
      util.ResponseFormat(c, code.Success, data)
   } else {
      util.ResponseFormat(c, code.ComError, "更新失败")
   }
}
// @Security ApiKeyAuth
// @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/updateSnapshotUrl/{cid} [get]
func(cc CameraController) UpdateSnapshotUrl(c *gin.Context){
    cid := c.Param("cid")
    //filename, err := service.UpdateSnapshotUrl(cid)
    if cid == "" {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
    if strings.HasPrefix(cid, File_Video_Id_Pre) || strings.HasPrefix(cid, File_Img_Id_Pre) || strings.HasPrefix(cid, File_Audio_Id_Pre) {
      var fileApi dbapi.FileAnalysisApi
      b, d := fileApi.Show(cid)
      if b {
         var file protomsg.FileAnalysis
         bytes, _ := json.Marshal(d)
         err := json.Unmarshal(bytes, &file)
         if err == nil {
            util.ResponseFormat(c, code.Success, map[string]string{
               "cameraId": cid,
               "snapshotUrl": file.SnapshotUrl,
            })
            return
         } else {
            util.ResponseFormat(c, code.ComError, "更新失败")
            return
         }
      } else {
         util.ResponseFormat(c, code.ComError, "更新失败")
         return
      }
   }
   filename, err := service.UpdateCapture(cid)
    if err != nil {
       logger.Debug("UpdateSnapshotUrl.err:",err)
      util.ResponseFormat(c, code.ComError, "更新失败")
        return
    }
    util.ResponseFormat(c, code.Success, map[string]string{
       "cameraId": cid,
       "snapshotUrl": filename,
   })
}
type CameraChangeRunVo struct {
   CameraIds []string `json:"camera_ids"`
   RunType   int      `json:"run_type"`
}
// @Security ApiKeyAuth
// @Summary 摄像机轮询和实时状态切换
// @Description 摄像机轮询和实时状态切换
// @Produce json
// @Tags camera
// @Param changeRunBody body controllers.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/camera/changeRunType [post]
func (cc CameraController) ChangeRunType(c *gin.Context) {
   var ccrVo CameraChangeRunVo
   if err := c.BindJSON(&ccrVo); err != nil {
      util.ResponseFormat(c, code.RequestParamError, "参数有误")
      return
   }
   paramBody := util.Struct2Map(ccrVo)
   var api dbapi.CameraApi
   b, data := api.ChangeRunType(paramBody)
   if b {
      util.ResponseFormat(c, code.Success, data)
   } else {
      util.ResponseFormat(c, code.ComError, "更新失败")
   }
}
// @Security ApiKeyAuth
// @Summary 统计实时和轮询的运行路数情况
// @Description 统计实时和轮询的运行路数情况
// @Produce json
// @Tags camera
// @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/statisticRunInfo [get]
func (cc CameraController) StatisticRunInfo(c *gin.Context) {
   var api dbapi.CameraApi
   b, d := api.StatisticRunInfo()
   if b {
      util.ResponseFormat(c,code.Success,d)
   } else {
      util.ResponseFormat(c,code.ComError,"")
   }
}
/*
// @Security ApiKeyAuth
// @Summary 获取摄像机分辨率
// @Description 获取分辨率
// @Produce json
// @Tags camera
// @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/resolution/{cid} [get]
func (cc CameraController) Resolution(c *gin.Context) {
}
*/