| | |
| | | type SdkDatas struct { |
| | | CameraId string |
| | | Sdkdata []*SdkData |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg yolo: []Result cacheData: SdkDatas |
| | | RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg, yolo: []Result, cacheData: SdkDatas, timeLabel: 0,1,2,3,4,5 |
| | | } |
| | | |
| | | // 将传递过来的参数转化为 |
| | |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if !result.(bool) { |
| | | // 给这帧数据打上规则组标签 |
| | | //args.RuleResult = append(args.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId}) |
| | | for k, timeEle := range TimeEleList { |
| | | if strings.Contains(k, groupRule.GroupId) { |
| | | timeEle.N = timeEle.InitN // 重置定时器 |
| | | } |
| | | } |
| | | logger.Info("-------------------重置相关的定时器并返回false---------------") |
| | | return false |
| | | } else { |
| | | // 判断持续时间条件,去看池子里是否有与本帧数据有关的定时器,如果有,看此时是否走到0,没有此定时器或有定时器走到0的话返回成功报警 |
| | | var flag bool = true |
| | | for k, timeEle := range TimeEleList { |
| | | if strings.Contains(k, groupRule.GroupId) { |
| | | if timeEle.N != 0 { // 这组规则的定时器要全部等于0 |
| | | logger.Info("———————————-------------不冤,你是被定时器打败的:") |
| | | flag = false |
| | | } |
| | | } |
| | | } |
| | | //TimerAlarm(args,groupRule.GroupId) |
| | | if flag { |
| | | // 进行定时器的处理和判断 |
| | | timeFlag := TimerAlarm(args,groupRule.GroupId,result.(bool)) |
| | | if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" { |
| | | // 最后成功报警才把符合条件的人脸数据塞进结果标签里 |
| | | // 配了人脸的算法才把人脸的数据甩出来打标签 |
| | | faces := []Arg{} |
| | |
| | | } else { |
| | | return false |
| | | } |
| | | } |
| | | } else { |
| | | return false |
| | | } |
| | | } |
| | | func TimerAlarm(args SdkDatas,groupId string) (int) { |
| | | var flagTime int = 0 // 为0的意思是 |
| | | // 判断是否符合定时器条件 |
| | | func TimerAlarm(args *SdkDatas,groupId string,result bool) (string) { |
| | | var flagTime string // |
| | | // 判断有无此规则组的定时器 |
| | | flag := false |
| | | for k,_ := range TimeEleList { |
| | | if strings.Contains(k, groupId) { |
| | | flag = true |
| | | } |
| | | } |
| | | if flag { // 有定时器 |
| | | if result { // 结果为真 |
| | | for k, timeEle := range TimeEleList { |
| | | if strings.Contains(k, groupId) { |
| | | if timeEle.N == 0 && !timeEle.AlarmFlag { // 这组规则的定时器要全部等于0 暂且认为一组规则只有一个定时器 |
| | | logger.Info("———————————-------------首次符合持续时间规则并报警") |
| | | flagTime = 1 |
| | | logger.Debug("———————————-------------首次符合持续时间规则并报警") |
| | | flagTime = "10" |
| | | timeEle.AlarmFlag = true |
| | | args.RuleResult["cacheData"] = timeEle.CacheSdkData |
| | | args.RuleResult["timeLabel"] = flagTime |
| | | } |
| | | if timeEle.N == 0 && timeEle.AlarmFlag { |
| | | logger.Info("-------------------------符合持续时间规则但并不是首次,不报警") |
| | | flagTime = 2 |
| | | logger.Debug("-------------------------符合持续时间规则但并不是首次,不报警") |
| | | flagTime = "11" |
| | | args.RuleResult["timeLabel"] = flagTime |
| | | } |
| | | if timeEle.N != 0 { |
| | | flagTime = "00" |
| | | } |
| | | } |
| | | } |
| | | } else { // 结果为假 |
| | | for k, timeEle := range TimeEleList { |
| | | if strings.Contains(k, groupId) { |
| | | timeEle.N = timeEle.InitN // 重置定时器 |
| | | timeEle.CacheSdkData = SdkDatas{} // 把缓存数据扔了 |
| | | flagTime = "12" |
| | | logger.Debug("------------------------------重置定时器") |
| | | } |
| | | } |
| | | |
| | | } |
| | | } else { |
| | | if result { |
| | | flagTime = "01" |
| | | } else { |
| | | flagTime = "00" |
| | | } |
| | | } |
| | | return flagTime |