From 82d1feccae00f5863dea6d0a85911cf92771f90b Mon Sep 17 00:00:00 2001
From: panlei <2799247126@qq.com>
Date: 星期六, 22 六月 2019 12:27:15 +0800
Subject: [PATCH] insert data

---
 /dev/null                         |    0 
 insertdata/EsClient.go            |  167 ++++++++++++++++
 util/upload.go                    |   66 ++++++
 go.sum                            |   14 
 common.go                         |    4 
 insertdata/insertDataToEs.go      |  252 +++++++++++++++++++++++++
 go.mod                            |    6 
 insertdata/insertDataToEs_test.go |    7 
 ruleserver/ruleToformula.go       |   47 ++--
 main.go                           |   24 ++
 ruleserver/timeTicker.go          |    1 
 11 files changed, 553 insertions(+), 35 deletions(-)

diff --git a/common.go b/common.go
index a0369fe..dd7ea6f 100644
--- a/common.go
+++ b/common.go
@@ -11,8 +11,8 @@
 )
 
 const (
-	FDetect   = "FaceDetect"
-	FExtract  = "FaceExtract"
+	FDetect   = "FaceDetect"     // ParamFacePos 妫�娴�
+	FExtract  = "FaceExtract"    // ParamFaceFeature  鎻愬彇
 	FProperty = "FaceProperty"
 	FCompare  = "FaceCompare"
 	FtTract   = "FaceTrack"
diff --git a/go.mod b/go.mod
index 86d0ec8..b581db8 100644
--- a/go.mod
+++ b/go.mod
@@ -3,15 +3,17 @@
 go 1.12
 
 require (
-	basic.com/dbapi.git v0.0.0-20190617110911-fa5d3510c294
-	basic.com/pubsub/protomsg.git v0.0.0-20190619101540-30768d386c39
+	basic.com/dbapi.git v0.0.0-20190622030047-3ea90a522ec1
+	basic.com/pubsub/protomsg.git v0.0.0-20190622023307-97ef3bf336ef
 	basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051
 	github.com/Microsoft/go-winio v0.4.12 // indirect
+	github.com/ajg/form v1.5.1 // indirect
 	github.com/gogo/protobuf v1.2.1 // indirect
 	github.com/golang/protobuf v1.3.1
 	github.com/gorilla/websocket v1.4.0 // indirect
 	github.com/knetic/govaluate v3.0.0+incompatible
 	github.com/pierrec/lz4 v2.2.3+incompatible
+	github.com/satori/go.uuid v1.2.0
 	github.com/tmthrgd/go-sem v0.0.0-20160607101025-0214dbf53877 // indirect
 	github.com/tmthrgd/go-shm v0.0.0-20170117044846-90afcfcd5ee9 // indirect
 	github.com/tmthrgd/shm-go v0.0.0-20170130075737-7207ca97b290 // indirect
diff --git a/go.sum b/go.sum
index 9c65692..3fc98a6 100644
--- a/go.sum
+++ b/go.sum
@@ -1,14 +1,14 @@
-basic.com/dbapi.git v0.0.0-20190617110911-fa5d3510c294 h1:DPtNV4iwgwx6KZ9/Zx7m5Rlhto4w3eKu38JYWhluX44=
-basic.com/dbapi.git v0.0.0-20190617110911-fa5d3510c294/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
-basic.com/pubsub/protomsg.git v0.0.0-20190618064639-ad379d891965 h1:fo7P3P4XNZGRWgUIOMTNR3JtqmT0gObCSU7PlvizUbk=
-basic.com/pubsub/protomsg.git v0.0.0-20190618064639-ad379d891965/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
-basic.com/pubsub/protomsg.git v0.0.0-20190619101540-30768d386c39 h1:eTlC2Li3IDLyF3uJwFnkSw0YWDQQg9UYqm97356MEJI=
-basic.com/pubsub/protomsg.git v0.0.0-20190619101540-30768d386c39/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/dbapi.git v0.0.0-20190622030047-3ea90a522ec1 h1:MAAgMzO1rd9+gYYksrtOWIB4dqQZvZEjwaZImygpSgk=
+basic.com/dbapi.git v0.0.0-20190622030047-3ea90a522ec1/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
+basic.com/pubsub/protomsg.git v0.0.0-20190622023307-97ef3bf336ef h1:gUV9FEa23v+2AY4Rvrwh6omHBlV+qyae58GTU8NAv3Y=
+basic.com/pubsub/protomsg.git v0.0.0-20190622023307-97ef3bf336ef/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
 basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051 h1:9flC2o3kasaM2Y6I+mY+mxmve/pyAY/UzGQZLT3lFHM=
 basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051/go.mod h1:bkYiTUGzckyNOjAgn9rB/DOjFzwoSHJlruuWQ6hu6IY=
 code.cloudfoundry.org/bytefmt v0.0.0-20180906201452-2aa6f33b730c/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc=
 github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc=
 github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
+github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
+github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
@@ -25,6 +25,8 @@
 github.com/pierrec/lz4 v2.2.3+incompatible h1:YpgKDCFg5dd0Eb+XlgrfJtH4fAqoRA1kBcKnBZ4EFSE=
 github.com/pierrec/lz4 v2.2.3+incompatible/go.mod h1:g2rHQ0wsQlPM7GZ66p1EVBh+VdeJ8s60jWWxl1M9t1Q=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/schollz/progressbar/v2 v2.12.1/go.mod h1:fBI3onORwtNtwCWJHsrXtjE3QnJOtqIZrvr3rDaF7L0=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
diff --git a/insertdata/EsClient.go b/insertdata/EsClient.go
new file mode 100644
index 0000000..7a72deb
--- /dev/null
+++ b/insertdata/EsClient.go
@@ -0,0 +1,167 @@
+package insertdata
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+    "bytes"
+)
+
+type Reps struct {
+	FaceFeature string `json:"faceFeature"`
+	ID          string
+}
+
+// 鑾峰彇es 鏁版嵁缁撴瀯
+func GetEsDataReq(url string, parama string) ([]Reps, error) {
+
+	var reps Reps
+	var repss []Reps
+	fmt.Println("es 鏌ヨ璇锋眰璺緞" + url) //  閰嶇疆淇℃伅 鑾峰彇
+	req, err := http.NewRequest("POST", url, strings.NewReader(parama))
+
+	if err != nil {
+		fmt.Println("build request error! ")
+		return nil, err
+	}
+
+	req.Header.Add("Content-Type", "application/json")
+	timeout := time.Duration(100 * time.Second)
+	client := &http.Client{Timeout: timeout}
+	resp, err := client.Do(req)
+
+	if err != nil {
+		return nil, err
+	}
+
+	defer resp.Body.Close()
+	body, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	jsonStr := string(body)
+	var dat map[string]interface{}
+	dec := json.NewDecoder(strings.NewReader(jsonStr))
+
+	if err := dec.Decode(&dat); err == io.EOF {
+		fmt.Println(err.Error())
+		return nil, err
+	} else if err != nil {
+		fmt.Println(err.Error())
+		return nil, err
+	}
+	dat, ok := dat["hits"].(map[string]interface{})
+	if !ok {
+		return nil, errors.New("data is not type of  map[string]interface{}")
+	}
+
+	for _, value := range dat["hits"].([]interface{}) {
+		source, ok := value.(map[string]interface{})["_source"].(map[string]interface{})
+		if !ok {
+			return nil, errors.New("value is not type of map[string]interface{}")
+		}
+		reps.FaceFeature, ok = source["faceFeature"].(string)
+		if !ok {
+			fmt.Println("faceFeature is not string", source["faceFeature"])
+			continue
+		}
+		reps.ID, ok = source["ID"].(string)
+		if !ok {
+			fmt.Println("ID is not string", source["ID"])
+			continue
+		}
+
+		repss = append(repss, reps)
+	}
+	return repss, nil
+
+}
+
+func PostAction(querynum int, queryindex int) ([]Reps, error) {
+    defer elapsed("page")()
+    number := strconv.Itoa(querynum)
+    point := strconv.Itoa(queryindex)
+    url := "http://192.168.1.182:9200/videopersons/_search"
+    parma := `{
+       "from":` + point + `,
+       "query": {
+   		"match_all": {}
+   	},
+   	"sort": [
+   	{
+   		"picDate": {
+   			"order": "desc"
+   		}
+   	}
+   	],
+   	"size":` + number + `,
+   	"_source": [
+   	"faceFeature",
+   	"ID"
+   	]
+   }`
+
+	repss, err := GetEsDataReq(url, parma)
+	return repss, err
+}
+
+/** 鎻掑叆es锛�
+***  url: http://192.168.1.203:9200/personaction/perVideoAction/c58dbddf-4580-43f3-b76a-3213ec809df2?pretty
+**param: // json [json slice] 
+*/
+
+/** 娣诲姞鎴栬�呭垹闄ゆ敹钘�
+*** url: http://192.168.1.203:9200/videopersons/perVideoPicture/_id/_update
+    param: []byte 
+    json: {
+        "doc": {
+            "collection": "1" // 1 is 鏀惰棌 0 鍙栨秷鏀惰棌
+        }
+        "detect_noop": false
+    }
+**/
+
+func EsReq(method string, url string, parama []byte) (err error) {
+    timeout := time.Duration(10 * time.Second) 
+    client := http.Client{
+        Timeout: timeout,
+    }
+    request, err := http.NewRequest(method, url, bytes.NewBuffer(parama)) 
+    request.Header.Set("Content-type", "application/json")
+
+    if err != nil {
+        fmt.Println("build request fail !")
+        return err 
+    }
+
+    resp, err := client.Do(request)
+    if err != nil{
+        fmt.Println("request error: ", err)
+        return err 
+    }
+
+    defer resp.Body.Close()
+
+    body, err := ioutil.ReadAll(resp.Body)
+    if err != nil {
+        fmt.Println(err) 
+    }
+
+    fmt.Println(string(body))
+    return nil 
+}
+
+
+func elapsed(what string) func() {
+	start := time.Now()
+	return func() {
+		fmt.Printf("%s took %v\n", what, time.Since(start))
+	}
+}
diff --git a/insertdata/insertDataToEs.go b/insertdata/insertDataToEs.go
new file mode 100644
index 0000000..d41ff73
--- /dev/null
+++ b/insertdata/insertDataToEs.go
@@ -0,0 +1,252 @@
+package insertdata
+
+import (
+	"errors"
+	"fmt"
+	"encoding/json"
+	"net"
+	"time"
+
+	"basic.com/pubsub/protomsg.git"
+	"basic.com/dbapi.git"
+	"github.com/golang/protobuf/proto"
+	"ruleprocess/ruleserver"
+	"github.com/satori/go.uuid"
+)
+
+// 浜鸿劯鐨勬暟鎹粨鏋�
+type PerVideoPicture struct {
+	Id              string `json:"id"`
+	CameraId        string `json:"cameraId"`
+	CameraAddr      string `json:"cameraAddr"`
+	PicDate         string `json:"picDate"`
+	PicMaxUrl       string `json:"picMaxUrl"`
+	TaskId          string `json:"taskId"`
+	TaskName        string `json:"taskName"`
+	SdkName         string `json:"sdkName"`
+	Content         string `json:"content"`
+	LikeDate        string `json:"likeDate"`
+	Sex             int32  `json:"sex"`
+	Age             int32  `json:"age"`
+	AgeDescription  string `json:"ageDescription"`
+	Race            int32  `json:"race"`
+	SmileLevel      int32  `json:"smileLevel"`
+	BeautyLevel     int32  `json:"beautyLevel"`
+	FaceFeature     string `json:"faceFeature"`
+	PicSmUrl        string `json:"picSmUrl"`
+	VideoUrl        string `json:"videoUrl"`
+	AnalyServerId   string `json:"analyServerId"`
+	AnalyServerName string `json:"analyServerName"`
+	AnalyServerIp   string `json:"analyServerIp"`
+	ClusterId       string `json:"clusterId"`
+	IsAlarm         string `json:"isAlarm"`
+	IsAckAlarm      string `json:"isAckAlarm"`
+	IsCollect       string `json:"isCollect"`
+	IsDelete        int    `json:"isDelete"`
+	BaseInfo        Base   `json:"baseInfo"`
+}
+
+type Base struct {
+	TableId      string  `json:"tableId"`
+	TableName    string  `json:"tableName"`
+	CompareScore float64 `json:"compareScore"`
+	PersonId     string  `json:"personId"`
+	PersonName   string  `json:"personName"`
+	PersonPicUrl string  `json:"personPicUrl"`
+	PhoneNum     string  `json:"phoneNum"`
+	Sex          string  `json:"sex"`
+	IdCard       string  `json:"idCard"`
+	MonitorLevel string  `json:"monitorLevel"`
+	Content      string  `json:"content"`
+}
+
+//  yolo琛屼负鐨勬暟鎹粨鏋�
+type Personaction struct {
+	Id              string `json:"id"`
+	CameraId        string `json:"cameraId"`
+	CameraName      string `json:"cameraName"`
+	CameraAddr      string `json:"cameraAddr"`
+	TaskId          string `json:"taskId"`
+	TaskName        string `json:"taskName"`
+	SdkName         string `json:"sdkName"`
+	Content         string `json:"content"`
+	AlarmRules      []AlarmRule
+	AnalyServerId   string `json:"analyServerId"`
+	AnalyServerName string `json:"analyServerName"`
+	AnalyServerIp   string `json:"analyServerIp"`
+	ClusterId       string `json:"clusterId"`
+	PicUrl          string `json:"picUrl"`
+	PicDate         string `json:"picDate"`
+	VideoUrl        string `json:"videoUrl"`
+	IsAlarm         string `json:"isAlarm"`
+	IsAckAlarm      string `json:"isAckAlarm"`
+	IsCollect       string `json:"isCollect"`
+	IsDelete        int    `json:"isDelete"`
+}
+
+type AlarmRule struct {
+	GroupId    string `json:"groupId"`
+	AlarmLevel string `json:"alarmLevel"`
+	RuleText   string `json:"ruleText"`
+}
+
+func InsertToEs(msg ruleserver.ResultMsg) {
+	fmt.Println("寰�ES鎻掓暟鎹�")
+
+	for _, sdkinfo := range msg.Tasklab.Sdkinfos {
+		if sdkinfo.Sdktype == "FaceDetect" {
+			faceParam := protomsg.ParamFacePos{}
+			err1 := proto.Unmarshal(sdkinfo.Sdkdata, &faceParam)
+			if err1 != nil {
+				fmt.Println("瑙f瀽sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err1)
+				continue
+			}
+			for _, face := range faceParam.Faces {
+				pervideo := PerVideoPicture{
+					uuid.NewV4().String(),
+					msg.Cid,
+					msg.Caddr,
+					time.Now().Format("2006-01-02 15:04:05"),
+					"",
+					msg.Tasklab.Taskid,
+					msg.Tasklab.Taskname,
+					sdkinfo.SdkName,
+					"",
+					"",
+					face.Result.Gender,
+					face.Result.Age,
+					"",
+					face.Result.Race,
+					face.Result.Smile,
+					face.Result.Beauty,
+					"涓嶆槸姣忎釜浜鸿劯绠楁硶閮芥湁",
+					"---",
+					"",
+					"",
+					"",
+					"",
+					"",
+					"",
+					"",
+					"",
+					0,
+					Base{
+						"鏄瘡涓汉鑴哥畻娉曢兘鏈夊悧",
+						"",
+						0,
+						"",
+						"",
+						"",
+						"",
+						"",
+						"",
+						"",
+						"",
+					},
+				}
+				requstbody, err := json.Marshal(pervideo)
+
+				if err != nil {
+					fmt.Println("json parse error ", err)
+					return
+
+				}
+				err = EsReq("POST", "http://192.168.1.182:9200/videopersons/perVideoPicture", requstbody)
+				if err != nil {
+					fmt.Println("es can not execute right.")
+				}
+			}
+		}
+		if sdkinfo.Sdktype == "Yolo" {
+			yoloObj := protomsg.ParamYoloObj{}
+			err1 := proto.Unmarshal(sdkinfo.Sdkdata, &yoloObj)
+			if err1 != nil {
+				fmt.Println("瑙f瀽sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err1)
+				continue
+			}
+			alarmRules := []AlarmRule{}
+			for _,result := range msg.RuleResult {
+				alarmRules = append(alarmRules,AlarmRule{result.RuleGroupId,result.AlarmLevel,result.RuleText})
+			}
+			isAlarm := ""
+			if len(alarmRules) > 0 {
+				isAlarm = "1"
+			}else {
+				isAlarm = "0"
+			}
+			// 鏌ヨ鏈満淇℃伅
+			flag,localConfig := dbapi.SysSetApi{}.GetServerInfo()
+			if !flag {
+				fmt.Println("鏌ヨ鏈満淇℃伅澶辫触锛�")
+			}
+			// 鏌ヨcameraName
+			camera,err := dbapi.CameraApi{}.GetCameraById(msg.Cid)
+			if err == nil {
+				fmt.Println("鏌ヨ鎽勫儚鏈轰俊鎭け璐�")
+			}
+			serverIp,err := GetLocalIP()
+			peraction := Personaction{
+				uuid.NewV4().String(),
+				msg.Cid,
+				camera.Name,
+				msg.Caddr,
+				msg.Tasklab.Taskid,
+				msg.Tasklab.Taskname,
+				sdkinfo.SdkName,
+				"",
+				alarmRules,
+				localConfig.ServerId,
+				localConfig.ServerName,
+				serverIp,
+				"",
+				"",
+				time.Now().Format("2006-01-02 15:04:05"),
+				"",
+				isAlarm,
+				"",
+				"",
+				0,
+			}
+			requstbody, err := json.Marshal(peraction)
+
+			if err != nil {
+				fmt.Println("json parse error ", err)
+				return
+
+			}
+			err = EsReq("POST", "http://192.168.1.182:9200/videopersons/perVideoPicture", requstbody)
+			if err != nil {
+				fmt.Println("es can not execute right.")
+			}
+		}
+
+	}
+}
+
+// 鑾峰彇鏈満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
+}
diff --git a/insertdata/insertDataToEs_test.go b/insertdata/insertDataToEs_test.go
new file mode 100644
index 0000000..1851d50
--- /dev/null
+++ b/insertdata/insertDataToEs_test.go
@@ -0,0 +1,7 @@
+package insertdata
+
+import "testing"
+
+func TestInsertToEs(t *testing.T){
+	InsertToEs()
+}
\ No newline at end of file
diff --git a/main.go b/main.go
index 6b5506e..333df4b 100644
--- a/main.go
+++ b/main.go
@@ -3,8 +3,9 @@
 import (
 	"fmt"
 	"ruleprocess/ruleserver"
+	"ruleprocess/insertdata"
+
 	"sync"
-	"analysis/work"
 	"basic.com/pubsub/protomsg.git"
 	"basic.com/valib/deliver.git"
 	"github.com/golang/protobuf/proto"
@@ -44,6 +45,9 @@
 				// 鎶奱rg閲岀殑鎵撶殑鏍囩鎷垮嚭鏉ョ粰m鍐嶅皝瑁呬竴灞�
 				resultMag := ruleserver.ResultMsg{SdkMessage: m, RuleResult: arg.RuleResult}
 				fmt.Println("鎵撳畬鏍囩鍚庣殑缁撴灉锛�",resultMag)
+
+				// 灏嗘墦瀹屾爣绛剧殑鏁版嵁鎻掑叆鍒癊S
+				insertdata.InsertToEs(resultMag)
 			}
 		}
 	}
