Prechádzať zdrojové kódy

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

Roc 10 mesiacov pred
rodič
commit
95bee0e33a
54 zmenil súbory, kde vykonal 2623 pridanie a 794 odobranie
  1. 9 0
      controllers/base_auth.go
  2. 10 0
      controllers/base_common.go
  3. 11 79
      controllers/data_manage/chart_classify.go
  4. 239 2
      controllers/data_manage/chart_info.go
  5. 2 2
      controllers/data_manage/chart_theme.go
  6. 124 4
      controllers/data_manage/correlation/correlation_chart_info.go
  7. 97 3
      controllers/data_manage/cross_variety/chart_info.go
  8. 2 2
      controllers/data_manage/edb_classify.go
  9. 171 9
      controllers/data_manage/edb_info.go
  10. 16 11
      controllers/data_manage/edb_info_calculate.go
  11. 3 3
      controllers/data_manage/excel/custom_analysis_edb.go
  12. 7 7
      controllers/data_manage/excel/excel_info.go
  13. 3 1
      controllers/data_manage/excel/mixed_table.go
  14. 11 56
      controllers/data_manage/future_good/future_good_chart_classify.go
  15. 211 124
      controllers/data_manage/future_good/future_good_chart_info.go
  16. 11 58
      controllers/data_manage/line_equation/line_chart_classify.go
  17. 124 2
      controllers/data_manage/line_equation/line_chart_info.go
  18. 132 49
      controllers/data_manage/line_feature/chart_info.go
  19. 11 58
      controllers/data_manage/line_feature/classify.go
  20. 2 2
      controllers/data_manage/predict_edb_classify.go
  21. 5 5
      controllers/data_manage/predict_edb_info.go
  22. 1 1
      controllers/data_manage/supply_analysis/variety_edb.go
  23. 62 13
      models/data_manage/chart_classify.go
  24. 114 2
      models/data_manage/chart_info.go
  25. 15 0
      models/data_manage/correlation/request/chart.go
  26. 72 0
      models/data_manage/cross_variety/chart_info_cross_variety.go
  27. 24 0
      models/data_manage/cross_variety/request/chart.go
  28. 67 14
      models/data_manage/edb_classify.go
  29. 23 0
      models/data_manage/edb_config.go
  30. 14 0
      models/data_manage/edb_info.go
  31. 5 1
      models/data_manage/edb_info_calculate.go
  32. 21 0
      models/data_manage/edb_terminal.go
  33. 4 3
      models/data_manage/future_good/future_good_edb_info.go
  34. 11 0
      models/data_manage/future_good/request/future_good_chart.go
  35. 166 0
      models/data_manage/future_good_chart_info.go
  36. 6 0
      models/data_manage/line_equation/request/line_equation.go
  37. 2 0
      models/data_manage/line_feature/line_feature.go
  38. 6 0
      models/data_manage/line_feature/request/line_feature.go
  39. 54 0
      routers/commentsRouter.go
  40. 39 38
      services/data/base_edb_lib.go
  41. 176 0
      services/data/chart_classify.go
  42. 78 46
      services/data/chart_info.go
  43. 55 38
      services/data/correlation/chart_info.go
  44. 14 19
      services/data/cross_variety/chart.go
  45. 20 4
      services/data/data_manage_permission/data_move.go
  46. 77 26
      services/data/edb_classify.go
  47. 185 43
      services/data/edb_info.go
  48. 2 2
      services/data/edb_info_calculate.go
  49. 2 2
      services/data/excel/custom_analysis_edb.go
  50. 8 8
      services/data/excel/excel_info.go
  51. 2 2
      services/data/excel/mixed_table.go
  52. 27 19
      services/data/line_equation/chart_info.go
  53. 64 36
      services/data/line_feature/chart_info.go
  54. 6 0
      utils/constants.go

+ 9 - 0
controllers/base_auth.go

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

+ 10 - 0
controllers/base_common.go

@@ -12,6 +12,7 @@ import (
 
 type BaseCommonController struct {
 	web.Controller
+	Lang string `description:"当前语言类型,中文:zh;英文:en;默认:zh"`
 }
 
 func (c *BaseCommonController) Prepare() {
@@ -22,6 +23,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)
 }

+ 11 - 79
controllers/data_manage/chart_classify.go

