panlei
2019-07-22 8f3b9f0dcef90b84c1a3f0c7be71f484c6a84e2f
ruleserver/ruleToformula.go
@@ -101,6 +101,7 @@
      // 拿到本摄像机的区域
      cameraPolygons := GetPolygons(args.CameraId)
      // 把所有的sdk提取的数据都按所属摄像机的区域归置
      logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname)
      for _, arg := range args.Sdkdata {
         SdkDataFormat(args.CameraId, arg, cameraPolygons)
      }
@@ -111,18 +112,20 @@
      args.RuleResult = make(map[string]interface{})
      args.RuleResult["yolo"] = []Result{}
      args.RuleResult["face"] = []Arg{}
      for _, group := range taskGroup.GroupRules {
         //logger.Println("------------------------------任务规则:",taskRule)
         taskId := taskGroup.TaskId
         //logger.Println("------------本组任务下的规则组的数量:",len(ruleList))
         temp := group.Rules // temp为一组完整规则 在此需要判断规则是否是联动规则
         if len(temp) > 0 {
            if group.SetType == "linkTask" {
               // groupId中含有link则为联动任务
               LinkTask(args, group, taskId, message)
            } else {
               // 独立任务的处理
               RunRule(args, group, taskId, message)
      if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
         for _, group := range taskGroup.GroupRules {
            //logger.Println("------------------------------任务规则:",taskRule)
            taskId := taskGroup.TaskId
            //logger.Println("------------本组任务下的规则组的数量:",len(ruleList))
            temp := group.Rules // temp为一组完整规则 在此需要判断规则是否是联动规则
            if len(temp) > 0 {
               if group.SetType == "linkTask" {
                  // groupId中含有link则为联动任务
                  LinkTask(args, group, taskId, message)
               } else {
                  // 独立任务的处理
                  RunRule(args, group, taskId, message)
               }
            }
         }
      }
@@ -252,8 +255,8 @@
   }
   if completeFormula != "" {
      logger.Info("结果公式-----------:", completeFormula)
      expression, _ := govaluate.NewEvaluableExpression(completeFormula)
      if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") {
      expression, err := govaluate.NewEvaluableExpression(completeFormula)
      if strings.HasPrefix(completeFormula, "&&") || strings.HasPrefix(completeFormula, "||") || err != nil{
         panic("规则有误,得到的数学公式不可解析")
      }
      result, _ := expression.Evaluate(nil) // 得到数学公式的结果
@@ -448,24 +451,7 @@
      if rule.PolygonId == am.areaId { // 算法和区域都得对的上
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" && rule.SdkArgAlias != "compareBase" {
            argValue, err := strconv.ParseFloat(rule.SdkArgValue, 64)
            if err != nil {
               logger.Error("规则配置的阈值非法")
               return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
            }
            flag := "false"
            for _, obj := range am.filterData {
               for index := 0; index < len(obj.Liker); {
                  // 将达不到阈值的相似者从相似者数组中删除
                  logger.Debug("=======================相似值:", float64(obj.Liker[index].CompareScore*100))
                  if float64(obj.Liker[index].CompareScore*100) < argValue {
                     // Go 语言中切片删除元素的本质是:以被删除元素为分界点,将前后两个部分的内存重新连接起来。不用怀疑,数组删除元素就这么坑爹
                     obj.Liker = append(obj.Liker[:index], obj.Liker[index+1:]...)
                  } else {
                     index++
                  }
               }
            }
            // 把没有相似者的人脸从filterData中删除
            for index := 0; index < len(am.filterData); {
               // 将达不到阈值的相似者从相似者数组中删除