@@ -77,7 +81,7 @@
 	arg.KeepRight = false
 	arg.IsStatic = false
 	fmt.Println("浠巑ongos涓嬁鍒扮殑鏁版嵁鍖呴暱搴︿负锛�", len(msg))
-	for _, sdkinfo := range m.Tasklab.Sdkinfos {
+	for _, sdkinfo := range m.Tasklab.Sdkinfos { // yolo绠楁硶
 		if sdkinfo.Sdktype == "Yolo" {
 			yoloParam := protomsg.ParamYoloObj{}
 			err = proto.Unmarshal(sdkinfo.Sdkdata, &yoloParam)
@@ -91,6 +95,22 @@
 			}
 
 		}
+		if sdkinfo.Sdktype == "FaceDetect" { // 浜鸿劯妫�娴�
+			faceParam := protomsg.ParamFacePos{}
+			err = proto.Unmarshal(sdkinfo.Sdkdata, &faceParam)
+			if err != nil {
+				fmt.Println("瑙f瀽sdk鏁版嵁鏃跺嚭鐜伴敊璇�", err)
+				continue
+			}
+			for _, info := range faceParam.Faces {
+				photoMap := ruleserver.PhotoMap{Rects:nil, Score: float64(info.Pos.Quality)}
+				arg.Photo = append(arg.Photo, photoMap)
+			}
+		}
+		//if sdkinfo.Sdktype == "FaceExtract" { // 浜鸿劯鎻愬彇
+
+		//}
+
 	}
 	return m
 }
