---
panlei
2019-11-07 d7c6faf69ff5cd591530c917d99354b4ece9290f
ruleserver/ruleToformula.go
@@ -71,7 +71,7 @@
         // 如果标签中含有持续时间首次报警的timeLabel的话则不需要过人体追踪,不然就没的插入了
         fk := TrackOrNot(args.RuleResult)
         if !fk {
            BodyIsSame(message)
            BodyIsSame(args,message)
         }
      }
   }
@@ -213,6 +213,7 @@
      if result.(bool) {
         // 最后过持续时间等时间维度的条件   把时间规则位置调整到这个位置是为了缓存数据
         cacheId := ""
         for j := 0; j < len(groupRule.Rules); j++ {
            for _, sdkData := range args.Sdkdata {
               sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId)
@@ -223,14 +224,15 @@
               if ipcId == sdkData.IpcId {
                  for _, areaMap := range sdkData.AreaMapList {
                     // 去开启一个定时器
                     duration(groupRule.Rules[j], groupRule.GroupId, areaMap, args, message)
                     cacheId = duration(groupRule.Rules[j], groupRule.GroupId, areaMap, args, message)
                     logger.Info("cacheId为:",cacheId)
                  }
               }
            }
         }
         // 进行定时器的处理和判断
         timeFlag := TimerAlarm(&label, groupRule.GroupId, result.(bool))
         if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" { // 没有定时器或者满足定时器条件
         if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" || cacheId != ""{ // 没有定时器或者满足定时器条件
            // 打人脸标签和yolo标签
            // 最后成功报警才把符合条件的人脸数据塞进结果标签里
            // 配了人脸的算法才把人脸的数据甩出来打标签
@@ -260,7 +262,9 @@
            for _, sdkData := range args.Sdkdata {
               if sdkData.IpcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && sdkNames != "" { // 把yolo数据的各个目标的坐标输出方便后面画框
                  for _, areaMap := range sdkData.AreaMapList {
                     locations = append(locations, putYolosToResult(areaMap)...)
                     if areaMap.IsEffective {
                        locations = append(locations, putYolosToResult(areaMap)...)
                     }
                  }
               }
            }
@@ -282,6 +286,31 @@
               //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
               labelTypes = append(labelTypes,1)
            }
            // 给持续时间的第一张赋予缓存数据(遍历复制)
            logger.Info("缓存id为:",cacheId)
            if cacheId != "" { // 有这帧数据的缓存
               tempMap := make(map[string]interface{})
               for k, result := range args.RuleResult {
                  logger.Info("缓存key为:",k)
                  if k == "yolo" {
                     tempMap[k] = []structure.Result{}
                     for _, res := range result.([]structure.Result) {
                        tempMap[k] = append(tempMap[k].([]structure.Result), res)
                     }
                  }
                  if k == "face" {
                     tempMap[k] = []structure.FaceResult{}
                     for _, res := range result.([]structure.FaceResult) {
                        tempMap[k] = append(tempMap[k].([]structure.FaceResult), res)
                     }
                  }
               }
               logger.Info("缓存规则为:",tempMap)
               rw.Lock()
               TimeEleList[cacheId].CacheSdkData.RuleResult = tempMap
               rw.Unlock()
            }
            return true,labelTypes
         } else {
            return false,[]int{}
@@ -571,6 +600,7 @@
      // 处理的都是yolo数据
      if rule.PolygonId == am.AreaId { // 首先这条规则得是这个算法的规则,其次规则所对应的区域id要跟区域数据的id对的上
         if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
            logger.Info("区域数据:",am.AreaJson)
            var args []*structure.Arg
            if rule.RuleWithPre == "&&" {
               args = am.FilterData
@@ -599,6 +629,9 @@
               }
            }
            am.TargetNum = len(am.FilterData) // 把符合条件的目标数量更新到targetNum字段
            for _,tar := range am.FilterData  {
               logger.Info("具体目标的坐标为",tar.Id,tar.Location)
            }
            if am.TargetNum > 0 {
               return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort}
            } else {
@@ -618,7 +651,8 @@
}
// 如果有持续时间条件维护开启一个定时器
func duration(rule *protomsg.Rule, groupId string, am *structure.AreaMap, args *structure.SdkDatas, message *protomsg.SdkMessage) {
func duration(rule *protomsg.Rule, groupId string, am *structure.AreaMap, args *structure.SdkDatas, message *protomsg.SdkMessage) string{
   cacheId := ""
   if rule.PolygonId == am.AreaId { // 首先规则所对应的区域id要跟区域数据的id对的上  配置的算法要对的上
      if rule.SdkArgAlias == "duration" { //
         logger.Info("当前小规则是:---------", rule)
@@ -634,14 +668,16 @@
         if flag {
            timeLength, _ := strconv.Atoi(rule.SdkArgValue)
            timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: structure.ResultMsg{message, args.RuleResult}} // 扔进去一个定时器元素(并缓存当前画面帧数据)
            timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: structure.ResultMsg{message, nil}} // 扔进去一个定时器元素(并缓存当前画面帧数据)
            //TimeEleList = make(map[string]timeElement)
            TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
            logger.Info("创建了计数器")
            cacheId = groupId+"+"+rule.Id
         }
         rw.Unlock()
      }
   }
   return cacheId
}
// 给数据库的规则表达式代参 args: 一条子规则,区域数据