panlei
2019-09-19 4a10c1dfb04e02d31f0a4886a9e6b4f42b346f1d
ruleserver/ruleToformula.go
@@ -6,6 +6,7 @@
   "sort"
   "strconv"
   "strings"
   "sync"
   "time"
   "basic.com/pubsub/protomsg.git"
@@ -111,8 +112,15 @@
   Sort    int32
}
var rw sync.RWMutex // 读写锁
// 对单帧图像的判断 thisSdkDatas  当前传入的这帧数据,cacheSdkData 定时器里缓存的一帧数据 没有就返回nil  (thisSdkDatas SdkDatas, cacheSdkDatas SdkDatas)
func Judge(args *SdkDatas, message *protomsg.SdkMessage) {
   defer func() {
      if err := recover(); err != nil {
         logger.Error("规则模块儿的异常捕获:",err)
      }
   }()
   if len(args.Sdkdata) > 0 {
      // 拿到本摄像机的区域
      cameraPolygons := GetPolygons(args.CameraId)
@@ -420,6 +428,7 @@
   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 不再新增
@@ -449,7 +458,7 @@
         }
      }
   }
   logger.Info("")
   rw.Unlock()
   // 往数组里赋值
   isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
   if isOk {
@@ -501,6 +510,7 @@
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               rw.RLock()
               if TimeEleList[groupRule.GroupId] != nil {  // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机
                  // 把数组里缓存的数据取出来一起报警
                  label.LinkCache = []ResultMsg{}
@@ -519,6 +529,7 @@
                     }
                  }
               }
               rw.RUnlock()
            }
         }
      } else {
@@ -549,12 +560,14 @@
      //      va.Result = strconv.FormatBool(isOk)
      //   }
      //}
      rw.Lock()
      for k, _ := range TimeEleList {
         if k == groupRule.GroupId {
            delete(TimeEleList, k)
            logger.Debug("因为定时器的一帧数据结果为false,干掉定时器")
         }
      }
      rw.Unlock()
      // 因为本帧数据不符合规则,所以也不用统计结果数组里的东西
   }
@@ -685,6 +698,12 @@
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
            }
         } else if rule.SdkArgAlias == "" {
            if am.targetNum > 0 {
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
            } else {
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
            }
         } else {
            return LittleRuleResult{}
         }
@@ -701,6 +720,7 @@
      if rule.SdkArgAlias == "duration" { //
         logger.Info("当前小规则是:---------", rule)
         // 先看看定时器元素队列中是否有这条规则的定时器,如果有就不能再次创建了
         rw.Lock()
         var flag bool = true
         for k, _ := range TimeEleList {
            if k == groupId+"+"+rule.Id {
@@ -716,6 +736,7 @@
            TimeEleList[groupId+"+"+rule.Id] = &timeEle // 定时器元素以当前持续时间小规则id为键
            logger.Info("创建了计数器")
         }
         rw.Unlock()
      }
   }
}