panlei
2019-11-07 23c837bc4d5b4312c0bb5eb96260c90e887882ac
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,7 +224,7 @@
               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)
                  }
               }
            }
@@ -284,6 +285,28 @@
               //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
               labelTypes = append(labelTypes,1)
            }
            // 给持续时间的第一张赋予缓存数据(遍历复制)
            if cacheId != "" { // 有这帧数据的缓存
               tempMap := make(map[string]interface{})
               for k, result := range args.RuleResult {
                  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)
                     }
                  }
               }
               rw.Lock()
               TimeEleList[cacheId].CacheSdkData.RuleResult = tempMap
               rw.Unlock()
            }
            return true,labelTypes
         } else {
            return false,[]int{}
@@ -624,7 +647,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 +664,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: 一条子规则,区域数据