---
panlei
2019-07-03 8cd86e6e9c5283885d780a35b7f044cc31331340
ruleserver/ruleToformula.go
@@ -4,7 +4,6 @@
   "encoding/json"
   "fmt"
   "log"
   "os"
   "ruleprocess/cache"
   "sort"
   "strconv"
@@ -216,7 +215,7 @@
               if len(temp) > 0 {
                  if ruleList[i].SetType == "linkTask" {
                     // groupId中含有link则为联动任务
                     linkTask(args, ruleList[i], taskId)
                     LinkTask(args, ruleList[i], taskId)
                  } else {
                     // 独立任务的处理
                     RunRule(args, ruleList[i], taskId)
@@ -234,7 +233,7 @@
      }
   }()
   log.Println("+++++++++++规则开始运行+++++++++++++++++当前规则--:",*groupRule)
   log.Println("+++++++++++规则开始运行+++++++++++++++++当前规则--:",(*groupRule).GroupText)
   resultSplice := []*LittleRuleResult{}
   // 先过完条件规则
   for j := 0; j < len(groupRule.Rules); j++ {
@@ -253,9 +252,19 @@
   for _, sdkData := range args.Sdkdata {
      for _, areaMap := range sdkData.AreaMapList {
         for j := 0; j < len(groupRule.Rules); j++ {
            args.RuleResult["face"] = putFaceToResult(groupRule.Rules[j], &areaMap, faces)
            faces = append(faces,putFaceToResult(groupRule.Rules[j], &areaMap)...)
         }
      }
   }
   // 配了人脸的算法才把人脸的数据甩出来打标签
   flag := false
   for j := 0; j < len(groupRule.Rules); j++ {
      if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a971" {
         flag = true
      }
   }
   if flag {
      args.RuleResult["face"] = faces
   }
   // 再过其他数据 这步直接得到结果(真或假) 过目标数量
   for j := 0; j < len(groupRule.Rules); j++ {
@@ -324,7 +333,7 @@
            }
         }
         if flag {
            fmt.Println("----------------------------终于走完万里长征")
            fmt.Println("___________________________________________________________________________终于走完万里长征")
            // 如果成功了我应该找到规则中涉及到的sdk,记录下他们的sdkname
            sdkName := ""
            for j := 0; j < len(groupRule.Rules); j++ {
@@ -338,9 +347,8 @@
               args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
               log.Println("-------------------yolo结果标签",args.RuleResult["yolo"].([]Result))
            }
            if args.RuleResult["faces"] != nil {
               log.Println("-------------------face结果标签",args.RuleResult["faces"].([]Arg))
               os.Exit(1)
            if args.RuleResult["face"] != nil {
               log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg))
            }
            return true
         } else {
@@ -352,15 +360,16 @@
   }
}
func putFaceToResult(rule *protomsg.Rule, am *AreaMap, faces []Arg) []Arg {
   if rule.SdkId == am.sdkId {
func putFaceToResult(rule *protomsg.Rule, am *AreaMap) []Arg {
   faces := []Arg{}
   if rule.SdkId == am.sdkId && rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a971"{
      if len(am.filterData) > 0 {
         for _, data := range am.filterData {
            log.Println("---------------------------------------------------------------------有这个data")
            faces = append(faces, data)
         }
      }
   }
   //log.Println("-----------------------------------------------听说你是空的?",faces)
   return faces
}
@@ -436,7 +445,7 @@
}
// 联动任务的处理
func linkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) {
func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) {
   // new一个定时器,如果以此groupId为标志的定时器不存在的话
   var flag bool = true
   var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId}
@@ -450,7 +459,7 @@
      timeEle := TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} // 扔进去一个定时器元素
      //TimeEleList = make(map[string]timeElement)
      TimeEleList[groupRule.GroupId] = &timeEle // 定时器元素以规则组id为键
      fmt.Println("创建了计数器并且计数器集合为:", TimeEleList)
      fmt.Println("---------------------------------------------联动任务创建了计数器并且计数器集合为:", TimeEleList)
      // 得出这组完整规则里涉及到几个摄像机,决定着数组里有几个结构体,去重添加方式
      for j := 0; j < len(groupRule.Rules); j++ {
         var flag1 bool = true
@@ -494,16 +503,22 @@
            expression, _ := govaluate.NewEvaluableExpression(completeFormula)
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               log.Println("___________________________________________________________________联动任务报警")
               sdkName := ""
               for j := 0; j < len(groupRule.Rules); j++ {
                  for _, sdkData := range args.Sdkdata {
                     if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo { // 只记录yolo符合规则的sdk
                        sdkName = sdkName + "," + sdkData.SdkName
                     if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo && !strings.Contains(sdkName,sdkData.SdkName) { // 只记录yolo符合规则的sdk 同时要避免重复拼接
                        sdkName = sdkData.SdkName + " "
                     }
                  }
               }
               // 过完规则后打个标签,告诉调用者本帧数据针对哪个任务哪组规则报警了
               args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
               if sdkName != "" {
                  args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText})
                  log.Println("-------------------yolo结果标签",args.RuleResult["yolo"].([]Result))
               }
               if args.RuleResult["face"] != nil {
                  log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg))
               }
            }
         }
      } else {