@@ -10,7 +10,6 @@ import (
 	"eta/eta_mobile/services/data/data_manage_permission"
 	"eta/eta_mobile/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 = "暂不支持该类型"

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

@@ -5,7 +5,7 @@ import (
 	"eta/eta_mobile/controllers"
 	"eta/eta_mobile/models"
 	"eta/eta_mobile/models/data_manage"
-	"eta/eta_mobile/models/data_manage/future_good/request"
+	"eta/eta_mobile/models/data_manage/correlation/request"
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/services/data"
 	correlationServ "eta/eta_mobile/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
+}

+ 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 != `` {

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

@@ -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 != `` {
@@ -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()
@@ -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_mobile/services/data"
 	"eta/eta_mobile/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
+}

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

@@ -8,7 +8,6 @@ import (
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/services/data"
 	"eta/eta_mobile/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

+ 124 - 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 != `` {
@@ -1526,6 +1526,7 @@ func (this *LineEquationChartInfoController) EnInfoEdit() {
 		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) //图表分享链接缓存
@@ -1664,3 +1665,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_mobile/models/system"
 	"eta/eta_mobile/services/data"
 	"eta/eta_mobile/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

+ 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()

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

@@ -232,7 +232,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 != `` {

+ 62 - 13
models/data_manage/chart_classify.go

@@ -8,19 +8,20 @@ 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) {
@@ -35,6 +36,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 +52,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 +87,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 +102,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
@@ -726,6 +741,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)
@@ -745,6 +761,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 = ?,
@@ -1045,6 +1062,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()
@@ -1104,6 +1127,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_mobile/models/data_manage"
 	"eta/eta_mobile/models/data_manage/cross_variety/request"
+	"eta/eta_mobile/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"`

+ 23 - 0
models/data_manage/edb_config.go

@@ -0,0 +1,23 @@
+package data_manage
+
+import "github.com/beego/beego/v2/client/orm"
+
+type EdbConfig struct {
+	ConfigValue string `description:"详情"`
+}
+
+// EdbConfigUpdate 修改配置
+func EdbConfigUpdate(newValue, configCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE edb_config SET  config_value=?   WHERE config_code=  ?`
+	_, err = o.Raw(sql, newValue, configCode).Exec()
+	return
+}
+
+// GetConfigDetailByCode 根据配置编码获取配置的值
+func GetConfigDetailByCode(configCode string) (item *EdbConfig, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT config_value FROM edb_config WHERE config_code=? `
+	err = o.Raw(sql, configCode).QueryRow(&item)
+	return
+}

+ 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:"创建人名称"`
 }
@@ -1728,8 +1740,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:"下级来源"`

+ 5 - 1
models/data_manage/edb_info_calculate.go

@@ -94,7 +94,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 +164,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 +603,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

+ 21 - 0
models/data_manage/edb_terminal.go

@@ -127,3 +127,24 @@ func (item *EdbTerminal) Update(cols []string) (err error) {
 	_, err = o.Update(item, cols...)
 	return
 }
+
+// GetEdbTerminalByCode 根据终端编码获取终端信息
+func GetEdbTerminalByCode(terminalCode string) (item *EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM edb_terminal WHERE terminal_code = ? `
+	err = o.Raw(sql, terminalCode).QueryRow(&item)
+	return
+}
+
+type TerminalCodeCountGroup struct {
+	TerminalCode string
+	Total        int
+}
+
+// GetEdbCountGroupByTerminal 获取终端code分组总数
+func GetEdbCountGroupByTerminal(source int) (list []TerminalCodeCountGroup, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `select terminal_code,count(1) total from edb_info where source = ? AND no_update=0 AND terminal_code != "" group by terminal_code; `
+	_, err = o.Raw(sql, source).QueryRows(&list)
+	return
+}

+ 4 - 3
models/data_manage/future_good/future_good_edb_info.go

@@ -103,9 +103,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 获取分組指标数据列表

+ 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_mobile/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:"英文名称(根据当前语言版本不同而不同)"`
+}

+ 54 - 0
routers/commentsRouter.go

@@ -79,6 +79,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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_mobile/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/correlation:CorrelationChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -187,6 +196,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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_mobile/controllers/data_manage/cross_variety:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/cross_variety:ChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -1249,6 +1267,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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_mobile/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/line_equation:LineEquationChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -1420,6 +1447,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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_mobile/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
         beego.ControllerComments{
             Method: "Copy",
@@ -1798,6 +1834,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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_mobile/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoBase64Upload",
@@ -2419,6 +2464,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/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 {

+ 176 - 0
services/data/chart_classify.go

@@ -1,6 +1,7 @@
 package data
 
 import (
+	"errors"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/services/data/data_manage_permission"
@@ -220,3 +221,178 @@ 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
+	}
+
+	// 权限校验
+	if classifyInfo.Source == utils.CHART_SOURCE_DEFAULT {
+		// 已授权分类id
+		permissionClassifyIdList, tmpErr := data_manage_permission.GetUserChartClassifyPermissionList(sysUser.AdminId, classifyInfo.ChartClassifyId)
+		if tmpErr != nil {
+			err = errors.New("获取已授权分类id数据失败,Err:" + err.Error())
+			return
+		}
+		haveOperaAuth := data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(classifyInfo.IsJoinPermission, classifyInfo.ChartClassifyId, permissionClassifyIdList)
+
+		// 权限校验
+		{
+			button := GetChartClassifyOpButton(sysUser, classifyInfo.SysUserId, haveOperaAuth)
+			if !button.OpButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				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 = "保存失败"

+ 55 - 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, " ")
@@ -762,28 +762,37 @@ 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 +828,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 +919,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 +1052,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 +1162,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 +1194,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)
 	}
 
 	var chartInfoId int
@@ -683,6 +672,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
@@ -764,7 +754,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)
@@ -880,14 +870,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,
 			})

+ 77 - 26
services/data/edb_classify.go

@@ -252,20 +252,32 @@ 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 +307,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 +348,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 +385,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
 }
 

+ 185 - 43
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)
@@ -1793,29 +1803,12 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 	if source == utils.DATA_SOURCE_STOCK_PLANT {
 		edbType = 2 //计算指标
 	}
-	// todo 如果缓存中的终端信息丢了是否需要调整 从缓存中获取
-	serverUrl := ``
-	if edbInfo.Source == utils.DATA_SOURCE_WIND {
-		windCacheKey := utils.CACHE_WIND_URL + ":" + edbCode
-		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
-		if serverUrl == `` {
-			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
-				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
-			}
-		}
-	}
-	// 获取终端信息
-	terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + edbCode
-	terminalCode, tE := utils.Rc.RedisString(terminalCodeCacheKey)
-	if tE != nil {
-		utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", tE))
-	}
-	var sourceIndexName string
-	if terminalCode == "" {
-		terminalCode, sourceIndexName, tE = GetTerminalFromBaseIndex(source, edbCode)
-		if tE != nil {
-			utils.FileLog.Info(fmt.Sprintf("获取数据源终端信息失败, Err: %s", tE))
-		}
+	// 从缓存中获取
+	terminalCode, serverUrl, sourceIndexName, e := GetEdbTerminalCodeBySource(edbInfo.Source, edbInfo.EdbCode, edbInfo.StockCode)
+	if e != nil {
+		errMsg = "获取可以使用的终端地址失败"
+		err = errors.New("获取可以使用的终端地址失败,Err:" + e.Error())
+		return
 	}
 	//获取该层级下最大的排序数
 	maxSort, err := GetEdbClassifyMaxSort(classifyId, 0)
@@ -1827,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
@@ -1885,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,
@@ -1969,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,
@@ -2078,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 {
@@ -2097,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]
@@ -2112,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)
 				}
 			}
 
@@ -2119,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: //计算指标(拟合残差)
@@ -2132,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: // 滚动相关性
@@ -2164,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 {
@@ -2189,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, ",")
@@ -2205,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:部分指标日期并集"`
@@ -2264,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:"基础计算窗口"`
@@ -2281,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 {
@@ -2290,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:"计算窗口"`
@@ -2302,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
@@ -2725,3 +2757,113 @@ func EdbInfoSmmApiAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo,
 	AddOrEditEdbInfoToEs(int(edbInfoId))
 	return
 }
+
+// GetEdbTerminal 获取终端信息
+func GetEdbTerminal(source int, oldTerminalCode string) (edbTerminal *data_manage.EdbTerminal, err error) {
+	if source == utils.DATA_SOURCE_WIND && oldTerminalCode == "" {
+		tmpConfig := new(data_manage.EdbConfig)
+		tmpConfig, err = data_manage.GetConfigDetailByCode("wind_terminal_code")
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			err = errors.New("获取配置的wind地址失败,err:" + err.Error())
+			return
+		}
+		err = nil
+		if tmpConfig != nil {
+			oldTerminalCode = tmpConfig.ConfigValue
+			//return
+		}
+	}
+	if oldTerminalCode != "" {
+		edbTerminal, err = data_manage.GetEdbTerminalByCode(oldTerminalCode)
+		if err != nil {
+			return
+		}
+		return
+	}
+
+	// 配置中没有的话,那么就从分组获取,
+	list, err := data_manage.GetEdbCountGroupByTerminal(source)
+	if err != nil {
+		return
+	}
+	//windUrlNum := 0
+
+	//获取对应的配置url
+	terminalNumMap := make(map[string]int)
+	for _, v := range list {
+		terminalNumMap[v.TerminalCode] = v.Total
+	}
+
+	terminalList, err := data_manage.GetEdbTerminalListBySource(source)
+	if err != nil {
+		return
+	}
+	if len(terminalList) == 0 {
+		err = errors.New("终端地址未配置")
+		return
+	}
+	num := 0
+	for _, v := range terminalList {
+		tmpNum := terminalNumMap[v.TerminalCode]
+		if edbTerminal == nil {
+			edbTerminal = v
+			num = tmpNum
+		} else if tmpNum < num {
+			edbTerminal = v
+			num = tmpNum
+		}
+	}
+	if edbTerminal == nil {
+		err = errors.New("获取配置的终端地址失败")
+		return
+	}
+	/*if edbTerminal != nil {
+		windUrl = edbTerminal.ServerUrl
+		terminalCode = edbTerminal.TerminalCode
+	}*/
+	return
+}
+
+func GetEdbTerminalCodeBySource(source int, edbCode, stockCode string) (terminalCode, serverUrl, sourceIndexName string, err error) {
+	var e error
+	if stockCode != "" {
+		terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + stockCode
+		terminalCode, e = utils.Rc.RedisString(terminalCodeCacheKey)
+		if e != nil {
+			utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", e))
+		}
+
+		terminalInfo, e := GetEdbTerminal(source, terminalCode)
+		if e != nil {
+			err = errors.New("获取可以使用的终端失败,Err:" + e.Error())
+			return
+		}
+		serverUrl = terminalInfo.ServerUrl
+		terminalCode = terminalInfo.TerminalCode
+		return
+	}
+	// 获取终端信息
+	terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + edbCode
+	terminalCode, tE := utils.Rc.RedisString(terminalCodeCacheKey)
+	if tE != nil {
+		utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", tE))
+	}
+	var terminalCodeOrigin string
+	terminalCodeOrigin, sourceIndexName, tE = GetTerminalFromBaseIndex(source, edbCode)
+	if tE != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取数据源终端信息失败, Err: %s", tE))
+	}
+	if terminalCodeOrigin != "" {
+		terminalCode = terminalCodeOrigin
+	}
+	if source == utils.DATA_SOURCE_WIND || source == utils.DATA_SOURCE_THS {
+		terminalInfo, e := GetEdbTerminal(source, terminalCode)
+		if e != nil {
+			err = errors.New("获取可以使用的终端失败,Err:" + e.Error())
+			return
+		}
+		serverUrl = terminalInfo.ServerUrl
+		terminalCode = terminalInfo.TerminalCode
+	}
+	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

@@ -212,7 +212,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)
@@ -277,7 +277,7 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 			err = tmpErr
 			return
 		}
-		respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson))
+		respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson), lang)
 		if tmpErr != nil {
 			err = tmpErr
 			return

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

@@ -21,7 +21,7 @@ import (
 )
 
 // 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 +34,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 +51,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 +141,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 != `` {
@@ -1337,12 +1337,12 @@ func calculate(calculateFormula string, TagMap map[string]float64) (calVal, errM
 }
 
 // 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

+ 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
 	}

+ 6 - 0
utils/constants.go

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