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