qixiaoning
2025-09-19 724c05408de0cd74cc852e15cd2c8a0fce0be0c9
sync-service/service/cameraService.go
@@ -1,22 +1,22 @@
package service
import (
   "errors"
   "strconv"
   "vamicro/config"
   "vamicro/sync-service/models"
   "vamicro/sync-service/vo"
   "basic.com/pubsub/protomsg.git"
   "basic.com/valib/bhomedbapi.git"
   "basic.com/valib/logger.git"
   "errors"
   "github.com/satori/go.uuid"
   "strconv"
   "vamicro/sync-service/models"
   "vamicro/sync-service/vo"
   "vamicro/config"
   uuid "github.com/satori/go.uuid"
)
type CameraService struct {
}
func (sv CameraService) CameraAdd(camVo vo.CameraEditVo) (bool,models.Camera){
func (sv CameraService) CameraAdd(camVo vo.CameraEditVo) (bool, models.Camera) {
   var sysApi bhomedbapi.SysSetApi
   flag, sysconf := sysApi.GetServerInfo()
   var realMax = 16
@@ -26,16 +26,16 @@
   var err error
   tx := models.GetDB().Begin()
   defer func() {
      if err !=nil && tx !=nil {
      if err != nil && tx != nil {
         tx.Rollback()
      }
   }()
   cam := camVo.Copy2Camera()
   cam.Type = models.TYPE_LOCAL_CAMERA // 本地摄像机
   var areaE models.Area
   if camVo.AreaId !="0" {
   if camVo.AreaId != "0" {
      if _, err = areaE.SelectbyId(camVo.AreaId); err != nil {
         return false,cam
         return false, cam
      }
   }
   cam.Id = uuid.NewV4().String()
@@ -45,10 +45,10 @@
   } else {
      cam.RunType = camVo.RunType
   }
   if cam.RunType == models.TYPE_RUNTYPE_REALTIME {//实时需要判断实时数量
   if cam.RunType == models.TYPE_RUNTYPE_REALTIME { //实时需要判断实时数量
      realList, e := cam.GetCamerasByRunType(models.TYPE_RUNTYPE_REALTIME, "")
      if e !=nil || len(realList) >= realMax {
         return false,cam
      if e != nil || len(realList) >= realMax {
         return false, cam
      }
   }
@@ -56,17 +56,17 @@
   cam.Floor = models.Default_Layer
   //添加摄像机的时候不应该指定RunServerId,在哪台服务器上配了任务,RunServerId就是对应的那台服务器
   if err = tx.Table("cameras").Create(&cam).Error;err !=nil {
      return false,cam
   if err = tx.Table("cameras").Create(&cam).Error; err != nil {
      return false, cam
   }
   if err = tx.Table("camera_area").Create(&models.CameraArea{Cameraid:cam.Id,Areaid:camVo.AreaId}).Error;err !=nil{
      return false,cam
   if err = tx.Table("camera_area").Create(&models.CameraArea{Cameraid: cam.Id, Areaid: camVo.AreaId}).Error; err != nil {
      return false, cam
   }
   //处理传感器
   if len(camVo.Sensors) > 0 {
      for _,sor := range camVo.Sensors {
      for _, sor := range camVo.Sensors {
         var sorE models.Sensor
         exist := sorE.Exist(sor.Ip, sor.Port)
         sorId := ""
@@ -79,16 +79,16 @@
            }
            sorId = sor.Id
         }
         if err =tx.Exec("insert into camera_sensor(camera_id, sensor_id) select '"+cam.Id+"','"+sorId+"' where not exists (select 1 from camera_sensor where camera_id='"+cam.Id+"' and sensor_id='"+sorId+"')").Error;err !=nil {
         if err = tx.Exec("insert into camera_sensor(camera_id, sensor_id) select '" + cam.Id + "','" + sorId + "' where not exists (select 1 from camera_sensor where camera_id='" + cam.Id + "' and sensor_id='" + sorId + "')").Error; err != nil {
            return false, cam
         }
      }
   }
   tx.Commit()
   return true,cam
   return true, cam
}
func (sv CameraService) CameraUpdate(camVo vo.CameraEditVo) bool{
func (sv CameraService) CameraUpdate(camVo vo.CameraEditVo) bool {
   cam := camVo.Copy2Camera()
   var sysApi bhomedbapi.SysSetApi
   flag, sysconf := sysApi.GetServerInfo()
@@ -99,12 +99,12 @@
   var camTmp models.Camera
   rows, err := camTmp.SelectById(cam.Id)
   if err != nil || rows ==0 {
   if err != nil || rows == 0 {
      return false
   }
   cam.Floor = camTmp.Floor
   if camTmp.RunServerId == "" {//未设置过run_server_id,此种情况是国标摄像机第一次保存,会选择目标服务器的id
   if camTmp.RunServerId == "" { //未设置过run_server_id,此种情况是国标摄像机第一次保存,会选择目标服务器的id
      cam.RunServerId = config.Server.AnalyServerId //此摄像机归属到本台分析服务器
      //if cam.RunServerId == "" {
      //   return false
@@ -120,7 +120,7 @@
   if cam.RunType == models.TYPE_RUNTYPE_REALTIME {
      if camTmp.RunType != models.TYPE_RUNTYPE_REALTIME { //由非实时到实时的切换时,需要判断当前的实时数量
         realList, e := cam.GetCamerasByRunType(models.TYPE_RUNTYPE_REALTIME, "")
         if e !=nil || len(realList) >= realMax {
         if e != nil || len(realList) >= realMax {
            return false
         }
      }
@@ -133,13 +133,13 @@
   }
   if camVo.Sensors != nil && len(camVo.Sensors) > 0 {
      for _,sor :=range camVo.Sensors {
      for _, sor := range camVo.Sensors {
         var sorE models.Sensor
         exist := sorE.Exist(sor.Ip, sor.Port)
         sorId := ""
         if exist {
            sorId = sorE.Id
            if err = models.GetDB().Table(sor.TableName()).Where("id=?", sorId).Update(&sor).Error;err !=nil {
            if err = models.GetDB().Table(sor.TableName()).Where("id=?", sorId).Update(&sor).Error; err != nil {
               return false
            }
         } else {
@@ -149,7 +149,7 @@
            }
            sorId = sor.Id
         }
         if err = models.GetDB().Exec("insert into camera_sensor(camera_id, sensor_id) select '"+cam.Id+"','"+sorId+"' where not exists (select 1 from camera_sensor where camera_id='"+camVo.Id+"' and sensor_id='"+sorId+"')").Error;err !=nil {
         if err = models.GetDB().Exec("insert into camera_sensor(camera_id, sensor_id) select '" + cam.Id + "','" + sorId + "' where not exists (select 1 from camera_sensor where camera_id='" + camVo.Id + "' and sensor_id='" + sorId + "')").Error; err != nil {
            return false
         }
      }
@@ -163,16 +163,16 @@
   return true
}
func (sv CameraService) GetCamerasByRunType(runType int,cameraName string) (cams []vo.CamSensorVo,err error){
func (sv CameraService) GetCamerasByRunType(runType int, cameraName string) (cams []vo.CamSensorVo, err error) {
   //指定当前机器为过滤条件
   var cameraE models.Camera
   list, err := cameraE.GetCamerasByRunType(runType, cameraName)
   if err !=nil {
      return nil,err
   if err != nil {
      return nil, err
   }
   var crApi bhomedbapi.CameraRuleApi
   var sensorE models.Sensor
   for _,cam :=range list {//判断每一个摄像机是否有可运行的任务和规则
   for _, cam := range list { //判断每一个摄像机是否有可运行的任务和规则
      if crApi.ExistRunningTask(cam.Id) {
         sensors, _ := sensorE.FindByCameraId(cam.Id)
         var camSor vo.CamSensorVo
@@ -186,12 +186,12 @@
         cams = append(cams, camSor)
      }
   }
   return cams,nil
   return cams, nil
}
func (sv CameraService) UpdateIsRunningState(id string,isRunning bool) bool{
func (sv CameraService) UpdateIsRunningState(id string, isRunning bool) bool {
   var cameraE models.Camera
   return cameraE.UpdateIsRunningState(id,isRunning)
   return cameraE.UpdateIsRunningState(id, isRunning)
}
@@ -200,13 +200,13 @@
   return cameraE.UpdateIsRunningAll(camIds)
}
func (sv CameraService) UpdateRunEnable(cameraId string,runEnable bool) bool{
func (sv CameraService) UpdateRunEnable(cameraId string, runEnable bool) bool {
   var cameraE models.Camera
   return cameraE.UpdateRunEnable(cameraId, runEnable)
}
//1.判断本地摄像机的实时数量
//2.判断是否安装有国标,以及国标实时摄像机的数量
// 1.判断本地摄像机的实时数量
// 2.判断是否安装有国标,以及国标实时摄像机的数量
func (sv CameraService) ChangeRunType(ccrVo vo.CameraChangeRunVo) bool {
   var sysApi bhomedbapi.SysSetApi
   flag, sysconf := sysApi.GetServerInfo()
@@ -218,20 +218,20 @@
   var err error
   tx := models.GetDB().Begin()
   defer func() {
      if err !=nil && tx !=nil{
      if err != nil && tx != nil {
         tx.Rollback()
      }
   }()
   for _,cameraId :=range ccrVo.CameraIds{
   for _, cameraId := range ccrVo.CameraIds {
      var camE models.Camera
      rows, e := camE.SelectById(cameraId)
      if e == nil && rows>0 {
      if e == nil && rows > 0 {
         if ccrVo.RunType == models.TYPE_RUNTYPE_REALTIME {
            //非实时向实时切换
            if camE.RunType != models.TYPE_RUNTYPE_REALTIME {
               realList, e := camE.GetCamerasByRunType(models.TYPE_RUNTYPE_REALTIME, "")
               if e !=nil || len(realList) >= realMax {
                  err = errors.New("realTime cameras limit "+strconv.Itoa(realMax))
               if e != nil || len(realList) >= realMax {
                  err = errors.New("realTime cameras limit " + strconv.Itoa(realMax))
                  return false
               }
            } else {
@@ -239,11 +239,11 @@
            }
         }
         if camE.RunServerId == "" {
            if err = tx.Exec("update cameras set run_type=?,run_server_id=?,is_running=0 where id=?", ccrVo.RunType,config.Server.AnalyServerId, cameraId).Error;err !=nil{
            if err = tx.Exec("update cameras set run_type=?,run_server_id=?,is_running=0 where id=?", ccrVo.RunType, config.Server.AnalyServerId, cameraId).Error; err != nil {
               return false
            }
         } else {
            if err = tx.Exec("update cameras set run_type=?,is_running=0 where id=?", ccrVo.RunType, cameraId).Error;err !=nil{
            if err = tx.Exec("update cameras set run_type=?,is_running=0 where id=?", ccrVo.RunType, cameraId).Error; err != nil {
               return false
            }
         }
@@ -259,44 +259,44 @@
   return cameraE.UpdateSnapshot(cameraId, snapshot)
}
func (sv CameraService) GetAllCamerasByServer(serverId string, cameraName string) (criList []vo.CameraRunInfo,err error) {
func (sv CameraService) GetAllCamerasByServer(serverId string, cameraName string) (criList []vo.CameraRunInfo, err error) {
   var cameraE models.Camera
   list, err := cameraE.FindAllByServer(serverId, cameraName)
   if err !=nil {
      return nil,err
   if err != nil {
      return nil, err
   }
   serverName := ""
   var syssetApi bhomedbapi.SysSetApi
   fb,localConf := syssetApi.GetServerInfo()
   fb, localConf := syssetApi.GetServerInfo()
   if fb {
      serverName = localConf.ServerName
   }
   nodesMap := make(map[string]protomsg.Node)
   var clusterApi bhomedbapi.ClusterApi
   flag, cInfo := clusterApi.FindCluster()
   if flag && cInfo.Nodes != nil{
      for _,node :=range cInfo.Nodes {
   if flag && cInfo.Nodes != nil {
      for _, node := range cInfo.Nodes {
         nodesMap[node.Id] = *node
      }
   }
   var crApi bhomedbapi.CameraRuleApi
   if list !=nil && len(list) >0 {
      for _,cE :=range list {
   if list != nil && len(list) > 0 {
      for _, cE := range list {
         var cri vo.CameraRunInfo
         cri.CopyFromCamera(cE)
         if cri.RunServerId != "" {
            if cri.RunServerId == config.Server.AnalyServerId {
               cri.RunServerName = serverName
            } else {
               if ne,ok :=nodesMap[cri.RunServerId];ok {
               if ne, ok := nodesMap[cri.RunServerId]; ok {
                  cri.RunServerName = ne.NodeName
               }
            }
         }
         fb, cgs := crApi.FindAllTaskById(cE.Id)
         if fb && cgs.Rules != nil {
            for _, g :=range cgs.Rules {
            for _, g := range cgs.Rules {
               var crTask vo.CameraRunTask
               crTask.HasRule = g.Enable
@@ -306,6 +306,7 @@
         } else {
            cri.Tasks = []vo.CameraRunTask{}
         }
         //处理摄像机的状态
         if cE.RunType == models.TYPE_RUNTYPE_POLL || cE.RunType == models.TYPE_RUNTYPE_REALTIME {
            if crApi.ExistRunningTask(cE.Id) {
@@ -324,27 +325,27 @@
         criList = append(criList, cri)
      }
   }
   return criList,nil
   return criList, nil
}
//通过摄像机id获取在哪台服务器上运行
// 通过摄像机id获取在哪台服务器上运行
func GetRunServerName(cameraId string) string {
   var runServerName = ""
   var camTmp models.Camera
   rows, _ := camTmp.SelectById(cameraId)
   if rows >0 {
   if rows > 0 {
      var syssetApi bhomedbapi.SysSetApi
      fb,localConf := syssetApi.GetServerInfo()
      fb, localConf := syssetApi.GetServerInfo()
      if fb {
         if camTmp.RunServerId == localConf.ServerId {//归属本台服务器
         if camTmp.RunServerId == localConf.ServerId { //归属本台服务器
            runServerName = localConf.ServerName
         } else {//属于其他服务器
         } else { //属于其他服务器
            var clusterApi bhomedbapi.ClusterApi
            flag, cInfo := clusterApi.FindCluster()
            if flag {
               if cInfo.Nodes != nil {
                  for _,n := range cInfo.Nodes {
                  for _, n := range cInfo.Nodes {
                     if n.Id == camTmp.RunServerId {
                        runServerName = n.NodeName
                        break
@@ -357,4 +358,4 @@
   }
   return runServerName
}
}