panlei
2019-11-07 76430be0fe73ba95d7ff2df0a18b64b47f25d26a
ruleserver/ruleToformula.go
@@ -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,14 @@
               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)
                  }
               }
            }
         }
         // 进行定时器的处理和判断
         timeFlag := TimerAlarm(&label, groupRule.GroupId, result.(bool))
         if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" { // 没有定时器或者满足定时器条件
         if timeFlag == "01" || timeFlag == "10" || timeFlag == "11" || cacheId != ""{ // 没有定时器或者满足定时器条件
            // 打人脸标签和yolo标签
            // 最后成功报警才把符合条件的人脸数据塞进结果标签里
            // 配了人脸的算法才把人脸的数据甩出来打标签
@@ -284,6 +285,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{}
@@ -624,7 +650,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)
@@ -640,14 +667,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: 一条子规则,区域数据