panlei
2019-07-30 c620c6eed928d0f308bee212c40ca67abde9baeb
ruleserver/ruleToformula.go
@@ -71,7 +71,7 @@
   CameraId   string
   TaskId     string
   Sdkdata    []*SdkData
   RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg, yolo: []Result, cacheData: SdkDatas, timeLabel: 0,1,2,3,4,5
   RuleResult map[string]interface{} // 过完规则后打的标签 face: []FaceResult, yolo: []Result, cacheData: SdkDatas, timeLabel: 0,1,2,3,4,5
}
type ResultMsg struct {
@@ -108,7 +108,7 @@
      // 拿到本摄像机的区域
      cameraPolygons := GetPolygons(args.CameraId)
      // 把所有的sdk提取的数据都按所属摄像机的区域归置
      logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname)
      //logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname)
      for _, arg := range args.Sdkdata {
         SdkDataFormat(args.CameraId, arg, cameraPolygons)
      }
@@ -119,6 +119,7 @@
      args.RuleResult = make(map[string]interface{})
      args.RuleResult["yolo"] = []Result{}
      args.RuleResult["face"] = []FaceResult{}
      //logger.Warn("传进去之前是什么德行:",args.RuleResult["yolo"])
      if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
         for _, group := range taskGroup.GroupRules {
            //logger.Println("------------------------------任务规则:",taskRule)
@@ -145,7 +146,8 @@
         logger.Error("比对规则有误", err.(string))
      }
   }()
   logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", *groupRule)
   logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", (*groupRule).GroupText)
   //logger.Warn("传进去之后是什么德行:",args.RuleResult["yolo"])
   Compare(args, groupRule)
   resultSplice := []*LittleRuleResult{}
   sdkNames := ""
@@ -160,9 +162,9 @@
         }
         ipcId := sdk.IpcId
         sdkName := sdk.SdkName
         logger.Info("规则的ipcId与sdkData的IpcId:", ipcId, "===", sdkData.IpcId)
         //logger.Info("规则的ipcId与sdkData的IpcId:", ipcId, "===", sdkData.IpcId)
         if ipcId == sdkData.IpcId {
            logger.Info("当前走的规则是--:", sdkName, "---","")
            //logger.Info("当前走的规则是--:", sdkName, "---","")
            for _, areaMap := range sdkData.AreaMapList {
               ruleResult := filterRule(groupRule.Rules[j], areaMap)
               if ruleResult.Result != "" {
@@ -281,9 +283,9 @@
               }
            }
         }
         for _,face := range faces  {
            logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
         }
         //for _,face := range faces  {
         //   //logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
         //}
         logger.Warn("___________________________________________________________________________终于走完万里长征")
         // 把他们的位置数据也传下去
         locations := []Rect{}
@@ -294,14 +296,14 @@
               }
            }
         }
         logger.Debug("------locations的内容:", locations)
         //logger.Debug("------locations的内容:", locations)
         if sdkNames != "" {
            args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId})
            logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result)))
            //logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result)))
         }
         if faceFlag {
            args.RuleResult["face"] = append(args.RuleResult["face"].([]FaceResult), FaceResult{Result{taskId, sdkNames, groupRule.GroupId,groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, polygonId},faces})
            logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
            //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
         }
         // 最后过持续时间等时间维度的条件   把时间规则位置调整到这个位置是为了缓存数据
         for j := 0; j < len(groupRule.Rules); j++ {
@@ -433,9 +435,9 @@
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.DefenceState,groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, ""})
               logger.Info("-------------------yolo结果标签有几个", len(args.RuleResult["yolo"].([]Result)))
               //logger.Info("-------------------yolo结果标签有几个", len(args.RuleResult["yolo"].([]Result)))
               if args.RuleResult["face"] != nil {
                  logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]Arg)))
                  //logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]FaceResult)))
               }
               //os.Exit(0)
            }
