From bf32a74cbb28405eb116495eb2046880ecfceb66 Mon Sep 17 00:00:00 2001
From: panlei <2799247126@qq.com>
Date: 星期五, 06 十二月 2019 18:03:33 +0800
Subject: [PATCH] fix 追踪bug

---
 algorithm/personTrack/personTrack.go |   49 ++--
 go.sum                               |    8 
 insertdata/insertDataToEs.go         |  279 +++++++++++++-----------
 algorithm/middleware/readyData.go    |   68 ++++-
 go.mod                               |    9 
 ruleserver/ruleToformula.go          |  212 +++++++-----------
 structure/rule.go                    |    8 
 7 files changed, 333 insertions(+), 300 deletions(-)

diff --git a/algorithm/middleware/readyData.go b/algorithm/middleware/readyData.go
index 8b367f8..a1e0662 100644
--- a/algorithm/middleware/readyData.go
+++ b/algorithm/middleware/readyData.go
@@ -74,9 +74,6 @@
 	return rect
 }
 
-
-
-
 // 灏嗗閮ㄤ紶杩涙潵鐨剆dk鏁版嵁鍖呰В鎴� SdkDatas
 func ParamFormat(msg []byte, args *structure.SdkDatas) protomsg.SdkMessage {
 	defer func() {
@@ -113,17 +110,13 @@
 			extractFace(args,m,sdkinfo,i)
 		case "Plate":
 			extractCar(args,m,sdkinfo,i)
-		case "Track":
+		case "HumanTrack":
 			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{}
@@ -142,7 +135,7 @@
 		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}
+			photoMap := structure.PhotoMap{structure.SourcePhoto{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},nil}
 			arg.Photo = append(arg.Photo, photoMap)
 		}
 		args.Sdkdata = append(args.Sdkdata, &arg)
@@ -169,7 +162,7 @@
 		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))}
+				photoMap := structure.PhotoMap{structure.SourcePhoto{Rects: rectFormat(info.RcObj), Score: float64(info.Prob) * 100, Type: "yolo",Id:strconv.Itoa(int(info.ObjID))},nil}
 				arg.Photo = append(arg.Photo, photoMap)
 				yoloNum++
 			}
@@ -200,7 +193,7 @@
 			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}
+				photoMap := structure.PhotoMap{structure.SourcePhoto{Id: info.License,Score: float64(info.FvdConf)*100,Rects: rectFormat(info.RcCarLocation), Type: "plate", Car:info},nil}
 				arg.Photo = append(arg.Photo, photoMap)
 			}
 		}
@@ -219,22 +212,57 @@
 	arg.ImageWidth = int(i.Width)
 	arg.ImageHeight = int(i.Height)
 	if len(sdkinfo.Sdkdata) > 1 {
-		plateIDResult  := protomsg.PlateIDResult {}
-		err := proto.Unmarshal(sdkinfo.Sdkdata, &plateIDResult )
+
+		Track := protomsg.HumanTrackResult {}
+		err := proto.Unmarshal(sdkinfo.Sdkdata, &Track)
 		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)
-			}
+		for _, info := range Track.Result {
+			logger.Info("鎺ユ敹璺熻釜鏁版嵁锛�",info.Id,info.Confidence)
+			photoMap := structure.PhotoMap{structure.SourcePhoto{Id: strconv.Itoa(int(info.Id)),Score: float64(info.Confidence)*100,Rects: rectFormat(info.RcHuman), Type: "track"},nil}
+			FacePush2Body(&photoMap,m.Tasklab.Sdkinfos)
+			logger.Info("缁勮鍚庣殑璺熻釜鏁版嵁锛�",photoMap)
+			arg.Photo = append(arg.Photo, photoMap)
 		}
 		args.Sdkdata = append(args.Sdkdata, &arg)
 	} else {
 		return
 	}
+}
+
+// 鎶婁汉鑴告斁杩涘搴旂殑浜轰綋
+func FacePush2Body (photomap *structure.PhotoMap,sdkInfos []*protomsg.SdkmsgWithTask) {
+	for _,sdkinfo := range sdkInfos {
+		if sdkinfo.Sdktype == "FaceDetect" {
+			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 {
+				percent := ruleserver.PgsInterPercent(Rect2Point(photomap.Rects),rectFormat(info.Pos.RcFace), 1, 1)
+				if percent > 99 {
+					photomap.AttachObj = structure.SourcePhoto{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}
+				}
+			}
+		}
+	}
+}
+
+func Rect2Point(rect structure.Rect) []structure.Point{
+	// 鎸夐�嗘椂閽堣浆鍖�
+	points := []structure.Point{}
+	leftTop := structure.Point{rect.X,rect.Y}
+	points = append(points,leftTop)
+	leftBottom := structure.Point{rect.X,rect.Y+rect.Height}
+	points = append(points,leftBottom)
+	rightBottom := structure.Point{rect.X+rect.Width,rect.Y+rect.Height}
+	points = append(points,rightBottom)
+	rightTop := structure.Point{rect.X+rect.Width,rect.Y}
+	points = append(points,rightTop)
+	return  points
 }