diff --git a/ruleprocess b/ruleprocess
deleted file mode 100755
index 09c07de..0000000
--- a/ruleprocess
+++ /dev/null
Binary files differ
diff --git a/ruleserver/ruleToformula.go b/ruleserver/ruleToformula.go
index dd8b75f..bfd6dd4 100644
--- a/ruleserver/ruleToformula.go
+++ b/ruleserver/ruleToformula.go
@@ -88,14 +88,14 @@
 
 // 浠庨�氶亾涓幏鍙栫殑sdk杈撳嚭鐨勫浘鍍忔暟鎹�(鐩墠涓昏鏄痽olo绠楁硶鐨勬暟鎹�)
 type ArgsFromSdk struct {
-	Photo       []PhotoMap
 	CameraId    string
 	TaskId      string
-	KeepRight   bool     // 鏄惁闈犲彸琛� 绠楁硶鍒ゆ柇鐨勪笌涓婁竴甯у浘鍍忕殑姣旇緝缁撴灉
-	IsStatic    bool     // 鏄惁闈欐
-	ImageWidth  int      // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚瀹� 鍍忕礌
-	ImageHeight int      // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚楂� 鍍忕礌
-	RuleResult  []Result // 杩囧畬瑙勫垯鍚庢墦鐨勬爣绛�
+	Photo       []PhotoMap // yolo绠楁硶缁撴瀯锛屼篃鍙互瀛樹汉鑴哥殑鏁版嵁锛屾瘯绔熶汉鑴镐腑鑳界敤瑙勫垯鏉ユ祴鐨勮繕鏄偅浜涘弬鏁�
+	KeepRight   bool       // 鏄惁闈犲彸琛� 绠楁硶鍒ゆ柇鐨勪笌涓婁竴甯у浘鍍忕殑姣旇緝缁撴灉
+	IsStatic    bool       // 鏄惁闈欐
+	ImageWidth  int        // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚瀹� 鍍忕礌
+	ImageHeight int        // 鎽勫儚鏈烘媿鎽勭殑鍥惧儚楂� 鍍忕礌
+	RuleResult  []Result   // 杩囧畬瑙勫垯鍚庢墦鐨勬爣绛�
 }
 
 // 灏嗕紶閫掕繃鏉ョ殑鍙傛暟杞寲涓�
