浏览代码

Merge remote-tracking branch 'origin/eta/1.7.3'

Roc 11 月之前
父节点
当前提交
2b59122bcf
共有 74 个文件被更改,包括 3950 次插入1956 次删除
  1. 10 0
      controllers/base_auth.go
  2. 10 0
      controllers/base_common.go
  3. 7 6
      controllers/data_manage/baiinfo_data.go
  4. 11 79
      controllers/data_manage/chart_classify.go
  5. 239 2
      controllers/data_manage/chart_info.go
  6. 2 2
      controllers/data_manage/chart_theme.go
  7. 11 58
      controllers/data_manage/correlation/correlation_chart_classify.go
  8. 124 4
      controllers/data_manage/correlation/correlation_chart_info.go
  9. 97 3
      controllers/data_manage/cross_variety/chart_info.go
  10. 5 24
      controllers/data_manage/cross_variety/classify.go
  11. 8 2
      controllers/data_manage/cross_variety/tag.go
  12. 14 8
      controllers/data_manage/cross_variety/variety.go
  13. 2 2
      controllers/data_manage/edb_classify.go
  14. 171 9
      controllers/data_manage/edb_info.go
  15. 16 11
      controllers/data_manage/edb_info_calculate.go
  16. 3 3
      controllers/data_manage/excel/custom_analysis_edb.go
  17. 10 10
      controllers/data_manage/excel/excel_info.go
  18. 3 1
      controllers/data_manage/excel/mixed_table.go
  19. 11 56
      controllers/data_manage/future_good/future_good_chart_classify.go
  20. 211 124
      controllers/data_manage/future_good/future_good_chart_info.go
  21. 19 14
      controllers/data_manage/future_good/future_good_edb_info.go
  22. 11 58
      controllers/data_manage/line_equation/line_chart_classify.go
  23. 123 2
      controllers/data_manage/line_equation/line_chart_info.go
  24. 132 49
      controllers/data_manage/line_feature/chart_info.go
  25. 11 58
      controllers/data_manage/line_feature/classify.go
  26. 8 8
      controllers/data_manage/multiple_graph_config.go
  27. 3 5
      controllers/data_manage/mysteel_chemical_data.go
  28. 2 2
      controllers/data_manage/predict_edb_classify.go
  29. 5 5
      controllers/data_manage/predict_edb_info.go
  30. 4 4
      controllers/data_manage/predict_edb_info_calculate.go
  31. 15 14
      controllers/data_manage/sci_data.go
  32. 4 3
      controllers/data_manage/smm_data.go
  33. 1 1
      controllers/data_manage/supply_analysis/variety_edb.go
  34. 32 1
      models/data_manage/base_from_baiinfo_classify.go
  35. 31 0
      models/data_manage/base_from_sci_classify.go
  36. 31 0
      models/data_manage/base_from_smm_classify.go
  37. 67 13
      models/data_manage/chart_classify.go
  38. 114 2
      models/data_manage/chart_info.go
  39. 15 0
      models/data_manage/correlation/request/chart.go
  40. 72 0
      models/data_manage/cross_variety/chart_info_cross_variety.go
  41. 24 0
      models/data_manage/cross_variety/request/chart.go
  42. 67 14
      models/data_manage/edb_classify.go
  43. 14 0
      models/data_manage/edb_info.go
  44. 6 1
      models/data_manage/edb_info_calculate.go
  45. 2 0
      models/data_manage/excel/request/excel_info.go
  46. 8 5
      models/data_manage/future_good/future_good_edb_info.go
  47. 11 0
      models/data_manage/future_good/request/future_good_chart.go
  48. 166 0
      models/data_manage/future_good_chart_info.go
  49. 6 0
      models/data_manage/line_equation/request/line_equation.go
  50. 2 0
      models/data_manage/line_feature/line_feature.go
  51. 6 0
      models/data_manage/line_feature/request/line_feature.go
  52. 39 1
      models/data_manage/mysteel_chemical_classify.go
  53. 63 0
      routers/commentsRouter.go
  54. 39 38
      services/data/base_edb_lib.go
  55. 71 29
      services/data/base_from_baiinfo.go
  56. 68 29
      services/data/base_from_sci.go
  57. 71 30
      services/data/base_from_smm.go
  58. 154 0
      services/data/chart_classify.go
  59. 78 46
      services/data/chart_info.go
  60. 56 38
      services/data/correlation/chart_info.go
  61. 14 19
      services/data/cross_variety/chart.go
  62. 20 4
      services/data/data_manage_permission/data_move.go
  63. 78 26
      services/data/edb_classify.go
  64. 69 20
      services/data/edb_info.go
  65. 2 2
      services/data/edb_info_calculate.go
  66. 2 2
      services/data/excel/custom_analysis_edb.go
  67. 8 914
      services/data/excel/excel_info.go
  68. 2 2
      services/data/excel/mixed_table.go
  69. 932 0
      services/data/excel/time_table.go
  70. 27 19
      services/data/line_equation/chart_info.go
  71. 64 36
      services/data/line_feature/chart_info.go
  72. 71 31
      services/data/mysteel_chemical.go
  73. 39 7
      services/excel/lucky_sheet.go
  74. 6 0
      utils/constants.go

+ 10 - 0
controllers/base_auth.go