\ No newline at end of file
diff --git a/algorithm/personTrack/personTrack.go b/algorithm/personTrack/personTrack.go
index 3961c0e..b6be24c 100644
--- a/algorithm/personTrack/personTrack.go
+++ b/algorithm/personTrack/personTrack.go
@@ -3,8 +3,10 @@
 import (
 	"encoding/json"
 	"errors"
+	uuid "github.com/satori/go.uuid"
 	"net"
 	"strconv"
+	"time"
 
 	"nanomsg.org/go-mangos"
 	"nanomsg.org/go-mangos/protocol/req"
@@ -94,7 +96,8 @@
 // 缁欑洰鏍囧~鍏卨iker
 func fillLiker(compareThreshold float32,arg *structure.Arg,am *structure.AreaMap) {
 	trackArg := make(map[string]interface{})
-	trackArg["esId"] = ""
+	esId := uuid.NewV4().String()
+	trackArg["esId"] = esId
 	trackArg["cameraId"] = am.CameraId
 	trackArg["bodyFeature"] = arg.Feature
 	trackArg["faceFeature"]	= arg.AttachArg.Feature
@@ -102,10 +105,15 @@
 	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)
+	dataId := getCompareMsg(b)
+	if esId == dataId { // 璇存槑娌℃瘮鍒扮浉浼肩殑浜�
+		logger.Info("娌℃瘮鍒颁汉")
+		arg.Uuid = dataId
+	} else {
+		logger.Info("姣斿鍑烘潵鐨刣ataId:",dataId)
+		base := structure.BaseInfo{TargetId:dataId}
+		arg.Liker = append(arg.Liker, &base)
+	}
 }
 
 func track (rule *protomsg.Rule,am *structure.AreaMap) structure.LittleRuleResult{
@@ -113,18 +121,20 @@
 	if th,err := strconv.ParseFloat(rule.SdkArgValue,32); err == nil {
 		threshold = float32(th)
 	}
-	for i, arg := range am.FilterData {
+	for _, 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(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}
-	}
+	//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}
+	//}
+	// 鏃犺鏈夋病鏈夌浉浼艰�呴兘瑕佽繑鍥瀟rue
+	return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort}
 }
 
 func Push(){
@@ -148,13 +158,8 @@
 	initFlag = true
 	for {
 		select {
-		// case <-ctx.Done():
-		// 	return
 		case data := <- sender:
-
-			logger.Info("鏁版嵁闀垮害涓猴細",len(data))
-
-			logger.Debug("鎺ㄩ�佹暟鎹�")
+			logger.Debug("鎺ㄩ�佹暟鎹�:",len(data))
 			if err = sock.Send(data); err != nil {
 				_ = logger.Error("鎺ㄩ�乻ocket鍙戦�佹暟鎹け璐�: %s", err.Error())
 			}
@@ -164,7 +169,7 @@
 			logger.Debug("鏁版嵁鎺ㄩ�佹垚鍔燂紒鏀跺埌鍝嶅簲,鏁版嵁闀垮害涓猴細",len(msg))
 			receiver <- string(msg)
 		default:
-
+			time.Sleep(time.Millisecond * 10)
 		}
 	}
 }
diff --git a/go.mod b/go.mod
index 6d6f95a..3dba522 100644
--- a/go.mod
+++ b/go.mod
@@ -6,21 +6,22 @@
 	basic.com/dbapi.git v0.0.0-20191025084729-a04db890e7b5
 	basic.com/fileserver/WeedFSClient.git v0.0.0-20191105073656-98059e699477
 	basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48
-	basic.com/pubsub/protomsg.git v0.0.0-20191121033547-7af037c469a7
+	basic.com/pubsub/esutil.git v0.0.0-20191205065552-198b5ecaefce
+	basic.com/pubsub/protomsg.git v0.0.0-20191206064248-c404f7d36eb2
 	basic.com/valib/deliver.git v0.0.0-20190927081905-2d390df9ede3
 	basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28
 	basic.com/valib/logger.git v0.0.0-20190928113028-4907b08c4159
 	basic.com/valib/shm.git v0.0.0-20190829074754-ad2e00879627 // indirect
 	github.com/Microsoft/go-winio v0.4.12 // indirect
 	github.com/ajg/form v1.5.1 // indirect
-	github.com/alecthomas/log4go v0.0.0-20180109082532-d146e6b86faa // indirect
+	github.com/alecthomas/log4go v0.0.0-20180109082532-d146e6b86faa
 	github.com/go-yaml/yaml v2.1.0+incompatible
 	github.com/gogo/protobuf v1.2.1
 	github.com/golang/protobuf v1.3.1
 	github.com/jeanphorn/log4go v0.0.0-20190526082429-7dbb8deb9468 // indirect
-	github.com/kirinlabs/HttpRequest v0.1.5 // indirect
+	github.com/kirinlabs/HttpRequest v0.1.5
 	github.com/knetic/govaluate v3.0.0+incompatible
-	github.com/panjf2000/ants/v2 v2.2.2 // indirect
+	github.com/panjf2000/ants/v2 v2.2.2
 	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 565aa64..7056fa9 100644
--- a/go.sum
+++ b/go.sum
@@ -6,6 +6,8 @@
 basic.com/fileserver/WeedFSClient.git v0.0.0-20191105073656-98059e699477/go.mod h1:oiXPn3wwwOi/Sbm6cDWpNWofoG5iV2Nb1V/DxLEAqYY=
 basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48 h1:BBA30Rgljn6MRieC4gUncETJDyna3ObyubTo9HEQ2M0=
 basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
+basic.com/pubsub/esutil.git v0.0.0-20191205065552-198b5ecaefce h1:VBdSBX9HZJB93+CA5Vv7XU+laljn6d997KvLwZBg3A4=
+basic.com/pubsub/esutil.git v0.0.0-20191205065552-198b5ecaefce/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw=
 basic.com/pubsub/protomsg.git v0.0.0-20190905061607-7b96dafe8f99 h1:YSmWZPp/mHoq+/L5d0iTsqjiCcVwZqEQRQAXxQFSbvY=
 basic.com/pubsub/protomsg.git v0.0.0-20190905061607-7b96dafe8f99/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
 basic.com/pubsub/protomsg.git v0.0.0-20191025080939-9b30ac3be52d h1:Lhny6vIq3GNjunE+r0ymLnpg+/n0lqwnsOAy6HbARfk=
@@ -20,6 +22,12 @@
 basic.com/pubsub/protomsg.git v0.0.0-20191121023847-bd1d8f822f8f/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
 basic.com/pubsub/protomsg.git v0.0.0-20191121033547-7af037c469a7 h1:JFN0eyyRZ2Ty/FMtoCGHDtEcJdQrIkpGfHcKk2N4IQs=
 basic.com/pubsub/protomsg.git v0.0.0-20191121033547-7af037c469a7/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/pubsub/protomsg.git v0.0.0-20191206061611-4dd5374a4e31 h1:oz/P7JqMHNAOlXyyZ2WGWW6H1C3BnPdjsPa82BAfLsU=
+basic.com/pubsub/protomsg.git v0.0.0-20191206061611-4dd5374a4e31/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/pubsub/protomsg.git v0.0.0-20191206062708-331a33663565 h1:8Pkfz7XKj2mbV9ggqbmQ0pdQ6OLStPF549TUUPUmFZA=
+basic.com/pubsub/protomsg.git v0.0.0-20191206062708-331a33663565/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/pubsub/protomsg.git v0.0.0-20191206064248-c404f7d36eb2 h1:uDXeWCPB6ZuaK2a6CpYbs7attGB2fNudzEPRTP15se0=
+basic.com/pubsub/protomsg.git v0.0.0-20191206064248-c404f7d36eb2/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
 basic.com/pubsub/sdkcompare.git v0.0.0-20190715013640-f536a4647d00 h1:sK+Tx7rvM9J2WnNIwrzMDjZSylWiKNfQO0prUBfKsDk=
 basic.com/pubsub/sdkcompare.git v0.0.0-20190715013640-f536a4647d00/go.mod h1:8by33F9E1w17Pw/rDgJGJXAo122w0wDENG14hiMS+RE=
 basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051 h1:9flC2o3kasaM2Y6I+mY+mxmve/pyAY/UzGQZLT3lFHM=
diff --git a/insertdata/insertDataToEs.go b/insertdata/insertDataToEs.go
index 0ca5793..f432036 100644
--- a/insertdata/insertDataToEs.go
+++ b/insertdata/insertDataToEs.go
@@ -15,12 +15,14 @@
 	"ruleprocess/cache"
 	"ruleprocess/structure"
 	"basic.com/pubsub/protomsg.git"
+	"basic.com/pubsub/esutil.git"
 	"ruleprocess/ruleserver"
 	"ruleprocess/util"
 )
 
 var weedfsUrl, videoPersonUrl, personAction string
-
+var serverIp string
+var serverPort string
 type conf struct {
 	PhotoUrl       string `yaml:"photoUrl"`
 	VideoPersons   string `yaml:"videoPersons"`
@@ -105,7 +107,7 @@
 func InsertToEs(msg structure.ResultMsg) {
 	defer func() {
 		if err := recover(); err != nil {
-			logger.Error("es妯″潡鍎跨殑寮傚父鎹曡幏锛�", err)
+			_ = logger.Error("es妯″潡鍎跨殑寮傚父鎹曡幏锛�", err)
 		}
 	}()
 	localConfig1, err := cache.GetServerInfo()
@@ -114,122 +116,151 @@
 	}
 	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+"?refresh=true"
-	InsertFace(msg)
-	InsertYolo(msg)
-	InsertTarget(msg)
+	serverIp = localConfig1.AlarmIp
+	serverPort = strconv.Itoa(int(localConfig1.AlarmPort))
+	for k,results := range msg.RuleResult {
+		if results != nil && len(results.([]structure.Result)) > 0{
+			switch k {
+			case "yolo":
+				InsertYolo(msg,k,results)
+			case "face":
+				InsertFace(msg,k,results)
+			case "plate":
+				InsertFace(msg,k,results)
+			case "track":
+				InsertFace(msg,k,results)
+			case "target":
+				InsertLastTarget(msg)
+			}
+		}
+	}
 }
 
 // 寰�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) || (msg.RuleResult["track"] != nil && len(msg.RuleResult["track"].([]structure.Result)) > 0) {
-		for key, results := range msg.RuleResult {
-			if key == "face" || key == "plate" || key == "track"{
-				logger.Info("寰�ES鎻掍汉鑴告暟鎹�(鎴栬溅鐗屾暟鎹�)")
-				faces := []*ObjAndRules{}
-				faces = PutFace(faces, results.([]structure.Result))
-				//logger.Info("鏁寸悊鍚庣殑鏁版嵁锛�",faces)
-				if faces != nil {
-					logger.Warn("face涓嶄负nil")
-					var imgMaxUrl []string = []string{}
-					var picTime string = ""
-					for _, face := range faces {
-						// 涓婁紶澶у浘
-						// 瑙e帇缂╁苟涓婁紶鍥剧墖
-						bdata, err := util.UnCompress(msg.Data)
-						if err != nil {
-							panic("瑙e帇缂╁浘鐗囨椂鍑虹幇閿欒")
-						}
-						alarmRules := []AlarmRule{}
-						//logger.Info("寰幆姣忎竴涓洰鏍�")
-						for _, faceResult := range face.rules {
-							alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel)
-							alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState, ""})
-						}
-						i := protomsg.Image{}
-						err = proto.Unmarshal(bdata, &i)
-						// 鍏堜紶灏忓浘锛屽啀浼犲ぇ鍥撅紝闃叉鑴镐笂鏈夌嚎
-						bytes := util.SubImg(i, int(face.Location.X), int(face.Location.Y), int(face.Location.X+face.Location.Width), int(face.Location.Y+face.Location.Height),face.Type)
-						resp, err := util.PostFormBufferData1(weedfsUrl, bytes, uuid.NewV4().String())
-						if err != nil {
-							logger.Error("涓婁紶灏忓浘鍑洪敊")
-						}
-						// 涓婁紶澶у浘
-						if len(imgMaxUrl) == 0 {
-							bigPhotoUrl := make(map[string]interface{})
-							bigPhotoUrl, err = util.DrawPolygonOnImageForFace(msg.Cid, i, msg.RuleResult["face"].([]structure.Result), weedfsUrl)
-							logger.Debug("========澶у浘璺緞锛�", bigPhotoUrl)
-							imgMaxUrl = append(imgMaxUrl, bigPhotoUrl["fileUrl"].(string))
-							picTime = i.Timestamp
-						}
-						lable, lableAttach := Feature2Jsonstr(*face)
-						var target = new(Target)
-						target.TargetId = face.Id
-						target.TargetScore = face.Score
-						target.TargetType = face.Type
-						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)
+func InsertFace(msg structure.ResultMsg,key string, results interface{}) {
+		logger.Info("寰�es鎻掑叆鎶撴媿鏁版嵁")
+		faces := []*ObjAndRules{}
+		faces = PutFace(faces, results.([]structure.Result))
+		//logger.Info("鏁寸悊鍚庣殑鏁版嵁锛�",faces)
+		if faces != nil {
+			_ = logger.Warn("face涓嶄负nil")
+			var imgMaxUrl []string = []string{}
+			var picTime string = ""
+			for _, face := range faces {
+				// 涓婁紶澶у浘
+				// 瑙e帇缂╁苟涓婁紶鍥剧墖
+				bdata, err := util.UnCompress(msg.Data)
+				if err != nil {
+					panic("瑙e帇缂╁浘鐗囨椂鍑虹幇閿欒")
+				}
+				alarmRules := []AlarmRule{}
+				//logger.Info("寰幆姣忎竴涓洰鏍�")
+				for _, faceResult := range face.rules {
+					alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel)
+					alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState, ""})
+				}
+				i := protomsg.Image{}
+				err = proto.Unmarshal(bdata, &i)
+				// 鍏堜紶灏忓浘锛屽啀浼犲ぇ鍥撅紝闃叉鑴镐笂鏈夌嚎
+				bytes := util.SubImg(i, int(face.Location.X), int(face.Location.Y), int(face.Location.X+face.Location.Width), int(face.Location.Y+face.Location.Height),face.Type)
+				resp, err := util.PostFormBufferData1(weedfsUrl, bytes, uuid.NewV4().String())
+				if err != nil {
+					_ = logger.Error("涓婁紶灏忓浘鍑洪敊")
+				}
+				// 涓婁紶澶у浘
+				if len(imgMaxUrl) == 0 {
+					bigPhotoUrl := make(map[string]interface{})
+					bigPhotoUrl, err = util.DrawPolygonOnImageForFace(msg.Cid, i, msg.RuleResult["face"].([]structure.Result), weedfsUrl)
+					logger.Debug("========澶у浘璺緞锛�", bigPhotoUrl)
+					imgMaxUrl = append(imgMaxUrl, bigPhotoUrl["fileUrl"].(string))
+					picTime = i.Timestamp
+				}
+				lable, lableAttach := Feature2Jsonstr(*face)
+				var target = new(Target)
+				target.TargetId = face.Id
+				target.TargetScore = face.Score
+				target.TargetType = face.Type
+				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)
 
-						sdkname := ""
-						switch key {
-						case "face":
-							sdkname = "浜鸿劯"
-						case "plate":
-							sdkname = "杞︾墝璇嗗埆"
-						}
-						//logger.Info("浜鸿劯鐩爣target:",targetInfos)
-						pervideo := PerVideoPicture{LinkInfo{
-							face.Uuid,
-							msg.Cid,
-							msg.Push.Cam.Addr,
-							msg.Push.Cam.Name,
-							picTime,
-							imgMaxUrl,
-							msg.Tasklab.Taskid,
-							msg.Tasklab.Taskname,
-							sdkname,
-							"",
-							alarmRules,
-							time.Now().Format("2006-01-02 15:04:05"), // 鍙娴嬶紝娌℃湁姣斿鏃堕棿
-							lable,
-							lableAttach,
-							"",
-							msg.Push.ServerId,
-							msg.Push.ServerName,
-							msg.Push.LocalIp,
-							"",
-							true,
-							false,
-							false,
-							false,
-							face.Liker,
-							targetInfos,
-						},
-							"",
-							[]*LinkInfo{},
-						}
-						requstbody, err := json.Marshal(pervideo)
+				sdkname := ""
+				id := face.Uuid
+				switch key {
+				case "face":
+					sdkname = "浜鸿劯"
+				case "plate":
+					sdkname = "杞︾墝璇嗗埆"
+				case "track":
+					sdkname = "浜哄憳璺熻釜"
+					if len(face.Liker) == 1{
+						id = face.Liker[0].TargetId
+					}
+				}
+				//logger.Info("浜鸿劯鐩爣target:",targetInfos)
 