@@ -444,7 +446,7 @@
         logger.Warn("数组不圆满不打标签")
      }
   } else { // 没有报警,
      logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
      //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
      // 所以也要去结果数组里放值或更新
      for _, va := range timeEle.RuleResults {
         if args.CameraId != "" && va.CameraId == args.CameraId {
@@ -463,7 +465,7 @@
      if rule.PolygonId == am.areaId { // 算法和区域都得对的上
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" && rule.SdkArgAlias != "compareBase" {
            logger.Debug("当前小规则是:",rule)
            //logger.Debug("当前小规则是:",rule)
            flag := "false"
            // 把没有相似者的人脸从filterData中删除
            for index := 0; index < len(am.filterData); {
@@ -481,7 +483,7 @@
            return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + flag, rule.Sort}
         }
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" { // 人脸检测
            logger.Debug("当前小规则是:",rule)
            //logger.Debug("当前小规则是:",rule)
            if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" {
               // 如果是不规矩的连接符统统返回false 规则也只能判断人脸的相似度,所以不存在别的连接符
               if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
@@ -489,10 +491,10 @@
                  var args []*Arg
                  if rule.RuleWithPre == "&&" {
                     args = am.filterData
                     logger.Info("过滤后的args的长度为:",len(args))
                     //logger.Info("过滤后的args的长度为:",len(args))
                  } else {
                     args = am.args
                     logger.Info("没过滤的args的长度为:",len(args))
                     //logger.Info("没过滤的args的长度为:",len(args))
                  }
                  // 先清空过滤后的数据,再往里塞本次过滤后的数据
                  am.filterData = am.filterData[0:0]
@@ -518,7 +520,7 @@
                  am.targetNum = len(am.filterData) // 把符合条件的目标数量更新到targetNum字段
               }
               if am.targetNum > 0 {
                  logger.Info("!!!!!!!!!人脸检测成功")
                   logger.Info("!!!!!!!!!人脸检测成功")
                  return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "true", rule.Sort}
               } else {
                  return LittleRuleResult{am.sdkName, rule.RuleWithPre + "" + "false", rule.Sort}
@@ -544,7 +546,7 @@
            }
            // 先清空过滤后的数据,再往里塞本次过滤后的数据
            am.filterData = am.filterData[0:0]
            logger.Debug("看看args:::::", args)
            //logger.Debug("看看args:::::", args)
            for _, arg := range args {
               var formula string
               if rule.SdkArgAlias == "score" {
@@ -599,7 +601,7 @@
            timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, BufferFlag: 10, CacheSdkData: ResultMsg{message, args.RuleResult}} // 扔进去一个定时器元素(并缓存当前画面帧数据)
            //TimeEleList = make(map[string]timeElement)
            TimeEleList[groupId+" "+rule.Id] = &timeEle // 定时器元素以组规则id和当前持续时间小规则id为键
            logger.Info("创建了计数器并且计数器集合为:", TimeEleList)
            //logger.Info("创建了计数器并且计数器集合为:", TimeEleList)
         }
      }
   }
@@ -609,7 +611,7 @@
func transferParameters(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上
      if rule.SdkArgAlias == "objCount" { // 如果参数是要区域内目标数量 即yolo 人脸不会有数量
         logger.Info("当前小规则是:---------", rule)
         //logger.Info("当前小规则是:---------", rule)
         //logger.Info("得出结果阶段", "比较的规则是:", rule)
         if rule.Operator == "" {
            return LittleRuleResult{am.sdkName, strconv.Itoa(am.targetNum) + "" + rule.RuleWithPre, rule.Sort} // 如果后面不跟操作符就直接返回数量  比如要跟下一个区域比较数量的就直接返回本区域的数量
@@ -645,13 +647,13 @@
func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上
      if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规
         logger.Info("----------当前时间规则:---------", rule)
         //logger.Info("----------当前时间规则:---------", rule)
         // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组)
         //logger.Info("时间规则的测试")
         now := time.Now()
         index := getIndexOfWeek(now.Weekday().String())
         timeList := GetTimeById(rule.SdkArgValue, index)
         logger.Info("当天的时间段集合:----------", timeList)
         //logger.Info("当天的时间段集合:----------", timeList)
         //logger.Info("从数据库中查出的时间规则:", timeList)
         // 判断图片数据的时间是否符合当前规则 在一个即为true,全不在为false
@@ -678,12 +680,12 @@
            flag := "true"
            for _, timeSlot := range timeList {
               formula := "'" + timeSlot.Start + "'" + " < " + "'" + am.time + "'"
               logger.Info("-----------------时间规则不满足的公式start:", formula)
               //logger.Info("-----------------时间规则不满足的公式start:", formula)
               expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式
               result, _ := expression.Evaluate(nil)                      // 得到数学公式的结果
               formula1 := "'" + timeSlot.End + "'" + " > " + "'" + am.time + "'"
               logger.Info("-----------------时间规则不满足的公式end:", formula1)
               //logger.Info("-----------------时间规则不满足的公式end:", formula1)
               expression1, _ := govaluate.NewEvaluableExpression(formula1) // 得到数学公式
               result1, _ := expression1.Evaluate(nil)                      // 得到数学公式的结果
               if result.(bool) && result1.(bool) {