From cbe73e3706a6494b506febd0e4a51ce1096aae1f Mon Sep 17 00:00:00 2001
From: panlei <2799247126@qq.com>
Date: 星期四, 05 十二月 2019 17:21:46 +0800
Subject: [PATCH] 加跟踪算法,进程间通讯加sleep

---
 algorithm/middleware/middleware.go   |  104 ++++-
 ruleserver/server.go                 |    2 
 go.mod                               |    1 
 ruleserver/ruleToformula.go          |   17 +
 ruleserver/readyDataForRule.go       |  110 +++---
 labelFilter/req.go                   |   33 -
 algorithm/personTrack/personTrack.go |  203 ++++++++++++
 go.sum                               |    2 
 insertdata/insertDataToEs.go         |   75 +---
 algorithm/middleware/readyData.go    |  214 ++++++++-----
 main.go                              |   90 ++---
 logger/log.xml                       |    4 
 structure/rule.go                    |   47 +-
 13 files changed, 582 insertions(+), 320 deletions(-)

diff --git a/algorithm/middleware/middleware.go b/algorithm/middleware/middleware.go
index 282e069..8657df7 100644
--- a/algorithm/middleware/middleware.go
+++ b/algorithm/middleware/middleware.go
@@ -18,6 +18,38 @@
 	resultSplice := []*structure.LittleRuleResult{}
 	sdkNames := ""
 	polygonId := ""
+	// 杩欐杩囩殑鏄椂闂存瑙勫垯锛堟椂闂存绛夛級
+	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, "false") {
+							return false,"",""  // 涓嶇鍚堟椂闂磋鍒欑殑璇濈洿鎺ヨ繑鍥烇紝涓嶅啀娴垂鏃堕棿
+						}
+						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)
+					}
+				}
+			}
+		}
+	}
 	// 鍏堣繃瀹屾潯浠惰鍒�
 	for j := 0; j < len(groupRule.Rules); j++ {
 
@@ -168,6 +200,42 @@
 			}
 		}
 	}
+	// 璺ㄦ憚鍍忔満璺熻釜
+	for j := 0; j < len(groupRule.Rules); j++ {
+		if groupRule.Rules[j].SdkId == "浜轰綋璺熻釜" && groupRule.Rules[j].SdkArgAlias != "鐏甸瓊鍙傛暟"{
+			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
+				//logger.Info("瑙勫垯鐨刬pcId涓巗dkData鐨処pcId:", ipcId, "===", sdkData.IpcId)
+				if ipcId == sdkData.IpcId {
+					//logger.Info("褰撳墠璧扮殑瑙勫垯鏄�--锛�", groupRule.Rules[j],sdkName,groupRule.Rules[j].SdkArgAlias, "---","")
+					for _, areaMap := range sdkData.AreaMapList {
+						ruleResult := CallSo(sdk.Id, groupRule.Rules[j], areaMap,lable,args,message)
+						if ruleResult.Result != "" {
+							//logger.Info("杞︾墝缁撴灉锛�", ruleResult.Result)
+							// 濡傛灉缁撴灉涓虹湡锛屾妸杩欐潯瑙勫垯涓殑鍖哄煙缃负鏈夋晥
+							if strings.Contains(ruleResult.Result, "true") {
+								areaMap.IsEffective = true
+							}
+							// 濡傛灉姝ょ粨鏋滀负鐪熶笖褰撳墠杩囩殑鏄痽olo绠楁硶锛屽簲璁颁笅姝よ鍒欐墍瀵瑰簲鐨剆dkName,鍙﹀锛岃繕瑕佸幓閲� (鍚庡姞锛氭妸姝ゆ潯瑙︾鐨勫尯鍩焛d涔熻褰曚笅鏉�)
+							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)
+						}
+					}
+				}
+			}
+		}
+	}
 	// 鍐嶈繃鍏朵粬鏁版嵁 杩欐鐩存帴寰楀埌缁撴灉锛堢湡鎴栧亣锛� 杩囩洰鏍囨暟閲�
 	for j := 0; j < len(groupRule.Rules); j++ {
 		if groupRule.Rules[j].SdkArgAlias == "objCount" {
@@ -200,35 +268,7 @@
 			}
 		}
 	}
-	// 杩欐杩囩殑鏄椂闂存瑙勫垯锛堟椂闂存绛夛級
-	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)
-					}
-				}
-			}
-		}
-	}
+
 	// 灏嗘暟缁勬寜sort鎺掑簭
 	sort.Sort(ruleserver.ResultList(resultSplice))
 	// 鎺掑簭鍚庡彇鍚勮嚜鐨勭粨鏋滃拰杩炴帴绗︽嫾鍑鸿鍒欒〃杈惧紡寰楀嚭缁撴灉
@@ -334,9 +374,11 @@
 		soName = "static.so"
 	} else if sdkId == "812b674b-2375-4589-919a-5c1c3278a978" {
 		soName = "plate.so"
+	} else if sdkId == "浜轰綋璺熻釜" {
+		soName = "personTrack.so"
 	}
-	//soInfo,errr := cache.GetSoInfoById(sdkId)
-	//if errr != nil {
+	//soInfo,err := cache.GetSoInfoById(sdkId)
+	//if err != nil {
 	//	panic("娌¤鍒版敞鍐岃〃")
 	//}
 	//soName := soInfo.SoName
diff --git a/algorithm/middleware/readyData.go b/algorithm/middleware/readyData.go
index ee8c813..8b367f8 100644
--- a/algorithm/middleware/readyData.go
+++ b/algorithm/middleware/readyData.go
@@ -35,7 +35,7 @@
 			// 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁�
 			a.TargetNum++
 			uuid := uuid.NewV4().String()
-			arg1 := structure.Arg{obj.Id,uuid,obj.Score, ruleserver.PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature, obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}}
+			arg1 := structure.Arg{structure.SourceArg{obj.Id,uuid,obj.Score, ruleserver.PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature,obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}},structure.SourceArg{}}
 			//logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1)
 			a.Args = append(a.Args, &arg1)
 			a.FilterData = append(a.FilterData, &arg1)
@@ -106,91 +106,135 @@
 	logger.Info("鎺ュ埌鏁版嵁锛屾憚鍍忔満涓猴細", m.Cid, "鍥剧墖鐨刬d涓猴細", i.Id)
 	//logger.Info("----------------鐪嬬湅鏈夊嚑涓畻娉曪細",len(m.Tasklab.Sdkinfos))
 	for _, sdkinfo := range m.Tasklab.Sdkinfos { // yolo绠楁硶
-		if sdkinfo.Sdktype == "Yolo" {
-			arg := structure.SdkData{}
-			arg.TaskId = m.Tasklab.Taskid
-			arg.IpcId = sdkinfo.Ipcid
-			arg.IsYolo = true
-			arg.ImageWidth = int(i.Width)
-			arg.ImageHeight = int(i.Height)
-			logger.Info("-----杩借釜涔嬪悗sdkinfo.Sdkdata鐨勯暱搴︿负锛�----", len(sdkinfo.Sdkdata))
-			if len(sdkinfo.Sdkdata) > 1 {
-				// 澶т簬1鎵嶆湁鏁版嵁
-				yoloParam := protomsg.ParamYoloObj{}
-				err = proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam)
-				if err != nil {
-					logger.Info("瑙f瀽YOLO sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err)
-					continue
-				}
-				var yoloNum int = 0
-				for _, info := range yoloParam.Infos {
-					if info.Typ == 0 {
-						//logger.Debug("-------------yolo鐨勫潗鏍囨湁鍑犱釜",info.RcObj)
-						photoMap := structure.PhotoMap{Rects: rectFormat(info.RcObj), Score: float64(info.Prob) * 100, Type: "yolo",Id:strconv.Itoa(int(info.ObjID))}
-						arg.Photo = append(arg.Photo, photoMap)
-						yoloNum++
-					}
-				}
-				logger.Info("--------------杩借釜涔嬪悗yolo鐨勪釜鏁帮細", yoloNum)
-				args.Sdkdata = append(args.Sdkdata, &arg)
-			} else {
-				continue
-			}
-
-		}
-		if sdkinfo.Sdktype == "FaceDetect" { // 浜鸿劯妫�娴�
-			arg := structure.SdkData{}
-			arg.TaskId = m.Tasklab.Taskid
-			arg.IpcId = sdkinfo.Ipcid
-			arg.IsYolo = false
-			arg.ImageWidth = int(i.Width)
-			arg.ImageHeight = int(i.Height)
-			if len(sdkinfo.Sdkdata) > 1 {
-				faceParam := protomsg.ParamFacePos{}
-				err = proto.Unmarshal(sdkinfo.Sdkdata, &faceParam)
-				if err != nil {
-					logger.Info("瑙f瀽FACE sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err)
-					continue
-				}
-				logger.Info("--------------杩借釜涔嬪悗浜鸿劯鐨勪釜鏁帮細", len(faceParam.Faces))
-				for _, info := range faceParam.Faces {
-					//logger.Info("_______________________________________________绗竴娆$湅鐩镐技鍊硷細",info.Pos.FAngle.Confidence*100)
-					photoMap := structure.PhotoMap{Id: strconv.Itoa(int(info.Pos.FaceID)) , Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence * 100), Type: "face", ThftRes: *(info.Result), Feature: info.Feats}
-					arg.Photo = append(arg.Photo, photoMap)
-				}
-				args.Sdkdata = append(args.Sdkdata, &arg)
-			} else {
-				continue
-			}
-		}
-		if sdkinfo.Sdktype == "Plate" { // 杞︾墝璇嗗埆
-			arg := structure.SdkData{}
-			arg.TaskId = m.Tasklab.Taskid
-			logger.Info("杞︾墝鐨刬pcid锛�",sdkinfo.Ipcid)
-			arg.IpcId = sdkinfo.Ipcid
-			arg.IsYolo = false
-			arg.ImageWidth = int(i.Width)
-			arg.ImageHeight = int(i.Height)
-			if len(sdkinfo.Sdkdata) > 1 {
-				plateIDResult  := protomsg.PlateIDResult {}
-				err = proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult )
-				if err != nil {
-					logger.Info("瑙f瀽杞︾墝鏁版嵁鏃跺嚭鐜伴敊璇�", err)
-					continue
-				}
-				for _, info := range plateIDResult.Result {
-					logger.Info("鎺ユ敹杞︾墝鏁版嵁锛�",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation)
-					if info.NConfidence > 70 {
-						logger.Info("杞︾墝涔熺鍚堢殑鏁版嵁",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation,info.NConfidence,)
-						photoMap := structure.PhotoMap{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info}
-						arg.Photo = append(arg.Photo, photoMap)
-					}
-				}
-				args.Sdkdata = append(args.Sdkdata, &arg)
-			} else {
-				continue
-			}
+		switch sdkinfo.Sdktype {
+		case "Yolo":
+			extractYolo(args,m,sdkinfo,i)
+		case "FaceDetect":
+			extractFace(args,m,sdkinfo,i)
+		case "Plate":
+			extractCar(args,m,sdkinfo,i)
+		case "Track":
+			extractTrack(args,m,sdkinfo,i)
 		}
 	}
 	return m
 }
+
+// 鎶婁汉鑴告斁杩涘搴旂殑浜轰綋
+func FacePush2Body () {
+
+}
+// 鎻愬彇face
+func extractFace(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) {
+	arg := structure.SdkData{}
+	arg.TaskId = m.Tasklab.Taskid
+	arg.IpcId = sdkinfo.Ipcid
+	arg.IsYolo = false
+	arg.ImageWidth = int(i.Width)
+	arg.ImageHeight = int(i.Height)
+	if len(sdkinfo.Sdkdata) > 1 {
+		faceParam := protomsg.ParamFacePos{}
+		err := proto.Unmarshal(sdkinfo.Sdkdata, &faceParam)
+		if err != nil {
+			logger.Info("瑙f瀽FACE sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err)
+			return
+		}
+		logger.Info("--------------杩借釜涔嬪悗浜鸿劯鐨勪釜鏁帮細", len(faceParam.Faces))
+		for _, info := range faceParam.Faces {
+			//logger.Info("_______________________________________________绗竴娆$湅鐩镐技鍊硷細",info.Pos.FAngle.Confidence*100)
+			photoMap := structure.PhotoMap{Id: strconv.Itoa(int(info.Pos.FaceID)) , Rects: rectFormat(info.Pos.RcFace), Score: float64(info.Pos.FAngle.Confidence * 100), Type: "face", ThftRes: *(info.Result), Feature: info.Feats}
+			arg.Photo = append(arg.Photo, photoMap)
+		}
+		args.Sdkdata = append(args.Sdkdata, &arg)
+	}
+}
+// 鎻愬彇yolo
+func extractYolo(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) {
+	arg := structure.SdkData{}
+	arg.TaskId = m.Tasklab.Taskid
+	arg.IpcId = sdkinfo.Ipcid
+	arg.IsYolo = true
+	arg.ImageWidth = int(i.Width)
+	arg.ImageHeight = int(i.Height)
+	logger.Info("-----杩借釜涔嬪悗sdkinfo.Sdkdata鐨勯暱搴︿负锛�----", len(sdkinfo.Sdkdata))
+	if len(sdkinfo.Sdkdata) > 1 {
+		// 澶т簬1鎵嶆湁鏁版嵁
+		yoloParam := protomsg.ParamYoloObj{}
+		err := proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam)
+		if err != nil {
+			logger.Info("瑙f瀽YOLO sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err)
+			return
+		}
+		var yoloNum int = 0
+		for _, info := range yoloParam.Infos {
+			if info.Typ == 0 {
+				//logger.Debug("-------------yolo鐨勫潗鏍囨湁鍑犱釜",info.RcObj)
+				photoMap := structure.PhotoMap{Rects: rectFormat(info.RcObj), Score: float64(info.Prob) * 100, Type: "yolo",Id:strconv.Itoa(int(info.ObjID))}
+				arg.Photo = append(arg.Photo, photoMap)
+				yoloNum++
+			}
+		}
+		logger.Info("--------------杩借釜涔嬪悗yolo鐨勪釜鏁帮細", yoloNum)
+		args.Sdkdata = append(args.Sdkdata, &arg)
+	} else {
+		return
+	}
+}
+
+// 鎻愬彇car
+func extractCar(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) {
+	arg := structure.SdkData{}
+	arg.TaskId = m.Tasklab.Taskid
+	arg.IpcId = sdkinfo.Ipcid
+	arg.IsYolo = false
+	arg.ImageWidth = int(i.Width)
+	arg.ImageHeight = int(i.Height)
+	if len(sdkinfo.Sdkdata) > 1 {
+		plateIDResult  := protomsg.PlateIDResult {}
+		err := proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult )
+		if err != nil {
+			logger.Info("瑙f瀽杞︾墝鏁版嵁鏃跺嚭鐜伴敊璇�", err)
+			return
+		}
+		for _, info := range plateIDResult.Result {
+			logger.Info("鎺ユ敹杞︾墝鏁版嵁锛�",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation)
+			if info.NConfidence > 70 {
+				logger.Info("杞︾墝涔熺鍚堢殑鏁版嵁",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation,info.NConfidence,)
+				photoMap := structure.PhotoMap{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info}
+				arg.Photo = append(arg.Photo, photoMap)
+			}
+		}
+		args.Sdkdata = append(args.Sdkdata, &arg)
+	} else {
+		return
+	}
+}
+
+// 鎻愬彇璺熻釜
+func extractTrack(args *structure.SdkDatas,m protomsg.SdkMessage,sdkinfo *protomsg.SdkmsgWithTask,i protomsg.Image) {
+	arg := structure.SdkData{}
+	arg.TaskId = m.Tasklab.Taskid
+	arg.IpcId = sdkinfo.Ipcid
+	arg.IsYolo = false
+	arg.ImageWidth = int(i.Width)
+	arg.ImageHeight = int(i.Height)
+	if len(sdkinfo.Sdkdata) > 1 {
+		plateIDResult  := protomsg.PlateIDResult {}
+		err := proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult )
+		if err != nil {
+			logger.Info("瑙f瀽璺熻釜鐩爣鏁版嵁鏃跺嚭鐜伴敊璇�", err)
+			return
+		}
+		for _, info := range plateIDResult.Result {
+			logger.Info("鎺ユ敹杞︾墝鏁版嵁锛�",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation)
+			if info.NConfidence > 70 {
+				logger.Info("杞︾墝涔熺鍚堢殑鏁版嵁",info.FvdConf,info.NVehicleColor1,info.NPlateFlag,info.RcCarLocation,info.NConfidence,)
+				photoMap := structure.PhotoMap{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info}
+				arg.Photo = append(arg.Photo, photoMap)
+			}
+		}
+		args.Sdkdata = append(args.Sdkdata, &arg)
+	} else {
+		return
+	}
+}
\ No newline at end of file
diff --git a/algorithm/personTrack/personTrack.go b/algorithm/personTrack/personTrack.go
new file mode 100644
index 0000000..3961c0e
--- /dev/null
+++ b/algorithm/personTrack/personTrack.go
@@ -0,0 +1,203 @@
+package personTrack
+
+import (
+	"encoding/json"
+	"errors"
+	"net"
+	"strconv"
+
+	"nanomsg.org/go-mangos"
+	"nanomsg.org/go-mangos/protocol/req"
+	"nanomsg.org/go-mangos/transport/tcp"
+	"github.com/knetic/govaluate"
+	logger "github.com/alecthomas/log4go"
+
+	"basic.com/pubsub/protomsg.git"
+	"ruleprocess/structure"
+)
+
+var sender chan []byte = make(chan []byte)
+var receiver chan string = make(chan string)
+var initFlag bool = false
+var sock mangos.Socket
+func Init() {
+	go Push()
+}
+
+// 浜轰綋璺熻釜绠楁硶
+func Entrance(rule *protomsg.Rule, am *structure.AreaMap, lable *structure.Others, args *structure.SdkDatas, message *protomsg.SdkMessage) structure.LittleRuleResult {
+	if !initFlag {
+		Init()
+	}
+	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 == "threshold"{
+			return track(rule,am)
+		}
+		return structure.LittleRuleResult{}
+	} else {
+		return structure.LittleRuleResult{}
+	}
+}
+
+// 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲�
+func filterRule(rule *protomsg.Rule, am *structure.AreaMap) structure.LittleRuleResult {
+	// 澶勭悊鐨勯兘鏄痽olo鏁版嵁
+	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
+			switch rule.SdkArgAlias {
+			case "score":
+				formula = strconv.FormatFloat(arg.Score, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue
+				//logger.Info("鐩镐技搴﹀皬鍏紡锛�", formula)
+			case "proportion":
+				formula = strconv.FormatFloat(arg.Proportion, 'f', -1, 64) + " " + rule.Operator + " " + rule.SdkArgValue
+				//logger.Info("鍗犳瘮鍏紡锛�", formula)
+			case "size":
+				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}
+		}
+	}
+	return structure.LittleRuleResult{}
+}
+
+// 缁欑洰鏍囧~鍏卨iker
+func fillLiker(compareThreshold float32,arg *structure.Arg,am *structure.AreaMap) {
+	trackArg := make(map[string]interface{})
+	trackArg["esId"] = ""
+	trackArg["cameraId"] = am.CameraId
+	trackArg["bodyFeature"] = arg.Feature
+	trackArg["faceFeature"]	= arg.AttachArg.Feature
+	b,err := json.Marshal(trackArg)
+	if err != nil {
+		_ = logger.Error("json搴忓垪鍖栭敊璇�", err)
+	}
+	esId := getCompareMsg(b)
+	logger.Info("姣斿鍑烘潵鐨別sid:",esId)
+	base := structure.BaseInfo{TargetId:esId}
+	arg.Liker = append(arg.Liker, &base)
+}
+
+func track (rule *protomsg.Rule,am *structure.AreaMap) structure.LittleRuleResult{
+	var threshold float32 = 70 // 榛樿闃堝�间负70
+	if th,err := strconv.ParseFloat(rule.SdkArgValue,32); err == nil {
+		threshold = float32(th)
+	}
+	for i, arg := range am.FilterData {
+		fillLiker(threshold,arg,am)
+		if len(arg.Liker) == 0 {
+			// 濡傛灉娌℃湁鐩镐技鑰呭垯鍒犻櫎鏈洰鏍囨暟鎹�
+			am.FilterData = append(am.FilterData[:i],am.FilterData[i+1:]...)
+		}
+	}
+	if len(am.FilterData) > 0 {
+		return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort}
+	} else {
+		return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort}
+	}
+}
+
+func Push(){
+	var err error
+	var msg []byte
+
+	if sock, err = req.NewSocket(); err != nil {
+		_ = logger.Error("鍒涘缓璇锋眰socket澶辫触: %s", err.Error())
+	}
+	errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024)
+	if errSize != nil {
+		_ = logger.Error("Failed set MaxRecvSize: %v", err)
+	}
+	//sock.AddTransport(ipc.NewTransport())
+	sock.AddTransport(tcp.NewTransport())
+	serverIP, _ := GetLocalIP()
+	if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil {
+		_ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error())
+	}
+	logger.Info("搴忓垪鍖栨暟鎹�")
+	initFlag = true
+	for {
+		select {
+		// case <-ctx.Done():
+		// 	return
+		case data := <- sender:
+
+			logger.Info("鏁版嵁闀垮害涓猴細",len(data))
+
+			logger.Debug("鎺ㄩ�佹暟鎹�")
+			if err = sock.Send(data); err != nil {
+				_ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error())
+			}
+			if msg, err = sock.Recv(); err != nil {
+				_ = logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error())
+			}
+			logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg))
+			receiver <- string(msg)
+		default:
+
+		}
+	}
+}
+
+func getCompareMsg(data []byte) string{
+	sender <- data
+	return <- receiver
+}
+
+// 鑾峰彇鏈満ip
+func GetLocalIP() (ipv4 string, err error) {
+	var (
+		addrs   []net.Addr
+		addr    net.Addr
+		ipNet   *net.IPNet // IP鍦板潃
+		isIpNet bool
+	)
+	// 鑾峰彇鎵�鏈夌綉鍗�
+	if addrs, err = net.InterfaceAddrs(); err != nil {
+		return
+	}
+	// 鍙栫涓�涓潪lo鐨勭綉鍗P
+	for _, addr = range addrs {
+		// 杩欎釜缃戠粶鍦板潃鏄疘P鍦板潃: ipv4, ipv6
+		if ipNet, isIpNet = addr.(*net.IPNet); isIpNet && !ipNet.IP.IsLoopback() {
+			// 璺宠繃IPV6
+			if ipNet.IP.To4() != nil {
+				ipv4 = ipNet.IP.String() // 192.168.1.1
+				return
+			}
+		}
+	}
+
+	err = errors.New("ipv4 not found")
+	return
+}
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 5cb57ea..6d6f95a 100644
--- a/go.mod
+++ b/go.mod
@@ -20,6 +20,7 @@
 	github.com/jeanphorn/log4go v0.0.0-20190526082429-7dbb8deb9468 // indirect
 	github.com/kirinlabs/HttpRequest v0.1.5 // indirect
 	github.com/knetic/govaluate v3.0.0+incompatible
+	github.com/panjf2000/ants/v2 v2.2.2 // indirect
 	github.com/pierrec/lz4 v2.2.3+incompatible
 	github.com/satori/go.uuid v1.2.0
 	github.com/spf13/viper v1.4.0
diff --git a/go.sum b/go.sum
index e57c273..565aa64 100644
--- a/go.sum
+++ b/go.sum
@@ -114,6 +114,8 @@
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/panjf2000/ants/v2 v2.2.2 h1:TWzusBjq/IflXhy+/S6u5wmMLCBdJnB9tPIx9Zmhvok=
+github.com/panjf2000/ants/v2 v2.2.2/go.mod h1:1GFm8bV8nyCQvU5K4WvBCTG1/YBFOD2VzjffD8fV55A=
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pierrec/lz4 v2.2.3+incompatible h1:YpgKDCFg5dd0Eb+XlgrfJtH4fAqoRA1kBcKnBZ4EFSE=
diff --git a/insertdata/insertDataToEs.go b/insertdata/insertDataToEs.go
index 0825a05..3169cb9 100644
--- a/insertdata/insertDataToEs.go
+++ b/insertdata/insertDataToEs.go
@@ -1,19 +1,20 @@
 package insertdata
 
 import (
-	logger "github.com/alecthomas/log4go"
 	"encoding/base64"
 	"encoding/json"
 	"errors"
 	"net"
-	"ruleprocess/cache"
-	"ruleprocess/structure"
 	"strconv"
 	"time"
 
-	"basic.com/pubsub/protomsg.git"
 	"github.com/golang/protobuf/proto"
 	"github.com/satori/go.uuid"
+	logger "github.com/alecthomas/log4go"
+
+	"ruleprocess/cache"
+	"ruleprocess/structure"
+	"basic.com/pubsub/protomsg.git"
 	"ruleprocess/ruleserver"
 	"ruleprocess/util"
 )
@@ -27,43 +28,6 @@
 	ServerIp       string `yaml:"serverIp"`
 	ServerPort     string `yaml:"serverPort"`
 	DbTablePersons string `yaml:"dbTablePersons"`
-}
-
-//func InitInsertEs() {
-//	weedfsUrl = "http://"+WeedFs.Ip+":"+strconv.Itoa(WeedFs.UploadPort)+"/submit"
-//	videoPersonUrl = "http://"+EsInfo.Masterip+":"+EsInfo.Httpport+"/"+EsInfo.EsIndex.VideoPersons.IndexName+"/"+EsInfo.EsIndex.VideoPersons.IndexType
-//	personAction = "http://"+EsInfo.Masterip+":"+EsInfo.Httpport+"/"+EsInfo.EsIndex.Personaction.IndexName+"/"+EsInfo.EsIndex.Personaction.IndexType
-//}
-
-// 浜鸿劯鐨勬暟鎹粨鏋�
-type PerVideoPicture struct {
-	Id              string                `json:"id"`
-	CameraId        string                `json:"cameraId"`
-	CameraAddr      string                `json:"cameraAddr"`
-	CameraName      string                `json:"cameraName"`
-	PicDate         string                `json:"picDate"`
-	PicMaxUrl       []string              `json:"picMaxUrl"`
-	TaskId          string                `json:"taskId"`
-	TaskName        string                `json:"taskName"`
-	SdkName         string                `json:"sdkName"`
-	Content         string                `json:"content"`
-	AlarmRules      []AlarmRule           `json:"alarmRules"`
-	LikeDate        string                `json:"likeDate"`
-	ShowLabels      string                `json:"showLabels"`
-	OtherLabels     string                `json:"otherLabels"`
-	VideoUrl        string                `json:"videoUrl"`
-	AnalyServerId   string                `json:"analyServerId"`
-	AnalyServerName string                `json:"analyServerName"`
-	AnalyServerIp   string                `json:"analyServerIp"`
-	ClusterId       string                `json:"clusterId"`
-	IsAlarm         bool                  `json:"isAlarm"`
-	IsAckAlarm      bool                  `json:"isAckAlarm"`
-	IsCollect       bool                  `json:"isCollect"`
-	IsDelete        bool                  `json:"isDelete"`
-	BaseInfo        []*structure.BaseInfo `json:"baseInfo"`
-	TargetInfo      []Target              `json:"targetInfo"`
-	LinkTag         string                `json:"linkTag"`
-	LinkTagInfo     []*LinkInfo           `json:"linkTagInfo"`
 }
 
 type LinkInfo struct {
@@ -94,13 +58,24 @@
 	TargetInfo      []Target              `json:"targetInfo"`
 }
 
-type Target struct {
+//  缁熶竴鐨勬暟鎹粨鏋�
+type PerVideoPicture struct {
+	LinkInfo
+	LinkTag			string                `json:"linkTag"`
+	LinkTagInfo     []*LinkInfo           `json:"linkTagInfo"`
+}
+
+type SourceTarget struct {
 	TargetId       string  `json:"targetId"`
 	TargetScore    float64 `json:"targetScore"`
 	TargetType     string  `json:"targetType"`
 	Feature        string  `json:"feature"`
 	PicSmUrl       string  `json:"picSmUrl"`
 	TargetLocation Points  `json:"targetLocation"`
+}
+type Target struct {
+	SourceTarget
+	AttachTarget SourceTarget
 }
 
 type Points struct {
@@ -138,7 +113,7 @@
 		panic("閰嶇疆鏂囦欢涓嶅悎娉�")
 	}
 	weedfsUrl = "http://" + localConfig1.WebPicIp + ":" + strconv.Itoa(int(localConfig1.WebPicPort)) + "/submit"
-	videoPersonUrl = "http://" + localConfig1.AlarmIp + ":" + strconv.Itoa(int(localConfig1.AlarmPort)) + "/" + EsInfo.EsIndex.AIOcean.IndexName + "/" + EsInfo.EsIndex.AIOcean.IndexType
+	videoPersonUrl = "http://" + localConfig1.AlarmIp + ":" + strconv.Itoa(int(localConfig1.AlarmPort)) + "/" + EsInfo.EsIndex.AIOcean.IndexName + "/" + EsInfo.EsIndex.AIOcean.IndexType+"?refresh=true"
 	InsertFace(msg)
 	InsertYolo(msg)
 	InsertTarget(msg)
@@ -146,9 +121,9 @@
 
 // 寰�es涓彃鍏ヤ汉鑴哥被鍨嬫暟鎹�
 func InsertFace(msg structure.ResultMsg) {
-	if (msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.Result)) > 0) || (msg.RuleResult["plate"] != nil && len(msg.RuleResult["plate"].([]structure.Result)) > 0) {
+	if (msg.RuleResult["face"] != nil && len(msg.RuleResult["face"].([]structure.Result)) > 0) || (msg.RuleResult["plate"] != nil && len(msg.RuleResult["plate"].([]structure.Result)) > 0) || (msg.RuleResult["track"] != nil && len(msg.RuleResult["track"].([]structure.Result)) > 0) {
 		for key, results := range msg.RuleResult {
-			if key == "face" || key == "plate" {
+			if key == "face" || key == "plate" || key == "track"{
 				logger.Info("寰�ES鎻掍汉鑴告暟鎹�(鎴栬溅鐗屾暟鎹�)")
 				faces := []*ObjAndRules{}
 				faces = PutFace(faces, results.([]structure.Result))
@@ -194,6 +169,7 @@
 						target.Feature = base64.StdEncoding.EncodeToString(face.Feature)
 						target.PicSmUrl = resp["fileUrl"].(string)
 						target.TargetLocation = Points{TopLeft: Point{face.Location.X, face.Location.Y}, BottomRight: Point{face.Location.X + face.Location.Width, face.Location.Y + face.Location.Height}}
+						target.AttachTarget = SourceTarget{face.AttachArg.Id,face.AttachArg.Score,face.AttachArg.Type,base64.StdEncoding.EncodeToString(face.AttachArg.Feature),"",Points{TopLeft: Point{face.AttachArg.Location.X, face.AttachArg.Location.Y}, BottomRight: Point{face.AttachArg.Location.X + face.AttachArg.Location.Width, face.AttachArg.Location.Y + face.AttachArg.Location.Height}}}
 						var targetInfos []Target
 						targetInfos = append(targetInfos, *target)
 
@@ -205,7 +181,7 @@
 							sdkname = "杞︾墝璇嗗埆"
 						}
 						//logger.Info("浜鸿劯鐩爣target:",targetInfos)
-						pervideo := PerVideoPicture{
+						pervideo := PerVideoPicture{LinkInfo{
 							face.Uuid,
 							msg.Cid,
 							msg.Push.Cam.Addr,
@@ -231,6 +207,7 @@
 							false,
 							face.Liker,
 							targetInfos,
+						},
 							"",
 							[]*LinkInfo{},
 						}
@@ -413,7 +390,7 @@
 			if resp["fileUrl"] != nil {
 				url = append(url, resp["fileUrl"].(string))
 				//esDataId := uuid.NewV4().String()
-				peraction := PerVideoPicture{
+				peraction := PerVideoPicture{LinkInfo{
 					msg.Push.PushId,
 					msg.Cid,
 					msg.Push.Cam.Addr,
@@ -439,6 +416,7 @@
 					false,
 					nil,
 					targetInfos,
+				},
 					linkTag,
 					linkTagInfos,
 				}
@@ -575,7 +553,7 @@
 						return
 					}
 					//esDataId := uuid.NewV4().String()
-					peraction := PerVideoPicture{
+					peraction := PerVideoPicture{LinkInfo{
 						msg.Push.PushId,
 						msg.Cid,
 						msg.Push.Cam.Addr,
@@ -601,6 +579,7 @@
 						false,
 						nil,
 						targetInfos,
+					},
 						linkTag,
 						linkTagInfos,
 					}
diff --git a/labelFilter/req.go b/labelFilter/req.go
index f97352f..c6badd2 100644
--- a/labelFilter/req.go
+++ b/labelFilter/req.go
@@ -90,60 +90,43 @@
 	}
 	errSize := sock.SetOption(mangos.OptionMaxRecvSize,30*1024*1024)
 	if errSize != nil {
-		logger.Error("浼犺緭鐨勬暟鎹秴杩囧ぇ灏忛檺鍒�")
+		_ = logger.Error("浼犺緭鐨勬暟鎹秴杩囧ぇ灏忛檺鍒�")
 		return
 	}
 	errTimeOut := sock.SetOption(mangos.OptionRecvDeadline,time.Millisecond * 1500)
 	if errTimeOut != nil {
-		logger.Error("鎺ユ敹鍝嶅簲瓒呮椂")
+		_ = logger.Error("鎺ユ敹鍝嶅簲瓒呮椂")
 		return
 	}
 	errTimeOut1 := sock.SetOption(mangos.OptionSendDeadline,time.Millisecond * 1500)
 	if errTimeOut1 != nil {
-		logger.Error("鍙戦�佽秴鏃�")
+		_ = logger.Error("鍙戦�佽秴鏃�")
 		return
 	}
 	errWrite := sock.SetOption(mangos.OptionWriteQLen,5)
 	if errWrite != nil {
-		logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触")
+		_ = logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触")
 		return
 	}
 	errRead := sock.SetOption(mangos.OptionReadQLen,5)
 	if errRead != nil {
-		logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触")
+		_ = logger.Error("璁剧疆浼犺緭缂撳瓨澶у皬澶辫触")
 		return
 	}
 	sock.AddTransport(tcp.NewTransport())
 	if err = sock.Dial("tcp://"+url); err != nil {
-		logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: ", err.Error())
+		_ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: ", err.Error())
 	}
 	logger.Info("搴忓垪鍖栨暟鎹�")
 
-	//for v := range pool{
-	//	logger.Info("鏃犻檺寰幆",v.Cid)
-	//}
-	//var ch chan *structure.ResultMsg
-	//for _, v := range urlChans  {
-	//	if v.url == url{
-	//		ch = v.ch
-	//	}
-	//}
-	//logger.Info("chan淇℃伅锛�",urlPool[url])
 	for {
 		select {
 		// case <-ctx.Done():
 		// 	return
 		case data := <- urlPool[url]:
-			//logger.Info("鎺ユ敹鍒版暟鎹�",data.Cid)
-			//bytes,err1 := proto.Marshal(data)
+
 			go func(data []byte) {
-				//logger.Info("鏁版嵁闀垮害涓猴細",len(data))
-				//if err1 != nil {
-				//	logger.Info("搴忓垪鍖栧け璐ワ細",err1)
-				//}
 				start := time.Now()
-				//logger.Debug("groutine"+url+"鎺ㄩ�佹暟鎹�")
-				//bytes := []byte("ndfasojdfaidsos")
 				if err = sock.Send(data); err != nil {
 					Die("groutine"+url+"鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: ", err.Error())
 				}
@@ -156,7 +139,7 @@
 				}
 			}(data)
 		default:
-
+			time.Sleep(time.Second)
 		}
 	}
 	sock.Close()
diff --git a/logger/log.xml b/logger/log.xml
index 489baf0..af8a494 100644
--- a/logger/log.xml
+++ b/logger/log.xml
@@ -22,8 +22,8 @@
            Recommended: "[%D %T] [%L] (%S) %M"
         -->
         <property name="format">[%D %T] [%L] (%S) %M</property>
-        <property name="rotate">false</property> <!-- true enables log rotation, otherwise append -->
-        <property name="maxsize">600M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 -->
+        <property name="rotate">true</property> <!-- true enables log rotation, otherwise append -->
+        <property name="maxsize">800M</property> <!-- \d+[KMG]? Suffixes are in terms of 2**10 -->
         <property name="maxlines">10K</property> <!-- \d+[KMG]? Suffixes are in terms of thousands -->
         <property name="daily">true</property> <!-- Automatically rotates when a log message is written after midnight -->
     </filter>
diff --git a/main.go b/main.go
index f8a44a5..11dbbb4 100644
--- a/main.go
+++ b/main.go
@@ -1,23 +1,25 @@
 package main
 
 import (
-	"basic.com/dbapi.git"
-	"basic.com/pubsub/protomsg.git"
-	"basic.com/valib/deliver.git"
+
+	"flag"
+	"fmt"
+	"sync"
 	"net/http"
 	_ "net/http/pprof"
 	"plugin"
+
+	//"github.com/spf13/viper"
+	logger "github.com/alecthomas/log4go"
+	"github.com/panjf2000/ants/v2"
+
+	"basic.com/pubsub/protomsg.git"
+	"basic.com/valib/deliver.git"
 	"ruleprocess/insertdata"
 	"ruleprocess/labelFilter"
 	"ruleprocess/structure"
-	//"basic.com/valib/logger.git"
-	"flag"
-	"fmt"
-	//"github.com/spf13/viper"
-	logger "github.com/alecthomas/log4go"
 	"ruleprocess/cache"
 	"ruleprocess/ruleserver"
-	"sync"
 )
 
 var dbIp = flag.String("dbIp", "127.0.0.1", "dbserver ip")
@@ -47,6 +49,7 @@
 }
 func main() {
 	//fmt.Println("缂撳瓨鍒濆鍖栧畬鎴�",<- initchan)//dbserver鍒濆鍖栧畬姣�
+	defer ants.Release()
 	go func() {
 		http.ListenAndServe("0.0.0.0:8899",nil)
 	}()
@@ -54,17 +57,17 @@
 	wg := sync.WaitGroup{}
 	wg.Add(3)
 
-	dbapi.Init(*dbIp, *dbPort)
 	go cache.Init(initchan, *dbIp, *surveyPort, *pubPort)
 	logger.Info("cache init completed!!!", <-initchan) //dbserver鍒濆鍖栧畬姣�
 	ruleserver.Init()
 	labelFilter.Init()
+
 	go ruleserver.TimeTicker()
 	go ruleserver.StartServer()
-	//timeEle := ruleserver.TimeElement{N: 300, InitN: 300}
-	//ruleserver.TimeEleList["ruleprocess"] = &timeEle
+
 	nReciever("ipc:///tmp/sdk-2-rules-process.ipc", deliver.PushPull, 1)
 	wg.Wait()
+
 }
 func nReciever(url string, m deliver.Mode, count int) {
 	c := deliver.NewServer(m, url)
@@ -72,49 +75,39 @@
 }
 
 func nRecvImpl(c deliver.Deliver, index int) {
-
 	var msg []byte
+	//var wg1 sync.WaitGroup
+	//p,_ := ants.NewPool(100)
+	//syncCalculateSum := func() {
+	//	Task(msg)
+	//	wg1.Done()
+	//}
+	//wg1.Wait()
 	var err error
-	//msgChan := make(chan []byte,100)
 	for {
-		select {
-		// case <-ctx.Done():
-		// 	return
-		default:
-			msg, err = c.Recv()
-			//msgChan <- msg
-			if err != nil {
-				//logger.Info("recv error : ", err)
-				fmt.Println("recv error : ", err)
-				continue
-			} else {
-
-				//go func(msg []byte) {
-					//logger.Debug("褰撳墠鏃堕棿鎴筹細", time.Now().Unix())
-					//logger.Warn(time.Now().Format("2006-01-02 15:04:05"))
-					arg := structure.SdkDatas{}
-					//paramFormat(msg, &arg)
-					//start := time.Now()
-					m := CallParamFormat(msg, &arg)
-					// 杩涜瑙勫垯澶勭悊鍒ゆ柇(鎵撲笂瑙勫垯鐨勬爣绛�)
-					ruleserver.Judge(&arg, &m) // 鎶妔dkMessage浼犺繘鍘伙紝鏂逛究缂撳瓨鏁版嵁鏃舵嫾鍑轰竴涓猺esultMag
-					// 鎶奱rg閲岀殑鎵撶殑鏍囩鎷垮嚭鏉ョ粰m鍐嶅皝瑁呬竴灞�
-					resultMsg := structure.ResultMsg{SdkMessage: &m, RuleResult: arg.RuleResult}
-					ruleserver.GetAttachInfo(resultMsg.SdkMessage)
-					//ruleEnd := time.Since(start)
-					//logger.Debug("瑙勫垯鍒ゆ柇瀹屾墍鐢ㄦ椂闂达細", ruleEnd)
-					// 灏嗘墦瀹屾爣绛剧殑鏁版嵁鎻掑叆鍒癊S
-					insertdata.InsertToEs(resultMsg)
-					//esEnd := time.Since(start)
-					//logger.Debug("鎻掑叆瀹孍s鎵�鐢ㄦ椂闂达細", esEnd)
-					//浜嬩欢鎺ㄩ��
-					labelFilter.PushSomthing(resultMsg)
-				//}(msg)
-			}
+		msg, err = c.Recv()
+		if err == nil {
+			//wg1.Add(1)
+			//_ = p.Submit(syncCalculateSum)
+			Task(msg)
 		}
 	}
 }
 
+func Task (msg []byte) {
+	arg := structure.SdkDatas{}
+	//start := time.Now()
+	m := CallParamFormat(msg, &arg)
+	// 杩涜瑙勫垯澶勭悊鍒ゆ柇(鎵撲笂瑙勫垯鐨勬爣绛�)
+	ruleserver.Judge(&arg, &m) // 鎶妔dkMessage浼犺繘鍘伙紝鏂逛究缂撳瓨鏁版嵁鏃舵嫾鍑轰竴涓猺esultMag
+	// 鎶奱rg閲岀殑鎵撶殑鏍囩鎷垮嚭鏉ョ粰m鍐嶅皝瑁呬竴灞�
+	resultMsg := structure.ResultMsg{SdkMessage: &m, RuleResult: arg.RuleResult}
+	ruleserver.GetAttachInfo(resultMsg.SdkMessage)
+	// 灏嗘墦瀹屾爣绛剧殑鏁版嵁鎻掑叆鍒癊S
+	insertdata.InsertToEs(resultMsg)
+	//浜嬩欢鎺ㄩ��
+	labelFilter.PushSomthing(resultMsg)
+}
 func CallParamFormat(msg []byte, args *structure.SdkDatas) protomsg.SdkMessage{
 	//logger.Info("鍛煎彨涓棿浠舵牸寮忓寲鏁版嵁")
 	p,err :=  plugin.Open("./algorithm/middleware.so")
@@ -129,4 +122,3 @@
 	return mess
 }
 
-// 5鍒嗛挓鏀朵笉鍒版秷鎭潃姝昏嚜宸遍噸鍚�
diff --git a/ruleserver/readyDataForRule.go b/ruleserver/readyDataForRule.go
index 46420b7..bdd79c4 100644
--- a/ruleserver/readyDataForRule.go
+++ b/ruleserver/readyDataForRule.go
@@ -3,12 +3,11 @@
 import (
 	"basic.com/dbapi.git"
 	"basic.com/pubsub/protomsg.git"
-	logger "github.com/alecthomas/log4go"
 	"encoding/json"
 	"errors"
 	"fmt"
+	logger "github.com/alecthomas/log4go"
 	"github.com/golang/protobuf/proto"
-	uuid "github.com/satori/go.uuid"
 	"math"
 	"nanomsg.org/go-mangos"
 	"nanomsg.org/go-mangos/protocol/req"
@@ -229,48 +228,48 @@
 }
 
 // 璁$畻鍖哄煙鍐呯殑鐩爣鏁伴噺浠ュ強灏嗙浉浼煎害銆佸崰姣斻�佸昂瀵哥瓑鎵撳寘
-func CountAreaObjs(a *structure.AreaMap,arg *structure.SdkData) {
-
-	a.TargetNum = 0
-	threshold := 80.0       // 鐩镐技搴�
-	intersectionper := 20.0 // 鍗犳瘮
-	size := 0.0            // 灏哄
-
-	areaPoints := Json2points(a.AreaJson)
-	logger.Info("鐪嬬湅鍥剧墖鐨剋idth鍜宧eight:",arg.ImageWidth,arg.ImageHeight)
-	widthScale := float64(arg.ImageWidth) / 960
-	heigthScale := float64(arg.ImageHeight) / 540
-	for _, obj := range arg.Photo {
-		//logger.Info("------------------鐪嬬湅sdkData:", arg.SdkName, "鐨凱hoto鏁版嵁----------------", obj, "----椤轰究鐪嬬湅鍗犳瘮-----锛�", PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale))
-		if  obj.Score >= threshold && float64(obj.Rects.Width*obj.Rects.Height) >= size && PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) >= intersectionper {
-			// 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁�
-			a.TargetNum++
-			uuid := uuid.NewV4().String()
-			arg1 := structure.Arg{obj.Id,uuid,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature, obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}}
-			//logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1)
-			a.Args = append(a.Args, &arg1)
-			a.FilterData = append(a.FilterData, &arg1)
-		}
-	}
-	//logger.Info("鍖哄煙鏄細",areaPoints,"鍖哄煙鍐呯洰鏍囨暟閲忎负锛�",a.TargetNum,"---",len(a.FilterData))
-	a.Time = time.Unix(time.Now().Unix(), 0).String()[11:16]
-	//logger.Println("--------------------鐪嬬湅鍖哄煙鏁版嵁锛�",*a)
-}
-
-// 鎶妔dk浠庢暟鎹抚涓婃彁鍙栫殑鎸夌収鍖哄煙鍒嗙被褰掔疆
-func SdkDataFormat(cameraId string, arg *structure.SdkData, cameraPolygons []protomsg.CameraPolygon) {
-	logger.Info("==================================鏈瑂dkData涓В鍑烘潵鐨勭洰鏍囨暟鎹�=======================================")
-	for _, photo := range arg.Photo {
-		logger.Info("--------瑙f瀽鍑烘潵鐨勬暟鎹�---", cameraId, arg.IpcId, photo.Rects, photo.Score)
-	}
-	for _, polygon := range cameraPolygons {
-		//logger.Println("++++++鍦ㄨ繖鍎跨湅涓�涓嬪尯鍩熷晩:", polygon.Polygon)
-		areaMap := structure.AreaMap{CameraId: cameraId, AreaId: polygon.Id, AreaJson: polygon.Polygon, TriggerLine: polygon.TriggerLine, DirectionLine: polygon.DirectionLine}
-		// 涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁
-		CountAreaObjs(&areaMap,arg)
-		arg.AreaMapList = append(arg.AreaMapList, &areaMap)
-	}
-}
+//func CountAreaObjs(a *structure.AreaMap,arg *structure.SdkData) {
+//
+//	a.TargetNum = 0
+//	threshold := 80.0       // 鐩镐技搴�
+//	intersectionper := 20.0 // 鍗犳瘮
+//	size := 0.0            // 灏哄
+//
+//	areaPoints := Json2points(a.AreaJson)
+//	logger.Info("鐪嬬湅鍥剧墖鐨剋idth鍜宧eight:",arg.ImageWidth,arg.ImageHeight)
+//	widthScale := float64(arg.ImageWidth) / 960
+//	heigthScale := float64(arg.ImageHeight) / 540
+//	for _, obj := range arg.Photo {
+//		//logger.Info("------------------鐪嬬湅sdkData:", arg.SdkName, "鐨凱hoto鏁版嵁----------------", obj, "----椤轰究鐪嬬湅鍗犳瘮-----锛�", PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale))
+//		if  obj.Score >= threshold && float64(obj.Rects.Width*obj.Rects.Height) >= size && PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale) >= intersectionper {
+//			// 杩欐瑕佸榻愯〃杈惧紡閲屾墍闇�瑕佺殑鎵�鏈夊弬鏁�
+//			a.TargetNum++
+//			uuid := uuid.NewV4().String()
+//			arg1 := structure.Arg{obj.Id,uuid,obj.Score, PgsInterPercent(areaPoints, obj.Rects, widthScale, heigthScale), float64(obj.Rects.Width * obj.Rects.Height), a.AreaJson,obj.Type, obj.Rects, obj.Car,obj.Feature, obj.ThftRes, []*structure.BaseInfo{},"",structure.ResultMsg{}}
+//			//logger.Println("鏀捐繘鍘荤殑arg锛�-------", arg1)
+//			a.Args = append(a.Args, &arg1)
+//			a.FilterData = append(a.FilterData, &arg1)
+//		}
+//	}
+//	//logger.Info("鍖哄煙鏄細",areaPoints,"鍖哄煙鍐呯洰鏍囨暟閲忎负锛�",a.TargetNum,"---",len(a.FilterData))
+//	a.Time = time.Unix(time.Now().Unix(), 0).String()[11:16]
+//	//logger.Println("--------------------鐪嬬湅鍖哄煙鏁版嵁锛�",*a)
+//}
+//
+//// 鎶妔dk浠庢暟鎹抚涓婃彁鍙栫殑鎸夌収鍖哄煙鍒嗙被褰掔疆
+//func SdkDataFormat(cameraId string, arg *structure.SdkData, cameraPolygons []protomsg.CameraPolygon) {
+//	logger.Info("==================================鏈瑂dkData涓В鍑烘潵鐨勭洰鏍囨暟鎹�=======================================")
+//	for _, photo := range arg.Photo {
+//		logger.Info("--------瑙f瀽鍑烘潵鐨勬暟鎹�---", cameraId, arg.IpcId, photo.Rects, photo.Score)
+//	}
+//	for _, polygon := range cameraPolygons {
+//		//logger.Println("++++++鍦ㄨ繖鍎跨湅涓�涓嬪尯鍩熷晩:", polygon.Polygon)
+//		areaMap := structure.AreaMap{CameraId: cameraId, AreaId: polygon.Id, AreaJson: polygon.Polygon, TriggerLine: polygon.TriggerLine, DirectionLine: polygon.DirectionLine}
+//		// 涓烘瘡涓憚鍍忔満鍖哄煙濉厖鏁版嵁
+//		CountAreaObjs(&areaMap,arg)
+//		arg.AreaMapList = append(arg.AreaMapList, &areaMap)
+//	}
+//}
 
 func Push(data *protomsg.CompareArgs,sock mangos.Socket) []byte{
 	//var sock mangos.Socket
@@ -282,12 +281,12 @@
 	//}
 	errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024)
 	if errSize != nil {
-		logger.Error("Failed set MaxRecvSize: %v", err)
+		_ = logger.Error("Failed set MaxRecvSize: %v", err)
 		return nil
 	}
 	serverIP, _ := GetLocalIP()
 	if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil {
-		logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error())
+		_ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error())
 	}
 	//sock.AddTransport(ipc.NewTransport())
 	sock.AddTransport(tcp.NewTransport())
@@ -301,11 +300,11 @@
 	logger.Debug("鎺ㄩ�佹暟鎹�")
 	//bytes := []byte("ndfasojdfaidsos")
 	if err = sock.Send(bytes); err != nil {
-		logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error())
+		_ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error())
 		//os.Exit(1)
 	}
 	if msg, err = sock.Recv(); err != nil {
-		logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error())
+		_ = logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error())
 		//os.Exit(1)
 	}
 	logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg))
@@ -318,17 +317,17 @@
 	var msg []byte
 
 	if sock, err = req.NewSocket(); err != nil {
-		logger.Error("鍒涘缓璇锋眰socket澶辫触: %s", err.Error())
+		_ = logger.Error("鍒涘缓璇锋眰socket澶辫触: %s", err.Error())
 	}
 	errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024)
 	if errSize != nil {
-		logger.Error("Failed set MaxRecvSize: %v", err)
+		_ = logger.Error("Failed set MaxRecvSize: %v", err)
 	}
 	//sock.AddTransport(ipc.NewTransport())
 	sock.AddTransport(tcp.NewTransport())
 	serverIP, _ := GetLocalIP()
 	if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil {
-		logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error())
+		_ = logger.Error("璇锋眰socket鎷ㄥ彿澶辫触: %s", err.Error())
 	}
 	logger.Info("搴忓垪鍖栨暟鎹�")
 
@@ -344,19 +343,16 @@
 				logger.Info("搴忓垪鍖栧け璐ワ細",err1)
 			}
 			logger.Debug("鎺ㄩ�佹暟鎹�")
-			//bytes := []byte("ndfasojdfaidsos")
 			if err = sock.Send(bytes); err != nil {
-				logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error())
-				//os.Exit(1)
+				_ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error())
 			}
 			if msg, err = sock.Recv(); err != nil {
-				logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error())
-				//os.Exit(1)
+				_ = logger.Error("鎺ユ敹鍝嶅簲澶辫触: %s", err.Error())
 			}
 			logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg))
 			receiver <- msg
 		default:
-
+			time.Sleep(time.Second)
 		}
 	}
 }
diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go
index f200c2b..8688dab 100644
--- a/ruleserver/ruleToformula.go
+++ b/ruleserver/ruleToformula.go
@@ -196,6 +196,18 @@
 					}
 				}
 			}
+			// 璺熻釜鐩爣缁熻
+			personTrack := []*structure.Arg{}
+			for _, sdkData := range args.Sdkdata {
+				//logger.Info("鐪嬬湅sdkNames",sdkNames)
+				if sdkData.IpcId == "璺熻釜鐨刬pcId" { // 鎶婅窡韪〉闈㈢殑鍚勪釜鐩爣鐨勫潗鏍囪緭鍑�
+					for _, areaMap := range sdkData.AreaMapList {
+						if areaMap.IsEffective {
+							personTrack = append(personTrack, putFaceToResult(areaMap, personTrack)...)
+						}
+					}
+				}
+			}
 			var islink bool
 			if groupRule.SetType == "linkTask" {
 				islink = true
@@ -224,6 +236,11 @@
 				//logger.Info("-------------------杞︾墝缁撴灉鏍囩", len(args.RuleResult["plate"].([]structure.Result)))
 				//labelTypes = append(labelTypes,2)
 			}
+			if len(personTrack) > 0 {
+				args.RuleResult["track"] = append(args.RuleResult["track"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, personTrack, polygonId, islink,label})
+				//logger.Info("-------------------杞︾墝缁撴灉鏍囩", len(args.RuleResult["plate"].([]structure.Result)))
+				//labelTypes = append(labelTypes,2)
+			}
 			// 缁欐寔缁椂闂寸殑绗竴寮犺祴浜堢紦瀛樻暟鎹紙閬嶅巻澶嶅埗锛�
 			//if cacheId != "" { // 鏈夎繖甯ф暟鎹殑缂撳瓨
 			//	tempMap := make(map[string]interface{})
