Browse Source

fix:指标、图库的缩略图生成接口调整

Roc 8 months ago
parent
commit
fed13ad35a

+ 8 - 88
controllers/data_manage/chart_info.go

@@ -4263,13 +4263,13 @@ func (this *ChartInfoController) ForumDelete() {
 	br.Msg = "操作成功"
 }
 
-// ChartInfoImgSetByBase64
+// ChartInfoImgSetBySvg
 // @Title 图表图片上传
 // @Param   Img   query   string  true       "图片"
 // @Param   ChartInfoId   query   int  true       "图表ID"
 // @Success 200 {object} models.ResourceResp
-// @router /chart_info/image/set_by_base64 [post]
-func (this *ChartInfoController) ChartInfoImgSetByBase64() {
+// @router /chart_info/image/set_by_svg [post]
+func (this *ChartInfoController) ChartInfoImgSetBySvg() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -4284,96 +4284,16 @@ func (this *ChartInfoController) ChartInfoImgSetByBase64() {
 	chartInfoId, _ := this.GetInt("ChartInfoId", 0)
 	if chartInfoId <= 0 {
 		br.Msg = "图片参数错误"
-		br.ErrMsg = "图片参数错误,Img Is Empty"
+		br.ErrMsg = "图片参数错误,ChartInfoId Is Empty"
 		return
 	}
 	resp := new(models.ResourceResp)
 
-	uploadDir := "static/images/"
-	if !utils.FileIsExist(uploadDir) {
-		err := os.MkdirAll(uploadDir, utils.DIR_MOD)
-		if err != nil {
-			br.Msg = "图表保存失败"
-			br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
-			return
-		}
-	}
-
-	//var saveToOssPath string
-	randStr := utils.GetRandStringNoSpecialChar(28)
-	var fileName, outFileName string
-	fileName = randStr + ".txt"
-	fileName = uploadDir + fileName
-	err := utils.SaveToFile(imgData, fileName)
-	if err != nil {
-		br.Msg = "图片保存失败"
-		br.ErrMsg = "图片保存失败,Err:" + err.Error()
-		return
-	}
-
-	// 删除临时存储的svg文件
-	defer func() {
-		err = os.Remove(fileName)
-		if err != nil {
-			utils.FileLog.Info("删除临时存储的svg文件失败, err: " + err.Error())
-		}
-	}()
-	outFileName = randStr + ".png"
-
-	doneChannel := make(chan bool, 1)
-	errorChannel := make(chan error, 1)
-
-	cmd := exec.Command("highcharts-export-server", "--infile", fileName, "--constr", "Chart", "--scale", "2", "--workers", "10", "--workLimit", "3", "--outfile", outFileName)
-
-	go func() {
-		output, err := cmd.CombinedOutput()
-		if err != nil {
-			utils.FileLog.Info("execute command failed, output: , error: \n" + string(output) + err.Error())
-			errorChannel <- err
-			return
-		}
-		doneChannel <- true
-	}()
-	defer func() {
-		_ = os.Remove(outFileName)
-		if err != nil {
-			utils.FileLog.Info("删除生产的图片文件失败, err: " + err.Error())
-		}
-	}()
-
-	select {
-	case <-time.After(30 * time.Second):
-		utils.FileLog.Info("执行超过30秒 杀死超时进程")
-		e := cmd.Process.Kill()
-		if e != nil {
-			fmt.Println("cmd kill err: ", e.Error())
-			utils.FileLog.Info(fmt.Sprintf("cmd kill err: %s", e.Error()))
-			br.Msg = "图片生成失败"
-			br.ErrMsg = "图片生成失败, 执行超时" + e.Error()
-			return
-		}
-		fmt.Println("timeout kill process")
-	case <-doneChannel:
-		fmt.Println("done")
-	case err := <-errorChannel:
-		br.Msg = "文件上传失败"
-		br.ErrMsg = fmt.Sprintf("execute command failure err: %s", err.Error())
-		fmt.Println("execute command failure err:" + err.Error())
-		return
-	}
-
-	//上传到阿里云 和 minio
-	resourceUrl := ``
-	ossClient := services.NewOssClient()
-	if ossClient == nil {
-		br.Msg = "上传失败"
-		br.ErrMsg = "初始化OSS服务失败"
-		return
-	}
-	resourceUrl, err = ossClient.UploadFile(outFileName, outFileName, "")
+	// 通过svg图片生成图片资源地址
+	resourceUrl, err, errMsg := services.GetResourceUrlBySvgImg(imgData)
 	if err != nil {
-		br.Msg = "文件上传失败"
-		br.ErrMsg = "文件上传失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
 		return
 	}
 

+ 77 - 0
controllers/data_manage/edb_info.go

@@ -13,6 +13,7 @@ import (
 	"eta/eta_api/models/data_manage/response"
 	"eta/eta_api/models/mgo"
 	"eta/eta_api/models/system"
+	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/data_manage_permission"
@@ -6411,3 +6412,79 @@ func (this *EdbInfoController) SmmEdbInfoBatchAdd() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// ChartImageSetBySvg
+// @Title 设置指标的图表图片
+// @Description 设置指标的图表图片接口
+// @Param	request	body data_manage.SetChartInfoImageReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_info/image/set_by_svg [post]
+func (this *EdbInfoController) ChartImageSetBySvg() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	imgData := this.GetString("Img")
+	if imgData == "" {
+		br.Msg = "图片参数错误"
+		br.ErrMsg = "图片参数错误,Img Is Empty"
+		return
+	}
+	edbInfoId, _ := this.GetInt("EdbInfoId", 0)
+	if edbInfoId <= 0 {
+		br.Msg = "指标参数错误"
+		br.ErrMsg = "指标参数错误,EdbInfoId Is Empty"
+		return
+	}
+
+	// 通过svg图片生成图片资源地址
+	resourceUrl, err, errMsg := services.GetResourceUrlBySvgImg(imgData)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	if edbInfoId <= 0 || resourceUrl == "" {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "保存成功"
+		return
+	}
+
+	edbInfo, e := data_manage.GetEdbInfoById(edbInfoId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "找不到该指标"
+			return
+		}
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取指标失败, Err:" + e.Error()
+		return
+	}
+	edbInfo.ChartImage = resourceUrl
+	if e = edbInfo.Update([]string{"ChartImage"}); e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "更新指标缩略图失败, Err:" + e.Error()
+		return
+	}
+
+	// 修改es数据
+	go data.AddOrEditEdbInfoToEs(edbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}

+ 8 - 88
controllers/data_manage/future_good/future_good_chart_info.go

@@ -3220,13 +3220,13 @@ func (this *FutureGoodChartInfoController) BaseInfoEdit() {
 	br.IsAddLog = true
 }
 
-// ChartInfoImgSetByBase64
+// ChartInfoImgSetBySvg
 // @Title 图表图片上传
 // @Param   Img   query   string  true       "图片"
 // @Param   ChartInfoId   query   int  true       "图表ID"
 // @Success 200 {object} models.ResourceResp
-// @router /chart_info/image/set_by_base64 [post]
-func (this *FutureGoodChartInfoController) ChartInfoImgSetByBase64() {
+// @router /chart_info/image/set_by_svg [post]
+func (this *FutureGoodChartInfoController) ChartInfoImgSetBySvg() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -3241,96 +3241,16 @@ func (this *FutureGoodChartInfoController) ChartInfoImgSetByBase64() {
 	chartInfoId, _ := this.GetInt("ChartInfoId", 0)
 	if chartInfoId <= 0 {
 		br.Msg = "图片参数错误"
-		br.ErrMsg = "图片参数错误,Img Is Empty"
+		br.ErrMsg = "图片参数错误,ChartInfoId Is Empty"
 		return
 	}
 	resp := new(models.ResourceResp)
 
-	uploadDir := "static/images/"
-	if !utils.FileIsExist(uploadDir) {
-		err := os.MkdirAll(uploadDir, utils.DIR_MOD)
-		if err != nil {
-			br.Msg = "图表保存失败"
-			br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
-			return
-		}
-	}
-
-	//var saveToOssPath string
-	randStr := utils.GetRandStringNoSpecialChar(28)
-	var fileName, outFileName string
-	fileName = randStr + ".txt"
-	fileName = uploadDir + fileName
-	err := utils.SaveToFile(imgData, fileName)
+	// 通过svg图片生成图片资源地址
+	resourceUrl, err, errMsg := services.GetResourceUrlBySvgImg(imgData)
 	if err != nil {
-		br.Msg = "图片保存失败"
-		br.ErrMsg = "图片保存失败,Err:" + err.Error()
-		return
-	}
-
-	// 删除临时存储的svg文件
-	defer func() {
-		err = os.Remove(fileName)
-		if err != nil {
-			utils.FileLog.Info("删除临时存储的svg文件失败, err: " + err.Error())
-		}
-	}()
-	outFileName = randStr + ".png"
-
-	doneChannel := make(chan bool, 1)
-	errorChannel := make(chan error, 1)
-
-	cmd := exec.Command("highcharts-export-server", "--infile", fileName, "--constr", "Chart", "--scale", "2", "--workers", "10", "--workLimit", "3", "--outfile", outFileName)
-
-	go func() {
-		output, err := cmd.CombinedOutput()
-		if err != nil {
-			utils.FileLog.Info("execute command failed, output: , error: \n" + string(output) + err.Error())
-			errorChannel <- err
-			return
-		}
-		doneChannel <- true
-	}()
-	defer func() {
-		_ = os.Remove(outFileName)
-		if err != nil {
-			utils.FileLog.Info("删除生产的图片文件失败, err: " + err.Error())
-		}
-	}()
-
-	select {
-	case <-time.After(30 * time.Second):
-		utils.FileLog.Info("执行超过30秒 杀死超时进程")
-		e := cmd.Process.Kill()
-		if e != nil {
-			fmt.Println("cmd kill err: ", e.Error())
-			utils.FileLog.Info(fmt.Sprintf("cmd kill err: %s", e.Error()))
-			br.Msg = "图片生成失败"
-			br.ErrMsg = "图片生成失败, 执行超时" + e.Error()
-			return
-		}
-		fmt.Println("timeout kill process")
-	case <-doneChannel:
-		fmt.Println("done")
-	case err := <-errorChannel:
-		br.Msg = "文件上传失败"
-		br.ErrMsg = fmt.Sprintf("execute command failure err: %s", err.Error())
-		fmt.Println("execute command failure err:" + err.Error())
-		return
-	}
-
-	//上传到阿里云 和 minio
-	resourceUrl := ``
-	ossClient := services.NewOssClient()
-	if ossClient == nil {
-		br.Msg = "上传失败"
-		br.ErrMsg = "初始化OSS服务失败"
-		return
-	}
-	resourceUrl, err = ossClient.UploadFile(outFileName, outFileName, "")
-	if err != nil {
-		br.Msg = "文件上传失败"
-		br.ErrMsg = "文件上传失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
 		return
 	}
 

+ 78 - 0
controllers/data_manage/predict_edb_info.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/models/data_manage/response"
+	"eta/eta_api/services"
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/elastic"
@@ -2095,3 +2096,80 @@ func (this *PredictEdbInfoController) ClassifyEdbInfoItems() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// ChartImageSetBySvg
+// @Title 设置指标的图表图片
+// @Description 设置指标的图表图片接口
+// @Param	request	body data_manage.SetChartInfoImageReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /predict_edb_info/image/set_by_svg [post]
+func (this *PredictEdbInfoController) ChartImageSetBySvg() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	imgData := this.GetString("Img")
+	if imgData == "" {
+		br.Msg = "图片参数错误"
+		br.ErrMsg = "图片参数错误,Img Is Empty"
+		return
+	}
+	edbInfoId, _ := this.GetInt("EdbInfoId", 0)
+	if edbInfoId <= 0 {
+		br.Msg = "指标参数错误"
+		br.ErrMsg = "指标参数错误,EdbInfoId Is Empty"
+		return
+	}
+
+	// 通过svg图片生成图片资源地址
+	resourceUrl, err, errMsg := services.GetResourceUrlBySvgImg(imgData)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	if edbInfoId <= 0 || resourceUrl == "" {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "保存成功"
+		return
+	}
+
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "找不到该指标"
+			br.ErrMsg = "找不到该指标"
+			br.IsSendEmail = false
+		}
+		return
+	}
+
+	edbInfo.ChartImage = resourceUrl
+	err = edbInfo.Update([]string{"ChartImage"})
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+
+	//修改es数据
+	go data.AddOrEditEdbInfoToEs(edbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}

+ 22 - 4
routers/commentsRouter.go

@@ -1305,8 +1305,8 @@ func init() {
 
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/future_good:FutureGoodChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/future_good:FutureGoodChartInfoController"],
         beego.ControllerComments{
-            Method: "ChartInfoImgSetByBase64",
-            Router: `/chart_info/image/set_by_base64`,
+            Method: "ChartInfoImgSetBySvg",
+            Router: `/chart_info/image/set_by_svg`,
             AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
@@ -2421,8 +2421,8 @@ func init() {
 
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
-            Method: "ChartInfoImgSetByBase64",
-            Router: `/chart_info/image/set_by_base64`,
+            Method: "ChartInfoImgSetBySvg",
+            Router: `/chart_info/image/set_by_svg`,
             AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
@@ -3454,6 +3454,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "ChartImageSetBySvg",
+            Router: `/edb_info/image/set_by_svg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "SetEdbDataInsertConfig",
@@ -4813,6 +4822,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbInfoController"],
+        beego.ControllerComments{
+            Method: "ChartImageSetBySvg",
+            Router: `/predict_edb_info/image/set_by_svg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbInfoController"],
         beego.ControllerComments{
             Method: "ClassifyEdbInfoItems",

+ 99 - 0
services/file.go

@@ -8,6 +8,7 @@ import (
 	"io"
 	"mime/multipart"
 	"os"
+	"os/exec"
 	"time"
 )
 
@@ -80,3 +81,101 @@ func saveToFile(fileMulti multipart.File, tofile string) error {
 	io.Copy(f, fileMulti)
 	return nil
 }
+
+// GetResourceUrlBySvgImg
+// @Description: 通过svg图片生成图片资源地址(传到OSS后的地址)
+// @author: Roc
+// @datetime 2024-07-16 10:18:09
+// @param imgData string
+// @return resourceUrl string
+// @return err error
+// @return errMsg string
+func GetResourceUrlBySvgImg(imgData string) (resourceUrl string, err error, errMsg string) {
+	errMsg = "图表保存失败"
+	uploadDir := "static/images/"
+	if !utils.FileIsExist(uploadDir) {
+		err = os.MkdirAll(uploadDir, utils.DIR_MOD)
+		if err != nil {
+			err = errors.New("存储目录创建失败,Err:" + err.Error())
+			return
+		}
+	}
+
+	//var saveToOssPath string
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	var fileName, outFileName string
+	fileName = randStr + ".txt"
+	fileName = uploadDir + fileName
+	err = utils.SaveToFile(imgData, fileName)
+	if err != nil {
+		err = errors.New("图片保存失败,Err:" + err.Error())
+		return
+	}
+
+	// 删除临时存储的svg文件
+	defer func() {
+		err = os.Remove(fileName)
+		if err != nil {
+			utils.FileLog.Info("删除临时存储的svg文件失败, err: " + err.Error())
+		}
+	}()
+	outFileName = randStr + ".png"
+
+	doneChannel := make(chan bool, 1)
+	errorChannel := make(chan error, 1)
+
+	cmd := exec.Command("highcharts-export-server", "--infile", fileName, "--constr", "Chart", "--scale", "2", "--workers", "10", "--workLimit", "3", "--outfile", outFileName)
+
+	go func() {
+		output, err := cmd.CombinedOutput()
+		if err != nil {
+			utils.FileLog.Info("execute command failed, output: , error: \n" + string(output) + err.Error())
+			errorChannel <- err
+			return
+		}
+		doneChannel <- true
+	}()
+	defer func() {
+		_ = os.Remove(outFileName)
+		if err != nil {
+			utils.FileLog.Info("删除生产的图片文件失败, err: " + err.Error())
+		}
+	}()
+
+	select {
+	case <-time.After(30 * time.Second):
+		utils.FileLog.Info("执行超过30秒 杀死超时进程")
+		e := cmd.Process.Kill()
+		if e != nil {
+			fmt.Println("cmd kill err: ", e.Error())
+			utils.FileLog.Info(fmt.Sprintf("cmd kill err: %s", e.Error()))
+			errMsg = "图片生成失败"
+			err = errors.New("图片生成失败, 执行超时" + e.Error())
+			return
+		}
+		fmt.Println("timeout kill process")
+	case <-doneChannel:
+		fmt.Println("done")
+	case e := <-errorChannel:
+		errMsg = "文件上传失败"
+		err = errors.New(fmt.Sprintf("execute command failure err: %s", e.Error()))
+		fmt.Println("execute command failure err:" + e.Error())
+		return
+	}
+
+	//上传到阿里云 和 minio
+	ossClient := NewOssClient()
+	if ossClient == nil {
+		errMsg = "上传失败"
+		err = errors.New("初始化OSS服务失败")
+		return
+	}
+	resourceUrl, err = ossClient.UploadFile(outFileName, outFileName, "")
+	if err != nil {
+		errMsg = "文件上传失败"
+		err = errors.New("文件上传失败,Err:" + err.Error())
+		return
+	}
+
+	return
+}