| | |
| | | linkTask(args, ruleList[i], taskId) |
| | | } else { |
| | | // 独立任务的处理 |
| | | log.Println("----------------------------------------64摄像机入关") |
| | | RunRule(args, ruleList[i], taskId) |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) bool { |
| | | defer func() { |
| | | if err := recover(); err != nil { |
| | | fmt.Println("比对规则有误", err.(string)) |
| | | } |
| | | |
| | | }() |
| | | resultSplice := []*LittleRuleResult{} |
| | | // 先过完条件规则 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | |
| | | if completeFormula != "" { |
| | | log.Println("看看公式-----------:", completeFormula) |
| | | expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) { |
| | | if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||"){ |
| | | panic("规则有误,得到的数学公式不可解析") |
| | | } |
| | | result,_ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if !result.(bool) { |
| | | // 给这帧数据打上规则组标签 |
| | | //args.RuleResult = append(args.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId}) |
| | | for k, timeEle := range TimeEleList { |
| | |
| | | for k, timeEle := range TimeEleList { |
| | | if strings.Contains(k, taskId) { |
| | | if timeEle.N != 0 { // 跟这个任务有关的定时器要全部等于0 |
| | | log.Println("———————————-------------不冤,你是被定时器打败的:") |
| | | flag = false |
| | | } |
| | | } |
| | |
| | | func filterRule(rule *protomsg.Rule, am *AreaMap) LittleRuleResult { |
| | | if rule.SdkId == "FaceDetect" || rule.SdkId == "FaceCompare" { |
| | | // 处理的是人脸算法 如果这条规则配置的是人脸算法,过滤完条件之后直接得出结果,因为肯定没有数量条件,自己拼接 |
| | | log.Println("------------------------------------------还能进这儿了不成???") |
| | | if rule.SdkId == am.sdkId && rule.PolygonId == am.areaId { // 算法和区域都得对的上 |
| | | |
| | | if rule.SdkId == "FaceCompare" { |
| | |
| | | // 处理的都是yolo数据 |
| | | if rule.SdkId == am.sdkId && rule.PolygonId == am.areaId { // 首先这条规则得是这个算法的规则,其次规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加 |
| | | log.Println("----------当前条件规则:---------",rule) |
| | | var args []Arg |
| | | if rule.RuleWithPre == "&&" { |
| | | args = am.filterData |
| | |
| | | var formula string |
| | | if rule.SdkArgAlias == "score" { |
| | | formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前相似度小公式:",formula) |
| | | } else if rule.SdkArgAlias == "proportion" { |
| | | formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前占比小公式:",formula) |
| | | } else { |
| | | formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 得到字符串公式 |
| | | log.Println("当前尺寸小公式:",formula) |
| | | } |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult { |
| | | if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上 |
| | | if rule.SdkArgAlias == "time_rule" { // 判断是否符合时间规则 |
| | | log.Println("----------当前时间规则:---------",rule) |
| | | // 根据放值字段里存的时间规则的id去另一个表里查需要比对的时间段(比如当前时间是周三,应根据区域id查出其周三的几个布防时间段,数组) |
| | | //fmt.Println("时间规则的测试") |
| | | now := time.Now() |
| | | index := getIndexOfWeek(now.Weekday().String()) |
| | | timeList := GetTimeById(rule.SdkArgValue, index) |
| | | log.Println("当天的时间规则:----------",timeList) |
| | | //fmt.Println("从数据库中查出的时间规则:", timeList) |
| | | // 判断图片数据的时间是否符合当前规则 在一个即为true,全不在为false |
| | | flag := "false" |
| | | for _, timeSlot := range timeList { |
| | | if rule.Operator == "satisfy" { // 满足所选的时间规则 |
| | | if rule.Operator == "satisfy" || rule.Operator == "=="{ // 满足所选的时间规则 |
| | | formula := "'" + timeSlot.Start + "'" + "<" + "'" + am.time + "'" |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | |
| | | break |
| | | } |
| | | } |
| | | if rule.Operator == "unsatisfy" { // 不满足所选的时间规则 |
| | | if rule.Operator == "unsatisfy" || rule.Operator == "!="{ // 不满足所选的时间规则 |
| | | formula := timeSlot.Start + "<" + am.time |
| | | expression, _ := govaluate.NewEvaluableExpression(formula) // 得到数学公式 |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |