From 29db47f39c7bc0940592c96b587f51e4f0c659c1 Mon Sep 17 00:00:00 2001 From: panlei <2799247126@qq.com> Date: 星期四, 14 十一月 2019 17:01:02 +0800 Subject: [PATCH] 看看缓存数据 --- algorithm/static/static.go | 277 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 235 insertions(+), 42 deletions(-) diff --git a/algorithm/static/static.go b/algorithm/static/static.go index 88b4e33..813abe2 100644 --- a/algorithm/static/static.go +++ b/algorithm/static/static.go @@ -7,59 +7,252 @@ "ruleprocess/ruleserver" "ruleprocess/structure" "strconv" + "sync" ) -//涓綋闈欐绠楁硶 -func Entrance(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { - for _,obj := range am.FilterData { - var flag bool = true - for k, _ := range ruleserver.TimeEleList { - if k == rule.Id+""+strconv.Itoa(int(obj.Id)) { - flag = false // 鏈夊氨缃负false - logger.Info("鏈夎繖涓畾鏃跺櫒锛屼笉鍐嶅垱寤轰簡锛�") - } + +func Entrance(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult { + if rule.PolygonId == am.AreaId { // 棣栧厛杩欐潯瑙勫垯寰楁槸杩欎釜绠楁硶鐨勮鍒欙紝鍏舵瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓� + logger.Debug("---------璧颁簡涓綋闈欐绠楁硶", rule.Id, rule.SdkArgAlias, rule.Operator, rule.SdkArgValue, am.AreaId) + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + return filterRule(rule, am) + } else if rule.SdkArgAlias == "duration" { + + lr := CompareAndSave(rule,am,lable,args,message) + logger.Info("涓綋闈欐瑙勫垯缁撴灉锛�",lr) + return lr + } else { + return structure.LittleRuleResult{} } - if flag { - timeEle := ruleserver.TimeElement{N: 10, InitN: 10, AlarmFlag: false, BufferFlag: 5} // 鎵旇繘鍘讳竴涓畾鏃跺櫒鍏冪礌 - ruleserver.TimeEleList[rule.Id+""+strconv.Itoa(int(obj.Id))] = &timeEle // 瀹氭椂鍣ㄥ厓绱犱互灏忚鍒檌d鍜岀洰鏍噄d涓洪敭 - } + } else { + return structure.LittleRuleResult{} } - return structure.LittleRuleResult{} } // 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲� func filterRule(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult { // 澶勭悊鐨勯兘鏄痽olo鏁版嵁 - 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) + if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔� + var args []*structure.Arg + if rule.RuleWithPre == "&&" { + args = am.FilterData } else { - formula = strconv.FormatFloat(arg.Size, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue // 寰楀埌瀛楃涓插叕寮� - logger.Info("褰撳墠灏哄灏忓叕寮忥細", formula) + args = am.Args } - expression, _ := govaluate.NewEvaluableExpression(formula) // 寰楀埌鏁板鍏紡 - result, _ := expression.Evaluate(nil) // 寰楀埌鏁板鍏紡鐨勭粨鏋� - if result.(bool) { - am.FilterData = append(am.FilterData, arg) // 寰楀埌绗﹀悎鏉′欢鐨勮繃婊ゆ暟鎹� + // 鍏堟竻绌鸿繃婊ゅ悗鐨勬暟鎹紝鍐嶅線閲屽鏈杩囨护鍚庣殑鏁版嵁 + 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 if rule.SdkArgAlias == "" { + 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} } } - am.TargetNum = len(am.FilterData) // 鎶婄鍚堟潯浠剁殑鐩爣鏁伴噺鏇存柊鍒皌argetNum瀛楁 - if am.TargetNum > 0 { - return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} - } else { + return structure.LittleRuleResult{} +} + +// 鍒ゆ柇涓や釜鐭╁舰鐨勯噸鍚堝害锛屾妸闈㈢Н鏇村ぇ鐨勫仛鍒嗘瘝锛屽嵆鍙栧皬鍊� +func PgsInterPercent(pgpts []structure.Point, box structure.Rect, widthScale float64, heightScale float64) (percent float64) { + + areapts, areaBox := ruleserver.GetLocation(box, 10) + var count = 0 + for _, pts := range areapts { + if ruleserver.PintIsInPolygon(pts, pgpts, widthScale, heightScale) { + count++ + } + } + perInterBox := float64(count) / float64(len(areapts)) // 閲嶅悎闈㈢Н鍗犵煩褰㈢殑姣斾緥 + areaInter := perInterBox * areaBox + areaPg := ruleserver.ComputePolygonArea(pgpts) + perInterPg := areaInter / areaPg // 閲嶅悎闈㈢Н鍗犲杈瑰舰鍖哄煙鐨勬瘮渚� + // 鍝釜鍗犵殑姣斾緥灏忔寜鍝釜璁$畻锛屾瘮濡備汉绔欒捣鏉ヤ簡锛屽ぇ妗嗗浣忎簡灏忔 + if perInterBox < perInterPg { + return (perInterBox * 100) + } + return (perInterPg * 100) +} +// 鍒ゆ柇涓�涓尯鍩熷唴鏈夋病鏈夐潤姝㈢殑鐩爣 +func CompareAndSave(rule *protomsg.Rule, am *structure.AreaMap,lable *structure.Others,args *structure.SdkDatas,message *protomsg.SdkMessage) structure.LittleRuleResult { + defer func() { + if err := recover(); err != nil { + logger.Error("涓綋闈欐瑙勫垯鏈夎", err) + } + }() + logger.Info("璧颁簡涓綋闈欐鏍稿績绠楁硶") + initN := 5 + if rule.SdkId == "812b674b-2375-4589-919a-5c1c3278a977" && rule.SdkArgAlias == "duration" { + if init,err := strconv.Atoi(rule.SdkArgValue); err != nil { + logger.Debug("涓綋闈欐绠楁硶璇诲彇鎸佺画鏃堕棿澶辫触",err) + } else { + initN = init + } + } + if structure.StaticMap[am.AreaId] == nil || len(structure.StaticMap[am.AreaId].Targets) == 0 { // 鍗崇涓�甯ф暟鎹�(涔熶笉涓�瀹�)锛岃繕娌℃湁缂撳瓨 + logger.Info("涔嬪墠鏃犵紦瀛�") + objs := []*structure.Obj{} + for _, tar := range am.FilterData { + obj := &structure.Obj{Id: tar.Id, Location: tar.Location, N: initN,InitN:initN,CacheSdkData:structure.ResultMsg{message, nil}} + objs = append(objs, obj) + } + structure.StaticMap[am.AreaId] = &structure.CameraArea{objs} return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} + } else { + logger.Info("涔嬪墠鏈夌紦瀛�") + flag := "false" + // 浠ヤ箣鍓嶉潤姝㈢殑瀵硅薄涓轰富鍒ゆ柇鏄惁闈欐 + tars := []*structure.Arg{} + logger.Info("鐪嬩竴涓嬮潤姝㈠尯鍩熷唴鐨勭洰鏍囷細",am.AreaId) + for _, tar := range structure.StaticMap[am.AreaId].Targets { + logger.Info("鍏蜂綋鐩爣锛�",tar.Location) + } + for _, tar := range structure.StaticMap[am.AreaId].Targets { + singleResult,arg := SingleStatic(tar,am,lable,90) + if singleResult { + flag = "true" + tars = append(tars,arg) + logger.Info("闈欐鐨勭洰鏍囷細",arg.Id,arg.Location,arg.Score) + } + } + + // 鎶婃弧瓒虫潯浠剁殑鐩爣鏀捐繘areaMap涓� + am.AlarmObj = tars + // 鏇存柊鏁版嵁,鎶婃柊鏉ョ殑鏁版嵁鍐欏叆缂撳瓨 + objs := []*structure.Obj{} + for _, tar := range am.FilterData { + flag1 := false + for _, OBJ := range structure.StaticMap[am.AreaId].Targets { + if tar.Id == OBJ.Id { + flag1 = true + } + } + if !flag1 { // 闆嗗悎涓病鏈夌殑鎵嶆彃鍏� + obj := &structure.Obj{Id: tar.Id, Location: tar.Location, N: initN,InitN:initN,AlarmFlag: false, BufferFlag: 10, CacheSdkData: structure.ResultMsg{message, nil}} + objs = append(objs, obj) + } + } + structure.StaticMap[am.AreaId] = &structure.CameraArea{objs} + return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + flag, rule.Sort} } -} \ No newline at end of file +} + +// rec鍙樹负[t]point 閫嗘椂閽堜竴鍦堢殑鍧愭爣 +func Rect2Point(rect structure.Rect) []structure.Point { + points := []structure.Point{} + point1 := structure.Point{rect.X, rect.Y} + points = append(points, point1) + point2 := structure.Point{rect.X, rect.Y + rect.Height} + points = append(points, point2) + point3 := structure.Point{rect.X + rect.Width, rect.Y + rect.Height} + points = append(points, point3) + point4 := structure.Point{rect.X + rect.Width, rect.Y} + points = append(points, point4) + return points +} + +// 鍒ゆ柇涓�涓洰鏍囨槸鍚﹂潤姝簡鎸囧畾鏃堕棿 +func SingleStatic(person *structure.Obj, am *structure.AreaMap,lable *structure.Others, argValue float64) (bool,*structure.Arg){ + logger.Info("鍗曚釜鐩爣鐨勫垽鏂細") + flag := false + var o *structure.Arg = nil + for _, obj := range am.FilterData { + if person.Id == obj.Id { + coincidenceDegree := PgsInterPercent(Rect2Point(person.Location), obj.Location, 1, 1) + logger.Info("鍒ゆ柇鐩爣鐨勯噸鍚堝害",coincidenceDegree) + o = obj + if coincidenceDegree >= argValue { + flag = true + } + } + } + if flag { // 褰撳墠妫�娴嬪璞′繚鎸侀潤姝紙id鐩哥瓑骞朵笖閲嶅悎搴﹂珮浜庨槇鍊硷級 + flagTime := TimerAlarm(o,person,flag,am.AreaId) + if flagTime == "10" || flagTime == "11" { + return flag,o + } else { + return false,o + } + } else { + TimerAlarm(o,person,flag,am.AreaId) + return flag,o + } +} +var rw sync.RWMutex +// 鍒ゆ柇鏄惁绗﹀悎瀹氭椂鍣ㄦ潯浠� +func TimerAlarm(o *structure.Arg,person *structure.Obj, result bool,areaId string) (string) { + var flagTime string // + logger.Info("鐩爣鐨勫畾鏃跺櫒锛�") + rw.Lock() + + if result { // 缁撴灉涓虹湡 + for k, tar := range structure.StaticMap[areaId].Targets { + if tar.Id == person.Id { + if tar.N == 0 && tar.AlarmFlag { + logger.Debug("-------------------------绗﹀悎鎸佺画鏃堕棿瑙勫垯浣嗗苟涓嶆槸棣栨锛屼笉鎶ヨ") + flagTime = "11" + } + if tar.N == 0 && !tar.AlarmFlag { // 杩欑粍瑙勫垯鐨勫畾鏃跺櫒瑕佸叏閮ㄧ瓑浜�0 鏆備笖璁や负涓�缁勮鍒欏彧鏈変竴涓畾鏃跺櫒 + logger.Debug("鈥斺�斺�斺�斺�斺�斺�斺�斺�斺�斺��-------------棣栨绗﹀悎鎸佺画鏃堕棿瑙勫垯骞舵姤璀�") + flagTime = "10" + tar.AlarmFlag = true + o.CacheData = tar.CacheSdkData + } + if tar.N != 0 { + flagTime = "00" + // 鏈夊畾鏃跺櫒浣嗕笉涓�0鎶婂凡鎵撶殑鏍囩鍒犻櫎 + // args.RuleResult = nil + logger.Debug("------------------------缁撴灉涓虹湡浣嗚鏁板櫒涓嶅埌0锛屼笉鎶ヨ,姝ゆ椂鐨勮鏁板櫒", k, "鐨勫�间负锛�", tar.N) + } + } + } + } else { // 缁撴灉涓哄亣 骞叉帀杩欎釜璁℃暟鍣� + for index, tar := range structure.StaticMap[areaId].Targets { + if tar.Id == person.Id { + if tar.AlarmFlag { + if tar.BufferFlag == 0 { + logger.Debug("------------------------------鏉�姝昏鏁板櫒锛屾姤璀︽甯х姸鎬佹敼鍙樼殑鏁版嵁锛屾鏃剁殑璁℃暟鍣ㄧ殑鍊间负", tar.N) + flagTime = "12" + structure.StaticMap[areaId].Targets = append(structure.StaticMap[areaId].Targets[:index],structure.StaticMap[areaId].Targets[index+1:]...) + } else { + if tar.BufferFlag > 0 { + logger.Debug("缂撳啿鍖哄噺鍑�") + tar.BufferFlag-- + } + } + } else { + logger.Debug("-----------缁撴灉涓哄亣涓斾笉鍒�0锛屾潃姝诲畾鏃跺櫒") + structure.StaticMap[areaId].Targets = append(structure.StaticMap[areaId].Targets[:index],structure.StaticMap[areaId].Targets[index+1:]...) + } + } + } + } + + rw.Unlock() + return flagTime +} + + -- Gitblit v1.8.0