-						if err != nil {
-							logger.Info("json parse error ", err)
-							return
-						}
-						resp1, err1 := EsReq("POST", videoPersonUrl, requstbody)
-						if err1 != nil {
-							logger.Error("涓婁紶ES鍑洪敊锛�---", err1)
-						} else {
-							logger.Info("鎻掑叆es杩斿洖鐨勪俊鎭細", sdkname, "---", resp1)
-							// 鍙戝嚭褰曞儚淇″彿
-							ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: face.Uuid, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{"-1"}, Type: 1})
-						}
+				pervideo := PerVideoPicture{LinkInfo{
+					id,
+					msg.Cid,
+					msg.Push.Cam.Addr,
+					msg.Push.Cam.Name,
+					picTime,
+					imgMaxUrl,
+					msg.Tasklab.Taskid,
+					msg.Tasklab.Taskname,
+					sdkname,
+					"",
+					alarmRules,
+					time.Now().Format("2006-01-02 15:04:05"), // 鍙娴嬶紝娌℃湁姣斿鏃堕棿
+					lable,
+					lableAttach,
+					"",
+					msg.Push.ServerId,
+					msg.Push.ServerName,
+					msg.Push.LocalIp,
+					"",
+					true,
+					false,
+					false,
+					false,
+					face.Liker,
+					targetInfos,
+				},
+					"",
+					[]*LinkInfo{},
+				}
+				requstbody, err := json.Marshal(pervideo)
+
+				if err != nil {
+					logger.Info("json parse error ", err)
+					return
+				}
+				if key == "track" && len(face.Liker) == 1{
+					esid := face.Liker[0].TargetId
+					returnMsg, err1 := esutil.AppendTargetInfo(esid, string(requstbody),EsInfo.EsIndex.AIOcean.IndexName,serverIp,serverPort)
+					if err1 != nil {
+						_ = logger.Error("杩藉姞鏁版嵁鍑洪敊锛�---", err1)
+					} else {
+						logger.Info("鎻掑叆es杩斿洖鐨勪俊鎭細", returnMsg)
+						// 鍙戝嚭褰曞儚淇″彿
+						ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: face.Uuid, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{"-1"}, Type: 1})
+					}
+				} else {
+					resp1, err1 := EsReq("POST", videoPersonUrl, requstbody)
+					if err1 != nil {
+						_ = logger.Error("涓婁紶ES鍑洪敊锛�---", err1)
+					} else {
+						logger.Info("鎻掑叆es杩斿洖鐨勪俊鎭細", resp1)
+						// 鍙戝嚭褰曞儚淇″彿
+						ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: face.Uuid, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{"-1"}, Type: 1})
 					}
 				}
 			}
 		}
-	}
+
 }
 
 // 褰掔疆浜鸿劯
@@ -274,8 +305,7 @@
 }
 
 // 寰�es涓彃鍏olo鏁版嵁
