---
panlei
2019-07-29 24dc42c206e65bdd646eee187a36142a420c96b9
ruleserver/ruleToformula.go
@@ -84,10 +84,17 @@
   TaskId       string // 任务id
   SdkName      string
   RuleGroupId  string // 规则组id
   DefenceState bool   //是否布防
   AlarmLevel   int32  // 报警等级
   RuleText     string // 文字版规则组
   Location     []Rect // 目标的坐标
   AlarmPolygon string // 触发的报警框
}
// 过规则库打上的标签
type FaceResult struct {
   Result
   Args         []Arg
}
type LittleRuleResult struct {
   SdkName string // 记录下此结果是哪个sdk的结果
@@ -111,7 +118,7 @@
      // 得到属于该摄像机的若干组任务的完整规则(跟每一条完整规则比较之后得出本张图像对于某个规则是否报警的结果。放进map,比如本帧图像的id,所碰撞成功的规则id)
      args.RuleResult = make(map[string]interface{})
      args.RuleResult["yolo"] = []Result{}
      args.RuleResult["face"] = []Arg{}
      args.RuleResult["face"] = []FaceResult{}
      if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
         for _, group := range taskGroup.GroupRules {
            //logger.Println("------------------------------任务规则:",taskRule)
@@ -274,8 +281,8 @@
               }
            }
         }
         if faceFlag {
            args.RuleResult["face"] = faces
         for _,face := range faces  {
            logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
         }
         logger.Warn("___________________________________________________________________________终于走完万里长征")
         // 把他们的位置数据也传下去
@@ -289,11 +296,12 @@
         }
         logger.Debug("------locations的内容:", locations)
         if sdkNames != "" {
            args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId})
            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)))
         }
         if args.RuleResult["face"] != nil {
            logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]Arg)))
         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)))
         }
         // 最后过持续时间等时间维度的条件   把时间规则位置调整到这个位置是为了缓存数据
         for j := 0; j < len(groupRule.Rules); j++ {
@@ -416,7 +424,7 @@
            result, _ := expression.Evaluate(nil) // 得到数学公式的结果
            if result.(bool) {
               logger.Info("___________________________________________________________________联动任务报警")
               args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, "", groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText, []Rect{}, ""})
               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)))
               if args.RuleResult["face"] != nil {
                  logger.Info("-------------------face结果标签有几个", len(args.RuleResult["face"].([]Arg)))
@@ -473,8 +481,10 @@
                  var args []*Arg
                  if rule.RuleWithPre == "&&" {
                     args = am.filterData
                     logger.Info("过滤后的args的长度为:",len(args))
                  } else {
                     args = am.args
                     logger.Info("没过滤的args的长度为:",len(args))
                  }
                  // 先清空过滤后的数据,再往里塞本次过滤后的数据
                  am.filterData = am.filterData[0:0]
@@ -518,7 +528,6 @@
      // 处理的都是yolo数据
      if rule.PolygonId == am.areaId { // 首先这条规则得是这个算法的规则,其次规则所对应的区域id要跟区域数据的id对的上
         if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
            logger.Info("当前小规则是:---------", rule)
            var args []*Arg
            if rule.RuleWithPre == "&&" {
               args = am.filterData
@@ -581,7 +590,7 @@
            timeLength, _ := strconv.Atoi(rule.SdkArgValue)
            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为键
            TimeEleList[groupId+" "+rule.Id] = &timeEle // 定时器元素以组规则id和当前持续时间小规则id为键
            logger.Info("创建了计数器并且计数器集合为:", TimeEleList)
         }
      }
@@ -591,8 +600,8 @@
// 给数据库的规则表达式代参 args: 一条子规则,区域数据
func transferParameters(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上
      logger.Info("当前小规则是:---------", rule)
      if rule.SdkArgAlias == "objCount" { // 如果参数是要区域内目标数量 即yolo 人脸不会有数量
         logger.Info("当前小规则是:---------", rule)
         //logger.Info("得出结果阶段", "比较的规则是:", rule)
         if rule.Operator == "" {
            return LittleRuleResult{am.sdkName, strconv.Itoa(am.targetNum) + "" + rule.RuleWithPre, rule.Sort} // 如果后面不跟操作符就直接返回数量  比如要跟下一个区域比较数量的就直接返回本区域的数量
@@ -627,8 +636,7 @@
}
func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult {
   if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上
      logger.Info("当前小规则是:---------", rule)
      if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规则
      if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规
         logger.Info("----------当前时间规则:---------", rule)
         // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组)
         //logger.Info("时间规则的测试")