package controllers import ( "bytes" "encoding/json" "strconv" "vamicro/appcenter-service/models" "vamicro/appcenter-service/service" "vamicro/appcenter-service/vo" "basic.com/pubsub/protomsg.git" "basic.com/valib/bhomeclient.git" "basic.com/valib/logger.git" ) type SdkController struct { } // @Summary 算法注册 // @Description 算法注册 // @Accept json // @Produce json // @Tags sdk // @Param reqMap body vo.SdkVo 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/sdk/register [POST] func (sc SdkController) Register(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var reqBody vo.SdkRegisterVo c.BindJSON(&reqBody) if reqBody.Id == "" || reqBody.SdkType == "" || reqBody.SdkName == "" || reqBody.Icon == "" { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } logger.Debug("sdk register paramBody:", reqBody) sv := service.NewSdkService(h.Bk) if sv.Register(&reqBody) { return &bhomeclient.Reply{Success: true, Msg: "算法注册成功"} } else { return &bhomeclient.Reply{Success: false, Msg: "注册失败"} } } // @Summary 查找所有算法 // @Description 查找所有算法 // @Produce json // @Tags sdk // @Param sdkName query string false "可选参数" // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法列表",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"[]",success:false}" // @Router /data/api-v/sdk/findAllSdk [GET] func (sc SdkController) FindAllSdk(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { sdkName := c.Query("sdkName") insStr := c.Query("installed") //如果未传此参数,则表示查所有 userId := c.Header("Login_user_id") ok := false if insStr != "" { ok = true } logger.Debugf("FindAllSdk sdkName=%v, insStr=%v, ok=%v, userId=%v", sdkName, insStr, ok, userId) installed, _ := strconv.ParseBool(insStr) sdks := service.GetSdkList(sdkName, insStr, userId) //本机已安装的算法 if ok && !installed { //传了installed参数 nSdks := make([]service.SdkInsOrUpgrade, 0) for _, s := range sdks { if !s.Installed { nSdks = append(nSdks, s) } } return &bhomeclient.Reply{Success: true, Data: nSdks} } else { return &bhomeclient.Reply{Success: true, Data: sdks} } } // @Summary 根据id获取算法信息 // @Description 根据id获取算法信息 // @Produce json // @Tags sdk // @Param id 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/sdk/getById [GET] func (sc SdkController) GetById(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var sdk models.Sdk id := c.Query("id") if id == "" { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } rows, err := sdk.SelectById(id) if err != nil || rows == 0 { return &bhomeclient.Reply{Success: false, Msg: "记录不存在"} } var sdkVo = vo.SdkVo{} sdkVo.Sdk = sdk sdkVo.Args = sdk.GetSdkArgs(id, models.SCOPE_CAMERARULE) return &bhomeclient.Reply{Success: true, Data: sdkVo} } // @Summary 根据taskId获取算法信息 // @Description 根据taskId获取算法信息 // @Produce json // @Tags sdk // @Param taskId query string true "taskId,必填" // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法信息",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}" // @Router /data/api-v/sdk/findByTaskId [GET] func (sc SdkController) FindByTaskId(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { taskId := c.Query("taskId") if taskId == "" { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var sdk models.Sdk sdks, err := sdk.FindByTaskId(taskId) if err != nil { return &bhomeclient.Reply{Success: false, Msg: "查询失败"} } var sdkVoArr []vo.SdkVo for _, sdk := range sdks { sdkVo := vo.SdkVo{} sdkVo.Sdk = sdk sdkVo.Args = sdk.GetSdkArgs(sdk.Id, models.SCOPE_CAMERARULE) sdkVoArr = append(sdkVoArr, sdkVo) } if err != nil { return &bhomeclient.Reply{Success: false, Msg: "记录不存在"} } else { return &bhomeclient.Reply{Success: true, Data: sdkVoArr} } } // @Summary 获取所有算法通道数量设置 // @Description 获取所有算法通道数量设置 // @Produce json // @Tags sdk // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}" // @Router /data/api-v/sdk/getAllSdkChanSet [GET] func (sc SdkController) GetAllSdkChanSet(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var scs models.SdkChanSet list, err := scs.FindAll() if err != nil { return &bhomeclient.Reply{Success: false, Msg: "内部错误"} } else { return &bhomeclient.Reply{Success: true, Data: list} } } type SdkChanUpdateArg struct { SdkType string `json:"sdk_type" binding:"required"` ChanNum int `json:"chan_num" binding:"required"` } // @Summary 更新算法通道数量设置 // @Description 更新算法通道数量设置 // @Produce json // @Tags sdk // @Param reqBody body controllers.SdkChanUpdateArg 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/sdk/updateSdkChanSet [POST] func (sc SdkController) UpdateSdkChanSet(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var reqBody SdkChanUpdateArg err := c.BindJSON(&reqBody) if err != nil { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var scs = models.SdkChanSet{ SdkType: reqBody.SdkType, ChanNum: reqBody.ChanNum, } b, _ := scs.Update() if b { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_SdkChanSet, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish("sdk-service", pb) return &bhomeclient.Reply{Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{Success: false, Msg: "更新失败"} } } // @Summary 更新算法默认场景参数 // @Description 更新算法默认场景参数 // @Produce json // @Tags sdk // @Param reqBody body vo.SdkArgDefault 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/sdk/updateSdkArgConfig [POST] func (sc SdkController) UpdateSdkArgConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var reqBody vo.SdkArgDefault err := c.BindJSON(&reqBody) if err != nil { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var sdk models.Sdk rows, err := sdk.SelectById(reqBody.SdkId) if err != nil || rows == 0 { return &bhomeclient.Reply{Success: false, Msg: "算法id不存在"} } bf := bytes.NewBuffer([]byte{}) jsonEncoder := json.NewEncoder(bf) jsonEncoder.SetEscapeHTML(false) jsonEncoder.Encode(reqBody.DefArgs) sdk.ArgDef = bf.String() b, err := sdk.Update() if err != nil { return &bhomeclient.Reply{Success: false, Msg: err.Error()} } if b { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Sdk, Action: protomsg.DbAction_Update, } pb, _ := json.Marshal(pMsg) h.Bk.Publish("sdk-service", pb) return &bhomeclient.Reply{Success: true, Msg: "更新成功"} } else { return &bhomeclient.Reply{Success: false, Msg: "更新失败"} } } // @Summary 算法安装包上传(分块检查) // @Description 算法安装包上传(分块检查) // @Accept multipart/form-data // @Produce json // @Tags 算法 // @Param chunkNumber formData int true "当前是第几个分块" // @Param chunkSize formData int true "每一块的大小" // @Param currentChunkSize formData int true "当前块的大小" // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Param relativePath formData string true "文件在客户端电脑的路径" // @Param totalChunks formData int true "文件总块数" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/upload [get] func (sc SdkController) Upload(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { chunkNumber, e1 := strconv.Atoi(c.Query("chunkNumber")) chunkSize, e2 := strconv.Atoi(c.Query("chunkSize")) currentChunkSize, e3 := strconv.Atoi(c.Query("currentChunkSize")) identifier := c.Query("identifier") filename := c.Query("filename") relativePath := c.Query("relativePath") totalChunks, e5 := strconv.Atoi(c.Query("totalChunks")) if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e5 != nil { return &bhomeclient.Reply{Msg: "参数有误"} } userId := c.Header("Login_user_id") var arg = service.FileChunkCheckVo{ UserId: userId, FileName: filename, Identifier: identifier, RelativePath: relativePath, TotalChunks: totalChunks, ChunkNumber: chunkNumber, ChunkSize: chunkSize, CurrentChunkSize: currentChunkSize, } var sv service.SysService if b := sv.CheckUpdateFile(&arg); b { //c.String(http.StatusOK,"found") return &bhomeclient.Reply{Success: true, Data: "found"} } else { //c.String(http.StatusNoContent,"") return &bhomeclient.Reply{Success: true, Data: ""} } } // @Security ApiKeyAuth // @Summary 算法安装包上传 // @Description 算法安装包上传 // @Accept multipart/form-data // @Produce json // @Tags 算法 // @Param chunkNumber formData int true "当前是第几个分块" // @Param chunkSize formData int true "每一块的大小" // @Param currentChunkSize formData int true "当前块的大小" // @Param totalSize formData string true "文件总大小" // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Param relativePath formData string true "文件在客户端电脑的路径" // @Param totalChunks formData int true "文件总块数" // @Param file formData file true "文件分片内容" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/upload [post] func (sc SdkController) UploadPack(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { chunkNumber, e1 := strconv.Atoi(c.PostForm("chunkNumber")) chunkSize, e2 := strconv.Atoi(c.PostForm("chunkSize")) currentChunkSize, e3 := strconv.Atoi(c.PostForm("currentChunkSize")) totalSize, e4 := strconv.ParseInt(c.PostForm("totalSize"), 10, 64) identifier := c.PostForm("identifier") filename := c.PostForm("filename") relativePath := c.PostForm("relativePath") totalChunks, e5 := strconv.Atoi(c.PostForm("totalChunks")) file, e6 := c.FormFile() //file, header, e6 := c.Request.FormFile("file") if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e4 != nil || e5 != nil || e6 != nil { return &bhomeclient.Reply{Msg: "参数有误"} } userId := c.Header("Login_user_id") var arg = service.FileUploadVo{ UserId: userId, FileName: filename, Identifier: identifier, RelativePath: relativePath, TotalSize: totalSize, TotalChunks: totalChunks, ChunkNumber: chunkNumber, ChunkSize: chunkSize, CurrentChunkSize: currentChunkSize, File: file, //Header: header, } var sv service.SysService if b, _, msg := sv.PatchUpload(&arg); b { //if isComplete { //上传完毕需要自动触发安装 // var sv service.SdkInstallService // if b,err := sv.SdkInstall(identifier, filename);b { // util.ResponseFormat(c,&code.Code{http.StatusOK, true, "算法安装成功"},"算法安装成功") // return // } else { // util.ResponseFormat(c,&code.Code{http.StatusBadRequest, false, "算法安装失败"},err.Error()) // return // } //} return &bhomeclient.Reply{Success: true, Msg: "上传完成"} } else { return &bhomeclient.Reply{Msg: msg} } } // @Security ApiKeyAuth // @Summary 上传完成获取安装信息 // @Description 上传完成获取安装信息 // @Produce json // @Tags 算法 // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/showInstallInfo [post] func (sc SdkController) ShowInstallInfo(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { identifier := c.Query("identifier") filename := c.Query("filename") logger.Debug("showInstallInfo identifier:", identifier, "filename:", filename) if identifier == "" || filename == "" { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var sv service.SdkInstallService b, d, err := sv.ShowInstallInfo(identifier, filename) if b { return &bhomeclient.Reply{Success: true, Data: d} } else { return &bhomeclient.Reply{Msg: err.Error()} } } // @Security ApiKeyAuth // @Summary 上传完成开始安装 // @Description 上传完成开始安装 // @Produce json // @Tags 算法 // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/install [post] func (sc SdkController) Install(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { identifier := c.Query("identifier") filename := c.Query("filename") logger.Debug("showInstallInfo identifier:", identifier, "filename:", filename) if identifier == "" || filename == "" { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var sv service.SdkInstallService if b, err := sv.PackInstall(identifier, filename, h); b { return &bhomeclient.Reply{Success: true, Msg: "安装成功"} } else { return &bhomeclient.Reply{Msg: err.Error()} } } // @Security ApiKeyAuth // @Summary 卸载算法 // @Description 卸载算法 // @Produce json // @Tags 算法 // @Param reqBody body controllers.DelSdk true "卸载参数" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/unInstall [post] func (sc SdkController) UnInstall(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { var reqBody DelSdk err := c.BindJSON(&reqBody) if err != nil { return &bhomeclient.Reply{Success: false, Msg: "参数有误"} } var sdkE models.Sdk if sdkE.DeleteById(reqBody.SdkId) { pMsg := protomsg.DbChangeMessage{ Table: protomsg.TableChanged_T_Sdk, Action: protomsg.DbAction_Delete, } pb, _ := json.Marshal(pMsg) h.Bk.Publish(service.ProcName, pb) return &bhomeclient.Reply{Success: true, Msg: "卸载成功"} } else { return &bhomeclient.Reply{Success: false, Msg: "卸载失败"} } } // @Security ApiKeyAuth // @Summary 从商城下载或升级算法 // @Description 从商城下载或升级算法 // @Produce json // @Tags 算法 // @Param path query string true "算法id" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/sdkDownload [get] func (sc SdkController) SdkDownLoad(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { id := c.Query("path") if id == "" { return &bhomeclient.Reply{Msg: "下载算法参数有误"} } if service.IsInstalling(id) { return &bhomeclient.Reply{Success: true, Msg: "安装中,请稍候..."} } if b, err := service.DownloadOrUpgrade(id, h); b { return &bhomeclient.Reply{Success: true, Msg: "算法安装成功"} } else { return &bhomeclient.Reply{Msg: err.Error()} } } // @Security ApiKeyAuth // @Summary 应用中心中未购买的算法列表 // @Description 应用中心中未购买的算法列表 // @Produce json // @Tags 算法 // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/buyList [get] func (sc SdkController) BuyList(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { sdkName := c.Query("sdkName") logger.Debug("BuyList sdkName:", sdkName) var sv service.SdkInstallService list := sv.GetBuyList(sdkName) if list == nil { list = make([]service.SdkWithArg, 0) } return &bhomeclient.Reply{Success: true, Data: list} } // @Security ApiKeyAuth // @Summary 使用激活码激活安装算法 // @Description 使用激活码激活安装算法 // @Produce json // @Tags 算法 // @Param code query string true "激活码" // @Param sdkId query string true "算法id" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/active [get] func (sc SdkController) Active(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { cod := c.Query("code") sdkId := c.Query("sdkId") if sdkId == "" { return &bhomeclient.Reply{Msg: "算法id不能为空"} } var sv service.SdkInstallService d, err := sv.Active(cod, sdkId) if err == nil { // 激活成功 var sdk models.Sdk if err := sdk.UpdateCode(sdkId, cod); err != nil { return &bhomeclient.Reply{Msg: err.Error()} } return &bhomeclient.Reply{Success: true, Data: d} } else { return &bhomeclient.Reply{Msg: err.Error()} } } type DelSdk struct { SdkId string `json:"sdkId" binding:"required"` }