package models
|
|
import (
|
"fmt"
|
"strconv"
|
"strings"
|
"vamicro/config"
|
|
"basic.com/valib/logger.git"
|
)
|
|
const (
|
Default_Layer = -9999 //摄像机添加进来的默认楼层
|
TYPE_LOCAL_CAMERA = 0 //本地摄像机
|
TYPE_GB28181_CAMERA = 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 //其他情况
|
)
|
|
// 智查任务
|
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
|
|
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"`
|
}
|
|
type CameraTreeNode struct {
|
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)
|
allCams, err := camera.FindAll()
|
if err == nil && allCams != nil && len(allCams) > 0 {
|
for _, model := range allCams {
|
cameraEMap[model.Id] = model.Name
|
}
|
}
|
|
return cameraEMap
|
}
|
|
// 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)
|
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 + ""
|
|
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) + ")"
|
} else if cameraType == 2 { //查监控摄像机
|
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 + "'"
|
}
|
}
|
|
sql += " order by c.id asc"
|
|
if err := db.Raw(sql).Scan(&camMenus).Error; err != nil {
|
return nil, err
|
}
|
return camMenus, nil
|
}
|
|
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))"
|
}
|
if cameraName != "" {
|
sql += " and name like '%" + cameraName + "%'"
|
}
|
if err := db.Raw(sql).Scan(&list).Error; err != nil {
|
return nil, err
|
}
|
return list, nil
|
}
|
|
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 err := db.Raw(sql, runType, analyServerId, "%"+cameraName+"%").Scan(&list).Error; err != nil {
|
return nil, err
|
}
|
return list, nil
|
}
|
|
func (camera *Camera) Insert() (err error) {
|
tx := db.Table("cameras").Begin()
|
|
if tx.Error != nil {
|
return err
|
}
|
|
if err := tx.Create(&camera).Error; err != nil {
|
tx.Rollback()
|
return err
|
}
|
//新增摄像机成功,发布消息
|
|
err = tx.Commit().Error
|
return err
|
}
|
|
func (camera *Camera) SelectById(cameraId string) (rows int64, err error) {
|
dbselect := db.Where("id = ?", cameraId).First(&camera)
|
if dbselect.Error != nil || dbselect.RowsAffected == 0 {
|
return 0, err
|
}
|
return dbselect.RowsAffected, nil
|
}
|
|
func (camera *Camera) FindAll() (cams []Camera, err error) {
|
dberr := db.Table("cameras").Find(&cams)
|
if dberr.Error != nil {
|
return nil, err
|
}
|
return cams, nil
|
}
|
|
func (camera *Camera) FindAllMap() map[string]Camera {
|
m := make(map[string]Camera, 0)
|
cams, err := camera.FindAll()
|
if err == nil && cams != nil {
|
for _, model := range cams {
|
m[model.Id] = model
|
}
|
}
|
return m
|
}
|
|
func (camera *Camera) Update() (err error) {
|
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 + "'"
|
|
if err := db.Exec(sql).Error; err != nil {
|
return err
|
}
|
|
return nil
|
}
|
|
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 {
|
return false
|
}
|
return result.RowsAffected > 0
|
}
|
|
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 {
|
return false
|
}
|
return result.RowsAffected > 0
|
}
|
|
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 {
|
return false
|
}
|
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 + "'"
|
uIds := ""
|
if camIds != nil {
|
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 + ");"
|
}
|
logger.Debug("UpdateIsRunningAll sql:", sql)
|
result := db.Exec(sql)
|
if result.Error != nil {
|
return false
|
}
|
return true
|
}
|
|
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 {
|
return false
|
}
|
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 {
|
tx.Rollback()
|
}
|
}()
|
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_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
|
}
|
tx.Commit()
|
//发布数据更改消息
|
return dbdel.RowsAffected, nil
|
|
}
|