panlei
2019-08-19 3031a80fdec1ff02b7b2087caec69382a4109c04
ruleserver/ruleToformula.go
@@ -117,7 +117,7 @@
      // 拿到本摄像机的区域
      cameraPolygons := GetPolygons(args.CameraId)
      // 把所有的sdk提取的数据都按所属摄像机的区域归置
      //logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname)
      logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname,"--任务id为:",message.Tasklab.Taskid)
      for _, arg := range args.Sdkdata {
         SdkDataFormat(args.CameraId, arg, cameraPolygons)
      }
@@ -336,6 +336,7 @@
                  }
               }
            }
            logger.Info("face标签的长度:",len(faces))
            //for _,face := range faces  {
            //   //logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
            //}
@@ -370,8 +371,8 @@
         }
      } else {
         // 结果为假时也要走,有时候为假的状态反转数据也需要记录下来
         //timeFlag := TimerAlarm(args, groupRule.GroupId, result.(bool))
         // 结果为假时也要走,有杀死定时器的操作
         TimerAlarm(&label, groupRule.GroupId, result.(bool))
         //fmt.Println(timeFlag)
         return false
      }
@@ -491,20 +492,22 @@
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               // 把数组里缓存的数据取出来一起报警
               label.LinkCache = []ResultMsg{}
               for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults {
                  label.LinkCache = append(label.LinkCache, ruleRes.CacheData)
               }
               logger.Debug("联动任务缓存了几个数据", len(label.LinkCache))
               for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++ {
                  if args.RuleResult["yolo"].([]Result)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上
                     args.RuleResult["yolo"].([]Result)[i].Others.LinkCache = label.LinkCache
               if TimeEleList[groupRule.GroupId] != nil {  // 极偶尔有情况会等于nil,不知道为啥,做个判断以防宕机
                  // 把数组里缓存的数据取出来一起报警
                  label.LinkCache = []ResultMsg{}
                  for _, ruleRes := range TimeEleList[groupRule.GroupId].RuleResults {
                     label.LinkCache = append(label.LinkCache, ruleRes.CacheData)
                  }
               }
               for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++ {
                  if args.RuleResult["face"].([]FaceResult)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上
                     args.RuleResult["face"].([]FaceResult)[i].Others.LinkCache = label.LinkCache
                  logger.Debug("联动任务缓存了几个数据", len(label.LinkCache))
                  for i := 0; i < len(args.RuleResult["yolo"].([]Result)); i++ {
                     if args.RuleResult["yolo"].([]Result)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上
                        args.RuleResult["yolo"].([]Result)[i].Others.LinkCache = label.LinkCache
                     }
                  }
                  for i := 0; i < len(args.RuleResult["face"].([]FaceResult)); i++ {
                     if args.RuleResult["face"].([]FaceResult)[i].RuleGroupId == groupRule.GroupId { // 把联动数据追加上
                        args.RuleResult["face"].([]FaceResult)[i].Others.LinkCache = label.LinkCache
                     }
                  }
               }
            }
@@ -542,24 +545,28 @@
      if rule.PolygonId == am.areaId { // 算法和区域都得对的上
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule"{
            //logger.Debug("当前小规则是:",rule)
            flag := "false"
            // 把没有相似者的人脸从filterData中删除
            for index := 0; index < len(am.filterData); {
               // 将达不到阈值的相似者从相似者数组中删除
               logger.Info("看看相似者人数:",len(am.filterData[index].Liker))
               if len(am.filterData[index].Liker) == 0 {
                  // Go 语言中切片删除元素的本质是:以被删除元素为分界点,将前后两个部分的内存重新连接起来。不用怀疑,数组删除元素就这么坑爹
                  am.filterData = append(am.filterData[:index], am.filterData[index+1:]...)
               } else {
                  index++
            if rule.RuleWithPre == "||" {
               return LittleRuleResult{}
            } else {
               //logger.Debug("当前小规则是:",rule)
               flag := "false"
               // 把没有相似者的人脸从filterData中删除
               for index := 0; index < len(am.filterData); {
                  // 将达不到阈值的相似者从相似者数组中删除
                  logger.Info("看看相似者人数:",len(am.filterData[index].Liker))
                  if len(am.filterData[index].Liker) == 0 {
                     // Go 语言中切片删除元素的本质是:以被删除元素为分界点,将前后两个部分的内存重新连接起来。不用怀疑,数组删除元素就这么坑爹
                     am.filterData = append(am.filterData[:index], am.filterData[index+1:]...)
                  } else {
                     index++
                  }
               }
               if len(am.filterData) > 0 {
                  flag = "true"
               }
               logger.Info("---------人脸比对符合条件的数量为:",len(am.filterData))
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort}
            }
            if len(am.filterData) > 0 {
               flag = "true"
            }
            logger.Info("---------人脸比对符合条件的数量为:",len(am.filterData))
            return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort}
         }
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" { // 人脸检测
            //logger.Debug("当前小规则是:",rule)
@@ -570,13 +577,14 @@
                  var args []*Arg
                  if rule.RuleWithPre == "&&" {
                     args = am.filterData
                     // 先清空过滤后的数据,再往里塞本次过滤后的数据
                     am.filterData = am.filterData[0:0]
                     //logger.Info("过滤后的args的长度为:",len(args))
                  } else {
                     args = am.args
                     //不清空之前的过滤数据,继续塞
                     //logger.Info("没过滤的args的长度为:",len(args))
                  }
                  // 先清空过滤后的数据,再往里塞本次过滤后的数据
                  am.filterData = am.filterData[0:0]
                  //logger.Info("-----------------------人脸过滤的args里的数量:", len(args))
                  for _, arg := range args {
                     var formula string