From 173ba382e4f383d7d5b72e4d58f8b576bc1762c7 Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期二, 20 八月 2019 14:31:22 +0800 Subject: [PATCH] 完善中间件 --- ruleserver/ruleToformula.go | 268 ++++++++++------------------------------------------- 1 files changed, 53 insertions(+), 215 deletions(-) diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go index 97bd829..caa42bf 100644 --- a/ruleserver/ruleToformula.go +++ b/ruleserver/ruleToformula.go @@ -1,6 +1,7 @@ package ruleserver import ( + "plugin" "ruleprocess/cache" "ruleprocess/logger" "ruleprocess/structure" @@ -63,7 +64,7 @@ } } -func RunRule(args *structure.SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label structure.Others) bool { +func RunRule1(args *structure.SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label structure.Others) bool { defer func() { if err := recover(); err != nil { logger.Error("姣斿瑙勫垯鏈夎", err) @@ -89,7 +90,8 @@ if ipcId == sdkData.IpcId { //logger.Info("褰撳墠璧扮殑瑙勫垯鏄�--锛�", sdkName, "---","") for _, areaMap := range sdkData.AreaMapList { - ruleResult := filterRule(groupRule.Rules[j], areaMap) + ruleResult := CallSo(sdk.Id,groupRule.Rules[j],areaMap) + //ruleResult := filterRule(groupRule.Rules[j], areaMap) if ruleResult.Result != "" { logger.Info("鏉′欢瑙勫垯缁撴灉锛�", ruleResult.Result) // 濡傛灉缁撴灉涓虹湡锛屾妸杩欐潯瑙勫垯涓殑鍖哄煙缃负鏈夋晥 @@ -110,67 +112,58 @@ } } } + return false +} - // 鍐嶈繃鍏朵粬鏁版嵁 杩欐鐩存帴寰楀埌缁撴灉锛堢湡鎴栧亣锛� 杩囩洰鏍囨暟閲� - for j := 0; j < len(groupRule.Rules); j++ { - for _, sdkData := range args.Sdkdata { - // 鏍规嵁瑙勫垯鐨剆dkId鏌ュ嚭鍏跺搴旂殑ipcId锛岀敤ipcId鍘绘壘璇ユ瘮瀵圭殑鏁版嵁 - sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) - if err != nil { - logger.Error("娌℃煡鍒皊dk鐨勪俊鎭�---", err) - } - ipcId := sdk.IpcId - sdkName := sdk.SdkName - if ipcId == sdkData.IpcId { - for _, areaMap := range sdkData.AreaMapList { - ruleResult := transferParameters(groupRule.Rules[j], areaMap) - if ruleResult.Result != "" { - if strings.Contains(ruleResult.Result, "true") { - areaMap.IsEffective = true - } - logger.Info("鏁伴噺瑙勫垯缁撴灉锛�", ruleResult.Result) - if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) { - sdkNames = sdkName + "," - } - if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) { - polygonId = groupRule.Rules[j].PolygonId + "," - } - resultSplice = append(resultSplice, &ruleResult) - } - } - } - } +func CallSo(sdkId string,rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult{ + // 鏍规嵁sdkId鏌ュ嚭鍏跺搴旂殑sdk鐨剆oName锛岃皟鐢ㄧ浉搴攕o鐨凟ntrance鏂规硶 + var soName = "" + if sdkId == "812b674b-2375-4589-919a-5c1c3278a97e" { + soName = "face.so" + } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a975"{ + soName = "intrusion.so" + } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a976" { + soName = "personUnsual.so" + } else if sdkId == "812b674b-2375-4589-919a-5c1c3278a972" { + soName = "faceCompare.so" } - // 杩欐杩囩殑鏄椂闂存瑙勫垯锛堟椂闂存绛夛級 - for j := 0; j < len(groupRule.Rules); j++ { - for _, sdkData := range args.Sdkdata { - sdk, err := cache.GetSdkById(groupRule.Rules[j].SdkId) - if err != nil { - logger.Error("娌℃煡鍒皊dk鐨勪俊鎭�---", err) - } - ipcId := sdk.IpcId - sdkName := sdk.SdkName - if ipcId == sdkData.IpcId { - for _, areaMap := range sdkData.AreaMapList { - ruleResult := timeRuleResult(groupRule.Rules[j], areaMap) - if ruleResult.Result != "" { - if strings.Contains(ruleResult.Result, "true") { - areaMap.IsEffective = true - } - logger.Info("鏃堕棿瑙勫垯缁撴灉锛�", ruleResult.Result) - if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(sdkNames, sdkName) { - sdkNames = sdkName + "," - } - if strings.Contains(ruleResult.Result, "true") && ipcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && !strings.Contains(polygonId, groupRule.Rules[j].PolygonId) { - polygonId = groupRule.Rules[j].PolygonId + "," - } - resultSplice = append(resultSplice, &ruleResult) - } - } - } - } + p,err := plugin.Open("./algorithm/"+soName) + if err != nil { + panic(err) } + f,err1 := p.Lookup("Entrance") + if err1 != nil { + panic("娌℃湁鎵惧埌鍏ュ彛鍑芥暟") + } + ruleResult := f.(func(rule *protomsg.Rule, am *structure.AreaMap)structure.LittleRuleResult)(rule,am) + return ruleResult +} +func CallMiddleware(args *structure.SdkDatas,rule protomsg.GroupRule) ([]*structure.LittleRuleResult, string, string){ + p,err := plugin.Open("./algorithm/middleware.so") + if err != nil { + panic(err) + } + f,err1 := p.Lookup("Entrance") + if err1 != nil { + panic("娌℃湁鎵惧埌涓棿浠跺叆鍙e嚱鏁�") + } + a,b,c := f.(func(args *structure.SdkDatas,rule protomsg.GroupRule)([]*structure.LittleRuleResult, string, string))(args,rule) + return a,b,c +} +func RunRule(args *structure.SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label structure.Others) bool { + defer func() { + if err := recover(); err != nil { + logger.Error("姣斿瑙勫垯鏈夎", err) + } + }() + logger.Info("+++++++++++瑙勫垯寮�濮嬭繍琛�+++++++++++++++++褰撳墠澶ц鍒�--锛�", (*groupRule).GroupText) + //logger.Warn("浼犺繘鍘讳箣鍚庢槸浠�涔堝痉琛岋細",args.RuleResult["yolo"]) + Compare(args, groupRule) + resultSplice := []*structure.LittleRuleResult{} + sdkNames := "" + polygonId := "" + resultSplice,sdkNames,polygonId = CallMiddleware(args,*groupRule) // 灏嗘暟缁勬寜sort鎺掑簭 sort.Sort(resultList(resultSplice)) // 鎺掑簭鍚庡彇鍚勮嚜鐨勭粨鏋滃拰杩炴帴绗︽嫾鍑鸿鍒欒〃杈惧紡寰楀嚭缁撴灉 @@ -273,7 +266,7 @@ } else { // 缁撴灉涓哄亣鏃朵篃瑕佽蛋锛屾湁鏃跺�欎负鍋囩殑鐘舵�佸弽杞暟鎹篃闇�瑕佽褰曚笅鏉� - //timeFlag := TimerAlarm(args, groupRule.GroupId, result.(bool)) + TimerAlarm(&label, groupRule.GroupId, result.(bool)) //fmt.Println(timeFlag) return false } @@ -438,136 +431,6 @@ } } -// 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲� -func filterRule(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { - if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" { - // 澶勭悊鐨勬槸浜鸿劯绠楁硶 濡傛灉杩欐潯瑙勫垯閰嶇疆鐨勬槸浜鸿劯绠楁硶锛岃繃婊ゅ畬鏉′欢涔嬪悗鐩存帴寰楀嚭缁撴灉锛屽洜涓鸿偗瀹氭病鏈夋暟閲忔潯浠讹紝鑷繁鎷兼帴 - //logger.Info("瑙勫垯鐨勭畻娉昳d鍜屽尯鍩熺殑绠楁硶id锛�", rule.SdkId, "===", am.sdkId) - if rule.PolygonId == am.AreaId { // 绠楁硶鍜屽尯鍩熼兘寰楀鐨勪笂 - - if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a972" && rule.SdkArgAlias != "time_rule" { - //logger.Debug("褰撳墠灏忚鍒欐槸锛�",rule) - flag := "false" - // 鎶婃病鏈夌浉浼艰�呯殑浜鸿劯浠巉ilterData涓垹闄� - for index := 0; index < len(am.FilterData); { - // 灏嗚揪涓嶅埌闃堝�肩殑鐩镐技鑰呬粠鐩镐技鑰呮暟缁勪腑鍒犻櫎 - logger.Info("鐪嬬湅鐩镐技鑰呬汉鏁帮細", len(am.FilterData[index].Liker)) - if len(am.FilterData[index].Liker) == 0 { - // Go 璇█涓垏鐗囧垹闄ゅ厓绱犵殑鏈川鏄細浠ヨ鍒犻櫎鍏冪礌涓哄垎鐣岀偣锛屽皢鍓嶅悗涓や釜閮ㄥ垎鐨勫唴瀛橀噸鏂拌繛鎺ヨ捣鏉ャ�備笉鐢ㄦ��鐤戯紝鏁扮粍鍒犻櫎鍏冪礌灏辫繖涔堝潙鐖� - am.FilterData = append(am.FilterData[:index], am.FilterData[index+1:]...) - } else { - index++ - } - } - if len(am.FilterData) > 0 { - flag = "true" - } - logger.Info("---------浜鸿劯姣斿绗﹀悎鏉′欢鐨勬暟閲忎负锛�", len(am.FilterData)) - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + flag, rule.Sort} - } - if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" { // 浜鸿劯妫�娴� - //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" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� - logger.Info("-----------------------杩囪鍒欎箣鍓嶅尯鍩熷唴鐨勪汉鑴告暟閲忎负锛�", am.TargetNum) - var args []*structure.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] - //logger.Info("-----------------------浜鸿劯杩囨护鐨刟rgs閲岀殑鏁伴噺锛�", len(args)) - for _, arg := range args { - var formula string - if rule.SdkArgAlias == "score" { - formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠鐩镐技搴﹀皬鍏紡锛�", formula) - } else if rule.SdkArgAlias == "proportion" { - formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠鍗犳瘮灏忓叕寮忥細", formula) - } else { - formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠灏哄灏忓叕寮忥細", formula) - } - expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 - result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� - if result.(bool) { - am.FilterData = append(am.FilterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� - } - } - am.TargetNum = len(am.FilterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 - logger.Info("杩囧畬鏉′欢鍚庣殑鐩爣鏁伴噺涓猴細", am.TargetNum) - if am.TargetNum > 0 { - logger.Info("锛侊紒锛侊紒锛侊紒锛侊紒锛佷汉鑴告娴嬫垚鍔�") - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} - } else { - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} - } - } else { - return structure.LittleRuleResult{} - } - } else { - return structure.LittleRuleResult{} - } - } else { - return structure.LittleRuleResult{} - } - } else { - return structure.LittleRuleResult{} - } - } else { - // 澶勭悊鐨勯兘鏄痽olo鏁版嵁 - if rule.PolygonId == am.AreaId { // 棣栧厛杩欐潯瑙勫垯寰楁槸杩欎釜绠楁硶鐨勮鍒欙紝鍏舵瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� - if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� - var args []*structure.Arg - if rule.RuleWithPre == "&&" { - args = am.FilterData - } else { - args = am.Args - } - // 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁 - am.FilterData = am.FilterData[0:0] - //logger.Debug("鐪嬬湅args锛氾細锛氾細锛�", args) - for _, arg := range args { - var formula string - if rule.SdkArgAlias == "score" { - formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠鐩镐技搴﹀皬鍏紡锛�", formula) - } else if rule.SdkArgAlias == "proportion" { - formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠鍗犳瘮灏忓叕寮忥細", formula) - } else { - formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠灏哄灏忓叕寮忥細", formula) - } - expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 - result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� - if result.(bool) { - am.FilterData = append(am.FilterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� - } - } - am.TargetNum = len(am.FilterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 - if am.TargetNum > 0 { - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} - } else { - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} - } - - } else { - return structure.LittleRuleResult{} - } - - } else { - return structure.LittleRuleResult{} - } - } -} - // 濡傛灉鏈夋寔缁椂闂存潯浠剁淮鎶ゅ紑鍚竴涓畾鏃跺櫒 func duration(rule *protomsg.Rule, groupId string, am *structure.AreaMap, args *structure.SdkDatas, message *protomsg.SdkMessage) { if rule.PolygonId == am.AreaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� 閰嶇疆鐨勭畻娉曡瀵圭殑涓� @@ -593,31 +456,6 @@ } } -// 缁欐暟鎹簱鐨勮鍒欒〃杈惧紡浠e弬 args: 涓�鏉″瓙瑙勫垯锛屽尯鍩熸暟鎹� -func transferParameters(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { - if rule.PolygonId == am.AreaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� - if rule.SdkArgAlias == "objCount" { // 濡傛灉鍙傛暟鏄鍖哄煙鍐呯洰鏍囨暟閲� 鍗硑olo 浜鸿劯涓嶄細鏈夋暟閲� - //logger.Info("褰撳墠灏忚鍒欐槸锛�---------", rule) - //logger.Info("寰楀嚭缁撴灉闃舵", "姣旇緝鐨勮鍒欐槸锛�", rule) - if rule.Operator == "" { - return structure.LittleRuleResult{am.SdkName, strconv.Itoa(am.TargetNum) + "" + rule.RuleWithPre, rule.Sort} // 濡傛灉鍚庨潰涓嶈窡鎿嶄綔绗﹀氨鐩存帴杩斿洖鏁伴噺 姣斿瑕佽窡涓嬩竴涓尯鍩熸瘮杈冩暟閲忕殑灏辩洿鎺ヨ繑鍥炴湰鍖哄煙鐨勬暟閲� - } - //args := am.targetNum targetNum 宸叉垚鎵�鏈夌洰鏍囩殑鎬绘暟閲忥紝杩欓噷鍙畻yolo鐨� - var num int = 0 - for _, data := range am.FilterData { - if data.IsYolo { - num++ - } - } - formula := strconv.Itoa(num) + " " + rule.Operator + " " + rule.SdkArgValue - expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 - result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + " " + strconv.FormatBool(result.(bool)), rule.Sort} - // 鍔犱笂鍏充簬绠楁硶鐨勫垽鏂潯浠讹紝涓嶈兘鍙湁鍏充簬瑙勫垯鐨勶紝鏈夌殑绠楁硶鏈韩灏辨槸涓�涓鍒欙紝濡備釜浣撻潤姝紝闈犲彸琛�,鎵�浠ワ紝鎷垮埌褰撳墠瀛愯鍒欑殑sdkid鏉ュ垽鏂槸鍚︽槸閭d簺鐗规畩鐨勮鍒� - } - } - return structure.LittleRuleResult{} -} func timeRuleResult(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { if rule.PolygonId == am.AreaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� if rule.SdkArgAlias == "time_rule" { // 鍒ゆ柇鏄惁绗﹀悎鏃堕棿瑙� -- Gitblit v1.8.0