@@ -110,22 +110,14 @@
 type Result struct {
 	TaskId      string // 浠诲姟id
 	RuleGroupId string // 瑙勫垯缁刬d
+	AlarmLevel  string // 鎶ヨ绛夌骇
+	RuleText    string // 鏂囧瓧鐗堣鍒欑粍
 }
 
 // 鍖呭惈N鏉¤鍒欏厓绱犵殑涓�鏁存潯瑙勫垯
 type CompleteRule struct {
 	rule string
 }
-
-// 鎽勫儚鏈哄尯鍩� 璺熸暟鎹簱鏄犲皠鐨�
-// type CameraPolygon struct {
-// 	Id            string `json:"id"`
-// 	CameraId      string `json:"camera_id"`
-// 	Name          string `json:"name"`
-// 	Polygon       string `json:"polygon"` // 鍧愭爣鐐瑰尯鍩�
-// 	TriggerLine   string `json:"trigger_line"`
-// 	DirectionLine string `json:"direction_line"`
-// }
 
 // 鏍规嵁鎽勫儚鏈篿d鎷垮埌鎽勫儚鏈烘墍鏈夊尯鍩�
 func GetPolygons(cameraId string) []protomsg.CameraPolygon {
@@ -355,7 +347,7 @@
 			if flag {
 				fmt.Println("瀹氭椂鍣ㄦ姤璀︿簡")
 				// 杩囧畬瑙勫垯鍚庢墦涓爣绛撅紝鍛婅瘔璋冪敤鑰呮湰甯ф暟鎹拡瀵瑰摢涓换鍔″摢缁勮鍒欐姤璀︿簡
-				arg.RuleResult = append(arg.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId})
+				arg.RuleResult = append(arg.RuleResult, Result{taskId, groupRule.GroupId,groupRule.AlarmLevel,groupRule.RuleText})
 				return true
 			} else {
 				return false
@@ -377,9 +369,11 @@
 			for i := 0; i < len(ruleList); i++ {
 				temp := ruleList[i].Rules // temp涓轰竴缁勫畬鏁磋鍒� 鍦ㄦ闇�瑕佸垽鏂鍒欐槸鍚︽槸鑱斿姩瑙勫垯
 				if len(temp) > 0 {
-					if strings.Contains(ruleList[i].GroupId, "link") { // groupId涓惈鏈塴ink鍒欎负鑱斿姩浠诲姟
+					if strings.Contains(ruleList[i].GroupId, "link") {
+						// groupId涓惈鏈塴ink鍒欎负鑱斿姩浠诲姟
 						linkTask(aml, arg, ruleList[i], taskId)
-					} else { // 鐙珛浠诲姟鐨勫鐞�
+					} else {
+						// 鐙珛浠诲姟鐨勫鐞�
 						singleTask(aml, arg, ruleList[i], taskId)
 					}
 				}
@@ -388,7 +382,7 @@
 	}
 }
 
-// 杩囨护瑙勫垯鍏堢瓫閫変汉鏁�
+// 杩囨护瑙勫垯鍏堢瓫閫夊嚭绗﹀悎鏉′欢鐨勭洰鏍囨暟閲�
 func filterRule(rule *protomsg.Rule, am *AreaMap) {
 	if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓�
 		if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" { // 鍒ゆ柇鐨勬槸鐩镐技鍊硷紝鍗犳瘮锛屽昂瀵哥瓑杩囨护鏉′欢锛屽鏋滃啀鏈夛紝杩樺彲浠ュ啀鍔�
@@ -449,7 +443,7 @@
 // 缁欐暟鎹簱鐨勮鍒欒〃杈惧紡浠e弬 args: 涓�鏉″瓙瑙勫垯锛屽尯鍩熸暟鎹�
 func transferParameters(rule *protomsg.Rule, am *AreaMap) string {
 	if rule.PolygonId == am.areaId { // 棣栧厛瑙勫垯鎵�瀵瑰簲鐨勫尯鍩焛d瑕佽窡鍖哄煙鏁版嵁鐨刬d瀵圭殑涓�
-		if rule.SdkArgAlias == "targetNum" { // 濡傛灉鍙傛暟鏄鍖哄煙鍐呯洰鏍囨暟閲�
+		if rule.SdkArgAlias == "targetNum" { // 濡傛灉鍙傛暟鏄鍖哄煙鍐呯洰鏍囨暟閲� 鍗硑olo
 			//fmt.Println("寰楀嚭缁撴灉闃舵", "姣旇緝鐨勮鍒欐槸锛�", rule)
 			if rule.Operator == "" {
 				return strconv.Itoa(am.targetNum) // 濡傛灉鍚庨潰涓嶈窡鎿嶄綔绗﹀氨鐩存帴杩斿洖鏁伴噺  姣斿瑕佽窡涓嬩竴涓尯鍩熸瘮杈冩暟閲忕殑灏辩洿鎺ヨ繑鍥炴湰鍖哄煙鐨勬暟閲�
@@ -460,18 +454,25 @@
 			result, _ := expression.Evaluate(nil)                      // 寰楀埌鏁板鍏紡鐨勭粨鏋�
 			return strconv.FormatBool(result.(bool))
 			// 鍔犱笂鍏充簬绠楁硶鐨勫垽鏂潯浠讹紝涓嶈兘鍙湁鍏充簬瑙勫垯鐨勶紝鏈夌殑绠楁硶鏈韩灏辨槸涓�涓鍒欙紝濡備釜浣撻潤姝紝闈犲彸琛�,鎵�浠ワ紝鎷垮埌褰撳墠瀛愯鍒欑殑sdkid鏉ュ垽鏂槸鍚︽槸閭d簺鐗规畩鐨勮鍒�
-		} else if rule.SdkId == "涓綋闈欐" { // 鏆傛椂鐢ㄦ眽瀛椾唬鏇垮暒锛屾櫄浜涙浛鎹㈡垚姝e紡鐨刬d
+		} else if rule.SdkId == "IsStatic" { // 闈欐绠楁硶
 			if am.isStatic {
 				return "true"
 			} else {
 				return "false"
 			}
-		} else if rule.SdkId == "闈犲彸琛�" { // 鏆傛椂鐢ㄦ眽瀛椾唬鏇垮暒锛屾櫄浜涙浛鎹㈡垚姝e紡鐨刬d
+		} else if rule.SdkId == "KeepRight" { // 闈犲彸琛岀畻娉�
 			if am.keepRight {
 				return "true"
 			} else {
 				return "false"
 			}
+		} else if rule.SdkId == "FaceDetect" { // 浜鸿劯妫�娴�
+			if rule.Operator == "==" || rule.Operator == ">=" || rule.Operator == "<=" || rule.Operator == "<" || rule.Operator == ">" || rule.Operator == "!=" {
+				// 濡傛灉鏄笉瑙勭煩鐨勮繛鎺ョ缁熺粺杩斿洖false 瑙勫垯涔熷彧鑳藉垽鏂汉鑴哥殑鐩镐技搴︼紝鎵�浠ヤ笉瀛樺湪鍒殑杩炴帴绗�
+				return "false"
+			} else {
+				return "false"
+			}
 		}
 
 	}
diff --git a/ruleserver/timeTicker.go b/ruleserver/timeTicker.go
index 27b553c..6cecea4 100644
--- a/ruleserver/timeTicker.go
+++ b/ruleserver/timeTicker.go
@@ -85,6 +85,7 @@
 // 	return stopChan
 // }
 
+// 缁撴瀯浣撴牴鎹煇瀛楁鎺掑簭
 type SubList []*RuleResult
 
 func (p SubList) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
diff --git a/util/upload.go b/util/upload.go
new file mode 100644
index 0000000..ce86bc1
--- /dev/null
+++ b/util/upload.go
@@ -0,0 +1,66 @@
+package util
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"log"
+	"mime/multipart"
+	"net/http"
+	"time"
+)
+var weedfsUri = "http://192.168.1.182:9500/submit"
+func PostFormData(uri string, filename, paramName string, file multipart.File) (maps map[string]interface{}, err0 error) {
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	_, err := writer.CreateFormFile(paramName, filename)
+	if err != nil {
+		return nil, err
+	}
+	boundary := writer.Boundary()
+	//close_string := fmt.Sprintf("\r\n--%s--\r\n", boundary)
+	close_buf := bytes.NewBufferString(fmt.Sprintf("\r\n--%s--\r\n", boundary))
+	request_reader := io.MultiReader(body, file, close_buf)
+	//_, err = io.Copy(part, file)
+	//writer.WriteField(key, val)
+	request, err := http.NewRequest("POST", uri, request_reader)
+	request.Header.Add("Content-Type", writer.FormDataContentType())
+	timeout := time.Duration(5 * time.Second) //瓒呮椂鏃堕棿50ms
+	client := &http.Client{Timeout: timeout}
+	resp, err := client.Do(request)
+	if err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+	defer func() {
+		if r := recover(); r != nil {
+			fmt.Printf("panic鐨勫唴瀹�%v\n", r)
+			msg := "涓婁紶鍥剧墖鏈嶅姟鍣ㄥ紓甯�"
+			if _, ok := r.(error); ok {
+				msg = r.(error).Error()
+				fmt.Println("panic--recover()寰楀埌鐨勬槸error绫诲瀷")
+			}
+			if _, ok := r.(string); ok {
+				msg = r.(string)
+				fmt.Println("panic--recover()寰楀埌鐨勬槸string绫诲瀷")
+			}
+			err0 = errors.New(msg)
+		}
+	}()
+	defer resp.Body.Close()
+	body = &bytes.Buffer{}
+	_, err = body.ReadFrom(resp.Body)
+	if err != nil {
+		log.Fatal(err)
+	}
+	fmt.Println(resp.StatusCode)
+	//fmt.Println(body)
+	//decoder := json.NewDecoder(strings.NewReader(body.String()))
+	decoder := make(map[string]interface{})
+	if err := json.Unmarshal([]byte(body.String()), &decoder); err != nil {
+		return nil, err
+	}
+	return decoder, nil
+}

--
Gitblit v1.8.0