qixiaoning
2025-07-22 550492cb85ea7e01831939f2866259193378f2f7
sync-service/models/camera.go
@@ -1,97 +1,104 @@
package models
import (
   "basic.com/valib/logger.git"
   "fmt"
   "strconv"
   "strings"
   "vamicro/config"
   "basic.com/valib/logger.git"
)
const (
   Default_Layer = -9999 //摄像机添加进来的默认楼层
   TYPE_LOCAL_CAMERA = 0 //本地摄像机
   TYPE_GB28181_CAMERA = 1 //国标摄像机
   Default_Layer       = -9999 //摄像机添加进来的默认楼层
   TYPE_LOCAL_CAMERA   = 0     //本地摄像机
   TYPE_GB28181_CAMERA = 1     //国标摄像机
   TYPE_RUNTYPE_VIDEO = -1 //单纯的监控,不做分析
   TYPE_RUNTYPE_POLL = 0 //轮询做任务
   TYPE_RUNTYPE_REALTIME = 1 //实时做任务
   TYPE_RUNTYPE_VIDEO    = -1 //单纯的监控,不做分析
   TYPE_RUNTYPE_POLL     = 0  //轮询做任务
   TYPE_RUNTYPE_REALTIME = 1  //实时做任务
   Camera_Status_NoRule = 0  //未配规则
   Camera_Status_Wait = 1  //等待处理
   Camera_Status_Doing = 2  //处理中
   Camera_Status_Other = -1 //其他情况
   Camera_Status_Wait   = 1  //等待处理
   Camera_Status_Doing  = 2  //处理中
   Camera_Status_Other  = -1 //其他情况
)
// 智查任务
type Task struct {
   TaskId   int64  `db:"task_id" json:"taskId"`
   TaskName string `db:"task_name" json:"taskName"`
}
type Camera struct {
   Id                 string          `gorm:"primary_key;column:id;type:varchar(100);unique;" json:"id"`
   Name               string          `gorm:"column:name" json:"name"  bind:"required"`
   Alias              string             `gorm:"column:alias" json:"alias"` //摄像机的别名
   SnapshotUrl       string           `gorm:"column:snapshot_url" json:"snapshot_url"`//快照地址
   Type               int             `gorm:"column:type" json:"type" `
   Addr               string          `gorm:"column:addr" json:"addr"`
   Longitude          float32         `gorm:"column:longitude" json:"longitude"`
   Latitude           float32         `gorm:"column:latitude" json:"latitude"`
   Floor              int               `gorm:"column:floor" json:"floor"`//楼层
   Rtsp               string          `gorm:"column:rtsp" json:"rtsp"`
   Ip                 string          `gorm:"column:ip" json:"ip"`
   Port               int             `gorm:"column:port" json:"port"`
   Username           string          `gorm:"column:username" json:"username"`
   Password           string          `gorm:"column:password" json:"password"`
   Brand              string          `gorm:"column:brand" json:"brand"`
   Reserved           string          `gorm:"column:reserved" json:"reserved"`
   IsRunning          bool             `gorm:"column:is_running" json:"is_running"`//是否正在解码
   RunEnable          bool             `gorm:"column:run_enable" json:"run_enable"`//控制实时处理或轮询处理的开关
   RunType            int             `gorm:"column:run_type" json:"run_type"`//处理类型:0:轮询,1:实时,-1:无任务,不做分析或者分析任务被关了
   RunServerId       string             `gorm:"column:run_server_id" json:"run_server_id"`//当前正在处理的分析服务器id
   Id          string  `gorm:"primary_key;column:id;type:varchar(100);unique;" json:"id"`
   Name        string  `gorm:"column:name" json:"name"  bind:"required"`
   Alias       string  `gorm:"column:alias" json:"alias"`               //摄像机的别名
   SnapshotUrl string  `gorm:"column:snapshot_url" json:"snapshot_url"` //快照地址
   Type        int     `gorm:"column:type" json:"type" `
   Addr        string  `gorm:"column:addr" json:"addr"`
   Longitude   float32 `gorm:"column:longitude" json:"longitude"`
   Latitude    float32 `gorm:"column:latitude" json:"latitude"`
   Floor       int     `gorm:"column:floor" json:"floor"` //楼层
   Rtsp        string  `gorm:"column:rtsp" json:"rtsp"`
   Ip          string  `gorm:"column:ip" json:"ip"`
   Port        int     `gorm:"column:port" json:"port"`
   Username    string  `gorm:"column:username" json:"username"`
   Password    string  `gorm:"column:password" json:"password"`
   Brand       string  `gorm:"column:brand" json:"brand"`
   Reserved    string  `gorm:"column:reserved" json:"reserved"`
   IsRunning   bool    `gorm:"column:is_running" json:"is_running"`       //是否正在解码
   RunEnable   bool    `gorm:"column:run_enable" json:"run_enable"`       //控制实时处理或轮询处理的开关
   RunType     int     `gorm:"column:run_type" json:"run_type"`           //处理类型:0:轮询,1:实时,-1:无任务,不做分析或者分析任务被关了
   RunServerId string  `gorm:"column:run_server_id" json:"run_server_id"` //当前正在处理的分析服务器id
   ResolutionWidth     int            `gorm:"column:resolution_width;default:0" json:"resolution_width"`//分辨率宽
   ResolutionHeight    int            `gorm:"column:resolution_height;default:0" json:"resolution_height"`//分辨率高
   ResolutionWidth  int `gorm:"column:resolution_width;default:0" json:"resolution_width"`   //分辨率宽
   ResolutionHeight int `gorm:"column:resolution_height;default:0" json:"resolution_height"` //分辨率高
   VoiceEnable       bool             `gorm:"column:voiceEnable;default:0" json:"voiceEnable"`
   VoiceId          string             `gorm:"column:voiceId" json:"voiceId"`
   VoiceEnable bool   `gorm:"column:voiceEnable;default:0" json:"voiceEnable"`
   VoiceId     string `gorm:"column:voiceId" json:"voiceId"`
}
type CameraTreeNode struct {
   Id     string `json:"id"`
   Areaid string   `json:"areaid"`
   Name   string `json:"name"`
   CameraType int `json:"cameratype"`//是本地还是国标
   Rtsp   string `json:"rtsp"`
   Id         string `json:"id"`
   Areaid     string `json:"areaid"`
   Name       string `json:"name"`
   CameraType int    `json:"cameratype"` //是本地还是国标
   Rtsp       string `json:"rtsp"`
}
func (camera *Camera) GetIdNameMap() (map[string]string) {
   cameraEMap :=make(map[string]string,0)
func (camera *Camera) GetIdNameMap() map[string]string {
   cameraEMap := make(map[string]string, 0)
   allCams, err := camera.FindAll()
   if err ==nil && allCams !=nil && len(allCams) >0 {
      for _,model :=range allCams {
         cameraEMap[model.Id]=model.Name
   if err == nil && allCams != nil && len(allCams) > 0 {
      for _, model := range allCams {
         cameraEMap[model.Id] = model.Name
      }
   }
   return cameraEMap
}
//cameraType (0:查全部,1:分析摄像机,2:监控摄像机)
//cameraName
// cameraType (0:查全部,1:分析摄像机,2:监控摄像机)
// cameraName
func (camera *Camera) Find(cameraType int, cameraName string, camType int, isPlatform int) (camMenus []CameraTreeNode, err error) {
   logger.Debug("camType:",camType)
   logger.Debug("camType:", camType)
   cType := strconv.Itoa(camType)
   var sql = "select c.id,ca.areaid as areaid,case ifnull(c.alias,'') when '' then c.name else c.alias end as name,c.type as cameratype,c.rtsp from camera_area ca join cameras c on ca.cameraid=c.id where c.type="+cType+""
   var sql = "select c.id,ca.areaid as areaid,case ifnull(c.alias,'') when '' then c.name else c.alias end as name,c.type as cameratype,c.rtsp from camera_area ca join cameras c on ca.cameraid=c.id where c.type=" + cType + ""
   if cameraName != "" {
      sql += " and c.name like '%" + cameraName + "%'"
   }
   if cameraType == 1 { //查分析摄像机
      sql += " and (c.run_type="+strconv.Itoa(TYPE_RUNTYPE_POLL)+" or c.run_type="+strconv.Itoa(TYPE_RUNTYPE_REALTIME)+")"
      sql += " and (c.run_type=" + strconv.Itoa(TYPE_RUNTYPE_POLL) + " or c.run_type=" + strconv.Itoa(TYPE_RUNTYPE_REALTIME) + ")"
   } else if cameraType == 2 { //查监控摄像机
      sql += " and c.run_type="+strconv.Itoa(TYPE_RUNTYPE_VIDEO)+""
      sql += " and c.run_type=" + strconv.Itoa(TYPE_RUNTYPE_VIDEO) + ""
   } else if cameraType == 3 { //查联动摄像机
      sql += " and c.id in (select crga.camera_id from camera_rule_group_arg crga join camera_task_link ctl on crga.group_id=ctl.link_task_id)"
   }
   if camType == TYPE_LOCAL_CAMERA {//国标的始终显示整棵树,本地树本机查本机,平台查所有
      if isPlatform == 0 {//查本机
         sql += " and c.run_server_id='"+config.Server.AnalyServerId+"'"
   if camType == TYPE_LOCAL_CAMERA { //国标的始终显示整棵树,本地树本机查本机,平台查所有
      if isPlatform == 0 { //查本机
         sql += " and c.run_server_id='" + config.Server.AnalyServerId + "'"
      }
   }
@@ -103,31 +110,31 @@
   return camMenus, nil
}
func (cam *Camera) FindAllByServer(serverId string,cameraName string)(list []Camera,err error) {
func (cam *Camera) FindAllByServer(serverId string, cameraName string) (list []Camera, err error) {
   var sql = "select * from cameras where 1=1 "
   if serverId != "" {
      sql += " and (run_server_id='"+serverId+"' or (run_server_id ='' or run_server_id is NULL))"
      sql += " and (run_server_id='" + serverId + "' or (run_server_id ='' or run_server_id is NULL))"
   }
   if cameraName != "" {
      sql += " and name like '%"+cameraName+"%'"
      sql += " and name like '%" + cameraName + "%'"
   }
   if err := db.Raw(sql).Scan(&list).Error;err !=nil{
      return nil,err
   if err := db.Raw(sql).Scan(&list).Error; err != nil {
      return nil, err
   }
   return list,nil
   return list, nil
}
func (camera *Camera) GetCamerasByRunType(runType int,cameraName string) (list []Camera,err error) {
   analyServerId := config.Server.AnalyServerId//当前分析服务器的id(analyServerId,在配置文件中)
func (camera *Camera) GetCamerasByRunType(runType int, cameraName string) (list []Camera, err error) {
   analyServerId := config.Server.AnalyServerId //当前分析服务器的id(analyServerId,在配置文件中)
   sql := "select * from cameras where run_type=? and run_server_id=? "
   if cameraName !=""{
      sql = sql+" and name like ?"
   if cameraName != "" {
      sql = sql + " and name like ?"
   }
   if err := db.Raw(sql,runType,analyServerId,"%"+cameraName+"%").Scan(&list).Error;err !=nil{
      return nil,err
   if err := db.Raw(sql, runType, analyServerId, "%"+cameraName+"%").Scan(&list).Error; err != nil {
      return nil, err
   }
   return list,nil
   return list, nil
}
func (camera *Camera) Insert() (err error) {
@@ -164,10 +171,10 @@
}
func (camera *Camera) FindAllMap() map[string]Camera {
   m := make(map[string]Camera,0)
   m := make(map[string]Camera, 0)
   cams, err := camera.FindAll()
   if err ==nil && cams !=nil {
      for _,model :=range cams {
   if err == nil && cams != nil {
      for _, model := range cams {
         m[model.Id] = model
      }
   }
@@ -175,14 +182,14 @@
}
func (camera *Camera) Update() (err error) {
   logger.Debug("camera:",camera)
   longitude := fmt.Sprintf("%3.4f",camera.Longitude)
   latitude := fmt.Sprintf("%3.4f",camera.Latitude)
   logger.Debug("camera:", camera)
   longitude := fmt.Sprintf("%3.4f", camera.Longitude)
   latitude := fmt.Sprintf("%3.4f", camera.Latitude)
   voiceEnable := 0
   if camera.VoiceEnable {
      voiceEnable = 1
   }
   sql := "update cameras set name='"+camera.Name+"',alias='"+camera.Alias+"',type="+strconv.Itoa(camera.Type)+",addr='"+camera.Addr+"',longitude="+longitude+",latitude="+latitude+",rtsp='"+camera.Rtsp+"',ip='"+camera.Ip+"',port="+strconv.Itoa(camera.Port)+",username='"+camera.Username+"',password='"+camera.Password+"',brand='"+camera.Brand+"',reserved='"+camera.Reserved+"',run_server_id='"+camera.RunServerId+"',resolution_width="+strconv.Itoa(camera.ResolutionWidth)+",resolution_height="+strconv.Itoa(camera.ResolutionHeight)+",voiceEnable="+strconv.Itoa(voiceEnable)+",voiceId='"+camera.VoiceId+"' where id='"+camera.Id+"'"
   sql := "update cameras set name='" + camera.Name + "',alias='" + camera.Alias + "',type=" + strconv.Itoa(camera.Type) + ",addr='" + camera.Addr + "',longitude=" + longitude + ",latitude=" + latitude + ",rtsp='" + camera.Rtsp + "',ip='" + camera.Ip + "',port=" + strconv.Itoa(camera.Port) + ",username='" + camera.Username + "',password='" + camera.Password + "',brand='" + camera.Brand + "',reserved='" + camera.Reserved + "',run_server_id='" + camera.RunServerId + "',resolution_width=" + strconv.Itoa(camera.ResolutionWidth) + ",resolution_height=" + strconv.Itoa(camera.ResolutionHeight) + ",voiceEnable=" + strconv.Itoa(voiceEnable) + ",voiceId='" + camera.VoiceId + "' where id='" + camera.Id + "'"
   if err := db.Exec(sql).Error; err != nil {
      return err
@@ -191,87 +198,107 @@
   return nil
}
func (camera *Camera) UpdateRunEnable(cameraId string,runEnable bool) bool{
func (camera *Camera) UpdateRunEnable(cameraId string, runEnable bool) bool {
   result := db.Exec("update cameras set run_enable=? where id=?", runEnable, cameraId)
   if result.Error !=nil {
   if result.Error != nil {
      return false
   }
   return result.RowsAffected>0
   return result.RowsAffected > 0
}
func (camera *Camera) ChangeRunType(cameraId string,runType int) bool{
func (camera *Camera) ChangeRunType(cameraId string, runType int) bool {
   result := db.Exec("update cameras set run_type=? where id=?", runType, cameraId)
   if result.Error !=nil {
   if result.Error != nil {
      return false
   }
   return result.RowsAffected>0
   return result.RowsAffected > 0
}
func (camera *Camera) UpdateIsRunningState(cameraId string,isRunning bool) bool{
func (camera *Camera) UpdateIsRunningState(cameraId string, isRunning bool) bool {
   isRunningStr := "0"
   if isRunning {
      isRunningStr = "1"
   }
   result := db.Exec("update cameras set is_running="+isRunningStr+" where id='"+cameraId+"'")
   if result.Error !=nil {
   result := db.Exec("update cameras set is_running=" + isRunningStr + " where id='" + cameraId + "'")
   if result.Error != nil {
      return false
   }
   return result.RowsAffected>0
   return result.RowsAffected > 0
}
func (camera *Camera) UpdateIsRunningAll(camIds []string) bool {
   analyServerId := config.Server.AnalyServerId
   sql := "update cameras set is_running=0 where run_server_id='"+analyServerId+"'"
   sql := "update cameras set is_running=0 where run_server_id='" + analyServerId + "'"
   uIds := ""
   if camIds != nil {
      for _,id := range camIds {
         uIds = uIds + "'"+id+"',"
      for _, id := range camIds {
         uIds = uIds + "'" + id + "',"
      }
   }
   uIds = strings.Trim(uIds, ",")
   if uIds != "" {
      sql += " and id not in ("+uIds+");update cameras set is_running=1 where run_server_id='"+analyServerId+"' and id in ("+uIds+");"
      sql += " and id not in (" + uIds + ");update cameras set is_running=1 where run_server_id='" + analyServerId + "' and id in (" + uIds + ");"
   }
   logger.Debug("UpdateIsRunningAll sql:", sql)
   result := db.Exec(sql)
   if result.Error !=nil {
   if result.Error != nil {
      return false
   }
   return true
}
func (camera *Camera) UpdateSnapshot(cameraId string, snapshot string) bool{
func (camera *Camera) UpdateSnapshot(cameraId string, snapshot string) bool {
   result := db.Exec("update cameras set snapshot_url=? where id=?", snapshot, cameraId)
   if result.Error !=nil {
   if result.Error != nil {
      return false
   }
   return result.RowsAffected>0
   return result.RowsAffected > 0
}
func (camera *Camera) Delete(cid string) (int64, error) {
   var err error
   tx := GetDB().Begin()
   defer func() {
      if err !=nil && tx !=nil{
      if err != nil && tx != nil {
         tx.Rollback()
      }
   }()
   dbdel := tx.Exec("delete from cameras where id=?",cid)
   dbdel := tx.Exec("delete from cameras where id=?", cid)
   err = dbdel.Error
   if err != nil || dbdel.RowsAffected == 0 {
      return 0, err
   }
   if err = tx.Exec("delete from camera_polygon where camera_id=?",cid).Error;err !=nil{
      return 0,err
   if err = tx.Exec("delete from camera_polygon where camera_id=?", cid).Error; err != nil {
      return 0, err
   }
   if err = tx.Exec("delete from camera_area where cameraId=?",cid).Error;err !=nil {
      return 0,err
   if err = tx.Exec("delete from camera_area where cameraId=?", cid).Error; err != nil {
      return 0, err
   }
   if err = tx.Exec("delete from camera_sensor where camera_id=?",cid).Error;err !=nil {
      return 0,err
   if err = tx.Exec("delete from camera_sensor where camera_id=?", cid).Error; err != nil {
      return 0, err
   }
   tx.Commit()
   //发布数据更改消息
   return dbdel.RowsAffected, nil
}
}
// 查询列表数据
func GetListTask(ids []string) (items []Task, err error) {
   //idList := strings.Join(ids, ",")
   idList := "'" + strings.Join(ids, "','") + "'"
   // 主查询SQL
   //sqlStr := `select c.task_id, c.task_name from mal_task_video_link a left join mal_smart_task c on a.task_id = c.task_id where a.video_id in(?) ORDER BY a.task_id desc`
   sqlStr := fmt.Sprintf(`
       SELECT c.task_id, c.task_name
       FROM mal_task_video_link a
       LEFT JOIN mal_smart_task c ON a.task_id = c.task_id
       WHERE a.video_id IN (%s)
       ORDER BY a.task_id DESC
   `, idList)
   if err := db.Raw(sqlStr).Scan(&items).Error; err != nil {
      fmt.Println(err.Error())
      return nil, err
   }
   return
}