---
panlei
2019-07-12 7f27fef93bd62eb1367a43430fee594cf33eb54e
ruleserver/ruleToformula.go
@@ -122,7 +122,7 @@
type SdkDatas struct {
   CameraId   string
   Sdkdata    []*SdkData
   RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg  yolo: []Result
   RuleResult map[string]interface{} // 过完规则后打的标签 face: []Arg  yolo: []Result cacheData: SdkDatas
}
// 将传递过来的参数转化为
@@ -166,7 +166,7 @@
func GetPolygons(cameraId string) []protomsg.CameraPolygon {
   var cameraPolygons []protomsg.CameraPolygon
   cameraPolygons = cache.GetPolygonsByCameraId(cameraId)
   logger.Debug("------=======查看下全部区域:",cameraPolygons)
   return cameraPolygons
}
@@ -470,6 +470,7 @@
               }
            }
         }
         //TimerAlarm(args,groupRule.GroupId)
         if flag {
            // 最后成功报警才把符合条件的人脸数据塞进结果标签里
            // 配了人脸的算法才把人脸的数据甩出来打标签
@@ -500,6 +501,7 @@
                  }
               }
            }
            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})
               logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result)))
@@ -516,14 +518,15 @@
      return false
   }
}
func TimerAlarm(groupId string) (int) {
   var flagTime int = 0
func TimerAlarm(args SdkDatas,groupId string) (int) {
   var flagTime int = 0  // 为0的意思是
   for k, timeEle := range TimeEleList {
      if strings.Contains(k, groupId) {
         if timeEle.N == 0 && !timeEle.AlarmFlag { // 这组规则的定时器要全部等于0   暂且认为一组规则只有一个定时器
            logger.Info("———————————-------------首次符合持续时间规则并报警")
            flagTime = 1
            timeEle.AlarmFlag = true
            args.RuleResult["cacheData"] = timeEle.CacheSdkData
         }
         if timeEle.N == 0 && timeEle.AlarmFlag {
            logger.Info("-------------------------符合持续时间规则但并不是首次,不报警")
@@ -588,7 +591,8 @@
// 将字符串格式的坐标序列化为Point格式
func Json2points(areaPoints string) []Point {
   var pts []Point
   if areaPoints == "" {
   if areaPoints == "[]" {
      logger.Error("=====================此区域为全部区域")
      pts = append(pts, Point{0, 0})
      pts = append(pts, Point{0, 540})
      pts = append(pts, Point{960, 540})
@@ -703,8 +707,7 @@
      //logger.Info("规则的算法id和区域的算法id:", rule.SdkId, "===", am.sdkId)
      if rule.PolygonId == am.areaId { // 算法和区域都得对的上
         if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" {
            // 只需要过滤阈值,过滤完后数组长度大于0即为报警
         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("规则配置的阈值非法")
@@ -714,7 +717,7 @@
            for _, obj := range am.filterData {
               for index := 0; index < len(obj.Liker); {
                  // 将达不到阈值的相似者从相似者数组中删除
                  logger.Warn("=======================相似值:", float64(obj.Liker[index].CompareScore*100))
                  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:]...)
@@ -742,7 +745,7 @@
            if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" {
               // 如果是不规矩的连接符统统返回false 规则也只能判断人脸的相似度,所以不存在别的连接符
               if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加
                  logger.Info("---------------------------终于等到你")
                  //logger.Info("---------------------------终于等到你")
                  var args []*Arg
                  if rule.RuleWithPre == "&&" {
                     args = am.filterData
@@ -751,7 +754,7 @@
                  }
                  // 先清空过滤后的数据,再往里塞本次过滤后的数据
                  am.filterData = am.filterData[0:0]
                  logger.Info("-----------------------人脸过滤的args里的数量:", len(args))
                  //logger.Info("-----------------------人脸过滤的args里的数量:", len(args))
                  for _, arg := range args {
                     var formula string
                     if rule.SdkArgAlias == "score" {