-func InsertYolo(msg structure.ResultMsg) {
-	if msg.RuleResult["yolo"] != nil && len(msg.RuleResult["yolo"].([]structure.Result)) > 0 {
+func InsertYolo(msg structure.ResultMsg,key string, results interface{}) {
 		// 鍏堝垽鏂竴涓嬫暟鎹甫鐨勮鍒欐爣绛炬槸鍚︽湁鍙互鎻掑叆鐨�
 		flag := false
 		for _, res := range msg.RuleResult["yolo"].([]structure.Result) {
@@ -290,7 +320,7 @@
 			alarmRules := []AlarmRule{}
 			var targetInfos []Target
 			url := []string{}
-			for _, yoloResult := range msg.RuleResult["yolo"].([]structure.Result) {
+			for _, yoloResult := range results.([]structure.Result) {
 				if yoloResult.Others.TimeLabel == "01" || yoloResult.Others.TimeLabel == "10" {
 					// 鎷煎嚭sdkname
 					//logger.Info("搴旇杩涙潵鎵嶅鐨�")
@@ -317,7 +347,7 @@
 							err = proto.Unmarshal(bdata, &i)
 							resp1, err1 := util.DrawPolygonOnImageForYolo(msg1.Cid, i, msg1.RuleResult["yolo"].([]structure.Result), weedfsUrl)
 							if err1 != nil {
-								logger.Error("缂撳瓨鏁版嵁鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
+								_ = logger.Error("缂撳瓨鏁版嵁鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
 							} else {
 								logger.Info("涓婁紶鐨勫浘鐗囦俊鎭細", resp1)
 							}
@@ -377,7 +407,7 @@
 				//resp, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
 				resp, err = util.DrawPolygonOnImageForYolo(msg.Cid, i, msg.RuleResult["yolo"].([]structure.Result), weedfsUrl)
 				if err != nil {
-					logger.Error("鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
+					_ = logger.Error("鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
 					return
 				} else {
 					logger.Info("涓婁紶鐨勫浘鐗囦俊鎭細", resp)
@@ -431,7 +461,7 @@
 				}
 				resp1, err2 := EsReq("POST", videoPersonUrl, requstbody)
 				if err2 != nil {
-					logger.Error("寰�ES鎻掑叆鏁版嵁澶辫触", err)
+					_ = logger.Error("寰�ES鎻掑叆鏁版嵁澶辫触", err)
 				} else {
 					logger.Debug("鎻掑叆es杩斿洖鐨勬暟鎹俊鎭槸锛坹olo锛夛細", resp1)
 					// 鍙戝嚭褰曞儚淇″彿
@@ -440,19 +470,16 @@
 						logger.Info("鑱斿姩浠诲姟鐨勫綍鍍忎俊鍙凤細", index)
 						ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: msg.Push.PushId, CameraId: link.CameraId, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{strconv.Itoa(index)}, Type: 2})
 					}
-					logger.Warn("__________________________________________寰�ES鎻掑叆yolo鏁版嵁鎴愬姛")
+					_ = logger.Warn("__________________________________________寰�ES鎻掑叆yolo鏁版嵁鎴愬姛")
 					//os.Exit(1)
 				}
 			}
 		}
-	} else {
-		logger.Debug("timeLabel鏉′欢閮戒笉绗﹀悎锛�")
-	}
 }
 
 // 鎻掑叆鐩爣鎸佺画鏃堕棿鏁版嵁
 
-func InsertTarget(msg structure.ResultMsg) {
+func InsertLastTarget(msg structure.ResultMsg) {
 	if msg.RuleResult["target"] != nil && len(msg.RuleResult["target"].([]structure.Result)) > 0 {
 		// 鍏堝垽鏂竴涓嬫暟鎹甫鐨勮鍒欐爣绛炬槸鍚︽湁鍙互鎻掑叆鐨�
 		logger.Info("鎻掑叆瀹氭椂鐩爣淇℃伅锛�", len(msg.RuleResult["target"].([]structure.Result)))
@@ -517,7 +544,7 @@
 					//resp, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
 					resp, err = util.DrawPolygonOnImageForYolo(msg.Cid, i, msg.RuleResult["target"].([]structure.Result), weedfsUrl)
 					if err != nil {
-						logger.Error("鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
+						_ = logger.Error("鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
 						return
 					} else {
 						logger.Info("涓婁紶鐨勫浘鐗囦俊鎭細", resp)
@@ -594,7 +621,7 @@
 					}
 					resp1, err2 := EsReq("POST", videoPersonUrl, requstbody)
 					if err2 != nil {
-						logger.Error("寰�ES鎻掑叆鏁版嵁澶辫触", err)
+						_ = logger.Error("寰�ES鎻掑叆鏁版嵁澶辫触", err)
 					} else {
 						logger.Debug("鎻掑叆es杩斿洖鐨勬暟鎹俊鎭槸锛坱arget锛夛細", resp1)
 						// 鍙戝嚭褰曞儚淇″彿
@@ -603,7 +630,7 @@
 							logger.Info("鑱斿姩浠诲姟鐨勫綍鍍忎俊鍙凤細", index)
 							ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: msg.Push.PushId, CameraId: link.CameraId, TaskId: msg.Tasklab.Taskid, VideoUrl: msg.Push.VideoUrl, ImgId: i.Id, SdkIds: []string{strconv.Itoa(index)}, Type: 2})
 						}
-						logger.Warn("__________________________________________寰�ES鎻掑叆target鏁版嵁鎴愬姛")
+						_ = logger.Warn("__________________________________________寰�ES鎻掑叆target鏁版嵁鎴愬姛")
 						//os.Exit(1)
 					}
 				}
@@ -677,7 +704,7 @@
 	err = proto.Unmarshal(bdata, &i)
 	resp1, err1 := util.DrawPolygonOnImageForTarget(msg.Cid, i, msg.RuleResult["target"].([]structure.Result), weedfsUrl)
 	if err1 != nil {
-		logger.Error("缂撳瓨鏁版嵁鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
+		_ = logger.Error("缂撳瓨鏁版嵁鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
 	} else {
 		logger.Info("涓婁紶鐨勫浘鐗囦俊鎭細", resp1)
 	}
@@ -786,7 +813,7 @@
 							err = proto.Unmarshal(bdata, &i)
 							resp1, err1 := util.DrawPolygonOnImageForYolo(msg1.Cid, i, msg1.RuleResult["yolo"].([]structure.Result), weedfsUrl)
 							if err1 != nil {
-								logger.Error("缂撳瓨鏁版嵁鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
+								_ = logger.Error("缂撳瓨鏁版嵁鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
 							} else {
 								logger.Info("涓婁紶鐨勫浘鐗囦俊鎭細", resp1)
 							}
@@ -829,7 +856,7 @@
 				//resp, err = util.PostFormBufferData(weedfsUrl, i, uuid.NewV4().String())
 				resp, err = util.DrawPolygonOnImageForYolo(msg.Cid, i, msg.RuleResult["yolo"].([]structure.Result), weedfsUrl)
 				if err != nil {
-					logger.Error("鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
+					_ = logger.Error("鐢绘鎴栦笂浼犲浘鐗囨湇鍔″櫒鍑洪敊", err)
 					return nil
 				} else {
 					logger.Info("涓婁紶鐨勫浘鐗囦俊鎭細", resp)
diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go
index 8688dab..a231877 100644
--- a/ruleserver/ruleToformula.go
+++ b/ruleserver/ruleToformula.go
@@ -37,6 +37,7 @@
 		args.RuleResult["face"] = []structure.Result{}
 		args.RuleResult["target"] = []structure.Result{}
 		args.RuleResult["plate"] = []structure.Result{}
+		args.RuleResult["track"] = []structure.Result{}
 		//logger.Warn("浼犺繘鍘讳箣鍓嶆槸浠�涔堝痉琛岋細",args.RuleResult["yolo"])
 		if taskGroup != nil && len(taskGroup.GroupRules) > 0 {
 			// 鍏堣繃鐙珛锛屽啀杩囪仈鍔�
@@ -137,132 +138,7 @@
 		// 杩涜瀹氭椂鍣ㄧ殑澶勭悊鍜屽垽鏂�
 		timeFlag := TimerAlarm(&label, groupRule.GroupId, result)
 		if timeFlag == "01" || timeFlag == "10" || timeFlag == "11"{ // 娌℃湁瀹氭椂鍣ㄦ垨鑰呮弧瓒冲畾鏃跺櫒鏉′欢
-			// 鎵撲汉鑴告爣绛惧拰yolo鏍囩
-			// 鏈�鍚庢垚鍔熸姤璀︽墠鎶婄鍚堟潯浠剁殑浜鸿劯鏁版嵁濉炶繘缁撴灉鏍囩閲�
-			// 閰嶄簡浜鸿劯鐨勭畻娉曟墠鎶婁汉鑴哥殑鏁版嵁鐢╁嚭鏉ユ墦鏍囩
-			faces := []*structure.Arg{}
-			faceFlag := false
-			for j := 0; j < len(groupRule.Rules); j++ {
-				if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" {
-					faceFlag = true
-				}
-			}
-			for _, sdkData := range args.Sdkdata {
-				if sdkData.IpcId == "A8B73405-373D-4F23-CED2-A617EBD7EC55" && faceFlag { // sdkData閲屾湁浜鸿劯鏁版嵁涓旈厤缃簡绠楁硶鎵嶆妸绗﹀悎鏉′欢鐨勬暟鎹杩涙爣绛鹃噷鍘�
-					for _, areaMap := range sdkData.AreaMapList {
-						if areaMap.IsEffective {
-							faces = append(faces, putFaceToResult(areaMap, faces)...)
-						}
-					}
-				}
-			}
-			//logger.Info("face鏍囩鐨勯暱搴︼細",len(faces))
-			//for _,face := range faces  {
-			//	//logger.Debug("鈥斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�擾_______________鐪嬬湅浜鸿劯鐨勫潗鏍�:",face.Location)
-			//}
-			//logger.Warn("___________________________________________________________________________缁堜簬璧板畬涓囬噷闀垮緛")
-			// 鎶婁粬浠殑浣嶇疆鏁版嵁涔熶紶涓嬪幓
-			yolos := []*structure.Arg{}
-			for _, sdkData := range args.Sdkdata {
-				if sdkData.IpcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && sdkNames != "" { // 鎶妝olo鏁版嵁鐨勫悇涓洰鏍囩殑鍧愭爣杈撳嚭鏂逛究鍚庨潰鐢绘
-					for _, areaMap := range sdkData.AreaMapList {
-						if areaMap.IsEffective {
-							yolos = append(yolos, putYolosToResult(areaMap)...)
-						}
-					}
-				}
-			}
-			//logger.Debug("------locations鐨勫唴瀹癸細", yolos)
-			// 澶勭悊鐩爣瀹氭椂鏁版嵁
-			targets := []*structure.Arg{}
-			for _, sdkData := range args.Sdkdata {
-				if sdkData.IpcId == "02D54B61-0F16-C604-8567-FC4BE493C523" && sdkNames != "" { // 杈撳嚭鐩爣鏁版嵁
-					for _, areaMap := range sdkData.AreaMapList {
-						if areaMap.IsEffective {
-							targets = append(targets, putTargetsToResult(areaMap)...)
-						}
-					}
-				}
-			}
-			// 杞﹁締鐩爣缁熻
-			cars := []*structure.Arg{}
-			for _, sdkData := range args.Sdkdata {
-				//logger.Info("鐪嬬湅sdkNames",sdkNames)
-				if sdkData.IpcId == "91d923ef-6200-4549-ab1b-8e773e85d729" { // 鎶婅溅鐗屾暟鎹殑鍚勪釜鐩爣鐨勫潗鏍囪緭鍑烘柟渚垮悗闈㈢敾妗�
-					for _, areaMap := range sdkData.AreaMapList {
-						if areaMap.IsEffective {
-							cars = append(cars, putFaceToResult(areaMap, cars)...)
-						}
-					}
-				}
-			}
-			// 璺熻釜鐩爣缁熻
-			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
-			} else {
-				islink = false
-			}
-			//logger.Info("瑙﹀彂鐨勫尯鍩焛d锛�",polygonId)
-			var labelTypes []int // 0涓簓olo鏍囩锛�1涓篺ace鏍囩 2涓轰袱鑰呮爣绛�
-			if sdkNames != "" && len(targets) == 0 {
-				args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, yolos, polygonId, islink,label})
-				labelTypes = append(labelTypes,0)
-				//logger.Info("-------------------yolo缁撴灉鏍囩闀垮害", len(args.RuleResult["yolo"].([]Result)))
-			}
-			if faceFlag {
-				args.RuleResult["face"] = append(args.RuleResult["face"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, faces, polygonId, islink,label})
-				//logger.Info("-------------------face缁撴灉鏍囩", len(args.RuleResult["face"].([]structure.Result)))
-				labelTypes = append(labelTypes,1)
-			}
-			if len(targets) > 0 {
-				args.RuleResult["target"] = append(args.RuleResult["target"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, targets, polygonId, islink,label})
-				//logger.Info("-------------------鐩爣鎸佺画缁撴灉鏍囩", len(args.RuleResult["target"].([]structure.Result)))
-				//labelTypes = append(labelTypes,2)
-			}
-			if len(cars) > 0 {
-				args.RuleResult["plate"] = append(args.RuleResult["plate"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, cars, polygonId, islink,label})
-				//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{})
-			//	for k, result := range args.RuleResult {
-			//		if k == "yolo" {
-			//			tempMap[k] = []structure.Result{}
-			//			for _, res := range result.([]structure.Result) {
-			//				tempMap[k] = append(tempMap[k].([]structure.Result), res)
-			//			}
-			//		}
-			//		if k == "face" {
-			//			tempMap[k] = []structure.Result{}
-			//			for _, res := range result.([]structure.Result) {
-			//				tempMap[k] = append(tempMap[k].([]structure.Result), res)
-			//			}
-			//		}
-			//	}
-			//	rw.Lock()
-			//	TimeEleList[cacheId].CacheSdkData.RuleResult = tempMap
-			//	rw.Unlock()
-			//}
-
+			labelTypes := AssembResultLabel(args,groupRule,sdkNames,taskId,polygonId,label)
 			return true,labelTypes
 		} else {
 			return false,[]int{}
@@ -493,3 +369,87 @@
 	return
 }
 
+func AssembResultLabel(args *structure.SdkDatas, groupRule *protomsg.GroupRule,sdkNames string,taskId string,polygonId string,label structure.Others) []int{
+	faces := []*structure.Arg{}
+	yolos := []*structure.Arg{}
+	targets := []*structure.Arg{}
+	personTrack := []*structure.Arg{}
+	cars := []*structure.Arg{}
+	faceFlag := false
+	for j := 0; j < len(groupRule.Rules); j++ {
+		if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a97e" || groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" {
+			faceFlag = true
+		}
+	}
+	for _, sdkData := range args.Sdkdata {
+		switch sdkData.IpcId {
+		case "A8B73405-373D-4F23-CED2-A617EBD7EC55" :
+			if faceFlag { // sdkData閲屾湁浜鸿劯鏁版嵁涓旈厤缃簡绠楁硶鎵嶆妸绗﹀悎鏉′欢鐨勬暟鎹杩涙爣绛鹃噷鍘�
+				for _, areaMap := range sdkData.AreaMapList {
+					if areaMap.IsEffective {
+						faces = append(faces, putFaceToResult(areaMap, faces)...)
+					}
+				}
+			}
+		case "02D54B61-0F16-C604-8567-FC4BE493C523":
+			if sdkNames != "" { // 鎶妝olo鏁版嵁鐨勫悇涓洰鏍囩殑鍧愭爣杈撳嚭鏂逛究鍚庨潰鐢绘
+				for _, areaMap := range sdkData.AreaMapList {
+					if areaMap.IsEffective {
+						yolos = append(yolos, putYolosToResult(areaMap)...)
+						// 澶勭悊鐩爣瀹氭椂鏁版嵁
+						targets = append(targets, putTargetsToResult(areaMap)...)
+					}
+				}
+			}
+		case "91d923ef-6200-4549-ab1b-8e773e85d729":
+			// 杞﹁締鏁版嵁
+			for _, areaMap := range sdkData.AreaMapList {
+				if areaMap.IsEffective {
+					cars = append(cars, putFaceToResult(areaMap, cars)...)
+				}
+			}
+		case "璺熻釜鐨刬pcId":
+			// 璺熻釜鐩爣
+			for _, areaMap := range sdkData.AreaMapList {
+				if areaMap.IsEffective {
+					personTrack = append(personTrack, putFaceToResult(areaMap, personTrack)...)
+				}
+			}
+		}
+	}
+
+	var islink bool
+	if groupRule.SetType == "linkTask" {
+		islink = true
+	} else {
+		islink = false
+	}
+	//logger.Info("瑙﹀彂鐨勫尯鍩焛d锛�",polygonId)
+	var labelTypes []int // 0涓簓olo鏍囩锛�1涓篺ace鏍囩 2涓轰袱鑰呮爣绛�
+	if sdkNames != "" && len(targets) == 0 {
+		args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, yolos, polygonId, islink,label})
+		labelTypes = append(labelTypes,0)
+		//logger.Info("-------------------yolo缁撴灉鏍囩闀垮害", len(args.RuleResult["yolo"].([]Result)))
+	}
+	if faceFlag {
+		args.RuleResult["face"] = append(args.RuleResult["face"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, faces, polygonId, islink,label})
+		//logger.Info("-------------------face缁撴灉鏍囩", len(args.RuleResult["face"].([]structure.Result)))
+		labelTypes = append(labelTypes,1)
+	}
+	if len(targets) > 0 {
+		args.RuleResult["target"] = append(args.RuleResult["target"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, targets, polygonId, islink,label})
+		//logger.Info("-------------------鐩爣鎸佺画缁撴灉鏍囩", len(args.RuleResult["target"].([]structure.Result)))
+		labelTypes = append(labelTypes,2)
+	}
+	if len(cars) > 0 {
+		args.RuleResult["plate"] = append(args.RuleResult["plate"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, cars, polygonId, islink,label})
+		//logger.Info("-------------------杞︾墝缁撴灉鏍囩", len(args.RuleResult["plate"].([]structure.Result)))
+		labelTypes = append(labelTypes,3)
+	}
+	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,4)
+	}
+	return labelTypes
+}
\ No newline at end of file
diff --git a/structure/rule.go b/structure/rule.go
index 99604a4..2389cca 100644
--- a/structure/rule.go
+++ b/structure/rule.go
@@ -45,8 +45,7 @@
 	IsEffective   bool   // 瑙勫垯涓槸鍚︾敤鍒颁簡姝ゅ尯鍩�
 }
 
-// sdk杈撳嚭鐨勫浘鐗囦笂鍗曚釜鐩爣鐨勬暟鎹�
-type PhotoMap struct {
+type SourcePhoto struct {
 	Id      string
 	Rects   Rect    // 鐭╁舰鍖哄煙鍙傛暟
 	Score   float64 // 鐩镐技搴﹀緱鍒嗭紙鏈夊澶х▼搴﹀儚涓�涓洰鏍囥�備汉鑴革紝浜轰綋鎴栬溅绛夌瓑锛�
@@ -55,6 +54,11 @@
 	Feature []byte
 	Car     *protomsg.PlateIDVehicle
 }
+// sdk杈撳嚭鐨勫浘鐗囦笂鍗曚釜鐩爣鐨勬暟鎹�
+type PhotoMap struct {
+	SourcePhoto
+	AttachObj SourcePhoto
+}
 
 // 姣忎釜绠楁硶瀵逛簬褰撳墠甯х敾闈㈣嚜宸辨彁鍙栫殑鏁版嵁
 type SdkData struct {

--
Gitblit v1.8.0