From dff98ff959934d17b8222b06e827231374be55eb Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期三, 24 六月 2020 19:36:20 +0800
Subject: [PATCH] ruleTemplate instead of task

---
 vo/cameraRule.go              |   56 +
 go.sum                        |    8 
 controllers/cameraTask.go     |  766 +++++++++---------
 go.mod                        |    4 
 controllers/cameraTaskArgs.go |  412 +++++-----
 controllers/ruleTemplate.go   |  120 +++
 controllers/task.go           |  729 +++++++++---------
 controllers/cameraRule.go     |  190 ++++
 router/router.go              |   84 +
 9 files changed, 1,373 insertions(+), 996 deletions(-)

diff --git a/controllers/cameraRule.go b/controllers/cameraRule.go
new file mode 100644
index 0000000..4fbaf75
--- /dev/null
+++ b/controllers/cameraRule.go
@@ -0,0 +1,190 @@
+package controllers
+
+import (
+	"basic.com/dbapi.git"
+	"github.com/gin-gonic/gin"
+	"webserver/extend/code"
+	"webserver/extend/util"
+	"webserver/vo"
+)
+
+type CameraRuleController struct {
+
+}
+
+type PasteRuleArg struct {
+	SourceId string `json:"sourceId" binding:"required"`
+	TargetIds []string `json:"targetIds" binging:"required"`
+}
+
+// @Summary 鏄剧ず鎽勫儚鏈哄満鏅鍒�
+// @Description 鏄剧ず鎽勫儚鏈哄満鏅鍒�
+// @Accept json
+// @Produce json
+// @Tags 鎽勫儚鏈鸿鍒�
+// @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/rule/{cameraId} [get]
+func (crc CameraRuleController) FindByCameraId(c *gin.Context) {
+	cameraId := c.Param("cameraId")
+	if cameraId == "" {
+		util.ResponseFormat(c,code.RequestParamError,"")
+		return
+	}
+	var api dbapi.CameraRuleApi
+	b,d := api.FindByCameraId(cameraId)
+	if b {
+		util.ResponseFormat(c,code.Success,d)
+	} else {
+		util.ResponseFormat(c,code.ComError,"")
+	}
+}
+
+// @Summary 淇濆瓨鎽勫儚鏈虹嫭绔嬭鍒�
+// @Description 淇濆瓨鎽勫儚鏈虹嫭绔嬭鍒�
+// @Accept json
+// @Produce json
+// @Tags 鎽勫儚鏈鸿鍒�
+// @Param args body vo.GroupRuleVo true "鐙珛瑙勫垯鍙傛暟"
+// @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/rule/save [post]
+func (crc CameraRuleController) Save(c *gin.Context) {
+	var reqBody vo.GroupRuleVo
+	err := c.BindJSON(&reqBody)
+	if err !=nil {
+		util.ResponseFormat(c,code.RequestParamError,"")
+		return
+	}
+	param := util.Struct2Map(reqBody)
+	var api dbapi.CameraRuleApi
+	if api.Save(param) {
+		util.ResponseFormat(c,code.Success,"")
+	} else {
+		util.ResponseFormat(c,code.ComError,"")
+	}
+}
+
+// @Summary 澶嶅埗鎽勫儚鏈鸿鍒欏埌閫夊畾鐨勫涓憚鍍忔満
+// @Description 澶嶅埗鎽勫儚鏈鸿鍒欏埌閫夊畾鐨勫涓憚鍍忔満
+// @Accept json
+// @Produce json
+// @Tags 鎽勫儚鏈鸿鍒�
+// @Param args body controllers.PasteRuleArg true "瑙勫垯澶嶅埗鍙傛暟"
+// @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/pasteRules [post]
+func (crc CameraRuleController) PasteRules(c *gin.Context) {
+	var reqBody PasteRuleArg
+	err := c.BindJSON(&reqBody)
+	if err !=nil {
+		util.ResponseFormat(c,code.RequestParamError,"")
+		return
+	}
+	param := util.Struct2Map(reqBody)
+	var api dbapi.CameraRuleApi
+	if api.PasteRules(param) {
+		util.ResponseFormat(c,code.Success,"")
+	} else {
+		util.ResponseFormat(c,code.ComError,"")
+	}
+}
+
+// @Summary 淇濆瓨鑱斿姩浠诲姟瑙勫垯鍙傛暟
+// @Description 淇濆瓨鑱斿姩浠诲姟瑙勫垯鍙傛暟
+// @Accept json
+// @Produce json
+// @Tags 鎽勫儚鏈鸿鍒�
+// @Param saveBody body vo.GroupRuleVo true "鑱斿姩浠诲姟瑙勫垯淇濆瓨鍙傛暟"
+// @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/rule/saveLinkRulesByGroup [post]
+func (crc CameraRuleController) SaveLinkRulesByGroup(c *gin.Context) {
+	var saveBody vo.GroupRuleVo
+	if err := c.BindJSON(&saveBody);err !=nil {
+		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+		return
+	}
+	param := util.Struct2Map(saveBody)
+	var api dbapi.CameraRuleApi
+	if api.SaveLinkRulesByGroup(param) {
+		util.ResponseFormat(c,code.Success,saveBody)
+	} else {
+		util.ResponseFormat(c,code.ComError, "")
+	}
+}
+
+// @Summary 鏍规嵁澶氫釜鎽勫儚鏈篿d鏌ヨ鑱斿姩浠诲姟瑙勫垯璁剧疆
+// @Description 鏍规嵁澶氫釜鎽勫儚鏈篿d鏌ヨ鑱斿姩浠诲姟瑙勫垯璁剧疆
+// @Accept json
+// @Produce json
+// @Tags 鎽勫儚鏈鸿鍒�
+// @Param cameraIds body vo.MultiCamera true "鎽勫儚鏈篿ds"
+// @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/rule/getLinkRulesByCameraIds [post]
+func (crc CameraRuleController) GetLinkRulesByCameraIds(c *gin.Context) {
+	var idArrVo vo.MultiCamera
+	if err := c.BindJSON(&idArrVo);err !=nil {
+		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+		return
+	}
+	if idArrVo.CameraIds == nil || len(idArrVo.CameraIds) == 0 {
+		util.ResponseFormat(c,code.RequestParamError,"鎽勫儚鏈篿d涓嶈兘灏戜簬1")
+		return
+	}
+	param := util.Struct2Map(idArrVo)
+	var api dbapi.CameraRuleApi
+	flag, ruleList := api.GetLinkRulesByCameraIds(param)
+	if flag {
+		util.ResponseFormat(c,code.Success, ruleList)
+	} else {
+		util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触")
+	}
+
+}
+
+// @Summary 淇敼瑙勫垯缁勬姤璀︾瓑绾�
+// @Description 淇敼瑙勫垯缁勬姤璀︾瓑绾�
+// @Produce json
+// @Tags 鎽勫儚鏈鸿鍒�
+// @Param reqBody body vo.GroupAlarmLevelVo true "鍙傛暟"
+// @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/rule/updateAlarmLevel [post]
+func (crc CameraRuleController) UpdateAlarmLevel(c *gin.Context) {
+	var reqBody vo.GroupAlarmLevelVo
+	err := c.BindJSON(&reqBody)
+	if err != nil {
+		util.ResponseFormat(c,code.RequestParamError, "")
+		return
+	}
+	param := util.Struct2Map(reqBody)
+	var api dbapi.CameraRuleApi
+	if api.UpdateAlarmLevel(param) {
+		util.ResponseFormat(c, code.Success, "淇敼鎴愬姛")//鎽勫儚鏈轰换鍔″弬鏁板垹闄ゅ畬浜�
+	} else {
+		util.ResponseFormat(c, code.ComError, "淇敼澶辫触")
+	}
+}
+
+// @Summary 鏍规嵁鍒嗙粍id鍒犻櫎鎽勫儚鏈虹畻娉曡鍒�
+// @Description 鏍规嵁鍒嗙粍id鍒犻櫎鎽勫儚鏈虹畻娉曡鍒�
+// @Produce json
+// @Tags CameraTaskArgs
+// @Param groupId query string true "浠诲姟绠楁硶鍙傛暟鍒嗙粍id"
+// @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/rule/deleteByGroup [get]
+func (crc CameraRuleController) DeleteByGroup(c *gin.Context) {
+	groupId := c.Query("groupId")
+	if groupId == "" {
+		util.ResponseFormat(c, code.RequestParamError, "id蹇呭~")
+		return
+	}
+	var api dbapi.CameraRuleApi
+	if api.DeleteByGroup(groupId) {
+		util.ResponseFormat(c, code.Success, "鍒犻櫎鎴愬姛")//鎽勫儚鏈轰换鍔″弬鏁板垹闄ゅ畬浜�
+	}
+	util.ResponseFormat(c, code.ComError, "鍒犻櫎澶辫触")
+}
\ No newline at end of file
diff --git a/controllers/cameraTask.go b/controllers/cameraTask.go
index 7ae01fb..452dc60 100644
--- a/controllers/cameraTask.go
+++ b/controllers/cameraTask.go
@@ -1,384 +1,384 @@
 package controllers