@@ -51,6 +51,7 @@ type BaseAuthController struct {
 	web.Controller
 	SysUser *system.Admin
 	Session *system.SysSession
+	Lang    string `description:"当前语言类型,中文:zh;英文:en;默认:zh"`
 }
 
 func (c *BaseAuthController) Prepare() {
@@ -60,6 +61,15 @@ func (c *BaseAuthController) Prepare() {
 	//fmt.Println("Url:", uri)
 	if method != "HEAD" {
 		if method == "POST" || method == "GET" {
+			// 当前语言
+			{
+				lang := c.Ctx.Input.Header("Lang")
+				if lang == "" {
+					lang = utils.ZhLangVersion
+				}
+				c.Lang = lang
+			}
+
 			authorization := c.Ctx.Input.Header("authorization")
 			if authorization == "" {
 				authorization = c.Ctx.Input.Header("Authorization")

+ 10 - 0
controllers/base_common.go

@@ -15,6 +15,7 @@ import (
 
 type BaseCommonController struct {
 	web.Controller
+	Lang string `description:"当前语言类型,中文:zh;英文:en;默认:zh"`
 }
 
 func (c *BaseCommonController) Prepare() {
@@ -25,6 +26,15 @@ func (c *BaseCommonController) Prepare() {
 	} else {
 		requestBody, _ = url.QueryUnescape(string(c.Ctx.Input.RequestBody))
 	}
+	// 当前语言
+	{
+		lang := c.Ctx.Input.Header("Lang")
+		if lang == "" {
+			lang = utils.ZhLangVersion
+		}
+		c.Lang = lang
+	}
+
 	ip := c.Ctx.Input.IP()
 	utils.ApiLog.Info("uri:%s, requestBody:%s, responseBody:%s, ip:%s", c.Ctx.Input.URI(), requestBody, ip)
 }

+ 7 - 6
controllers/data_manage/baiinfo_data.go

@@ -2,15 +2,15 @@ package data_manage
 
 import (
 	"encoding/json"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/tealeg/xlsx"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
 	"strings"
@@ -88,6 +88,7 @@ func (this *EdbInfoController) BaiinfoClassify() {
 		ClassifyId:             0,
 		BaseFromBaiinfoIndexId: 0,
 		ClassifyName:           "未分类",
+		ClassifyNameEn:         "Unclassified",
 		ParentId:               0,
 		Level:                  1,
 		Sort:                   0,
@@ -219,7 +220,7 @@ func (this *EdbInfoController) AddBaiinfoClassify() {
 	req.ClassifyName = strings.Replace(req.ClassifyName, "/t", "", -1)
 
 	//添加指标
-	baiinfoClassifyInfo, err, errMsg := data.AddBaiinfoClassify(req.ClassifyName, req.ParentId, this.SysUser.AdminId, this.SysUser.RealName)
+	baiinfoClassifyInfo, err, errMsg := data.AddBaiinfoClassify(req.ClassifyName, req.ParentId, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -235,7 +236,7 @@ func (this *EdbInfoController) AddBaiinfoClassify() {
 	if baiinfoClassifyInfo.ParentId == 0 {
 		secondClassifyList := []string{"价格", "供应", "需求", "库存"}
 		for _, v := range secondClassifyList {
-			_, _, tmpErrMsg := data.AddBaiinfoClassify(v, baiinfoClassifyInfo.ClassifyId, this.SysUser.AdminId, this.SysUser.RealName)
+			_, _, tmpErrMsg := data.AddBaiinfoClassify(v, baiinfoClassifyInfo.ClassifyId, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 			if tmpErrMsg != `` {
 				go alarm_msg.SendAlarmMsg("SCI原始数据-添加一级分类时,默认添加二级分类失败,一级分类名称:"+req.ClassifyName+",二级分类名称:"+v+", Err:"+tmpErrMsg, 3)
 				return
@@ -284,7 +285,7 @@ func (this *EdbInfoController) EditBaiinfoClassify() {
 		return
 	}
 
-	err, errMsg := data.EditBaiinfoClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
+	err, errMsg := data.EditBaiinfoClassify(req.ClassifyId, req.ClassifyName, this.Lang, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg

+ 11 - 79
controllers/data_manage/chart_classify.go

@@ -10,7 +10,6 @@ import (
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
-	"strconv"
 	"time"
 )
 
@@ -350,52 +349,21 @@ func (this *ChartClassifyController) AddChartClassify() {
 		return
 	}
 
-	count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, req.ParentId, utils.CHART_SOURCE_DEFAULT)
+	// 新增图表分类
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_DEFAULT, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "判断名称是否已存在失败"
-		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "添加分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
-	if count > 0 {
-		br.Msg = "分类名称已存在,请重新输入"
-		br.IsSendEmail = false
-		return
-	}
-	//获取该层级下最大的排序数
-	maxSort, err := data_manage.GetChartClassifyMaxSort(req.ParentId, utils.CHART_SOURCE_DEFAULT)
-
-	classify := new(data_manage.ChartClassify)
-	classify.ParentId = req.ParentId
-	classify.ChartClassifyName = req.ChartClassifyName
-	classify.HasData = 0
-	classify.CreateTime = time.Now()
-	classify.ModifyTime = time.Now()
-	classify.SysUserId = this.SysUser.AdminId
-	classify.SysUserRealName = this.SysUser.RealName
-	classify.Level = req.Level + 1
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	classify.Sort = maxSort + 1
-	classify.Source = utils.CHART_SOURCE_DEFAULT
-
-	classifyId, err := data_manage.AddChartClassify(classify)
-	if err != nil {
-		br.Msg = "保存分类失败"
-		br.ErrMsg = "保存分类失败,Err:" + err.Error()
-		return
-	}
-	classify.ChartClassifyId = int(classifyId)
-
-	// 继承分类权限
-	{
-		go data_manage_permission.InheritParentClassify(5, utils.CHART_SOURCE_DEFAULT, classify.ChartClassifyId, classify.ParentId, classify.ChartClassifyName)
-	}
 
 	br.Ret = 200
 	br.Msg = "保存成功"
 	br.Success = true
 }
 
+// EditChartClassify
 // @Title 修改图表分类
 // @Description 修改图表分类接口
 // @Param	request	body data_manage.EditChartClassifyReq true "type json string"
@@ -426,51 +394,15 @@ func (this *ChartClassifyController) EditChartClassify() {
 		return
 	}
 
-	item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	// 编辑图表分类
+	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_DEFAULT, req.ChartClassifyName, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存失败"
-		br.Msg = "获取分类信息失败,Err:" + err.Error()
-		return
-	}
-	// 已授权分类id
-	permissionClassifyIdList, err := data_manage_permission.GetUserChartClassifyPermissionList(this.SysUser.AdminId, item.ChartClassifyId)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取已授权分类id数据失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
-	haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(item.IsJoinPermission, item.ChartClassifyId, permissionClassifyIdList)
-
-	// 权限校验
-	{
-		button := data.GetChartClassifyOpButton(this.SysUser, item.SysUserId, haveOperaAuth)
-		if !button.OpButton {
-			br.Msg = "无操作权限"
-			br.IsSendEmail = false
-			return
-		}
-	}
-
-	if item.ChartClassifyName != req.ChartClassifyName {
-		count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, utils.CHART_SOURCE_DEFAULT)
-		if err != nil {
-			br.Msg = "判断名称是否已存在失败"
-			br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-			return
-		}
-		if count > 0 {
-			br.Msg = "分类名称已存在,请重新输入"
-			br.IsSendEmail = false
-			return
-		}
 
-		err = data_manage.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_DEFAULT, req.ChartClassifyName)
-		if err != nil {
-			br.Msg = "保存失败"
-			br.ErrMsg = "保存失败,Err:" + err.Error()
-			return
-		}
-	}
 	br.Ret = 200
 	br.Msg = "保存成功"
 	br.Success = true

+ 239 - 2
controllers/data_manage/chart_info.go

@@ -212,7 +212,7 @@ func (this *ChartInfoController) ChartInfoAdd() {
 		return
 	}
 
-	chartInfo, err, errMsg, isSendEmail := data.AddChartInfo(req, sysUser.AdminId, sysUser.RealName)
+	chartInfo, err, errMsg, isSendEmail := data.AddChartInfo(req, sysUser.AdminId, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -293,7 +293,7 @@ func (this *ChartInfoController) ChartInfoEdit() {
 		return
 	}
 
-	chartItem, err, errMsg, isSendEmail := data.EditChartInfo(req, sysUser)
+	chartItem, err, errMsg, isSendEmail := data.EditChartInfo(req, sysUser, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -332,6 +332,7 @@ func (this *ChartInfoController) ChartInfoEdit() {
 	br.IsAddLog = true
 }
 
+// ChartEnInfoEdit
 // @Title 编辑图表英文信息接口
 // @Description 编辑图表英文信息接口
 // @Param	request	body data_manage.EditChartEnInfoReq true "type json string"
@@ -523,6 +524,204 @@ func (this *ChartInfoController) ChartEnInfoEdit() {
 	br.IsAddLog = true
 }
 
+// ChartInfoBaseEdit
+// @Title 编辑图表基础信息接口
+// @Description 编辑图表基础信息接口
+// @Param	request	body data_manage.EditChartEnInfoBaseReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/base/edit [post]
+func (this *ChartInfoController) ChartInfoBaseEdit() {
+	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
+	}
+
+	var req data_manage.EditChartInfoBaseReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+
+	//判断指标名称是否存在
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,请刷新页面"
+			br.ErrMsg = "图表已被删除,请刷新页面"
+			return
+		}
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 判断是否有传入对应的指标配置
+	noEdbInfoType := []int{10}
+	if len(req.ChartEdbInfoList) <= 0 && !utils.InArrayByInt(noEdbInfoType, chartItem.ChartType) {
+		br.Msg = "请选择指标!"
+		return
+	}
+
+	var edbCondition string
+	var edbPars []interface{}
+	for _, v := range req.ChartEdbInfoList {
+		edbInfoId := v.EdbInfoId
+		edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				br.Msg = "图表不存在!"
+				br.ErrMsg = "图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId)
+				return
+			} else {
+				br.Msg = "获取图表信息失败!"
+				br.ErrMsg = "获取图表的指标信息失败,Err:" + err.Error()
+				return
+			}
+		}
+		if edbInfo == nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId)
+			return
+		}
+
+		//判断指标名称是否重复
+		if v.EdbName != "" {
+			edbCondition = ""
+			edbPars = make([]interface{}, 0)
+
+			edbCondition += " AND edb_info_id<>? "
+			edbPars = append(edbPars, edbInfo.EdbInfoId)
+
+			switch this.Lang {
+			case utils.EnLangVersion:
+				edbCondition += " AND edb_name_en =? "
+			default:
+				edbCondition += " AND edb_name =? "
+			}
+
+			edbPars = append(edbPars, v.EdbName)
+
+			edbExist, err := data_manage.GetEdbInfoByCondition(edbCondition, edbPars)
+			if err != nil {
+				if err.Error() != utils.ErrNoRow() {
+					br.Msg = "判断英文指标名称是否存在失败"
+					br.ErrMsg = "判断英文指标名称是否存在失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			if err == nil && edbExist.EdbInfoId > 0 {
+				br.Msg = edbExist.EdbName + ":" + v.EdbName + "指标名称已存在"
+				br.ErrMsg = "指标名称已存在,请重新填写"
+				br.IsSendEmail = false
+				return
+			}
+		}
+	}
+	if req.ChartName != "" || req.ExtraConfig != `` {
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id<>? "
+		pars = append(pars, req.ChartInfoId)
+
+		switch this.Lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? "
+		default:
+			condition += " AND chart_name = ? "
+		}
+
+		pars = append(pars, req.ChartName)
+
+		existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "判断英文图表名称是否存在失败"
+				br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+				return
+			}
+		}
+
+		if err == nil && existItem.ChartInfoId > 0 {
+			br.Msg = existItem.ChartName + ":" + req.ChartName + "图表名称已存在"
+			return
+		}
+	}
+
+	err = data_manage.EditChartBaseInfoAndEdbEnInfo(&req, chartItem, this.Lang)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//edbinfo 修改es信息
+	for _, v := range req.ChartEdbInfoList {
+		edbInfoId := v.EdbInfoId
+		edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				br.Msg = "图表不存在!"
+				br.ErrMsg = "图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoId)
+				return
+			} else {
+				br.Msg = "获取图表信息失败!"
+				br.ErrMsg = "获取图表的指标信息失败,Err:" + err.Error()
+				return
+			}
+		}
+		if edbInfo != nil {
+			go data.AddOrEditEdbInfoToEs(edbInfoId)
+		}
+	}
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑图表英文信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+	//清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}
+
 // @Title 获取最新图表接口
 // @Description 获取最新图表接口
 // @Success 200 {object} data_manage.ChartInfoList
@@ -906,6 +1105,44 @@ func (this *ChartInfoController) ChartInfoDetail() {
 			br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 			return
 		}
+
+		// 指标权限
+		{
+
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+
+			// 分类
+			{
+				classifyIdList := make([]int, 0)
+				for _, v := range edbList {
+					classifyIdList = append(classifyIdList, v.ClassifyId)
+				}
+				classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
+				if tmpErr != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + tmpErr.Error()
+					return
+				}
+				for _, v := range classifyList {
+					classifyMap[v.ClassifyId] = v
+				}
+			}
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+
+			for _, item := range edbList {
+				// 数据权限
+				if currClassify, ok := classifyMap[item.ClassifyId]; ok {
+					item.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(item.IsJoinPermission, currClassify.IsJoinPermission, item.EdbInfoId, item.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+		}
+
 		// 单位
 		if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
 			chartInfo.Unit = yDataList[0].Unit

+ 2 - 2
controllers/data_manage/chart_theme.go

@@ -160,7 +160,7 @@ func (c *ChartThemeController) GetThemePreviewData() {
 		chartInfo.ChartName = "散点图"
 	case 7: // 柱形图
 		edbInfoIdList = []int{1, 2, 3, 4, 5}
-		extraConfigStr = `{"EdbInfoIdList":[{"EdbInfoId":1,"Name":"指标1","NameEn":"","Source":0},{"EdbInfoId":2,"Name":"指标2","NameEn":"","Source":0},{"EdbInfoId":3,"Name":"指标3","NameEn":"","Source":0},{"EdbInfoId":4,"Name":"指标4","NameEn":"","Source":0},{"EdbInfoId":5,"Name":"指标5","NameEn":"","Source":0}],"DateList":[{"Type":2,"Date":"","Value":100,"Color":"#00f","Name":""},{"Type":1,"Date":"","Value":0,"Color":"#f00","Name":""}],"Sort":{"Sort":0,"DateIndex":0},"XEdbList":null,"YEdbList":null,"Unit":"千桶","UnitEn":""}`
+		extraConfigStr = `{"EdbInfoIdList":[{"EdbInfoId":1,"Name":"指标1","NameEn":"","Source":0},{"EdbInfoId":2,"Name":"指标2","NameEn":"","Source":0},{"EdbInfoId":3,"Name":"指标3","NameEn":"","Source":0},{"EdbInfoId":4,"Name":"指标4","NameEn":"","Source":0},{"EdbInfoId":5,"Name":"指标5","NameEn":"","Source":0}],"DateList":[{"Type":2,"Date":"","Value":100,"Color":"","Name":""},{"Type":1,"Date":"","Value":0,"Color":"","Name":""}],"Sort":{"Sort":0,"DateIndex":0},"XEdbList":null,"YEdbList":null,"Unit":"千桶","UnitEn":""}`
 		chartInfo.ChartName = "柱形图"
 	case 10: // 截面散点图
 		edbInfoIdList = []int{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
@@ -170,7 +170,7 @@ func (c *ChartThemeController) GetThemePreviewData() {
 		edbInfoIdList = []int{19, 20, 21, 22, 23, 24}
 		chartInfo.LeftMin = "10000"
 		chartInfo.LeftMax = "60000"
-		extraConfigStr = `{"DateList":[{"Type":3,"Date":"2023-11-01","Value":0,"Color":"#00f","Name":""},{"Type":1,"Date":"","Value":0,"Color":"#f00","Name":""}]}`
+		extraConfigStr = `{"DateList":[{"Type":3,"Date":"2023-11-01","Value":0,"Color":"","Name":""},{"Type":1,"Date":"","Value":0,"Color":"","Name":""}]}`
 		chartInfo.ChartName = "雷达图"
 	default:
 		br.Msg = "暂不支持该类型"

+ 11 - 58
controllers/data_manage/correlation/correlation_chart_classify.go

@@ -8,7 +8,6 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
-	"strconv"
 	"time"
 )
 
@@ -223,42 +222,15 @@ func (this *CorrelationChartClassifyController) AddChartClassify() {
 		return
 	}
 
-	source := utils.CHART_SOURCE_CORRELATION
-	count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, req.ParentId, source)
+	// 新增图表分类
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_CORRELATION, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "判断名称是否已存在失败"
-		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-		return
-	}
-	if count > 0 {
-		br.Msg = "分类名称已存在,请重新输入"
-		br.IsSendEmail = false
-		return
-	}
-	//获取该层级下最大的排序数
-	maxSort, err := data_manage.GetChartClassifyMaxSort(req.ParentId, source)
-
-	classify := new(data_manage.ChartClassify)
-	//classify.ParentId = req.ParentId
-	classify.ParentId = 0
-	classify.ChartClassifyName = req.ChartClassifyName
-	classify.HasData = 0
-	classify.CreateTime = time.Now()
-	classify.ModifyTime = time.Now()
-	classify.SysUserId = this.SysUser.AdminId
-	classify.SysUserRealName = this.SysUser.RealName
-	classify.Level = req.Level + 1
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	classify.Sort = maxSort + 1
-	classify.Source = source
-
-	_, err = data_manage.AddChartClassify(classify)
-	if err != nil {
-		br.Msg = "保存分类失败"
-		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "添加分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
+
 	br.Ret = 200
 	br.Msg = "添加成功"
 	br.Success = true
@@ -295,34 +267,15 @@ func (this *CorrelationChartClassifyController) EditChartClassify() {
 		return
 	}
 
-	item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	// 编辑图表分类
+	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_CORRELATION, req.ChartClassifyName, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存失败"
-		br.Msg = "获取分类信息失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
 
-	source := utils.CHART_SOURCE_CORRELATION
-	if item.ChartClassifyName != req.ChartClassifyName {
-		count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, source)
-		if err != nil {
-			br.Msg = "判断名称是否已存在失败"
-			br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-			return
-		}
-		if count > 0 {
-			br.Msg = "分类名称已存在,请重新输入"
-			br.IsSendEmail = false
-			return
-		}
-
-		err = data_manage.EditChartClassify(req.ChartClassifyId, source, req.ChartClassifyName)
-		if err != nil {
-			br.Msg = "保存失败"
-			br.ErrMsg = "保存失败,Err:" + err.Error()
-			return
-		}
-	}
 	br.Ret = 200
 	br.Msg = "修改成功"
 	br.Success = true

+ 124 - 4
controllers/data_manage/correlation/correlation_chart_info.go

@@ -5,7 +5,7 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
-	"eta/eta_api/models/data_manage/future_good/request"
+	"eta/eta_api/models/data_manage/correlation/request"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	correlationServ "eta/eta_api/services/data/correlation"
@@ -165,7 +165,7 @@ func (this *CorrelationChartInfoController) Add() {
 		return
 	}
 
-	chartInfo, err, errMsg, isSendEmail := correlationServ.AddChartInfo(req, utils.CHART_SOURCE_CORRELATION, sysUser)
+	chartInfo, err, errMsg, isSendEmail := correlationServ.AddChartInfo(req, utils.CHART_SOURCE_CORRELATION, sysUser, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -232,7 +232,7 @@ func (this *CorrelationChartInfoController) Edit() {
 		return
 	}
 
-	chartItem, err, errMsg, isSendEmail := correlationServ.EditChartInfo(req, sysUser)
+	chartItem, err, errMsg, isSendEmail := correlationServ.EditChartInfo(req, sysUser, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -1134,7 +1134,7 @@ func (this *CorrelationChartInfoController) Copy() {
 		},
 	}
 
-	chartInfo, err, errMsg, isSendEmail := correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ChartClassifyId, req.ChartName, correlationChartInfoReq, oldChartInfo, sysUser)
+	chartInfo, err, errMsg, isSendEmail := correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ChartClassifyId, req.ChartName, correlationChartInfoReq, oldChartInfo, sysUser, this.Lang)
 
 	if err != nil {
 		br.Msg = "保存失败"
@@ -1701,3 +1701,123 @@ func (this *CorrelationChartInfoController) Newest() {
 	br.Msg = "获取成功"
 	br.Data = item
 }
+
+// BaseInfoEdit
+// @Title 编辑图表基础信息接口
+// @Description 编辑图表基础信息接口
+// @Param	request	body data_manage.EditChartInfoBaseReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/base/edit [post]
+func (this *CorrelationChartInfoController) BaseInfoEdit() {
+	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
+	}
+	var req request.EditChartInfoBaseReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartName == "" {
+		br.Msg = "请输入图表名称"
+		return
+	}
+
+	chartItem, _, tips, e := correlationServ.GetChartAndCorrelationInfo(req.ChartInfoId)
+	if e != nil {
+		if tips != "" {
+			br.Msg = tips
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND chart_info_id <> ? AND source = ? "
+	pars = append(pars, req.ChartInfoId, utils.CHART_SOURCE_CORRELATION)
+
+	switch this.Lang {
+	case utils.EnLangVersion:
+		condition += " AND chart_name_en = ? "
+	default:
+		condition += " AND chart_name = ? "
+	}
+	pars = append(pars, req.ChartName)
+	existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "判断英文图表名称是否存在失败"
+			br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+			return
+		}
+	}
+	if err == nil && existItem.ChartInfoId > 0 {
+		br.Msg = existItem.ChartName + ":" + req.ChartName + "图表名称已存在"
+		return
+	}
+
+	switch this.Lang {
+	case utils.EnLangVersion:
+		chartItem.ChartNameEn = req.ChartName
+	default:
+		chartItem.ChartName = req.ChartName
+	}
+
+	chartItem.ModifyTime = time.Now().Local()
+	if e := chartItem.Update([]string{"ChartName", "ChartNameEn", "ModifyTime"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑相关性图表基础信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	// 清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		_ = utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		_ = utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}

+ 97 - 3
controllers/data_manage/cross_variety/chart_info.go

@@ -337,7 +337,8 @@ func (c *ChartInfoController) Add() {
 	}
 
 	// 添加图表
-	chartInfo, err, errMsg, isSendEmail := cross_variety.AddChartInfo(req, sysUser)
+	req.ChartNameEn = req.ChartName
+	chartInfo, err, errMsg, isSendEmail := cross_variety.AddChartInfo(req, sysUser, c.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -404,7 +405,7 @@ func (c *ChartInfoController) Edit() {
 		return
 	}
 
-	chartItem, err, errMsg, isSendEmail := cross_variety.EditChartInfo(req, sysUser)
+	chartItem, err, errMsg, isSendEmail := cross_variety.EditChartInfo(req, sysUser, c.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -808,9 +809,10 @@ func (c *ChartInfoController) Copy() {
 	config.Instructions = oldChartInfo.Instructions
 	config.MarkersLines = oldChartInfo.MarkersLines
 	config.MarkersAreas = oldChartInfo.MarkersAreas
+	config.ChartNameEn = oldChartInfo.ChartNameEn
 
 	// 添加图表
-	chartInfo, err, errMsg, isSendEmail := cross_variety.AddChartInfo(config, sysUser)
+	chartInfo, err, errMsg, isSendEmail := cross_variety.AddChartInfo(config, sysUser, c.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -1806,3 +1808,95 @@ func (c *ChartInfoController) Save() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// BaseInfoEdit
+// @Title 编辑图表基础信息接口
+// @Description 编辑图表基础信息接口
+// @Param	request	body data_manage.EditChartBaseInfoReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/base/edit [post]
+func (c *ChartInfoController) BaseInfoEdit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req request.EditChartBaseInfoReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartName == "" {
+		br.Msg = "请输入图表名称"
+		return
+	}
+
+	//判断指标名称是否存在
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,请刷新页面"
+			br.ErrMsg = "图表已被删除,请刷新页面"
+			return
+		}
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	err = cross_varietyModels.EditChartBase(chartItem, req, c.Lang)
+	if err != nil {
+		br.Msg = "修改失败"
+		br.ErrMsg = "更新图表英文信息失败, Err: " + err.Error()
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//指标 修改es信息
+	//go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(c.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑跨品种分析图表基础信息"
+		chartLog.Method = c.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	// 清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		_ = utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		_ = utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}

+ 5 - 24
controllers/data_manage/cross_variety/classify.go

@@ -135,34 +135,15 @@ func (c *ClassifyController) EditChartClassify() {
 		return
 	}
 
-	item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	// 编辑图表分类
+	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_CROSS_HEDGING, req.ChartClassifyName, c.Lang, c.SysUser)
 	if err != nil {
-		br.Msg = "保存失败"
-		br.Msg = "获取分类信息失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
 
-	source := utils.CHART_SOURCE_CROSS_HEDGING
-	if item.ChartClassifyName != req.ChartClassifyName {
-		//count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, source)
-		//if err != nil {
-		//	br.Msg = "判断名称是否已存在失败"
-		//	br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-		//	return
-		//}
-		//if count > 0 {
-		//	br.Msg = "分类名称已存在,请重新输入"
-		//	br.IsSendEmail = false
-		//	return
-		//}
-
-		err = data_manage.EditChartClassify(req.ChartClassifyId, source, req.ChartClassifyName)
-		if err != nil {
-			br.Msg = "保存失败"
-			br.ErrMsg = "保存失败,Err:" + err.Error()
-			return
-		}
-	}
 	br.Ret = 200
 	br.Msg = "修改成功"
 	br.Success = true

+ 8 - 2
controllers/data_manage/cross_variety/tag.go

@@ -59,6 +59,7 @@ func (c *TagController) Add() {
 	tag := &cross_variety.ChartTag{
 		ChartTagId:      0,
 		ChartTagName:    TagName,
+		ChartTagNameEn:  TagName,
 		SysUserId:       c.SysUser.AdminId,
 		SysUserRealName: c.SysUser.RealName,
 		ModifyTime:      time.Now(),
@@ -129,9 +130,14 @@ func (c *TagController) Edit() {
 	}
 
 	// 编辑
-	varietyInfo.ChartTagName = TagName
+	switch c.Lang {
+	case utils.EnLangVersion:
+		varietyInfo.ChartTagNameEn = TagName
+	default:
+		varietyInfo.ChartTagName = TagName
+	}
 	varietyInfo.ModifyTime = time.Now()
-	err = varietyInfo.Update([]string{"ChartTagName", "ModifyTime"})
+	err = varietyInfo.Update([]string{"ChartTagName", "ChartTagNameEn", "ModifyTime"})
 	if err != nil {
 		br.Msg = "修改标签失败"
 		br.ErrMsg = "修改标签失败,Err:" + err.Error()

+ 14 - 8
controllers/data_manage/cross_variety/variety.go

@@ -56,12 +56,13 @@ func (c *VarietyController) Add() {
 	}
 
 	variety := &cross_variety.ChartVariety{
-		ChartVarietyId:   0,
-		ChartVarietyName: varietyName,
-		SysUserId:        c.SysUser.AdminId,
-		SysUserRealName:  c.SysUser.RealName,
-		ModifyTime:       time.Now(),
-		CreateTime:       time.Now(),
+		ChartVarietyId:     0,
+		ChartVarietyName:   varietyName,
+		ChartVarietyNameEn: varietyName,
+		SysUserId:          c.SysUser.AdminId,
+		SysUserRealName:    c.SysUser.RealName,
+		ModifyTime:         time.Now(),
+		CreateTime:         time.Now(),
 	}
 	err = cross_variety.AddVariety(variety)
 	if err != nil {
@@ -128,9 +129,14 @@ func (c *VarietyController) Edit() {
 	}
 
 	// 编辑
-	varietyInfo.ChartVarietyName = varietyName
+	switch c.Lang {
+	case utils.EnLangVersion:
+		varietyInfo.ChartVarietyNameEn = varietyName
+	default:
+		varietyInfo.ChartVarietyName = varietyName
+	}
 	varietyInfo.ModifyTime = time.Now()
-	err = varietyInfo.Update([]string{"ChartVarietyName", "ModifyTime"})
+	err = varietyInfo.Update([]string{"ChartVarietyName", "ChartVarietyNameEn", "ModifyTime"})
 	if err != nil {
 		br.Msg = "修改品种失败"
 		br.ErrMsg = "修改品种失败,Err:" + err.Error()

+ 2 - 2
controllers/data_manage/edb_classify.go

@@ -207,7 +207,7 @@ func (this *EdbClassifyController) AddEdbClassify() {
 	}
 
 	//添加指标
-	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 0, this.SysUser.AdminId, this.SysUser.AdminName)
+	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 0, this.SysUser.AdminId, this.SysUser.AdminName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -288,7 +288,7 @@ func (this *EdbClassifyController) EditEdbClassify() {
 		return
 	}
 
-	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
+	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.Lang, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg

+ 171 - 9
controllers/data_manage/edb_info.go

@@ -2278,7 +2278,7 @@ func (this *EdbInfoController) EdbInfoAdd() {
 	}
 
 	// 指标入库
-	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, req.StartDate, req.EndDate, sysUser.AdminId, sysUser.RealName)
+	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, req.StartDate, req.EndDate, sysUser.AdminId, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -2431,7 +2431,24 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	//condition += " AND source=? "
 	//pars = append(pars, edbInfo.Source)
 
-	condition += " AND edb_name=? "
+	updateCols := make([]string, 0)
+	switch this.Lang {
+	case utils.EnLangVersion:
+		condition += " AND edb_name_en = ? "
+		edbInfo.EdbNameEn = req.EdbName
+		edbInfo.Frequency = req.Frequency
+		edbInfo.UnitEn = req.Unit
+		edbInfo.ClassifyId = req.ClassifyId
+		updateCols = append(updateCols, "EdbNameEn", "Frequency", "UnitEn", "ClassifyId")
+	default:
+		condition += " AND edb_name=? "
+		edbInfo.EdbName = req.EdbName
+		edbInfo.EdbNameSource = req.EdbName
+		edbInfo.Frequency = req.Frequency
+		edbInfo.Unit = req.Unit
+		edbInfo.ClassifyId = req.ClassifyId
+		updateCols = append(updateCols, "EdbNameEn", "EdbNameSource", "Frequency", "UnitEn", "ClassifyId")
+	}
 	pars = append(pars, req.EdbName)
 
 	count, err := data_manage.GetEdbInfoCountByCondition(condition, pars)
@@ -2447,11 +2464,14 @@ func (this *EdbInfoController) EdbInfoEdit() {
 		br.IsSendEmail = false
 		return
 	}
-	err = data_manage.ModifyEdbInfo(&req)
-	if err != nil {
-		br.Msg = "保存失败"
-		br.ErrMsg = "修改失败,Err:" + err.Error()
-		return
+
+	if len(updateCols) > 0 {
+		err = edbInfo.Update(updateCols)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "修改失败,Err:" + err.Error()
+			return
+		}
 	}
 
 	//处理同名指标
@@ -2496,8 +2516,14 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	//添加es
 	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
 
-	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
+	switch this.Lang {
+	case utils.EnLangVersion:
+		// 修改关联的预测指标基础信息
+		go data.ModifyPredictEdbEnBaseInfoBySourceEdb(edbInfo, req.Unit)
+	default:
+		// 修改关联的预测指标基础信息
+		go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
+	}
 
 	// 添加钢联指标更新日志
 	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
@@ -2623,6 +2649,142 @@ func (this *EdbInfoController) EdbEnInfoEdit() {
 	br.IsAddLog = true
 }
 
+// EdbInfoBaseEdit
+// @Title 编辑指标基础信息接口
+// @Description 编辑指标基础信息接口
+// @Success 200 {object} data_manage.EditEdbBaseInfoReq
+// @router /edb_info/base/edit [post]
+func (this *EdbInfoController) EdbInfoBaseEdit() {
+	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
+	}
+
+	var req data_manage.EditEdbBaseInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	req.EdbName = strings.Trim(req.EdbName, " ")
+	req.Unit = strings.Trim(req.Unit, " ")
+	if req.EdbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "指标id小于等于0"
+		return
+	}
+
+	edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	updateCols := make([]string, 0)
+
+	if req.EdbName != "" {
+		//判断指标名称是否存在
+		var condition string
+		var pars []interface{}
+
+		condition += " AND edb_info_id<>? "
+		pars = append(pars, req.EdbInfoId)
+
+		/*condition += " AND source=? "
+		pars = append(pars, edbInfo.Source)*/
+
+		switch this.Lang {
+		case utils.EnLangVersion:
+			condition += " AND edb_name_en = ? "
+			edbInfo.EdbNameEn = req.EdbName
+			edbInfo.UnitEn = req.Unit
+			edbInfo.ModifyTime = time.Now()
+			updateCols = append(updateCols, "EdbNameEn", "UnitEn", "ModifyTime")
+		default:
+			condition += " AND edb_name = ? "
+			edbInfo.EdbName = req.EdbName
+			edbInfo.EdbNameSource = req.EdbName
+			edbInfo.Unit = req.Unit
+			edbInfo.ModifyTime = time.Now()
+			updateCols = append(updateCols, "EdbName", "EdbNameSource", "Unit", "ModifyTime")
+		}
+		pars = append(pars, req.EdbName)
+
+		edbExist, err := data_manage.GetEdbInfoByCondition(condition, pars)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "判断英文指标名称是否存在失败"
+				br.ErrMsg = "判断英文指标名称是否存在失败,Err:" + err.Error()
+				return
+			}
+		}
+
+		if err == nil && edbExist.EdbInfoId > 0 {
+			br.Msg = edbExist.EdbName + ":" + req.EdbName + "指标名称已存在"
+			br.ErrMsg = "英文指标名称已存在,请重新填写"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
+	if len(updateCols) > 0 {
+		err = edbInfo.Update(updateCols)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "修改失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	//新增操作日志
+	{
+		edbLog := new(data_manage.EdbInfoLog)
+		edbLog.EdbInfoId = edbInfo.EdbInfoId
+		edbLog.SourceName = edbInfo.SourceName
+		edbLog.Source = edbInfo.Source
+		edbLog.EdbCode = edbInfo.EdbCode
+		edbLog.EdbName = edbInfo.EdbName
+		edbLog.ClassifyId = edbInfo.ClassifyId
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "编辑指标英文信息"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddEdbInfoLog(edbLog)
+	}
+
+	//添加es
+	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
+
+	// 修改关联的预测指标基础信息
+	if edbInfo.EdbInfoType == 0 {
+		switch this.Lang {
+		case utils.EnLangVersion:
+			go data.ModifyPredictEdbEnBaseInfoBySourceEdb(edbInfo, req.Unit)
+		default:
+			go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, edbInfo.Frequency, req.Unit)
+
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.IsAddLog = true
+}
+
 // EdbInfoNewest
 // @Title 获取最新指标接口
 // @Description 获取最新指标接口

+ 16 - 11
controllers/data_manage/edb_info_calculate.go

@@ -173,7 +173,7 @@ func (this *ChartInfoController) CalculateSave() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.AddEdbCalculateData(string(reqJson))
+	respItem, err := data.AddEdbCalculateData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "新增失败"
 		br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -197,6 +197,7 @@ func (this *ChartInfoController) CalculateSave() {
 	br.IsAddLog = true
 }
 
+// CalculateDetail
 // @Title 获取计算指标详情
 // @Description 获取计算指标详情接口
 // @Param   EdbInfoId   query   int  true       "指标id"
@@ -291,7 +292,7 @@ func (this *ChartInfoController) CalculateDetail() {
 			}
 
 			// 计算
-			val, err, _ := data.CallCalculateComputeCorrelation(req2)
+			val, err, _ := data.CallCalculateComputeCorrelation(req2, this.Lang)
 			if err == nil {
 				fullEdb.CorrelationStr = val
 			}
@@ -462,7 +463,7 @@ func (this *ChartInfoController) CalculateEdit() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.EditEdbCalculateData(string(reqJson))
+	respItem, err := data.EditEdbCalculateData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -657,7 +658,7 @@ func (this *ChartInfoController) CalculateBatchSave() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchSaveEdbCalculateData(string(reqJson))
+	respItem, err := data.BatchSaveEdbCalculateData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "新增失败"
 		br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -864,7 +865,7 @@ func (this *ChartInfoController) CalculateBatchEdit() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchEditEdbCalculateData(string(reqJson))
+	respItem, err := data.BatchEditEdbCalculateData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -1235,7 +1236,7 @@ func (this *ChartInfoController) AddPythonEdb() {
 		}
 	}
 	// 添加python指标
-	respItem, err := data.AddPythonEdbData(string(reqJson))
+	respItem, err := data.AddPythonEdbData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "添加失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -1352,7 +1353,7 @@ func (this *ChartInfoController) EditPythonEdb() {
 	}
 
 	// 修改python运算指标
-	respItem, err := data.EditPythonEdbData(string(reqJson))
+	respItem, err := data.EditPythonEdbData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "保存失败,Err:" + err.Error()
@@ -1540,7 +1541,7 @@ func (this *ChartInfoController) SaveAdjustEdbInfo() {
 		}
 	}
 	// 添加数据调整指标
-	respItem, err := data.SaveAdjustEdbInfo(string(reqJson))
+	respItem, err := data.SaveAdjustEdbInfo(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "添加失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -1762,7 +1763,7 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchSaveEdbCalculateMultiData(string(reqJson))
+	respItem, err := data.BatchSaveEdbCalculateMultiData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "新增失败!"
 		br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -1951,7 +1952,7 @@ func (this *ChartInfoController) BatchCalculateBatchEdit() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchEditEdbCalculateMultiData(string(reqJson))
+	respItem, err := data.BatchEditEdbCalculateMultiData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "编辑失败!"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -2088,7 +2089,7 @@ func (this *ChartInfoController) CalculateComputeCorrelation() {
 		Calendar:     req.Calendar,
 	}
 
-	val, err, errMsg := data.CallCalculateComputeCorrelation(req2)
+	val, err, errMsg := data.CallCalculateComputeCorrelation(req2, this.Lang)
 	if err != nil {
 		br.Msg = "计算失败"
 		if errMsg != `` {
@@ -2252,7 +2253,9 @@ func (this *ChartInfoController) CalculateMultiChoice() {
 			searchItem := data_manage.EdbInfoBase{
 				Frequency:     info.Frequency,
 				Unit:          info.Unit,
+				UnitEn:        info.UnitEn,
 				EdbName:       info.EdbName,
+				EdbNameEn:     info.EdbNameEn,
 				EdbInfoId:     info.EdbInfoId,
 				ClassifyId:    info.ClassifyId,
 				HaveOperaAuth: haveOperaAuth,
@@ -2405,7 +2408,9 @@ func (this *ChartInfoController) CalculateMultiSearch() {
 			searchItem := data_manage.CalculateMultiEdbSearchItem{
 				Frequency:       info.Frequency,
 				Unit:            info.Unit,
+				UnitEn:          info.UnitEn,
 				EdbName:         info.EdbName,
+				EdbNameEn:       info.EdbNameEn,
 				EdbInfoId:       info.EdbInfoId,
 				ClassifyId:      info.ClassifyId,
 				SysUserRealName: info.SysUserRealName,

+ 3 - 3
controllers/data_manage/excel/custom_analysis_edb.go

@@ -209,7 +209,7 @@ func (c *CustomAnalysisController) AddEdb() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchSaveEdbCalculateData(string(reqJson))
+	respItem, err := data.BatchSaveEdbCalculateData(string(reqJson), c.Lang)
 	if err != nil {
 		br.Msg = "新增失败"
 		br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -378,7 +378,7 @@ func (c *CustomAnalysisController) EditEdb() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchEditEdbCalculateData(string(reqJson))
+	respItem, err := data.BatchEditEdbCalculateData(string(reqJson), c.Lang)
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -446,7 +446,7 @@ func (c *CustomAnalysisController) EdbRefresh() {
 		return
 	}
 
-	err, errMsg, isSendEmail := excel.Refresh(excelInfo)
+	err, errMsg, isSendEmail := excel.Refresh(excelInfo, c.Lang)
 	if err != nil {
 		br.Msg = "刷新失败"
 		if errMsg != `` {

+ 10 - 10
controllers/data_manage/excel/excel_info.go

@@ -134,7 +134,7 @@ func (c *ExcelInfoController) Add() {
 	// 引用的指标id
 	edbInfoIdList := make([]int, 0)
 	// 自定义表格
-	if req.Source == 2 {
+	if req.Source == utils.TIME_TABLE {
 		jsonStrByte, err := json.Marshal(req.TableData)
 		if err != nil {
 			br.Msg = "自定义表格数据获取失败"
@@ -183,7 +183,7 @@ func (c *ExcelInfoController) Add() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, err, errMsg := excel2.GetMixedTableCellData(result)
+		newResult, err, errMsg := excel2.GetMixedTableCellData(result, c.Lang)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -487,7 +487,7 @@ func (c *ExcelInfoController) Detail() {
 	}
 
 	// 获取数据详情
-	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId, c.SysUser.AdminId)
+	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId, c.SysUser.AdminId, c.Lang)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = err.Error()
@@ -704,7 +704,7 @@ func (c *ExcelInfoController) Edit() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, err, errMsg := excel2.GetMixedTableCellData(result)
+		newResult, err, errMsg := excel2.GetMixedTableCellData(result, c.Lang)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -1296,7 +1296,7 @@ func (c *ExcelInfoController) GetExcelTableData() {
 			br.ErrMsg = "获取最新的表格数据失败,Err:" + err.Error()
 			return
 		}
-		tableData, err = excel.GetTableDataByCustomData(excelInfo.ExcelType, result)
+		tableData, err = excel.GetTableDataByCustomData(excelInfo.ExcelType, result, c.Lang)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "转换成table失败,Err:" + err.Error()
@@ -1310,7 +1310,7 @@ func (c *ExcelInfoController) GetExcelTableData() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, err, errMsg := excel2.GetMixedTableCellData(result)
+		newResult, err, errMsg := excel2.GetMixedTableCellData(result, c.Lang)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -1923,7 +1923,7 @@ func (c *ExcelInfoController) Refresh() {
 	}
 
 	// 获取数据详情
-	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId, c.SysUser.AdminId)
+	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(excelInfoId, c.SysUser.AdminId, c.Lang)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = err.Error()
@@ -2085,7 +2085,7 @@ func (c *ExcelInfoController) Download() {
 			br.ErrMsg = "获取最新的表格数据失败,Err:" + err.Error()
 			return
 		}
-		tableData, err = excel.GetTableDataByCustomData(excelInfo.ExcelType, result)
+		tableData, err = excel.GetTableDataByCustomData(excelInfo.ExcelType, result, c.Lang)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "转换成table失败,Err:" + err.Error()
@@ -2099,7 +2099,7 @@ func (c *ExcelInfoController) Download() {
 			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
 			return
 		}
-		newResult, err, errMsg := excel2.GetMixedTableCellData(result)
+		newResult, err, errMsg := excel2.GetMixedTableCellData(result, c.Lang)
 		if err != nil {
 			br.Msg = "获取失败"
 			if errMsg != `` {
@@ -2426,7 +2426,7 @@ func (c *ExcelInfoController) BatchRefresh() {
 	}
 
 	// 获取表格关联的指标IDs
-	edbIds, e := excel2.GetEdbIdsFromExcelCodes(req.ExcelCodes, sysUser.AdminId)
+	edbIds, e := excel2.GetEdbIdsFromExcelCodes(req.ExcelCodes, sysUser.AdminId, c.Lang)
 	if e != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "获取表格关联的指标IDs失败, Err: " + e.Error()

+ 3 - 1
controllers/data_manage/excel/mixed_table.go

@@ -188,7 +188,7 @@ func (c *ExcelInfoController) CalculateData() {
 		err = tmpErr
 		return
 	}
-	respItem, tmpErr := data.BaseCalculate(string(reqJson))
+	respItem, tmpErr := data.BaseCalculate(string(reqJson), c.Lang)
 	if tmpErr != nil {
 		br.Msg = "计算指标失败"
 		br.ErrMsg = tmpErr.Error()
@@ -470,10 +470,12 @@ func (c *ExcelInfoController) GetBaseEdbInfo() {
 				tmp.EdbInfoType = v.EdbInfoType
 				tmp.EdbCode = v.EdbCode
 				tmp.EdbName = v.EdbName
+				tmp.EdbNameEn = v.EdbNameEn
 				tmp.Source = v.Source
 				tmp.SourceName = v.SourceName
 				tmp.Frequency = v.Frequency
 				tmp.Unit = v.Unit
+				tmp.UnitEn = v.UnitEn
 				list = append(list, tmp)
 			}
 		}

+ 11 - 56
controllers/data_manage/future_good/future_good_chart_classify.go

@@ -9,7 +9,6 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
-	"strconv"
 	"time"
 )
 
@@ -200,41 +199,15 @@ func (this *FutureGoodChartClassifyController) AddChartClassify() {
 		return
 	}
 
-	count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, req.ParentId, utils.CHART_SOURCE_FUTURE_GOOD)
+	// 新增图表分类
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, 0, req.Level, utils.CHART_SOURCE_FUTURE_GOOD, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "判断名称是否已存在失败"
-		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-		return
-	}
-	if count > 0 {
-		br.Msg = "分类名称已存在,请重新输入"
-		br.IsSendEmail = false
-		return
-	}
-	//获取该层级下最大的排序数
-	maxSort, err := data_manage.GetChartClassifyMaxSort(req.ParentId, utils.CHART_SOURCE_FUTURE_GOOD)
-
-	classify := new(data_manage.ChartClassify)
-	//classify.ParentId = req.ParentId
-	classify.ParentId = 0
-	classify.ChartClassifyName = req.ChartClassifyName
-	classify.HasData = 0
-	classify.CreateTime = time.Now()
-	classify.ModifyTime = time.Now()
-	classify.SysUserId = this.SysUser.AdminId
-	classify.SysUserRealName = this.SysUser.RealName
-	classify.Level = req.Level + 1
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	classify.Sort = maxSort + 1
-	classify.Source = utils.CHART_SOURCE_FUTURE_GOOD
-
-	_, err = data_manage.AddChartClassify(classify)
-	if err != nil {
-		br.Msg = "保存分类失败"
-		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "添加分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
+
 	br.Ret = 200
 	br.Msg = "添加成功"
 	br.Success = true
@@ -271,33 +244,15 @@ func (this *FutureGoodChartClassifyController) EditChartClassify() {
 		return
 	}
 
-	item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	// 编辑图表分类
+	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_FUTURE_GOOD, req.ChartClassifyName, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存失败"
-		br.Msg = "获取分类信息失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
 
-	if item.ChartClassifyName != req.ChartClassifyName {
-		count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, utils.CHART_SOURCE_FUTURE_GOOD)
-		if err != nil {
-			br.Msg = "判断名称是否已存在失败"
-			br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-			return
-		}
-		if count > 0 {
-			br.Msg = "分类名称已存在,请重新输入"
-			br.IsSendEmail = false
-			return
-		}
-
-		err = data_manage.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_FUTURE_GOOD, req.ChartClassifyName)
-		if err != nil {
-			br.Msg = "保存失败"
-			br.ErrMsg = "保存失败,Err:" + err.Error()
-			return
-		}
-	}
 	br.Ret = 200
 	br.Msg = "修改成功"
 	br.Success = true

+ 211 - 124
controllers/data_manage/future_good/future_good_chart_info.go

@@ -3002,133 +3002,220 @@ func (this *FutureGoodChartInfoController) PreviewBarChartInfo() {
 	br.Data = resp
 }
 
-//
-//修复数据时间戳
+// BaseInfoEdit
+// @Title 编辑图表基础信息接口
+// @Description 编辑图表基础信息接口
+// @Param	request	body data_manage.EditChartInfoBaseReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/base/edit [post]
+func (this *FutureGoodChartInfoController) BaseInfoEdit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
 
-//func init() {
-//	fmt.Println("start")
-//	edbInfoList,err:=data_manage.GetEdbInfo()
-//	if err!=nil {
-//		fmt.Println("Err:",err.Error())
-//		return
-//	}
-//	startDate:=time.Now().AddDate(-40,0,0).Format(utils.FormatDate)
-//	endDate:=time.Now().Format(utils.FormatDate)
-//	for _,v:=range edbInfoList{
-//		dataList,err:=data_manage.GetEdbDataList(v.Source,v.EdbInfoId,startDate,endDate)
-//		if err!=nil {
-//			fmt.Println("GetEdbDataList Err:",err.Error())
-//			return
-//		}
-//		for _,dv:=range dataList{
-//			dataTime,err:=time.Parse(utils.FormatDate,dv.DataTime)
-//			if err!=nil {
-//				fmt.Println("time.Parse Err:"+err.Error())
-//				return
-//			}
-//			timestamp:=dataTime.UnixNano()/1e6
-//			err=data_manage.ModifyEdbDatadTimestamp(v.Source,dv.EdbDataId,timestamp)
-//			if err!=nil{
-//				fmt.Println("ModifyEdbDatadTimestamp Err:"+err.Error())
-//				return
-//			}
-//			fmt.Println(v.Source,dv.EdbDataId,timestamp)
-//		}
-//	}
-//	//time.Sleep(2*time.Minute)
-//
-//	//startDate:=time.Now().AddDate(-30,0,0).Format(utils.FormatDate)
-//	//endDate:=time.Now().Format(utils.FormatDate)
-//	//dataList,err:=data_manage.GetEdbDataList(1,100099,startDate,endDate)
-//	//if err!=nil {
-//	//	fmt.Println("GetEdbDataList Err:",err.Error())
-//	//	return
-//	//}
-//	//for _,dv:=range dataList{
-//	//	dataTime,err:=time.Parse(utils.FormatDate,dv.DataTime)
-//	//	if err!=nil {
-//	//		fmt.Println("time.Parse Err:"+err.Error())
-//	//		return
-//	//	}
-//	//	timestamp:=dataTime.UnixNano()/1e6
-//	//	err=data_manage.ModifyEdbDatadTimestamp(2,dv.EdbDataId,timestamp)
-//	//	if err!=nil{
-//	//		fmt.Println("ModifyEdbDatadTimestamp Err:"+err.Error())
-//	//		return
-//	//	}
-//	//	fmt.Println(2,dv.EdbDataId,timestamp)
-//	//}
-//
-//	fmt.Println("end")
-//}
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
 
-//修复指标配置数据
-//func init() {
-//	fmt.Println("start")
-//	edbInfo, err := data_manage.GetEdbInfoAll()
-//	fmt.Println(err)
-//	for k, v := range edbInfoAll {
-//		fmt.Println(k, v.EdbInfoId)
-//		item, err := data_manage.GetEdbInfoMaxAndMinInfo(v.Source, v.EdbCode)
-//		fmt.Println(item, err)
-//		err = data_manage.ModifyEdbInfoMaxAndMinInfo(v.EdbInfoId, item)
-//		if err != nil {
-//			fmt.Println("ModifyEdbInfoMaxAndMinInfo Err:" + err.Error())
-//		}
-//	}
-//	fmt.Println("end")
-//}
+	var req request.EditChartInfoBaseReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartName = strings.Trim(req.ChartName, " ")
 
-//func init() {
-//	fmt.Println("start")
-//	var yearArr []int
-//	yearArr = append(yearArr, 2021)
-//	yearArr = append(yearArr, 2010)
-//	yearArr = append(yearArr, 2020)
-//	yearArr = append(yearArr, 2017)
-//	yearArr = append(yearArr, 2019)
-//	sort.Sort(sort.Reverse(sort.IntSlice(yearArr)))
-//	fmt.Println(yearArr)
-//	fmt.Println("end")
-//}
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
 
-//季度指标数据计算(公历转农历)
-//func init() {
-//	fmt.Println("start AddCalculateQuarter")
-//	list:=make([]*data_manage.EdbDataList,0)
-//	data_manage.AddCalculateQuarterV4(list)
-//	fmt.Println("end AddCalculateQuarter")
-//	//return
-//}
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,请刷新页面"
+			br.ErrMsg = "图表已被删除,请刷新页面"
+			return
+		}
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
 
-/*
-{
-  "ChartClassifyId": 58,
-  "ChartName": "公历转农历6",
-  "ChartType": 2,
-  "ChartEdbInfoList": [
-    {
-      "ChartColor": "#00f",
-      "ChartStyle": "spline",
-      "ChartWidth": 3,
-      "EdbInfoId": 100466,
-      "EdbInfoType": 1,
-      "IsAxis": 1,
-      "IsOrder": false,
-      "LeadUnit": "",
-      "LeadValue": 0,
-      "MaxData": 0.2943,
-      "MinData": -0.2448
-    }
-  ]
-}
-*/
-//func init() {
-//	fmt.Println("start")
-//	data_manage.AddCalculateQuarter(100466,6,"C2108252836")
-//	fmt.Println("end")
-//}
+	if !utils.InArrayByInt([]int{utils.CHART_SOURCE_FUTURE_GOOD, utils.CHART_SOURCE_FUTURE_GOOD_PROFIT}, chartItem.Source) {
+		br.Msg = "该图不是商品价格/利润曲线图!"
+		br.IsSendEmail = false
+		return
+	}
 
-//func init() {
-//	data.AddAllChartInfo()
-//}
+	//图表操作权限
+	//ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	//if !ok {
+	//	br.Msg = "没有该图表的操作权限"
+	//	br.ErrMsg = "没有该图表的操作权限"
+	//	return
+	//}
+
+	edbInfoMapping, err := data_manage.GetEtaEdbChartEdbMapping(chartItem.ChartInfoId)
+	if err != nil {
+		br.Msg = "修改失败"
+		br.ErrMsg = "获取图表现货价格指标信息失败,指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	//校验指标信息是否存在
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoMapping.EdbInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表不存在!"
+			br.ErrMsg = "图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoMapping.EdbInfoId)
+			return
+		} else {
+			br.Msg = "获取图表信息失败!"
+			br.ErrMsg = "获取图表的指标信息失败,Err:" + err.Error()
+			return
+		}
+	}
+	if edbInfo == nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoMapping.EdbInfoId)
+		return
+	}
+
+	if req.ChartName != "" {
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id<>? "
+		pars = append(pars, req.ChartInfoId)
+
+		switch this.Lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? "
+		default:
+			condition += " AND chart_name = ? "
+		}
+		pars = append(pars, req.ChartName)
+
+		existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "判断英文图表名称是否存在失败"
+				br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+				return
+			}
+		}
+
+		if err == nil && existItem.ChartInfoId > 0 {
+			br.Msg = existItem.ChartName + ":" + req.ChartName + "图表名称已存在"
+			return
+		}
+	}
+
+	switch chartItem.Source {
+	case utils.CHART_SOURCE_FUTURE_GOOD:
+		err = data_manage.EditBaseFutureGoodChartInfoAndEdbEnInfo(chartItem, req.ChartName, edbInfo.EdbInfoId, req.EdbName, req.Unit, this.Lang)
+		if req.FutureGoodName != `` {
+			futureGoodEdbInfoMapping, err := data_manage.GetFutureGoodEdbChartEdbMapping(chartItem.ChartInfoId)
+			if err != nil {
+				br.Msg = "修改失败"
+				br.ErrMsg = "获取图表现货价格指标信息失败,指标信息失败,Err:" + err.Error()
+				return
+			}
+			futureGoodEdbInfo, err := future_good.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
+			if err != nil {
+				if err.Error() == utils.ErrNoRow() {
+					br.Msg = "图表不存在!"
+					br.ErrMsg = "图表指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoMapping.EdbInfoId)
+					return
+				} else {
+					br.Msg = "获取图表信息失败!"
+					br.ErrMsg = "获取图表的指标信息失败,Err:" + err.Error()
+					return
+				}
+			}
+			if futureGoodEdbInfo == nil {
+				br.Msg = "期货商品指标不存在!"
+				br.ErrMsg = "期货商品指标不存在,ChartInfoId:" + strconv.Itoa(edbInfoMapping.EdbInfoId)
+				return
+			}
+
+			list, _ := future_good.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfo.FutureGoodEdbInfoId)
+			for _, v := range list {
+				switch this.Lang {
+				case utils.EnLangVersion:
+					if v.FutureGoodEdbNameEn == `` {
+						v.FutureGoodEdbNameEn = strings.TrimPrefix(req.FutureGoodName, " ")
+						v.FutureGoodEdbNameEn = strings.TrimSuffix(req.FutureGoodName, " ")
+					} else {
+						v.FutureGoodEdbNameEn = strings.TrimPrefix(strings.Replace(v.FutureGoodEdbNameEn, v.FutureGoodEdbNameEn, req.FutureGoodName, -1), " ")
+						v.FutureGoodEdbNameEn = strings.TrimSuffix(req.FutureGoodName, " ")
+					}
+					v.Update([]string{"FutureGoodEdbNameEn"})
+				default:
+					if v.FutureGoodEdbName == `` {
+						v.FutureGoodEdbName = strings.TrimPrefix(req.FutureGoodName, " ")
+						v.FutureGoodEdbName = strings.TrimSuffix(req.FutureGoodName, " ")
+					} else {
+						v.FutureGoodEdbName = strings.TrimPrefix(strings.Replace(v.FutureGoodEdbName, v.FutureGoodEdbName, req.FutureGoodName, -1), " ")
+						v.FutureGoodEdbName = strings.TrimSuffix(req.FutureGoodName, " ")
+					}
+					v.Update([]string{"FutureGoodEdbName"})
+				}
+			}
+		}
+	case utils.CHART_SOURCE_FUTURE_GOOD_PROFIT:
+		err = data_manage.EditBaseFutureGoodProfitChartInfoAndEdbEnInfo(chartItem, req.ChartName, edbInfo.EdbInfoId, req.EdbName, req.Unit, req.ProfitName, this.Lang)
+	default:
+		br.Msg = "错误的图表类型"
+		br.ErrMsg = "错误的图表类型"
+		br.IsSendEmail = false
+		return
+	}
+
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//指标 修改es信息
+	go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑商品价格图表基础信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	//清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}

+ 19 - 14
controllers/data_manage/future_good/future_good_edb_info.go

@@ -41,8 +41,8 @@ func (this *FutureGoodEdbInfoController) FutureGoodEdbInfoList() {
 	// @Param   Keyword   query   string  false       "搜索关键词:期货指标ID/期货指标名称"
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
-		condition += ` AND ( future_good_edb_name like ? or future_good_edb_code like ? ) `
-		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		condition += ` AND ( future_good_edb_name like ? or future_good_edb_name_en like ?  or future_good_edb_code like ? ) `
+		pars = utils.GetLikeKeywordPars(pars, keyword, 3)
 	}
 
 	// @Param   RegionType   query   string  false       "交易所来源,海外还是国内"
@@ -230,13 +230,15 @@ func (this *FutureGoodEdbInfoController) FutureGoodEdbInfoGroupList() {
 
 	resp := []future_good2.FutureGoodEdbInfoGroupListResp{
 		{
-			FutureGoodEdbInfoId:   0,
-			FutureGoodEdbInfoName: "国内交易所",
-			Child:                 make([]future_good2.FutureGoodEdbInfoGroupListResp, 0),
+			FutureGoodEdbInfoId:     0,
+			FutureGoodEdbInfoName:   "国内交易所",
+			FutureGoodEdbInfoNameEn: "Domestic",
+			Child:                   make([]future_good2.FutureGoodEdbInfoGroupListResp, 0),
 		}, {
-			FutureGoodEdbInfoId:   0,
-			FutureGoodEdbInfoName: "海外交易所",
-			Child:                 make([]future_good2.FutureGoodEdbInfoGroupListResp, 0),
+			FutureGoodEdbInfoId:     0,
+			FutureGoodEdbInfoName:   "海外交易所",
+			FutureGoodEdbInfoNameEn: "Global",
+			Child:                   make([]future_good2.FutureGoodEdbInfoGroupListResp, 0),
 		},
 	}
 	groupMap := make(map[string]int)
@@ -252,12 +254,14 @@ func (this *FutureGoodEdbInfoController) FutureGoodEdbInfoGroupList() {
 		if !ok {
 			tmpKey = len(child)
 			tmpList = future_good2.FutureGoodEdbInfoGroupListResp{
-				FutureGoodEdbInfoId:   tmpKey,
-				FutureGoodEdbInfoName: v.Exchange,
+				FutureGoodEdbInfoId:     tmpKey,
+				FutureGoodEdbInfoName:   v.Exchange,
+				FutureGoodEdbInfoNameEn: v.ExchangeEn,
 				Child: []future_good2.FutureGoodEdbInfoGroupListResp{
 					{
-						FutureGoodEdbInfoId:   v.FutureGoodEdbInfoId,
-						FutureGoodEdbInfoName: v.FutureGoodEdbName,
+						FutureGoodEdbInfoId:     v.FutureGoodEdbInfoId,
+						FutureGoodEdbInfoName:   v.FutureGoodEdbName,
+						FutureGoodEdbInfoNameEn: v.FutureGoodEdbNameEn,
 						//Child:                 make([]future_good.FutureGoodEdbInfoGroupListResp, 0),
 					},
 				},
@@ -267,8 +271,9 @@ func (this *FutureGoodEdbInfoController) FutureGoodEdbInfoGroupList() {
 		} else {
 			tmpList = child[tmpKey]
 			tmpList.Child = append(tmpList.Child, future_good2.FutureGoodEdbInfoGroupListResp{
-				FutureGoodEdbInfoId:   v.FutureGoodEdbInfoId,
-				FutureGoodEdbInfoName: v.FutureGoodEdbName,
+				FutureGoodEdbInfoId:     v.FutureGoodEdbInfoId,
+				FutureGoodEdbInfoName:   v.FutureGoodEdbName,
+				FutureGoodEdbInfoNameEn: v.FutureGoodEdbNameEn,
 				//Child:                 make([]future_good.FutureGoodEdbInfoGroupListResp, 0),
 			})
 			child[tmpKey] = tmpList

+ 11 - 58
controllers/data_manage/line_equation/line_chart_classify.go

@@ -8,7 +8,6 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
-	"strconv"
 	"time"
 )
 
@@ -205,42 +204,15 @@ func (this *LineEquationChartClassifyController) AddChartClassify() {
 		return
 	}
 
-	source := utils.CHART_SOURCE_LINE_EQUATION
-	count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, req.ParentId, source)
-	if err != nil {
-		br.Msg = "判断名称是否已存在失败"
-		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-		return
-	}
-	if count > 0 {
-		br.Msg = "分类名称已存在,请重新输入"
-		br.IsSendEmail = false
-		return
-	}
-	//获取该层级下最大的排序数
-	maxSort, err := data_manage.GetChartClassifyMaxSort(req.ParentId, source)
-
-	classify := new(data_manage.ChartClassify)
-	//classify.ParentId = req.ParentId
-	classify.ParentId = 0
-	classify.ChartClassifyName = req.ChartClassifyName
-	classify.HasData = 0
-	classify.CreateTime = time.Now()
-	classify.ModifyTime = time.Now()
-	classify.SysUserId = this.SysUser.AdminId
-	classify.SysUserRealName = this.SysUser.RealName
-	classify.Level = req.Level + 1
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	classify.Sort = maxSort + 1
-	classify.Source = source
-
-	_, err = data_manage.AddChartClassify(classify)
+	// 新增图表分类
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_LINE_EQUATION, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存分类失败"
-		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "添加分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
+
 	br.Ret = 200
 	br.Msg = "添加成功"
 	br.Success = true
@@ -277,34 +249,15 @@ func (this *LineEquationChartClassifyController) EditChartClassify() {
 		return
 	}
 
-	item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	// 编辑图表分类
+	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_LINE_EQUATION, req.ChartClassifyName, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存失败"
-		br.Msg = "获取分类信息失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
 
-	source := utils.CHART_SOURCE_LINE_EQUATION
-	if item.ChartClassifyName != req.ChartClassifyName {
-		count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, source)
-		if err != nil {
-			br.Msg = "判断名称是否已存在失败"
-			br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-			return
-		}
-		if count > 0 {
-			br.Msg = "分类名称已存在,请重新输入"
-			br.IsSendEmail = false
-			return
-		}
-
-		err = data_manage.EditChartClassify(req.ChartClassifyId, source, req.ChartClassifyName)
-		if err != nil {
-			br.Msg = "保存失败"
-			br.ErrMsg = "保存失败,Err:" + err.Error()
-			return
-		}
-	}
 	br.Ret = 200
 	br.Msg = "修改成功"
 	br.Success = true

+ 123 - 2
controllers/data_manage/line_equation/line_chart_info.go

@@ -160,7 +160,7 @@ func (this *LineEquationChartInfoController) Save() {
 
 	resp := new(data_manage.AddChartInfoResp)
 	if req.MultipleGraphConfigId <= 0 {
-		batchAddChartList, err, errMsg, isSendEmail := line_equation.BatchAddChartInfo(req.BatchAddChart, req.ExtraConfig, sysUser)
+		batchAddChartList, err, errMsg, isSendEmail := line_equation.BatchAddChartInfo(req.BatchAddChart, req.ExtraConfig, sysUser, this.Lang)
 		if err != nil {
 			br.Msg = "保存失败"
 			if errMsg != `` {
@@ -1157,7 +1157,7 @@ func (this *LineEquationChartInfoController) Copy() {
 	})
 
 	resp := new(data_manage.AddChartInfoResp)
-	batchAddChartList, err, errMsg, isSendEmail := line_equation.BatchAddChartInfo(addChartList, lineChartInfoConf, sysUser)
+	batchAddChartList, err, errMsg, isSendEmail := line_equation.BatchAddChartInfo(addChartList, lineChartInfoConf, sysUser, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -1664,3 +1664,124 @@ func (this *LineEquationChartInfoController) SearchByEs() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// BaseInfoEdit
+// @Title 编辑图表基础信息接口
+// @Description 编辑图表基础信息接口
+// @Param	request	body data_manage.EditChartBaseInfoReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/base/edit [post]
+func (this *LineEquationChartInfoController) BaseInfoEdit() {
+	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
+	}
+	var req request.EditChartBaseInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartName == "" {
+		br.Msg = "请输入英文图表名称"
+		return
+	}
+
+	//判断指标名称是否存在
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,请刷新页面"
+			br.ErrMsg = "图表已被删除,请刷新页面"
+			return
+		}
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 校验名称是否有重复
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id <> ? AND source = ? "
+		pars = append(pars, req.ChartInfoId, utils.CHART_SOURCE_LINE_EQUATION)
+		switch this.Lang {
+		case utils.EnLangVersion:
+			condition += "  AND chart_name_en = ? "
+		default:
+			condition += " AND chart_name = ? "
+		}
+		pars = append(pars, req.ChartName)
+		existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "判断英文图表名称是否存在失败"
+				br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+				return
+			}
+		}
+		if err == nil && existItem.ChartInfoId > 0 {
+			br.Msg = existItem.ChartName + ":" + req.ChartName + "图表名称已存在"
+			return
+		}
+	}
+	switch this.Lang {
+	case utils.EnLangVersion:
+		chartItem.ChartNameEn = req.ChartName
+	default:
+		chartItem.ChartName = req.ChartName
+	}
+	chartItem.ModifyTime = time.Now().Local()
+	if e := chartItem.Update([]string{"ChartName", "ChartNameEn", "ModifyTime"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑拟合方程图表基础信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	// 清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		_ = utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		_ = utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}

+ 132 - 49
controllers/data_manage/line_feature/chart_info.go

@@ -623,7 +623,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				LeftMin:          fmt.Sprint(curveConf.LeftMin),
 				LeftMax:          fmt.Sprint(curveConf.LeftMax),
 			}
-			chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName)
+			chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName, this.Lang)
 		} else {
 			editChartReq := data_manage.EditChartInfoReq{
 				ChartInfoId:      multipleGraphConfigChartMapping.ChartInfoId,
@@ -638,7 +638,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				LeftMin:          fmt.Sprint(curveConf.LeftMin),
 				LeftMax:          fmt.Sprint(curveConf.LeftMax),
 			}
-			chartInfo, err, errMsg, isSendEmail = data.EditChartInfo(editChartReq, sysUser)
+			chartInfo, err, errMsg, isSendEmail = data.EditChartInfo(editChartReq, sysUser, this.Lang)
 			if err != nil {
 				br.Msg = "保存失败"
 				if errMsg != `` {
@@ -753,7 +753,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				RightMax:        fmt.Sprint(rightMaxVal),
 				ExtraConfig:     extraConfig,
 			}
-			chartInfo, err, errMsg, isSendEmail = lineFeatureServ.AddChartInfo(addChartReq, edbInfoMapping, chartSource, sysUser)
+			chartInfo, err, errMsg, isSendEmail = lineFeatureServ.AddChartInfo(addChartReq, edbInfoMapping, chartSource, sysUser, this.Lang)
 		} else {
 			editChartReq := data_manage.EditChartInfoReq{
 				ChartInfoId:     multipleGraphConfigChartMapping.ChartInfoId,
@@ -770,7 +770,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 				RightMax:        fmt.Sprint(rightMaxVal),
 				ExtraConfig:     extraConfig,
 			}
-			chartInfo, err, errMsg, isSendEmail = lineFeatureServ.EditChartInfo(editChartReq, edbInfoMapping, sysUser)
+			chartInfo, err, errMsg, isSendEmail = lineFeatureServ.EditChartInfo(editChartReq, edbInfoMapping, sysUser, this.Lang)
 			if err != nil {
 				br.Msg = "保存失败"
 				if errMsg != `` {
@@ -920,7 +920,7 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 			LeftMin:          fmt.Sprint(curveConf.LeftMin),
 			LeftMax:          fmt.Sprint(curveConf.LeftMax),
 		}
-		chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName)
+		chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName, this.Lang)
 	default:
 		if !utils.InArrayByInt([]int{utils.CHART_MULTIPLE_GRAPH_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_MULTIPLE_GRAPH_LINE_FEATURE_PERCENTILE, utils.CHART_MULTIPLE_GRAPH_LINE_FEATURE_FREQUENCY}, req.Source) {
 			br.Msg = "错误的来源"
@@ -929,7 +929,7 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 			return
 		}
 
-		chartInfo, err, errMsg, isSendEmail = lineFeatureServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.Source, req.ClassifyId, req.ChartName, edbInfoMapping, oldChartInfo, sysUser)
+		chartInfo, err, errMsg, isSendEmail = lineFeatureServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.Source, req.ClassifyId, req.ChartName, edbInfoMapping, oldChartInfo, sysUser, this.Lang)
 	}
 
 	if err != nil {
@@ -1114,7 +1114,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveEdb() {
 				br.ErrMsg = "参数解析失败,Err:" + err.Error()
 				return
 			}
-			respItem, err = data.BatchSaveEdbCalculateData(string(reqJson))
+			respItem, err = data.BatchSaveEdbCalculateData(string(reqJson), this.Lang)
 			if err != nil {
 				br.Msg = "新增失败"
 				br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -1140,7 +1140,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveEdb() {
 				br.ErrMsg = "参数解析失败,Err:" + err.Error()
 				return
 			}
-			respItem, err = data.BatchEditEdbCalculateData(string(reqJson))
+			respItem, err = data.BatchEditEdbCalculateData(string(reqJson), this.Lang)
 			if err != nil {
 				br.Msg = "编辑失败"
 				br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -1170,7 +1170,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveEdb() {
 			br.ErrMsg = "参数解析失败,Err:" + err.Error()
 			return
 		}
-		respItem, err = data.BatchSavePredictEdbData(string(reqJson))
+		respItem, err = data.BatchSavePredictEdbData(string(reqJson), this.Lang)
 		if err != nil {
 			br.Msg = "新增失败"
 			br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -2252,7 +2252,7 @@ func (this *LineFeaturesChartInfoController) Copy() {
 	edbInfoMapping := edbMappingList[0]
 
 	// 批量设置图
-	chartInfo, err, errMsg, isSendEmail := lineFeatureServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, multipleGraphConfigChartMapping.Source, req.ChartClassifyId, req.ChartName, edbInfoMapping, oldChartInfo, sysUser)
+	chartInfo, err, errMsg, isSendEmail := lineFeatureServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, multipleGraphConfigChartMapping.Source, req.ChartClassifyId, req.ChartName, edbInfoMapping, oldChartInfo, sysUser, this.Lang)
 
 	if err != nil {
 		br.Msg = "复制失败"
@@ -2797,42 +2797,125 @@ func (this *LineFeaturesChartInfoController) SearchByEs() {
 	br.Data = resp
 }
 
-// fix 统计分析/统计特征的标准差、百分位图表时间范围与曲线图一致
-//func init() {
-//	condition := ` AND source in (7,8) `
-//	list, err := data_manage.GetChartInfoListByCondition(condition, []interface{}{}, 0, 1000)
-//	if err != nil {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//
-//	for _, v := range list {
-//		item, tmpErr := data_manage.GetMultipleGraphConfigChartMappingByChartId(v.ChartInfoId)
-//		if tmpErr != nil {
-//			fmt.Println("tmpErr:", tmpErr)
-//			continue
-//		}
-//
-//		multipleGraphConfig, e := data_manage.GetMultipleGraphConfigById(item.MultipleGraphConfigId)
-//		if e != nil {
-//			fmt.Println("获取批量配置信息失败:", e)
-//			continue
-//		}
-//
-//		var configSave request.ConfigSave
-//		err = json.Unmarshal([]byte(multipleGraphConfig.Curve), &configSave)
-//		if err != nil {
-//			fmt.Println("格式化配置项失败,Err:" + err.Error())
-//			return
-//		}
-//
-//		v.StartDate = configSave.Curve.StartDate
-//		v.EndDate = configSave.Curve.EndDate
-//		v.DateType = configSave.Curve.DateType
-//		err = v.Update([]string{"StartDate", "EndDate", "DateType"})
-//
-//		if err != nil {
-//			fmt.Println(v.ChartInfoId, "修复历史数据失败:", err)
-//		}
-//	}
-//}
+// BaseInfoEdit
+// @Title 编辑图表基础信息接口
+// @Description 编辑图表基础信息接口
+// @Param	request	body data_manage.EditChartInfoBaseReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/base/edit [post]
+func (this *LineFeaturesChartInfoController) BaseInfoEdit() {
+	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
+	}
+	var req request.EditChartInfoBaseReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartName == "" {
+		br.Msg = "请输入英文图表名称"
+		return
+	}
+
+	//判断指标名称是否存在
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,请刷新页面"
+			br.ErrMsg = "图表已被删除,请刷新页面"
+			return
+		}
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 校验名称是否有重复
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id <> ? AND source in (?,?,?) "
+		pars = append(pars, req.ChartInfoId, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY)
+
+		switch this.Lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? "
+		default:
+			condition += " AND chart_name = ? "
+		}
+		pars = append(pars, req.ChartName)
+		existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "判断英文图表名称是否存在失败"
+				br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+				return
+			}
+		}
+		if err == nil && existItem.ChartInfoId > 0 {
+			br.Msg = existItem.ChartName + ":" + req.ChartName + "图表名称已存在"
+			return
+		}
+	}
+
+	switch this.Lang {
+	case utils.EnLangVersion:
+		chartItem.ChartNameEn = req.ChartName
+	default:
+		chartItem.ChartName = req.ChartName
+	}
+	chartItem.ModifyTime = time.Now().Local()
+	if e := chartItem.Update([]string{"ChartName", "ChartNameEn", "ModifyTime"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑统计特征图表基础信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	// 清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		_ = utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		_ = utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}

+ 11 - 58
controllers/data_manage/line_feature/classify.go

@@ -8,7 +8,6 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
-	"strconv"
 	"time"
 )
 
@@ -205,42 +204,15 @@ func (this *LineFeaturesChartClassifyController) AddChartClassify() {
 		return
 	}
 
-	source := utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION
-	count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, req.ParentId, source)
-	if err != nil {
-		br.Msg = "判断名称是否已存在失败"
-		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-		return
-	}
-	if count > 0 {
-		br.Msg = "分类名称已存在,请重新输入"
-		br.IsSendEmail = false
-		return
-	}
-	//获取该层级下最大的排序数
-	maxSort, err := data_manage.GetChartClassifyMaxSort(req.ParentId, source)
-
-	classify := new(data_manage.ChartClassify)
-	//classify.ParentId = req.ParentId
-	classify.ParentId = 0
-	classify.ChartClassifyName = req.ChartClassifyName
-	classify.HasData = 0
-	classify.CreateTime = time.Now()
-	classify.ModifyTime = time.Now()
-	classify.SysUserId = this.SysUser.AdminId
-	classify.SysUserRealName = this.SysUser.RealName
-	classify.Level = req.Level + 1
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-	classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	classify.Sort = maxSort + 1
-	classify.Source = source
-
-	_, err = data_manage.AddChartClassify(classify)
+	// 新增图表分类
+	_, err, errMsg, isSendEmail := data.AddChartClassify(req.ChartClassifyName, req.ParentId, req.Level, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存分类失败"
-		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "添加分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
+
 	br.Ret = 200
 	br.Msg = "添加成功"
 	br.Success = true
@@ -277,34 +249,15 @@ func (this *LineFeaturesChartClassifyController) EditChartClassify() {
 		return
 	}
 
-	item, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	// 编辑图表分类
+	_, err, errMsg, isSendEmail := data.EditChartClassify(req.ChartClassifyId, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, req.ChartClassifyName, this.Lang, this.SysUser)
 	if err != nil {
-		br.Msg = "保存失败"
-		br.Msg = "获取分类信息失败,Err:" + err.Error()
+		br.Msg = errMsg
+		br.ErrMsg = "保存分类失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
 		return
 	}
 
-	source := utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION
-	if item.ChartClassifyName != req.ChartClassifyName {
-		count, err := data_manage.GetChartClassifyCount(req.ChartClassifyName, item.ParentId, source)
-		if err != nil {
-			br.Msg = "判断名称是否已存在失败"
-			br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
-			return
-		}
-		if count > 0 {
-			br.Msg = "分类名称已存在,请重新输入"
-			br.IsSendEmail = false
-			return
-		}
-
-		err = data_manage.EditChartClassify(req.ChartClassifyId, source, req.ChartClassifyName)
-		if err != nil {
-			br.Msg = "保存失败"
-			br.ErrMsg = "保存失败,Err:" + err.Error()
-			return
-		}
-	}
 	br.Ret = 200
 	br.Msg = "修改成功"
 	br.Success = true

+ 8 - 8
controllers/data_manage/multiple_graph_config.go

@@ -745,7 +745,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 				Right2Min:        fmt.Sprint(curveConf.Right2Min),
 				Right2Max:        fmt.Sprint(curveConf.Right2Max),
 			}
-			chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName)
+			chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName, this.Lang)
 		} else {
 			editChartReq := data_manage.EditChartInfoReq{
 				ChartInfoId:      multipleGraphConfigChartMapping.ChartInfoId,
@@ -765,7 +765,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 				Right2Min:        fmt.Sprint(curveConf.Right2Min),
 				Right2Max:        fmt.Sprint(curveConf.Right2Max),
 			}
-			chartInfo, err, errMsg, isSendEmail = data.EditChartInfo(editChartReq, sysUser)
+			chartInfo, err, errMsg, isSendEmail = data.EditChartInfo(editChartReq, sysUser, this.Lang)
 			if err != nil {
 				br.Msg = "保存失败"
 				if errMsg != `` {
@@ -851,7 +851,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 					Calendar:             "公历",
 					CorrelationChartInfo: correlationChartInfoReq,
 				}
-				chartInfo, err, errMsg, isSendEmail = correlationServ.AddChartInfo(addChartReq, chartSource, sysUser)
+				chartInfo, err, errMsg, isSendEmail = correlationServ.AddChartInfo(addChartReq, chartSource, sysUser, this.Lang)
 			} else {
 				editChartReq := data_manage.EditChartInfoReq{
 					ChartInfoId:          multipleGraphConfigChartMapping.ChartInfoId,
@@ -861,7 +861,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 					Calendar:             "公历",
 					CorrelationChartInfo: correlationChartInfoReq,
 				}
-				chartInfo, err, errMsg, isSendEmail = correlationServ.EditChartInfo(editChartReq, sysUser)
+				chartInfo, err, errMsg, isSendEmail = correlationServ.EditChartInfo(editChartReq, sysUser, this.Lang)
 				if err != nil {
 					br.Msg = "保存失败"
 					if errMsg != `` {
@@ -1051,7 +1051,7 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 			RightMin:         fmt.Sprint(curveConf.RightMin),
 			RightMax:         fmt.Sprint(curveConf.RightMax),
 		}
-		chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName)
+		chartInfo, err, errMsg, isSendEmail = data.AddChartInfo(addChartReq, sysUser.AdminId, sysUser.RealName, this.Lang)
 
 	case 2: // 相关性图
 		correlationConf := req.Correlation
@@ -1092,7 +1092,7 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 				},
 			}
 
-			chartInfo, err, errMsg, isSendEmail = correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ClassifyId, req.ChartName, correlationChartInfoReq, oldChartInfo, sysUser)
+			chartInfo, err, errMsg, isSendEmail = correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ClassifyId, req.ChartName, correlationChartInfoReq, oldChartInfo, sysUser, this.Lang)
 		}
 	default:
 		br.Msg = "错误的来源"
@@ -1309,7 +1309,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveEdb() {
 			br.ErrMsg = "参数解析失败,Err:" + err.Error()
 			return
 		}
-		respItem, err = data.BatchSaveEdbCalculateData(string(reqJson))
+		respItem, err = data.BatchSaveEdbCalculateData(string(reqJson), this.Lang)
 		if err != nil {
 			br.Msg = "新增失败"
 			br.ErrMsg = "新增失败,Err:" + err.Error()
@@ -1335,7 +1335,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveEdb() {
 			br.ErrMsg = "参数解析失败,Err:" + err.Error()
 			return
 		}
-		respItem, err = data.BatchEditEdbCalculateData(string(reqJson))
+		respItem, err = data.BatchEditEdbCalculateData(string(reqJson), this.Lang)
 		if err != nil {
 			br.Msg = "编辑失败"
 			br.ErrMsg = "编辑失败,Err:" + err.Error()

+ 3 - 5
controllers/data_manage/mysteel_chemical_data.go

@@ -158,7 +158,7 @@ func (this *EdbClassifyController) AddMysteelChemicalClassify() {
 	req.ClassifyName = strings.Replace(req.ClassifyName, "/t", "", -1)
 
 	//添加指标
-	mysteelChemicalClassifyInfo, err, errMsg := data.AddMysteelChemicalClassify(req.ClassifyName, req.ParentId, req.Level, this.SysUser.AdminId, this.SysUser.RealName)
+	mysteelChemicalClassifyInfo, err, errMsg := data.AddMysteelChemicalClassify(req.ClassifyName, req.ParentId, req.Level, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -174,7 +174,7 @@ func (this *EdbClassifyController) AddMysteelChemicalClassify() {
 	if mysteelChemicalClassifyInfo.ParentId == 0 {
 		secondClassifyList := []string{"价格", "供应", "需求", "库存"}
 		for _, v := range secondClassifyList {
-			_, _, tmpErrMsg := data.AddMysteelChemicalClassify(v, mysteelChemicalClassifyInfo.BaseFromMysteelChemicalClassifyId, mysteelChemicalClassifyInfo.Level, this.SysUser.AdminId, this.SysUser.RealName)
+			_, _, tmpErrMsg := data.AddMysteelChemicalClassify(v, mysteelChemicalClassifyInfo.BaseFromMysteelChemicalClassifyId, mysteelChemicalClassifyInfo.Level, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 			if tmpErrMsg != `` {
 				go alarm_msg.SendAlarmMsg("钢联化工-添加一级分类时,默认添加二级分类失败,一级分类名称:"+req.ClassifyName+",二级分类名称:"+v+", Err:"+tmpErrMsg, 3)
 				return
@@ -223,7 +223,7 @@ func (this *EdbClassifyController) EditMysteelChemicalClassify() {
 		return
 	}
 
-	err, errMsg := data.EditMysteelChemicalClassify(req.BaseFromMysteelChemicalClassifyId, req.ClassifyName, this.SysUser)
+	err, errMsg := data.EditMysteelChemicalClassify(req.BaseFromMysteelChemicalClassifyId, req.ClassifyName, this.Lang, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -879,8 +879,6 @@ func (this *EdbClassifyController) AddMysteelChemical() {
 		}
 	}
 
-
-
 	br.Data = resp
 	br.Ret = 200
 	br.Msg = "保存成功"

+ 2 - 2
controllers/data_manage/predict_edb_classify.go

@@ -211,7 +211,7 @@ func (this *PredictEdbClassifyController) Add() {
 	}
 
 	// 添加指标分类
-	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 1, this.SysUser.AdminId, this.SysUser.AdminName)
+	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 1, this.SysUser.AdminId, this.SysUser.AdminName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -259,7 +259,7 @@ func (this *PredictEdbClassifyController) Edit() {
 		return
 	}
 
-	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
+	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.Lang, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg

+ 5 - 5
controllers/data_manage/predict_edb_info.go

@@ -582,7 +582,7 @@ func (this *PredictEdbInfoController) Add() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.SaveBasePredictEdbData(string(reqJson))
+	respItem, err := data.SaveBasePredictEdbData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -784,7 +784,7 @@ func (this *PredictEdbInfoController) Edit() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.SaveBasePredictEdbData(string(reqJson))
+	respItem, err := data.SaveBasePredictEdbData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -1106,7 +1106,7 @@ func (this *PredictEdbInfoController) Detail() {
 			}
 
 			// 计算
-			val, err, _ := data.CallCalculateComputeCorrelation(req2)
+			val, err, _ := data.CallCalculateComputeCorrelation(req2, this.Lang)
 			if err == nil {
 				correlationStr = val
 			}
@@ -1684,7 +1684,7 @@ func (this *PredictEdbInfoController) ChartDataList() {
 				return
 			}*/
 			reqJson, err := json.Marshal(v)
-			respItem, err := data.PredictCalculateByNinePreview(string(reqJson))
+			respItem, err := data.PredictCalculateByNinePreview(string(reqJson), this.Lang)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -1855,7 +1855,7 @@ func (this *PredictEdbInfoController) PredictRuleCalculateByNine() {
 		return
 	}
 
-	respItem, err := data.PredictCalculateByNinePreview(string(reqJson))
+	respItem, err := data.PredictCalculateByNinePreview(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()

+ 4 - 4
controllers/data_manage/predict_edb_info_calculate.go

@@ -112,7 +112,7 @@ func (this *PredictEdbInfoController) CalculateSave() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.SavePredictEdbData(string(reqJson))
+	respItem, err := data.SavePredictEdbData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -196,7 +196,7 @@ func (this *PredictEdbInfoController) CalculateBatchSave() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.BatchSavePredictEdbData(string(reqJson))
+	respItem, err := data.BatchSavePredictEdbData(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -330,7 +330,7 @@ func (this *PredictEdbInfoController) BatchCalculateBatchSave() {
 			br.ErrMsg = "参数解析失败,Err:" + err.Error()
 			return
 		}
-		respItem, err := data.BatchSavePredictEdbData(string(reqJson))
+		respItem, err := data.BatchSavePredictEdbData(string(reqJson), this.Lang)
 		if err != nil {
 			resp.Fail = append(resp.Fail, data_manage.BatchEdbInfoCalculateBatchSaveFailResp{
 				CalculateId: v.CalculateId,
@@ -406,7 +406,7 @@ func (this *PredictEdbInfoController) CalculateComputeCorrelation() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	respItem, err := data.PredictCalculateComputeCorrelation(string(reqJson))
+	respItem, err := data.PredictCalculateComputeCorrelation(string(reqJson), this.Lang)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()

+ 15 - 14
controllers/data_manage/sci_data.go

@@ -2,23 +2,23 @@ package data_manage
 
 import (
 	"encoding/json"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/tealeg/xlsx"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
 	"strings"
 	"time"
 )
 
-// @Title 有色数据分类
-// @Description 有色数据分类接口
+// @Title 卓创(红桃3)数据分类
+// @Description 卓创(红桃3)数据分类接口
 // @Success 200 {object} data_manage.SciClassify
 // @router /sci/classify [get]
 func (this *EdbInfoController) SciClassify() {
@@ -88,6 +88,7 @@ func (this *EdbInfoController) SciClassify() {
 		ClassifyId:         0,
 		BaseFromSciIndexId: 0,
 		ClassifyName:       "未分类",
+		ClassifyNameEn:     "Unclassified",
 		ParentId:           0,
 		Level:              1,
 		Sort:               0,
@@ -124,8 +125,8 @@ func (this *EdbInfoController) SciClassify() {
 }
 
 // SciClassifyName
-// @Title 有色数据分类名称查询
-// @Description 有色数据分类名称查询接口
+// @Title 卓创(红桃3)数据分类名称查询
+// @Description 卓创(红桃3)数据分类名称查询接口
 // @Success 200 {object} data_manage.SciClassify
 // @router /sci/classify/name [get]
 func (this *EdbInfoController) SciClassifyName() {
@@ -219,7 +220,7 @@ func (this *EdbInfoController) AddSciClassify() {
 	req.ClassifyName = strings.Replace(req.ClassifyName, "/t", "", -1)
 
 	//添加指标
-	sciClassifyInfo, err, errMsg := data.AddSciClassify(req.ClassifyName, req.ParentId, this.SysUser.AdminId, this.SysUser.RealName)
+	sciClassifyInfo, err, errMsg := data.AddSciClassify(req.ClassifyName, req.ParentId, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -235,7 +236,7 @@ func (this *EdbInfoController) AddSciClassify() {
 	if sciClassifyInfo.ParentId == 0 {
 		secondClassifyList := []string{"价格", "供应", "需求", "库存"}
 		for _, v := range secondClassifyList {
-			_, _, tmpErrMsg := data.AddSciClassify(v, sciClassifyInfo.ClassifyId, this.SysUser.AdminId, this.SysUser.RealName)
+			_, _, tmpErrMsg := data.AddSciClassify(v, sciClassifyInfo.ClassifyId, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 			if tmpErrMsg != `` {
 				go alarm_msg.SendAlarmMsg("SCI原始数据-添加一级分类时,默认添加二级分类失败,一级分类名称:"+req.ClassifyName+",二级分类名称:"+v+", Err:"+tmpErrMsg, 3)
 				return
@@ -284,7 +285,7 @@ func (this *EdbInfoController) EditSciClassify() {
 		return
 	}
 
-	err, errMsg := data.EditSciClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
+	err, errMsg := data.EditSciClassify(req.ClassifyId, req.ClassifyName, this.Lang, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -302,8 +303,8 @@ func (this *EdbInfoController) EditSciClassify() {
 	br.IsAddLog = true
 }
 
-// @Title 有色数据频度
-// @Description 有色数据频度接口
+// @Title 卓创(红桃3)数据频度
+// @Description 卓创(红桃3)数据频度接口
 // @Param   ClassifyId   query   string  true       "分类Id"
 // @Success 200 {object} data_manage.LzFrequency
 // @router /sci/frequency [get]
@@ -495,8 +496,8 @@ func (this *EdbInfoController) MoveSciData() {
 }
 
 // EditSci
-// @Title 编辑有色指标
-// @Description 编辑有色指标接口
+// @Title 编辑卓创(红桃3)指标
+// @Description 编辑卓创(红桃3)指标接口
 // @Param	request	body data_manage.AddEdbClassifyReq true "type json string"
 // @Success 200 Ret=200 保存成功
 // @router /sci/edit [post]

+ 4 - 3
controllers/data_manage/smm_data.go

@@ -88,6 +88,7 @@ func (this *EdbInfoController) SmmClassify() {
 		ClassifyId:         0,
 		BaseFromSmmIndexId: 0,
 		ClassifyName:       "未分类",
+		ClassifyNameEn:     "Unclassified",
 		ParentId:           0,
 		Level:              1,
 		Sort:               0,
@@ -268,7 +269,7 @@ func (this *EdbInfoController) AddSmmClassify() {
 	req.ClassifyName = strings.Replace(req.ClassifyName, "/t", "", -1)
 
 	//添加指标
-	smmClassifyInfo, err, errMsg := data.AddSmmClassify(req.ClassifyName, req.ParentId, this.SysUser.AdminId, this.SysUser.RealName)
+	smmClassifyInfo, err, errMsg := data.AddSmmClassify(req.ClassifyName, req.ParentId, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -284,7 +285,7 @@ func (this *EdbInfoController) AddSmmClassify() {
 	if smmClassifyInfo.ParentId == 0 {
 		secondClassifyList := []string{"价格", "供应", "需求", "库存"}
 		for _, v := range secondClassifyList {
-			_, _, tmpErrMsg := data.AddSmmClassify(v, smmClassifyInfo.ClassifyId, this.SysUser.AdminId, this.SysUser.RealName)
+			_, _, tmpErrMsg := data.AddSmmClassify(v, smmClassifyInfo.ClassifyId, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 			if tmpErrMsg != `` {
 				go alarm_msg.SendAlarmMsg("SMM原始数据-添加一级分类时,默认添加二级分类失败,一级分类名称:"+req.ClassifyName+",二级分类名称:"+v+", Err:"+tmpErrMsg, 3)
 				return
@@ -333,7 +334,7 @@ func (this *EdbInfoController) EditSmmClassify() {
 		return
 	}
 
-	err, errMsg := data.EditSmmClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
+	err, errMsg := data.EditSmmClassify(req.ClassifyId, req.ClassifyName, this.Lang, this.SysUser)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg

+ 1 - 1
controllers/data_manage/supply_analysis/variety_edb.go

@@ -248,7 +248,7 @@ func (this *VarietyController) AddToEdb() {
 	prefixCode := "HZ_V"
 	suffixCode := time.Now().Format("060102") + randStr
 	edbCode := fmt.Sprint(prefixCode, varietyEdbInfo.Source, suffixCode)
-	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(utils.DATA_SOURCE_STOCK_PLANT, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, edbCode, req.EdbName, req.Frequency, req.Unit, varietyEdbInfo.StartDate.Format(utils.FormatDate), varietyEdbInfo.EndDate.Format(utils.FormatDate), sysUser.AdminId, sysUser.RealName)
+	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(utils.DATA_SOURCE_STOCK_PLANT, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, edbCode, req.EdbName, req.Frequency, req.Unit, varietyEdbInfo.StartDate.Format(utils.FormatDate), varietyEdbInfo.EndDate.Format(utils.FormatDate), sysUser.AdminId, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {

+ 32 - 1
models/data_manage/base_from_baiinfo_classify.go

@@ -1,9 +1,9 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"eta/eta_api/utils"
 	"time"
 )
 
@@ -18,6 +18,7 @@ type BaseFromBaiinfoClassify struct {
 	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
 	ModifyTime      time.Time `description:"修改时间"`
 	CreateTime      time.Time `description:"创建时间"`
+	ClassifyNameEn  string    `description:"英文分类名称"`
 }
 
 // AddBaseFromBaiinfoClassify 添加SMM原始数据分类
@@ -35,6 +36,21 @@ func GetBaseFromBaiinfoClassifyCount(classifyName string, parentId int) (count i
 	return
 }
 
+// GetBaseFromBaiinfoClassifyEnCount
+// @Description: 获取英文分类名称的个数
+// @author: Roc
+// @datetime 2024-04-16 16:54:05
+// @param classifyNameEn string
+// @param parentId int
+// @return count int
+// @return err error
+func GetBaseFromBaiinfoClassifyEnCount(classifyNameEn string, parentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM base_from_baiinfo_classify WHERE classify_name_en = ? AND parent_id=? `
+	err = o.Raw(sql, classifyNameEn, parentId).QueryRow(&count)
+	return
+}
+
 // GetBaseFromBaiinfoClassifyById 通过分类id的获取分类信息
 func GetBaseFromBaiinfoClassifyById(classifyId int) (item *BaseFromBaiinfoClassify, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -51,6 +67,20 @@ func EditBaseFromBaiinfoClassify(classifyId int, classifyName string) (err error
 	return
 }
 
+// EditBaseFromBaiinfoClassifyEn
+// @Description: 修改SMM原始数据英文分类
+// @author: Roc
+// @datetime 2024-04-16 16:54:39
+// @param classifyId int
+// @param classifyNameEn string
+// @return err error
+func EditBaseFromBaiinfoClassifyEn(classifyId int, classifyNameEn string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_baiinfo_classify SET classify_name_en = ?,modify_time=NOW() WHERE classify_id=? `
+	_, err = o.Raw(sql, classifyNameEn, classifyId).Exec()
+	return
+}
+
 // UpdateBaseFromBaiinfoClassifySort 修改SMM原始数据分类的排序
 func UpdateBaseFromBaiinfoClassifySort(classifyId int) (err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -64,6 +94,7 @@ type BaseFromBaiinfoClassifyItems struct {
 	BaseFromBaiinfoIndexId   int    `description:"指标类型ID"`
 	BaseFromBaiinfoIndexCode string `description:"指标唯一编码"`
 	ClassifyName             string `description:"分类名称"`
+	ClassifyNameEn           string `description:"英文分类名称"`
 	ParentId                 int    `description:"父级id"`
 	Level                    int    `description:"层级"`
 	Sort                     int    `description:"排序字段,越小越靠前,默认值:10"`

+ 31 - 0
models/data_manage/base_from_sci_classify.go

@@ -18,6 +18,7 @@ type BaseFromSciClassify struct {
 	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
 	ModifyTime      time.Time `description:"修改时间"`
 	CreateTime      time.Time `description:"创建时间"`
+	ClassifyNameEn  string    `description:"英文分类名称"`
 }
 
 // AddBaseFromSciClassify 添加SMM原始数据分类
@@ -35,6 +36,21 @@ func GetBaseFromSciClassifyCount(classifyName string, parentId int) (count int,
 	return
 }
 
+// GetBaseFromSciClassifyEnCount
+// @Description: 获取英文分类名称的个数
+// @author: Roc
+// @datetime 2024-04-16 16:56:14
+// @param classifyNameEn string
+// @param parentId int
+// @return count int
+// @return err error
+func GetBaseFromSciClassifyEnCount(classifyNameEn string, parentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM base_from_sci_classify WHERE classify_name_en=? AND parent_id=? `
+	err = o.Raw(sql, classifyNameEn, parentId).QueryRow(&count)
+	return
+}
+
 // GetBaseFromSciClassifyById 通过分类id的获取分类信息
 func GetBaseFromSciClassifyById(classifyId int) (item *BaseFromSciClassify, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -51,6 +67,20 @@ func EditBaseFromSciClassify(classifyId int, classifyName string) (err error) {
 	return
 }
 
+// EditBaseFromSciClassifyEn
+// @Description: 修改卓创(红桃3)数据英文分类
+// @author: Roc
+// @datetime 2024-04-16 16:56:42
+// @param classifyId int
+// @param classifyNameEn string
+// @return err error
+func EditBaseFromSciClassifyEn(classifyId int, classifyNameEn string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_sci_classify SET classify_name_en = ?,modify_time=NOW() WHERE classify_id=? `
+	_, err = o.Raw(sql, classifyNameEn, classifyId).Exec()
+	return
+}
+
 // UpdateBaseFromSciClassifySort 修改SMM原始数据分类的排序
 func UpdateBaseFromSciClassifySort(classifyId int) (err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -64,6 +94,7 @@ type BaseFromSciClassifyItems struct {
 	BaseFromSciIndexId   int    `description:"指标类型ID"`
 	BaseFromSciIndexCode string `description:"指标唯一编码"`
 	ClassifyName         string `description:"分类名称"`
+	ClassifyNameEn       string `description:"英文分类名称"`
 	ParentId             int    `description:"父级id"`
 	Level                int    `description:"层级"`
 	Sort                 int    `description:"排序字段,越小越靠前,默认值:10"`

+ 31 - 0
models/data_manage/base_from_smm_classify.go

@@ -18,6 +18,7 @@ type BaseFromSmmClassify struct {
 	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
 	ModifyTime      time.Time `description:"修改时间"`
 	CreateTime      time.Time `description:"创建时间"`
+	ClassifyNameEn  string    `description:"英文分类名称"`
 }
 
 // AddBaseFromSmmClassify 添加SMM原始数据分类
@@ -35,6 +36,21 @@ func GetBaseFromSmmClassifyCount(classifyName string, parentId int) (count int,
 	return
 }
 
+// GetBaseFromSmmClassifyEnCount
+// @Description: 获取英文分类名称的个数
+// @author: Roc
+// @datetime 2024-04-16 16:49:03
+// @param classifyNameEn string
+// @param parentId int
+// @return count int
+// @return err error
+func GetBaseFromSmmClassifyEnCount(classifyNameEn string, parentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM base_from_smm_classify WHERE classify_name_en = ? AND parent_id = ? `
+	err = o.Raw(sql, classifyNameEn, parentId).QueryRow(&count)
+	return
+}
+
 // GetBaseFromSmmClassifyById 通过分类id的获取分类信息
 func GetBaseFromSmmClassifyById(classifyId int) (item *BaseFromSmmClassify, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -51,6 +67,20 @@ func EditBaseFromSmmClassify(classifyId int, classifyName string) (err error) {
 	return
 }
 
+// EditBaseFromSmmClassifyEn
+// @Description: 修改SMM原始数据英文分类
+// @author: Roc
+// @datetime 2024-04-16 16:50:55
+// @param classifyId int
+// @param classifyNameEn string
+// @return err error
+func EditBaseFromSmmClassifyEn(classifyId int, classifyNameEn string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_smm_classify SET classify_name_en = ?,modify_time=NOW() WHERE classify_id=? `
+	_, err = o.Raw(sql, classifyNameEn, classifyId).Exec()
+	return
+}
+
 // UpdateBaseFromSmmClassifySort 修改SMM原始数据分类的排序
 func UpdateBaseFromSmmClassifySort(classifyId int) (err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -64,6 +94,7 @@ type BaseFromSmmClassifyItems struct {
 	BaseFromSmmIndexId   int    `description:"指标类型ID"`
 	BaseFromSmmIndexCode string `description:"指标唯一编码"`
 	ClassifyName         string `description:"分类名称"`
+	ClassifyNameEn       string `description:"英文分类名称"`
 	ParentId             int    `description:"父级id"`
 	Level                int    `description:"层级"`
 	Sort                 int    `description:"排序字段,越小越靠前,默认值:10"`

+ 67 - 13
models/data_manage/chart_classify.go

@@ -8,24 +8,30 @@ import (
 )
 
 type ChartClassify struct {
-	ChartClassifyId   int       `orm:"column(chart_classify_id);pk"`
-	ChartClassifyName string    `description:"分类名称"`
-	ParentId          int       `description:"父级id"`
-	HasData           int       `description:"是否含有指标数据"`
-	CreateTime        time.Time `description:"创建时间"`
-	ModifyTime        time.Time `description:"修改时间"`
-	SysUserId         int       `description:"创建人id"`
-	SysUserRealName   string    `description:"创建人姓名"`
-	Level             int       `description:"层级"`
-	UniqueCode        string    `description:"唯一编码"`
-	Sort              int       `description:"排序字段,越小越靠前,默认值:10"`
-	Source            int       `description:"1:ETA图库;2:商品价格曲线"`
-	IsJoinPermission  int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ChartClassifyId     int       `orm:"column(chart_classify_id);pk"`
+	ChartClassifyName   string    `description:"分类名称"`
+	ParentId            int       `description:"父级id"`
+	HasData             int       `description:"是否含有指标数据"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	SysUserId           int       `description:"创建人id"`
+	SysUserRealName     string    `description:"创建人姓名"`
+	Level               int       `description:"层级"`
+	UniqueCode          string    `description:"唯一编码"`
+	Sort                int       `description:"排序字段,越小越靠前,默认值:10"`
+	Source              int       `description:"1:ETA图库;2:商品价格曲线"`
+	IsJoinPermission    int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ChartClassifyNameEn string    `description:"英文分类名称"`
 }
 
 func AddChartClassify(item *ChartClassify) (lastId int64, err error) {
 	o := orm.NewOrmUsingDB("data")
 	lastId, err = o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.ChartClassifyId = int(lastId)
+
 	return
 }
 
@@ -35,6 +41,15 @@ type AddChartClassifyReq struct {
 	Level             int    `description:"层级,第一级传0,其余传上一级的层级"`
 }
 
+// GetChartClassifyCount
+// @Description: 根据图表分类名称获取对应的数量
+// @author: Roc
+// @datetime 2024-04-16 18:13:40
+// @param chartClassifyName string
+// @param parentId int
+// @param source int
+// @return count int
+// @return err error
 func GetChartClassifyCount(chartClassifyName string, parentId, source int) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) AS count FROM chart_classify WHERE parent_id=? AND source = ? AND chart_classify_name=? `
@@ -42,6 +57,22 @@ func GetChartClassifyCount(chartClassifyName string, parentId, source int) (coun
 	return
 }
 
+// GetChartClassifyEnCount
+// @Description: 根据图表分类英文名称获取对应的数量
+// @author: Roc
+// @datetime 2024-04-16 18:13:24
+// @param chartClassifyNameEn string
+// @param parentId int
+// @param source int
+// @return count int
+// @return err error
+func GetChartClassifyEnCount(chartClassifyNameEn string, parentId, source int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM chart_classify WHERE parent_id=? AND source = ? AND chart_classify_name_en = ? `
+	err = o.Raw(sql, parentId, source, chartClassifyNameEn).QueryRow(&count)
+	return
+}
+
 type EditChartClassifyReq struct {
 	ChartClassifyName string `description:"分类名称"`
 	ChartClassifyId   int    `description:"分类id"`
@@ -61,6 +92,14 @@ func GetChartClassifyCountById(classifyId int) (count int, err error) {
 	return
 }
 
+// EditChartClassify
+// @Description: 修改图表分类的名称
+// @author: Roc
+// @datetime 2024-04-16 18:12:51
+// @param classifyId int
+// @param source int
+// @param chartClassifyName string
+// @return err error
 func EditChartClassify(classifyId, source int, chartClassifyName string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `UPDATE chart_classify SET chart_classify_name=?,modify_time=NOW() WHERE chart_classify_id=? AND source = ? `
@@ -68,6 +107,21 @@ func EditChartClassify(classifyId, source int, chartClassifyName string) (err er
 	return
 }
 
+// EditChartClassifyEn
+// @Description: 修改图表分类的英文名称
+// @author: Roc
+// @datetime 2024-04-16 18:12:40
+// @param classifyId int
+// @param source int
+// @param chartClassifyNameEn string
+// @return err error
+func EditChartClassifyEn(classifyId, source int, chartClassifyNameEn string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE chart_classify SET chart_classify_name_en = ?,modify_time=NOW() WHERE chart_classify_id=? AND source = ? `
+	_, err = o.Raw(sql, chartClassifyNameEn, classifyId, source).Exec()
+	return
+}
+
 type DeleteChartClassifyReq struct {
 	ChartClassifyId int `description:"分类id"`
 	ChartInfoId     int `description:"指标id"`

+ 114 - 2
models/data_manage/chart_info.go

@@ -13,7 +13,7 @@ import (
 
 type ChartInfo struct {
 	ChartInfoId       int    `orm:"column(chart_info_id);pk"`
-	ChartName         string `description:"来源名称"`
+	ChartName         string `description:"图表名称"`
 	ChartNameEn       string `description:"英文图表名称"`
 	ChartClassifyId   int    `description:"图表分类id"`
 	SysUserId         int
@@ -84,7 +84,7 @@ func GetChartInfoAll(sourceList []int) (items []*ChartClassifyItems, err error)
 	}
 
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
+	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,chart_name_en AS chart_classify_name_en,
              unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date,source
             FROM chart_info WHERE source in (` + utils.GetOrmInReplace(num) + `)  ORDER BY sort asc,chart_info_id ASC `
 	_, err = o.Raw(sql, sourceList).QueryRows(&items)
@@ -231,6 +231,7 @@ func GetChartInfoCountByCondition(condition string, pars []interface{}) (count i
 type EditChartInfoReq struct {
 	ChartInfoId          int                     `description:"图表ID"`
 	ChartName            string                  `description:"图表名称"`
+	ChartNameEn          string                  `description:"英文图表名称"`
 	ChartClassifyId      int                     `description:"分类id"`
 	ChartEdbInfoList     []*ChartSaveItem        `description:"指标及配置信息"`
 	ChartType            int                     `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图,10:截面散点图"`
@@ -271,6 +272,20 @@ type EditChartEnInfoEdbItem struct {
 	UnitEn    string `description:"英文单位"`
 }
 
+// EditChartInfoBaseReq
+// @Description: 图表基础信息修改
+type EditChartInfoBaseReq struct {
+	ChartInfoId      int                         `description:"图表ID"`
+	ChartName        string                      `description:"图表名称(根据语言版本区分)"`
+	ChartEdbInfoList []*EditChartInfoEdbBaseItem `description:"指标及配置信息"`
+	ExtraConfig      string                      `description:"图表额外配置信息,json字符串"`
+}
+type EditChartInfoEdbBaseItem struct {
+	EdbInfoId int    `description:"指标ID"`
+	EdbName   string `description:"指标名称(根据语言版本区分)"`
+	Unit      string `description:"单位(根据语言版本区分)"`
+}
+
 func ModifyChartInfo(item *EditChartInfoReq) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` UPDATE  chart_info
@@ -723,6 +738,7 @@ func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calenda
 	}()
 	var pars []interface{}
 	pars = append(pars, req.ChartName)
+	pars = append(pars, req.ChartNameEn)
 	pars = append(pars, edbInfoIdStr)
 	pars = append(pars, req.ChartType)
 	pars = append(pars, req.ChartClassifyId)
@@ -742,6 +758,7 @@ func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calenda
 	sql := ` UPDATE  chart_info
 			SET
 			  chart_name =?,
+			  chart_name_en =?,
               edb_info_ids=?,
 			  chart_type=?,
 			  chart_classify_id = ?,
@@ -1042,6 +1059,12 @@ func EditFutureGoodChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr strin
 	return
 }
 
+// EditChartEnInfoAndEdbEnInfo
+// @Description: 修改图表和指标的英文信息
+// @author: Roc
+// @datetime 2024-04-18 13:58:13
+// @param req *EditChartEnInfoReq
+// @return err error
 func EditChartEnInfoAndEdbEnInfo(req *EditChartEnInfoReq) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
@@ -1101,6 +1124,95 @@ func EditChartEnInfoAndEdbEnInfo(req *EditChartEnInfoReq) (err error) {
 	return
 }
 
+// EditChartBaseInfoAndEdbEnInfo
+// @Description: 修改图表和指标的基础信息
+// @author: Roc
+// @datetime 2024-04-18 13:28:16
+// @param req *EditChartInfoBaseReq
+// @param chartItem *ChartInfo
+// @param lang string
+// @return err error
+func EditChartBaseInfoAndEdbEnInfo(req *EditChartInfoBaseReq, chartItem *ChartInfo, lang string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	updateChartCols := make([]string, 0)
+	switch lang {
+	case utils.EnLangVersion:
+		chartItem.ChartNameEn = req.ChartName
+		updateChartCols = append(updateChartCols, "ChartNameEn")
+	default:
+		chartItem.ChartName = req.ChartName
+		updateChartCols = append(updateChartCols, "ChartName")
+	}
+
+	if req.ExtraConfig != `` {
+		chartItem.ExtraConfig = req.ExtraConfig
+		updateChartCols = append(updateChartCols, "ExtraConfig")
+	}
+	chartItem.ModifyTime = time.Now()
+	updateChartCols = append(updateChartCols, "ModifyTime")
+	_, err = to.Update(chartItem, updateChartCols...)
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+
+	var edbInfoIdArr []string
+	for _, v := range req.ChartEdbInfoList {
+		edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
+		var count int
+		csql := `SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? `
+		err = to.Raw(csql, req.ChartInfoId, v.EdbInfoId).QueryRow(&count)
+		if err != nil {
+			fmt.Println("QueryRow Err:", err.Error())
+			return err
+		}
+		if count > 0 {
+			msql := ` UPDATE edb_info SET modify_time = NOW() `
+			pars := make([]interface{}, 0)
+			switch lang {
+			case utils.EnLangVersion:
+				msql += ` ,edb_name_en = ? `
+				pars = append(pars, v.EdbName)
+
+				// 如果有传单位
+				if v.Unit != `` {
+					msql += ` ,unit_en = ? `
+					pars = append(pars, v.Unit)
+				}
+			default:
+				msql += ` ,edb_name = ? `
+				pars = append(pars, v.EdbName)
+
+				// 如果有传单位
+				if v.Unit != `` {
+					msql += ` ,unit = ? `
+					pars = append(pars, v.Unit)
+				}
+			}
+			msql += ` WHERE edb_info_id = ? `
+			pars = append(pars, v.EdbInfoId)
+			_, err = to.Raw(msql, pars...).Exec()
+			if err != nil {
+				fmt.Println("edb_info Err:" + err.Error())
+				return err
+			}
+		}
+	}
+	return
+}
+
 func ModifyEdbDatadTimestamp(source, subSource, edbDataId int, dataTimestamp int64) (err error) {
 	tableName := GetEdbDataTableName(source, subSource)
 	sql := `UPDATE %s SET data_timestamp=? WHERE edb_data_id=? `

+ 15 - 0
models/data_manage/correlation/request/chart.go

@@ -0,0 +1,15 @@
+package request
+
+// EditChartEnInfoReq
+// @Description: 编辑图表英文信息请求
+type EditChartEnInfoReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	ChartNameEn string `description:"英文图表名称"`
+}
+
+// EditChartInfoBaseReq
+// @Description: 编辑图表基础信息请求
+type EditChartInfoBaseReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	ChartName   string `description:"英文图表名称"`
+}

+ 72 - 0
models/data_manage/cross_variety/chart_info_cross_variety.go

@@ -3,6 +3,7 @@ package cross_variety
 import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/cross_variety/request"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"strings"
@@ -262,3 +263,74 @@ func EditChartEn(chartInfo *data_manage.ChartInfo, req request.EditChartEnInfoRe
 
 	return
 }
+
+// EditChartBase
+// @Description: 修改图表基础信息
+// @author: Roc
+// @datetime 2023-11-28 21:17:27
+// @param chartInfo *data_manage.ChartInfo
+// @param req request.EditChartBaseInfoReq
+// @param lang string
+// @return err error
+func EditChartBase(chartInfo *data_manage.ChartInfo, req request.EditChartBaseInfoReq, lang string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 更新图表信息
+	switch lang {
+	case utils.EnLangVersion:
+		chartInfo.ChartNameEn = req.ChartName
+	default:
+		chartInfo.ChartName = req.ChartName
+	}
+	chartInfo.ModifyTime = time.Now().Local()
+	_, err = to.Update(chartInfo, "ChartName", "ChartNameEn", "ModifyTime")
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+
+	// 更新标签名
+	for _, v := range req.TagList {
+		var sql string
+		switch lang {
+		case utils.EnLangVersion:
+			sql = `UPDATE chart_tag SET chart_tag_name_en = ?,modify_time= NOW() WHERE chart_tag_id = ? `
+		default:
+			sql = `UPDATE chart_tag SET chart_tag_name = ?,modify_time= NOW() WHERE chart_tag_id = ? `
+		}
+		if sql != `` {
+			_, err = o.Raw(sql, v.TagName, v.ChartTagId).Exec()
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	// 更新品种名
+	for _, v := range req.VarietyList {
+		var sql string
+		switch lang {
+		case utils.EnLangVersion:
+			sql = `UPDATE chart_variety SET chart_variety_name_en = ?,modify_time= NOW() WHERE chart_variety_id = ? `
+		default:
+			sql = `UPDATE chart_variety SET chart_variety_name = ?,modify_time= NOW() WHERE chart_variety_id = ? `
+		}
+		_, err = o.Raw(sql, v.VarietyName, v.ChartVarietyId).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}

+ 24 - 0
models/data_manage/cross_variety/request/chart.go

@@ -25,6 +25,7 @@ type ChartConfigDate struct {
 // @Description: 添加图表的请求
 type AddChartReq struct {
 	ChartName      string `description:"图表名称"`
+	ChartNameEn    string `description:"英文图表名称"`
 	XMin           string `description:"图表X轴最小值"`
 	XMax           string `description:"图表X轴最大值"`
 	LeftMin        string `description:"图表左侧最小值"`
@@ -92,3 +93,26 @@ type SaveChartReq struct {
 	LeftMin     string `description:"图表左侧最小值"`
 	LeftMax     string `description:"图表左侧最大值"`
 }
+
+// EditChartBaseInfoReq
+// @Description: 编辑图表基础信息
+type EditChartBaseInfoReq struct {
+	ChartInfoId int                  `description:"图表ID"`
+	ChartName   string               `description:"图表名称(根据语言版本不同而不同)"`
+	TagList     []TagNameBaseReq     `description:"标签名称"`
+	VarietyList []VarietyNameBaseReq `description:"标签名称"`
+}
+
+// TagNameBaseReq
+// @Description: 标签基础名称修改
+type TagNameBaseReq struct {
+	ChartTagId int    `json:"ChartTagId"`
+	TagName    string `description:"标签名称(根据语言版本不同而不同)"`
+}
+
+// VarietyNameBaseReq
+// @Description: 品种基础名称修改
+type VarietyNameBaseReq struct {
+	ChartVarietyId int    `json:"ChartVarietyId"`
+	VarietyName    string `description:"品种名称(根据语言版本不同而不同)"`
+}

+ 67 - 14
models/data_manage/edb_classify.go

@@ -9,20 +9,23 @@ import (
 )
 
 type EdbClassify struct {
-	ClassifyId       int       `orm:"column(classify_id);pk"`
-	ClassifyType     uint8     `description:"分类类型,0:普通指标分类,1:预测指标分类"`
-	ClassifyName     string    `description:"分类名称"`
-	ParentId         int       `description:"父级id"`
-	RootId           int       `description:"顶级id"`
-	HasData          int       `description:"是否含有指标数据"`
-	CreateTime       time.Time `description:"创建时间"`
-	ModifyTime       time.Time `description:"修改时间"`
-	SysUserId        int       `description:"创建人id"`
-	SysUserRealName  string    `description:"创建人姓名"`
-	Level            int       `description:"层级"`
-	UniqueCode       string    `description:"唯一编码"`
-	Sort             int       `description:"排序字段,越小越靠前,默认值:10"`
-	IsJoinPermission int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ClassifyId             int       `orm:"column(classify_id);pk"`
+	ClassifyType           uint8     `description:"分类类型,0:普通指标分类,1:预测指标分类"`
+	ClassifyName           string    `description:"分类名称"`
+	ParentId               int       `description:"父级id"`
+	RootId                 int       `description:"顶级id"`
+	HasData                int       `description:"是否含有指标数据"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"修改时间"`
+	SysUserId              int       `description:"创建人id"`
+	SysUserRealName        string    `description:"创建人姓名"`
+	Level                  int       `description:"层级"`
+	UniqueCode             string    `description:"唯一编码"`
+	Sort                   int       `description:"排序字段,越小越靠前,默认值:10"`
+	LastModifyUserId       int       `description:"最后修改人ID"`
+	LastModifyUserRealName string    `description:"最后修改人姓名"`
+	IsJoinPermission       int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ClassifyNameEn         string    `description:"英文分类名称"`
 }
 
 func AddEdbClassify(item *EdbClassify) (lastId int64, err error) {
@@ -38,6 +41,15 @@ type AddEdbClassifyReq struct {
 	ClassifyType uint8  `description:"分类类型,0:普通指标分类,1:预测指标分类"`
 }
 
+// GetEdbClassifyCount
+// @Description: 根据父级id获取同级中文名称的数量
+// @author: Roc
+// @datetime 2024-04-17 14:12:22
+// @param classifyName string
+// @param parentId int
+// @param classifyType uint8
+// @return count int
+// @return err error
 func GetEdbClassifyCount(classifyName string, parentId int, classifyType uint8) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) AS count FROM edb_classify WHERE parent_id=? AND classify_name=? AND classify_type = ? `
@@ -45,6 +57,22 @@ func GetEdbClassifyCount(classifyName string, parentId int, classifyType uint8)
 	return
 }
 
+// GetEdbClassifyEnCount
+// @Description: 根据父级id获取同级英文名称的数量
+// @author: Roc
+// @datetime 2024-04-17 14:12:09
+// @param classifyNameEn string
+// @param parentId int
+// @param classifyType uint8
+// @return count int
+// @return err error
+func GetEdbClassifyEnCount(classifyNameEn string, parentId int, classifyType uint8) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM edb_classify WHERE parent_id=? AND classify_name_en = ? AND classify_type = ? `
+	err = o.Raw(sql, parentId, classifyNameEn, classifyType).QueryRow(&count)
+	return
+}
+
 type EditEdbClassifyReq struct {
 	ClassifyName string `description:"分类名称"`
 	ClassifyId   int    `description:"分类名称"`
@@ -64,6 +92,15 @@ func GetEdbClassifyCountById(classifyId int) (count int, err error) {
 	return
 }
 
+// EditEdbClassify
+// @Description: 修改指标分类的中文名称
+// @author: Roc
+// @datetime 2024-04-17 14:14:48
+// @param classifyId int
+// @param classifyName string
+// @param userId int
+// @param userRealName string
+// @return err error
 func EditEdbClassify(classifyId int, classifyName string, userId int, userRealName string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `UPDATE edb_classify SET classify_name=?,modify_time=NOW(), last_modify_user_id = ?, last_modify_user_real_name = ? WHERE classify_id=? `
@@ -71,6 +108,22 @@ func EditEdbClassify(classifyId int, classifyName string, userId int, userRealNa
 	return
 }
 
+// EditEdbClassifyEn
+// @Description: 修改指标分类的英文名称
+// @author: Roc
+// @datetime 2024-04-17 14:14:36
+// @param classifyId int
+// @param classifyNameEn string
+// @param userId int
+// @param userRealName string
+// @return err error
+func EditEdbClassifyEn(classifyId int, classifyNameEn string, userId int, userRealName string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE edb_classify SET classify_name_en = ?,modify_time=NOW(), last_modify_user_id = ?, last_modify_user_real_name = ? WHERE classify_id=? `
+	_, err = o.Raw(sql, classifyNameEn, userId, userRealName, classifyId).Exec()
+	return
+}
+
 type DeleteEdbClassifyReq struct {
 	ClassifyId int `description:"分类id"`
 	EdbInfoId  int `description:"指标id"`

+ 14 - 0
models/data_manage/edb_info.go

@@ -81,8 +81,10 @@ type BaseEdbNameItem struct {
 	Source        int    `description:"来源id"`
 	EdbCode       string `description:"指标编码"`
 	EdbName       string `description:"指标名称"`
+	EdbNameEn     string `description:"指标英文名称"`
 	Frequency     string `description:"频率"`
 	Unit          string `description:"单位"`
+	UnitEn        string `description:"英文单位"`
 	HaveOperaAuth bool   `description:"是否有数据权限,默认:false"`
 }
 
@@ -286,6 +288,14 @@ type EditEdbEnInfoReq struct {
 	UnitEn    string `description:"英文单位"`
 }
 
+// EditEdbBaseInfoReq
+// @Description: 修改指标基础信息请求参数
+type EditEdbBaseInfoReq struct {
+	EdbInfoId int    `description:"指标ID"`
+	EdbName   string `description:"指标名称"`
+	Unit      string `description:"指标单位"`
+}
+
 func ModifyEdbInfo(item *EditEdbInfoReq) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` UPDATE  edb_info
@@ -1643,7 +1653,9 @@ type MoveEdbChartList struct {
 	DataId         string `description:"指标/图表唯一id"`
 	Code           string `description:"指标code"`
 	Name           string `description:"指标/图表名称"`
+	NameEn         string `description:"指标/图表名称"`
 	ClassifyName   string `description:"分类名称"`
+	ClassifyNameEn string `description:"分类名称"`
 	CreateUserId   int    `description:"创建人id"`
 	CreateUserName string `description:"创建人名称"`
 }
@@ -1727,8 +1739,10 @@ type TraceEdbInfoResp struct {
 	EdbInfoId     int                `description:"指标id"`
 	EdbInfoType   int                `description:"指标类型: 0-普通指标; 1-预测指标"`
 	EdbName       string             `description:"指标名称"`
+	EdbNameEn     string             `description:"指标英文名称"`
 	EdbType       int                `description:"指标类型: 1-基础指标; 2-计算指标"`
 	RuleTitle     string             `description:"指标规则"`
+	RuleTitleEn   string             `description:"指标规则(英文)"`
 	UniqueCode    string             `description:"唯一编码"`
 	ClassifyId    int                `description:"分类ID"`
 	Child         []TraceEdbInfoResp `description:"下级来源"`

+ 6 - 1
models/data_manage/edb_info_calculate.go

@@ -66,6 +66,7 @@ type EdbInfoCalculateDetail struct {
 	FromEdbInfoId      int       `description:"计算指标id"`
 	FromEdbCode        string    `description:"计算指标编码"`
 	FromEdbName        string    `description:"计算指标名称"`
+	FromEdbNameEn      string    `description:"计算指标名称"`
 	FromSource         int       `description:"计算指标来源"`
 	FromSourceName     string    `description:"计算指标来源名称"`
 	FromTag            string    `description:"来源指标标签"`
@@ -94,7 +95,7 @@ func GetEdbInfoCalculateDetail(edbInfoId, source int) (list []*EdbInfoCalculateD
 	//
 	//sql = fmt.Sprintf(sql, calculateTableName)
 
-	sql := ` SELECT a.edb_info_calculate_mapping_id,a.edb_info_id,a.source,a.source_name,a.edb_code,a.from_edb_info_id,a.from_edb_code,a.from_source,a.from_source_name,a.sort,a.create_time,a.modify_time,a.from_tag,a.move_value,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.latest_date,b.latest_value,b.edb_type, b.frequency, b.unit, b.classify_id FROM edb_info_calculate_mapping AS a
+	sql := ` SELECT a.edb_info_calculate_mapping_id,a.edb_info_id,a.source,a.source_name,a.edb_code,a.from_edb_info_id,a.from_edb_code,a.from_source,a.from_source_name,a.sort,a.create_time,a.modify_time,a.from_tag,a.move_value,b.edb_name as from_edb_name,b.edb_name_en as from_edb_name_en,b.start_date,b.end_date,b.latest_date,b.latest_value,b.edb_type, b.frequency, b.unit, b.classify_id FROM edb_info_calculate_mapping AS a
 			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
 			WHERE a.edb_info_id=? ORDER BY sort ASC `
 
@@ -164,8 +165,10 @@ func DeleteCalculateData(edbInfoId int) (err error) {
 type EdbInfoBase struct {
 	EdbInfoId     int    `description:"指标id"`
 	EdbName       string `description:"指标名称"`
+	EdbNameEn     string `description:"英文指标名称"`
 	Frequency     string `description:"频度"`
 	Unit          string `description:"单位"`
+	UnitEn        string `description:"英文单位"`
 	ClassifyId    int    `description:"分类id"`
 	HaveOperaAuth bool   `description:"是否有数据权限,默认:false"`
 }
@@ -601,8 +604,10 @@ type CalculateMultiEdbSearchResp struct {
 type CalculateMultiEdbSearchItem struct {
 	EdbInfoId       int    `description:"指标id"`
 	EdbName         string `description:"指标名称"`
+	EdbNameEn       string `description:"英文指标名称"`
 	Frequency       string `description:"频度"`
 	Unit            string `description:"单位"`
+	UnitEn          string `description:"英文单位"`
 	ClassifyId      int    `description:"分类id"`
 	SysUserId       int
 	SysUserRealName string

+ 2 - 0
models/data_manage/excel/request/excel_info.go

@@ -100,9 +100,11 @@ type EdbInfoData struct {
 	EdbInfoId        int             `description:"指标ID"`
 	Tag              string          `description:"标签"`
 	EdbName          string          `description:"指标名称"`
+	EdbNameEn        string          `description:"英文指标名称"`
 	EdbAliasName     string          `description:"指标别名"`
 	Frequency        string          `description:"频度"`
 	Unit             string          `description:"单位"`
+	UnitEn           string          `description:"英文单位"`
 	ClassifyId       int             `description:"所属分类" json:"-"`
 	IsJoinPermission int             `description:"是否加入权限管控,0:不加入;1:加入;默认:0" json:"-"`
 	HaveOperaAuth    bool            `description:"是否有数据权限,默认:false"`

+ 8 - 5
models/data_manage/future_good/future_good_edb_info.go

@@ -14,6 +14,7 @@ type FutureGoodEdbInfo struct {
 	ParentId            int       `description:"上级期货id"`
 	RegionType          string    `description:"交易所来源,海外还是国内"`
 	Exchange            string    `description:"所属交易所"`
+	ExchangeEn          string    `description:"所属交易所(英文名称)"`
 	FutureGoodEdbType   int       `description:"指标类型,1:年月是固定的合约;2:只有M+N期的合约,未固定年月"`
 	DateSourceId        int       `description:"画图时,日期来源的指标id"`
 	Year                int       `description:"所属年份"`
@@ -103,9 +104,10 @@ func (FutureGoodEdbInfo *FutureGoodEdbInfo) Update(cols []string) (err error) {
 
 // FutureGoodEdbInfoGroupListResp 期货指标数据列表数据返回
 type FutureGoodEdbInfoGroupListResp struct {
-	FutureGoodEdbInfoId   int
-	FutureGoodEdbInfoName string
-	Child                 []FutureGoodEdbInfoGroupListResp
+	FutureGoodEdbInfoId     int
+	FutureGoodEdbInfoName   string `description:"中文名称"`
+	FutureGoodEdbInfoNameEn string `description:"英文名称"`
+	Child                   []FutureGoodEdbInfoGroupListResp
 }
 
 // GetFutureGoodEdbInfoGroupList 获取分組指标数据列表
@@ -121,13 +123,14 @@ func GetFutureGoodEdbInfoGroupList(condition string, pars []interface{}) (list [
 }
 
 type FutureGoodExchange struct {
-	Exchange string `description:"所属交易所"`
+	Exchange   string `description:"所属交易所"`
+	ExchangeEn string `description:"所属交易所(英文)"`
 }
 
 // GetFutureGoodEdbExchangeList 获取分組指标数据列表
 func GetFutureGoodEdbExchangeList(condition string, pars []interface{}) (list []FutureGoodExchange, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT exchange FROM future_good_edb_info WHERE 1=1 `
+	sql := `SELECT exchange,exchange_en FROM future_good_edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}

+ 11 - 0
models/data_manage/future_good/request/future_good_chart.go

@@ -110,3 +110,14 @@ type SectionScatterEdbItemReq struct {
 	YDateValue int    `description:"Y轴的日期N天的值"`
 	IsShow     bool   `description:"是否展示"`
 }
+
+// EditChartInfoBaseReq
+// @Description: 修改商品图表的基础信息
+type EditChartInfoBaseReq struct {
+	ChartInfoId    int    `description:"图表ID"`
+	ChartName      string `description:"图表名称(根据当前语言版本不同而不同)"`
+	EdbName        string `description:"指标名称(根据当前语言版本不同而不同)"`
+	Unit           string `description:"指标单位(根据当前语言版本不同而不同)"`
+	ProfitName     string `description:"利润名称(根据当前语言版本不同而不同)"`
+	FutureGoodName string `description:"期货合约名称(根据当前语言版本不同而不同)"`
+}

+ 166 - 0
models/data_manage/future_good_chart_info.go

@@ -1,8 +1,10 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"time"
 )
 
 // EditFutureGoodChartEnInfoAndEdbEnInfo 更改商品价格曲线英文信息
@@ -54,6 +56,95 @@ func EditFutureGoodChartEnInfoAndEdbEnInfo(chartInfoId int, chartNameEn string,
 	return
 }
 
+// EditBaseFutureGoodChartInfoAndEdbEnInfo
+// @Description:  编辑期货商品基础的图表信息及指标信息
+// @author: Roc
+// @datetime 2024-04-23 13:58:23
+// @param chartInfo ChartInfo
+// @param chartName string
+// @param edbInfoId int
+// @param edbName string
+// @param edbUnit string
+// @param lang string
+// @return err error
+func EditBaseFutureGoodChartInfoAndEdbEnInfo(chartInfo *ChartInfo, chartName string, edbInfoId int, edbName, edbUnit, lang string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 修改图表信息
+	updateChartCols := make([]string, 0)
+	switch lang {
+	case utils.EnLangVersion:
+		chartInfo.ChartNameEn = chartName
+		updateChartCols = append(updateChartCols, "ChartNameEn")
+	default:
+		chartInfo.ChartName = chartName
+		updateChartCols = append(updateChartCols, "ChartName")
+	}
+	chartInfo.ModifyTime = time.Now()
+	updateChartCols = append(updateChartCols, "ModifyTime")
+	_, err = to.Update(chartInfo, updateChartCols...)
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+
+	var count int
+	csql := `SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? AND source = 1 `
+	err = to.Raw(csql, chartInfo.ChartInfoId, edbInfoId).QueryRow(&count)
+	if err != nil {
+		fmt.Println("QueryRow Err:", err.Error())
+		return err
+	}
+	if count > 0 {
+		msql := ` UPDATE edb_info SET modify_time = NOW()  `
+		pars := make([]interface{}, 0)
+		switch lang {
+		case utils.EnLangVersion:
+			if edbName != `` {
+				msql += ` ,edb_name_en = ? `
+				pars = append(pars, edbName)
+			}
+
+			if edbUnit != `` {
+				msql += ` ,unit_en = ? `
+				pars = append(pars, edbUnit)
+			}
+
+		default:
+
+			if edbName != `` {
+				msql += ` ,edb_name = ? `
+				pars = append(pars, edbName)
+			}
+
+			if edbUnit != `` {
+				msql += ` ,unit = ? `
+				pars = append(pars, edbUnit)
+			}
+		}
+		msql += ` WHERE edb_info_id = ? `
+		pars = append(pars, edbInfoId)
+		_, err = to.Raw(msql, pars...).Exec()
+		if err != nil {
+			fmt.Println("edb_info Err:" + err.Error())
+			return err
+		}
+	}
+
+	return
+}
+
 // EditFutureGoodProfitChartEnInfoAndEdbEnInfo 更改商品利润曲线英文信息
 func EditFutureGoodProfitChartEnInfoAndEdbEnInfo(chartInfoId int, chartNameEn string, edbInfoId int, edbNameEn, edbUnitEn, profitNameEn string) (err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -101,3 +192,78 @@ func EditFutureGoodProfitChartEnInfoAndEdbEnInfo(chartInfoId int, chartNameEn st
 
 	return
 }
+
+// EditBaseFutureGoodProfitChartInfoAndEdbEnInfo
+// @Description: 更改商品利润曲线基础信息
+// @author: Roc
+// @datetime 2024-04-23 14:36:45
+// @param chartInfo *ChartInfo
+// @param chartName string
+// @param edbInfoId int
+// @param edbName string
+// @param edbUnit string
+// @param profitName string
+// @param lang string
+// @return err error
+func EditBaseFutureGoodProfitChartInfoAndEdbEnInfo(chartInfo *ChartInfo, chartName string, edbInfoId int, edbName, edbUnit, profitName, lang string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 修改图表信息
+	updateChartCols := make([]string, 0)
+	switch lang {
+	case utils.EnLangVersion:
+		chartInfo.ChartNameEn = chartName
+		updateChartCols = append(updateChartCols, "ChartNameEn")
+	default:
+		chartInfo.ChartName = chartName
+		updateChartCols = append(updateChartCols, "ChartName")
+	}
+	chartInfo.ModifyTime = time.Now()
+	updateChartCols = append(updateChartCols, "ModifyTime")
+	_, err = to.Update(chartInfo, updateChartCols...)
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+
+	// 更改指标英文信息
+	var sql string
+	switch lang {
+	case utils.EnLangVersion:
+		sql = ` UPDATE  edb_info SET edb_name_en = ?,unit_en = ?,modify_time = NOW() WHERE edb_info_id = ? `
+	default:
+		sql = ` UPDATE  edb_info SET edb_name = ?,unit = ?,modify_time = NOW() WHERE edb_info_id = ? `
+	}
+	_, err = to.Raw(sql, edbName, edbUnit, edbInfoId).Exec()
+	if err != nil {
+		fmt.Println("edb_info Err:" + err.Error())
+		return
+	}
+
+	// 更改指标英文信息
+
+	switch lang {
+	case utils.EnLangVersion:
+		sql = ` UPDATE  chart_info_future_good_profit SET profit_name_en = ?,modify_time = NOW() WHERE chart_info_id = ? `
+	default:
+		sql = ` UPDATE  chart_info_future_good_profit SET profit_name = ?,modify_time = NOW() WHERE chart_info_id = ? `
+	}
+	_, err = to.Raw(sql, profitName, chartInfo.ChartInfoId).Exec()
+	if err != nil {
+		fmt.Println("chart_info_future_good_profit Err:" + err.Error())
+		return
+	}
+
+	return
+}

+ 6 - 0
models/data_manage/line_equation/request/line_equation.go

@@ -36,3 +36,9 @@ type EditChartEnInfoReq struct {
 	ChartInfoId int    `description:"图表ID"`
 	ChartNameEn string `description:"英文图表名称"`
 }
+
+// EditChartBaseInfoReq 编辑图表基础信息
+type EditChartBaseInfoReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	ChartName   string `description:"图表名称(根据当前语言版本不同而不同)"`
+}

+ 2 - 0
models/data_manage/line_feature/line_feature.go

@@ -67,6 +67,7 @@ func EditLineFeatureChartAndMapping(req *data_manage.EditChartInfoReq, edbInfoId
 	}()
 	var pars []interface{}
 	pars = append(pars, req.ChartName)
+	pars = append(pars, req.ChartNameEn)
 	pars = append(pars, edbInfoIdStr)
 	pars = append(pars, req.ChartClassifyId)
 	pars = append(pars, disabled)
@@ -75,6 +76,7 @@ func EditLineFeatureChartAndMapping(req *data_manage.EditChartInfoReq, edbInfoId
 	sql := ` UPDATE  chart_info
 			SET
 			  chart_name =?,
+			  chart_name_en =?,
               edb_info_ids=?,
 			  chart_classify_id = ?,
 			  modify_time = NOW(),

+ 6 - 0
models/data_manage/line_feature/request/line_feature.go

@@ -107,3 +107,9 @@ type SaveMultipleGraphEdbReq struct {
 	FrequencyDistribution FrequencyDistribution `description:"频率分布配置"`
 	IsSaveAs              bool                  `description:"是否另存为,true的话,就是另存为,不会建立与配置的关系"`
 }
+
+// EditChartInfoBaseReq 编辑图表基础信息
+type EditChartInfoBaseReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	ChartName   string `description:"英文名称(根据当前语言版本不同而不同)"`
+}

+ 39 - 1
models/data_manage/mysteel_chemical_classify.go

@@ -18,6 +18,7 @@ type BaseFromMysteelChemicalClassify struct {
 	Sort                              int       `description:"排序字段,越小越靠前,默认值:10"`
 	ModifyTime                        time.Time `description:"修改时间"`
 	CreateTime                        time.Time `description:"创建时间"`
+	ClassifyNameEn                    string    `description:"英文分类名称"`
 }
 
 // AddBaseFromMysteelChemicalClassify 添加钢联化工分类
@@ -27,7 +28,14 @@ func AddBaseFromMysteelChemicalClassify(item *BaseFromMysteelChemicalClassify) (
 	return
 }
 
-// GetBaseFromMysteelChemicalClassifyCount 获取分类名称的个数
+// GetBaseFromMysteelChemicalClassifyCount
+// @Description: 获取中文分类名称的个数
+// @author: Roc
+// @datetime 2024-04-16 16:37:43
+// @param classifyName string
+// @param parentId int
+// @return count int
+// @return err error
 func GetBaseFromMysteelChemicalClassifyCount(classifyName string, parentId int) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) AS count FROM base_from_mysteel_chemical_classify WHERE classify_name=? AND parent_id=? `
@@ -35,6 +43,21 @@ func GetBaseFromMysteelChemicalClassifyCount(classifyName string, parentId int)
 	return
 }
 
+// GetBaseFromMysteelChemicalClassifyEnCount
+// @Description:  获取英文分类名称的个数
+// @author: Roc
+// @datetime 2024-04-16 16:28:14
+// @param classifyNameEn string
+// @param parentId int
+// @return count int
+// @return err error
+func GetBaseFromMysteelChemicalClassifyEnCount(classifyNameEn string, parentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM base_from_mysteel_chemical_classify WHERE classify_name_en = ? AND parent_id=? `
+	err = o.Raw(sql, classifyNameEn, parentId).QueryRow(&count)
+	return
+}
+
 // GetBaseFromMysteelChemicalClassifyById 通过分类id的获取分类信息
 func GetBaseFromMysteelChemicalClassifyById(classifyId int) (item *BaseFromMysteelChemicalClassify, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -51,6 +74,20 @@ func EditBaseFromMysteelChemicalClassify(classifyId int, classifyName string) (e
 	return
 }
 
+// EditBaseFromMysteelChemicalClassifyEn
+// @Description: 修改钢联化工英文分类名称
+// @author: Roc
+// @datetime 2024-04-16 16:34:53
+// @param classifyId int
+// @param classifyNameEn string
+// @return err error
+func EditBaseFromMysteelChemicalClassifyEn(classifyId int, classifyNameEn string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_mysteel_chemical_classify SET classify_name_en = ?,modify_time=NOW() WHERE base_from_mysteel_chemical_classify_id=? `
+	_, err = o.Raw(sql, classifyNameEn, classifyId).Exec()
+	return
+}
+
 type BaseFromMysteelChemicalIndexResp struct {
 	List []*BaseFromMysteelChemicalClassifyItems
 }
@@ -59,6 +96,7 @@ type BaseFromMysteelChemicalClassifyItems struct {
 	BaseFromMysteelChemicalIndexId    int                                        `orm:"column(base_from_mysteel_chemical_index_id)"`
 	IndexCode                         string                                     `description:"指标编码"`
 	ClassifyName                      string                                     `description:"分类名称"`
+	ClassifyNameEn                    string                                     `description:"英文分类名称"`
 	ParentId                          int                                        `description:"父级id"`
 	SysUserId                         int                                        `description:"创建人id"`
 	SysUserRealName                   string                                     `description:"创建人姓名"`

+ 63 - 0
routers/commentsRouter.go

@@ -142,6 +142,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
+        beego.ControllerComments{
+            Method: "BaseInfoEdit",
+            Router: `/chart_info/base/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -250,6 +259,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "BaseInfoEdit",
+            Router: `/chart_info/base/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/cross_variety:ChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -1069,6 +1087,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    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: "BaseInfoEdit",
+            Router: `/chart_info/base/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     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: "ChartInfoBase64Upload",
@@ -1348,6 +1375,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "BaseInfoEdit",
+            Router: `/chart_info/base/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -1519,6 +1555,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
+        beego.ControllerComments{
+            Method: "BaseInfoEdit",
+            Router: `/chart_info/base/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -2095,6 +2140,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "ChartInfoBaseEdit",
+            Router: `/chart_info/base/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoBase64Upload",
@@ -3004,6 +3058,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: "EdbInfoBaseEdit",
+            Router: `/edb_info/base/edit`,
+            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: "EdbInfoBatchAdd",

+ 39 - 38
services/data/base_edb_lib.go

@@ -140,8 +140,8 @@ type EdbCalculateSaveMultiResponse struct {
 }
 
 // SaveBasePredictEdbData 新增/编辑预测指标运算
-func SaveBasePredictEdbData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict/save")
+func SaveBasePredictEdbData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict/save", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -161,8 +161,8 @@ type PredictRuleCalculateByNineRespResponse struct {
 }
 
 // PredictCalculateByNinePreview 预测指标动态环差演算
-func PredictCalculateByNinePreview(RuleConfigReqStr string) (resp *PredictRuleCalculateByNineRespResponse, err error) {
-	_, resultByte, err := postAddEdbData(RuleConfigReqStr, "predict/calculate_by_nine/preview")
+func PredictCalculateByNinePreview(RuleConfigReqStr, lang string) (resp *PredictRuleCalculateByNineRespResponse, err error) {
+	_, resultByte, err := postAddEdbData(RuleConfigReqStr, "predict/calculate_by_nine/preview", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -171,8 +171,8 @@ func PredictCalculateByNinePreview(RuleConfigReqStr string) (resp *PredictRuleCa
 }
 
 // SavePredictEdbData 新增/编辑预测指标运算
-func SavePredictEdbData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/save")
+func SavePredictEdbData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/save", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -181,8 +181,8 @@ func SavePredictEdbData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredic
 }
 
 // BatchSavePredictEdbData 新增/编辑 预测指标运算(同比、同差)
-func BatchSavePredictEdbData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/batch/save")
+func BatchSavePredictEdbData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/batch/save", lang)
 	if err != nil {
 		return
 	}
@@ -302,8 +302,8 @@ func RefreshPredictEdbCalculateData(edbInfoId int, edbCode, startDate string) (r
 }
 
 // AddEdbCalculateData 新增 累计值转月-同比值-同差等计算新增
-func AddEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/add")
+func AddEdbCalculateData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/add", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -312,8 +312,8 @@ func AddEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredi
 }
 
 // EditEdbCalculateData 编辑 累计值转月-同比值-同差等计算新增
-func EditEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/edit")
+func EditEdbCalculateData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/edit", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -322,8 +322,8 @@ func EditEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPred
 }
 
 // BatchSaveEdbCalculateData 新增 累计值转月-同比值-同差等计算新增
-func BatchSaveEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/save")
+func BatchSaveEdbCalculateData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/save", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -332,8 +332,8 @@ func BatchSaveEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *Ad
 }
 
 // BatchEditEdbCalculateData 编辑 累计值转月-同比值-同差等计算新增
-func BatchEditEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/edit")
+func BatchEditEdbCalculateData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/edit", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -342,8 +342,8 @@ func BatchEditEdbCalculateData(edbInfoCalculateBatchSaveReqStr string) (resp *Ad
 }
 
 // BatchSaveEdbCalculateMultiData 批量新增 累计值转月-同比值-同差等计算新增
-func BatchSaveEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr string) (resp *EdbCalculateSaveMultiResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/save/multi")
+func BatchSaveEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *EdbCalculateSaveMultiResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/save/multi", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -352,8 +352,8 @@ func BatchSaveEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr string) (res
 }
 
 // BatchEditEdbCalculateMultiData 批量编辑 累计值转月-同比值-同差等计算新增
-func BatchEditEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr string) (resp *EdbCalculateSaveMultiResponse, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/edit/multi")
+func BatchEditEdbCalculateMultiData(edbInfoCalculateBatchSaveReqStr, lang string) (resp *EdbCalculateSaveMultiResponse, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/batch/edit/multi", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -377,32 +377,32 @@ func ExecPythonCode(pythonCode string) (resp *models.BaseResponse, err error) {
 }
 
 // AddPythonEdbData 新增python指标
-func AddPythonEdbData(param string) (resp *models.BaseResponse, err error) {
+func AddPythonEdbData(param, lang string) (resp *models.BaseResponse, err error) {
 	urlStr := ``
 	urlStr = "python/add"
-	resp, _, err = postAddEdbData(param, urlStr)
+	resp, _, err = postAddEdbData(param, urlStr, lang)
 	return
 }
 
 // EditPythonEdbData 编辑python指标
-func EditPythonEdbData(param string) (resp *models.BaseResponse, err error) {
+func EditPythonEdbData(param, lang string) (resp *models.BaseResponse, err error) {
 	urlStr := ``
 	urlStr = "python/edit"
-	resp, _, err = postAddEdbData(param, urlStr)
+	resp, _, err = postAddEdbData(param, urlStr, lang)
 	return
 }
 
 // SaveAdjustEdbInfo 保存数据调整指标
-func SaveAdjustEdbInfo(param string) (resp *models.BaseResponse, err error) {
+func SaveAdjustEdbInfo(param, lang string) (resp *models.BaseResponse, err error) {
 	urlStr := ``
 	urlStr = "calculate/adjust/save"
-	resp, _, err = postAddEdbData(param, urlStr)
+	resp, _, err = postAddEdbData(param, urlStr, lang)
 	return
 }
 
 // ResetCustomAnalysisData 重置自定义表格的数据
-func ResetCustomAnalysisData(reqStr string) (resp *AddPredictEdbDataResponse, err error) {
-	_, resultByte, err := postAddEdbData(reqStr, "calculate/custom_analysis/reset")
+func ResetCustomAnalysisData(reqStr, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	_, resultByte, err := postAddEdbData(reqStr, "calculate/custom_analysis/reset", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -423,8 +423,8 @@ type CalculateComputeCorrelationResp struct {
 }
 
 // CalculateComputeCorrelation 拟合残差计算相关性的值
-func CalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr string) (resp *CalculateComputeCorrelationResp, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/compute_correlation")
+func CalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr, lang string) (resp *CalculateComputeCorrelationResp, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "calculate/compute_correlation", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -433,8 +433,8 @@ func CalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr string) (resp *
 }
 
 // PredictCalculateComputeCorrelation 拟合残差计算相关性的值(预测指标)
-func PredictCalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr string) (resp *CalculateComputeCorrelationResp, err error) {
-	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/compute_correlation")
+func PredictCalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr, lang string) (resp *CalculateComputeCorrelationResp, err error) {
+	_, resultByte, err := postAddEdbData(edbInfoCalculateBatchSaveReqStr, "predict_calculate/compute_correlation", lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -462,9 +462,9 @@ type BaseCalculateDataResp struct {
 }
 
 // BaseCalculate 基础计算
-func BaseCalculate(param string) (resp *BaseCalculateResp, err error) {
+func BaseCalculate(param, lang string) (resp *BaseCalculateResp, err error) {
 	urlStr := "calculate/base"
-	_, resultByte, err := postAddEdbData(param, urlStr)
+	_, resultByte, err := postAddEdbData(param, urlStr, lang)
 	err = json.Unmarshal(resultByte, &resp)
 	if err != nil {
 		return
@@ -479,7 +479,7 @@ func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *mode
 	if err != nil {
 		return
 	}
-	result, err := HttpPost(postUrl, string(postData), "application/json")
+	result, err := HttpPost(postUrl, string(postData), utils.ZhLangVersion, "application/json")
 	if err != nil {
 		return
 	}
@@ -492,9 +492,9 @@ func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *mode
 }
 
 // postAddEdbData 新增指标数据
-func postAddEdbData(paramStr string, urlStr string) (resp *models.BaseResponse, result []byte, err error) {
+func postAddEdbData(paramStr string, urlStr, lang string) (resp *models.BaseResponse, result []byte, err error) {
 	postUrl := utils.EDB_LIB_URL + urlStr
-	result, err = HttpPost(postUrl, paramStr, "application/json")
+	result, err = HttpPost(postUrl, paramStr, lang, "application/json")
 	if err != nil {
 		return
 	}
@@ -506,7 +506,7 @@ func postAddEdbData(paramStr string, urlStr string) (resp *models.BaseResponse,
 	return
 }
 
-func HttpPost(url, postData string, params ...string) ([]byte, error) {
+func HttpPost(url, postData, lang string, params ...string) ([]byte, error) {
 	body := ioutil.NopCloser(strings.NewReader(postData))
 	client := &http.Client{}
 	req, err := http.NewRequest("POST", url, body)
@@ -518,6 +518,7 @@ func HttpPost(url, postData string, params ...string) ([]byte, error) {
 		contentType = params[0]
 	}
 	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Lang", lang)
 	req.Header.Set("authorization", utils.MD5(utils.APP_EDB_LIB_NAME_EN+utils.EDB_LIB_Md5_KEY))
 	resp, err := client.Do(req)
 	if err != nil {

+ 71 - 29
services/data/base_from_baiinfo.go

@@ -9,16 +9,27 @@ import (
 )
 
 // AddBaiinfoClassify 添加SCI分类
-func AddBaiinfoClassify(classifyName string, parentId, sysUserId int, sysUserName string) (classifyInfo *data_manage.BaseFromBaiinfoClassify, err error, errMsg string) {
-	count, err := data_manage.GetBaseFromBaiinfoClassifyCount(classifyName, parentId)
-	if err != nil {
-		errMsg = `判断名称是否已存在失败`
-		return
-	}
-	if count > 0 {
-		errMsg = `分类名称已存在,请重新输入`
-		return
+func AddBaiinfoClassify(classifyName string, parentId, sysUserId int, sysUserName, lang string) (classifyInfo *data_manage.BaseFromBaiinfoClassify, err error, errMsg string) {
+	// 校验分类名称相同的数量
+	{
+		var count int
+		switch lang {
+		case utils.EnLangVersion:
+			count, err = data_manage.GetBaseFromBaiinfoClassifyEnCount(classifyName, parentId)
+		default:
+			count, err = data_manage.GetBaseFromBaiinfoClassifyCount(classifyName, parentId)
+		}
+		if err != nil {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+		if count > 0 {
+			errMsg = `分类名称已存在,请重新输入`
+			err = errors.New(errMsg)
+			return
+		}
 	}
+
 	level := 1
 	if parentId > 0 {
 		parentClassify, e := data_manage.GetBaseFromBaiinfoClassifyById(parentId)
@@ -36,6 +47,7 @@ func AddBaiinfoClassify(classifyName string, parentId, sysUserId int, sysUserNam
 	}
 	classifyInfo = &data_manage.BaseFromBaiinfoClassify{
 		ClassifyName:    classifyName,
+		ClassifyNameEn:  classifyName,
 		ParentId:        parentId,
 		SysUserId:       sysUserId,
 		SysUserRealName: sysUserName,
@@ -56,35 +68,65 @@ func AddBaiinfoClassify(classifyName string, parentId, sysUserId int, sysUserNam
 }
 
 // EditBaiinfoClassify 编辑Baiinfo分类
-func EditBaiinfoClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
+func EditBaiinfoClassify(classifyId int, classifyName, lang string, sysUser *system.Admin) (err error, errMsg string) {
 	item, err := data_manage.GetBaseFromBaiinfoClassifyById(classifyId)
 	if err != nil {
 		errMsg = `保存失败`
 		return
 	}
 
-	// 名字相同,那么就直接返回
-	if item.ClassifyName == classifyName {
-		return
-	}
+	switch lang {
+	case utils.EnLangVersion:
+		// 名字相同,那么就直接返回
+		if item.ClassifyNameEn == classifyName {
+			return
+		}
 
-	// 判断名称是否已存在
-	count, err := data_manage.GetBaseFromBaiinfoClassifyCount(classifyName, item.ParentId)
-	if err != nil {
-		errMsg = "判断名称是否已存在失败"
-		return
-	}
-	if count > 0 {
-		errMsg = "分类名称已存在,请重新输入"
-		err = errors.New(errMsg)
-		return
-	}
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromBaiinfoClassifyEnCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
 
-	// 修改数据
-	err = data_manage.EditBaseFromBaiinfoClassify(classifyId, classifyName)
-	if err != nil {
-		errMsg = "保存失败"
+		// 修改数据
+		err = data_manage.EditBaseFromBaiinfoClassifyEn(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
+	default:
+
+		// 名字相同,那么就直接返回
+		if item.ClassifyName == classifyName {
+			return
+		}
+
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromBaiinfoClassifyCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
+
+		// 修改数据
+		err = data_manage.EditBaseFromBaiinfoClassify(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
 	}
+
 	return
 }
 

+ 68 - 29
services/data/base_from_sci.go

@@ -9,15 +9,25 @@ import (
 )
 
 // AddSciClassify 添加SCI分类
-func AddSciClassify(classifyName string, parentId, sysUserId int, sysUserName string) (classifyInfo *data_manage.BaseFromSciClassify, err error, errMsg string) {
-	count, err := data_manage.GetBaseFromSciClassifyCount(classifyName, parentId)
-	if err != nil {
-		errMsg = `判断名称是否已存在失败`
-		return
-	}
-	if count > 0 {
-		errMsg = `分类名称已存在,请重新输入`
-		return
+func AddSciClassify(classifyName string, parentId, sysUserId int, sysUserName, lang string) (classifyInfo *data_manage.BaseFromSciClassify, err error, errMsg string) {
+	// 校验分类名称相同的数量
+	{
+		var count int
+		switch lang {
+		case utils.EnLangVersion:
+			count, err = data_manage.GetBaseFromSciClassifyEnCount(classifyName, parentId)
+		default:
+			count, err = data_manage.GetBaseFromSciClassifyCount(classifyName, parentId)
+		}
+		if err != nil {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+		if count > 0 {
+			errMsg = `分类名称已存在,请重新输入`
+			err = errors.New(errMsg)
+			return
+		}
 	}
 	level := 1
 	if parentId > 0 {
@@ -36,6 +46,7 @@ func AddSciClassify(classifyName string, parentId, sysUserId int, sysUserName st
 	}
 	classifyInfo = &data_manage.BaseFromSciClassify{
 		ClassifyName:    classifyName,
+		ClassifyNameEn:  classifyName,
 		ParentId:        parentId,
 		SysUserId:       sysUserId,
 		SysUserRealName: sysUserName,
@@ -56,35 +67,63 @@ func AddSciClassify(classifyName string, parentId, sysUserId int, sysUserName st
 }
 
 // EditSciClassify 编辑Sci分类
-func EditSciClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
+func EditSciClassify(classifyId int, classifyName, lang string, sysUser *system.Admin) (err error, errMsg string) {
 	item, err := data_manage.GetBaseFromSciClassifyById(classifyId)
 	if err != nil {
 		errMsg = `保存失败`
 		return
 	}
+	switch lang {
+	case utils.EnLangVersion:
+		// 名字相同,那么就直接返回
+		if item.ClassifyNameEn == classifyName {
+			return
+		}
 
-	// 名字相同,那么就直接返回
-	if item.ClassifyName == classifyName {
-		return
-	}
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromSciClassifyEnCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
 
-	// 判断名称是否已存在
-	count, err := data_manage.GetBaseFromSciClassifyCount(classifyName, item.ParentId)
-	if err != nil {
-		errMsg = "判断名称是否已存在失败"
-		return
-	}
-	if count > 0 {
-		errMsg = "分类名称已存在,请重新输入"
-		err = errors.New(errMsg)
-		return
-	}
+		// 修改数据
+		err = data_manage.EditBaseFromSciClassifyEn(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
+	default:
+		// 名字相同,那么就直接返回
+		if item.ClassifyName == classifyName {
+			return
+		}
 
-	// 修改数据
-	err = data_manage.EditBaseFromSciClassify(classifyId, classifyName)
-	if err != nil {
-		errMsg = "保存失败"
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromSciClassifyCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
+
+		// 修改数据
+		err = data_manage.EditBaseFromSciClassify(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
 	}
+
 	return
 }
 

+ 71 - 30
services/data/base_from_smm.go

@@ -10,10 +10,10 @@ import (
 	"encoding/hex"
 	"encoding/json"
 	"errors"
-	"fmt"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
+	"fmt"
 	"io/ioutil"
 	"net/http"
 	"net/url"
@@ -379,16 +379,27 @@ func getApiData(token string, apiName string, sdatetime string, edatetime string
 }
 
 // AddSmmClassify 添加SMM分类
-func AddSmmClassify(classifyName string, parentId, sysUserId int, sysUserName string) (classifyInfo *data_manage.BaseFromSmmClassify, err error, errMsg string) {
-	count, err := data_manage.GetBaseFromSmmClassifyCount(classifyName, parentId)
-	if err != nil {
-		errMsg = `判断名称是否已存在失败`
-		return
-	}
-	if count > 0 {
-		errMsg = `分类名称已存在,请重新输入`
-		return
+func AddSmmClassify(classifyName string, parentId, sysUserId int, sysUserName, lang string) (classifyInfo *data_manage.BaseFromSmmClassify, err error, errMsg string) {
+	// 校验分类名称相同的数量
+	{
+		var count int
+		switch lang {
+		case utils.EnLangVersion:
+			count, err = data_manage.GetBaseFromSmmClassifyEnCount(classifyName, parentId)
+		default:
+			count, err = data_manage.GetBaseFromSmmClassifyCount(classifyName, parentId)
+		}
+		if err != nil {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+		if count > 0 {
+			errMsg = `分类名称已存在,请重新输入`
+			err = errors.New(errMsg)
+			return
+		}
 	}
+
 	level := 1
 	if parentId > 0 {
 		parentClassify, e := data_manage.GetBaseFromSmmClassifyById(parentId)
@@ -406,6 +417,7 @@ func AddSmmClassify(classifyName string, parentId, sysUserId int, sysUserName st
 	}
 	classifyInfo = &data_manage.BaseFromSmmClassify{
 		ClassifyName:    classifyName,
+		ClassifyNameEn:  classifyName,
 		ParentId:        parentId,
 		SysUserId:       sysUserId,
 		SysUserRealName: sysUserName,
@@ -426,35 +438,64 @@ func AddSmmClassify(classifyName string, parentId, sysUserId int, sysUserName st
 }
 
 // EditSmmClassify 编辑Smm分类
-func EditSmmClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
+func EditSmmClassify(classifyId int, classifyName, lang string, sysUser *system.Admin) (err error, errMsg string) {
 	item, err := data_manage.GetBaseFromSmmClassifyById(classifyId)
 	if err != nil {
 		errMsg = `保存失败`
 		return
 	}
 
-	// 名字相同,那么就直接返回
-	if item.ClassifyName == classifyName {
-		return
-	}
+	switch lang {
+	case utils.EnLangVersion:
+		// 名字相同,那么就直接返回
+		if item.ClassifyNameEn == classifyName {
+			return
+		}
 
-	// 判断名称是否已存在
-	count, err := data_manage.GetBaseFromSmmClassifyCount(classifyName, item.ParentId)
-	if err != nil {
-		errMsg = "判断名称是否已存在失败"
-		return
-	}
-	if count > 0 {
-		errMsg = "分类名称已存在,请重新输入"
-		err = errors.New(errMsg)
-		return
-	}
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromSmmClassifyEnCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
 
-	// 修改数据
-	err = data_manage.EditBaseFromSmmClassify(classifyId, classifyName)
-	if err != nil {
-		errMsg = "保存失败"
+		// 修改数据
+		err = data_manage.EditBaseFromSmmClassifyEn(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
+	default:
+		// 名字相同,那么就直接返回
+		if item.ClassifyName == classifyName {
+			return
+		}
+
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromSmmClassifyCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
+
+		// 修改数据
+		err = data_manage.EditBaseFromSmmClassify(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
 	}
+
 	return
 }
 

+ 154 - 0
services/data/chart_classify.go

@@ -1,6 +1,7 @@
 package data
 
 import (
+	"errors"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data/data_manage_permission"
@@ -220,3 +221,156 @@ func HandleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermi
 
 	return
 }
+
+// AddChartClassify
+// @Description: 添加图表分类
+// @author: Roc
+// @datetime 2024-04-17 14:48:23
+// @param chartClassifyName string
+// @param parentId int
+// @param level int
+// @param source int
+// @param lang string
+// @param sysUser *system.Admin
+// @return classifyInfo *data_manage.ChartClassify
+// @return err error
+// @return errMsg string
+// @return isSendEmail bool
+func AddChartClassify(chartClassifyName string, parentId, level, source int, lang string, sysUser *system.Admin) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = "保存分类失败"
+
+	// 校验分类名称相同的数量
+	{
+		var count int
+		switch lang {
+		case utils.EnLangVersion:
+			count, err = data_manage.GetChartClassifyEnCount(chartClassifyName, parentId, source)
+		default:
+			count, err = data_manage.GetChartClassifyCount(chartClassifyName, parentId, source)
+		}
+		if err != nil {
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+	}
+
+	//获取该层级下最大的排序数
+	maxSort, err := data_manage.GetChartClassifyMaxSort(parentId, source)
+
+	classifyInfo = new(data_manage.ChartClassify)
+	classifyInfo.ParentId = parentId
+	classifyInfo.ChartClassifyName = chartClassifyName
+	classifyInfo.ChartClassifyNameEn = chartClassifyName
+	classifyInfo.HasData = 0
+	classifyInfo.CreateTime = time.Now()
+	classifyInfo.ModifyTime = time.Now()
+	classifyInfo.SysUserId = sysUser.AdminId
+	classifyInfo.SysUserRealName = sysUser.RealName
+	classifyInfo.Level = level + 1
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	classifyInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	classifyInfo.Sort = maxSort + 1
+	classifyInfo.Source = source
+
+	_, err = data_manage.AddChartClassify(classifyInfo)
+	if err != nil {
+		return
+	}
+
+	// 目前只有ETA图库需要继承分类权限
+	if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
+		go data_manage_permission.InheritParentClassify(5, classifyInfo.Source, classifyInfo.ChartClassifyId, classifyInfo.ParentId, classifyInfo.ChartClassifyName)
+	}
+
+	return
+}
+
+// EditChartClassify
+// @Description: 修改图表分类
+// @author: Roc
+// @datetime 2024-04-17 14:59:37
+// @param chartClassifyId int
+// @param source int
+// @param chartClassifyName string
+// @param lang string
+// @param sysUser *system.Admin
+// @return classifyInfo *data_manage.ChartClassify
+// @return err error
+// @return errMsg string
+// @return isSendEmail bool
+func EditChartClassify(chartClassifyId, source int, chartClassifyName, lang string, sysUser *system.Admin) (classifyInfo *data_manage.ChartClassify, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = "保存失败"
+
+	// 获取分类信息
+	classifyInfo, err = data_manage.GetChartClassifyById(chartClassifyId)
+	if err != nil {
+		return
+	}
+
+	// 分类来源校验
+	if classifyInfo.Source != source {
+		errMsg = "图表分类异常"
+		err = errors.New(fmt.Sprintf("图表分类来源异常,修改来源:%d,分类来源:%d", source, classifyInfo.Source))
+		isSendEmail = false
+		return
+	}
+
+	// 需要变更的字段
+	updateCols := make([]string, 0)
+
+	// 语言版本校验
+	switch lang {
+	case utils.EnLangVersion:
+		if classifyInfo.ChartClassifyNameEn != chartClassifyName {
+			count, tmpErr := data_manage.GetChartClassifyEnCount(chartClassifyName, classifyInfo.ParentId, source)
+			if tmpErr != nil {
+				errMsg = "判断名称是否已存在失败"
+				err = errors.New("判断名称是否已存在失败,Err:" + tmpErr.Error())
+				return
+			}
+			if count > 0 {
+				errMsg = "分类名称已存在,请重新输入"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
+
+			classifyInfo.ChartClassifyNameEn = chartClassifyName
+			classifyInfo.ModifyTime = time.Now()
+			updateCols = append(updateCols, "ChartClassifyNameEn", "ModifyTime")
+		}
+	default:
+		if classifyInfo.ChartClassifyName != chartClassifyName {
+			count, tmpErr := data_manage.GetChartClassifyCount(chartClassifyName, classifyInfo.ParentId, source)
+			if tmpErr != nil {
+				errMsg = "判断名称是否已存在失败"
+				err = errors.New("判断名称是否已存在失败,Err:" + tmpErr.Error())
+				return
+			}
+			if count > 0 {
+				errMsg = "分类名称已存在,请重新输入"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
+
+			classifyInfo.ChartClassifyName = chartClassifyName
+			classifyInfo.ModifyTime = time.Now()
+			updateCols = append(updateCols, "ChartClassifyName", "ModifyTime")
+		}
+	}
+
+	if len(updateCols) > 0 {
+		err = classifyInfo.Update(updateCols)
+	}
+
+	return
+}

+ 78 - 46
services/data/chart_info.go

@@ -1874,7 +1874,7 @@ func GetSectionScatterChartData(chartInfoId int, mappingList []*data_manage.Char
 }
 
 // AddChartInfo 添加图表
-func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealName string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealName, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true // 默认错误的时候要发送邮件
 
 	req.ChartName = strings.Trim(req.ChartName, " ")
@@ -2074,29 +2074,38 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 	//	br.Msg = "所选指标已存在相同指标"
 	//	return
 	//}
-	//判断图表是否存在
-	var condition string
-	var pars []interface{}
 
-	// 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
-	//condition += " AND chart_classify_id=? "
-	//pars = append(pars, req.ChartClassifyId)
-
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartName, utils.CHART_SOURCE_DEFAULT)
+	{
+		var count int // 同名指标数量
+		//判断图表是否存在
+		var condition string
+		var pars []interface{}
+
+		// 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
+		//condition += " AND chart_classify_id=? "
+		//pars = append(pars, req.ChartClassifyId)
+
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? AND source = ? "
+		default:
+			condition += " AND chart_name = ? AND source = ? "
+		}
+		pars = append(pars, req.ChartName, utils.CHART_SOURCE_DEFAULT)
 
-	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
+		count, err = data_manage.GetChartInfoCountByCondition(condition, pars)
+		if err != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+			return
+		}
 
-	if count > 0 {
-		errMsg = "图表已存在,请重新填写"
-		err = errors.New("判断图表名称是否存在失败")
-		isSendEmail = false
-		return
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
 
 	barChartConf := `` //柱方图的配置信息
@@ -2127,6 +2136,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 
 	chartInfo = new(data_manage.ChartInfo)
 	chartInfo.ChartName = req.ChartName
+	chartInfo.ChartNameEn = req.ChartName
 	chartInfo.EdbInfoIds = edbInfoIdStr
 	chartInfo.ChartClassifyId = req.ChartClassifyId
 	chartInfo.SysUserId = sysUserId
@@ -2193,8 +2203,8 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 		mapItem.EdbInfoId = v.EdbInfoId
 		mapItem.CreateTime = time.Now()
 		mapItem.ModifyTime = time.Now()
-		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-		mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", v.EdbInfoId, "_", timestamp))
+		edbTimestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", v.EdbInfoId, "_", edbTimestamp))
 		mapItem.MaxData = v.MaxData
 		mapItem.MinData = v.MinData
 		mapItem.IsOrder = v.IsOrder
@@ -2229,7 +2239,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 }
 
 // EditChartInfo 编辑图表
-func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin, lang string) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true // 默认错误的时候要发送邮件
 
 	req.ChartName = strings.Trim(req.ChartName, " ")
@@ -2486,31 +2496,40 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 	//	br.Msg = "所选指标已存在相同指标"
 	//	return
 	//}
-	//判断图表是否存在
-	var condition string
-	var pars []interface{}
-	condition += " AND chart_info_id<>? "
-	pars = append(pars, req.ChartInfoId)
-
-	// 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
-	//condition += " AND chart_classify_id=? "
-	//pars = append(pars, req.ChartClassifyId)
 
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartName, utils.CHART_SOURCE_DEFAULT)
+	// 判断图表是否存在
+	{
+		var count int
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id<>? "
+		pars = append(pars, req.ChartInfoId)
+
+		// 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
+		//condition += " AND chart_classify_id=? "
+		//pars = append(pars, req.ChartClassifyId)
+
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? AND source = ? "
+		default:
+			condition += " AND chart_name = ? AND source = ? "
+		}
+		pars = append(pars, req.ChartName, utils.CHART_SOURCE_DEFAULT)
 
-	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
+		count, err = data_manage.GetChartInfoCountByCondition(condition, pars)
+		if err != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+			return
+		}
 
-	if count > 0 {
-		errMsg = "图表已存在,请重新填写"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
 
 	barChartConf := `` //柱方图的配置信息
@@ -2540,6 +2559,19 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 	// 图表启用与否
 	disableVal := CheckIsDisableChart(edbInfoIdArr)
 
+	switch lang {
+	case utils.EnLangVersion:
+		req.ChartNameEn = req.ChartName
+		req.ChartName = chartItem.ChartName
+
+		if req.UnitEn == `` {
+			req.UnitEn = req.Unit
+		}
+		req.Unit = chartItem.Unit
+	default:
+		req.ChartNameEn = chartItem.ChartNameEn
+		req.UnitEn = chartItem.UnitEn
+	}
 	err = data_manage.EditChartInfoAndMapping(&req, edbInfoIdStr, calendar, dateType, disableVal, barChartConf, chartEdbInfoList, seasonExtraConfig)
 	if err != nil {
 		errMsg = "保存失败"

+ 56 - 38
services/data/correlation/chart_info.go

@@ -647,7 +647,7 @@ func GetChartAndCorrelationInfo(chartInfoId int) (chartInfo *data_manage.ChartIn
 }
 
 // AddChartInfo 添加图表
-func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	req.ChartName = strings.Trim(req.ChartName, " ")
@@ -761,29 +761,39 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
 	}
 	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 	var chartInfoId int
+
 	// 判断图表是否存在
-	var condition string
-	var pars []interface{}
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartName, source)
-	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
+	{
+		var condition string
+		var pars []interface{}
+
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? AND source = ? "
+		default:
+			condition += " AND chart_name=? AND source = ? "
+		}
+		pars = append(pars, req.ChartName, source)
+		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
 
-	if count > 0 {
-		errMsg = "图表已存在,请重新填写"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
 
 	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
 
 	chartInfo = new(data_manage.ChartInfo)
 	chartInfo.ChartName = req.ChartName
+	chartInfo.ChartNameEn = req.ChartName
 	chartInfo.EdbInfoIds = edbInfoIdStr
 	chartInfo.ChartClassifyId = req.ChartClassifyId
 	chartInfo.SysUserId = sysUser.AdminId
@@ -819,8 +829,8 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
 		mapItem.EdbInfoId = v.EdbInfoId
 		mapItem.CreateTime = time.Now()
 		mapItem.ModifyTime = time.Now()
-		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-		mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
+		edbTimestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + edbTimestamp + "_" + strconv.Itoa(v.EdbInfoId))
 		mapItem.IsOrder = true
 		mapItem.IsAxis = 1
 		mapItem.EdbInfoType = 1
@@ -910,7 +920,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
 }
 
 // EditChartInfo 编辑图表
-func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin, lang string) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
@@ -1043,24 +1053,32 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 
 	//判断图表是否存在
-	var condition string
-	var pars []interface{}
-	condition += " AND chart_info_id <> ? "
-	pars = append(pars, req.ChartInfoId)
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartName, chartItem.Source)
-	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
-	if count > 0 {
-		errMsg = "图表已存在,请重新填写"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id <> ? "
+		pars = append(pars, req.ChartInfoId)
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? AND source = ? "
+		default:
+			condition += " AND chart_name=? AND source = ? "
+		}
+		pars = append(pars, req.ChartName, chartItem.Source)
+		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
+
 	correlationChart := new(data_manage.ChartInfoCorrelation)
 	if e := correlationChart.GetItemById(chartItem.ChartInfoId); e != nil {
 		errMsg = "操作失败"
@@ -1145,7 +1163,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 }
 
 // CopyChartInfo 复制图表
-func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	configSource := 2
 	isSendEmail = true
 	// 获取相关性图的配置
@@ -1177,7 +1195,7 @@ func CopyChartInfo(configId, classifyId int, chartName string, correlationChartI
 		MarkersAreas:         oldChartInfo.MarkersAreas,
 	}
 	chartSource := utils.CHART_SOURCE_CORRELATION // 默认是相关性图
-	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser)
+	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser, lang)
 	if err != nil {
 		return
 	}

+ 14 - 19
services/data/cross_variety/chart.go

@@ -559,10 +559,11 @@ func GetXYEdbIdList(tagX, tagY int, varietyList []int) (xVarietyEdbMap, yVariety
 // @param req request.AddChartReq
 // @param sysUser *system.Admin
 // @return chartInfo *data_manage.ChartInfo
+// @return lang string
 // @return err error
 // @return errMsg string
 // @return isSendEmail bool
-func AddChartInfo(req request.AddChartReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func AddChartInfo(req request.AddChartReq, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	source := utils.CHART_SOURCE_CROSS_HEDGING
@@ -643,22 +644,10 @@ func AddChartInfo(req request.AddChartReq, sysUser *system.Admin) (chartInfo *da
 		// 分类没有,需要创建新的分类,那么err置空
 		err = nil
 
-		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-		chartClassify = &data_manage.ChartClassify{
-			ChartClassifyId:   0,
-			ChartClassifyName: sysUser.RealName,
-			ParentId:          0,
-			HasData:           0,
-			CreateTime:        time.Now(),
-			ModifyTime:        time.Now(),
-			SysUserId:         sysUser.AdminId,
-			SysUserRealName:   sysUser.RealName,
-			Level:             1,
-			UniqueCode:        utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
-			Sort:              0,
-			Source:            source,
+		_, err, errMsg, isSendEmail = data.AddChartClassify(sysUser.RealName, 0, 1, source, lang, sysUser)
+		if err != nil {
+			return
 		}
-		_, err = data_manage.AddChartClassify(chartClassify)
 	}
 
 	// 数据校验(品种、标签、指标)
@@ -739,6 +728,7 @@ func AddChartInfo(req request.AddChartReq, sysUser *system.Admin) (chartInfo *da
 
 	chartInfo = new(data_manage.ChartInfo)
 	chartInfo.ChartName = req.ChartName
+	chartInfo.ChartNameEn = req.ChartNameEn
 	//chartInfo.EdbInfoIds = edbInfoIdStr
 	//chartInfo.ChartClassifyId = req.ChartClassifyId
 	chartInfo.SysUserId = sysUser.AdminId
@@ -820,7 +810,7 @@ func AddChartInfo(req request.AddChartReq, sysUser *system.Admin) (chartInfo *da
 // @return err error
 // @return errMsg string
 // @return isSendEmail bool
-func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func EditChartInfo(req request.EditChartReq, sysUser *system.Admin, lang string) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
@@ -992,14 +982,19 @@ func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *
 	//	return
 	//}
 
-	chartItem.ChartName = req.ChartName
+	switch lang {
+	case utils.EnLangVersion:
+		chartItem.ChartNameEn = req.ChartName
+	default:
+		chartItem.ChartName = req.ChartName
+	}
 	chartItem.ExtraConfig = string(extraConfigByte)
 	chartItem.ModifyTime = time.Now()
 	chartItem.LeftMin = req.LeftMin
 	chartItem.LeftMax = req.LeftMax
 	chartItem.XMin = req.XMin
 	chartItem.XMax = req.XMax
-	chartUpdateCols := []string{"ChartName", "ExtraConfig", "ModifyTime", "LeftMin", "LeftMax", "XMin", "XMax"}
+	chartUpdateCols := []string{"ChartName", "ChartNameEn", "ExtraConfig", "ModifyTime", "LeftMin", "LeftMax", "XMin", "XMax"}
 
 	// 跨品种分析配置
 	chartInfoCrossVariety, err := cross_varietyModel.GetChartInfoCrossVarietyByChartInfoId(chartItem.ChartInfoId)

+ 20 - 4
services/data/data_manage_permission/data_move.go

@@ -257,6 +257,8 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 					Code:           v.TradeCode,
 					Name:           v.SecName,
 					ClassifyName:   v.ClassifyName,
+					NameEn:         v.SecName,
+					ClassifyNameEn: v.ClassifyName,
 					CreateUserId:   v.UserId,
 					CreateUserName: adminMap[v.UserId],
 				})
@@ -292,6 +294,7 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 				DataId: strconv.Itoa(v.BaseFromMysteelChemicalIndexId),
 				Code:   v.IndexCode,
 				Name:   v.IndexName,
+				NameEn: v.IndexName,
 				//ClassifyName: v.,
 				CreateUserId:   v.SysUserId,
 				CreateUserName: v.SysUserRealName,
@@ -299,8 +302,8 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 		}
 	case 3, 4: //ETA指标库、ETA预测指标
 		if keyword != `` {
-			condition += " AND (edb_code like ? OR edb_name like ? OR sys_user_real_name like ? ) "
-			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
+			condition += " AND (edb_code like ? OR edb_name like ? OR edb_name_en like ? OR sys_user_real_name like ? ) "
+			pars = utils.GetLikeKeywordPars(pars, keyword, 4)
 		}
 		if userId > 0 {
 			condition += ` AND sys_user_id = ? `
@@ -332,6 +335,7 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 				DataId: strconv.Itoa(v.EdbInfoId),
 				Code:   v.EdbCode,
 				Name:   v.EdbName,
+				NameEn: v.EdbNameEn,
 				//ClassifyName: v.,
 				CreateUserId:   v.SysUserId,
 				CreateUserName: v.SysUserRealName,
@@ -345,8 +349,8 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 
 		// 关键字搜索
 		if keyword != `` {
-			condition += " AND (chart_name like ?  OR sys_user_real_name like ? ) "
-			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			condition += " AND (chart_name like ? or chart_name_en like ?  OR sys_user_real_name like ? ) "
+			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
 		}
 		if userId > 0 {
 			condition += ` AND sys_user_id = ? `
@@ -373,8 +377,10 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 			return
 		}
 		firstClassifyNameMap := make(map[int]string)
+		firstClassifyNameEnMap := make(map[int]string)
 		for _, v := range firstClassifyList {
 			firstClassifyNameMap[v.ChartClassifyId] = v.ChartClassifyName
+			firstClassifyNameEnMap[v.ChartClassifyId] = v.ChartClassifyNameEn
 		}
 		secondClassList, tmpErr := data_manage.GetChartClassifyAll(1)
 		if tmpErr != nil {
@@ -382,12 +388,18 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 			return
 		}
 		secondClassifyNameMap := make(map[int]string)
+		secondClassifyNameEnMap := make(map[int]string)
 		for _, v := range secondClassList {
 			firstName := firstClassifyNameMap[v.ParentId]
+			firstNameEn := firstClassifyNameEnMap[v.ParentId]
 			if firstName != `` {
 				firstName = firstName + " / "
 			}
+			if firstNameEn != `` {
+				firstNameEn = firstNameEn + " / "
+			}
 			secondClassifyNameMap[v.ChartClassifyId] = firstName + v.ChartClassifyName
+			secondClassifyNameEnMap[v.ChartClassifyId] = firstNameEn + v.ChartClassifyNameEn
 		}
 
 		for _, v := range tmpList {
@@ -395,6 +407,8 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 				DataId:         strconv.Itoa(v.ChartInfoId),
 				Name:           v.ChartName,
 				ClassifyName:   secondClassifyNameMap[v.ChartClassifyId],
+				NameEn:         v.ChartNameEn,
+				ClassifyNameEn: secondClassifyNameEnMap[v.ChartClassifyId],
 				CreateUserId:   v.SysUserId,
 				CreateUserName: v.SysUserRealName,
 			})
@@ -454,6 +468,8 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 				DataId:         strconv.Itoa(v.ExcelInfoId),
 				Name:           v.ExcelClassifyName,
 				ClassifyName:   secondClassifyNameMap[v.ExcelClassifyId],
+				NameEn:         v.ExcelClassifyName,
+				ClassifyNameEn: secondClassifyNameMap[v.ExcelClassifyId],
 				CreateUserId:   v.SysUserId,
 				CreateUserName: v.SysUserRealName,
 			})

+ 78 - 26
services/data/edb_classify.go

@@ -252,20 +252,33 @@ func GetEdbClassifyNameListByAdminId(adminId int64) (classifyNameList []string,
 }
 
 // AddEdbClassify 添加指标分类
-func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8, sysUserId int, sysUserName string) (classifyInfo *data_manage.EdbClassify, err error, errMsg string) {
-	count, err := data_manage.GetEdbClassifyCount(classifyName, parentId, classifyType)
-	if err != nil {
-		errMsg = `判断名称是否已存在失败`
-		return
-	}
-	if count > 0 {
-		errMsg = `分类名称已存在,请重新输入`
-		return
+func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8, sysUserId int, sysUserName, lang string) (classifyInfo *data_manage.EdbClassify, err error, errMsg string) {
+	// 校验分类名称相同的数量
+	{
+		var count int
+		switch lang {
+		case utils.EnLangVersion:
+			count, err = data_manage.GetEdbClassifyEnCount(classifyName, parentId, classifyType)
+		default:
+			count, err = data_manage.GetEdbClassifyCount(classifyName, parentId, classifyType)
+		}
+		if err != nil {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+		if count > 0 {
+			errMsg = `分类名称已存在,请重新输入`
+			err = errors.New(errMsg)
+			return
+		}
 	}
+
+	// 层级校验
 	if level > 6 {
 		errMsg = `最高只支持添加6级分类`
 		return
 	}
+
 	//获取该层级下最大的排序数
 	maxSort, err := GetEdbClassifyMaxSort(parentId, classifyType)
 	if err != nil {
@@ -295,6 +308,7 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 		//ClassifyId:      0,
 		ClassifyType:    classifyType,
 		ClassifyName:    classifyName,
+		ClassifyNameEn:  classifyName,
 		ParentId:        parentId,
 		RootId:          rootId,
 		HasData:         0,
@@ -335,7 +349,7 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 }
 
 // EditEdbClassify 编辑指标分类
-func EditEdbClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
+func EditEdbClassify(classifyId int, classifyName, lang string, sysUser *system.Admin) (err error, errMsg string) {
 	item, err := data_manage.GetEdbClassifyById(classifyId)
 	if err != nil {
 		errMsg = `保存失败`
@@ -372,27 +386,65 @@ func EditEdbClassify(classifyId int, classifyName string, sysUser *system.Admin)
 
 	}
 
-	// 名字相同,那么就直接返回
-	if item.ClassifyName == classifyName {
-		return
-	}
+	// 需要变更的字段
+	updateCols := make([]string, 0)
 
-	// 判断名称是否已存在
-	count, err := data_manage.GetEdbClassifyCount(classifyName, item.ParentId, item.ClassifyType)
-	if err != nil {
-		errMsg = "判断名称是否已存在失败"
-		return
-	}
-	if count > 0 {
-		errMsg = "分类名称已存在,请重新输入"
-		return
+	switch lang {
+	case utils.EnLangVersion:
+		// 名字相同,那么就直接返回
+		if item.ClassifyNameEn == classifyName {
+			return
+		}
+
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetEdbClassifyEnCount(classifyName, item.ParentId, item.ClassifyType)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
+
+		item.ClassifyNameEn = classifyName
+		item.LastModifyUserId = sysUser.AdminId
+		item.LastModifyUserRealName = sysUser.RealName
+		updateCols = append(updateCols, "ClassifyNameEn", "LastModifyUserId", "LastModifyUserRealName")
+	default:
+		// 名字相同,那么就直接返回
+		if item.ClassifyName == classifyName {
+			return
+		}
+
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetEdbClassifyCount(classifyName, item.ParentId, item.ClassifyType)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
+		item.ClassifyName = classifyName
+		item.LastModifyUserId = sysUser.AdminId
+		item.LastModifyUserRealName = sysUser.RealName
+		updateCols = append(updateCols, "ClassifyName", "LastModifyUserId", "LastModifyUserRealName")
 	}
 
 	// 修改数据
-	err = data_manage.EditEdbClassify(classifyId, classifyName, sysUser.AdminId, sysUser.RealName)
-	if err != nil {
-		errMsg = "保存失败"
+	if len(updateCols) > 0 {
+		err = item.Update(updateCols)
+		if err != nil {
+			errMsg = "保存失败"
+		}
 	}
+
 	return
 }
 

+ 69 - 20
services/data/edb_info.go

@@ -1719,29 +1719,39 @@ func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBase
 }
 
 // EdbInfoAdd 添加指标到指标库
-func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName, lang string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
+
 	//判断指标名称是否存在
-	var condition string
-	var pars []interface{}
-	//condition += " AND source=? "
-	//pars = append(pars, source)
+	{
+		var count int
+		var condition string
+		var pars []interface{}
 
-	condition += " AND edb_name=? "
-	pars = append(pars, edbName)
+		//condition += " AND source=? "
+		//pars = append(pars, source)
 
-	count, err := data_manage.GetEdbInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断指标名称是否存在失败"
-		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
-		return
-	}
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND edb_name_en = ? "
+		default:
+			condition += " AND edb_name=? "
+		}
+		pars = append(pars, edbName)
 
-	if count > 0 {
-		errMsg = "指标名称已存在,请重新填写"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
+		count, err = data_manage.GetEdbInfoCountByCondition(condition, pars)
+		if err != nil {
+			errMsg = "判断指标名称是否存在失败"
+			err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+			return
+		}
+
+		if count > 0 {
+			errMsg = "指标名称已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
 
 	edbInfo = new(data_manage.EdbInfo)
@@ -1810,9 +1820,11 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 
 	edbInfo.EdbCode = edbCode
 	edbInfo.EdbName = edbName
+	edbInfo.EdbNameEn = edbName
 	edbInfo.EdbNameSource = edbName
 	edbInfo.Frequency = frequency
 	edbInfo.Unit = unit
+	edbInfo.UnitEn = frequency
 	edbInfo.StartDate = startDate
 	edbInfo.EndDate = endDate
 	edbInfo.ClassifyId = classifyId
@@ -1868,6 +1880,7 @@ func TraceEdbInfoByEdbInfoId(edbInfoId, sysUserId int) (traceEdbInfo data_manage
 		EdbInfoId:   edbInfoId,
 		EdbInfoType: edbInfo.EdbInfoType,
 		EdbName:     edbInfo.EdbName,
+		EdbNameEn:   edbInfo.EdbNameEn,
 		EdbType:     edbInfo.EdbType,
 		//Source:      edbInfo.Source,
 		UniqueCode: edbInfo.UniqueCode,
@@ -1952,6 +1965,7 @@ func TraceEdbInfoByEdbInfoIdList(edbInfoIdList []int) (traceEdbInfoList []data_m
 			EdbInfoId:   edbInfo.EdbInfoId,
 			EdbInfoType: edbInfo.EdbInfoType,
 			EdbName:     edbInfo.EdbName,
+			EdbNameEn:   edbInfo.EdbNameEn,
 			EdbType:     edbInfo.EdbType,
 			//Source:      edbInfo.Source,
 			UniqueCode: edbInfo.UniqueCode,
@@ -2061,7 +2075,7 @@ func handleTraceEdbInfo(traceEdbInfoResp data_manage.TraceEdbInfoResp, parentEdb
 	}
 
 	//traceEdbInfoResp.EdbName = edbInfo.EdbName
-	traceEdbInfoResp.EdbName, traceEdbInfoResp.RuleTitle = getEdbRuleTitle(edbInfo, parentEdbInfo, traceEdbInfoResp.Child, edbInfoMap, edbMappingMap)
+	traceEdbInfoResp.EdbName, traceEdbInfoResp.EdbNameEn, traceEdbInfoResp.RuleTitle, traceEdbInfoResp.RuleTitleEn = getEdbRuleTitle(edbInfo, parentEdbInfo, traceEdbInfoResp.Child, edbInfoMap, edbMappingMap)
 
 	if traceEdbInfoResp.Child != nil && len(traceEdbInfoResp.Child) > 0 {
 		for k, v := range traceEdbInfoResp.Child {
@@ -2080,9 +2094,11 @@ func handleTraceEdbInfo(traceEdbInfoResp data_manage.TraceEdbInfoResp, parentEdb
 }
 
 // getEdbRule 获取规则名称
-func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []data_manage.TraceEdbInfoResp, edbInfoMap map[int]*data_manage.EdbInfo, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (edbName, ruleTitle string) {
+func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []data_manage.TraceEdbInfoResp, edbInfoMap map[int]*data_manage.EdbInfo, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (edbName, edbNameEn, ruleTitle, ruleTitleEn string) {
 	edbName = edbInfo.EdbName
+	edbNameEn = edbInfo.EdbNameEn
 	ruleTitle = `来源于` + edbInfo.SourceName
+	ruleTitleEn = `Source From: ` + edbInfo.SourceName
 
 	if parentEdbInfo != nil {
 		edbMappingList, ok := edbMappingMap[parentEdbInfo.EdbInfoId]
@@ -2095,6 +2111,7 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			for _, v := range edbMappingList {
 				if v.FromEdbInfoId == edbInfo.EdbInfoId {
 					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, v.FromTag)
+					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbNameEn, v.FromTag)
 				}
 			}
 
@@ -2102,12 +2119,16 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			for _, v := range edbMappingList {
 				if v.FromEdbInfoId == edbInfo.EdbInfoId {
 					tmpName := ``
+					tmpNameEn := ``
 					if v.FromTag == `A` {
 						tmpName = `拼接日期前`
+						tmpNameEn = `Before Concatenation Date:`
 					} else if v.FromTag == `B` {
 						tmpName = `拼接日期后`
+						tmpNameEn = `After Concatenation Date:`
 					}
 					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, tmpName)
+					edbNameEn = fmt.Sprintf("%s(%s)", edbInfo.EdbNameEn, tmpNameEn)
 				}
 			}
 		case utils.DATA_SOURCE_CALCULATE_NHCC, utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //计算指标(拟合残差)
@@ -2115,12 +2136,16 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 				//(需对上游指标+自变量,领先10天/因变量)
 				if v.FromEdbInfoId == edbInfo.EdbInfoId {
 					tmpName := ``
+					tmpNameEn := ``
 					if v.FromTag == `A` {
 						tmpName = fmt.Sprintf(`自变量,领先%d天`, v.MoveValue)
+						tmpNameEn = fmt.Sprintf(`Independent Variable, Lead %d Days:`, v.MoveValue)
 					} else if v.FromTag == `B` {
 						tmpName = `因变量`
+						tmpNameEn = `Dependent Variable`
 					}
 					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, tmpName)
+					edbNameEn = fmt.Sprintf("%s(%s)", edbInfo.EdbNameEn, tmpNameEn)
 				}
 			}
 		case utils.DATA_SOURCE_CALCULATE_CORRELATION: // 滚动相关性
@@ -2147,22 +2172,31 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 		ruleTitle = "=" + edbInfo.CalculateFormula
 	case utils.DATA_SOURCE_CALCULATE_LJZZY, utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY:
 		ruleTitle = `累计转月值计算`
+		ruleTitleEn = `Cumulative to Monthly Calculation`
 	case utils.DATA_SOURCE_CALCULATE_TBZ, utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ:
 		ruleTitle = `同比值计算`
+		ruleTitleEn = `Year-on-Year Value Calculation`
 	case utils.DATA_SOURCE_CALCULATE_TCZ, utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ:
 		ruleTitle = `同差值计算`
+		ruleTitleEn = `Yearly Difference Calculation`
 	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS:
 		ruleTitle = fmt.Sprintf("N数值移动均值计算(N=%s)", edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("N-Value Moving Average Calculation(N=%s)", edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ:
 		ruleTitle = fmt.Sprintf("N数值环比值计算(N=%s)", edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("N-Value Sequential Comparison Calculation(N=%s)", edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ:
 		ruleTitle = fmt.Sprintf("N数值环差值计算(N=%s)", edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("N-Value Sequential Difference Calculation(N=%s)", edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT:
 		moveType := `领先`
+		moveTypeEn := `Lead`
 		if edbInfo.MoveType == 2 {
 			moveType = "滞后"
+			moveTypeEn = `Lag`
 		}
 		ruleTitle = fmt.Sprintf("时间移位计算(%s%s%s)", moveType, edbInfo.CalculateFormula, edbInfo.MoveFrequency)
+		ruleTitleEn = fmt.Sprintf("Time Shift Calculation(%s%s%s)", moveTypeEn, edbInfo.CalculateFormula, edbInfo.MoveFrequency)
 	case utils.DATA_SOURCE_CALCULATE_BP, utils.DATA_SOURCE_PREDICT_CALCULATE_BP: // 变频
 		childFrequency := ``
 		if len(childList) > 0 {
@@ -2172,14 +2206,19 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 
 		}
 		ruleTitle = fmt.Sprintf("升频计算(%s转%s)", childFrequency, edbInfo.Frequency)
+		ruleTitleEn = fmt.Sprintf("Upsampling Calculation(%s转%s)", childFrequency, edbInfo.Frequency)
 	case utils.DATA_SOURCE_CALCULATE_ZJPJ, utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ: // 直接拼接
 		ruleTitle = fmt.Sprintf("直接拼接计算(%s)", edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("Direct Concatenation Calculation(%s)", edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_LJZTBPJ, utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ: // 累计值同比拼
 		ruleTitle = fmt.Sprintf("累计值同比值拼接计算(%s)", edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("Cumulative Year-on-Year Concatenation Calculation(%s)", edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_PYTHON:
 		ruleTitle = `代码运算`
+		ruleTitleEn = `Code Computation`
 	case utils.DATA_SOURCE_CALCULATE_CJJX, utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX:
 		ruleTitle = fmt.Sprintf("超季节性计算(N=%s,%s)", edbInfo.CalculateFormula, edbInfo.Calendar)
+		ruleTitleEn = fmt.Sprintf("Super Seasonality Calculation(N=%s,%s)", edbInfo.CalculateFormula, edbInfo.Calendar)
 	case utils.DATA_SOURCE_CALCULATE_NHCC, utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //计算指标(拟合残差)
 		var startDate, endDate string
 		dateList := strings.Split(edbInfo.CalculateFormula, ",")
@@ -2188,10 +2227,13 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			endDate = dateList[1]
 		}
 		ruleTitle = fmt.Sprintf("拟合残差计算(%s至%s)", startDate, endDate)
+		ruleTitleEn = fmt.Sprintf("Fit Residual Calculation(%s至%s)", startDate, endDate)
 	case utils.DATA_SOURCE_CALCULATE_ADJUST:
 		ruleTitle = `数据调整`
+		ruleTitleEn = `Data Adjustment`
 	case utils.DATA_SOURCE_CALCULATE_NH, utils.DATA_SOURCE_PREDICT_CALCULATE_NH:
 		ruleTitle = `年化计算`
+		ruleTitleEn = `Annualization Calculation`
 	case utils.DATA_SOURCE_CALCULATE_KSZS, utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS: // 扩散指数->53
 		type KszsConfig struct {
 			DateType  int      `description:"扩散指标日期;1:全部指标日期并集;2:部分指标日期并集"`
@@ -2247,8 +2289,10 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			}
 		}
 		ruleTitle = fmt.Sprintf("扩散指数计算(%s至%s)", startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
+		ruleTitleEn = fmt.Sprintf("Diffusion Index Calculation(%s to %s)", startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
 	case utils.DATA_SOURCE_STOCK_PLANT:
 		ruleTitle = `来源于装置分析`
+		ruleTitleEn = `Derived from Plant Analysis`
 	case utils.DATA_SOURCE_CALCULATE_CORRELATION:
 		type EdbCalculateFormula struct {
 			BaseCalculateValue int    `description:"基础计算窗口"`
@@ -2264,6 +2308,7 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			return
 		}
 		ruleTitle = fmt.Sprintf("滚动相关性(计算窗口%d%s,B领先A%d%s)", correlationConf.CalculateValue, correlationConf.CalculateUnit, correlationConf.LeadValue, correlationConf.LeadUnit)
+		ruleTitleEn = fmt.Sprintf("Rolling Correlation (Calculation Window %d%s, B Leads A %d%s)", correlationConf.CalculateValue, correlationConf.CalculateUnit, correlationConf.LeadValue, correlationConf.LeadUnit)
 	case utils.DATA_SOURCE_CALCULATE_JP, utils.DATA_SOURCE_PREDICT_CALCULATE_JP:
 		childFrequency := ``
 		if len(childList) > 0 {
@@ -2273,8 +2318,10 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 
 		}
 		ruleTitle = fmt.Sprintf("降频计算(%s转%s,%s)", childFrequency, edbInfo.Frequency, edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("Downsampling Calculation(%s to %s,%s)", childFrequency, edbInfo.Frequency, edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_STANDARD_DEVIATION:
 		ruleTitle = fmt.Sprintf("标准差(滚动%s期)", edbInfo.CalculateFormula)
+		ruleTitleEn = fmt.Sprintf("Standard Deviation (Rolling %s Periods)", edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_PERCENTILE, utils.DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE:
 		type TempCalculate struct {
 			CalculateValue int    `description:"计算窗口"`
@@ -2285,8 +2332,10 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			return
 		}
 		ruleTitle = fmt.Sprintf("百分位(时间长度%d%s)", cf.CalculateValue, cf.CalculateUnit)
+		ruleTitle = fmt.Sprintf("Percentile (Time Length %d%s)", cf.CalculateValue, cf.CalculateUnit)
 	case utils.DATA_SOURCE_CALCULATE_ZSXY, utils.DATA_SOURCE_PREDICT_CALCULATE_ZSXY:
 		ruleTitle = `指数修匀计算`
+		ruleTitle = `Index Smoothing Calculation`
 	}
 
 	return

+ 2 - 2
services/data/edb_info_calculate.go

@@ -633,7 +633,7 @@ func HandleDataByLinearRegression(edbInfoDataList []*data_manage.EdbDataList, ha
 }
 
 // CallCalculateComputeCorrelation 调用计算拟合残差的相关系数
-func CallCalculateComputeCorrelation(data *data_manage.EdbInfoCalculateBatchSaveReqByEdbLib) (val string, err error, errMsg string) {
+func CallCalculateComputeCorrelation(data *data_manage.EdbInfoCalculateBatchSaveReqByEdbLib, lang string) (val string, err error, errMsg string) {
 	errMsg = "计算失败"
 	// 调用指标库去更新
 	reqJson, err := json.Marshal(data)
@@ -642,7 +642,7 @@ func CallCalculateComputeCorrelation(data *data_manage.EdbInfoCalculateBatchSave
 		err = errors.New("参数解析失败,Err:" + err.Error())
 		return
 	}
-	respItem, err := CalculateComputeCorrelation(string(reqJson))
+	respItem, err := CalculateComputeCorrelation(string(reqJson), lang)
 	if err != nil {
 		return
 	}

+ 2 - 2
services/data/excel/custom_analysis_edb.go

@@ -214,7 +214,7 @@ type ResetCustomAnalysisData struct {
 }
 
 // Refresh  刷新表格关联的指标信息
-func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail bool) {
+func Refresh(excelInfo *excel.ExcelInfo, lang string) (err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	list, err := excel.GetAllExcelEdbMappingItemByExcelInfoId(excelInfo.ExcelInfoId)
@@ -282,7 +282,7 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 			err = errors.New(fmt.Sprintf("结构体转对象失败,Err:%s", tmpErr.Error()))
 			return
 		}
-		respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson))
+		respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson), lang)
 		if tmpErr != nil {
 			err = errors.New(fmt.Sprintf("调用指标库去更新,Err:%s", tmpErr.Error()))
 			return

+ 8 - 914
services/data/excel/excel_info.go

@@ -12,16 +12,12 @@ import (
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/shopspring/decimal"
-	"github.com/yidane/formula"
 	"sort"
-	"strconv"
-	"strings"
 	"time"
 )
 
 // GetExcelDetailInfoByExcelInfoId 根据表格id获取表格详情
-func GetExcelDetailInfoByExcelInfoId(excelInfoId, sysUserId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+func GetExcelDetailInfoByExcelInfoId(excelInfoId, sysUserId int, lang string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
 	errMsg = `获取失败`
 	//获取eta表格信息
 	excelInfo, err := excel.GetExcelInfoById(excelInfoId)
@@ -34,11 +30,11 @@ func GetExcelDetailInfoByExcelInfoId(excelInfoId, sysUserId int) (excelDetail re
 		return
 	}
 
-	return formatExcelInfo2Detail(excelInfo, sysUserId)
+	return formatExcelInfo2Detail(excelInfo, sysUserId, lang)
 }
 
 // GetExcelDetailInfoByUnicode 根据表格编码获取表格详情
-func GetExcelDetailInfoByUnicode(unicode string, sysUserId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+func GetExcelDetailInfoByUnicode(unicode string, sysUserId int, lang string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
 	errMsg = `获取失败`
 	// 获取eta表格信息
 	excelInfo, err := excel.GetExcelInfoByUnicode(unicode)
@@ -51,10 +47,10 @@ func GetExcelDetailInfoByUnicode(unicode string, sysUserId int) (excelDetail res
 		return
 	}
 
-	return formatExcelInfo2Detail(excelInfo, sysUserId)
+	return formatExcelInfo2Detail(excelInfo, sysUserId, lang)
 }
 
-func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo, sysUserId int) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
+func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo, sysUserId int, lang string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
 	// 数据权限
 	haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, sysUserId)
 	if err != nil {
@@ -141,7 +137,7 @@ func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo, sysUserId int) (excelDet
 			err = errors.New("表格json转结构体失败,Err:" + err.Error())
 			return
 		}
-		newData, tmpErr, tmpErrMsg := GetMixedTableCellData(result)
+		newData, tmpErr, tmpErrMsg := GetMixedTableCellData(result, lang)
 		if tmpErr != nil {
 			errMsg = "获取失败"
 			if tmpErrMsg != `` {
@@ -434,915 +430,13 @@ func GetFirstHistoryEdbDataList(edbInfo *data_manage.EdbInfo, num int, endDate s
 	return
 }
 
-type TableDataConfig struct {
-	EdbInfoIdList    []int                     `description:"指标id列表,从左至右,从上到下的顺序"`
-	Sort             int                       `description:"日期排序,0:倒序,1:正序"`
-	Data             []ManualData              `description:"数据列表"`
-	Num              int                       `description:"实际数据需要列出来的期数"`
-	RemoveDate       []string                  `description:"不展示的日期"`
-	ManualDate       []string                  `description:"手动配置的日期(未来的日期)"`
-	TableEdbInfoList []TableEdbInfo            `description:"表格内指标信息"`
-	TextRowData      [][]request.ManualDataReq `description:"文本列表"`
-}
-
-type TableEdbInfo struct {
-	EdbInfoId    int    `description:"指标ID"`
-	Tag          string `description:"标签"`
-	EdbName      string `description:"指标名称"`
-	EdbAliasName string `description:"指标别名"`
-	Frequency    string `description:"频度"`
-	Unit         string `description:"单位"`
-}
-
-type ManualData struct {
-	DataType            int                       `description:"数据类型,1:普通的,2:插值法,3:手动输入,4:公式计算"`
-	DataTime            string                    `description:"所属日期"`
-	DataTimeType        int                       `description:"日期类型,1:实际日期;2:未来日期"`
-	ShowValue           string                    `description:"展示值"`
-	Value               string                    `description:"实际值(计算公式)"`
-	EdbInfoId           int                       `description:"指标id"`
-	Tag                 string                    `description:"下标"`
-	RelationEdbInfoList []request.RelationEdbInfo `description:"关联指标(计算公式中关联的指标,用于计算的时候去匹配)"`
-}
-
-// GetTableDataConfig 根据TableDataReq配置获取相关数据配置
-func GetTableDataConfig(reqData request.TableDataReq) (tableDataConfig TableDataConfig, err error) {
-	// 指标数据
-	tableDataConfig.EdbInfoIdList = reqData.EdbInfoIdList
-	tableDataConfig.Sort = reqData.Sort
-
-	if len(reqData.Data) <= 0 {
-		err = errors.New("数据不能为空")
-		return
-	}
-
-	// 开始日期
-	var startDate string
-	// A列的指标id
-	var firstEdbInfoId int
-	// 手工操作的数据列
-	manualDataList := make([]ManualData, 0)
-	// 指标配置列表
-	tableEdbInfoList := make([]TableEdbInfo, 0)
-
-	// 第一列的日期map
-	firstDateMap := make(map[string]string)
-	manualDateMap := make(map[string]string)
-
-	for _, v := range reqData.Data {
-		// 指标信息
-		tmpTableEdbInfo := TableEdbInfo{
-			EdbInfoId:    v.EdbInfoId,
-			Tag:          v.Tag,
-			EdbName:      v.EdbName,
-			EdbAliasName: v.EdbAliasName,
-			Frequency:    v.Frequency,
-			Unit:         v.Unit,
-		}
-		tableEdbInfoList = append(tableEdbInfoList, tmpTableEdbInfo)
-
-		// 确定数据A列
-		if v.Tag == "A" {
-			firstEdbInfoId = v.EdbInfoId
-			lenData := len(v.Data)
-			if lenData <= 0 {
-				err = errors.New("A列不能为空")
-				return
-			}
-			index := 0
-			if reqData.Sort == 1 {
-				// 倒序
-				index = lenData - 1
-			}
-
-			startDate = v.Data[index].DataTime
-
-			// 存在的日期列表
-			for _, data := range v.Data {
-				firstDateMap[data.DataTime] = data.DataTime
-
-				if data.DataTimeType == 2 {
-					manualDateMap[data.DataTime] = data.DataTime
-				}
-			}
-		}
-
-		for _, data := range v.Data {
-			if data.DataType == 3 || data.DataType == 4 {
-				tmpManualData := ManualData{
-					DataType:            data.DataType,
-					DataTime:            data.DataTime,
-					DataTimeType:        data.DataTimeType,
-					ShowValue:           data.ShowValue,
-					Value:               data.Value,
-					EdbInfoId:           v.EdbInfoId,
-					Tag:                 v.Tag,
-					RelationEdbInfoList: data.RelationEdbInfoList,
-				}
-				if data.DataType == 4 {
-					tmpManualData.ShowValue = ``
-				}
-				manualDataList = append(manualDataList, tmpManualData)
-			}
-		}
-	}
-
-	// 总共需要的期数
-	num := len(reqData.Data[0].Data)
-
-	removeDate := make([]string, 0)
-
-	// 获取期数
-	{
-		firstDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		edbInfo, tmpErr := data_manage.GetEdbInfoById(firstEdbInfoId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		var firstDataList []*data_manage.EdbDataList
-		switch edbInfo.EdbInfoType {
-		case 0:
-			firstDataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
-		case 1:
-			_, firstDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
-		default:
-			err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
-		}
-		if err != nil {
-			return
-		}
-
-		// 获取日期内的数据(包含开始日期前一个日期,以及 结束日期后一个日期,目的为了做空日期时的 插值法兼容)
-		baseDataList := make([]*data_manage.EdbDataList, 0)
-		for _, data := range firstDataList {
-			tmpDate := data.DataTime
-			tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			if tmpDateTime.Before(firstDateTime) {
-				continue
-			}
-			baseDataList = append(baseDataList, data)
-		}
-
-		// 筛选出需要删除的日期
-		for _, tmpData := range baseDataList {
-			//firstDateMap{}
-			if _, ok := firstDateMap[tmpData.DataTime]; !ok {
-				removeDate = append(removeDate, tmpData.DataTime)
-			}
-		}
-	}
-
-	tableDataConfig.Num = num
-	tableDataConfig.RemoveDate = removeDate
-	tableDataConfig.Data = manualDataList
-	tableDataConfig.TableEdbInfoList = tableEdbInfoList
-	tableDataConfig.TextRowData = reqData.TextRowData
-
-	return
-}
-
-// GetDataByTableDataConfig 根据数据配置获取表格数据
-func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp request.TableDataReq, err error) {
-	// 没有选择指标的情况下,直接返回吧
-	if len(tableDataConfig.EdbInfoIdList) <= 0 {
-		return
-	}
-
-	// 实际期数没有的情况下,直接返回吧
-	if tableDataConfig.Num <= 0 {
-		return
-	}
-
-	// 获取所有的指标信息
-	edbInfoMap := make(map[int]*data_manage.EdbInfo)
-	edbInfoIdList := make([]int, 0)
-	// 标签与指标id的map
-	tagEdbInfoIdMap := make(map[string]int)
-	{
-		for _, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
-			edbInfoIdList = append(edbInfoIdList, tableEdbInfo.EdbInfoId)
-			tagEdbInfoIdMap[tableEdbInfo.Tag] = tableEdbInfo.EdbInfoId
-		}
-		edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		for _, v := range edbInfoList {
-			edbInfoMap[v.EdbInfoId] = v
-		}
-	}
-
-	manualDateMap := make(map[string]string, 0)
-	manualDateList := make([]string, 0)
-	for _, v := range tableDataConfig.Data {
-		if _, ok := manualDateMap[v.DataTime]; !ok {
-			manualDateMap[v.DataTime] = v.DataTime
-			manualDateList = append(manualDateList, v.DataTime)
-		}
-	}
-
-	// 寻找A列的数据列表
-	firstEdbInfo, ok := edbInfoMap[tableDataConfig.TableEdbInfoList[0].EdbInfoId]
-	if !ok {
-		err = errors.New("找不到A列指标")
-		return
-	}
-	baseFirstEdbInfoDataList, err := GetFirstEdbDataList(firstEdbInfo, tableDataConfig.Num, manualDateList)
-	if err != nil {
-		return
-	}
-	// A列找不到数据,那么就直接返回吧
-	if len(baseFirstEdbInfoDataList) <= 0 {
-		return
-	}
-
-	firstEdbInfoDataList := make([]request.ManualDataReq, 0)
-	if tableDataConfig.RemoveDate != nil && len(tableDataConfig.RemoveDate) > 0 {
-		for _, v := range baseFirstEdbInfoDataList {
-			if utils.InArrayByStr(tableDataConfig.RemoveDate, v.DataTime) {
-				continue
-			}
-			firstEdbInfoDataList = append(firstEdbInfoDataList, v)
-		}
-	} else {
-		firstEdbInfoDataList = baseFirstEdbInfoDataList
-	}
-	if len(firstEdbInfoDataList) <= 0 {
-		return
-	}
-	// 实际数据的最后一天
-	lastRealDateTime, err := time.ParseInLocation(utils.FormatDate, firstEdbInfoDataList[0].DataTime, time.Local)
-	if err != nil {
-		return
-	}
-
-	dateMap := make(map[string]string)
-	dateList := make([]string, 0)
-	edbInfoIdDateDataMap := make(map[int]map[string]request.ManualDataReq)
-	firstDateDataMap := make(map[string]request.ManualDataReq)
-	for _, v := range firstEdbInfoDataList {
-		dateList = append(dateList, v.DataTime)
-		dateMap[v.DataTime] = v.DataTime
-		firstDateDataMap[v.DataTime] = v
-	}
-
-	// 将手工数据的日期填补进去(未来的日期,过去的就不管了)
-	for _, manualData := range tableDataConfig.Data {
-		if !utils.InArrayByStr(dateList, manualData.DataTime) {
-			tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, manualData.DataTime, time.Local)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			if tmpDateTime.After(lastRealDateTime) {
-				dateList = append(dateList, manualData.DataTime)
-			}
-		}
-	}
-
-	edbInfoIdDateDataMap[firstEdbInfo.EdbInfoId] = firstDateDataMap
-
-	for k, edbInfoId := range tableDataConfig.EdbInfoIdList {
-		if k == 0 {
-			continue
-		}
-
-		tmpEdbInfo, ok := edbInfoMap[edbInfoId]
-		if !ok {
-			err = errors.New("找不到A列指标")
-			return
-		}
-		otherDataList, tmpErr := GetOtherEdbDataList(tmpEdbInfo, dateList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-
-		tmpDateDataMap := make(map[string]request.ManualDataReq)
-		for _, v := range otherDataList {
-			tmpDateDataMap[v.DataTime] = v
-		}
-		edbInfoIdDateDataMap[tmpEdbInfo.EdbInfoId] = tmpDateDataMap
-	}
-
-	for _, v := range tableDataConfig.Data {
-		tmpDate := v.DataTime
-		if _, ok := dateMap[tmpDate]; !ok {
-			dateMap[v.DataTime] = tmpDate
-		}
-
-		edbInfoIdDateData, ok := edbInfoIdDateDataMap[v.EdbInfoId]
-		if !ok {
-			edbInfoIdDateData = make(map[string]request.ManualDataReq)
-		}
-
-		// 判断是否存在该日期的数据(不存在,那么插入数据吧,存在就不管了)
-		tmpManualData, ok := edbInfoIdDateData[tmpDate]
-		if !ok {
-			edbInfoIdDateData[tmpDate] = request.ManualDataReq{
-				DataType:  v.DataType,
-				DataTime:  v.DataTime,
-				ShowValue: v.ShowValue,
-				Value:     v.Value,
-			}
-		} else {
-			if (tmpManualData.DataType == 3 || tmpManualData.DataType == 4) && tmpManualData.ShowValue == `` {
-				tmpManualData.DataType = v.DataType
-				tmpManualData.ShowValue = v.ShowValue
-				tmpManualData.Value = v.Value
-				tmpManualData.RelationEdbInfoList = v.RelationEdbInfoList
-
-				edbInfoIdDateData[tmpDate] = tmpManualData
-			}
-		}
-		edbInfoIdDateDataMap[v.EdbInfoId] = edbInfoIdDateData
-	}
-
-	// 获取数据的日期排序
-	sortDateTimeList := make([]time.Time, 0)
-	{
-		sortDateList := dateList
-		if tableDataConfig.Sort == 1 {
-			baseDateList := utils.StrArr{}
-			baseDateList = append(baseDateList, sortDateList...)
-			sort.Sort(baseDateList)
-			sortDateList = append([]string{}, baseDateList...)
-		} else {
-			sort.Strings(sortDateList)
-		}
-		for _, v := range sortDateList {
-			tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, v, time.Local)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			sortDateTimeList = append(sortDateTimeList, tmpDateTime)
-		}
-	}
-
-	// 数据处理,处理成表格的数据格式
-	tableDataMap, textRowListDataResp := handleTable(tagEdbInfoIdMap, lastRealDateTime, sortDateTimeList, edbInfoIdDateDataMap, tableDataConfig.Data, tableDataConfig.TextRowData)
-
-	data := make([]request.EdbInfoData, 0)
-	for _, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
-		tagEdbInfoIdMap[tableEdbInfo.Tag] = tableEdbInfo.EdbInfoId
-
-		manualDataReqList := make([]request.ManualDataReq, 0)
-		tmpEdbInfoData := request.EdbInfoData{
-			EdbInfoId:    tableEdbInfo.EdbInfoId,
-			Tag:          tableEdbInfo.Tag,
-			EdbName:      tableEdbInfo.EdbName,
-			EdbAliasName: tableEdbInfo.EdbAliasName,
-			Frequency:    tableEdbInfo.Frequency,
-			Unit:         tableEdbInfo.Unit,
-			Data:         manualDataReqList,
-		}
-
-		edbInfo, ok := edbInfoMap[tableEdbInfo.EdbInfoId]
-		if ok {
-			tmpEdbInfoData.EdbName = edbInfo.EdbName
-			tmpEdbInfoData.Frequency = edbInfo.Frequency
-			tmpEdbInfoData.Unit = edbInfo.Unit
-			tmpEdbInfoData.ClassifyId = edbInfo.ClassifyId
-			tmpEdbInfoData.IsJoinPermission = edbInfo.IsJoinPermission
-		}
-
-		for index, dateTime := range sortDateTimeList {
-			dataTimeType := 1
-			if dateTime.After(lastRealDateTime) {
-				dataTimeType = 2
-			}
-			tmpDateTimeStr := dateTime.Format(utils.FormatDate)
-
-			rowData, ok := tableDataMap[index+1]
-			if !ok {
-				manualDataReqList = append(manualDataReqList, request.ManualDataReq{
-					DataType:            3,
-					DataTime:            tmpDateTimeStr,
-					DataTimeType:        dataTimeType,
-					ShowValue:           "",
-					Value:               "",
-					RelationEdbInfoList: nil,
-				})
-				continue
-			}
-
-			tmpData, ok := rowData[tableEdbInfo.Tag]
-			if !ok {
-				manualDataReqList = append(manualDataReqList, request.ManualDataReq{
-					DataType:            3,
-					DataTime:            tmpDateTimeStr,
-					DataTimeType:        dataTimeType,
-					ShowValue:           "",
-					Value:               "",
-					RelationEdbInfoList: nil,
-				})
-				continue
-			}
-
-			tmpData.DataTimeType = dataTimeType
-			manualDataReqList = append(manualDataReqList, tmpData)
-		}
-
-		tmpEdbInfoData.Data = manualDataReqList
-
-		data = append(data, tmpEdbInfoData)
-	}
-
-	// 处理一下数据格式
-	for _, d := range data {
-		for k2, d2 := range d.Data {
-			// 可能有ShowValue非数值, 转换一下报错则continue
-			vf, e := strconv.ParseFloat(d2.ShowValue, 64)
-			if e != nil {
-				continue
-			}
-			d.Data[k2].ShowValue = utils.FormatTableDataShowValue(vf)
-		}
-	}
-	for _, d := range textRowListDataResp {
-		for k2, d2 := range d {
-			// 可能有ShowValue非数值, 转换一下报错则continue
-			vf, e := strconv.ParseFloat(d2.ShowValue, 64)
-			if e != nil {
-				continue
-			}
-			d[k2].ShowValue = utils.FormatTableDataShowValue(vf)
-		}
-	}
-
-	resultResp = request.TableDataReq{
-		EdbInfoIdList: edbInfoIdList,
-		Sort:          tableDataConfig.Sort,
-		TextRowData:   textRowListDataResp,
-		Data:          data,
-	}
-
-	return
-}
-
-// handleTable 表格数据处理
-func handleTable(tagEdbInfoIdMap map[string]int, lastRealDateTime time.Time, sortDateTimeList []time.Time, edbInfoIdDateDataMap map[int]map[string]request.ManualDataReq, manualDataList []ManualData, textRowData [][]request.ManualDataReq) (tableDataMap map[int]map[string]request.ManualDataReq, textRowListDataResp [][]request.ManualDataReq) {
-	tagList := make([]string, 0)
-	for tag, _ := range tagEdbInfoIdMap {
-		tagList = append(tagList, tag)
-	}
-	sort.Strings(tagList)
-
-	tableDataMap = make(map[int]map[string]request.ManualDataReq) //行、列数据
-
-	// 日期与行的关系
-	dateIndexMap := make(map[string]int)
-
-	for k, dateTime := range sortDateTimeList {
-		rowDataMap := make(map[string]request.ManualDataReq)
-
-		dataTimeType := 1
-		if dateTime.After(lastRealDateTime) {
-			dataTimeType = 2
-		}
-
-		tmpDateTimeStr := dateTime.Format(utils.FormatDate)
-		dateIndexMap[tmpDateTimeStr] = k + 1
-
-		for _, tag := range tagList {
-			edbInfoId, ok := tagEdbInfoIdMap[tag]
-			if !ok { // 没有找到该指标的映射关系,那么就用空串填补
-				rowDataMap[tag] = request.ManualDataReq{
-					DataType:            3,
-					DataTime:            tmpDateTimeStr,
-					DataTimeType:        dataTimeType,
-					ShowValue:           "",
-					Value:               "",
-					RelationEdbInfoList: nil,
-				}
-				continue
-			}
-
-			// 获取指标的数据map
-			dateDataMap, ok := edbInfoIdDateDataMap[edbInfoId]
-			if !ok { // 没有找到该指标的数据,那么就用空串填补
-				rowDataMap[tag] = request.ManualDataReq{
-					DataType:            3,
-					DataTime:            tmpDateTimeStr,
-					DataTimeType:        dataTimeType,
-					ShowValue:           "",
-					Value:               "",
-					RelationEdbInfoList: nil,
-				}
-				continue
-			}
-
-			// 获取指标该日期的数据
-			tmpData, ok := dateDataMap[tmpDateTimeStr]
-			if !ok { // 该指标没有找到对应日期的数据,那么就用空串填补
-				rowDataMap[tag] = request.ManualDataReq{
-					DataType:            3,
-					DataTime:            tmpDateTimeStr,
-					DataTimeType:        dataTimeType,
-					ShowValue:           "",
-					Value:               "",
-					RelationEdbInfoList: nil,
-				}
-				continue
-			}
-			tmpData.DataTimeType = dataTimeType
-			rowDataMap[tag] = tmpData
-		}
-		tableDataMap[k+1] = rowDataMap
-	}
-
-	// 替换手工设置的数据
-	for _, manualData := range manualDataList {
-		// 找不到该日期,说明这日期过期了,不处理
-		index, ok := dateIndexMap[manualData.DataTime]
-		if !ok {
-			continue
-		}
-
-		// 获取对应行的数据
-		rowDataMap, ok := tableDataMap[index]
-		if !ok {
-			continue
-		}
-
-		// 找到对应的单元格
-		tmpData, ok := rowDataMap[manualData.Tag]
-		if !ok {
-			continue
-		}
-
-		// 如果该单元格实际有数据(包含预测值),或者插值法补充了数据的话,那么就不用手动填入的数据
-		if utils.InArrayByInt([]int{1, 2, 5}, tmpData.DataType) {
-			continue
-		}
-
-		// 手工填写的数字
-		if tmpData.DataType == 3 {
-			tmpData.ShowValue = manualData.ShowValue
-			tmpData.Value = manualData.Value
-			tableDataMap[index][manualData.Tag] = tmpData
-
-			//edbInfoIdDateDataMap[manualData.EdbInfoId][manualData.DataTime] = tmpData
-			continue
-		}
-
-		// 公式
-		tmpData.DataType = manualData.DataType
-		tmpData.ShowValue = ``
-		tmpData.Value = manualData.Value
-		tmpData.RelationEdbInfoList = manualData.RelationEdbInfoList
-		tableDataMap[index][manualData.Tag] = tmpData
-
-	}
-
-	// 文本行的列表插入
-	lenTableData := len(tableDataMap)
-
-	// 文本行第一列的数据列表(可能多行)
-	firstColTextRowList := make([]request.ManualDataReq, 0)
-	// 参与计算的文本行列表数据
-	tmpTextRowList := make([][]request.ManualDataReq, 0)
-	for k, textRowList := range textRowData {
-		// 判断列数是否匹配,不匹配的话那么过滤
-		if len(tagList)+1 != len(textRowList) {
-			continue
-		}
-		rowDataMap := make(map[string]request.ManualDataReq)
-		tmpTextRow := make([]request.ManualDataReq, 0)
-		for index, textRow := range textRowList {
-			// 移除第一列,因为第一列是日期列
-			if index == 0 {
-				firstColTextRowList = append(firstColTextRowList, textRow)
-				continue
-			}
-			rowDataMap[tagList[index-1]] = textRow
-			tmpTextRow = append(tmpTextRow, textRow)
-		}
-
-		tableDataMap[lenTableData+k+1] = rowDataMap
-		tmpTextRowList = append(tmpTextRowList, tmpTextRow)
-	}
-
-	// 参与计算的单元格
-	calculateCellMap := make(map[string]string)
-
-	// 计算手工填写的单元格
-	for _, manualData := range manualDataList {
-		// 找不到该日期,说明这日期过期了,不处理
-		index, ok := dateIndexMap[manualData.DataTime]
-		if !ok {
-			continue
-		}
-
-		// 获取对应行的数据
-		rowDataMap, ok := tableDataMap[index]
-		if !ok {
-			continue
-		}
-
-		// 找到对应的单元格
-		colData, ok := rowDataMap[manualData.Tag]
-		if !ok {
-			continue
-		}
-
-		// 如果该单元格不是计算公式的单元格,那么直接退出当前循环即可
-		if colData.DataType != 4 {
-			continue
-		}
-
-		tagMap := make(map[string]float64)
-		lenRelation := len(colData.RelationEdbInfoList)
-		replaceNum := 0
-		for _, relation := range colData.RelationEdbInfoList {
-			relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
-			valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
-			if tmpErr != nil {
-				continue
-			}
-			tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
-			if tmpErr != nil {
-				continue
-			}
-			tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
-			replaceNum++
-		}
-
-		// 如果替换的数据与关联的不一致,那么就退出当前循环
-		if lenRelation != replaceNum {
-			continue
-		}
-
-		// 计算
-		val, _, err := calculate(strings.ToUpper(colData.Value), tagMap)
-		// 计算失败,退出循环
-		if err != nil {
-			continue
-		}
-		// 重新赋值
-		colData.ShowValue = val
-		tableDataMap[index][manualData.Tag] = colData
-
-	}
-
-	// 计算文本行的单元格
-	for k, textRow := range tmpTextRowList {
-		// 获取对应行的数据
-		index := lenTableData + k + 1
-		rowDataMap, ok := tableDataMap[index]
-		if !ok {
-			continue
-		}
-
-		for colIndex, _ := range textRow {
-			currTag := tagList[colIndex]
-			// 找到对应的单元格
-			colData, ok := rowDataMap[currTag]
-			if !ok {
-				continue
-			}
-
-			// 如果该单元格不是计算公式的单元格,那么直接退出当前循环即可
-			if colData.DataType != 4 {
-				continue
-			}
-
-			tagMap := make(map[string]float64)
-			lenRelation := len(colData.RelationEdbInfoList)
-			replaceNum := 0
-			for _, relation := range colData.RelationEdbInfoList {
-				relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
-				valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
-				if tmpErr != nil {
-					continue
-				}
-				tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
-				if tmpErr != nil {
-					continue
-				}
-				tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
-				replaceNum++
-			}
-
-			// 如果替换的数据与关联的不一致,那么就退出当前循环
-			if lenRelation != replaceNum {
-				continue
-			}
-
-			// 计算
-			val, _, err := calculate(strings.ToUpper(colData.Value), tagMap)
-			// 计算失败,退出循环
-			if err != nil {
-				continue
-			}
-			// 重新赋值
-			colData.ShowValue = val
-			tableDataMap[index][currTag] = colData
-		}
-
-	}
-
-	// 计算文本行第一列的数据值(多行)
-	for k, colData := range firstColTextRowList {
-		// 如果该单元格不是计算公式的单元格,那么直接退出当前循环即可
-		if colData.DataType != 4 {
-			continue
-		}
-
-		tagMap := make(map[string]float64)
-		lenRelation := len(colData.RelationEdbInfoList)
-		replaceNum := 0
-		for _, relation := range colData.RelationEdbInfoList {
-			relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
-			valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
-			if tmpErr != nil {
-				continue
-			}
-			tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
-			if tmpErr != nil {
-				continue
-			}
-			tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
-			replaceNum++
-		}
-
-		// 如果替换的数据与关联的不一致,那么就退出当前循环
-		if lenRelation != replaceNum {
-			continue
-		}
-
-		// 计算
-		val, _, err := calculate(strings.ToUpper(colData.Value), tagMap)
-		// 计算失败,退出循环
-		if err != nil {
-			continue
-		}
-		// 重新赋值
-		colData.ShowValue = val
-		firstColTextRowList[k] = colData
-	}
-
-	{
-		// 文本行的数据处理返回
-		textRowListDataResp = make([][]request.ManualDataReq, 0)
-		newLenTableDataMap := len(tableDataMap)
-		// 文本行的第一行所在的位置
-		firstTextRow := lenTableData + 1
-		for i := firstTextRow; i <= newLenTableDataMap; i++ {
-			textRowDataResp := make([]request.ManualDataReq, 0)
-
-			textRowDataResp = append(textRowDataResp, firstColTextRowList[i-firstTextRow])
-			for _, tmpTag := range tagList {
-				textRowDataResp = append(textRowDataResp, tableDataMap[i][tmpTag])
-			}
-			textRowListDataResp = append(textRowListDataResp, textRowDataResp)
-		}
-
-	}
-
-	return
-}
-
-// getCalculateValue 获取公式计算的结果
-func getCalculateValue(tableDataMap map[int]map[string]request.ManualDataReq, tag, row string, calculateCellMap map[string]string) (val string, err error) {
-	rowInt, err := strconv.Atoi(row)
-	if err != nil {
-		return
-	}
-
-	// 单元格的标签名
-	cellTagName := strings.ToUpper(tag) + row
-	val, ok := calculateCellMap[cellTagName]
-	if ok {
-		return
-	}
-
-	// 查找行数据
-	rowData, ok := tableDataMap[rowInt]
-	if !ok {
-		err = errors.New("查找" + row + "行的数据失败")
-		return
-	}
-
-	// 查找单元格数据
-	colData, ok := rowData[tag]
-	if !ok {
-		err = errors.New("查找单元格" + tag + row + "的数据失败")
-		return
-	}
-
-	// 如果不是计算单元格
-	if colData.DataType != 4 {
-		val = colData.ShowValue
-		return
-	}
-
-	// 如果是计算单元格
-	calculateCellMap[cellTagName] = ``
-
-	tagMap := make(map[string]float64)
-	for _, relation := range colData.RelationEdbInfoList {
-		relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
-		valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
-	}
-
-	// 计算
-	val, _, err = calculate(strings.ToUpper(colData.Value), tagMap)
-	if err != nil {
-		return
-	}
-	// 重新赋值
-	colData.ShowValue = val
-	tableDataMap[rowInt][tag] = colData
-	calculateCellMap[cellTagName] = val
-
-	return
-}
-
-// calculate 公式计算
-func calculate(calculateFormula string, TagMap map[string]float64) (calVal, errMsg string, err error) {
-	if calculateFormula == "" {
-		errMsg = "公式异常"
-		err = errors.New(errMsg)
-		return
-	}
-	calculateFormula = strings.TrimPrefix(calculateFormula, "=")
-	calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
-	calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
-	calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
-	calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
-	calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
-
-	formulaFormStr := utils.ReplaceFormula(TagMap, calculateFormula)
-	//计算公式异常,那么就移除该指标
-	if formulaFormStr == `` {
-		errMsg = "公式异常"
-		err = errors.New(errMsg)
-		return
-	}
-
-	expression := formula.NewExpression(formulaFormStr)
-	calResult, err := expression.Evaluate()
-	if err != nil {
-		errMsg = "计算失败"
-		err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-		// 分母为0的报错
-		if strings.Contains(err.Error(), "divide by zero") {
-			errMsg = "分母不能为0"
-			err = errors.New("分母不能为空,计算公式:" + formulaFormStr)
-		}
-		return
-	}
-	// 如果计算结果是NAN,那么就提示报错
-	if calResult.IsNan() {
-		errMsg = "计算失败"
-		err = errors.New("计算失败:计算结果是:NAN;formulaStr:" + formulaFormStr)
-		return
-	}
-	calVal = calResult.String()
-
-	// 转Decimal然后四舍五入
-	valDecimal, err := decimal.NewFromString(calVal)
-	if err != nil {
-		errMsg = "计算失败"
-		err = errors.New("计算失败,结果转 Decimal 失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-		return
-	}
-	calVal = valDecimal.Round(4).String()
-
-	return
-}
-
 // GetEdbIdsFromExcelCodes 获取表格中的指标IDs
-func GetEdbIdsFromExcelCodes(excelCodes []string, sysUserId int) (edbIds []int, err error) {
+func GetEdbIdsFromExcelCodes(excelCodes []string, sysUserId int, lang string) (edbIds []int, err error) {
 	edbIds = make([]int, 0)
 	edbIdExist := make(map[int]bool)
 	for _, v := range excelCodes {
 		// 表格详情
-		detail, msg, e := GetExcelDetailInfoByUnicode(v, sysUserId)
+		detail, msg, e := GetExcelDetailInfoByUnicode(v, sysUserId, lang)
 		if e != nil {
 			err = fmt.Errorf("GetExcelDetailInfoByExcelInfoId err: %s, errMsg: %s", e.Error(), msg)
 			return

+ 2 - 2
services/data/excel/mixed_table.go

@@ -38,7 +38,7 @@ type Cell struct {
 }
 
 // GetMixedTableCellData 获取混合表格数据
-func GetMixedTableCellData(mixedTableReq request.MixedTableReq) (newMixedTableCellDataList [][]request.MixedTableCellDataReq, err error, errMsg string) {
+func GetMixedTableCellData(mixedTableReq request.MixedTableReq, lang string) (newMixedTableCellDataList [][]request.MixedTableCellDataReq, err error, errMsg string) {
 	cellRelationConf := mixedTableReq.CellRelation
 	config := mixedTableReq.Data
 
@@ -353,7 +353,7 @@ func GetMixedTableCellData(mixedTableReq request.MixedTableReq) (newMixedTableCe
 						err = tmpErr
 						return
 					}
-					respItem, tmpErr := data.BaseCalculate(string(reqJson))
+					respItem, tmpErr := data.BaseCalculate(string(reqJson), lang)
 					if tmpErr != nil {
 						utils.FileLog.Error(fmt.Sprintf("计算失败2,配置信息;%s;错误原因:%s", cell.Value, tmpErr.Error()))
 						err = tmpErr

+ 932 - 0
services/data/excel/time_table.go

@@ -0,0 +1,932 @@
+package excel
+
+import (
+	"errors"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel/request"
+	"eta/eta_api/services/data"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
+	"github.com/yidane/formula"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// TableDataConfig
+// @Description: 表格配置
+type TableDataConfig struct {
+	EdbInfoIdList    []int                     `description:"指标id列表,从左至右,从上到下的顺序"`
+	Sort             int                       `description:"日期排序,0:倒序,1:正序"`
+	Data             []ManualData              `description:"数据列表"`
+	Num              int                       `description:"实际数据需要列出来的期数"`
+	RemoveDate       []string                  `description:"不展示的日期"`
+	ManualDate       []string                  `description:"手动配置的日期(未来的日期)"`
+	TableEdbInfoList []TableEdbInfo            `description:"表格内指标信息"`
+	TextRowData      [][]request.ManualDataReq `description:"文本列表"`
+}
+
+// TableEdbInfo
+// @Description: 表格指标信息
+type TableEdbInfo struct {
+	EdbInfoId    int    `description:"指标ID"`
+	Tag          string `description:"标签"`
+	EdbName      string `description:"指标名称"`
+	EdbNameEn    string `description:"英文指标名称"`
+	EdbAliasName string `description:"指标别名"`
+	Frequency    string `description:"频度"`
+	Unit         string `description:"单位"`
+	UnitEn       string `description:"英文单位"`
+}
+
+// ManualData
+// @Description: 手工文本配置
+type ManualData struct {
+	DataType            int                       `description:"数据类型,1:普通的,2:插值法,3:手动输入,4:公式计算"`
+	DataTime            string                    `description:"所属日期"`
+	DataTimeType        int                       `description:"日期类型,1:实际日期;2:未来日期"`
+	ShowValue           string                    `description:"展示值"`
+	Value               string                    `description:"实际值(计算公式)"`
+	EdbInfoId           int                       `description:"指标id"`
+	Tag                 string                    `description:"下标"`
+	RelationEdbInfoList []request.RelationEdbInfo `description:"关联指标(计算公式中关联的指标,用于计算的时候去匹配)"`
+}
+
+// GetDataByTableDataConfig 根据数据配置获取表格数据
+func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp request.TableDataReq, err error) {
+	// 没有选择指标的情况下,直接返回吧
+	if len(tableDataConfig.EdbInfoIdList) <= 0 {
+		return
+	}
+
+	// 实际期数没有的情况下,直接返回吧
+	if tableDataConfig.Num <= 0 {
+		return
+	}
+
+	// 获取所有的指标信息
+	edbInfoMap := make(map[int]*data_manage.EdbInfo)
+	edbInfoIdList := make([]int, 0)
+	// 标签与指标id的map
+	tagEdbInfoIdMap := make(map[string]int)
+	{
+		for _, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
+			edbInfoIdList = append(edbInfoIdList, tableEdbInfo.EdbInfoId)
+			tagEdbInfoIdMap[tableEdbInfo.Tag] = tableEdbInfo.EdbInfoId
+		}
+		edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		for _, v := range edbInfoList {
+			edbInfoMap[v.EdbInfoId] = v
+		}
+	}
+
+	manualDateMap := make(map[string]string, 0)
+	manualDateList := make([]string, 0)
+	for _, v := range tableDataConfig.Data {
+		if _, ok := manualDateMap[v.DataTime]; !ok {
+			manualDateMap[v.DataTime] = v.DataTime
+			manualDateList = append(manualDateList, v.DataTime)
+		}
+	}
+
+	// 寻找A列的数据列表
+	firstEdbInfo, ok := edbInfoMap[tableDataConfig.TableEdbInfoList[0].EdbInfoId]
+	if !ok {
+		err = errors.New("找不到A列指标")
+		return
+	}
+	baseFirstEdbInfoDataList, err := GetFirstEdbDataList(firstEdbInfo, tableDataConfig.Num, manualDateList)
+	if err != nil {
+		return
+	}
+	// A列找不到数据,那么就直接返回吧
+	if len(baseFirstEdbInfoDataList) <= 0 {
+		return
+	}
+
+	firstEdbInfoDataList := make([]request.ManualDataReq, 0)
+	if tableDataConfig.RemoveDate != nil && len(tableDataConfig.RemoveDate) > 0 {
+		for _, v := range baseFirstEdbInfoDataList {
+			if utils.InArrayByStr(tableDataConfig.RemoveDate, v.DataTime) {
+				continue
+			}
+			firstEdbInfoDataList = append(firstEdbInfoDataList, v)
+		}
+	} else {
+		firstEdbInfoDataList = baseFirstEdbInfoDataList
+	}
+	if len(firstEdbInfoDataList) <= 0 {
+		return
+	}
+	// 实际数据的最后一天
+	lastRealDateTime, err := time.ParseInLocation(utils.FormatDate, firstEdbInfoDataList[0].DataTime, time.Local)
+	if err != nil {
+		return
+	}
+
+	dateMap := make(map[string]string)
+	dateList := make([]string, 0)
+	edbInfoIdDateDataMap := make(map[int]map[string]request.ManualDataReq)
+	firstDateDataMap := make(map[string]request.ManualDataReq)
+	for _, v := range firstEdbInfoDataList {
+		dateList = append(dateList, v.DataTime)
+		dateMap[v.DataTime] = v.DataTime
+		firstDateDataMap[v.DataTime] = v
+	}
+
+	// 将手工数据的日期填补进去(未来的日期,过去的就不管了)
+	for _, manualData := range tableDataConfig.Data {
+		if !utils.InArrayByStr(dateList, manualData.DataTime) {
+			tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, manualData.DataTime, time.Local)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if tmpDateTime.After(lastRealDateTime) {
+				dateList = append(dateList, manualData.DataTime)
+			}
+		}
+	}
+
+	edbInfoIdDateDataMap[firstEdbInfo.EdbInfoId] = firstDateDataMap
+
+	for k, edbInfoId := range tableDataConfig.EdbInfoIdList {
+		if k == 0 {
+			continue
+		}
+
+		tmpEdbInfo, ok := edbInfoMap[edbInfoId]
+		if !ok {
+			err = errors.New("找不到A列指标")
+			return
+		}
+		otherDataList, tmpErr := GetOtherEdbDataList(tmpEdbInfo, dateList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		tmpDateDataMap := make(map[string]request.ManualDataReq)
+		for _, v := range otherDataList {
+			tmpDateDataMap[v.DataTime] = v
+		}
+		edbInfoIdDateDataMap[tmpEdbInfo.EdbInfoId] = tmpDateDataMap
+	}
+
+	for _, v := range tableDataConfig.Data {
+		tmpDate := v.DataTime
+		if _, ok := dateMap[tmpDate]; !ok {
+			dateMap[v.DataTime] = tmpDate
+		}
+
+		edbInfoIdDateData, ok := edbInfoIdDateDataMap[v.EdbInfoId]
+		if !ok {
+			edbInfoIdDateData = make(map[string]request.ManualDataReq)
+		}
+
+		// 判断是否存在该日期的数据(不存在,那么插入数据吧,存在就不管了)
+		tmpManualData, ok := edbInfoIdDateData[tmpDate]
+		if !ok {
+			edbInfoIdDateData[tmpDate] = request.ManualDataReq{
+				DataType:  v.DataType,
+				DataTime:  v.DataTime,
+				ShowValue: v.ShowValue,
+				Value:     v.Value,
+			}
+		} else {
+			if (tmpManualData.DataType == 3 || tmpManualData.DataType == 4) && tmpManualData.ShowValue == `` {
+				tmpManualData.DataType = v.DataType
+				tmpManualData.ShowValue = v.ShowValue
+				tmpManualData.Value = v.Value
+				tmpManualData.RelationEdbInfoList = v.RelationEdbInfoList
+
+				edbInfoIdDateData[tmpDate] = tmpManualData
+			}
+		}
+		edbInfoIdDateDataMap[v.EdbInfoId] = edbInfoIdDateData
+	}
+
+	// 获取数据的日期排序
+	sortDateTimeList := make([]time.Time, 0)
+	{
+		sortDateList := dateList
+		if tableDataConfig.Sort == 1 {
+			baseDateList := utils.StrArr{}
+			baseDateList = append(baseDateList, sortDateList...)
+			sort.Sort(baseDateList)
+			sortDateList = append([]string{}, baseDateList...)
+		} else {
+			sort.Strings(sortDateList)
+		}
+		for _, v := range sortDateList {
+			tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, v, time.Local)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			sortDateTimeList = append(sortDateTimeList, tmpDateTime)
+		}
+	}
+
+	// 数据处理,处理成表格的数据格式
+	tableDataMap, textRowListDataResp := handleTable(tagEdbInfoIdMap, lastRealDateTime, sortDateTimeList, edbInfoIdDateDataMap, tableDataConfig.Data, tableDataConfig.TextRowData)
+
+	data := make([]request.EdbInfoData, 0)
+	for _, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
+		tagEdbInfoIdMap[tableEdbInfo.Tag] = tableEdbInfo.EdbInfoId
+
+		manualDataReqList := make([]request.ManualDataReq, 0)
+		tmpEdbInfoData := request.EdbInfoData{
+			EdbInfoId:    tableEdbInfo.EdbInfoId,
+			Tag:          tableEdbInfo.Tag,
+			EdbName:      tableEdbInfo.EdbName,
+			EdbNameEn:    tableEdbInfo.EdbNameEn,
+			EdbAliasName: tableEdbInfo.EdbAliasName,
+			Frequency:    tableEdbInfo.Frequency,
+			Unit:         tableEdbInfo.Unit,
+			UnitEn:       tableEdbInfo.UnitEn,
+			Data:         manualDataReqList,
+		}
+
+		edbInfo, ok := edbInfoMap[tableEdbInfo.EdbInfoId]
+		if ok {
+			tmpEdbInfoData.EdbName = edbInfo.EdbName
+			tmpEdbInfoData.EdbNameEn = edbInfo.EdbNameEn
+			tmpEdbInfoData.Frequency = edbInfo.Frequency
+			tmpEdbInfoData.Unit = edbInfo.Unit
+			tmpEdbInfoData.UnitEn = edbInfo.UnitEn
+			tmpEdbInfoData.ClassifyId = edbInfo.ClassifyId
+			tmpEdbInfoData.IsJoinPermission = edbInfo.IsJoinPermission
+		}
+
+		for index, dateTime := range sortDateTimeList {
+			dataTimeType := 1
+			if dateTime.After(lastRealDateTime) {
+				dataTimeType = 2
+			}
+			tmpDateTimeStr := dateTime.Format(utils.FormatDate)
+
+			rowData, ok := tableDataMap[index+1]
+			if !ok {
+				manualDataReqList = append(manualDataReqList, request.ManualDataReq{
+					DataType:            3,
+					DataTime:            tmpDateTimeStr,
+					DataTimeType:        dataTimeType,
+					ShowValue:           "",
+					Value:               "",
+					RelationEdbInfoList: nil,
+				})
+				continue
+			}
+
+			tmpData, ok := rowData[tableEdbInfo.Tag]
+			if !ok {
+				manualDataReqList = append(manualDataReqList, request.ManualDataReq{
+					DataType:            3,
+					DataTime:            tmpDateTimeStr,
+					DataTimeType:        dataTimeType,
+					ShowValue:           "",
+					Value:               "",
+					RelationEdbInfoList: nil,
+				})
+				continue
+			}
+
+			tmpData.DataTimeType = dataTimeType
+			manualDataReqList = append(manualDataReqList, tmpData)
+		}
+
+		tmpEdbInfoData.Data = manualDataReqList
+
+		data = append(data, tmpEdbInfoData)
+	}
+
+	// 处理一下数据格式
+	for _, d := range data {
+		for k2, d2 := range d.Data {
+			// 可能有ShowValue非数值, 转换一下报错则continue
+			vf, e := strconv.ParseFloat(d2.ShowValue, 64)
+			if e != nil {
+				continue
+			}
+			d.Data[k2].ShowValue = utils.FormatTableDataShowValue(vf)
+		}
+	}
+	for _, d := range textRowListDataResp {
+		for k2, d2 := range d {
+			// 可能有ShowValue非数值, 转换一下报错则continue
+			vf, e := strconv.ParseFloat(d2.ShowValue, 64)
+			if e != nil {
+				continue
+			}
+			d[k2].ShowValue = utils.FormatTableDataShowValue(vf)
+		}
+	}
+
+	resultResp = request.TableDataReq{
+		EdbInfoIdList: edbInfoIdList,
+		Sort:          tableDataConfig.Sort,
+		TextRowData:   textRowListDataResp,
+		Data:          data,
+	}
+
+	return
+}
+
+// GetTableDataConfig 根据TableDataReq配置获取相关数据配置
+func GetTableDataConfig(reqData request.TableDataReq) (tableDataConfig TableDataConfig, err error) {
+	// 指标数据
+	tableDataConfig.EdbInfoIdList = reqData.EdbInfoIdList
+	tableDataConfig.Sort = reqData.Sort
+
+	if len(reqData.Data) <= 0 {
+		err = errors.New("数据不能为空")
+		return
+	}
+
+	// 开始日期
+	var startDate string
+	// A列的指标id
+	var firstEdbInfoId int
+	// 手工操作的数据列
+	manualDataList := make([]ManualData, 0)
+	// 指标配置列表
+	tableEdbInfoList := make([]TableEdbInfo, 0)
+
+	// 第一列的日期map
+	firstDateMap := make(map[string]string)
+	manualDateMap := make(map[string]string)
+
+	for _, v := range reqData.Data {
+		// 指标信息
+		tmpTableEdbInfo := TableEdbInfo{
+			EdbInfoId:    v.EdbInfoId,
+			Tag:          v.Tag,
+			EdbName:      v.EdbName,
+			EdbNameEn:    v.EdbNameEn,
+			EdbAliasName: v.EdbAliasName,
+			Frequency:    v.Frequency,
+			Unit:         v.Unit,
+			UnitEn:       v.UnitEn,
+		}
+		tableEdbInfoList = append(tableEdbInfoList, tmpTableEdbInfo)
+
+		// 确定数据A列
+		if v.Tag == "A" {
+			firstEdbInfoId = v.EdbInfoId
+			lenData := len(v.Data)
+			if lenData <= 0 {
+				err = errors.New("A列不能为空")
+				return
+			}
+			index := 0
+			if reqData.Sort == 1 {
+				// 倒序
+				index = lenData - 1
+			}
+
+			startDate = v.Data[index].DataTime
+
+			// 存在的日期列表
+			for _, data := range v.Data {
+				firstDateMap[data.DataTime] = data.DataTime
+
+				if data.DataTimeType == 2 {
+					manualDateMap[data.DataTime] = data.DataTime
+				}
+			}
+		}
+
+		for _, data := range v.Data {
+			if data.DataType == 3 || data.DataType == 4 {
+				tmpManualData := ManualData{
+					DataType:            data.DataType,
+					DataTime:            data.DataTime,
+					DataTimeType:        data.DataTimeType,
+					ShowValue:           data.ShowValue,
+					Value:               data.Value,
+					EdbInfoId:           v.EdbInfoId,
+					Tag:                 v.Tag,
+					RelationEdbInfoList: data.RelationEdbInfoList,
+				}
+				if data.DataType == 4 {
+					tmpManualData.ShowValue = ``
+				}
+				manualDataList = append(manualDataList, tmpManualData)
+			}
+		}
+	}
+
+	// 总共需要的期数
+	num := len(reqData.Data[0].Data)
+
+	removeDate := make([]string, 0)
+
+	// 获取期数
+	{
+		firstDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		edbInfo, tmpErr := data_manage.GetEdbInfoById(firstEdbInfoId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		var firstDataList []*data_manage.EdbDataList
+		switch edbInfo.EdbInfoType {
+		case 0:
+			firstDataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
+		case 1:
+			_, firstDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
+		default:
+			err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
+		}
+		if err != nil {
+			return
+		}
+
+		// 获取日期内的数据(包含开始日期前一个日期,以及 结束日期后一个日期,目的为了做空日期时的 插值法兼容)
+		baseDataList := make([]*data_manage.EdbDataList, 0)
+		for _, data := range firstDataList {
+			tmpDate := data.DataTime
+			tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			if tmpDateTime.Before(firstDateTime) {
+				continue
+			}
+			baseDataList = append(baseDataList, data)
+		}
+
+		// 筛选出需要删除的日期
+		for _, tmpData := range baseDataList {
+			//firstDateMap{}
+			if _, ok := firstDateMap[tmpData.DataTime]; !ok {
+				removeDate = append(removeDate, tmpData.DataTime)
+			}
+		}
+	}
+
+	tableDataConfig.Num = num
+	tableDataConfig.RemoveDate = removeDate
+	tableDataConfig.Data = manualDataList
+	tableDataConfig.TableEdbInfoList = tableEdbInfoList
+	tableDataConfig.TextRowData = reqData.TextRowData
+
+	return
+}
+
+// handleTable 表格数据处理
+func handleTable(tagEdbInfoIdMap map[string]int, lastRealDateTime time.Time, sortDateTimeList []time.Time, edbInfoIdDateDataMap map[int]map[string]request.ManualDataReq, manualDataList []ManualData, textRowData [][]request.ManualDataReq) (tableDataMap map[int]map[string]request.ManualDataReq, textRowListDataResp [][]request.ManualDataReq) {
+	tagList := make([]string, 0)
+	for tag, _ := range tagEdbInfoIdMap {
+		tagList = append(tagList, tag)
+	}
+	sort.Strings(tagList)
+
+	tableDataMap = make(map[int]map[string]request.ManualDataReq) //行、列数据
+
+	// 日期与行的关系
+	dateIndexMap := make(map[string]int)
+
+	for k, dateTime := range sortDateTimeList {
+		rowDataMap := make(map[string]request.ManualDataReq)
+
+		dataTimeType := 1
+		if dateTime.After(lastRealDateTime) {
+			dataTimeType = 2
+		}
+
+		tmpDateTimeStr := dateTime.Format(utils.FormatDate)
+		dateIndexMap[tmpDateTimeStr] = k + 1
+
+		for _, tag := range tagList {
+			edbInfoId, ok := tagEdbInfoIdMap[tag]
+			if !ok { // 没有找到该指标的映射关系,那么就用空串填补
+				rowDataMap[tag] = request.ManualDataReq{
+					DataType:            3,
+					DataTime:            tmpDateTimeStr,
+					DataTimeType:        dataTimeType,
+					ShowValue:           "",
+					Value:               "",
+					RelationEdbInfoList: nil,
+				}
+				continue
+			}
+
+			// 获取指标的数据map
+			dateDataMap, ok := edbInfoIdDateDataMap[edbInfoId]
+			if !ok { // 没有找到该指标的数据,那么就用空串填补
+				rowDataMap[tag] = request.ManualDataReq{
+					DataType:            3,
+					DataTime:            tmpDateTimeStr,
+					DataTimeType:        dataTimeType,
+					ShowValue:           "",
+					Value:               "",
+					RelationEdbInfoList: nil,
+				}
+				continue
+			}
+
+			// 获取指标该日期的数据
+			tmpData, ok := dateDataMap[tmpDateTimeStr]
+			if !ok { // 该指标没有找到对应日期的数据,那么就用空串填补
+				rowDataMap[tag] = request.ManualDataReq{
+					DataType:            3,
+					DataTime:            tmpDateTimeStr,
+					DataTimeType:        dataTimeType,
+					ShowValue:           "",
+					Value:               "",
+					RelationEdbInfoList: nil,
+				}
+				continue
+			}
+			tmpData.DataTimeType = dataTimeType
+			rowDataMap[tag] = tmpData
+		}
+		tableDataMap[k+1] = rowDataMap
+	}
+
+	// 替换手工设置的数据
+	for _, manualData := range manualDataList {
+		// 找不到该日期,说明这日期过期了,不处理
+		index, ok := dateIndexMap[manualData.DataTime]
+		if !ok {
+			continue
+		}
+
+		// 获取对应行的数据
+		rowDataMap, ok := tableDataMap[index]
+		if !ok {
+			continue
+		}
+
+		// 找到对应的单元格
+		tmpData, ok := rowDataMap[manualData.Tag]
+		if !ok {
+			continue
+		}
+
+		// 如果该单元格实际有数据(包含预测值),或者插值法补充了数据的话,那么就不用手动填入的数据
+		if utils.InArrayByInt([]int{1, 2, 5}, tmpData.DataType) {
+			continue
+		}
+
+		// 手工填写的数字
+		if tmpData.DataType == 3 {
+			tmpData.ShowValue = manualData.ShowValue
+			tmpData.Value = manualData.Value
+			tableDataMap[index][manualData.Tag] = tmpData
+
+			//edbInfoIdDateDataMap[manualData.EdbInfoId][manualData.DataTime] = tmpData
+			continue
+		}
+
+		// 公式
+		tmpData.DataType = manualData.DataType
+		tmpData.ShowValue = ``
+		tmpData.Value = manualData.Value
+		tmpData.RelationEdbInfoList = manualData.RelationEdbInfoList
+		tableDataMap[index][manualData.Tag] = tmpData
+
+	}
+
+	// 文本行的列表插入
+	lenTableData := len(tableDataMap)
+
+	// 文本行第一列的数据列表(可能多行)
+	firstColTextRowList := make([]request.ManualDataReq, 0)
+	// 参与计算的文本行列表数据
+	tmpTextRowList := make([][]request.ManualDataReq, 0)
+	for k, textRowList := range textRowData {
+		// 判断列数是否匹配,不匹配的话那么过滤
+		if len(tagList)+1 != len(textRowList) {
+			continue
+		}
+		rowDataMap := make(map[string]request.ManualDataReq)
+		tmpTextRow := make([]request.ManualDataReq, 0)
+		for index, textRow := range textRowList {
+			// 移除第一列,因为第一列是日期列
+			if index == 0 {
+				firstColTextRowList = append(firstColTextRowList, textRow)
+				continue
+			}
+			rowDataMap[tagList[index-1]] = textRow
+			tmpTextRow = append(tmpTextRow, textRow)
+		}
+
+		tableDataMap[lenTableData+k+1] = rowDataMap
+		tmpTextRowList = append(tmpTextRowList, tmpTextRow)
+	}
+
+	// 参与计算的单元格
+	calculateCellMap := make(map[string]string)
+
+	// 计算手工填写的单元格
+	for _, manualData := range manualDataList {
+		// 找不到该日期,说明这日期过期了,不处理
+		index, ok := dateIndexMap[manualData.DataTime]
+		if !ok {
+			continue
+		}
+
+		// 获取对应行的数据
+		rowDataMap, ok := tableDataMap[index]
+		if !ok {
+			continue
+		}
+
+		// 找到对应的单元格
+		colData, ok := rowDataMap[manualData.Tag]
+		if !ok {
+			continue
+		}
+
+		// 如果该单元格不是计算公式的单元格,那么直接退出当前循环即可
+		if colData.DataType != 4 {
+			continue
+		}
+
+		tagMap := make(map[string]float64)
+		lenRelation := len(colData.RelationEdbInfoList)
+		replaceNum := 0
+		for _, relation := range colData.RelationEdbInfoList {
+			relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
+			valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
+			if tmpErr != nil {
+				continue
+			}
+			tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
+			if tmpErr != nil {
+				continue
+			}
+			tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
+			replaceNum++
+		}
+
+		// 如果替换的数据与关联的不一致,那么就退出当前循环
+		if lenRelation != replaceNum {
+			continue
+		}
+
+		// 计算
+		val, _, err := calculate(strings.ToUpper(colData.Value), tagMap)
+		// 计算失败,退出循环
+		if err != nil {
+			continue
+		}
+		// 重新赋值
+		colData.ShowValue = val
+		tableDataMap[index][manualData.Tag] = colData
+
+	}
+
+	// 计算文本行的单元格
+	for k, textRow := range tmpTextRowList {
+		// 获取对应行的数据
+		index := lenTableData + k + 1
+		rowDataMap, ok := tableDataMap[index]
+		if !ok {
+			continue
+		}
+
+		for colIndex, _ := range textRow {
+			currTag := tagList[colIndex]
+			// 找到对应的单元格
+			colData, ok := rowDataMap[currTag]
+			if !ok {
+				continue
+			}
+
+			// 如果该单元格不是计算公式的单元格,那么直接退出当前循环即可
+			if colData.DataType != 4 {
+				continue
+			}
+
+			tagMap := make(map[string]float64)
+			lenRelation := len(colData.RelationEdbInfoList)
+			replaceNum := 0
+			for _, relation := range colData.RelationEdbInfoList {
+				relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
+				valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
+				if tmpErr != nil {
+					continue
+				}
+				tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
+				if tmpErr != nil {
+					continue
+				}
+				tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
+				replaceNum++
+			}
+
+			// 如果替换的数据与关联的不一致,那么就退出当前循环
+			if lenRelation != replaceNum {
+				continue
+			}
+
+			// 计算
+			val, _, err := calculate(strings.ToUpper(colData.Value), tagMap)
+			// 计算失败,退出循环
+			if err != nil {
+				continue
+			}
+			// 重新赋值
+			colData.ShowValue = val
+			tableDataMap[index][currTag] = colData
+		}
+
+	}
+
+	// 计算文本行第一列的数据值(多行)
+	for k, colData := range firstColTextRowList {
+		// 如果该单元格不是计算公式的单元格,那么直接退出当前循环即可
+		if colData.DataType != 4 {
+			continue
+		}
+
+		tagMap := make(map[string]float64)
+		lenRelation := len(colData.RelationEdbInfoList)
+		replaceNum := 0
+		for _, relation := range colData.RelationEdbInfoList {
+			relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
+			valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
+			if tmpErr != nil {
+				continue
+			}
+			tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
+			if tmpErr != nil {
+				continue
+			}
+			tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
+			replaceNum++
+		}
+
+		// 如果替换的数据与关联的不一致,那么就退出当前循环
+		if lenRelation != replaceNum {
+			continue
+		}
+
+		// 计算
+		val, _, err := calculate(strings.ToUpper(colData.Value), tagMap)
+		// 计算失败,退出循环
+		if err != nil {
+			continue
+		}
+		// 重新赋值
+		colData.ShowValue = val
+		firstColTextRowList[k] = colData
+	}
+
+	{
+		// 文本行的数据处理返回
+		textRowListDataResp = make([][]request.ManualDataReq, 0)
+		newLenTableDataMap := len(tableDataMap)
+		// 文本行的第一行所在的位置
+		firstTextRow := lenTableData + 1
+		for i := firstTextRow; i <= newLenTableDataMap; i++ {
+			textRowDataResp := make([]request.ManualDataReq, 0)
+
+			textRowDataResp = append(textRowDataResp, firstColTextRowList[i-firstTextRow])
+			for _, tmpTag := range tagList {
+				textRowDataResp = append(textRowDataResp, tableDataMap[i][tmpTag])
+			}
+			textRowListDataResp = append(textRowListDataResp, textRowDataResp)
+		}
+
+	}
+
+	return
+}
+
+// getCalculateValue 获取公式计算的结果
+func getCalculateValue(tableDataMap map[int]map[string]request.ManualDataReq, tag, row string, calculateCellMap map[string]string) (val string, err error) {
+	rowInt, err := strconv.Atoi(row)
+	if err != nil {
+		return
+	}
+
+	// 单元格的标签名
+	cellTagName := strings.ToUpper(tag) + row
+	val, ok := calculateCellMap[cellTagName]
+	if ok {
+		return
+	}
+
+	// 查找行数据
+	rowData, ok := tableDataMap[rowInt]
+	if !ok {
+		err = errors.New("查找" + row + "行的数据失败")
+		return
+	}
+
+	// 查找单元格数据
+	colData, ok := rowData[tag]
+	if !ok {
+		err = errors.New("查找单元格" + tag + row + "的数据失败")
+		return
+	}
+
+	// 如果不是计算单元格
+	if colData.DataType != 4 {
+		val = colData.ShowValue
+		return
+	}
+
+	// 如果是计算单元格
+	calculateCellMap[cellTagName] = ``
+
+	tagMap := make(map[string]float64)
+	for _, relation := range colData.RelationEdbInfoList {
+		relationCellTagName := strings.ToUpper(relation.Tag) + relation.Row
+		valStr, tmpErr := getCalculateValue(tableDataMap, relation.Tag, relation.Row, calculateCellMap)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		tmpValDecimal, tmpErr := decimal.NewFromString(valStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		tagMap[relationCellTagName], _ = tmpValDecimal.Float64()
+	}
+
+	// 计算
+	val, _, err = calculate(strings.ToUpper(colData.Value), tagMap)
+	if err != nil {
+		return
+	}
+	// 重新赋值
+	colData.ShowValue = val
+	tableDataMap[rowInt][tag] = colData
+	calculateCellMap[cellTagName] = val
+
+	return
+}
+
+// calculate 公式计算
+func calculate(calculateFormula string, TagMap map[string]float64) (calVal, errMsg string, err error) {
+	if calculateFormula == "" {
+		errMsg = "公式异常"
+		err = errors.New(errMsg)
+		return
+	}
+	calculateFormula = strings.TrimPrefix(calculateFormula, "=")
+	calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
+	calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
+	calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
+	calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
+	calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
+
+	formulaFormStr := utils.ReplaceFormula(TagMap, calculateFormula)
+	//计算公式异常,那么就移除该指标
+	if formulaFormStr == `` {
+		errMsg = "公式异常"
+		err = errors.New(errMsg)
+		return
+	}
+
+	expression := formula.NewExpression(formulaFormStr)
+	calResult, err := expression.Evaluate()
+	if err != nil {
+		errMsg = "计算失败"
+		err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+		// 分母为0的报错
+		if strings.Contains(err.Error(), "divide by zero") {
+			errMsg = "分母不能为0"
+			err = errors.New("分母不能为空,计算公式:" + formulaFormStr)
+		}
+		return
+	}
+	// 如果计算结果是NAN,那么就提示报错
+	if calResult.IsNan() {
+		errMsg = "计算失败"
+		err = errors.New("计算失败:计算结果是:NAN;formulaStr:" + formulaFormStr)
+		return
+	}
+	calVal = calResult.String()
+
+	// 转Decimal然后四舍五入
+	valDecimal, err := decimal.NewFromString(calVal)
+	if err != nil {
+		errMsg = "计算失败"
+		err = errors.New("计算失败,结果转 Decimal 失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+		return
+	}
+	calVal = valDecimal.Round(4).String()
+
+	return
+}

+ 27 - 19
services/data/line_equation/chart_info.go

@@ -366,7 +366,7 @@ func handleData(baseEdbInfoId int, edbDataListMap map[int][]*data_manage.EdbData
 }
 
 // BatchAddChartInfo 批量添加图表
-func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
+func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin, lang string) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
 	source := utils.CHART_SOURCE_LINE_EQUATION
 	// 获取需要
 	for k, v := range batchAddChartReq {
@@ -406,22 +406,30 @@ func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig
 		}
 
 		// 判断图表是否存在
-		var condition string
-		var pars []interface{}
-		condition += " AND chart_name=? AND source = ? "
-		pars = append(pars, v.ChartName, source)
-		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
-		if tmpErr != nil {
-			errMsg = "判断图表名称是否存在失败"
-			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
-			return
-		}
+		{
+			var condition string
+			var pars []interface{}
+			switch lang {
+			case utils.EnLangVersion:
+				condition += " AND chart_name_en = ? AND source = ? "
+			default:
+				condition += " AND chart_name = ? AND source = ? "
+			}
+			pars = append(pars, v.ChartName, source)
+			count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+			if tmpErr != nil {
+				errMsg = "判断图表名称是否存在失败"
+				err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			if count > 0 {
+				errMsg = "图表已存在,请重新填写"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
 
-		if count > 0 {
-			errMsg = "图表已存在,请重新填写"
-			err = errors.New(errMsg)
-			isSendEmail = false
-			return
 		}
 	}
 
@@ -465,9 +473,9 @@ func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig
 		}
 
 		chartInfo := &data_manage.ChartInfo{
-			ChartInfoId: 0,
-			ChartName:   v.ChartName,
-			//ChartNameEn:     v.ChartName,
+			ChartInfoId:     0,
+			ChartName:       v.ChartName,
+			ChartNameEn:     v.ChartName,
 			ChartClassifyId: v.ChartClassifyId,
 			SysUserId:       sysUser.AdminId,
 			SysUserRealName: sysUser.RealName,

+ 64 - 36
services/data/line_feature/chart_info.go

@@ -404,7 +404,7 @@ func GetFrequencyDistributionData(chartInfoId int, mappingInfo *data_manage.Char
 }
 
 // AddChartInfo 添加图表
-func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.ChartEdbInfoMapping, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.ChartEdbInfoMapping, source int, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	req.ChartName = strings.Trim(req.ChartName, " ")
@@ -447,29 +447,39 @@ func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.C
 	}
 	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 	var chartInfoId int
+
 	// 判断图表是否存在
-	var condition string
-	var pars []interface{}
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartName, source)
-	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
+	{
+		var condition string
+		var pars []interface{}
+
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ? AND source = ? "
+		default:
+			condition += " AND chart_name = ? AND source = ? "
+		}
+		pars = append(pars, req.ChartName, source)
+		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
 
-	if count > 0 {
-		errMsg = "图表已存在,请重新填写"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
 
 	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
 
 	chartInfo = new(data_manage.ChartInfo)
 	chartInfo.ChartName = req.ChartName
+	chartInfo.ChartNameEn = req.ChartName
 	chartInfo.EdbInfoIds = edbInfoIdStr
 	chartInfo.ChartClassifyId = req.ChartClassifyId
 	chartInfo.SysUserId = sysUser.AdminId
@@ -525,7 +535,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.C
 }
 
 // EditChartInfo 编辑图表
-func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage.ChartEdbInfoMapping, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage.ChartEdbInfoMapping, sysUser *system.Admin, lang string) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
@@ -591,28 +601,46 @@ func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage
 	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 
 	//判断图表是否存在
-	var condition string
-	var pars []interface{}
-	condition += " AND chart_info_id <> ? "
-	pars = append(pars, req.ChartInfoId)
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartName, chartItem.Source)
-	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
-	if count > 0 {
-		errMsg = "图表已存在,请重新填写"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id <> ? AND source = ?  "
+		pars = append(pars, req.ChartInfoId, chartItem.Source)
+
+		switch lang {
+		case utils.EnLangVersion:
+			condition += " AND chart_name_en = ?"
+		default:
+			condition += " AND chart_name=?"
+		}
+		pars = append(pars, req.ChartName)
+		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
 	}
 
 	// 图表启用与否
 	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
 
+	switch lang {
+	case utils.EnLangVersion:
+		if req.ChartNameEn == `` {
+			req.ChartNameEn = req.ChartName
+		}
+	default:
+		if req.ChartNameEn == `` {
+			req.ChartNameEn = chartItem.ChartNameEn
+		}
+	}
 	// 修改图表与指标mapping
 	err = line_feature.EditLineFeatureChartAndMapping(&req, edbInfoIdStr, "公历", req.DateType, disableVal, req.ExtraConfig)
 	if err != nil {
@@ -635,7 +663,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage
 }
 
 // CopyChartInfo 复制图表
-func CopyChartInfo(configId, configSource, classifyId int, chartName string, edbInfoMapping *data_manage.ChartEdbInfoMapping, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func CopyChartInfo(configId, configSource, classifyId int, chartName string, edbInfoMapping *data_manage.ChartEdbInfoMapping, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin, lang string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(configId)
@@ -663,7 +691,7 @@ func CopyChartInfo(configId, configSource, classifyId int, chartName string, edb
 		MarkersAreas:    oldChartInfo.MarkersAreas,
 	}
 	chartSource := oldChartInfo.Source // 默认是相关性图
-	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, edbInfoMapping, chartSource, sysUser)
+	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, edbInfoMapping, chartSource, sysUser, lang)
 	if err != nil {
 		return
 	}

+ 71 - 31
services/data/mysteel_chemical.go

@@ -13,15 +13,25 @@ import (
 )
 
 // AddMysteelChemicalClassify 添加钢联化工分类
-func AddMysteelChemicalClassify(classifyName string, parentId, level, sysUserId int, sysUserName string) (classifyInfo *data_manage.BaseFromMysteelChemicalClassify, err error, errMsg string) {
-	count, err := data_manage.GetBaseFromMysteelChemicalClassifyCount(classifyName, parentId)
-	if err != nil {
-		errMsg = `判断名称是否已存在失败`
-		return
-	}
-	if count > 0 {
-		errMsg = `分类名称:`+classifyName+` 已存在,请重新输入`
-		return
+func AddMysteelChemicalClassify(classifyName string, parentId, level, sysUserId int, sysUserName, lange string) (classifyInfo *data_manage.BaseFromMysteelChemicalClassify, err error, errMsg string) {
+	// 校验分类名称相同的数量
+	{
+		var count int
+		switch lange {
+		case utils.EnLangVersion:
+			count, err = data_manage.GetBaseFromMysteelChemicalClassifyEnCount(classifyName, parentId)
+		default:
+			count, err = data_manage.GetBaseFromMysteelChemicalClassifyCount(classifyName, parentId)
+		}
+		if err != nil {
+			errMsg = `判断名称是否已存在失败`
+			return
+		}
+		if count > 0 {
+			errMsg = `分类名称:` + classifyName + ` 已存在,请重新输入`
+			err = errors.New(errMsg)
+			return
+		}
 	}
 	//获取该层级下最大的排序数
 	maxSort, err := data_manage.GetBaseFromMysteelChemicalClassifyMaxSort(parentId)
@@ -29,6 +39,7 @@ func AddMysteelChemicalClassify(classifyName string, parentId, level, sysUserId
 	classifyInfo = &data_manage.BaseFromMysteelChemicalClassify{
 		//BaseFromMysteelChemicalClassifyId: 0,
 		ClassifyName:    classifyName,
+		ClassifyNameEn:  classifyName,
 		ParentId:        parentId,
 		SysUserId:       sysUserId,
 		SysUserRealName: sysUserName,
@@ -46,7 +57,7 @@ func AddMysteelChemicalClassify(classifyName string, parentId, level, sysUserId
 }
 
 // EditMysteelChemicalClassify 编辑钢联化工分类
-func EditMysteelChemicalClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
+func EditMysteelChemicalClassify(classifyId int, classifyName, lang string, sysUser *system.Admin) (err error, errMsg string) {
 	item, err := data_manage.GetBaseFromMysteelChemicalClassifyById(classifyId)
 	if err != nil {
 		errMsg = `保存失败`
@@ -60,28 +71,57 @@ func EditMysteelChemicalClassify(classifyId int, classifyName string, sysUser *s
 		return
 	}
 
-	// 名字相同,那么就直接返回
-	if item.ClassifyName == classifyName {
-		return
-	}
+	switch lang {
+	case utils.EnLangVersion:
+		// 名字相同,那么就直接返回
+		if item.ClassifyNameEn == classifyName {
+			return
+		}
 
-	// 判断名称是否已存在
-	count, err := data_manage.GetBaseFromMysteelChemicalClassifyCount(classifyName, item.ParentId)
-	if err != nil {
-		errMsg = "判断名称是否已存在失败"
-		return
-	}
-	if count > 0 {
-		errMsg = "分类名称已存在,请重新输入"
-		err = errors.New(errMsg)
-		return
-	}
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromMysteelChemicalClassifyEnCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
 
-	// 修改数据
-	err = data_manage.EditBaseFromMysteelChemicalClassify(classifyId, classifyName)
-	if err != nil {
-		errMsg = "保存失败"
+		// 修改数据
+		err = data_manage.EditBaseFromMysteelChemicalClassifyEn(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
+	default:
+		// 名字相同,那么就直接返回
+		if item.ClassifyName == classifyName {
+			return
+		}
+
+		// 判断名称是否已存在
+		count, tmpErr := data_manage.GetBaseFromMysteelChemicalClassifyCount(classifyName, item.ParentId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "判断名称是否已存在失败"
+			return
+		}
+		if count > 0 {
+			errMsg = "分类名称已存在,请重新输入"
+			err = errors.New(errMsg)
+			return
+		}
+
+		// 修改数据
+		err = data_manage.EditBaseFromMysteelChemicalClassify(classifyId, classifyName)
+		if err != nil {
+			errMsg = "保存失败"
+		}
 	}
+
 	return
 }
 
@@ -269,7 +309,7 @@ func AddMysteelChemicalIndex(classifyId int, indexCode, updateWeek, updateTimeSt
 		return
 	}
 	if baseFromMysteelChemicalIndex != nil {
-		errMsg = `指标ID:`+indexCode+` 已存在,请重新输入`
+		errMsg = `指标ID:` + indexCode + ` 已存在,请重新输入`
 		return
 	}
 	// 更新时间切割
@@ -575,7 +615,7 @@ func CurlDelMysteelChemicalData(indexCode, updateWeek string) {
 
 // WeekMap 中英文日期转换
 var WeekMap = map[string]string{
-	"":     "",
+	"":   "",
 	"周一": "monday",
 	"周二": "tuesday",
 	"周三": "wednesday",

+ 39 - 7
services/excel/lucky_sheet.go

@@ -1460,7 +1460,7 @@ func getColor(bgStr string) string {
 }
 
 // GetTableDataByCustomData 通过自定义表格数据获取表格数据
-func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTableData TableData, err error) {
+func GetTableDataByCustomData(excelType int, data request.TableDataReq, lang string) (selfTableData TableData, err error) {
 	tableDataList := make([][]LuckySheetDataValue, 0)
 	mergeList := make([]TableDataMerge, 0)
 
@@ -1486,9 +1486,14 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTab
 		// 第一行
 		{
 			firstCol := make([]LuckySheetDataValue, 0)
+			dateStr := "日期"
+			switch lang {
+			case utils.EnLangVersion:
+				dateStr = "Date"
+			}
 			firstCol = append(firstCol, LuckySheetDataValue{
-				Value:   "日期",
-				Monitor: "日期",
+				Value:   dateStr,
+				Monitor: dateStr,
 				MergeCell: LuckySheetDataConfigMerge{
 					Row:    0, //行数
 					Column: 0, //列数
@@ -1501,6 +1506,11 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTab
 				edbName := v.EdbName
 				if v.EdbAliasName != `` {
 					edbName = v.EdbAliasName
+				} else {
+					switch lang {
+					case utils.EnLangVersion:
+						edbName = v.EdbNameEn
+					}
 				}
 				firstCol = append(firstCol, LuckySheetDataValue{
 					Value:     edbName,
@@ -1518,7 +1528,13 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTab
 			secondCol = append(secondCol, LuckySheetDataValue{})
 
 			for _, v := range data.Data {
-				name := v.Unit + " / " + v.Frequency
+				var name string
+				switch lang {
+				case utils.EnLangVersion:
+					name = v.UnitEn + " / " + utils.GetFrequencyEn(v.Frequency)
+				default:
+					name = v.Unit + " / " + v.Frequency
+				}
 				secondCol = append(secondCol, LuckySheetDataValue{
 					Value:     name,
 					Monitor:   name,
@@ -1586,9 +1602,14 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTab
 		// 第一行
 		{
 			firstCol := make([]LuckySheetDataValue, 0)
+			dateStr := "日期"
+			switch lang {
+			case utils.EnLangVersion:
+				dateStr = "Date"
+			}
 			firstCol = append(firstCol, LuckySheetDataValue{
-				Value:   "日期",
-				Monitor: "日期",
+				Value:   dateStr,
+				Monitor: dateStr,
 				MergeCell: LuckySheetDataConfigMerge{
 					Row:    0, //行数
 					Column: 0, //列数
@@ -1632,6 +1653,11 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTab
 				edbName := tmpEdbInfo.EdbName
 				if tmpEdbInfo.EdbAliasName != `` {
 					edbName = tmpEdbInfo.EdbAliasName
+				} else {
+					switch lang {
+					case utils.EnLangVersion:
+						edbName = tmpEdbInfo.EdbNameEn
+					}
 				}
 				dataCol = append(dataCol, LuckySheetDataValue{
 					Value:     edbName,
@@ -1642,7 +1668,13 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq) (selfTab
 
 			// 指标单位、频度
 			{
-				name := tmpEdbInfo.Unit + " / " + tmpEdbInfo.Frequency
+				var name string
+				switch lang {
+				case utils.EnLangVersion:
+					name = tmpEdbInfo.UnitEn + " / " + utils.GetFrequencyEn(tmpEdbInfo.Frequency)
+				default:
+					name = tmpEdbInfo.Unit + " / " + tmpEdbInfo.Frequency
+				}
 				dataCol = append(dataCol, LuckySheetDataValue{
 					Value:     name,
 					Monitor:   name,

+ 6 - 0
utils/constants.go

@@ -420,3 +420,9 @@ const (
 	PercentCalculateTypeRange = 0 // 百分位算法类型-数据区间
 	PercentCalculateTypeNum   = 1 // 百分位算法类型-数据个数
 )
+
+// 语言版本
+const (
+	ZhLangVersion = "zh" // 中文语言版本
+	EnLangVersion = "en" // 英文语言版本
+)