panlei
2019-07-22 ebab43a9b4b58be926f421cab3aae36af02ef994
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,7 +112,7 @@
      args.RuleResult = make(map[string]interface{})
      args.RuleResult["yolo"] = []Result{}
      args.RuleResult["face"] = []Arg{}
      if len(taskGroup.GroupRules) > 0 {
      if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
         for _, group := range taskGroup.GroupRules {
            //logger.Println("------------------------------任务规则:",taskRule)
            taskId := taskGroup.TaskId
@@ -254,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) // 得到数学公式的结果
@@ -450,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); {
               // 将达不到阈值的相似者从相似者数组中删除
@@ -608,7 +592,7 @@
// 给数据库的规则表达式代参 args: 一条子规则,区域数据
func transferParameters(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上
      if rule.SdkArgAlias == "targetNum" { // 如果参数是要区域内目标数量 即yolo 人脸不会有数量
      if rule.SdkArgAlias == "objCount" { // 如果参数是要区域内目标数量 即yolo 人脸不会有数量
         //logger.Info("得出结果阶段", "比较的规则是:", rule)
         if rule.Operator == "" {
            return LittleRuleResult{am.sdkName, strconv.Itoa(am.targetNum) + "" + rule.RuleWithPre, rule.Sort} // 如果后面不跟操作符就直接返回数量  比如要跟下一个区域比较数量的就直接返回本区域的数量
@@ -623,7 +607,7 @@
         formula := strconv.Itoa(num) + " " + rule.Operator + " " + rule.SdkArgValue
         expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式
         result, _ := expression.Evaluate(nil)                      // 得到数学公式的结果
         return LittleRuleResult{am.sdkName, strconv.FormatBool(result.(bool)) + "" + rule.RuleWithPre, rule.Sort}
         return LittleRuleResult{am.sdkName, rule.RuleWithPre + " " + strconv.FormatBool(result.(bool)), rule.Sort}
         // 加上关于算法的判断条件,不能只有关于规则的,有的算法本身就是一个规则,如个体静止,靠右行,所以,拿到当前子规则的sdkid来判断是否是那些特殊的规则
      } else if rule.SdkId == "IsStatic" { // 静止算法
         if am.isStatic {