-
-import (
-	"basic.com/dbapi.git"
-	"basic.com/pubsub/esutil.git"
-	"encoding/json"
-	"fmt"
-	"github.com/gin-gonic/gin"
-	"strconv"
-	"webserver/cache"
-	"webserver/extend/code"
-	"webserver/extend/config"
-	"webserver/extend/util"
-	"webserver/models"
-)
-
-type CameraTaskController struct {
-
-}
-
-//鐢ㄤ簬鎺ユ敹澶氫釜鎽勫儚鏈虹殑id锛屼互閫楀彿闅斿紑
-type MultiCamera struct {
-	CameraIds []string `json:"cameraIds"`
-}
-
-type CameraTaskVo struct {
-	Id          string `json:"id"`
-	CameraId   string `json:"camera_id"`
-	TaskId      string `json:"task_id"` //浠诲姟id  鏉ヨ嚜浜庝换鍔¤〃
-	TimeRule    string `json:"time_rule"`
-	ReactRule   string `json:"react_rule"`
-	ReactDevice string `json:"react_device"`
-	DelFlag     bool   `json:"del_flag"`
-	UpdateFlag  bool   `json:"update_flag"`
-	Enable      int    `json:"enable"`                //榛樿鍚敤
-	Sort        int    `json:"sort"`    //浠诲姟鎺掑簭
-	IsFull      int    `json:"is_full"` //鍙傛暟鏄惁璁剧疆瀹屾暣
-	LinkTaskId string `json:"link_task_id"` //鑱斿姩浠诲姟缁�
-}
-
-type CameraTaskSaveArg struct {
-	Id string 					  `json:"id"`
-	SetType string				  `json:"set_type" example:"batchTask:鎵归噺浠诲姟,linkTask:鑱斿姩浠诲姟"`//浠诲姟璁剧疆鏂瑰紡锛堟壒閲忚缃繕鏄仈鍔ㄤ换鍔¤缃級
-	CameraIds []string            `json:"camera_ids"`
-	TaskId    string              `json:"task_id"`
-	GroupId	string 				  `json:"group_id"`
-	GroupText string 			  `json:"group_text"`
-	GroupRule   []CameraTaskArgVo `json:"group_rule"`
-}
-
-type CameraTaskArgGroup struct {
-	Id string `json:"id"`
-	CameraTaskId string `json:"camera_task_id"`
-	GroupId string `json:"group_id"`
-	GroupText string `json:"group_text"`
-	AlarmLevel int `json:"alarm_level"`
-}
-
-type CameraTaskArgVo struct {
-	Id string `json:"id"`
-	CameraId string 	`json:"camera_id"`//鎽勫儚鏈篿d
-	PolygonId string `json:"polygon_id"`//澶氳竟褰d
-	SdkId string `json:"sdk_id"`//绠楁硶id
-	SdkArgAlias string `json:"sdk_arg_alias"`//绠楁硶鍙傛暟鍒悕
-	Operator string `json:"operator"`//璁$畻鏂瑰紡=,>,>=绛夌瓑
-	OperatorType string `json:"operator_type"`//璁$畻鐨勫�肩被鍨�
-	SdkArgValue string `json:"sdk_arg_value"` //绠楁硶鍙傛暟鍊艰缃�
-	RuleWithPre string `json:"rule_with_pre"` //涓庝笅涓�鏉$殑閫昏緫杩愮畻绗�
-	GroupId string `json:"group_id"`
-}
-
-type LinkCameraTasksVo struct {
-
-}
-
-type CameraTaskInfoVo struct {
-	Camera models.Camera `json:"camera"`
-	Tasks []models.Task `json:"tasks"`
-	Polygon CameraPolygonVo `json:"polygon"`
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏌ヨ鎵�鏈変换鍔�
-// @Description "鏌ヨ鎵�鏈変换鍔�"
-// @Accept json
-// @Produce json
-// @Tags CameraTask
-// @Param cameraIds body controllers.MultiCamera false "鎽勫儚鏈篿d鏁扮粍"
-// @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/alltask [post]
-func (ctc CameraTaskController) FindTasksByCameraIds(c *gin.Context){
-	var mulCamera MultiCamera
-	c.BindJSON(&mulCamera)
-	var api dbapi.CameraTaskApi
-	flag, data := api.FindTasksByCameraIds(mulCamera.CameraIds)
-	if flag {
-		bytes, _ := json.Marshal(data)
-		var camTInfo []CameraTaskInfoVo
-		json.Unmarshal(bytes, &camTInfo)
-
-		//澶勭悊宸茶鍒犻櫎鐨勪换鍔�
-
-		var delTasks []models.Task
-		var taskApi dbapi.TaskApi
-		taskInfos := taskApi.FindAll()
-		m := make(map[string]string)
-		for _,ti :=range taskInfos{
-			if ti.Task.Taskid != FaceExtract_VirtualTaskId{
-				m[ti.Task.Taskid] = ti.Task.Taskid
-			}
-		}
-		localConf, _ := cache.GetServerInfo()
-		if localConf.AlarmIp != "" && localConf.ServerId != "" && localConf.AlarmPort>0 {
-			indexName := config.EsInfo.EsIndex.AiOcean.IndexName
-			esTaskM, e := esutil.AggregateTaskList(localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)), indexName, localConf.ServerId)
-			if e==nil && esTaskM !=nil {
-				for _,tM :=range esTaskM {
-					if _,ok := m[tM["taskId"].(string)];!ok {//琛ㄧず姝や换鍔″凡琚垹闄�
-						taskId := tM["taskId"].(string)
-						m[taskId] = taskId
-						delTasks = append(delTasks, models.Task{
-							Taskid:	taskId,
-							Taskname: tM["taskName"].(string),
-							DelFlag: true,
-						})
-					}
-				}
-			}
-		}
-		var result []CameraTaskInfoVo
-		if camTInfo != nil {
-			for _, camIn := range camTInfo {
-				nIfn := CameraTaskInfoVo{
-					Camera: camIn.Camera,
-					Polygon: camIn.Polygon,
-					Tasks: append(camIn.Tasks, delTasks...),
-				}
-				result = append(result, nIfn)
-			}
-		}
-
-		util.ResponseFormat(c,code.Success, result)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鎽勫儚鏈烘坊鍔犱竴涓换鍔�
-// @Description 鎽勫儚鏈烘坊鍔犱竴涓换鍔�
-// @Accept x-www-form-urlencoded
-// @Produce json
-// @Tags CameraTask
-// @Param cameraId formData string true "鎽勫儚鏈篿d"
-// @Param taskId formData string true "浠诲姟id"
-// @Success 200 {string} json "{"code":200, success:true, msg:"璇锋眰澶勭悊鎴愬姛", data:"鍗曚釜鎽勫儚鏈虹殑鍏ㄩ儴淇℃伅"}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:"閿欒淇℃伅鍐呭"}"
-// @Router /data/api-v/cameraTask/addTask [post]
-func (ctc CameraTaskController) AddTask(c *gin.Context) {
-	cameraId := c.PostForm("cameraId")
-	taskId := c.PostForm("taskId")
-	if cameraId == "" || taskId == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	if b,data := api.AddTask(cameraId, taskId);b {
-		util.ResponseFormat(c,code.AddSuccess, data)
-	} else {
-		if data.(string) == "姝ゅ浗鏍囨憚鍍忔満宸插湪鍏跺畠鏈嶅姟鍣ㄩ厤缃换鍔★紒" {
-			util.ResponseFormat(c,code.AddTaskErr, data)
-		} else {
-			util.ResponseFormat(c,code.ComError, data)
-		}
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏌ヨ鎵�鏈変换鍔�
-// @Description "鏌ヨ鎵�鏈変换鍔�"
-// @Produce json
-// @Tags CameraTask
-// @Param cameraId path string true "鎽勫儚鏈篿d"
-// @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/task/{cameraId} [get]
-func (ctc CameraTaskController) CameraTaskAll(c *gin.Context) {
-	cameraId := c.Param("cameraId")
-	if cameraId == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鎽勫儚鏈篿d涓嶈兘涓虹┖")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	flag,data := api.CameraTaskAll(cameraId)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鎽勫儚鏈轰繚瀛樹换鍔�
-// @Description 鎽勫儚鏈轰繚瀛樹换鍔�
-// @Accept json
-// @Produce json
-// @Tags camera
-// @Param args body controllers.CameraTaskSaveArg true "鎽勫儚鏈轰换鍔′繚瀛樿姹傚弬鏁�"
-// @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/saveTask [post]
-func (cc CameraController) CameraTaskSave(c *gin.Context) {
-	var saveBody CameraTaskSaveArg
-	err := c.BindJSON(&saveBody)
-	if err != nil {
-		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	paramBody := util.Struct2Map(saveBody)
-	fmt.Println("paramBody:",paramBody)
-	flag, data := api.CameraTaskSave(paramBody)
-	fmt.Println("data",data)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c, code.ComError, data)
-	}
-}
-
-type PasteRuleArg struct {
-	SourceId string `json:"sourceId" binding:"required"`
-	TargetIds []string `json:"targetIds" binging:"required"`
-}
-
-// @Summary 澶嶅埗鎽勫儚鏈鸿鍒欏埌閫夊畾鐨勫涓憚鍍忔満
-// @Description 澶嶅埗鎽勫儚鏈鸿鍒欏埌閫夊畾鐨勫涓憚鍍忔満
-// @Accept json
-// @Produce json
-// @Tags CameraTask
-// @Param args body controllers.PasteRuleArg true "瑙勫垯澶嶅埗鍙傛暟"
-// @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/pasteRules [post]
-func (ctc CameraTaskController) PasteRules(c *gin.Context) {
-	var reqBody PasteRuleArg
-	err := c.BindJSON(&reqBody)
-	if err != nil {
-		util.ResponseFormat(c, code.RequestParamError, "")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	if api.PasteRules(reqBody.SourceId, reqBody.TargetIds) {
-		util.ResponseFormat(c,code.Success,"")
-	} else {
-		util.ResponseFormat(c,code.ComError,"")
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鍒犻櫎鎽勫儚鏈虹殑浠诲姟
-// @Description 鍒犻櫎鎽勫儚鏈虹殑浠诲姟
-// @Produce json
-// @Tags camera
-// @Param cameraId path string true "鎽勫儚鏈篿d"
-// @Param taskId path string true "浠诲姟id"
-// @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/delTask/{cameraId}/{taskId} [delete]
-func (cc CameraController) CameraDelTask(c *gin.Context) {
-	cameraId := c.Param("cameraId")
-	taskId := c.Param("taskId")
-	if cameraId == "" || taskId == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	flag,data := api.DeleteCameraTask(cameraId,taskId)
-
-	if flag {
-		util.ResponseFormat(c, code.Success, data)
-	} else {
-		util.ResponseFormat(c, code.ComError, data)
-	}
-}
-
-type DataTransVo struct {
-	CameraIds []string `json:"camera_ids"`
-	TaskId string `json:"task_id"`
-	IsDataTrans int `json:"is_data_trans"`
-}
-type GroupAlarmLevelVo struct {
-	GroupId string `json:"group_id"`
-	AlarmLevel int `json:"alarm_level"`
-}
-
-// @Security ApiKeyAuth
-// @Summary 淇濆瓨浠诲姟鏄惁涓嬩紶鏁版嵁
-// @Description 淇濆瓨浠诲姟鏄惁涓嬩紶鏁版嵁
-// @Accept json
-// @Produce json
-// @Tags CameraTask
-// @Param TransAndAlarmLevel body controllers.DataTransVo true "璇锋眰鍙傛暟缁撴瀯"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}"
-// @Router /data/api-v/cameraTask/saveIsDataTrans [post]
-func (ctc CameraTaskController) SaveIsDataTrans(c *gin.Context) {
-	var transVo DataTransVo
-	if err := c.BindJSON(&transVo);err!=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	paramBody := util.Struct2Map(transVo)
-
-	flag ,data := api.SaveIsDataTrans(paramBody)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 淇濆瓨瑙勫垯缁勬姤璀︾瓑绾�
-// @Description 淇濆瓨瑙勫垯缁勬姤璀︾瓑绾�
-// @Accept json
-// @Produce json
-// @Tags CameraTask
-// @Param GroupLevel body controllers.GroupAlarmLevelVo true "alarmLevel"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}"
-// @Router /data/api-v/cameraTask/saveAlarmLevelByGroup [post]
-func (ctc CameraTaskController) SaveAlarmLevelByGroup(c *gin.Context) {
-	var groupLevelVo GroupAlarmLevelVo
-	if err := c.BindJSON(&groupLevelVo);err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-
-	var api dbapi.CameraTaskApi
-	flag,data := api.SaveAlarmLevelByGroup(groupLevelVo.GroupId,groupLevelVo.AlarmLevel)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-type CameraTaskStatusVo struct {
-	CameraId string `json:"cameraId"`
-	TaskId string `json:"taskId"`
-	Status int `json:"status"`
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏇存柊浠诲姟鐘舵��
-// @Description 鏇存柊浠诲姟鐘舵��
-// @Accept json
-// @Produce json
-// @Tags CameraTask
-// @Param CameraTaskStatus body controllers.CameraTaskStatusVo true "鍙傛暟缁撴瀯浣�"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}"
-// @Router /data/api-v/cameraTask/updateCameraTaskStatus [post]
-func (ctc CameraTaskController) UpdateCameraTaskStatus(c *gin.Context) {
-	var paramVo CameraTaskStatusVo
-	if err := c.BindJSON(&paramVo);err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	flag, data := api.UpdateCameraTaskStatus(paramVo.CameraId, paramVo.TaskId, paramVo.Status)
-	if flag {
-		if data.(string) == "姝や换鍔′负鍋滅敤鐘舵�侊紝璇峰湪浠诲姟绠$悊涓紑鍚紒"{
-			util.ResponseFormat(c,code.TaskStoped,data)
-		} else {
-			util.ResponseFormat(c,code.UpdateSuccess,data)
-		}
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
\ No newline at end of file
+//
+//import (
+//	"basic.com/dbapi.git"
+//	"basic.com/pubsub/esutil.git"
+//	"encoding/json"
+//	"fmt"
+//	"github.com/gin-gonic/gin"
+//	"strconv"
+//	"webserver/cache"
+//	"webserver/extend/code"
+//	"webserver/extend/config"
+//	"webserver/extend/util"
+//	"webserver/models"
+//)
+//
+//type CameraTaskController struct {
+//
+//}
+//
+////鐢ㄤ簬鎺ユ敹澶氫釜鎽勫儚鏈虹殑id锛屼互閫楀彿闅斿紑
+//type MultiCamera struct {
+//	CameraIds []string `json:"cameraIds"`
+//}
+//
+//type CameraTaskVo struct {
+//	Id          string `json:"id"`
+//	CameraId   string `json:"camera_id"`
+//	TaskId      string `json:"task_id"` //浠诲姟id  鏉ヨ嚜浜庝换鍔¤〃
+//	TimeRule    string `json:"time_rule"`
+//	ReactRule   string `json:"react_rule"`
+//	ReactDevice string `json:"react_device"`
+//	DelFlag     bool   `json:"del_flag"`
+//	UpdateFlag  bool   `json:"update_flag"`
+//	Enable      int    `json:"enable"`                //榛樿鍚敤
+//	Sort        int    `json:"sort"`    //浠诲姟鎺掑簭
+//	IsFull      int    `json:"is_full"` //鍙傛暟鏄惁璁剧疆瀹屾暣
+//	LinkTaskId string `json:"link_task_id"` //鑱斿姩浠诲姟缁�
+//}
+//
+//type CameraTaskSaveArg struct {
+//	Id string 					  `json:"id"`
+//	SetType string				  `json:"set_type" example:"batchTask:鎵归噺浠诲姟,linkTask:鑱斿姩浠诲姟"`//浠诲姟璁剧疆鏂瑰紡锛堟壒閲忚缃繕鏄仈鍔ㄤ换鍔¤缃級
+//	CameraIds []string            `json:"camera_ids"`
+//	TaskId    string              `json:"task_id"`
+//	GroupId	string 				  `json:"group_id"`
+//	GroupText string 			  `json:"group_text"`
+//	GroupRule   []CameraTaskArgVo `json:"group_rule"`
+//}
+//
+//type CameraTaskArgGroup struct {
+//	Id string `json:"id"`
+//	CameraTaskId string `json:"camera_task_id"`
+//	GroupId string `json:"group_id"`
+//	GroupText string `json:"group_text"`
+//	AlarmLevel int `json:"alarm_level"`
+//}
+//
+//type CameraTaskArgVo struct {
+//	Id string `json:"id"`
+//	CameraId string 	`json:"camera_id"`//鎽勫儚鏈篿d
+//	PolygonId string `json:"polygon_id"`//澶氳竟褰d
+//	SdkId string `json:"sdk_id"`//绠楁硶id
+//	SdkArgAlias string `json:"sdk_arg_alias"`//绠楁硶鍙傛暟鍒悕
+//	Operator string `json:"operator"`//璁$畻鏂瑰紡=,>,>=绛夌瓑
+//	OperatorType string `json:"operator_type"`//璁$畻鐨勫�肩被鍨�
+//	SdkArgValue string `json:"sdk_arg_value"` //绠楁硶鍙傛暟鍊艰缃�
+//	RuleWithPre string `json:"rule_with_pre"` //涓庝笅涓�鏉$殑閫昏緫杩愮畻绗�
+//	GroupId string `json:"group_id"`
+//}
+//
+//type LinkCameraTasksVo struct {
+//
+//}
+//
+//type CameraTaskInfoVo struct {
+//	Camera models.Camera `json:"camera"`
+//	Tasks []models.Task `json:"tasks"`
+//	Polygon CameraPolygonVo `json:"polygon"`
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏌ヨ鎵�鏈変换鍔�
+//// @Description "鏌ヨ鎵�鏈変换鍔�"
+//// @Accept json
+//// @Produce json
+//// @Tags CameraTask
+//// @Param cameraIds body controllers.MultiCamera false "鎽勫儚鏈篿d鏁扮粍"
+//// @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/alltask [post]
+//func (ctc CameraTaskController) FindTasksByCameraIds(c *gin.Context){
+//	var mulCamera MultiCamera
+//	c.BindJSON(&mulCamera)
+//	var api dbapi.CameraTaskApi
+//	flag, data := api.FindTasksByCameraIds(mulCamera.CameraIds)
+//	if flag {
+//		bytes, _ := json.Marshal(data)
+//		var camTInfo []CameraTaskInfoVo
+//		json.Unmarshal(bytes, &camTInfo)
+//
+//		//澶勭悊宸茶鍒犻櫎鐨勪换鍔�
+//
+//		var delTasks []models.Task
+//		var taskApi dbapi.TaskApi
+//		taskInfos := taskApi.FindAll()
+//		m := make(map[string]string)
+//		for _,ti :=range taskInfos{
+//			if ti.Task.Taskid != FaceExtract_VirtualTaskId{
+//				m[ti.Task.Taskid] = ti.Task.Taskid
+//			}
+//		}
+//		localConf, _ := cache.GetServerInfo()
+//		if localConf.AlarmIp != "" && localConf.ServerId != "" && localConf.AlarmPort>0 {
+//			indexName := config.EsInfo.EsIndex.AiOcean.IndexName
+//			esTaskM, e := esutil.AggregateTaskList(localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)), indexName, localConf.ServerId)
+//			if e==nil && esTaskM !=nil {
+//				for _,tM :=range esTaskM {
+//					if _,ok := m[tM["taskId"].(string)];!ok {//琛ㄧず姝や换鍔″凡琚垹闄�
+//						taskId := tM["taskId"].(string)
+//						m[taskId] = taskId
+//						delTasks = append(delTasks, models.Task{
+//							Taskid:	taskId,
+//							Taskname: tM["taskName"].(string),
+//							DelFlag: true,
+//						})
+//					}
+//				}
+//			}
+//		}
+//		var result []CameraTaskInfoVo
+//		if camTInfo != nil {
+//			for _, camIn := range camTInfo {
+//				nIfn := CameraTaskInfoVo{
+//					Camera: camIn.Camera,
+//					Polygon: camIn.Polygon,
+//					Tasks: append(camIn.Tasks, delTasks...),
+//				}
+//				result = append(result, nIfn)
+//			}
+//		}
+//
+//		util.ResponseFormat(c,code.Success, result)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鎽勫儚鏈烘坊鍔犱竴涓换鍔�
+//// @Description 鎽勫儚鏈烘坊鍔犱竴涓换鍔�
+//// @Accept x-www-form-urlencoded
+//// @Produce json
+//// @Tags CameraTask
+//// @Param cameraId formData string true "鎽勫儚鏈篿d"
+//// @Param taskId formData string true "浠诲姟id"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"璇锋眰澶勭悊鎴愬姛", data:"鍗曚釜鎽勫儚鏈虹殑鍏ㄩ儴淇℃伅"}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:"閿欒淇℃伅鍐呭"}"
+//// @Router /data/api-v/cameraTask/addTask [post]
+//func (ctc CameraTaskController) AddTask(c *gin.Context) {
+//	cameraId := c.PostForm("cameraId")
+//	taskId := c.PostForm("taskId")
+//	if cameraId == "" || taskId == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	if b,data := api.AddTask(cameraId, taskId);b {
+//		util.ResponseFormat(c,code.AddSuccess, data)
+//	} else {
+//		if data.(string) == "姝ゅ浗鏍囨憚鍍忔満宸插湪鍏跺畠鏈嶅姟鍣ㄩ厤缃换鍔★紒" {
+//			util.ResponseFormat(c,code.AddTaskErr, data)
+//		} else {
+//			util.ResponseFormat(c,code.ComError, data)
+//		}
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏌ヨ鎵�鏈変换鍔�
+//// @Description "鏌ヨ鎵�鏈変换鍔�"
+//// @Produce json
+//// @Tags CameraTask
+//// @Param cameraId path string true "鎽勫儚鏈篿d"
+//// @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/task/{cameraId} [get]
+//func (ctc CameraTaskController) CameraTaskAll(c *gin.Context) {
+//	cameraId := c.Param("cameraId")
+//	if cameraId == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鎽勫儚鏈篿d涓嶈兘涓虹┖")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	flag,data := api.CameraTaskAll(cameraId)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鎽勫儚鏈轰繚瀛樹换鍔�
+//// @Description 鎽勫儚鏈轰繚瀛樹换鍔�
+//// @Accept json
+//// @Produce json
+//// @Tags camera
+//// @Param args body controllers.CameraTaskSaveArg true "鎽勫儚鏈轰换鍔′繚瀛樿姹傚弬鏁�"
+//// @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/saveTask [post]
+//func (cc CameraController) CameraTaskSave(c *gin.Context) {
+//	var saveBody CameraTaskSaveArg
+//	err := c.BindJSON(&saveBody)
+//	if err != nil {
+//		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	paramBody := util.Struct2Map(saveBody)
+//	fmt.Println("paramBody:",paramBody)
+//	flag, data := api.CameraTaskSave(paramBody)
+//	fmt.Println("data",data)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c, code.ComError, data)
+//	}
+//}
+//
+//type PasteRuleArg struct {
+//	SourceId string `json:"sourceId" binding:"required"`
+//	TargetIds []string `json:"targetIds" binging:"required"`
+//}
+//
+//// @Summary 澶嶅埗鎽勫儚鏈鸿鍒欏埌閫夊畾鐨勫涓憚鍍忔満
+//// @Description 澶嶅埗鎽勫儚鏈鸿鍒欏埌閫夊畾鐨勫涓憚鍍忔満
+//// @Accept json
+//// @Produce json
+//// @Tags CameraTask
+//// @Param args body controllers.PasteRuleArg true "瑙勫垯澶嶅埗鍙傛暟"
+//// @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/pasteRules [post]
+//func (ctc CameraTaskController) PasteRules(c *gin.Context) {
+//	var reqBody PasteRuleArg
+//	err := c.BindJSON(&reqBody)
+//	if err != nil {
+//		util.ResponseFormat(c, code.RequestParamError, "")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	if api.PasteRules(reqBody.SourceId, reqBody.TargetIds) {
+//		util.ResponseFormat(c,code.Success,"")
+//	} else {
+//		util.ResponseFormat(c,code.ComError,"")
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鍒犻櫎鎽勫儚鏈虹殑浠诲姟
+//// @Description 鍒犻櫎鎽勫儚鏈虹殑浠诲姟
+//// @Produce json
+//// @Tags camera
+//// @Param cameraId path string true "鎽勫儚鏈篿d"
+//// @Param taskId path string true "浠诲姟id"
+//// @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/delTask/{cameraId}/{taskId} [delete]
+//func (cc CameraController) CameraDelTask(c *gin.Context) {
+//	cameraId := c.Param("cameraId")
+//	taskId := c.Param("taskId")
+//	if cameraId == "" || taskId == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	flag,data := api.DeleteCameraTask(cameraId,taskId)
+//
+//	if flag {
+//		util.ResponseFormat(c, code.Success, data)
+//	} else {
+//		util.ResponseFormat(c, code.ComError, data)
+//	}
+//}
+//
+//type DataTransVo struct {
+//	CameraIds []string `json:"camera_ids"`
+//	TaskId string `json:"task_id"`
+//	IsDataTrans int `json:"is_data_trans"`
+//}
+//type GroupAlarmLevelVo struct {
+//	GroupId string `json:"group_id"`
+//	AlarmLevel int `json:"alarm_level"`
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 淇濆瓨浠诲姟鏄惁涓嬩紶鏁版嵁
+//// @Description 淇濆瓨浠诲姟鏄惁涓嬩紶鏁版嵁
+//// @Accept json
+//// @Produce json
+//// @Tags CameraTask
+//// @Param TransAndAlarmLevel body controllers.DataTransVo true "璇锋眰鍙傛暟缁撴瀯"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}"
+//// @Router /data/api-v/cameraTask/saveIsDataTrans [post]
+//func (ctc CameraTaskController) SaveIsDataTrans(c *gin.Context) {
+//	var transVo DataTransVo
+//	if err := c.BindJSON(&transVo);err!=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	paramBody := util.Struct2Map(transVo)
+//
+//	flag ,data := api.SaveIsDataTrans(paramBody)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 淇濆瓨瑙勫垯缁勬姤璀︾瓑绾�
+//// @Description 淇濆瓨瑙勫垯缁勬姤璀︾瓑绾�
+//// @Accept json
+//// @Produce json
+//// @Tags CameraTask
+//// @Param GroupLevel body controllers.GroupAlarmLevelVo true "alarmLevel"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}"
+//// @Router /data/api-v/cameraTask/saveAlarmLevelByGroup [post]
+//func (ctc CameraTaskController) SaveAlarmLevelByGroup(c *gin.Context) {
+//	var groupLevelVo GroupAlarmLevelVo
+//	if err := c.BindJSON(&groupLevelVo);err !=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//
+//	var api dbapi.CameraTaskApi
+//	flag,data := api.SaveAlarmLevelByGroup(groupLevelVo.GroupId,groupLevelVo.AlarmLevel)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//type CameraTaskStatusVo struct {
+//	CameraId string `json:"cameraId"`
+//	TaskId string `json:"taskId"`
+//	Status int `json:"status"`
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏇存柊浠诲姟鐘舵��
+//// @Description 鏇存柊浠诲姟鐘舵��
+//// @Accept json
+//// @Produce json
+//// @Tags CameraTask
+//// @Param CameraTaskStatus body controllers.CameraTaskStatusVo true "鍙傛暟缁撴瀯浣�"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"", data:""}"
+//// @Router /data/api-v/cameraTask/updateCameraTaskStatus [post]
+//func (ctc CameraTaskController) UpdateCameraTaskStatus(c *gin.Context) {
+//	var paramVo CameraTaskStatusVo
+//	if err := c.BindJSON(&paramVo);err !=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	flag, data := api.UpdateCameraTaskStatus(paramVo.CameraId, paramVo.TaskId, paramVo.Status)
+//	if flag {
+//		if data.(string) == "姝や换鍔′负鍋滅敤鐘舵�侊紝璇峰湪浠诲姟绠$悊涓紑鍚紒"{
+//			util.ResponseFormat(c,code.TaskStoped,data)
+//		} else {
+//			util.ResponseFormat(c,code.UpdateSuccess,data)
+//		}
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
\ No newline at end of file
diff --git a/controllers/cameraTaskArgs.go b/controllers/cameraTaskArgs.go
index 325d59f..56fc57c 100644
--- a/controllers/cameraTaskArgs.go
+++ b/controllers/cameraTaskArgs.go
@@ -1,208 +1,208 @@
 package controllers
 
-import (
-	"basic.com/dbapi.git"
-	"basic.com/valib/logger.git"
-	"github.com/gin-gonic/gin"
-	"strconv"
-	"strings"
-	"webserver/extend/code"
-	"webserver/extend/util"
-)
-
-type CameraTaskArgsController struct {
-
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏍规嵁鎽勫儚鏈篿d鍜屼换鍔d鏌ヨ绠楁硶閰嶇疆璇︽儏
-// @Description 鏍规嵁鎽勫儚鏈篿d鍜屼换鍔d鏌ヨ绠楁硶閰嶇疆璇︽儏
-// @Produce json
-// @Tags CameraTaskArgs
-// @Param cameraId query string true "鎽勫儚鏈篿d"
-// @Param taskId query string true "浠诲姟id"
-// @Param set_type query string true "浠诲姟绫诲瀷"
-// @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/getRulesByCameraAndTask [get]
-func (controller CameraTaskArgsController) FindByCameraAndTask(c *gin.Context) {
-	cameraId := c.Query("cameraId")
-	taskId := c.Query("taskId")
-	setType := c.Query("set_type")
-	if cameraId == "" || taskId == "" || setType == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鎽勫儚鏈篿d鍜屼换鍔d涓嶈兘涓虹┖")
-		return
-	}
-	var api dbapi.CameraTaskArgsApi
-	flag,data := api.FindByCameraAndTask(cameraId,taskId,setType)
-
-	if flag {
-		util.ResponseFormat(c, code.Success, data)
-	} else {
-		util.ResponseFormat(c, code.ComError, data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏍规嵁澶氫釜鎽勫儚鏈篿d鏌ヨ鑱斿姩浠诲姟瑙勫垯璁剧疆
-// @Description 鏍规嵁澶氫釜鎽勫儚鏈篿d鏌ヨ鑱斿姩浠诲姟瑙勫垯璁剧疆
-// @Accept json
-// @Produce json
-// @Tags CameraTaskArgs
-// @Param cameraIds body controllers.MultiCamera true "鎽勫儚鏈篿ds"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/cameraTaskArgs/getLinkRulesByCameraIds [post]
-func (controller CameraTaskArgsController) GetLinkRulesByCameraIds(c *gin.Context) {
-	var cameraIdsVo MultiCamera
-	if err := c.BindJSON(&cameraIdsVo);err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskArgsApi
-	paramBody := util.Struct2Map(cameraIdsVo)
-	flag,data := api.GetLinkRulesByCameraIds(paramBody)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏍规嵁鍒嗙粍id鍒囨崲甯冮槻鎴栨挙闃�
-// @Description 鏍规嵁鍒嗙粍id鍒囨崲甯冮槻鎴栨挙闃�
-// @Accept x-www-form-urlencoded
-// @Produce json
-// @Tags CameraTaskArgs
-// @Param groupId formData string true "浠诲姟绠楁硶鍙傛暟鍒嗙粍id"
-// @Param defenceState formData bool true "甯冮槻鐘舵��,false:鎾ら槻锛宼rue锛氬竷闃�"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/cameraTaskArgs/updateDefenceStateByGroup [post]
-func (controller CameraTaskArgsController) UpdateDefenceStateByGroup(c *gin.Context){
-	groupId := c.PostForm("groupId")
-	str := c.PostForm("defenceState")
-	logger.Debug("defenceState:",str)
-	defenceState, err := strconv.ParseBool(str)
-	if groupId =="" || err !=nil{
-		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskArgsApi
-	if b,data := api.UpdateDefenceStateByGroup(groupId,defenceState);b{
-		util.ResponseFormat(c,code.UpdateSuccess,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @SUmmary 鏍规嵁鍒嗙粍id鍒犻櫎鎽勫儚鏈虹畻娉曡鍒�
-// @Description 鏍规嵁鍒嗙粍id鍒犻櫎鎽勫儚鏈虹畻娉曡鍒�
-// @Produce json
-// @Tags CameraTaskArgs
-// @Param groupId query string true "浠诲姟绠楁硶鍙傛暟鍒嗙粍id"
-// @Success 200 {string} json "{"code":200, success:true, msg:"璇锋眰澶勭悊鎴愬姛", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:"閿欒淇℃伅鍐呭"}"
-// @Router /data/api-v/cameraTaskArgs/deleteByGroup [get]
-func (controller CameraTaskArgsController)DeleteByGroup(c *gin.Context) {
-	groupId := c.Query("groupId")
-	if groupId == "" {
-		util.ResponseFormat(c, code.RequestParamError, "id蹇呭~")
-		return
-	}
-	var api dbapi.CameraTaskArgsApi
-	flag,data := api.DeleteByGroup(groupId)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,"鍒犻櫎澶辫触")
-	}
-
-}
-
-type SaveLinkRulesGroupVo struct {
-	LinkTaskId string `json:"link_task_id"`//鑱斿姩浠诲姟id
-	GroupId string `json:"group_id"`//鍒嗙粍id
-	GroupText string `json:"group_text"`//缁勮鍒欐枃瀛�
-	Rules []LinkRuleArgVo `json:"rules"`//缁勫唴鐨勮鍒�
-}
-
-type LinkRuleArgVo struct {
-	TaskId string `json:"task_id"`
-	CameraTaskArgs
-}
-
-type CameraTaskArgs struct {
-	Id string `json:"id"`
-	CameraTaskId string `json:"camera_task_id"`//camera_tasks琛ㄧ殑涓婚敭锛屾憚鍍忔満鍜屼换鍔″叧鑱攊d鎴栬�呰仈鍔ㄤ换鍔d
-	CameraId string 	`json:"camera_id"`//鎽勫儚鏈篿d
-	PolygonId string `json:"polygon_id"`//澶氳竟褰d
-	SdkId string `json:"sdk_id"`//绠楁硶id
-	SdkArgAlias string `json:"sdk_arg_alias"`//绠楁硶鍙傛暟鍒悕
-	Operator string `json:"operator"`//璁$畻鏂瑰紡=,>,>=绛夌瓑
-	OperatorType string `json:"operator_type"`//璁$畻鐨勫�肩被鍨�
-	SdkArgValue string `json:"sdk_arg_value"` //绠楁硶鍙傛暟鍊艰缃�
-	Sort int `json:"sort"`//鎺掑簭
-	RuleWithPre string `json:"rule_with_pre"`//涓庝笂涓�鏉¤褰曠殑閫昏緫杩愮畻瑙勫垯锛�&&,||锛�
-	GroupId string `json:"group_id"`//鍒嗙粍id
-}
-
-// @Security ApiKeyAuth
-// @Summary 淇濆瓨鑱斿姩浠诲姟瑙勫垯鍙傛暟
-// @Description 淇濆瓨鑱斿姩浠诲姟瑙勫垯鍙傛暟
-// @Accept json
-// @Produce json
-// @Param saveBody body controllers.SaveLinkRulesGroupVo true "鑱斿姩浠诲姟瑙勫垯淇濆瓨鍙傛暟"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/cameraTaskArgs/saveLinkRulesByGroup [post]
-func (controller CameraTaskArgsController) SaveLinkRulesByGroup(c *gin.Context) {
-	var saveBody SaveLinkRulesGroupVo
-	if err := c.BindJSON(&saveBody);err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskArgsApi
-	paramBody := util.Struct2Map(saveBody)
-	flag,data := api.SaveLinkRulesByGroup(paramBody)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-type RuleApply2AllVo struct {
-	CameraId   string  			  `json:"camera_id" binding:"required"`//瑙勫垯鎷ユ湁鑰卛d
-}
-
-// @Summary 灏嗘湰鏉¤鍒欏簲鐢ㄥ埌鎵�鏈夋湰鍦拌棰�
-// @Description 灏嗘湰鏉¤鍒欏簲鐢ㄥ埌鎵�鏈夋湰鍦拌棰�
-// @Produce json
-// @Tags CameraTaskArgs
-// @Param args body controllers.RuleApply2AllVo true "瑙勫垯搴旂敤鍒版墍鏈夋湰鍦拌棰戣姹傚弬鏁�"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/cameraTaskArgs/ruleApply2All [post]
-func (controller CameraTaskArgsController) RuleApply2All(c *gin.Context) {
-	var saveBody RuleApply2AllVo
-	err := c.BindJSON(&saveBody)
-	if err !=nil {
-		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
-		return
-	}
-	if !strings.HasPrefix(saveBody.CameraId, File_Video_Id_Pre) && !strings.HasPrefix(saveBody.CameraId, File_Img_Id_Pre) && !!strings.HasPrefix(saveBody.CameraId, File_Audio_Id_Pre) {
-		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.CameraTaskApi
-	paramBody := util.Struct2Map(saveBody)
-	flag, data := api.RuleApply2All(paramBody)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c, code.ComError, data)
-	}
-}
\ No newline at end of file
+//import (
+//	"basic.com/dbapi.git"
+//	"basic.com/valib/logger.git"
+//	"github.com/gin-gonic/gin"
+//	"strconv"
+//	"strings"
+//	"webserver/extend/code"
+//	"webserver/extend/util"
+//)
+//
+//type CameraTaskArgsController struct {
+//
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏍规嵁鎽勫儚鏈篿d鍜屼换鍔d鏌ヨ绠楁硶閰嶇疆璇︽儏
+//// @Description 鏍规嵁鎽勫儚鏈篿d鍜屼换鍔d鏌ヨ绠楁硶閰嶇疆璇︽儏
+//// @Produce json
+//// @Tags CameraTaskArgs
+//// @Param cameraId query string true "鎽勫儚鏈篿d"
+//// @Param taskId query string true "浠诲姟id"
+//// @Param set_type query string true "浠诲姟绫诲瀷"
+//// @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/getRulesByCameraAndTask [get]
+//func (controller CameraTaskArgsController) FindByCameraAndTask(c *gin.Context) {
+//	cameraId := c.Query("cameraId")
+//	taskId := c.Query("taskId")
+//	setType := c.Query("set_type")
+//	if cameraId == "" || taskId == "" || setType == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鎽勫儚鏈篿d鍜屼换鍔d涓嶈兘涓虹┖")
+//		return
+//	}
+//	var api dbapi.CameraTaskArgsApi
+//	flag,data := api.FindByCameraAndTask(cameraId,taskId,setType)
+//
+//	if flag {
+//		util.ResponseFormat(c, code.Success, data)
+//	} else {
+//		util.ResponseFormat(c, code.ComError, data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏍规嵁澶氫釜鎽勫儚鏈篿d鏌ヨ鑱斿姩浠诲姟瑙勫垯璁剧疆
+//// @Description 鏍规嵁澶氫釜鎽勫儚鏈篿d鏌ヨ鑱斿姩浠诲姟瑙勫垯璁剧疆
+//// @Accept json
+//// @Produce json
+//// @Tags CameraTaskArgs
+//// @Param cameraIds body controllers.MultiCamera true "鎽勫儚鏈篿ds"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/cameraTaskArgs/getLinkRulesByCameraIds [post]
+//func (controller CameraTaskArgsController) GetLinkRulesByCameraIds(c *gin.Context) {
+//	var cameraIdsVo MultiCamera
+//	if err := c.BindJSON(&cameraIdsVo);err !=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskArgsApi
+//	paramBody := util.Struct2Map(cameraIdsVo)
+//	flag,data := api.GetLinkRulesByCameraIds(paramBody)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏍规嵁鍒嗙粍id鍒囨崲甯冮槻鎴栨挙闃�
+//// @Description 鏍规嵁鍒嗙粍id鍒囨崲甯冮槻鎴栨挙闃�
+//// @Accept x-www-form-urlencoded
+//// @Produce json
+//// @Tags CameraTaskArgs
+//// @Param groupId formData string true "浠诲姟绠楁硶鍙傛暟鍒嗙粍id"
+//// @Param defenceState formData bool true "甯冮槻鐘舵��,false:鎾ら槻锛宼rue锛氬竷闃�"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/cameraTaskArgs/updateDefenceStateByGroup [post]
+//func (controller CameraTaskArgsController) UpdateDefenceStateByGroup(c *gin.Context){
+//	groupId := c.PostForm("groupId")
+//	str := c.PostForm("defenceState")
+//	logger.Debug("defenceState:",str)
+//	defenceState, err := strconv.ParseBool(str)
+//	if groupId =="" || err !=nil{
+//		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskArgsApi
+//	if b,data := api.UpdateDefenceStateByGroup(groupId,defenceState);b{
+//		util.ResponseFormat(c,code.UpdateSuccess,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @SUmmary 鏍规嵁鍒嗙粍id鍒犻櫎鎽勫儚鏈虹畻娉曡鍒�
+//// @Description 鏍规嵁鍒嗙粍id鍒犻櫎鎽勫儚鏈虹畻娉曡鍒�
+//// @Produce json
+//// @Tags CameraTaskArgs
+//// @Param groupId query string true "浠诲姟绠楁硶鍙傛暟鍒嗙粍id"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"璇锋眰澶勭悊鎴愬姛", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:"閿欒淇℃伅鍐呭"}"
+//// @Router /data/api-v/cameraTaskArgs/deleteByGroup [get]
+//func (controller CameraTaskArgsController)DeleteByGroup(c *gin.Context) {
+//	groupId := c.Query("groupId")
+//	if groupId == "" {
+//		util.ResponseFormat(c, code.RequestParamError, "id蹇呭~")
+//		return
+//	}
+//	var api dbapi.CameraTaskArgsApi
+//	flag,data := api.DeleteByGroup(groupId)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,"鍒犻櫎澶辫触")
+//	}
+//
+//}
+//
+//type SaveLinkRulesGroupVo struct {
+//	LinkTaskId string `json:"link_task_id"`//鑱斿姩浠诲姟id
+//	GroupId string `json:"group_id"`//鍒嗙粍id
+//	GroupText string `json:"group_text"`//缁勮鍒欐枃瀛�
+//	Rules []LinkRuleArgVo `json:"rules"`//缁勫唴鐨勮鍒�
+//}
+//
+//type LinkRuleArgVo struct {
+//	TaskId string `json:"task_id"`
+//	CameraTaskArgs
+//}
+//
+//type CameraTaskArgs struct {
+//	Id string `json:"id"`
+//	CameraTaskId string `json:"camera_task_id"`//camera_tasks琛ㄧ殑涓婚敭锛屾憚鍍忔満鍜屼换鍔″叧鑱攊d鎴栬�呰仈鍔ㄤ换鍔d
+//	CameraId string 	`json:"camera_id"`//鎽勫儚鏈篿d
+//	PolygonId string `json:"polygon_id"`//澶氳竟褰d
+//	SdkId string `json:"sdk_id"`//绠楁硶id
+//	SdkArgAlias string `json:"sdk_arg_alias"`//绠楁硶鍙傛暟鍒悕
+//	Operator string `json:"operator"`//璁$畻鏂瑰紡=,>,>=绛夌瓑
+//	OperatorType string `json:"operator_type"`//璁$畻鐨勫�肩被鍨�
+//	SdkArgValue string `json:"sdk_arg_value"` //绠楁硶鍙傛暟鍊艰缃�
+//	Sort int `json:"sort"`//鎺掑簭
+//	RuleWithPre string `json:"rule_with_pre"`//涓庝笂涓�鏉¤褰曠殑閫昏緫杩愮畻瑙勫垯锛�&&,||锛�
+//	GroupId string `json:"group_id"`//鍒嗙粍id
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 淇濆瓨鑱斿姩浠诲姟瑙勫垯鍙傛暟
+//// @Description 淇濆瓨鑱斿姩浠诲姟瑙勫垯鍙傛暟
+//// @Accept json
+//// @Produce json
+//// @Param saveBody body controllers.SaveLinkRulesGroupVo true "鑱斿姩浠诲姟瑙勫垯淇濆瓨鍙傛暟"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/cameraTaskArgs/saveLinkRulesByGroup [post]
+//func (controller CameraTaskArgsController) SaveLinkRulesByGroup(c *gin.Context) {
+//	var saveBody SaveLinkRulesGroupVo
+//	if err := c.BindJSON(&saveBody);err !=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskArgsApi
+//	paramBody := util.Struct2Map(saveBody)
+//	flag,data := api.SaveLinkRulesByGroup(paramBody)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//type RuleApply2AllVo struct {
+//	CameraId   string  			  `json:"camera_id" binding:"required"`//瑙勫垯鎷ユ湁鑰卛d
+//}
+//
+//// @Summary 灏嗘湰鏉¤鍒欏簲鐢ㄥ埌鎵�鏈夋湰鍦拌棰�
+//// @Description 灏嗘湰鏉¤鍒欏簲鐢ㄥ埌鎵�鏈夋湰鍦拌棰�
+//// @Produce json
+//// @Tags CameraTaskArgs
+//// @Param args body controllers.RuleApply2AllVo true "瑙勫垯搴旂敤鍒版墍鏈夋湰鍦拌棰戣姹傚弬鏁�"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/cameraTaskArgs/ruleApply2All [post]
+//func (controller CameraTaskArgsController) RuleApply2All(c *gin.Context) {
+//	var saveBody RuleApply2AllVo
+//	err := c.BindJSON(&saveBody)
+//	if err !=nil {
+//		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+//		return
+//	}
+//	if !strings.HasPrefix(saveBody.CameraId, File_Video_Id_Pre) && !strings.HasPrefix(saveBody.CameraId, File_Img_Id_Pre) && !!strings.HasPrefix(saveBody.CameraId, File_Audio_Id_Pre) {
+//		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.CameraTaskApi
+//	paramBody := util.Struct2Map(saveBody)
+//	flag, data := api.RuleApply2All(paramBody)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c, code.ComError, data)
+//	}
+//}
\ No newline at end of file
diff --git a/controllers/ruleTemplate.go b/controllers/ruleTemplate.go
new file mode 100644
index 0000000..293aa12
--- /dev/null
+++ b/controllers/ruleTemplate.go
@@ -0,0 +1,120 @@
+package controllers
+
+import (
+	"basic.com/dbapi.git"
+	"basic.com/pubsub/protomsg.git"
+	"bytes"
+	"encoding/json"
+	"github.com/gin-gonic/gin"
+	"github.com/gogo/protobuf/jsonpb"
+	"webserver/extend/code"
+	"webserver/extend/util"
+)
+
+type RuleTemplateController struct {
+
+}
+
+var jsonpbMarshaler = &jsonpb.Marshaler{
+	EnumsAsInts: true,
+	EmitDefaults: true,
+	OrigName: true,
+}
+
+// @Summary 淇濆瓨鍦烘櫙妯℃澘
+// @Description 淇濆瓨鍦烘櫙妯℃澘
+// @Accept json
+// @Produce json
+// @Tags 鍦烘櫙妯℃澘
+// @Param reqBody body models.RuleTemplate true "妯℃澘淇濆瓨鍙傛暟"
+// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+// @Router /data/api-v/template/rule/save [post]
+func (rtc RuleTemplateController) Save(c *gin.Context) {
+	var reqBody map[string]interface{}
+	c.BindJSON(&reqBody)
+	var api dbapi.RuleTemplateApi
+	if api.Save(reqBody) {
+		util.ResponseFormat(c, code.Success, "淇濆瓨鎴愬姛")
+	} else {
+		util.ResponseFormat(c, code.ComError, "淇濆瓨澶辫触")
+	}
+}
+
+// @Summary 缂栬緫
+// @Description 缂栬緫
+// @Accept json
+// @Produce json
+// @Tags 鍦烘櫙妯℃澘
+// @Param id path string true "妯℃澘id"
+// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+// @Router /data/api-v/template/rule/{id} [get]
+func (rtc RuleTemplateController) Show(c *gin.Context) {
+	id := c.Param("id")
+	if id == "" {
+		util.ResponseFormat(c,code.RequestParamError, "鍙傛暟鏈夎")
+		return
+	}
+	var api dbapi.RuleTemplateApi
+	b, d := api.Show(id)
+	if b {
+		util.ResponseFormat(c,code.Success, d)
+	} else {
+		util.ResponseFormat(c,code.ComError, "")
+	}
+}
+
+// @Summary 鏍规嵁id鍒犻櫎鍦烘櫙妯℃澘
+// @Description 鏍规嵁id鍒犻櫎鍦烘櫙妯℃澘
+// @Accept json
+// @Produce json
+// @Tags 鍦烘櫙妯℃澘
+// @Param id path string true "妯℃澘id"
+// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+// @Router /data/api-v/template/rule/{id} [delete]
+func (rtc RuleTemplateController) Delete(c *gin.Context) {
+	id := c.Param("id")
+	if id == "" {
+		util.ResponseFormat(c,code.RequestParamError, "鍙傛暟鏈夎")
+		return
+	}
+	var api dbapi.RuleTemplateApi
+	if api.Delete(id) {
+		util.ResponseFormat(c,code.Success, "鍒犻櫎鎴愬姛")
+	} else {
+		util.ResponseFormat(c,code.ComError, "")
+	}
+}
+
+// @Summary 鏌ユ壘鎵�鏈夊満鏅ā鏉�
+// @Description 鏌ユ壘鎵�鏈夊満鏅ā鏉�
+// @Accept json
+// @Produce json
+// @Tags 鍦烘櫙妯℃澘
+// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+// @Router /data/api-v/template/rule [get]
+func (rtc RuleTemplateController) FindAll(c *gin.Context) {
+	var api dbapi.RuleTemplateApi
+	b, templates := api.FindAll()
+	if b {
+		var result protomsg.RuleTemplateList
+		for _,r := range templates {
+			result.List = append(result.List, &r)
+		}
+
+		var _buffer bytes.Buffer
+		err := jsonpbMarshaler.Marshal(&_buffer, &result)
+		if err == nil {
+			jsonB := _buffer.Bytes()
+			var m map[string]interface{}
+			json.Unmarshal(jsonB, &m)
+			util.ResponseFormat(c,code.Success, m)
+			return
+		}
+	} else {
+		util.ResponseFormat(c, code.ComError, "")
+	}
+}
\ No newline at end of file
diff --git a/controllers/task.go b/controllers/task.go
index 8c2e205..b66a0f1 100644
--- a/controllers/task.go
+++ b/controllers/task.go
@@ -1,16 +1,8 @@
 package controllers
 
 import (
-	"basic.com/dbapi.git"
-	"basic.com/pubsub/esutil.git"
-	"basic.com/pubsub/protomsg.git"
-	"encoding/json"
-	"strconv"
-	"time"
-	"webserver/cache"
-	"webserver/extend/config"
-
 	"github.com/gin-gonic/gin"
+	"time"
 	"webserver/extend/code"
 	"webserver/extend/util"
 )
@@ -38,37 +30,37 @@
 	FaceExtract_VirtualSdkId = "virtual-faceextract-sdk-pull"//缁撴灉杈撳嚭鐨勭畻娉昳d
 )
 
-// @Security ApiKeyAuth
-// @Summary 鏌ユ壘鎵�鏈変换鍔★紝鍖呭惈浠诲姟淇℃伅鍜屽搴旂殑绠楁硶淇℃伅
-// @Description 鏌ユ壘鎵�鏈変换鍔�
-// @Produce json
-// @Tags task
-// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
-// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
-// @Router /data/api-v/task/findAll [GET]
-func (tc TaskController) FindAll(c *gin.Context) {
-	// 鏄剧ず鎵�鏈変换鍔�: 鑾峰彇淇℃伅
-	var taskApi dbapi.TaskApi
-
-	taskInfos := taskApi.FindAll()
-	var arr []protomsg.TaskSdkInfo
-	for _,ti :=range taskInfos{
-		if ti.Task.Taskid != FaceExtract_VirtualTaskId{
-			arr = append(arr,ti)
-		}
-	}
-	var tasks []TaskSdkVo
-	dataBytes, err := json.Marshal(arr)
-	if err !=nil {
-		util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
-	} else {
-		if err := json.Unmarshal(dataBytes, &tasks);err !=nil {
-			util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
-		} else {
-			util.ResponseFormat(c,code.Success,tasks)
-		}
-	}
-}
+//// @Security ApiKeyAuth
+//// @Summary 鏌ユ壘鎵�鏈変换鍔★紝鍖呭惈浠诲姟淇℃伅鍜屽搴旂殑绠楁硶淇℃伅
+//// @Description 鏌ユ壘鎵�鏈変换鍔�
+//// @Produce json
+//// @Tags task
+//// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
+//// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
+//// @Router /data/api-v/task/findAll [GET]
+//func (tc TaskController) FindAll(c *gin.Context) {
+//	// 鏄剧ず鎵�鏈変换鍔�: 鑾峰彇淇℃伅
+//	var taskApi dbapi.TaskApi
+//
+//	taskInfos := taskApi.FindAll()
+//	var arr []protomsg.TaskSdkInfo
+//	for _,ti :=range taskInfos{
+//		if ti.Task.Taskid != FaceExtract_VirtualTaskId{
+//			arr = append(arr,ti)
+//		}
+//	}
+//	var tasks []TaskSdkVo
+//	dataBytes, err := json.Marshal(arr)
+//	if err !=nil {
+//		util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
+//	} else {
+//		if err := json.Unmarshal(dataBytes, &tasks);err !=nil {
+//			util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
+//		} else {
+//			util.ResponseFormat(c,code.Success,tasks)
+//		}
+//	}
+//}
 
 // @Security ApiKeyAuth
 // @Summary 妫�绱㈤〉闈㈣幏鍙栨墍鏈変换鍔″垪琛紙鍖呭惈宸插垹闄ょ殑浠诲姟锛�
@@ -80,333 +72,334 @@
 // @Router /data/api-v/task/aggregateTaskList [GET]
 func (tc TaskController) AggregateTaskList(c *gin.Context) {
 	// 鏄剧ず鎵�鏈変换鍔�: 鑾峰彇淇℃伅
-	var taskApi dbapi.TaskApi
-
-	taskInfos := taskApi.FindAll()
-	m := make(map[string]string)
-	var arr []protomsg.TaskSdkInfo
-	for _,ti :=range taskInfos{
-		if ti.Task.Taskid != FaceExtract_VirtualTaskId{
-			arr = append(arr,ti)
-			m[ti.Task.Taskid] = ti.Task.Taskid
-		}
-	}
-	var tasks []TaskSdkVo
-	dataBytes, err := json.Marshal(arr)
-	if err !=nil {
-		util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
-	} else {
-		if err := json.Unmarshal(dataBytes, &tasks);err !=nil {
-			util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
-		} else {
-			//澶勭悊宸茶鍒犻櫎鐨勪换鍔�
-			localConf, _ := cache.GetServerInfo()
-			if localConf.AlarmIp != "" && localConf.ServerId != "" && localConf.AlarmPort>0 {
-				indexName := config.EsInfo.EsIndex.AiOcean.IndexName
-				esTaskM, e := esutil.AggregateTaskList(localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)), indexName, localConf.ServerId)
-				if e==nil && esTaskM !=nil {
-					for _,tM :=range esTaskM {
-						if _,ok := m[tM["taskId"].(string)];!ok {//琛ㄧず姝や换鍔″凡琚垹闄�
-							taskId := tM["taskId"].(string)
-							m[taskId] = taskId
-							tasks = append(tasks, TaskSdkVo{
-								Task:TaskVo{
-									Taskid:	taskId,
-									Taskname: tM["taskName"].(string),
-									DelFlag: true,
-								},
-								Sdks:[]SdkVo{},
-							})
-						}
-					}
-				}
-			}
-
-			util.ResponseFormat(c,code.Success,tasks)
-		}
-	}
+	//var taskApi dbapi.TaskApi
+	//
+	//taskInfos := taskApi.FindAll()
+	//m := make(map[string]string)
+	//var arr []protomsg.TaskSdkInfo
+	//for _,ti :=range taskInfos{
+	//	if ti.Task.Taskid != FaceExtract_VirtualTaskId{
+	//		arr = append(arr,ti)
+	//		m[ti.Task.Taskid] = ti.Task.Taskid
+	//	}
+	//}
+	//var tasks []TaskSdkVo
+	//dataBytes, err := json.Marshal(arr)
+	//if err !=nil {
+	//	util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
+	//} else {
+	//	if err := json.Unmarshal(dataBytes, &tasks);err !=nil {
+	//		util.ResponseFormat(c,code.ComError,[]TaskSdkVo{})
+	//	} else {
+	//		//澶勭悊宸茶鍒犻櫎鐨勪换鍔�
+	//		localConf, _ := cache.GetServerInfo()
+	//		if localConf.AlarmIp != "" && localConf.ServerId != "" && localConf.AlarmPort>0 {
+	//			indexName := config.EsInfo.EsIndex.AiOcean.IndexName
+	//			esTaskM, e := esutil.AggregateTaskList(localConf.AlarmIp, strconv.Itoa(int(localConf.AlarmPort)), indexName, localConf.ServerId)
+	//			if e==nil && esTaskM !=nil {
+	//				for _,tM :=range esTaskM {
+	//					if _,ok := m[tM["taskId"].(string)];!ok {//琛ㄧず姝や换鍔″凡琚垹闄�
+	//						taskId := tM["taskId"].(string)
+	//						m[taskId] = taskId
+	//						tasks = append(tasks, TaskSdkVo{
+	//							Task:TaskVo{
+	//								Taskid:	taskId,
+	//								Taskname: tM["taskName"].(string),
+	//								DelFlag: true,
+	//							},
+	//							Sdks:[]SdkVo{},
+	//						})
+	//					}
+	//				}
+	//			}
+	//		}
+	//
+	//		util.ResponseFormat(c,code.Success,tasks)
+	//	}
+	//}
+	util.ResponseFormat(c,code.Success,[]interface{}{})
 }
 
-// @Security ApiKeyAuth
-// @Summary 娣诲姞浠诲姟
-// @Description 鏌ユ壘鎵�鏈変换鍔�
-// @Accept json
-// @Produce json
-// @Tags task
-// @Param reqMap body controllers.TaskVo false "浠诲姟AAA"
-// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
-// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
-// @Router /data/api-v/task/addTask [POST]
-func (tc TaskController) AddTask(c *gin.Context) {
-	var task TaskVo
-	var taskApi dbapi.TaskApi
-	err := c.BindJSON(&task)
-	if err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	paramBody := util.Struct2Map(task)
-	flag, data := taskApi.Add(paramBody)
-	if !flag {
-		util.ResponseFormat(c, code.ComError, data)
-		return
-	}
-
-	util.ResponseFormat(c, code.Success, data)
-}
-
-type TaskSdkAdd struct {
-	TaskId string `json:"taskId"`
-	Sdks []SdkSort `json:"sdks"`
-}
-type SdkSort struct {
-	SdkId string `json:"sdkId"`
-	Sort int `json:"sort"`
-}
-
-// @Security ApiKeyAuth
-// @Summary 缁欎换鍔℃坊鍔犵畻娉�
-// @Description 浠诲姟娣诲姞绠楁硶
-// @Accept json
-// @Produce json
-// @Tags task
-// @Param taskSdkAdd body controllers.TaskSdkAdd true "浠诲姟id"
-// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
-// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
-// @Router /data/api-v/task/addTaskSdk [post]
-func (tc TaskController) AddTaskSdk(c *gin.Context) {
-	var addVo TaskSdkAdd
-	err := c.BindJSON(&addVo)
-	if err !=nil || addVo.TaskId == "" || len(addVo.Sdks)==0 {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	paramBody := util.Struct2Map(addVo)
-	var taskApi dbapi.TaskApi
-	flag,data := taskApi.AddTaskSdk(paramBody)
-	if flag {
-		util.ResponseFormat(c, code.Success, data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 浠诲姟鍒犻櫎绠楁硶
-// @Description 鏍规嵁taskid鍜宻dkid鍒犻櫎
-// @Produce json
-// @Tags task
-// @Param taskId query string true "浠诲姟id"
-// @Param sdkId query string true "绠楁硶id"
-// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
-// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
-// @Router /data/api-v/task/delTaskSdk [GET]
-func (tc TaskController) DeleteTaskSdk(c *gin.Context) {
-	var taskApi dbapi.TaskApi
-	taskId := c.Query("taskId")
-	sdkId := c.Query("sdkId")
-	if taskId == "" || sdkId == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	flag,data := taskApi.DeleteTaskSdk(taskId,sdkId)
-	if flag {
-		util.ResponseFormat(c, code.Success, data)
-	} else {
-		util.ResponseFormat(c,code.ComError, data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏇存柊浠诲姟鍚嶇О
-// @Description 鏇存柊浠诲姟鍚嶇О
-// @Accept x-www-form-urlencoded
-// @Produce json
-// @Tags task
-// @Param taskId formData string true "taskId"
-// @Param taskName formData string true "taskName"
-// @Success 200 {string} json "{"code":200, msg:"",data:"",success:true}"
-// @Failure 500 {string} json "{"code":500, msg:"",data:"",success:false}"
-// @Router /data/api-v/task/updateTaskName [POST]
-func (tc TaskController) UpdateTaskName(c *gin.Context) {
-	taskId := c.PostForm("taskId")
-	taskName := c.PostForm("taskName")
-	if taskId == "" || taskName == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.TaskApi
-	if api.UpdateTaskName(taskId, taskName) {
-		util.ResponseFormat(c,code.UpdateSuccess,"鏇存柊鎴愬姛")
-	} else {
-		util.ResponseFormat(c,code.ComError,"鏇存柊澶辫触")
-	}
-
-}
-
-type TaskStatusVo struct {
-	TaskId string `json:"taskId"`
-	Enable bool `json:"enable"`
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏇存柊浠诲姟鐘舵��
-// @Description 锛堢畻娉曚笉鍙�,鍙洿鏂颁换鍔$姸鎬侊級
-// @Accept json
-// @Produce json
-// @Tags task
-// @Param taskStatus body controllers.TaskStatusVo 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/task/updateTaskStatus [POST]
-func (tc TaskController) UpdateTaskStatus(c *gin.Context) {
-	var tsvo TaskStatusVo
-	err := c.BindJSON(&tsvo)
-	if err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var taskApi dbapi.TaskApi
-	paramBody := util.Struct2Map(tsvo)
-	flag, data := taskApi.UpdateTaskStatus(paramBody)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鍒犻櫎浠诲姟
-// @Description 鏍规嵁浠诲姟id鍒犻櫎浠诲姟
-// @Produce json
-// @Tags task
-// @Param taskId query string true "浠诲姟id"
-// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
-// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
-// @Router /data/api-v/task/delete [GET]
-func (tc TaskController) DeleteTask(c *gin.Context) {
-	var taskApi dbapi.TaskApi
-	taskId := c.Query("taskId")
-	if taskId == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	flag, data := taskApi.Delete(taskId)
-	if flag {
-		util.ResponseFormat(c,code.Success,data)
-	} else {
-		util.ResponseFormat(c,code.ComError,data)
-	}
-
-}
-
-type TaskSdkRules struct {
-	TaskId string `json:"taskId"`
-	SdkId string  `json:"sdkId"`
-	Rules []TaskSdkRuleVo `json:"rules"`
-}
-
-type TaskSdkRuleVo struct {
-	Id string `json:"id"`
-	SdkArgAlias string `json:"sdk_arg_alias"`
-	Operator string `json:"operator"`
-	SdkArgValue string `json:"sdk_arg_value"`
-}
-
-// @Security ApiKeyAuth
-// @Summary 淇濆瓨绠楁硶瑙勫垯
-// @Description 淇濆瓨绠楁硶瑙勫垯
-// @Accept json
-// @Produce json
-// @Tags 绠楁硶瑙勫垯
-// @Param sdkrules body controllers.TaskSdkRules true "绠楁硶鍙傛暟瑙勫垯"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/task/saveTaskSdkRule [post]
-func (tc TaskController) SaveTaskSdkRule(c *gin.Context) {
-	var rules TaskSdkRules
-	err := c.BindJSON(&rules)
-	if err !=nil || rules.TaskId == "" || rules.SdkId == "" || len(rules.Rules) == 0 {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	paramBody := util.Struct2Map(rules)
-	var api dbapi.TaskSdkRuleApi
-	b,d := api.SaveTaskSdkRule(paramBody)
-	if b {
-		util.ResponseFormat(c,code.Success,d)
-	} else {
-		util.ResponseFormat(c,code.ComError,"淇濆瓨澶辫触")
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鍒犻櫎绠楁硶瑙勫垯
-// @Description 鍒犻櫎绠楁硶瑙勫垯
-// @Accept x-www-form-urlencoded
-// @Produce json
-// @Tags 绠楁硶瑙勫垯
-// @Param taskId formData string true "taskId"
-// @Param sdkId formData string true "sdkId"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/task/deleteTaskSdkRule [post]
-func (tc TaskController) DeleteTaskSdkRule(c *gin.Context) {
-	taskId := c.PostForm("taskId")
-	sdkId := c.PostForm("sdkId")
-	if taskId == "" || sdkId == "" {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var api dbapi.TaskSdkRuleApi
-	if api.DeleteTaskSdkRule(taskId, sdkId) {
-		util.ResponseFormat(c,code.Success,"鍒犻櫎鎴愬姛")
-	} else {
-		util.ResponseFormat(c,code.ComError, "鍒犻櫎澶辫触")
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 鏌ヨ绠楁硶瑙勫垯
-// @Description 鏌ヨ绠楁硶瑙勫垯
-// @Produce json
-// @Tags 绠楁硶瑙勫垯
-// @Param taskId query string true "浠诲姟id"
-// @Param sdkId query string true "绠楁硶id"
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/task/getRulesByTaskSdk [get]
-func (tc TaskController) GetRulesByTaskSdk(c *gin.Context) {
-	taskId := c.Query("taskId")
-	sdkId := c.Query("sdkId")
-	if taskId == "" || sdkId == ""{
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
-		return
-	}
-	var taskSdkApi dbapi.TaskSdkRuleApi
-	b, d := taskSdkApi.GetRulesByTaskSdk(taskId, sdkId)
-	if b {
-		util.ResponseFormat(c,code.Success,d)
-	} else {
-		util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触")
-	}
-}
-
-// @Security ApiKeyAuth
-// @Summary 缁熻姣忎釜浠诲姟鐨勬憚鍍忔満鏁伴噺
-// @Description 缁熻姣忎釜浠诲姟鐨勬憚鍍忔満鏁伴噺
-// @Produce json
-// @Tags task
-// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
-// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
-// @Router /data/api-v/task/statisticTaskCamera [get]
-func (tc TaskController) StatisticTaskCamera(c *gin.Context) {
-	var taskApi dbapi.TaskApi
-	b,d := taskApi.StatisticTaskCamera()
-	if b {
-		util.ResponseFormat(c,code.Success, d)
-	} else {
-		util.ResponseFormat(c,code.ComError, "")
-	}
-}
+//// @Security ApiKeyAuth
+//// @Summary 娣诲姞浠诲姟
+//// @Description 鏌ユ壘鎵�鏈変换鍔�
+//// @Accept json
+//// @Produce json
+//// @Tags task
+//// @Param reqMap body controllers.TaskVo false "浠诲姟AAA"
+//// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
+//// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
+//// @Router /data/api-v/task/addTask [POST]
+//func (tc TaskController) AddTask(c *gin.Context) {
+//	var task TaskVo
+//	var taskApi dbapi.TaskApi
+//	err := c.BindJSON(&task)
+//	if err !=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	paramBody := util.Struct2Map(task)
+//	flag, data := taskApi.Add(paramBody)
+//	if !flag {
+//		util.ResponseFormat(c, code.ComError, data)
+//		return
+//	}
+//
+//	util.ResponseFormat(c, code.Success, data)
+//}
+//
+//type TaskSdkAdd struct {
+//	TaskId string `json:"taskId"`
+//	Sdks []SdkSort `json:"sdks"`
+//}
+//type SdkSort struct {
+//	SdkId string `json:"sdkId"`
+//	Sort int `json:"sort"`
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 缁欎换鍔℃坊鍔犵畻娉�
+//// @Description 浠诲姟娣诲姞绠楁硶
+//// @Accept json
+//// @Produce json
+//// @Tags task
+//// @Param taskSdkAdd body controllers.TaskSdkAdd true "浠诲姟id"
+//// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
+//// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
+//// @Router /data/api-v/task/addTaskSdk [post]
+//func (tc TaskController) AddTaskSdk(c *gin.Context) {
+//	var addVo TaskSdkAdd
+//	err := c.BindJSON(&addVo)
+//	if err !=nil || addVo.TaskId == "" || len(addVo.Sdks)==0 {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	paramBody := util.Struct2Map(addVo)
+//	var taskApi dbapi.TaskApi
+//	flag,data := taskApi.AddTaskSdk(paramBody)
+//	if flag {
+//		util.ResponseFormat(c, code.Success, data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 浠诲姟鍒犻櫎绠楁硶
+//// @Description 鏍规嵁taskid鍜宻dkid鍒犻櫎
+//// @Produce json
+//// @Tags task
+//// @Param taskId query string true "浠诲姟id"
+//// @Param sdkId query string true "绠楁硶id"
+//// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
+//// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
+//// @Router /data/api-v/task/delTaskSdk [GET]
+//func (tc TaskController) DeleteTaskSdk(c *gin.Context) {
+//	var taskApi dbapi.TaskApi
+//	taskId := c.Query("taskId")
+//	sdkId := c.Query("sdkId")
+//	if taskId == "" || sdkId == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	flag,data := taskApi.DeleteTaskSdk(taskId,sdkId)
+//	if flag {
+//		util.ResponseFormat(c, code.Success, data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError, data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏇存柊浠诲姟鍚嶇О
+//// @Description 鏇存柊浠诲姟鍚嶇О
+//// @Accept x-www-form-urlencoded
+//// @Produce json
+//// @Tags task
+//// @Param taskId formData string true "taskId"
+//// @Param taskName formData string true "taskName"
+//// @Success 200 {string} json "{"code":200, msg:"",data:"",success:true}"
+//// @Failure 500 {string} json "{"code":500, msg:"",data:"",success:false}"
+//// @Router /data/api-v/task/updateTaskName [POST]
+//func (tc TaskController) UpdateTaskName(c *gin.Context) {
+//	taskId := c.PostForm("taskId")
+//	taskName := c.PostForm("taskName")
+//	if taskId == "" || taskName == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.TaskApi
+//	if api.UpdateTaskName(taskId, taskName) {
+//		util.ResponseFormat(c,code.UpdateSuccess,"鏇存柊鎴愬姛")
+//	} else {
+//		util.ResponseFormat(c,code.ComError,"鏇存柊澶辫触")
+//	}
+//
+//}
+//
+//type TaskStatusVo struct {
+//	TaskId string `json:"taskId"`
+//	Enable bool `json:"enable"`
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏇存柊浠诲姟鐘舵��
+//// @Description 锛堢畻娉曚笉鍙�,鍙洿鏂颁换鍔$姸鎬侊級
+//// @Accept json
+//// @Produce json
+//// @Tags task
+//// @Param taskStatus body controllers.TaskStatusVo 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/task/updateTaskStatus [POST]
+//func (tc TaskController) UpdateTaskStatus(c *gin.Context) {
+//	var tsvo TaskStatusVo
+//	err := c.BindJSON(&tsvo)
+//	if err !=nil {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var taskApi dbapi.TaskApi
+//	paramBody := util.Struct2Map(tsvo)
+//	flag, data := taskApi.UpdateTaskStatus(paramBody)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鍒犻櫎浠诲姟
+//// @Description 鏍规嵁浠诲姟id鍒犻櫎浠诲姟
+//// @Produce json
+//// @Tags task
+//// @Param taskId query string true "浠诲姟id"
+//// @Success 200 {string} json "{"code":200, msg:"璇锋眰澶勭悊鎴愬姛",data:"",success:true}"
+//// @Failure 500 {string} json "{"code":500, msg:"璇锋眰澶辫触",data:"",success:false}"
+//// @Router /data/api-v/task/delete [GET]
+//func (tc TaskController) DeleteTask(c *gin.Context) {
+//	var taskApi dbapi.TaskApi
+//	taskId := c.Query("taskId")
+//	if taskId == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	flag, data := taskApi.Delete(taskId)
+//	if flag {
+//		util.ResponseFormat(c,code.Success,data)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,data)
+//	}
+//
+//}
+//
+//type TaskSdkRules struct {
+//	TaskId string `json:"taskId"`
+//	SdkId string  `json:"sdkId"`
+//	Rules []TaskSdkRuleVo `json:"rules"`
+//}
+//
+//type TaskSdkRuleVo struct {
+//	Id string `json:"id"`
+//	SdkArgAlias string `json:"sdk_arg_alias"`
+//	Operator string `json:"operator"`
+//	SdkArgValue string `json:"sdk_arg_value"`
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 淇濆瓨绠楁硶瑙勫垯
+//// @Description 淇濆瓨绠楁硶瑙勫垯
+//// @Accept json
+//// @Produce json
+//// @Tags 绠楁硶瑙勫垯
+//// @Param sdkrules body controllers.TaskSdkRules true "绠楁硶鍙傛暟瑙勫垯"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/task/saveTaskSdkRule [post]
+//func (tc TaskController) SaveTaskSdkRule(c *gin.Context) {
+//	var rules TaskSdkRules
+//	err := c.BindJSON(&rules)
+//	if err !=nil || rules.TaskId == "" || rules.SdkId == "" || len(rules.Rules) == 0 {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	paramBody := util.Struct2Map(rules)
+//	var api dbapi.TaskSdkRuleApi
+//	b,d := api.SaveTaskSdkRule(paramBody)
+//	if b {
+//		util.ResponseFormat(c,code.Success,d)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,"淇濆瓨澶辫触")
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鍒犻櫎绠楁硶瑙勫垯
+//// @Description 鍒犻櫎绠楁硶瑙勫垯
+//// @Accept x-www-form-urlencoded
+//// @Produce json
+//// @Tags 绠楁硶瑙勫垯
+//// @Param taskId formData string true "taskId"
+//// @Param sdkId formData string true "sdkId"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/task/deleteTaskSdkRule [post]
+//func (tc TaskController) DeleteTaskSdkRule(c *gin.Context) {
+//	taskId := c.PostForm("taskId")
+//	sdkId := c.PostForm("sdkId")
+//	if taskId == "" || sdkId == "" {
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var api dbapi.TaskSdkRuleApi
+//	if api.DeleteTaskSdkRule(taskId, sdkId) {
+//		util.ResponseFormat(c,code.Success,"鍒犻櫎鎴愬姛")
+//	} else {
+//		util.ResponseFormat(c,code.ComError, "鍒犻櫎澶辫触")
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 鏌ヨ绠楁硶瑙勫垯
+//// @Description 鏌ヨ绠楁硶瑙勫垯
+//// @Produce json
+//// @Tags 绠楁硶瑙勫垯
+//// @Param taskId query string true "浠诲姟id"
+//// @Param sdkId query string true "绠楁硶id"
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/task/getRulesByTaskSdk [get]
+//func (tc TaskController) GetRulesByTaskSdk(c *gin.Context) {
+//	taskId := c.Query("taskId")
+//	sdkId := c.Query("sdkId")
+//	if taskId == "" || sdkId == ""{
+//		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+//		return
+//	}
+//	var taskSdkApi dbapi.TaskSdkRuleApi
+//	b, d := taskSdkApi.GetRulesByTaskSdk(taskId, sdkId)
+//	if b {
+//		util.ResponseFormat(c,code.Success,d)
+//	} else {
+//		util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触")
+//	}
+//}
+//
+//// @Security ApiKeyAuth
+//// @Summary 缁熻姣忎釜浠诲姟鐨勬憚鍍忔満鏁伴噺
+//// @Description 缁熻姣忎釜浠诲姟鐨勬憚鍍忔満鏁伴噺
+//// @Produce json
+//// @Tags task
+//// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
+//// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
+//// @Router /data/api-v/task/statisticTaskCamera [get]
+//func (tc TaskController) StatisticTaskCamera(c *gin.Context) {
+//	var taskApi dbapi.TaskApi
+//	b,d := taskApi.StatisticTaskCamera()
+//	if b {
+//		util.ResponseFormat(c,code.Success, d)
+//	} else {
+//		util.ResponseFormat(c,code.ComError, "")
+//	}
+//}
diff --git a/go.mod b/go.mod
index 9f5de4d..19ed098 100644
--- a/go.mod
+++ b/go.mod
@@ -3,12 +3,12 @@
 go 1.12
 
 require (
-	basic.com/dbapi.git v0.0.0-20200312083548-4b84d53ed3bf
+	basic.com/dbapi.git v0.0.0-20200624110237-a6e8debca64b // indirect
 	basic.com/fileServer/WeedFSClient.git v0.0.0-20190919054037-0182b6c3f5cb
 	basic.com/gb28181api.git v0.0.0-20191028082253-472438a8407b
 	basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48
 	basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777
-	basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337
+	basic.com/pubsub/protomsg.git v0.0.0-20200624085547-386ecad53ae3 // indirect
 	basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe
 	basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051
 	basic.com/valib/godraw.git v0.0.0-20191122082247-26e9987cd183
diff --git a/go.sum b/go.sum
index 82c2b41..05588f9 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,5 @@
-basic.com/dbapi.git v0.0.0-20200312083548-4b84d53ed3bf h1:d0h3A4bJ6oB2+rHRDA0UJ6FG1zX6HKvIhFfEZyJ7s5Y=
-basic.com/dbapi.git v0.0.0-20200312083548-4b84d53ed3bf/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
+basic.com/dbapi.git v0.0.0-20200624110237-a6e8debca64b h1:JspPr7IsNBBq9TrlfWZjFMWKobkhkvHC8d+MUJp8VaU=
+basic.com/dbapi.git v0.0.0-20200624110237-a6e8debca64b/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
 basic.com/fileServer/WeedFSClient.git v0.0.0-20190919054037-0182b6c3f5cb h1:fM6DojeInFSCFO+wkba1jtyPiSDqw0jYKi4Tk+e+ka4=
 basic.com/fileServer/WeedFSClient.git v0.0.0-20190919054037-0182b6c3f5cb/go.mod h1:FTryK8BsVLfUplx8a3+l8hJWub6VbAWZCUH7sPRZaso=
 basic.com/gb28181api.git v0.0.0-20191028082253-472438a8407b h1:Qh7x2PY3HA9B404Llq+olY5/YlGYrM58bpOHa2CGcro=
@@ -10,8 +10,8 @@
 basic.com/pubsub/esutil.git v0.0.0-20191120125514-865efa73a9ae/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw=
 basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777 h1:gTeuhepfLgOchD6bqydsGGV6KCj/UaseQQgo4DFyhGQ=
 basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw=
-basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337 h1:6LTdIfHUZkfemhkuQnXXaeXRdnm4459PyxMd36AXV20=
-basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/pubsub/protomsg.git v0.0.0-20200624085547-386ecad53ae3 h1:j9UtxEMVKvul6hS1hbb4BtPjpb4HwV/IZ76A5QVQU94=
+basic.com/pubsub/protomsg.git v0.0.0-20200624085547-386ecad53ae3/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
 basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe h1:uh3u7DuSOw6AwzvPC1EM19sw1Skks1EUJddcbHDKI9M=
 basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe/go.mod h1:y+h7VUnoSQ3jOtf2K3twXNA8fYDfyUsifSswcyKLgNw=
 basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051/go.mod h1:bkYiTUGzckyNOjAgn9rB/DOjFzwoSHJlruuWQ6hu6IY=
diff --git a/router/router.go b/router/router.go
index d45ed44..6b45b65 100644
--- a/router/router.go
+++ b/router/router.go
@@ -31,8 +31,8 @@
 	deleteDataController := new(controllers.DeleteDataController)
 	cameraTimeRuleController := new(controllers.CameraTimeruleController)
 	polygonController := new(controllers.CameraPolygonController)
-	cameraTaskController := new(controllers.CameraTaskController)
-	cameraTaskArgsController := new(controllers.CameraTaskArgsController)
+	//cameraTaskController := new(controllers.CameraTaskController)
+	//cameraTaskArgsController := new(controllers.CameraTaskArgsController)
 	dicController := new(controllers.DictionaryController)
 	userController := new(controllers.UserController)
 	eventPushController := new(controllers.EventPushController)
@@ -48,6 +48,8 @@
     icController := new(controllers.InfoController)
     gb28181C := new(controllers.Gb28181Controller)
     fStackC := new(controllers.FileStackController)
+	cameraRuleController := new (controllers.CameraRuleController)
+	rtc := new(controllers.RuleTemplateController)
 
 	urlPrefix := "/data/api-v" // wp 娣诲姞 璺緞 鍓嶇紑
 
@@ -110,12 +112,12 @@
         camera.POST("/updateCameraArea", cameraController.UpdateCameraArea)
 		camera.GET("/updateSnapshotUrl/:cid", cameraController.UpdateSnapshotUrl)
 
-		camera.POST("/alltask", cameraTaskController.FindTasksByCameraIds)
-		camera.GET("/task/:cameraId", cameraTaskController.CameraTaskAll)
+		//camera.POST("/alltask", cameraTaskController.FindTasksByCameraIds)
+		//camera.GET("/task/:cameraId", cameraTaskController.CameraTaskAll)
 
-		camera.DELETE("/delTask/:cameraId/:taskId", cameraController.CameraDelTask)
-		camera.POST("/saveTask", cameraController.CameraTaskSave)
-		camera.GET("/getRulesByCameraAndTask", cameraTaskArgsController.FindByCameraAndTask)
+		//camera.DELETE("/delTask/:cameraId/:taskId", cameraController.CameraDelTask)
+		//camera.POST("/saveTask", cameraController.CameraTaskSave)
+		//camera.GET("/getRulesByCameraAndTask", cameraTaskArgsController.FindByCameraAndTask)
 		camera.GET("/getCamerasByRunType", cameraController.GetCamerasByRunType)
 		camera.POST("/updateRunEnable", cameraController.UpdateRunEnable)
 		camera.POST("/changeRunType", cameraController.ChangeRunType)
@@ -123,26 +125,42 @@
 
 		camera.POST("/ptzControl", ptzController.Move)
 		camera.GET("/statisticRunInfo", cameraController.StatisticRunInfo)
-		camera.POST("/pasteRules", cameraTaskController.PasteRules)
+		//camera.POST("/pasteRules", cameraTaskController.PasteRules)
 	}
 
-	cameraTaskArgsApi := r.Group(urlPrefix + "/cameraTaskArgs")
+	rtcApi := r.Group(urlPrefix + "/template")
 	{
-		cameraTaskArgsApi.GET("/deleteByGroup", cameraTaskArgsController.DeleteByGroup)
-		cameraTaskArgsApi.POST("/getLinkRulesByCameraIds", cameraTaskArgsController.GetLinkRulesByCameraIds)
-		cameraTaskArgsApi.POST("/saveLinkRulesByGroup", cameraTaskArgsController.SaveLinkRulesByGroup)
-		cameraTaskArgsApi.POST("/updateDefenceStateByGroup", cameraTaskArgsController.UpdateDefenceStateByGroup)
-
-		cameraTaskArgsApi.POST("/ruleApply2All", cameraTaskArgsController.RuleApply2All)
+		rtcApi.POST("/rule/save", rtc.Save)
+		rtcApi.GET("/rule/:id", rtc.Show)
+		rtcApi.DELETE("/rule/:id", rtc.Delete)
+		rtcApi.GET("/rule", rtc.FindAll)
 	}
-
-	cameraTaskApi := r.Group(urlPrefix + "/cameraTask")
+	cameraRuleApi :=r.Group(urlPrefix+"/camera/rule")
 	{
-		cameraTaskApi.POST("/saveIsDataTrans", cameraTaskController.SaveIsDataTrans)
-		cameraTaskApi.POST("/saveAlarmLevelByGroup", cameraTaskController.SaveAlarmLevelByGroup)
-		cameraTaskApi.POST("/updateCameraTaskStatus", cameraTaskController.UpdateCameraTaskStatus)
-		cameraTaskApi.POST("/addTask", cameraTaskController.AddTask)
+		cameraRuleApi.GET("/:cameraId", cameraRuleController.FindByCameraId)
+		cameraRuleApi.GET("/deleteByGroup",cameraRuleController.DeleteByGroup)
+		cameraRuleApi.POST("/getLinkRulesByCameraIds",cameraRuleController.GetLinkRulesByCameraIds)
+		cameraRuleApi.POST("/save", cameraRuleController.Save)
+		cameraRuleApi.POST("/saveLinkRulesByGroup",cameraRuleController.SaveLinkRulesByGroup)
 	}
+
+	//cameraTaskArgsApi := r.Group(urlPrefix + "/cameraTaskArgs")
+	//{
+	//	cameraTaskArgsApi.GET("/deleteByGroup", cameraTaskArgsController.DeleteByGroup)
+	//	cameraTaskArgsApi.POST("/getLinkRulesByCameraIds", cameraTaskArgsController.GetLinkRulesByCameraIds)
+	//	cameraTaskArgsApi.POST("/saveLinkRulesByGroup", cameraTaskArgsController.SaveLinkRulesByGroup)
+	//	cameraTaskArgsApi.POST("/updateDefenceStateByGroup", cameraTaskArgsController.UpdateDefenceStateByGroup)
+	//
+	//	cameraTaskArgsApi.POST("/ruleApply2All", cameraTaskArgsController.RuleApply2All)
+	//}
+
+	//cameraTaskApi := r.Group(urlPrefix + "/cameraTask")
+	//{
+	//	cameraTaskApi.POST("/saveIsDataTrans", cameraTaskController.SaveIsDataTrans)
+	//	cameraTaskApi.POST("/saveAlarmLevelByGroup", cameraTaskController.SaveAlarmLevelByGroup)
+	//	cameraTaskApi.POST("/updateCameraTaskStatus", cameraTaskController.UpdateCameraTaskStatus)
+	//	cameraTaskApi.POST("/addTask", cameraTaskController.AddTask)
+	//}
 
 	polygon := r.Group(urlPrefix + "/polygon")
 	{
@@ -156,19 +174,19 @@
 	// 浠诲姟绠$悊
 	task := r.Group(urlPrefix + "/task")
 	{
-		task.GET("/findAll", taskController.FindAll)
+		//task.GET("/findAll", taskController.FindAll)
 		task.GET("/aggregateTaskList", taskController.AggregateTaskList)
-		task.POST("/addTask", taskController.AddTask)
-		task.POST("/updateTaskStatus", taskController.UpdateTaskStatus)
-		task.GET("/delete", taskController.DeleteTask)
-		task.POST("/addTaskSdk", taskController.AddTaskSdk)
-		task.GET("/delTaskSdk", taskController.DeleteTaskSdk)
-		task.POST("/updateTaskName", taskController.UpdateTaskName)
-		task.GET("/getRulesByTaskSdk", taskController.GetRulesByTaskSdk)
-		task.POST("/deleteTaskSdkRule", taskController.DeleteTaskSdkRule)
-		task.POST("/saveTaskSdkRule", taskController.SaveTaskSdkRule)
-
-		task.GET("/statisticTaskCamera", taskController.StatisticTaskCamera)
+		//task.POST("/addTask", taskController.AddTask)
+		//task.POST("/updateTaskStatus", taskController.UpdateTaskStatus)
+		//task.GET("/delete", taskController.DeleteTask)
+		//task.POST("/addTaskSdk", taskController.AddTaskSdk)
+		//task.GET("/delTaskSdk", taskController.DeleteTaskSdk)
+		//task.POST("/updateTaskName", taskController.UpdateTaskName)
+		//task.GET("/getRulesByTaskSdk", taskController.GetRulesByTaskSdk)
+		//task.POST("/deleteTaskSdkRule", taskController.DeleteTaskSdkRule)
+		//task.POST("/saveTaskSdkRule", taskController.SaveTaskSdkRule)
+		//
+		//task.GET("/statisticTaskCamera", taskController.StatisticTaskCamera)
 	}
 
 	// 妫�绱� 鏌ヨ 鑺傜偣鎿嶄綔
diff --git a/vo/cameraRule.go b/vo/cameraRule.go
new file mode 100644
index 0000000..b2ce8ee
--- /dev/null
+++ b/vo/cameraRule.go
@@ -0,0 +1,56 @@
+package vo
+
+//鐢ㄤ簬鎺ユ敹澶氫釜鎽勫儚鏈虹殑id锛屼互閫楀彿闅斿紑
+type MultiCamera struct {
+	CameraIds 			[]string 							`json:"cameraIds"`
+}
+
+type GroupAlarmLevelVo struct {
+	GroupId    			string 								`json:"group_id" binding:"required"`
+	AlarmLevel 			int    								`json:"alarm_level"`
+}
+
+type CFInfo struct {
+	Id      			string 								`json:"id"`
+	Name    			string 								`json:"name"`
+	RunType 			int    								`json:"run_type"`
+}
+
+type CameraSInfo struct {
+	CFInfo
+	RunServerName 		string 								`json:"runServerName"`
+}
+
+type CameraAndRules struct {
+	CameraInfo    		CameraSInfo  						`json:"cameraInfo"`
+	AllGroupRules 		[]GroupRuleVo 						`json:"rules"`
+}
+
+type GroupRuleVo struct {
+	CameraIds 			[]string 							`json:"cameraIds"` //宸︿晶閫変腑鐨勬憚鍍忔満,鍙互鏄涓�
+	Id    				string                      		`json:"id" example:"缁勮鍒欑殑id"`
+
+	GroupText  			string                      		`json:"group_text" binding:"required"`
+	AlarmLevel 			int                         		`json:"alarm_level"`
+	Rules      			[]CameraRuleBase 					`json:"rules" binding:"required"`
+	SetType    			string                      		`json:"set_type"`
+
+	TemplateId 			string                      		`json:"template_id"`
+	TimeRuleId 			string  							`json:"time_rule_id"`  //鏃堕棿娈�
+	SceneName 			string								`json:"scene_name" binding:"required"` //鍦烘櫙鍚嶇О锛屼粠妯℃澘鏉ワ紝淇敼鍗宠嚜瀹氫箟
+	Desc 				string 								`json:"desc"` //鍦烘櫙鎻忚堪
+	Enable 				bool 								`json:"enable"`
+}
+
+type CameraRuleBase struct {
+	CameraId     		string 								`json:"camera_id"`           //鎽勫儚鏈篿d
+	PolygonId    		string 								`json:"polygon_id"`         //澶氳竟褰d
+	SdkId        		string 								`json:"sdk_id"`               //绠楁硶id
+	SdkArgAlias  		string 								`json:"sdk_arg_alias"` //绠楁硶鍙傛暟鍒悕
+	Operator     		string 								`json:"operator"`           //璁$畻鏂瑰紡=,>,>=绛夌瓑
+	OperatorType 		string 								`json:"operator_type"` //璁$畻鐨勫�肩被鍨�
+	SdkArgValue  		string 								`json:"sdk_arg_value"` //绠楁硶鍙傛暟鍊艰缃�
+	Sort         		int    								`json:"sort"`                   //鎺掑簭
+	RuleWithPre  		string 								`json:"rule_with_pre"` //涓庝笂涓�鏉¤褰曠殑閫昏緫杩愮畻瑙勫垯锛�&&,||锛�
+	GroupId      		string 								`json:"group_id"`             //鍒嗙粍id
+}
\ No newline at end of file

--
Gitblit v1.8.0