panlei
2019-09-17 5c18009ec28a42827ffebdb10707fd29edc6aceb
ruleserver/ruleToformula.go
@@ -6,6 +6,7 @@
   "sort"
   "strconv"
   "strings"
   "sync"
   "time"
   "basic.com/pubsub/protomsg.git"
@@ -110,6 +111,8 @@
   Result  string // 已包含了前置连接符
   Sort    int32
}
var rw sync.RWMutex // 读写锁
// 对单帧图像的判断 thisSdkDatas  当前传入的这帧数据,cacheSdkData 定时器里缓存的一帧数据 没有就返回nil  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
func Judge(args *SdkDatas, message *protomsg.SdkMessage) {
@@ -420,11 +423,15 @@
   logger.Info("------------------------------------------当前是联动任务,规则是:", groupRule.GroupText)
   var flag bool = true
   var timeEle = TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId}
   rw.Lock()
   for k, timeEle1 := range TimeEleList {
      if k == groupRule.GroupId {
         flag = false // 已经有了这个定时器就置为false 不再新增
         timeEle = *timeEle1
      }
   }
   for _,ruleRe := range timeEle.RuleResults {
      logger.Info("联动数组里的数据----",ruleRe.CameraId,ruleRe.Sort)
   }
   if flag { // 如果还没有这个定时器元素就新增一个
      //timeEle := TimeElement{N: 2, InitN: 2, GroupId: groupRule.GroupId} // 扔进去一个定时器元素
@@ -434,7 +441,9 @@
      // 得出这组完整规则里涉及到几个摄像机,决定着数组里有几个结构体,去重添加方式
      for j := 0; j < len(groupRule.Rules); j++ {
         var flag1 bool = true
         logger.Info("规则组信息:",groupRule.Rules[j].CameraId)
         for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults {
            logger.Info("联动数组里的数据:",ruleRes.CameraId,ruleRes.Sort)
            if groupRule.Rules[j].CameraId == ruleRes.CameraId {
               flag1 = false
            }
@@ -444,6 +453,7 @@
         }
      }
   }
   rw.Unlock()
   // 往数组里赋值
   isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
   if isOk {
@@ -474,10 +484,8 @@
      }
      // 判断结果数组是否完满(即被赋值完毕)可得出报警结果
      var isPerfect = true
      logger.Info("联动任务数组:")
      for _, va := range timeEle.RuleResults {
         //logger.Info("---------------------瞅瞅当前数组________________:", *va)
         logger.Info("联动子元素:",va.Sort,va.RuleWithPre,va.Result,va.CameraId)
         if va.Result == "" && va.RuleWithPre != "||" {
            isPerfect = false
         }
@@ -497,6 +505,7 @@
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               rw.RLock()
               if TimeEleList[groupRule.GroupId] != nil {  // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机
                  // 把数组里缓存的数据取出来一起报警
                  label.LinkCache = []ResultMsg{}
@@ -515,6 +524,7 @@
                     }
                  }
               }
               rw.RUnlock()
            }
         }
      } else {
@@ -545,12 +555,14 @@
      //      va.Result = strconv.FormatBool(isOk)
      //   }
      //}
      rw.Lock()
      for k, _ := range TimeEleList {
         if k == groupRule.GroupId {
            delete(TimeEleList, k)
            logger.Debug("因为定时器的一帧数据结果为false,干掉定时器")
         }
      }
      rw.Unlock()
      // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西
   }
@@ -697,6 +709,7 @@
      if rule.SdkArgAlias == "duration" { //
         logger.Info("当前小规则是:---------", rule)
         // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了
         rw.Lock()
         var flag bool = true
         for k, _ := range TimeEleList {
            if k == groupId+"+"+rule.Id {
@@ -712,6 +725,7 @@
            TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
            logger.Info("创建了计数器")
         }
         rw.Unlock()
      }
   }
}