From 2a9ea1c76b4f493fb974154a130ce682616c5a49 Mon Sep 17 00:00:00 2001
From: liuxiaolong <736321739@qq.com>
Date: 星期五, 26 七月 2019 13:48:11 +0800
Subject: [PATCH] logger

---
 controllers/dbtablesCon.go    |   18 +-
 controllers/fileController.go |   52 +++++++---
 controllers/es.go             |  130 ++-----------------------
 models/esSearch.go            |   27 ++--
 controllers/dbtableperson.go  |   18 +-
 5 files changed, 80 insertions(+), 165 deletions(-)

diff --git a/controllers/dbtableperson.go b/controllers/dbtableperson.go
index 0e9e2fa..bce4198 100644
--- a/controllers/dbtableperson.go
+++ b/controllers/dbtableperson.go
@@ -2,10 +2,10 @@
 
 import (
 	"encoding/json"
-	"fmt"
 	"log"
 	"strconv"
 	"time"
+	"webserver/extend/logger"
 
 	"github.com/gin-gonic/gin"
 	"github.com/satori/go.uuid"
@@ -55,10 +55,10 @@
 		"/" + config.EsInfo.EsIndex.Dbtablepersons.IndexName + "/" + config.EsInfo.EsIndex.Dbtablepersons.IndexType + "/" + personId + "?refresh=wait_for"
 	personbytes, e := json.Marshal(dbperson)
 	if e != nil {
-		fmt.Print("Json marshaling failed锛�%s\n", e)
+		logger.Debug("Json marshaling failed锛�%s\n", e)
 	}
 	params := string(personbytes)
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data, _ := esutil.PutEsDataReq(url, params)
 	//c.JSON(200, changeEsRespData(data, "娣诲姞浜哄憳鎴愬姛"))
 	result = changeEsRespData(data, "娣诲姞鎴愬姛")
@@ -89,9 +89,9 @@
 	if err != nil {
 		log.Fatalf("Json marshaling failed锛�%s", err)
 	}
-	//fmt.Printf("%s\n", dbTableByte)
+	//logger.Debugf("%s\n", dbTableByte)
 	params := "{\"doc\":" + string(dbTableByte) + "}"
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data := esutil.GetEsDataReq(url, params, false)
 	//c.JSON(200,  changeEsRespData(data,"淇敼鎴愬姛"))
 	result := changeEsRespData(data, "淇敼鎴愬姛")
@@ -119,7 +119,7 @@
 	url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport +
 		"/" + config.EsInfo.EsIndex.Dbtablepersons.IndexName + "/" + config.EsInfo.EsIndex.Dbtablepersons.IndexType + "/" + uuid + "/_update?refresh=wait_for"
 	params := "{\"doc\":{\"isDelete\":\"1\",\"updateTime\":\"" + time.Now().Format("2006-01-02 15:04:05") + "\"}}"
-	fmt.Print("鍒犻櫎璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("鍒犻櫎璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 
 	data := esutil.GetEsDataReq(url, params, false)
 
@@ -152,7 +152,7 @@
 		"/" + config.EsInfo.EsIndex.Dbtablepersons.IndexName + "/_update_by_query?refresh=wait_for" //   + config.EsInfo.EsIndex.Dbtablepersons.IndexType + "/"  + "/" + s
 	params := "{\"script\":{\"lang\":\"painless\",\"inline\":\"ctx._source.isDelete = \\\"1\\\";" +
 		"ctx._source.updateTime = \\\"" + time.Now().Format("2006-01-02 15:04:05") + "\\\"\"},\"query\":{\"terms\":{\"_id\":" + s + "}}}"
-	fmt.Print("鍒犻櫎璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("鍒犻櫎璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data := esutil.GetEsDataReq(url, params, false)
 	//c.JSON(200, changeEsRespData(data,"鍒犻櫎鎴愬姛"))
 	//result := changeEsRespData(data, "鍒犻櫎鎴愬姛")
@@ -224,7 +224,7 @@
 
 	params := "{\"query\":{\"bool\":{\"must_not\":[" +
 		"{\"term\":{\"isDelete\":\"1\"}}],\"filter\":[" + syncTerm + "]" + contentParam + "}},\"from\":" + strconv.Itoa(from) + ",\"size\":" + strconv.Itoa(size) + ",\"sort\":{\"" + orderName + "\":{\"order\":\"" + orderType + "\"}}}"
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data := esutil.GetEsDataReq(url, params, true)
 	//c.JSON(200, data)
 	util.ResponseFormat(c, code.Success, data)
@@ -292,7 +292,7 @@
 	//	"{\"term\":{\"isDelete\":\"0\"}}" + syncTerm + "]" + contentParam + "}},\"from\":" + strconv.Itoa(from) + ",\"size\":" + strconv.Itoa(size) + ",\"sort\":{\"" + orderName + "\":{\"order\":\"" + orderType + "\"}}}"
 	params := "{\"query\":{\"bool\":{\"must_not\":[" +
 		"{\"term\":{\"isDelete\":\"1\"}}],\"filter\":[" + syncTerm + "]" + contentParam + "}},\"from\":" + strconv.Itoa(from) + ",\"size\":" + strconv.Itoa(size) + ",\"sort\":{\"" + orderName + "\":{\"order\":\"" + orderType + "\"}}}"
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data := esutil.GetEsDataReq(url, params, true)
 	featByte := make([]byte, 0, 1024)
 	if len(faceUrl) > 3 { //   linux
diff --git a/controllers/dbtablesCon.go b/controllers/dbtablesCon.go
index e74d046..9a3cf28 100644
--- a/controllers/dbtablesCon.go
+++ b/controllers/dbtablesCon.go
@@ -2,13 +2,13 @@
 
 import (
 	"encoding/json"
-	"fmt"
 	"github.com/gin-gonic/gin"
 	"github.com/satori/go.uuid"
 	"log"
 	"webserver/extend/code"
 	"webserver/extend/config"
 	"webserver/extend/esutil"
+	"webserver/extend/logger"
 	"webserver/extend/util"
 	"webserver/models"
 )
@@ -38,7 +38,7 @@
 	params := "{\"query\":{\"bool\":{\"must\":[" +
 		"{\"term\":{\"isDelete\":\"0\"}}" + syncTerm + "]}}," +
 		"\"from\":0,\"size\":100,\"sort\":{\"id\":{\"order\":\"asc\"}}}"
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 
 	data := esutil.GetEsDataReq(url, params, true)
 	//c.JSON(200, data)
@@ -49,7 +49,7 @@
 func QueryDbTableInfo(tableId string) map[string]interface{} {
 	url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport +
 		"/" + config.EsInfo.EsIndex.DbTables.IndexName + "/" + config.EsInfo.EsIndex.DbTables.IndexName + "/" + tableId
-	fmt.Print("璇锋眰url:%s;", url)
+	logger.Debug("璇锋眰url:%s;", url)
 	data := esutil.GetEsDataInfo(url, true)
 	return data
 }
@@ -69,7 +69,7 @@
 	uuid := c.Params.ByName("id")
 	if uuid == "" {
 		uuid = dbtable.Id
-		fmt.Println("body涓幏鍙栧簳搴搃d")
+		logger.Debug("body涓幏鍙栧簳搴搃d")
 	}
 	url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport +
 		"/" + config.EsInfo.EsIndex.DbTables.IndexName + "/" + config.EsInfo.EsIndex.DbTables.IndexType + "/" + uuid + "/_update?refresh=wait_for"
@@ -78,9 +78,9 @@
 	if err != nil {
 		log.Fatalf("Json marshaling failed锛�%s", err)
 	}
-	fmt.Printf("%s\n", dbTableByte)
+	logger.Debug("%s\n", dbTableByte)
 	params := "{\"doc\":" + string(dbTableByte) + "}"
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data := esutil.GetEsDataReq(url, params, false)
 	//c.JSON(200, changeEsRespData(data, "淇敼鎴愬姛"))
 	result := changeEsRespData(data, "淇敼鎴愬姛")
@@ -114,9 +114,9 @@
 	if err != nil {
 		log.Fatalf("Json marshaling failed锛�%s", err)
 	}
-	//fmt.Printf("%s\n", dbTableByte)
+	//logger.Debugf("%s\n", dbTableByte)
 	params := string(dbTableByte)
-	fmt.Print("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data, _ := esutil.PutEsDataReq(url, params)
 	//c.JSON(200, changeEsRespData(data, "娣诲姞鎴愬姛"))
 	result := changeEsRespData(data, "娣诲姞鎴愬姛")
@@ -143,7 +143,7 @@
 	url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport +
 		"/" + config.EsInfo.EsIndex.DbTables.IndexName + "/" + config.EsInfo.EsIndex.DbTables.IndexType + "/" + uuid + "/_update?refresh=wait_for"
 	params := "{\"doc\":{\"isDelete\":\"1\"}}"
-	fmt.Print("鍒犻櫎璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
+	logger.Debug("鍒犻櫎璇锋眰url:%s;\n 璇锋眰鍙傛暟params:%s", url, params)
 	data := esutil.GetEsDataReq(url, params, false)
 	//c.JSON(200, changeEsRespData(data, "鍒犻櫎鎴愬姛"))
 	result := changeEsRespData(data, "鍒犻櫎鎴愬姛")
diff --git a/controllers/es.go b/controllers/es.go
index 0753d32..fe2afbc 100644
--- a/controllers/es.go
+++ b/controllers/es.go
@@ -2,7 +2,6 @@
 
 import (
 	"basic.com/dbapi.git"
-	"encoding/json"
 	"fmt"
 	"github.com/gin-gonic/gin"
 	"math/rand"
@@ -24,57 +23,33 @@
 // @Produce json
 // @Tags es
 // @Param reqMap body models.EsSearch true "collection 涓虹┖"
-// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
-// @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
+// @Success 200 {string} json "{"code":200, msg:"", success:true}"
+// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
 // @Router /data/api-v/es/queryEsCompareData [POST]
 func PostEsCompareData(c *gin.Context) {
 	searchBody := new(models.EsSearch)
-	c.BindJSON(&searchBody)
-	isEsSource := true
+	err := c.BindJSON(&searchBody)
+	if err != nil || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+		return
+	}
 	databases := searchBody.DataBases
-	page := searchBody.Page
-	if page <= 0 {
-		page = 1
-	}
-	size := searchBody.Size
-	if size <= 0 {
-		size = 8
-	}
-	from := (page - 1) * size
-	to := page * size
-	threshold := searchBody.Threshold
-	if threshold < 0 || threshold > 100 {
-		threshold = 60
-	}
-	picUrl := searchBody.PicUrl
-	/*feature := searchBody.Feature*/
-	var featByte []byte
-	if len(picUrl) > 3 { //   linux
-		/*fileName := picUrl   // picIp 瀹氫箟鍦� fileController weedfs 鏂囦欢鏈嶅姟鍣� 璁块棶 璺緞 鍓嶇紑
-		detect := gorun.GetSimpleFaceDetect(fileName)
-		if len(detect) != 1 {
-			util.ResponseFormat(c,code.TooManyFeatureFindError,"鍥剧墖鐗瑰緛鍊艰繃澶�")
-			return
-		}else {
-			featByte = detect[0]["feature"].([]byte)
-		}*/ //   linux
-	}
+	from := 0
+	to := 0
+
 	data := make(map[string]interface{})
 	searchBody.Page = 1
 	searchBody.Size = 15000
-	//searchMap := Struct2Map(*searchBody)
+
 	if len(databases) == 1 && databases[0] == "esData" {
 		searchBody.IsAggs = false
-		data = searchEsData(*searchBody)
 	} else {
-		isEsSource = false
 		data = service.QueryDbPersonsForCompare(*searchBody)
 	}
 	sources := data["datalist"].([]interface{})
 
 	if len(sources) > 0 {
 		//杩涜姣斿
-		sources = sourceCompare(sources, isEsSource, featByte, threshold)
 	} else {
 		fmt.Println("鏌ヨ鏉′欢涓嬫棤鏁版嵁 source 鏁版嵁涓虹┖锛�" + string(len(sources)))
 	}
@@ -86,79 +61,13 @@
 	if to > dataLen {
 		to = dataLen
 	}
-	sources = sources[from:to] // 鏁版嵁 閮ㄥ垎鑾峰彇
-	if !isEsSource {           //  浜哄憳鏁版嵁瑕佸姞搴曞簱鍚嶇О
-		for _, sou := range sources {
-			tableId := sou.(map[string]interface{})["tableId"]
-			if tableId != nil {
-				info := QueryDbTableInfo(tableId.(string))
-				if info["tableName"] != nil {
-					sou.(map[string]interface{})["tableName"] = info["tableName"]
-				} else {
-					sou.(map[string]interface{})["tableName"] = "鍏朵粬"
-				}
-				if info["bwType"] != nil {
-					sou.(map[string]interface{})["bwType"] = info["bwType"]
-				} else {
-					sou.(map[string]interface{})["bwType"] = "4"
-				}
-			}
-		}
-	}
+
 	dmap := make(map[string]interface{}, 2)
 	dmap["datalist"] = sources
 	dmap["total"] = dataLen
 	util.ResponseFormat(c, code.Success, dmap)
-}
 
-// @Summary 鏌ヨ鎽勫儚鏈轰互鍙婂惎绠楁硶
-// @Description 鍏宠仈鏌ヨ鎽勫儚鏈轰互鍙婂惎绠楁硶
-// @Produce json
-// @Tags camera
-// @Success 200 {string} json "{"code":200, success:true,  msg:"璇锋眰澶勭悊鎴愬姛", data:"鎽勫儚鏈轰俊鎭�"}"
-// @Failure 500 {string} json "{"code":500, success:false   msg:"",data:"閿欒淇℃伅鍐呭"}"
-// @Router /data/api-v/camera/queryCameraAndTaskInfo [get]
-//func (ac *CameraController) QueryCameraAndTaskInfo(c *gin.Context) {
-//	var cam models.Camera
-//	rows := cam.FindAllCamTask()
-//
-//	if len(rows) == 0 {
-//		util.ResponseFormat(c, code.ComError, "娌℃湁璁板綍")
-//		return
-//	}
-//	camList := make([]map[string]interface{}, 0, 5)
-//	for _, cam := range rows {
-//		newCam := make(map[string]interface{})
-//		newCam["cameraid"] = cam.Id
-//		newCam["rtspUrl"] = cam.Rtsp
-//		tasks := cam.CamTask
-//		taskList := make([]map[string]interface{}, 0)
-//		if tasks != nil {
-//			taskmap := make(map[string]interface{})
-//			for _, task := range tasks {
-//				taskId := taskmap[task.Taskid]
-//				if taskId != nil {
-//					cameraTasks := taskmap[task.Taskid].([]models.CameraTask)
-//					cameraTasks = append(cameraTasks, task)
-//					taskmap[task.Taskid] = cameraTasks
-//				} else {
-//					cameraTasks := make([]models.CameraTask, 0)
-//					taskmap[task.Taskid] = append(cameraTasks, task)
-//				}
-//			}
-//			for key, value := range taskmap {
-//				i := make(map[string]interface{})
-//				i["taskid"] = key
-//				i["sdklist"] = value
-//				taskList = append(taskList, i)
-//			}
-//		}
-//		newCam["tasklist"] = taskList
-//		camList = append(camList, newCam)
-//	}
-//	c.JSON(200, camList)
-//
-//}
+}
 
 func searchEsData(searchBody models.EsSearch) map[string]interface{} {
 	//璇锋眰绱㈠紩
@@ -251,17 +160,4 @@
 		}
 	}
 	return dataSource
-}
-
-// type  杞� map
-func Struct2Map(obj interface{}) map[string]interface{} {
-	var data = make(map[string]interface{})
-	bytes, _ := json.Marshal(obj)
-	json.Unmarshal(bytes, &data)
-	/*t := reflect.TypeOf(obj)
-	v := reflect.ValueOf(obj)
-	for i := 0; i < t.NumField(); i++ {
-		data[t.Field(i).Name] = v.Field(i).Interface()
-	}*/
-	return data
 }
diff --git a/controllers/fileController.go b/controllers/fileController.go
index 74d1b25..0f6e41f 100644
--- a/controllers/fileController.go
+++ b/controllers/fileController.go
@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	"basic.com/dbapi.git"
 	"basic.com/pubsub/protomsg.git"
 	"basic.com/fileServer/WeedFSClient.git"
 	"basic.com/valib/deliver.git"
@@ -181,44 +182,61 @@
 }
 
 var captureTable = "capturetable" // 鎶撴媿搴�
-type SearchCondition struct {
-	PicUrl string `json:"picUrl"`
-	Databases []string `json:"databases"`
-	Threshold string `json:"threshold"`
-}
 // @Summary 浠ュ浘鎼滃浘
 // @Description  浠ュ浘鎼滃浘
 // @Accept json
 // @Produce json
 // @Tags 浠ュ浘鎼滃浘
-// @Param condition body controllers.SearchCondition true "鎼滅储鍙傛暟"
+// @Param condition body models.EsSearch true "鎼滅储鍙傛暟"
 // @Success 200 {string} json "{"code":200, msg:"", data:"", success:true}"
 // @Failure 500 {string} json "{"code":500, msg:"", data:"", success:false}"
 // @Router /data/api-v/dbperson/searchByPhoto [POST]
 func (controller FileController) SearchByPhoto(c *gin.Context) {
-	var condition SearchCondition
-	err := c.BindJSON(&condition)
-	if err !=nil || condition.PicUrl == "" || len(condition.Databases) == 0 {
+	var searchBody models.EsSearch
+	err := c.BindJSON(&searchBody)
+	if err !=nil || searchBody.PicUrl == "" || len(searchBody.DataBases) == 0 {
 		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
 		return
 	}
-	compThreshold, err := strconv.ParseFloat(condition.Threshold,32)
-	if condition.PicUrl == "" || err != nil {
-		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+	var sysSetApi dbapi.SysSetApi
+	analyServerId := ""
+	flag, sysconf := sysSetApi.GetServerInfo()
+	if flag {
+		analyServerId = sysconf.ServerId
+	} else {
+		util.ResponseFormat(c, code.ComError, "analyServerId涓虹┖锛岄厤缃湁璇�")
 		return
 	}
-	if face,ok := faceExtractedMap[condition.PicUrl];!ok{
+	if face,ok := faceExtractedMap[searchBody.PicUrl];!ok{
 		util.ResponseFormat(c, code.RequestParamError, "璇烽噸鏂颁笂浼犲浘鐗�")
 		return
 	} else {
 		arg := protomsg.CompareArgs{
-			TableIds: condition.Databases,
 			FaceFeature: face.FaceBytes,
-			CompareThreshold: float32(compThreshold),
+			CompareThreshold: searchBody.Threshold,
 		}
-		if condition.Databases !=nil {
-			arg.TableIds = append(arg.TableIds, condition.Databases...)
+		if searchBody.DataBases !=nil {
+			for idx,tableId :=range searchBody.DataBases {
+				if tableId == captureTable{
+					searchBody.DataBases = append(searchBody.DataBases[:idx], searchBody.DataBases[idx+1:]...)
+					searchBody.DataBases = append(searchBody.DataBases,captureTable)
+					break
+				}
+			}
+			arg.TableIds = searchBody.DataBases
 		}
+		arg.Source = true // 鏍囪瘑鏉ユ簮鏄痺eb
+		arg.AlarmLevel = searchBody.AlarmLevel
+		arg.Tasks = searchBody.Tasks
+		arg.TreeNodes = searchBody.TreeNodes
+		arg.Tabs = searchBody.Tabs
+		arg.SearchTime = searchBody.SearchTime
+		arg.InputValue = searchBody.InputValue
+		arg.Collection = searchBody.Collection
+		arg.AnalyServerId = analyServerId
+
+		logger.Debug("arg.TableIds:", arg.TableIds, ",alarmLevel:",arg.AlarmLevel,",treeNodes:",arg.TreeNodes,",searchTime:",arg.SearchTime,
+			",inputValue:",arg.InputValue,",tasks:",arg.Tasks,",compThreshold:",arg.CompareThreshold)
 		b, err := proto.Marshal(&arg)
 		if err !=nil{
 			util.ResponseFormat(c, code.ComError, "璇锋眰marshal澶辫触")
diff --git a/models/esSearch.go b/models/esSearch.go
index 8b542cc..81e4c76 100644
--- a/models/esSearch.go
+++ b/models/esSearch.go
@@ -1,17 +1,18 @@
 package models
 
 type EsSearch struct {
-	DataBases  []string `json:"databases"`
-	Tasks      []string `json:"tasks"`
-	TreeNodes  []string `json:"treeNodes"`
-	Tabs       []string `json:"tabs"`
-	SearchTime []string `json:"searchTime"`
-	Page       int      `json:"page"`
-	Size       int      `json:"size"`
-	Threshold  float32  `json:"threshold"`
-	PicUrl     string   `json:"picUrl"`
-	Feature    string   `json:"feature"`
-	IsAggs     bool     `json:"isAggs"`
-	InputValue string   `json:"inputValue"`
-	Collection string   `json:"collection"`
+	DataBases  []string `json:"databases"`//搴曞簱id闆嗗悎
+	Tasks      []string `json:"tasks"`//浠诲姟id闆嗗悎
+	TreeNodes  []string `json:"treeNodes"`//鎽勫儚鏈篿d闆嗗悎
+	Tabs       []string `json:"tabs"`//鏍囩闆嗗悎
+	SearchTime []string `json:"searchTime"`//鏃堕棿
+	Page       int      `json:"page"`//褰撳墠椤�,浠�1寮�濮�
+	Size       int      `json:"size"`//姣忛〉鐨勬暟閲�
+	Threshold  float32  `json:"threshold"`//闃堝��
+	PicUrl     string   `json:"picUrl"`//涓婁紶鐨勫浘鐗�
+	Feature    string   `json:"feature"`//鐗瑰緛
+	IsAggs     bool     `json:"isAggs"`//
+	InputValue string   `json:"inputValue"`//杈撳叆妗�
+	Collection string   `json:"collection"`//
+	AlarmLevel []string `json:"alarmLevel"`//甯冮槻绛夌骇
 }

--
Gitblit v1.8.0