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