From d4c91ea1e23a594ee8eeb7248741e1aac4ff870e Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期二, 02 七月 2019 15:24:10 +0800 Subject: [PATCH] --- --- ruleserver/ruleToformula.go | 120 ++++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 68 insertions(+), 52 deletions(-) diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go index 8484174..565930f 100644 --- a/ruleserver/ruleToformula.go +++ b/ruleserver/ruleToformula.go @@ -4,12 +4,12 @@ "encoding/json" "fmt" "log" + "ruleprocess/cache" "sort" "strconv" "strings" "time" - "basic.com/dbapi.git" "basic.com/pubsub/protomsg.git" "github.com/knetic/govaluate" ) @@ -64,7 +64,7 @@ Location Rect // 璁颁笅姣忎釜鐩爣鐨勪綅缃弬鏁帮紝鏈�鍚庣粰缁撴灉瑁呴厤浜鸿劯鏁版嵁鐨勬椂鍊欑敤鐨勫埌 SdkName string ThftRes protomsg.ThftResult - Liker []LikePerson + Liker []*protomsg.Baseinfo } type LikePerson struct { @@ -98,7 +98,7 @@ IsYolo bool // 鏄惁鏄痽olo鏁版嵁 SdkName string ThftRes protomsg.ThftResult - Liker []LikePerson // 濡傛灉鏄汉鑴哥殑璇濆挨鍏舵槸姣斿锛屽簲瀛樹笅浠栬窡搴曞簱鐨勪汉鍛樼殑鐩镐技鎯呭喌 yolo鐨勮瘽缁檔il灏辫 + Liker []*protomsg.Baseinfo // 濡傛灉鏄汉鑴哥殑璇濆挨鍏舵槸姣斿锛屽簲瀛樹笅浠栬窡搴曞簱鐨勪汉鍛樼殑鐩镐技鎯呭喌 yolo鐨勮瘽缁檔il灏辫 } // 姣忎釜绠楁硶瀵逛簬褰撳墠甯х敾闈㈣嚜宸辨彁鍙栫殑鏁版嵁 @@ -159,19 +159,21 @@ // 鏍规嵁鎽勫儚鏈篿d鎷垮埌鎽勫儚鏈烘墍鏈夊尯鍩� func GetPolygons(cameraId string) []protomsg.CameraPolygon { - var api dbapi.CameraApi - data := api.FindAllPolygons() - //fmt.Println("鏌ュ埌鐨勬墍鏈夊尯鍩燂細", data) - // 鏍规嵁id浠巑ap涓嬁鍒板尯鍩� + //var api dbapi.CameraApi + //data := api.FindAllPolygons() + ////fmt.Println("鏌ュ埌鐨勬墍鏈夊尯鍩燂細", data) + //// 鏍规嵁id浠巑ap涓嬁鍒板尯鍩� var cameraPolygons []protomsg.CameraPolygon - for _, item := range data { - if item.CameraId == cameraId && item.Type != "line" { - // 闇�瑕佹牴鎹瘮渚嬫妸鍓嶅彴鐢荤殑鍖哄煙鐨勫潗鏍囪浆鍖栦负鐩稿簲鎽勫儚鏈烘媿鎽勭殑鍥惧儚鐨勫ぇ灏� x鍧愭爣鍒嗗埆*image.width/椤甸潰鍖哄煙瀹� y鍧愭爣鍒嗗埆*image.height/椤甸潰鍖哄煙楂� - // 鍓嶅彴瀹介珮鍥哄畾 - //log.Println("------------绗﹀悎鏉′欢鐨勫尯鍩燂細",item) - cameraPolygons = append(cameraPolygons, item) - } - } + //for _, item := range data { + // if item.CameraId == cameraId && item.Type != "line" { + // // 闇�瑕佹牴鎹瘮渚嬫妸鍓嶅彴鐢荤殑鍖哄煙鐨勫潗鏍囪浆鍖栦负鐩稿簲鎽勫儚鏈烘媿鎽勭殑鍥惧儚鐨勫ぇ灏� x鍧愭爣鍒嗗埆*image.width/椤甸潰鍖哄煙瀹� y鍧愭爣鍒嗗埆*image.height/椤甸潰鍖哄煙楂� + // // 鍓嶅彴瀹介珮鍥哄畾 + // //log.Println("------------绗﹀悎鏉′欢鐨勫尯鍩燂細",item) + // cameraPolygons = append(cameraPolygons, item) + // } + //} + cameraPolygons = cache.GetPolygonsByCameraId(cameraId) + //log.Println("鏍规嵁鎽勫儚鏈篿d鏌ュ埌鐨勫尯鍩�", cameraPolygons, "--鍖哄煙鏁伴噺涓猴細", len(cameraPolygons)) return cameraPolygons } @@ -183,14 +185,12 @@ areaMap := AreaMap{cameraId: cameraId, areaId: polygon.Id, areaJson: polygon.Polygon, triggerLine: polygon.TriggerLine, directionLine: polygon.DirectionLine} // 涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁 areaMap.CountAreaObjs(arg) - log.Println("-------areaMap鐨勫唴瀹�",areaMap) arg.AreaMapList = append(arg.AreaMapList, areaMap) - log.Println("-------AreaMapList鐨勫唴瀹�",arg.AreaMapList) } } // 瀵瑰崟甯у浘鍍忕殑鍒ゆ柇 鏄垗寮冿紙鎴栬�呰瀵逛簬鏌愪簺闇�姹傚彲浠ユ斁ES鏁版嵁搴撲竴浠斤級杩樻槸杩斿洖 -func Judge(args SdkDatas) { +func Judge(args *SdkDatas) { if len(args.Sdkdata) > 0 { // 鎷垮埌鏈憚鍍忔満鐨勫尯鍩� cameraPolygons := GetPolygons(args.CameraId) @@ -205,10 +205,12 @@ args.RuleResult = make(map[string]interface{}) args.RuleResult["yolo"] = []Result{} args.RuleResult["face"] = []Arg{} + log.Println("--------------浠诲姟缁勪笅鐨勮鍒欑粍鐨勬暟閲忥細",len(taskRuleList)) if len(taskRuleList) > 0 { for _, taskRule := range taskRuleList { ruleList := taskRule.GroupRules // 鑾峰彇鐨勬槸task涓嬮潰鐨勪换鍔$粍 taskId := taskRule.TaskId + log.Println("000000000000000000000000000000000000000杩欑粍浠诲姟涓嬬殑瑙勫垯缁勭殑鏁伴噺锛�",len(ruleList)) for i := 0; i < len(ruleList); i++ { temp := ruleList[i].Rules // temp涓轰竴缁勫畬鏁磋鍒� 鍦ㄦ闇�瑕佸垽鏂鍒欐槸鍚︽槸鑱斿姩瑙勫垯 if len(temp) > 0 { @@ -217,7 +219,6 @@ linkTask(args, ruleList[i], taskId) } else { // 鐙珛浠诲姟鐨勫鐞� - log.Println("----------------------------------------64鎽勫儚鏈哄叆鍏�") RunRule(args, ruleList[i], taskId) } } @@ -226,14 +227,18 @@ } } } -func RunRule(args SdkDatas, groupRule *protomsg.GroupRule, taskId string) bool { +func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) bool { + defer func() { + if err := recover(); err != nil { + fmt.Println("姣斿瑙勫垯鏈夎", err.(string)) + } + + }() + log.Println("++++++++++++++++++++++++++++瑙勫垯寮�濮嬭繍琛�+++++++++++++++++++++++++") resultSplice := []*LittleRuleResult{} // 鍏堣繃瀹屾潯浠惰鍒� for j := 0; j < len(groupRule.Rules); j++ { for _, sdkData := range args.Sdkdata { - if sdkData.SdkId == "812b674b-2375-4589-919a-5c1c3278a975" { - log.Println("鍏ヤ镜鐨勭畻娉曟暟鎹�", sdkData) - } for _, areaMap := range sdkData.AreaMapList { ruleResult := filterRule(groupRule.Rules[j], &areaMap) if ruleResult.Result != "" { @@ -293,9 +298,13 @@ completeFormula = completeFormula + va.Result } if completeFormula != "" { + log.Println("鐪嬬湅鍏紡-----------锛�", completeFormula) expression, _ := govaluate.NewEvaluableExpression(completeFormula) - result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� - if result.(bool) { + if strings.HasPrefix(completeFormula,"&&") || strings.HasPrefix(completeFormula,"||"){ + panic("瑙勫垯鏈夎锛屽緱鍒扮殑鏁板鍏紡涓嶅彲瑙f瀽") + } + result,_ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� + if !result.(bool) { // 缁欒繖甯ф暟鎹墦涓婅鍒欑粍鏍囩 //args.RuleResult = append(args.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId}) for k, timeEle := range TimeEleList { @@ -310,6 +319,7 @@ for k, timeEle := range TimeEleList { if strings.Contains(k, taskId) { if timeEle.N != 0 { // 璺熻繖涓换鍔℃湁鍏崇殑瀹氭椂鍣ㄨ鍏ㄩ儴绛変簬0 + log.Println("鈥斺�斺�斺�斺�斺�斺�斺�斺�斺�斺��-------------涓嶅啢锛屼綘鏄瀹氭椂鍣ㄦ墦璐ョ殑锛�") flag = false } } @@ -371,7 +381,7 @@ // 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁� a.targetNum++ arg1 := Arg{obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), obj.IsYolo, obj.Rects, obj.SdkName, obj.ThftRes, obj.Liker} - log.Println("鏀捐繘鍘荤殑arg锛�-------", arg1) + //log.Println("鏀捐繘鍘荤殑arg锛�-------", arg1) a.args = append(a.args, arg1) a.filterData = append(a.filterData, arg1) } @@ -405,20 +415,21 @@ func GetRuleGroup(cameraId string) []*protomsg.TaskGroupArgs { // 鏌ヨ鏁版嵁搴� // 绗竴姝ユ煡鍑鸿窡杩欎釜鎽勫儚鏈虹浉鍏崇殑group_id(澶ц鍒�) - var api dbapi.CameraTaskArgsApi - all := api.FindAll() - //fmt.Println("鎵�鏈夎鍒�:", all) - var taskArgs []*protomsg.TaskGroupArgs - for _, camArg := range all { - if camArg.CameraId == cameraId { - taskArgs = camArg.TaskArgs - } - } - return taskArgs + //var api dbapi.CameraTaskArgsApi + // + ////fmt.Println("鎵�鏈夎鍒�:", all) + //var taskArgs []*protomsg.TaskGroupArgs + //for _, camArg := range all { + // if camArg.CameraId == cameraId { + // taskArgs = camArg.TaskArgs + // } + //} + all := cache.GetCameraTaskRulesByCameraId(cameraId) + return all } // 鑱斿姩浠诲姟鐨勫鐞� -func linkTask(args SdkDatas, groupRule *protomsg.GroupRule, taskId string) { +func linkTask(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string) { // new涓�涓畾鏃跺櫒锛屽鏋滀互姝roupId涓烘爣蹇楃殑瀹氭椂鍣ㄤ笉瀛樺湪鐨勮瘽 var flag bool = true var timeEle = TimeElement{N: 3, InitN: 3, GroupId: groupRule.GroupId} @@ -507,7 +518,6 @@ 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" { @@ -521,7 +531,7 @@ for _, obj := range am.filterData { for index := 0; index < len(obj.Liker); { // 灏嗚揪涓嶅埌闃堝�肩殑鐩镐技鑰呬粠鐩镐技鑰呮暟缁勪腑鍒犻櫎 - if obj.Liker[index].Score < argValue { + if float64(obj.Liker[index].CompareScore) < argValue { // Go 璇█涓垏鐗囧垹闄ゅ厓绱犵殑鏈川鏄細浠ヨ鍒犻櫎鍏冪礌涓哄垎鐣岀偣锛屽皢鍓嶅悗涓や釜閮ㄥ垎鐨勫唴瀛橀噸鏂拌繛鎺ヨ捣鏉ャ�備笉鐢ㄦ��鐤戯紝鏁扮粍鍒犻櫎鍏冪礌灏辫繖涔堝潙鐖� obj.Liker = append(obj.Liker[:index], obj.Liker[index+1:]...) } else { @@ -589,9 +599,9 @@ } } else { // 澶勭悊鐨勯兘鏄痽olo鏁版嵁 - log.Println("瑙勫垯涓殑sdkId涓猴細", rule.SdkId, "--鍖哄煙鏁版嵁闆嗗悎涓殑sdkId涓猴細", am.sdkId, "--瑙勫垯涓殑鍖哄煙Id涓猴細", rule.PolygonId, "--鍖哄煙鏁版嵁闆嗗悎涓殑鍖哄煙Id涓猴細", am.areaId, ) if rule.SdkId == am.sdkId && rule.PolygonId == am.areaId { // 棣栧厛杩欐潯瑙勫垯寰楁槸杩欎釜绠楁硶鐨勮鍒欙紝鍏舵瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + log.Println("----------褰撳墠鏉′欢瑙勫垯锛�---------",rule) var args []Arg if rule.RuleWithPre == "&&" { args = am.filterData @@ -604,10 +614,13 @@ 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) // 寰楀埌鏁板鍏紡鐨勭粨鏋� @@ -708,18 +721,20 @@ return LittleRuleResult{} } func timeRuleResult(rule *protomsg.Rule, am *AreaMap) LittleRuleResult { - if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� - if rule.SdkArgAlias == "time" { // 鍒ゆ柇鏄惁绗﹀悎鏃堕棿瑙勫垯 + if rule.PolygonId == am.areaId && rule.SdkId == am.sdkId{ // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + if rule.SdkArgAlias == "time_rule" { // 鍒ゆ柇鏄惁绗﹀悎鏃堕棿瑙勫垯 + log.Println("----------褰撳墠鏃堕棿瑙勫垯锛�---------",rule) // 鏍规嵁鏀惧�煎瓧娈甸噷瀛樼殑鏃堕棿瑙勫垯鐨刬d鍘诲彟涓�涓〃閲屾煡闇�瑕佹瘮瀵圭殑鏃堕棿娈碉紙姣斿褰撳墠鏃堕棿鏄懆涓夛紝搴旀牴鎹尯鍩焛d鏌ュ嚭鍏跺懆涓夌殑鍑犱釜甯冮槻鏃堕棿娈碉紝鏁扮粍锛� //fmt.Println("鏃堕棿瑙勫垯鐨勬祴璇�") now := time.Now() index := getIndexOfWeek(now.Weekday().String()) timeList := GetTimeById(rule.SdkArgValue, index) + log.Println("褰撳ぉ鐨勬椂闂存闆嗗悎锛�----------",timeList) //fmt.Println("浠庢暟鎹簱涓煡鍑虹殑鏃堕棿瑙勫垯锛�", timeList) // 鍒ゆ柇鍥剧墖鏁版嵁鐨勬椂闂存槸鍚︾鍚堝綋鍓嶈鍒� 鍦ㄤ竴涓嵆涓簍rue锛屽叏涓嶅湪涓篺alse 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) // 寰楀埌鏁板鍏紡鐨勭粨鏋� @@ -733,7 +748,7 @@ break } } - if rule.Operator == "unsatisfy" { // 涓嶆弧瓒虫墍閫夌殑鏃堕棿瑙勫垯 + if rule.Operator == "unsatisfy" || rule.Operator == "!="{ // 涓嶆弧瓒虫墍閫夌殑鏃堕棿瑙勫垯 formula := timeSlot.Start + "<" + am.time expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� @@ -775,14 +790,15 @@ // 鍙栧嚭鏌愪釜鏃堕棿瑙勫垯鐨勭鍑犲ぉ鐨勮鍒欐闆嗗悎 func GetTimeById(id string, index int) []TimeRange { - var cameraTimeRule protomsg.CameraTimerule - var api dbapi.CameraApi - _, rules := api.FindAllTimeRules() - for _, rule := range rules { - if rule.Id == id { - cameraTimeRule = rule - } - } + //var cameraTimeRule protomsg.CameraTimerule + //var api dbapi.CameraApi + //_, rules := api.FindAllTimeRules() + //for _, rule := range rules { + // if rule.Id == id { + // cameraTimeRule = rule + // } + //} + _,cameraTimeRule := cache.GetTimeRuleById(id) var timeRangeList []day json.Unmarshal([]byte(cameraTimeRule.TimeRule), &timeRangeList) for _, timerange := range timeRangeList { -- Gitblit v1.8.0