diff --git a/ruleserver/server.go b/ruleserver/server.go
index b1fc03f..0ee0e48 100644
--- a/ruleserver/server.go
+++ b/ruleserver/server.go
@@ -43,6 +43,8 @@
 		select {
 		case dbMsg := <-videotapChan:
 			publishMessage(dbMsg)
+		default:
+			time.Sleep(time.Second)
 		}
 	}
 }
diff --git a/structure/rule.go b/structure/rule.go
index 8ddf5fe..99604a4 100644
--- a/structure/rule.go
+++ b/structure/rule.go
@@ -5,23 +5,27 @@
 )
 
 // 姣忎釜鐩爣鐨勫弬鏁帮細鐩镐技搴︼紝鍗犳瘮锛屽昂瀵�
-type Arg struct {
-	Id         string
-	Uuid	   string
-	Score      float64 // 鍖哄煙鍐呯殑鐩爣鐨勭浉浼煎害
-	Proportion float64 // 鍖哄煙鍐呯殑鐩爣鐨勫崰姣�
-	Size       float64 // 鍖哄煙鍐呯殑鐩爣鐨勫昂瀵�
-	AreaJson   string  // 鎵�灞炲尯鍩�
-	Type       string  // 璁拌浇鏁版嵁绫诲瀷
-	Location   Rect    // 璁颁笅姣忎釜鐩爣鐨勪綅缃弬鏁帮紝鏈�鍚庣粰缁撴灉瑁呴厤鐩爣鏁版嵁鐨勬椂鍊欑敤鐨勫埌
-	Car		   *protomsg.PlateIDVehicle // 杞﹁締鍙傛暟
-	Feature    []byte
-	ThftRes    protomsg.ThftResult
-	Liker      []*BaseInfo
-	TimeLable  string
-	CacheData  ResultMsg
+type SourceArg struct {
+	Id            string
+	Uuid          string
+	Score         float64                  // 鍖哄煙鍐呯殑鐩爣鐨勭浉浼煎害
+	Proportion    float64                  // 鍖哄煙鍐呯殑鐩爣鐨勫崰姣�
+	Size          float64                  // 鍖哄煙鍐呯殑鐩爣鐨勫昂瀵�
+	AreaJson      string                   // 鎵�灞炲尯鍩�
+	Type          string                   // 璁拌浇鏁版嵁绫诲瀷
+	Location      Rect                     // 璁颁笅姣忎釜鐩爣鐨勪綅缃弬鏁帮紝鏈�鍚庣粰缁撴灉瑁呴厤鐩爣鏁版嵁鐨勬椂鍊欑敤鐨勫埌
+	Car           *protomsg.PlateIDVehicle // 杞﹁締鍙傛暟
+	Feature       []byte
+	ThftRes       protomsg.ThftResult
+	Liker         []*BaseInfo
+	TimeLable     string
+	CacheData     ResultMsg
 }
 
+type Arg struct {
+	SourceArg
+	AttachArg SourceArg
+}
 // 姣忎釜鍖哄煙鍐呯殑鍥剧墖鏁版嵁闆嗗悎
 type AreaMap struct {
 	CameraId      string
@@ -36,7 +40,7 @@
 	TargetNum     int    // 鍖哄煙鍐呯洰鏍囨暟閲�
 	Args          []*Arg // 鍖哄煙鍐呯洰鏍囬泦鍚�
 	FilterData    []*Arg // 杩囨护鍚庡尯鍩熷唴鐩爣闆嗗悎
-	AlarmObj	  []*Arg // 鍖哄煙鍐呮渶鍚庢弧瓒宠鍒欑殑鐩爣
+	AlarmObj      []*Arg // 鍖哄煙鍐呮渶鍚庢弧瓒宠鍒欑殑鐩爣
 	Time          string // 褰撳墠鏃堕棿锛堢敤浠ュ尮閰嶆椂闂磋鍒欙級
 	IsEffective   bool   // 瑙勫垯涓槸鍚︾敤鍒颁簡姝ゅ尯鍩�
 }
@@ -46,10 +50,10 @@
 	Id      string
 	Rects   Rect    // 鐭╁舰鍖哄煙鍙傛暟
 	Score   float64 // 鐩镐技搴﹀緱鍒嗭紙鏈夊澶х▼搴﹀儚涓�涓洰鏍囥�備汉鑴革紝浜轰綋鎴栬溅绛夌瓑锛�
-	Type  	string  // 璁拌浇鏁版嵁绫诲瀷
+	Type    string  // 璁拌浇鏁版嵁绫诲瀷
 	ThftRes protomsg.ThftResult
 	Feature []byte
-	Car		*protomsg.PlateIDVehicle
+	Car     *protomsg.PlateIDVehicle
 }
 
 // 姣忎釜绠楁硶瀵逛簬褰撳墠甯х敾闈㈣嚜宸辨彁鍙栫殑鏁版嵁
@@ -85,7 +89,7 @@
 	AlarmLevel   int32  // 鎶ヨ绛夌骇
 	RuleText     string // 鏂囧瓧鐗堣鍒欑粍
 	//Location     []TargetInfo // 鐩爣鐨勫潗鏍�
-	AlarmObj	 []*Arg   // 鎶ヨ鐨勭洰鏍囨暟鎹�  鎵撶畻搴熸帀涓婇潰鐨凩ocation
+	AlarmObj     []*Arg // 鎶ヨ鐨勭洰鏍囨暟鎹�  鎵撶畻搴熸帀涓婇潰鐨凩ocation
 	AlarmPolygon string // 瑙﹀彂鐨勬姤璀︽
 	IsLink       bool   // 鏄惁鏄仈鍔ㄤ换鍔�
 	Others
@@ -126,8 +130,5 @@
 	TargetPicUrl string  `json:"targetPicUrl"`
 	MonitorLevel string  `json:"monitorLevel"`
 	Content      string  `json:"content"`
-	DbLabel		 string	 `json:"labels"`
-	//PhoneNum     string  `json:"phoneNum"`
-	//Sex          string  `json:"sex"`
-	//IdCard       string  `json:"idCard"`
+	DbLabel      string  `json:"labels"`
 }

--
Gitblit v1.8.0