From f11969d42d9b3ec2413950a95004299dcf334884 Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期五, 01 十一月 2019 19:47:32 +0800 Subject: [PATCH] 用结构体标记chan --- labelFilter/ruleForLabel.go | 302 ++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 216 insertions(+), 86 deletions(-) diff --git a/labelFilter/ruleForLabel.go b/labelFilter/ruleForLabel.go index 2b31dcf..f00f31b 100644 --- a/labelFilter/ruleForLabel.go +++ b/labelFilter/ruleForLabel.go @@ -3,35 +3,44 @@ import ( "basic.com/dbapi.git" "basic.com/pubsub/protomsg.git" + "basic.com/valib/logger.git" "github.com/knetic/govaluate" - "os" - "ruleprocess/logger" - "ruleprocess/ruleserver" + "ruleprocess/structure" "strconv" "time" ) -func Judge(result ruleserver.ResultMsg){ +func PushSomthing(msg structure.ResultMsg) { + defer func() { + if err := recover(); err != nil { + logger.Error("浜嬩欢鎺ㄩ�佹ā鍧楀効鐨勫紓甯告崟鑾凤細",err) + } + }() + // 瑁呴厤鎴愯嚜宸卞彲浠ヨ瘑鍒殑鏁版嵁 label := new(Label) - label.DataFormatToLabel(result) - logger.Info("label鐨勪俊鎭細",label.CameraName,label.DefenceLevel,label.Time) + label.DataFormatToLabel(msg) + logger.Info("label鐨勪俊鎭細", label.CameraName, label.DefenceLevel, label.Time) if label.CameraName == "" { logger.Error("鏃犳晥鏁版嵁锛岀洿鎺ヨ繑鍥�") return } //鎷垮埌鎵�鏈夎鍒欑粍 var api dbapi.EventPushApi - b,allRules := api.FindAllDetails() - logger.Info("鏌ョ湅鎵�鏈夎鍒欑粍锛�",allRules) + b, allRules := api.FindAllDetails() + logger.Info("鏌ョ湅鎵�鏈夎鍒欑粍锛�", allRules) if !b { logger.Error("鏌ヨ鏃堕棿鎺ㄩ�佽鍒欏け璐ワ紒") } //閬嶅巻鎵�鏈夌殑瑙勫垯缁勶紝鐪嬬湅绗﹀悎鍝釜瑙勫垯缁勶紝灏辨妸鏁版嵁鎻掑叆鍒板摢涓鍒欑粍鐨勭洰鏍囨満鍣ㄤ笂 - for _,ruleGroup := range allRules { - if ruleGroup.Enable { // 澶ц鍒欏紑鍏冲紑鍚姸鎬� + for _, ruleGroup := range allRules { + if ruleGroup.Enable { // 澶ц鍒欏紑鍏冲紑鍚姸鎬� // 鍏堣繃鏃堕棿瑙勫垯 - timeJudge(label,ruleGroup) + timeFlag := timeJudge(label, ruleGroup) + if !timeFlag { + logger.Info("涓嶅湪瑙勫垯鐨勬椂闂磋寖鍥村唴锛屼笉鎺ㄩ�侊紒") + continue + } result := "" var Connector string if ruleGroup.IsSatisfyAll { @@ -39,44 +48,45 @@ } else { Connector = "||" } - for _,rule := range ruleGroup.Rules { + for _, rule := range ruleGroup.Rules { // 杩囨瘡涓�涓皬瑙勫垯 if rule.TopicType == "camera" { - result = Connector + cameraJudge(label,rule) + result += Connector + cameraJudge(label, rule) } - if rule.TopicType == "baseLibrary" { - result = Connector + baseJudge(label,rule) + if rule.TopicType == "dbtable" { + result += Connector + baseJudge(label, rule) } if rule.TopicType == "task" { - result = Connector + taskJudge(label,rule) + result += Connector + taskJudge(label, rule) } if rule.TopicType == "person" { - result = Connector + taskJudge(label,rule) + result += Connector + taskJudge(label, rule) } - if rule.TopicType == "defence" { - result = Connector + defenceJudge(label,rule) + if rule.TopicType == "alarmLevel" { + result += Connector + defenceJudge(label, rule) } } // 寰楀嚭鎬荤殑鍒ゆ柇缁撴灉 if result != "" { - logger.Info("鎬荤殑鍒ゆ柇缁撴灉锛�",result) + logger.Info("鎬荤殑鍒ゆ柇缁撴灉锛�", result) result = result[2:] // 鎶婂墠涓や綅瀛楃鍘绘帀 - expression, err:= govaluate.NewEvaluableExpression(result); + expression, err := govaluate.NewEvaluableExpression(result); if err != nil { logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒") + return } - result, err1:= expression.Evaluate(nil) + result, err1 := expression.Evaluate(nil) if err1 != nil { logger.Error("甯﹀叆鍙傛暟鏈夎") } if result.(bool) { - logger.Info("閫氳繃瑙勫垯锛岃〃杈惧紡涓猴細",result) + logger.Info("閫氳繃瑙勫垯锛岃〃杈惧紡涓猴細", result) // 鎺ㄩ�佹湇鍔″櫒 - pushData(ruleGroup.Urls,result.(ruleserver.ResultMsg)) - os.Exit(1) + pushData(ruleGroup.Urls, msg) + //os.Exit(1) } else { - logger.Info("娌¢�氳繃瑙勫垯,琛ㄨ揪寮忎负锛�",result) - os.Exit(1) + logger.Info("娌¢�氳繃瑙勫垯,琛ㄨ揪寮忎负锛�", result) + //os.Exit(1) } } } @@ -84,28 +94,32 @@ //绗﹀悎鏈鍒欑粍鐨勫氨鎶婃暟鎹帹閫佸埌璇ョ洰鐨勬湇鍔″櫒涓� } + // 鏄惁绗﹀悎鏃堕棿瑙勫垯 -func timeJudge(label *Label,groupRule protomsg.EventPush) string{ +func timeJudge(label *Label, groupRule protomsg.EventPush) bool { timeNow := time.Now().Format("2006-01-02 15:04:05") - flag1 := isBefore(groupRule.TimeStart,timeNow) - flag2 := isBefore(timeNow,groupRule.TimeEnd) + logger.Info("鏍囩杩囨护鍣ㄨ捣濮嬫椂闂翠负锛�",groupRule.TimeStart,groupRule.TimeEnd) + flag1 := isBefore(groupRule.TimeStart, timeNow) + flag2 := isBefore(timeNow, groupRule.TimeEnd) if flag1 && flag2 { - return "true" + return true } else { logger.Info("涓嶅湪瑙勫畾鐨勬椂闂磋寖鍥村唴锛�") - return "false" + return false } } + // 浼犲叆涓や釜鏃堕棿鐨勫瓧绗︿覆锛屽垽鏂涓�涓椂闂存槸鍚﹀皬浜庣浜屼釜鏃堕棿 -func isBefore(time1 string,time2 string) bool{ - expression, err:= govaluate.NewEvaluableExpression("t1 < t2"); +func isBefore(time1 string, time2 string) bool { + expression, err := govaluate.NewEvaluableExpression("t1 < t2"); if err != nil { logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒") + return false } - parameters := make(map[string]interface{},8) + parameters := make(map[string]interface{}, 8) parameters["t1"] = time1 parameters["t2"] = time2 - result, err1:= expression.Evaluate(parameters) + result, err1 := expression.Evaluate(parameters) if err1 != nil { logger.Error("甯﹀叆鍙傛暟鏈夎") } @@ -113,20 +127,21 @@ } // 鏄惁绗﹀悎鎽勫儚鏈鸿鍒� -func cameraJudge(label *Label,rule *protomsg.EventPushRule) string{ +func cameraJudge(label *Label, rule *protomsg.EventPushRule) string { formula := "" - if rule.TopicArg == "cameraName" { - formula = label.CameraName + rule.Operator + rule.RuleValue + if rule.TopicArg == "name" { + formula = "'" + label.CameraName + "'" + rule.Operator + "'" + rule.RuleValue + "'" } - if rule.TopicArg == "cameraLocation" { - formula = label.CameraAddr + rule.Operator + rule.RuleValue + if rule.TopicArg == "addr" { + formula = "'" + label.CameraAddr + "'" + rule.Operator + "'" + rule.RuleValue + "'" } - expression, err:= govaluate.NewEvaluableExpression(formula); + logger.Info("-------鎵撳嵃鎽勫儚鏈鸿鍒欏叕寮忥細",formula) + expression, err := govaluate.NewEvaluableExpression(formula); if err != nil { - logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒") + logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒", formula) return "false" } - result, err1:= expression.Evaluate(nil) + result, err1 := expression.Evaluate(nil) if err1 != nil { logger.Error("甯﹀叆鍙傛暟鏈夎") return "false" @@ -135,47 +150,108 @@ logger.Info("绗﹀悎鎽勫儚鏈鸿鍒�!") return "true" } + logger.Info("涓嶇鍚堟憚鍍忔満瑙勫垯!") return "false" } // 鏄惁绗﹀悎搴曞簱瑙勫垯 -func baseJudge(label *Label,rule *protomsg.EventPushRule) string{ - flag := "false" - for _,personGroup := range label.Persons { - for _,arg := range personGroup.Args { - for _,liker := range arg.Liker{ - if liker.TableId == rule.RuleValue { - logger.Info("绗﹀悎搴曞簱瑙勫垯锛�") - flag = "true" +func baseJudge(label *Label, rule *protomsg.EventPushRule) string { + if rule.RuleValue == "all" { + for _, personGroup := range label.Persons { + for _, arg := range personGroup.Args { + if len(arg.Liker) > 0 { + logger.Info("婊¤冻鍏ㄩ儴搴曞簱瑙勫垯") + return "true" } } } + return "false" + } else { + for _, personGroup := range label.Persons { + for _, arg := range personGroup.Args { + for _, liker := range arg.Liker { + formula := "'" + liker.TableId + "'" + rule.Operator + "'" + rule.RuleValue + "'" + expression, err := govaluate.NewEvaluableExpression(formula); + logger.Info("-------鎵撳嵃搴曞簱瑙勫垯鍏紡锛�",formula) + if err != nil { + logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒", formula) + return "false" + } + result, err1 := expression.Evaluate(nil) + if err1 != nil { + logger.Error("甯﹀叆鍙傛暟鏈夎") + //return "false" + } + if result.(bool) { + logger.Info("绗﹀悎搴曞簱瑙勫垯!") + return "true" + } + } + } + } + logger.Info("涓嶇鍚堝簳搴撹鍒�!") + return "false" } - return flag } //鏄惁绗﹀悎浜哄憳瑙勫垯 -func personJudge(label *Label,rule *protomsg.EventPushRule) string{ - for _,personGroup := range label.Persons { - for _,person := range personGroup.Args { - if rule.TopicArg == "sex" && strconv.Itoa(int(person.ThftRes.Gender)) == rule.RuleValue{ - logger.Info("绗﹀悎浜哄憳鎬у埆瑙勫垯锛�") - return "true" +func personJudge(label *Label, rule *protomsg.EventPushRule) string { + for _, personGroup := range label.Persons { + for _, person := range personGroup.Args { + formula := "" + if rule.TopicArg == "sex" { + formula = strconv.Itoa(int(person.ThftRes.Gender)) + rule.Operator + rule.RuleValue } - if rule.TopicArg == "race" && strconv.Itoa(int(person.ThftRes.Race)) == rule.RuleValue { - logger.Info("绗﹀悎浜哄憳绉嶆棌瑙勫垯锛�") - return "true" + if rule.TopicArg == "race" { + formula = strconv.Itoa(int(person.ThftRes.Race)) + rule.Operator + rule.RuleValue } - if rule.TopicArg == "age" && strconv.Itoa(int(person.ThftRes.Age)) == rule.RuleValue { - logger.Info("绗﹀悎浜哄憳骞撮緞瑙勫垯锛�") - return "true" + if rule.TopicArg == "age" { + formula = strconv.Itoa(int(person.ThftRes.Age)) + rule.Operator + rule.RuleValue } - if rule.TopicArg == "others" { + if rule.TopicArg == "otherInfo" { // 鍏朵粬杩欎釜鍊煎厛杩欎箞澶勭悊 return "true" } + logger.Info("-------鎵撳嵃浜哄憳瑙勫垯鍏紡锛�",formula) + expression, err := govaluate.NewEvaluableExpression(formula); + if err != nil { + logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒", formula) + return "false" + } + result, err1 := expression.Evaluate(nil) + if err1 != nil { + logger.Error("甯﹀叆鍙傛暟鏈夎") + //return "false" + } + if result.(bool) { + logger.Info("绗﹀悎浜哄憳瑙勫垯锛�", formula) + return "true" + } } - if strconv.Itoa(int(personGroup.AlarmLevel)) == rule.RuleValue { + if rule.TopicArg == "monitorLevel" { + if rule.RuleValue == "all" { + if len(personGroup.Args) > 0 { + logger.Info("绗﹀悎浜哄憳绛夌骇涓哄叏閮ㄧ殑瑙勫垯") + return "true" + } + } else { + formula := strconv.Itoa(int(personGroup.AlarmLevel)) + rule.Operator + formate(rule.RuleValue) + logger.Info("-------鎵撳嵃浜哄憳绛夌骇瑙勫垯鍏紡锛�",formula) + expression, err := govaluate.NewEvaluableExpression(formula); + if err != nil { + logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒", formula) + return "false" + } + result, err1 := expression.Evaluate(nil) + if err1 != nil { + logger.Error("甯﹀叆鍙傛暟鏈夎") + //return "false" + } + if result.(bool) { + logger.Info("绗﹀悎浜哄憳绛夌骇瑙勫垯!") + return "true" + } + } logger.Info("绗﹀悎浜哄憳鎶ヨ绛夌骇瑙勫垯锛�") return "true" } @@ -185,25 +261,49 @@ } // 鏄惁绗﹀悎甯冮槻绛夌骇瑙勫垯 -func defenceJudge(label *Label,rule *protomsg.EventPushRule) string{ - for _,def := range label.DefenceLevel { - if strconv.Itoa(int(def)) == rule.RuleValue { - logger.Info("绗﹀悎甯冮槻绛夌骇瑙勫垯锛�") +func defenceJudge(label *Label, rule *protomsg.EventPushRule) string { + if rule.RuleValue == "all" { // 甯冮槻绛夌骇涓哄叏閮ㄦ椂鍙湁鏈夊竷闃茬瓑绾у嵆涓洪�氳繃 + if len(label.DefenceLevel) > 0 { + logger.Info("绗﹀悎甯冮槻绛夌骇瑙勫垯锛屽竷闃茬瓑绾т负鍏ㄩ儴") return "true" + } else { + logger.Info("涓嶇鍚堝竷闃茬瓑绾ц鍒�") + return "false" } - } - logger.Info("涓嶇鍚堝竷闃茬瓑绾ц鍒�") - return "false" -} -// 鏄惁绗﹀悎浠诲姟瑙勫垯 -func taskJudge(label *Label,rule *protomsg.EventPushRule) string{ - formula := label.TaskId + rule.Operator + rule.RuleValue - expression, err:= govaluate.NewEvaluableExpression(formula); - if err != nil { - logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒") + } else { + for _, def := range label.DefenceLevel { + formula := strconv.Itoa(int(def)) + rule.Operator + rule.RuleValue + logger.Info("-------鎵撳嵃甯冮槻绛夌骇瑙勫垯鍏紡锛�",formula) + expression, err := govaluate.NewEvaluableExpression(formula); + if err != nil { + logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒", formula) + return "false" + } + result, err1 := expression.Evaluate(nil) + if err1 != nil { + logger.Error("甯﹀叆鍙傛暟鏈夎") + //return "false" + } + if result.(bool) { + logger.Info("绗﹀悎甯冮槻绛夌骇瑙勫垯!") + return "true" + } + } + logger.Info("涓嶇鍚堝竷闃茬瓑绾ц鍒�") return "false" } - result, err1:= expression.Evaluate(nil) +} + +// 鏄惁绗﹀悎浠诲姟瑙勫垯 +func taskJudge(label *Label, rule *protomsg.EventPushRule) string { + formula := "'"+label.TaskId +"'"+ rule.Operator +"'"+ rule.RuleValue+"'" + expression, err := govaluate.NewEvaluableExpression(formula); + logger.Info("-------鎵撳嵃浠诲姟瑙勫垯鍏紡锛�",formula) + if err != nil { + logger.Error("琛ㄨ揪寮忔湁璇紝璇锋鏌ワ紒", formula) + return "false" + } + result, err1 := expression.Evaluate(nil) if err1 != nil { logger.Error("甯﹀叆鍙傛暟鏈夎") return "false" @@ -215,9 +315,39 @@ logger.Info("涓嶇鍚堜换鍔¤鍒�") return "false" } + // 璋冪敤鐩爣鏈嶅姟鍣ㄧ殑鎻掑叆鎺ュ彛 -func pushData (urls []*protomsg.PushUrl, data ruleserver.ResultMsg){ - for _,url := range urls { - Push(url.Url,data) +func pushData(urls []*protomsg.PushUrl, data structure.ResultMsg) { + for _, url := range urls { + logger.Debug("鐪嬬湅鎺ㄩ�佸湴鍧�锛�",url.Url) + var ch chan *structure.ResultMsg + for _, v := range urlChans { + if v.url == url.Url{ + ch = v.ch + } + } + ch <- &data + //logger.Info("urlPool澶у皬锛� ", len(urlPool[url.Url])) } -} \ No newline at end of file +} + +// 鎶婃姤璀︾瓑绾ц浆鍖栨垚姹夊瓧 +func formate(str string) string { + var i string + if str == "涓�绾�" { + i = "1" + } + if str == "浜岀骇" { + i = "2" + } + if str == "涓夌骇" { + i = "3" + } + if str == "鍥涚骇" { + i = "4" + } + if str == "浜旂骇" { + i = "5" + } + return i +} -- Gitblit v1.8.0