| | |
| | | args.RuleResult["face"] = []Arg{} |
| | | if len(taskRuleList) > 0 { |
| | | for _, taskRule := range taskRuleList { |
| | | //log.Println("------------------------------任务规则:",taskRule) |
| | | ruleList := taskRule.GroupRules // 获取的是task下面的任务组 |
| | | taskId := taskRule.TaskId |
| | | //log.Println("------------本组任务下的规则组的数量:",len(ruleList)) |
| | |
| | | if len(temp) > 0 { |
| | | if ruleList[i].SetType == "linkTask" { |
| | | // groupId中含有link则为联动任务 |
| | | linkTask(args, ruleList[i], taskId) |
| | | LinkTask(args, ruleList[i], taskId) |
| | | } else { |
| | | // 独立任务的处理 |
| | | RunRule(args, ruleList[i], taskId) |
| | |
| | | if err := recover(); err != nil { |
| | | fmt.Println("比对规则有误", err.(string)) |
| | | } |
| | | |
| | | }() |
| | | log.Println("+++++++++++规则开始运行+++++++++++++++++当前规则--:",*groupRule) |
| | | log.Println("+++++++++++规则开始运行+++++++++++++++++当前规则--:",(*groupRule).GroupText) |
| | | resultSplice := []*LittleRuleResult{} |
| | | // 先过完条件规则 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | |
| | | } |
| | | } |
| | | // 过完条件数据后把符合条件的人脸数据塞进结果标签里 |
| | | |
| | | faces := []Arg{} |
| | | for _, sdkData := range args.Sdkdata { |
| | | for _, areaMap := range sdkData.AreaMapList { |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | args.RuleResult["face"] = putFaceToResult(groupRule.Rules[j], &areaMap) |
| | | faces = append(faces,putFaceToResult(groupRule.Rules[j], &areaMap)...) |
| | | } |
| | | } |
| | | } |
| | | // 配了人脸的算法才把人脸的数据甩出来打标签 |
| | | flag := false |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a971" { |
| | | flag = true |
| | | } |
| | | } |
| | | if flag { |
| | | args.RuleResult["face"] = faces |
| | | } |
| | | // 再过其他数据 这步直接得到结果(真或假) 过目标数量 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | |
| | | } |
| | | } |
| | | if flag { |
| | | fmt.Println("----------------------------终于走完万里长征") |
| | | fmt.Println("___________________________________________________________________________终于走完万里长征") |
| | | // 如果成功了我应该找到规则中涉及到的sdk,记录下他们的sdkname |
| | | sdkName := "" |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | |
| | | } |
| | | if args.RuleResult["face"] != nil { |
| | | log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg)) |
| | | os.Exit(1) |
| | | } |
| | | return true |
| | | } else { |
| | |
| | | |
| | | func putFaceToResult(rule *protomsg.Rule, am *AreaMap) []Arg { |
| | | faces := []Arg{} |
| | | if rule.SdkId == am.sdkId { |
| | | if rule.SdkId == am.sdkId && rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a971"{ |
| | | if len(am.filterData) > 0 { |
| | | for _, data := range am.filterData { |
| | | log.Println("---------------------------------------------------------------------有这个data",data) |
| | | faces = append(faces, data) |
| | | } |
| | | } |
| | | } |
| | | log.Println("-----------------------------------------------听说你是空的?",faces) |
| | | //log.Println("-----------------------------------------------听说你是空的?",faces) |
| | | return faces |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // 联动任务的处理 |
| | | func linkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) { |
| | | func LinkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) { |
| | | // new一个定时器,如果以此groupId为标志的定时器不存在的话 |
| | | var flag bool = true |
| | | var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} |
| | |
| | | timeEle := TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} // 扔进去一个定时器元素 |
| | | //TimeEleList = make(map[string]timeElement) |
| | | TimeEleList[groupRule.GroupId] = &timeEle // 定时器元素以规则组id为键 |
| | | fmt.Println("创建了计数器并且计数器集合为:", TimeEleList) |
| | | fmt.Println("---------------------------------------------联动任务创建了计数器并且计数器集合为:", TimeEleList) |
| | | // 得出这组完整规则里涉及到几个摄像机,决定着数组里有几个结构体,去重添加方式 |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | var flag1 bool = true |
| | |
| | | expression, _ := govaluate.NewEvaluableExpression(completeFormula) |
| | | result, _ := expression.Evaluate(nil) // 得到数学公式的结果 |
| | | if result.(bool) { |
| | | log.Println("___________________________________________________________________联动任务报警") |
| | | sdkName := "" |
| | | for j := 0; j < len(groupRule.Rules); j++ { |
| | | for _, sdkData := range args.Sdkdata { |
| | | if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo { // 只记录yolo符合规则的sdk |
| | | sdkName = sdkName + "," + sdkData.SdkName |
| | | if groupRule.Rules[j].SdkId == sdkData.SdkId && sdkData.IsYolo && !strings.Contains(sdkName,sdkData.SdkName) { // 只记录yolo符合规则的sdk 同时要避免重复拼接 |
| | | sdkName = sdkData.SdkName + " " |
| | | } |
| | | } |
| | | } |
| | | // 过完规则后打个标签,告诉调用者本帧数据针对哪个任务哪组规则报警了 |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText}) |
| | | if sdkName != "" { |
| | | args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkName, groupRule.GroupId, groupRule.AlarmLevel, groupRule.GroupText}) |
| | | log.Println("-------------------yolo结果标签",args.RuleResult["yolo"].([]Result)) |
| | | } |
| | | if args.RuleResult["face"] != nil { |
| | | log.Println("-------------------face结果标签",args.RuleResult["face"].([]Arg)) |
| | | } |
| | | os.Exit(0) |
| | | } |
| | | } |
| | | } else { |