package service import ( "encoding/json" "errors" "regexp" "sort" "strings" "sync" "vamicro/scene-service/models" "vamicro/scene-service/vo" "basic.com/pubsub/protomsg.git" "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/logger.git" "github.com/satori/go.uuid" ) type CameraRuleService struct { Broker bhomeclient.Broker } //保存单个摄像机的独立任务 func (sv CameraRuleService) Save(reqBody vo.GroupRuleVo) (bool, error) { var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() var dbAction protomsg.DbAction var dbId string if reqBody.Id == "" { //新增 crg := models.CameraRuleGroup{ Id: uuid.NewV4().String(), GroupText: reqBody.GroupText, SetType: "batchTask", AlarmLevel: reqBody.AlarmLevel, TemplateId: reqBody.TemplateId, TemplateRule: "", TimeRuleId: reqBody.TimeRuleId, SceneName: reqBody.SceneName, Desc: reqBody.Desc, Enable: true, VoiceId: reqBody.VoiceId, } if err = tx.Table(crg.TableName()).Create(&crg).Error; err != nil { return false, err } for sort, baseRule := range reqBody.Rules { rga := models.CameraRuleGroupArg{ Id: uuid.NewV4().String(), } rga.CameraRuleBase = models.CameraRuleBase{ CameraId: baseRule.CameraId, SdkId: baseRule.SdkId, PolygonId: baseRule.PolygonId, RuleWithPre: baseRule.RuleWithPre, IsSaveAnyhow: baseRule.IsSaveAnyhow, Sort: sort, } setB, _ := json.Marshal(baseRule.SdkSet) rga.SdkSet = string(setB) rga.GroupId = crg.Id if err = tx.Exec("insert into "+rga.TableName()+"(id,camera_id,sdk_id,polygon_id,sdk_set,rule_with_pre,is_save_anyhow,group_id,sort) values(?,?,?,?,?,?,?,?,?)", rga.Id, rga.CameraId, rga.SdkId, rga.PolygonId, rga.SdkSet, rga.RuleWithPre, rga.IsSaveAnyhow, rga.GroupId, rga.Sort).Error; err != nil { return false, err } } dbAction = protomsg.DbAction_Insert dbId = crg.Id } else { //更新 var crg models.CameraRuleGroup rows, _ := crg.SelectById(reqBody.Id) if rows <= 0 { err = errors.New("场景规则已删除") return false, err } if err = tx.Exec("delete from "+models.CameraRuleGroupArg{}.TableName()+" where group_id=?", reqBody.Id).Error; err != nil { return false, err } if err = tx.Exec("update "+models.CameraRuleGroup{}.TableName()+" set template_id=?,time_rule_id=?,scene_name=?,desc=?,alarm_level=?,group_text=?,voiceId=? where id=?", reqBody.TemplateId, reqBody.TimeRuleId, reqBody.SceneName, reqBody.Desc, reqBody.AlarmLevel, reqBody.GroupText, reqBody.VoiceId, reqBody.Id).Error; err != nil { return false, err } for sort, baseRule := range reqBody.Rules { rga := models.CameraRuleGroupArg{ Id: uuid.NewV4().String(), } rga.CameraRuleBase = models.CameraRuleBase{ CameraId: baseRule.CameraId, SdkId: baseRule.SdkId, PolygonId: baseRule.PolygonId, RuleWithPre: baseRule.RuleWithPre, IsSaveAnyhow: baseRule.IsSaveAnyhow, Sort: sort, } setB, _ := json.Marshal(baseRule.SdkSet) rga.SdkSet = string(setB) rga.GroupId = reqBody.Id if err = tx.Exec("insert into "+rga.TableName()+"(id,camera_id,sdk_id,polygon_id,sdk_set,rule_with_pre,is_save_anyhow,group_id,sort) values(?,?,?,?,?,?,?,?,?)", rga.Id, rga.CameraId, rga.SdkId, rga.PolygonId, rga.SdkSet, rga.RuleWithPre, rga.IsSaveAnyhow, rga.GroupId, rga.Sort).Error; err != nil { return false, err } } dbAction = protomsg.DbAction_Update dbId = reqBody.Id } tx.Commit() //var camE models.Camera //camE.ReSetCamerasRun(reqBody.CameraIds)//实时或者轮询摄像机有变化 sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Camera, Id: dbId, Action: dbAction, Info: dbId, }) sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_CameraRule, Id: dbId, Action: dbAction, Info: dbId, }) return true, nil } //保存联动任务规则 func (sv CameraRuleService) SaveLinkRulesByGroup(reqBody *vo.GroupRuleVo) (bool, string) { var linkCameras []string if len(reqBody.CameraIds) <= 1 { return false, "联动摄像机数量必须大于1" } else { cM := make(map[string]string) for _, r := range reqBody.Rules { if r.CameraId != "" { if _, ok := cM[r.CameraId]; !ok { cM[r.CameraId] = r.CameraId } } } for _, v := range cM { linkCameras = append(linkCameras, v) } if len(linkCameras) <= 1 { return false, "联动摄像机数量必须大于1" } } sort.Strings(linkCameras) dbCamIdStr := strings.Join(linkCameras, ",") var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() var dbAction protomsg.DbAction var dbId string if reqBody.Id == "" { //新增 crg := models.CameraRuleGroup{ Id: uuid.NewV4().String(), GroupText: reqBody.GroupText, SetType: "linkTask", AlarmLevel: reqBody.AlarmLevel, TemplateId: reqBody.TemplateId, TemplateRule: "", TimeRuleId: reqBody.TimeRuleId, SceneName: reqBody.SceneName, Desc: reqBody.Desc, Enable: true, VoiceId: reqBody.VoiceId, } if err = tx.Table(crg.TableName()).Create(&crg).Error; err != nil { return false, err.Error() } for sort, baseRule := range reqBody.Rules { rga := models.CameraRuleGroupArg{ Id: uuid.NewV4().String(), } rga.CameraRuleBase = models.CameraRuleBase{ CameraId: baseRule.CameraId, SdkId: baseRule.SdkId, PolygonId: baseRule.PolygonId, RuleWithPre: baseRule.RuleWithPre, IsSaveAnyhow: baseRule.IsSaveAnyhow, Sort: sort, } setB, _ := json.Marshal(baseRule.SdkSet) rga.SdkSet = string(setB) rga.GroupId = crg.Id if err = tx.Exec("insert into "+rga.TableName()+"(id,camera_id,sdk_id,polygon_id,sdk_set,rule_with_pre,is_save_anyhow,group_id,sort) values(?,?,?,?,?,?,?,?,?)", rga.Id, rga.CameraId, rga.SdkId, rga.PolygonId, rga.SdkSet, rga.RuleWithPre, rga.IsSaveAnyhow, rga.GroupId, rga.Sort).Error; err != nil { return false, err.Error() } } ctl := models.CameraTaskLink{ CameraIds: dbCamIdStr, LinkTaskId: crg.Id, } if err = tx.Table(ctl.TableName()).Create(&ctl).Error; err != nil { return false, err.Error() } dbAction = protomsg.DbAction_Insert dbId = crg.Id } else { //更新 var crg models.CameraRuleGroup rows, _ := crg.SelectById(reqBody.Id) if rows <= 0 { err = errors.New("场景规则已删除") return false, err.Error() } if err = tx.Exec("delete from "+models.CameraRuleGroupArg{}.TableName()+" where group_id=?", reqBody.Id).Error; err != nil { return false, err.Error() } if err = tx.Exec("update "+models.CameraRuleGroup{}.TableName()+" set template_id=?,time_rule_id=?,scene_name=?,desc=?,alarm_level=?,group_text=?,voiceId=? where id=?", reqBody.TemplateId, reqBody.TimeRuleId, reqBody.SceneName, reqBody.Desc, reqBody.AlarmLevel, reqBody.GroupText, reqBody.VoiceId, reqBody.Id).Error; err != nil { return false, err.Error() } if err = tx.Exec("update "+models.CameraTaskLink{}.TableName()+" set camera_ids=? where link_task_id=?", dbCamIdStr, reqBody.Id).Error; err != nil { return false, err.Error() } for sort, baseRule := range reqBody.Rules { rga := models.CameraRuleGroupArg{ Id: uuid.NewV4().String(), } rga.CameraRuleBase = models.CameraRuleBase{ CameraId: baseRule.CameraId, SdkId: baseRule.SdkId, PolygonId: baseRule.PolygonId, RuleWithPre: baseRule.RuleWithPre, IsSaveAnyhow: baseRule.IsSaveAnyhow, Sort: sort, } setB, _ := json.Marshal(baseRule.SdkSet) rga.SdkSet = string(setB) rga.GroupId = reqBody.Id if err = tx.Exec("insert into "+rga.TableName()+"(id,camera_id,sdk_id,polygon_id,sdk_set,rule_with_pre,is_save_anyhow,group_id,sort) values(?,?,?,?,?,?,?,?,?)", rga.Id, rga.CameraId, rga.SdkId, rga.PolygonId, rga.SdkSet, rga.RuleWithPre, rga.IsSaveAnyhow, rga.GroupId, rga.Sort).Error; err != nil { return false, err.Error() } } dbAction = protomsg.DbAction_Update dbId = reqBody.Id } tx.Commit() //var camE models.Camera //camE.ReSetCamerasRun(reqBody.CameraIds) //实时或者轮询摄像机有变化 sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Camera, Id: dbId, Action: dbAction, Info: dbId, }) sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_CameraRule, Id: dbId, Action: dbAction, Info: dbId, }) return true, "" } func (sv CameraRuleService) UpdateAlarmLevel(groupId string, alarmLevel int) bool { var g models.CameraRuleGroup if g.UpdateAlarmLevel(groupId, alarmLevel) { sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_CameraRule, Id: groupId, Action: protomsg.DbAction_Update, Info: groupId, }) return true } else { return false } } func (sv CameraRuleService) DeleteByGroup(groupId string) bool { var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() if err = tx.Exec("delete from "+models.CameraRuleGroupArg{}.TableName()+" where group_id=?", groupId).Error; err != nil { return false } if err = tx.Exec("delete from "+models.CameraRuleGroup{}.TableName()+" where id=?", groupId).Error; err != nil { return false } if err = tx.Exec("delete from "+models.CameraTaskLink{}.TableName()+" where link_task_id=?", groupId).Error; err != nil { return false } tx.Commit() sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_CameraRule, Id: groupId, Action: protomsg.DbAction_Delete, Info: groupId, }) return true } func (sv CameraRuleService) FindAllCameraLink() []models.CameraTaskLink { var model models.CameraTaskLink list, _ := model.FindAll() if list != nil { return list } return []models.CameraTaskLink{} } func (sv CameraRuleService) FindAll() []vo.CameraAndRules { wg := &sync.WaitGroup{} wg.Add(3) var sysconf *protomsg.LocalConfig go func() { defer wg.Done() var sysApi bhomedbapi.SysSetApi flag, sconf := sysApi.GetServerInfo() if flag { sysconf = &sconf } }() var clusterInfo *protomsg.ClusterAndNodes go func() { defer wg.Done() var clusterApi bhomedbapi.ClusterApi if b, info := clusterApi.FindCluster(); b { clusterInfo = &info } }() var sdkMap map[string]protomsg.Sdk go func() { defer wg.Done() var sdkApi bhomedbapi.SdkApi sdkMap = sdkApi.FindAllMap() }() wg.Wait() allRuleGs := make([]vo.CameraAndRules, 0) wg.Add(3) go func() { defer wg.Done() //查所有的本地摄像机 var camApi bhomedbapi.CameraApi localCameras := camApi.FindAll("", "", "", "") logger.Debug("len(localCams):", len(localCameras)) for _, c := range localCameras { var camSInfo vo.CameraSInfo camSInfo.Id = c.Id camSInfo.Name = c.Name camSInfo.RunType = int(c.RunType) camSInfo.ResolutionWidth = int(c.ResolutionWidth) camSInfo.ResolutionHeight = int(c.ResolutionHeight) camSInfo.RunServerName = sv.GetRunServerName(c.RunServerId, sysconf, clusterInfo) if cgs, err := sv.GetAllByCid(c.Id, "", &camSInfo, sysconf, clusterInfo, sdkMap); err == nil { allRuleGs = append(allRuleGs, cgs) } } }() allRuleGB := make([]vo.CameraAndRules, 0) go func() { defer wg.Done() var gbApi bhomedbapi.Gb28181Api gbCams := gbApi.FindAll("", "", "", "") logger.Debug("len(gbCams):", len(gbCams)) for _, c := range gbCams { var camSInfo vo.CameraSInfo camSInfo.Id = c.Id camSInfo.Name = c.Name camSInfo.RunType = int(c.RunType) camSInfo.ResolutionWidth = int(c.ResolutionWidth) camSInfo.ResolutionHeight = int(c.ResolutionHeight) if cgs, err := sv.GetAllByCid(c.Id, "", &camSInfo, sysconf, clusterInfo, sdkMap); err == nil { allRuleGB = append(allRuleGB, cgs) } } }() //查所有的国标摄像机 //加上数据栈 allRuleStk := make([]vo.CameraAndRules, 0) go func() { defer wg.Done() var stackApi bhomedbapi.FileStackApi flag, scks := stackApi.FindAll() logger.Debug("flag:", flag, "scks:", scks) if flag && scks != nil { for _, f := range scks { var camSInfo vo.CameraSInfo camSInfo.Id = f.Id camSInfo.Name = f.Name camSInfo.RunType = bhomeclient.TYPE_RUNTYPE_REALTIME camSInfo.ResolutionWidth = int(f.ResolutionWidth) camSInfo.ResolutionHeight = int(f.ResolutionHeight) if sysconf != nil { camSInfo.RunServerName = sysconf.ServerName } if cgs, err := sv.GetAllByCid(f.Id, "", &camSInfo, sysconf, clusterInfo, sdkMap); err == nil { allRuleStk = append(allRuleStk, cgs) } } } }() wg.Wait() allRuleGs = append(allRuleGs, allRuleGB...) allRuleGs = append(allRuleGs, allRuleStk...) return allRuleGs } func (sv CameraRuleService) GetAllByCid(cid string, setType string, targetInfo *vo.CameraSInfo, sysconf *protomsg.LocalConfig, clusterInfo *protomsg.ClusterAndNodes, sdkMap map[string]protomsg.Sdk) (vo.CameraAndRules, error) { var crg models.CameraRuleGroup var rga models.CameraRuleGroupArg var result vo.CameraAndRules var camSInfo vo.CameraSInfo if targetInfo != nil { camSInfo = *targetInfo } else { if models.IsStack(cid) { var stackApi bhomedbapi.FileStackApi b, fileS := stackApi.Show(cid) if !b { return result, errors.New("数据栈已删除") } camSInfo.Id = fileS.Id camSInfo.Name = fileS.Name camSInfo.RunType = bhomeclient.TYPE_RUNTYPE_REALTIME camSInfo.ResolutionWidth = int(fileS.ResolutionWidth) camSInfo.ResolutionHeight = int(fileS.ResolutionHeight) if sysconf != nil { camSInfo.RunServerName = sysconf.ServerName } } else { var localCamApi bhomedbapi.CameraApi localCam, err := localCamApi.GetCameraById(cid) var targetCam *protomsg.Camera if localCam.Id != "" { logger.Debug("localCam:", localCam, "e:", err) targetCam = &localCam } else { var gbCamApi bhomedbapi.Gb28181Api gbCam, err := gbCamApi.GetCameraById(cid) logger.Debug("gbCam:", gbCam, " err:", err) if err == nil { targetCam = &gbCam } } if targetCam != nil { camSInfo.Id = targetCam.Id camSInfo.Name = targetCam.Name camSInfo.RunType = int(targetCam.RunType) camSInfo.ResolutionWidth = int(targetCam.ResolutionWidth) camSInfo.ResolutionHeight = int(targetCam.ResolutionHeight) camSInfo.RunServerName = sv.GetRunServerName(targetCam.RunServerId, sysconf, clusterInfo) } } } result.CameraInfo = camSInfo groupArr, err := crg.FindByCameraId(cid, setType) if err == nil && groupArr != nil { var t models.CameraTimerule timeMap := t.FindAllMap() for _, group := range groupArr { g := vo.GroupRuleVo{ Id: group.Id, GroupText: group.GroupText, AlarmLevel: group.AlarmLevel, SetType: group.SetType, TemplateId: group.TemplateId, TimeRuleId: group.TimeRuleId, SceneName: group.SceneName, Desc: group.Desc, Enable: group.Enable, VoiceId: group.VoiceId, } if g.TimeRuleId != "" { if t, exi := timeMap[g.TimeRuleId]; exi { g.TimeName = t.Name } } args := rga.FindByGroupId(group.Id) for _, argModel := range args { crbv := vo.CameraRuleBaseVo{ Id: argModel.Id, CameraId: argModel.CameraId, SdkId: argModel.SdkId, PolygonId: argModel.PolygonId, RuleWithPre: argModel.RuleWithPre, IsSaveAnyhow: argModel.IsSaveAnyhow, GroupId: argModel.GroupId, Sort: argModel.Sort, } if sdkMap != nil { if s, ok := sdkMap[crbv.SdkId]; ok { crbv.Icon = s.Icon crbv.IconBlob = s.IconBlob crbv.IconBlob2 = s.IconBlob2 } } var setArr []vo.TemplateArg json.Unmarshal([]byte(argModel.SdkSet), &setArr) crbv.SdkSet = setArr g.Rules = append(g.Rules, crbv) } result.AllGroupRules = append(result.AllGroupRules, g) } } return result, nil } func (sv CameraRuleService) GetRunServerName(runServerId string, sysconf *protomsg.LocalConfig, clusterInfo *protomsg.ClusterAndNodes) string { var runServerName = "" if sysconf != nil { if runServerId == sysconf.ServerId { runServerName = sysconf.ServerName } else { //属于其他服务器 if clusterInfo != nil && clusterInfo.Nodes != nil { for _, n := range clusterInfo.Nodes { if n.NodeId == runServerId { runServerName = n.NodeName } } } } } return runServerName } func (sv CameraRuleService) ExistRunningTask(cameraId string) bool { var rga models.CameraRuleGroupArg return rga.ExistRunningTask(cameraId) } func (sv CameraRuleService) GetLinkRulesByCameraIds(cameraIds []string) (bool, []vo.GroupRuleVo) { var cameraTasklinkE models.CameraTaskLink var rga models.CameraRuleGroupArg linkList, err := cameraTasklinkE.FindByCameraIds(cameraIds) if err != nil { return false, nil } resultRules := make([]vo.GroupRuleVo, 0) if linkList != nil { cameraIdNameMap := GetAllCamIdNameMap() var sdkApi bhomedbapi.SdkApi sdkMap := sdkApi.FindAllMap() var t models.CameraTimerule timeMap := t.FindAllMap() for _, linkModel := range linkList { var linkG models.CameraRuleGroup rows, err := linkG.SelectById(linkModel.LinkTaskId) if rows <= 0 || err != nil { continue } linkCameraIdArr := strings.Split(linkModel.CameraIds, ",") linkCameraNameArr := make([]string, 0) for _, linkCameraId := range linkCameraIdArr { if cameraName, ok := cameraIdNameMap[linkCameraId]; ok { linkCameraNameArr = append(linkCameraNameArr, cameraName) } } voModel := vo.GroupRuleVo{ CameraIds: linkCameraIdArr, CameraNames: strings.Join(linkCameraNameArr, ","), Id: linkG.Id, GroupText: linkG.GroupText, AlarmLevel: linkG.AlarmLevel, SetType: linkG.SetType, TemplateId: linkG.TemplateId, TimeRuleId: linkG.TimeRuleId, SceneName: linkG.SceneName, Desc: linkG.Desc, Enable: linkG.Enable, VoiceId: linkG.VoiceId, } if voModel.TimeRuleId != "" { if t, exi := timeMap[voModel.TimeRuleId]; exi { voModel.TimeName = t.Name } } argList := rga.FindByGroupId(linkG.Id) if argList != nil { for _, argModel := range argList { crbv := vo.CameraRuleBaseVo{ Id: argModel.Id, CameraId: argModel.CameraId, SdkId: argModel.SdkId, PolygonId: argModel.PolygonId, RuleWithPre: argModel.RuleWithPre, IsSaveAnyhow: argModel.IsSaveAnyhow, GroupId: argModel.GroupId, Sort: argModel.Sort, } if s, ok := sdkMap[crbv.SdkId]; ok { crbv.Icon = s.Icon crbv.IconBlob = s.IconBlob crbv.IconBlob2 = s.IconBlob2 } var setArr []vo.TemplateArg json.Unmarshal([]byte(argModel.SdkSet), &setArr) crbv.SdkSet = setArr voModel.Rules = append(voModel.Rules, crbv) } } resultRules = append(resultRules, voModel) } } return true, resultRules } func (sv CameraRuleService) PasteRules(sourceId string, targetIds []string) bool { logger.Debug("PasteRules sourceId:", sourceId, "targetIds:", targetIds) var sdkApi bhomedbapi.SdkApi sdkMap := sdkApi.FindAllMap() sourceRules, cErr := sv.GetAllByCid(sourceId, models.Type_SetType_Batch, nil, nil, nil, sdkMap) if cErr != nil || sourceRules.AllGroupRules == nil || len(sourceRules.AllGroupRules) == 0 { logger.Debug("PasteRules sourceRules is nil") return false } var err error tx := models.GetDB().Begin() defer func() { if err != nil && tx != nil { tx.Rollback() } }() var cpgn models.CameraPolygon polygonMap := cpgn.FindAllMap() cameraMap := GetAllCamIdNameMap() for _, tId := range targetIds { if tId != sourceId { for _, targetG := range sourceRules.AllGroupRules { newGId := uuid.NewV4().String() //处理每一组规则 //1.如果是全部区域,则copy过来之后也用目标摄像机的全部区域 //2.如果不是全部区域,则将区域置为空,并将对应的区域文字也置为NULL var repNullPolygon = make(map[string]models.CameraPolygon, 0) for sort, baseRule := range targetG.Rules { rulePolygonId := "" if baseRule.PolygonId != "" { //判断此条规则有没有设置区域 if _, ok := cameraMap[baseRule.PolygonId]; ok { //是全部区域 rulePolygonId = tId } else { //非全部区域 if targetP, okP := polygonMap[baseRule.PolygonId]; okP { //是从其他摄像机拷贝过来的规则 //不需要拷贝区域,置为空,区域名称替换 rulePolygonId = "" repNullPolygon[baseRule.PolygonId] = targetP } } } rga := models.CameraRuleGroupArg{ Id: uuid.NewV4().String(), } rga.CameraRuleBase = models.CameraRuleBase{ CameraId: tId, SdkId: baseRule.SdkId, PolygonId: rulePolygonId, RuleWithPre: baseRule.RuleWithPre, IsSaveAnyhow: baseRule.IsSaveAnyhow, Sort: sort, } setB, _ := json.Marshal(baseRule.SdkSet) rga.SdkSet = string(setB) rga.GroupId = newGId if err = tx.Table(rga.TableName()).Create(&rga).Error; err != nil { return false } } crg := models.CameraRuleGroup{ Id: newGId, GroupText: targetG.GroupText, SetType: "batchTask", AlarmLevel: targetG.AlarmLevel, TemplateId: targetG.TemplateId, TimeRuleId: targetG.TimeRuleId, SceneName: targetG.SceneName, Desc: targetG.Desc, Enable: true, VoiceId: targetG.VoiceId, } logger.Debug("repNullPolygon len:", len(repNullPolygon)) if len(repNullPolygon) > 0 { for _, tp := range repNullPolygon { logger.Debug("repNullPolygon name:", tp.Name) reg := regexp.MustCompile(`(` + tp.Name + `)`) crg.GroupText = reg.ReplaceAllString(crg.GroupText, `NULL`) } } if err = tx.Table(crg.TableName()).Create(&crg).Error; err != nil { return false } } } } tx.Commit() //发布缓存更改通知 sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Camera, Action: protomsg.DbAction_Update, }) sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_CameraPolygon, Action: protomsg.DbAction_Update, }) sv.addDbMessage(&protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_CameraRule, Action: protomsg.DbAction_Insert, }) return true } func (sv CameraRuleService) FindLinksByCameraIds(camIds []string) []models.CameraTaskLink { var ctl models.CameraTaskLink list, err := ctl.FindByCameraIds(camIds) if err != nil { return []models.CameraTaskLink{} } return list } func GetAllCamIdNameMap() map[string]string { m := make(map[string]string) var camApi bhomedbapi.CameraApi localCams := camApi.FindAll("", "", "", "") if localCams != nil { for _, c := range localCams { m[c.Id] = c.Name } } var gbApi bhomedbapi.Gb28181Api gbCams := gbApi.FindAll("", "", "", "") if gbCams != nil { for _, c := range gbCams { m[c.Id] = c.Name } } var sckApi bhomedbapi.FileStackApi _, scks := sckApi.FindAll() if scks != nil { for _, sck := range scks { m[sck.Id] = sck.Name } } return m } func (sv CameraRuleService) addDbMessage(msg *protomsg.DbChangeMessage) { b, _ := json.Marshal(*msg) sv.Broker.Publish(ProcName, b) }