Преглед на файлове

Merge remote-tracking branch 'origin/master' into pool/94

Roc преди 3 месеца
родител
ревизия
3a5e6e4e39
променени са 87 файла, в които са добавени 6669 реда и са изтрити 1105 реда
  1. 155 15
      controllers/chart.go
  2. 8 1
      controllers/chart_auth.go
  3. 131 14
      controllers/chart_common.go
  4. 54 0
      controllers/eta_forum_chart.go
  5. 133 15
      controllers/excel_info.go
  6. 1 1
      controllers/table.go
  7. 146 0
      facade/instance/ht_mini_facade.go
  8. 234 0
      facade/mini_facde.go
  9. 16 0
      global/global.go
  10. 167 0
      global/initDb.go
  11. 4 0
      go.mod
  12. 9 0
      go.sum
  13. 7 3
      main.go
  14. 1 1
      models/base.go
  15. 28 9
      models/business_conf.go
  16. 100 43
      models/chart.go
  17. 41 15
      models/chart_edb_mapping.go
  18. 118 0
      models/chart_info_range_analysis.go
  19. 44 24
      models/chart_series.go
  20. 7 4
      models/chart_series_edb_mapping.go
  21. 63 42
      models/data_manage/chart_info.go
  22. 25 17
      models/data_manage/chart_info_correlation.go
  23. 36 32
      models/data_manage/chart_theme/chart_theme.go
  24. 19 16
      models/data_manage/chart_theme/chart_theme_type.go
  25. 14 10
      models/data_manage/cross_variety/chart_tag.go
  26. 8 6
      models/data_manage/cross_variety/chart_tag_variety.go
  27. 27 23
      models/data_manage/cross_variety/chart_variety.go
  28. 22 8
      models/data_manage/edb_info.go
  29. 18 9
      models/data_manage/edb_info_calculate.go
  30. 5 6
      models/data_manage/edb_source.go
  31. 27 16
      models/data_manage/excel/excel_chart_data.go
  32. 86 47
      models/data_manage/excel/excel_chart_edb.go
  33. 65 47
      models/data_manage/excel/excel_classify.go
  34. 14 10
      models/data_manage/excel/excel_draft.go
  35. 30 22
      models/data_manage/excel/excel_edb_mapping.go
  36. 153 95
      models/data_manage/excel/excel_info.go
  37. 24 16
      models/data_manage/excel/excel_sheet.go
  38. 19 15
      models/data_manage/excel/excel_sheet_data.go
  39. 66 46
      models/data_manage/factor_edb_series.go
  40. 51 29
      models/data_manage/factor_edb_series_chart_mapping.go
  41. 46 31
      models/data_manage/factor_edb_series_mapping.go
  42. 25 17
      models/data_manage/future_good/chart_info_future_good_profit.go
  43. 54 33
      models/data_manage/future_good/future_good_chart_classify.go
  44. 41 22
      models/data_manage/future_good/future_good_edb_info.go
  45. 22 12
      models/data_manage/future_good/future_good_edb_info_data.go
  46. 18 13
      models/data_manage/multiple_graph_config.go
  47. 24 20
      models/data_manage/multiple_graph_config_chart_mapping.go
  48. 27 14
      models/data_manage/multiple_graph_config_edb_mapping.go
  49. 46 28
      models/data_manage/predict_edb_conf.go
  50. 20 13
      models/data_manage/predict_edb_conf_calculate_mapping.go
  51. 8 4
      models/data_manage/predict_edb_rule_data.go
  52. 5 4
      models/db.go
  53. 2 0
      models/edb_data_base.go
  54. 79 49
      models/excel_info.go
  55. 93 0
      models/excel_info_rule_mapping.go
  56. 213 0
      models/factor_edb_series_calculate_data_qjjs.go
  57. 31 0
      models/referenced_excel_config.go
  58. 8 0
      models/request/mini.go
  59. 10 2
      models/request/mixed_table.go
  60. 14 11
      models/response/excel_info.go
  61. 11 4
      models/share_chart_refresh_log.go
  62. 7 4
      models/table.go
  63. 7 5
      models/table_data.go
  64. 18 0
      routers/commentsRouter.go
  65. 5 0
      routers/router.go
  66. 593 0
      services/data/area_graph/processor_business_logic.go
  67. 28 0
      services/data/area_graph/processor_factory.go
  68. 332 21
      services/data/chart_info.go
  69. 39 7
      services/data/chart_info_excel_balance.go
  70. 5 6
      services/data/chart_theme.go
  71. 83 4
      services/data/edb_info.go
  72. 1 1
      services/data/excel/balance_table.go
  73. 1 1
      services/data/excel/excel_info.go
  74. 52 8
      services/data/excel/mixed_table.go
  75. 58 3
      services/data/excel/time_table.go
  76. 3 83
      services/data/predict_edb_info.go
  77. 1059 0
      services/data/range_analysis/chart_info.go
  78. 57 0
      services/eta_forum/chart_collect.go
  79. 58 0
      services/eta_forum/eta_forum_hub_lib.go
  80. 231 0
      services/excel/luck_sheet_table.go
  81. 157 14
      services/excel/lucky_sheet.go
  82. 273 7
      utils/common.go
  83. 30 0
      utils/config.go
  84. 32 7
      utils/constants.go
  85. 135 0
      utils/date_util.go
  86. 358 0
      utils/sql.go
  87. 74 0
      utils/time.go

+ 155 - 15
controllers/chart.go

@@ -2,12 +2,17 @@ package controllers
 
 import (
 	"encoding/json"
+	"errors"
+	"eta/eta_chart_lib/facade"
 	"eta/eta_chart_lib/models"
 	"eta/eta_chart_lib/models/data_manage"
 	"eta/eta_chart_lib/models/data_manage/cross_variety/request"
 	"eta/eta_chart_lib/models/data_manage/excel"
+	requestDTO "eta/eta_chart_lib/models/request"
 	"eta/eta_chart_lib/services/data"
+	"eta/eta_chart_lib/services/data/area_graph"
 	"eta/eta_chart_lib/services/data/cross_variety"
+	"eta/eta_chart_lib/services/data/range_analysis"
 	dwmini "eta/eta_chart_lib/services/dw_mini"
 	"eta/eta_chart_lib/utils"
 	"fmt"
@@ -36,6 +41,7 @@ func (this *ChartController) ChartInfoDetail() {
 	uniqueCode := this.GetString("UniqueCode")
 	token := this.GetString("Token")
 	source, _ := this.GetInt("Source")
+	miniSource := this.GetString("MiniSource")
 	if uniqueCode == "" {
 		br.Msg = "参数错误"
 		br.ErrMsg = "参数错误,uniqueCode is empty"
@@ -52,16 +58,24 @@ func (this *ChartController) ChartInfoDetail() {
 		return
 	}
 	var isCollect bool
-	if source == utils.CHART_SOURCE_DW && token != "" {
-		tmpIsCollect, err := dwmini.GetMyChartIsCollect(token, uniqueCode)
-		if err != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取收藏状态失败,Err:" + err.Error()
-			return
+	if miniSource != "" {
+		auth := this.Ctx.Request.Header.Get("Authorization")
+		param := facade.BaseRequest{
+			Auth:       auth,
+			UniqueCode: uniqueCode,
+		}
+		isCollect = facade.FacadeClient.Deal(param).IsCollect(facade.GetInstance(miniSource))
+	} else {
+		if source == utils.CHART_SOURCE_DW && token != "" {
+			tmpIsCollect, err := dwmini.GetMyChartIsCollect(token, uniqueCode)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取收藏状态失败,Err:" + err.Error()
+				return
+			}
+			isCollect = tmpIsCollect
 		}
-		isCollect = tmpIsCollect
 	}
-
 	//判断是否有缓存
 	if utils.Re == nil {
 		if utils.Re == nil && utils.Rc.IsExist(key) {
@@ -87,7 +101,7 @@ func (this *ChartController) ChartInfoDetail() {
 
 	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该图已被删除,请刷新页面"
 			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
 			return
@@ -122,6 +136,13 @@ func (this *ChartController) ChartInfoDetail() {
 			br.ErrMsg = errMsg
 			return
 		}
+	case utils.CHART_SOURCE_RANGE_ANALYSIS:
+		resp, isOk, msg, errMsg = GetRangeAnalysisChartInfoDetailFromUniqueCode(chartInfo, key, this.Lang)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
 	default:
 		br.Msg = "错误的图表"
 		br.ErrMsg = "错误的图表"
@@ -177,7 +198,7 @@ func (this *ChartController) ChartInfoRefresh() {
 	}
 	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该图已被删除,请刷新页面"
 			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
 			return
@@ -221,6 +242,13 @@ func (this *ChartController) ChartInfoRefresh() {
 			br.ErrMsg = "刷新失败,Err:" + err.Error()
 			return
 		}
+	case utils.CHART_SOURCE_RANGE_ANALYSIS:
+		//// 刷新相关性图表
+		if _, e := range_analysis.ChartInfoRefresh(chartInfo.ChartInfoId, ""); e != nil {
+			br.Msg = "刷新失败"
+			br.ErrMsg = "刷新相关性图表失败, Err:" + e.Error()
+			return
+		}
 	default:
 		err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
 	}
@@ -241,6 +269,50 @@ func (this *ChartController) ChartInfoRefresh() {
 	br.Msg = "刷新成功"
 }
 
+// MiniBookMark
+// @Title 小程序收藏/取消收藏通用接口
+// @Description 小程序收藏/取消收藏通用接口
+// @Param	request	body models.ChartCollectReq true "type json string"
+// @Success Ret=200 取消收藏成功
+// @router /mini/bookMark [post]
+func (this *ChartController) MiniBookMark() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req requestDTO.ChartCollectReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,Err:" + err.Error()
+		return
+	}
+	if req.UniqueCode == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,UniqueCode is empty"
+		return
+	}
+	if req.Source == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,Source is empty"
+		return
+	}
+	auth := this.Ctx.Request.Header.Get("Authorization")
+	param := facade.BaseRequest{
+		Auth:       auth,
+		UniqueCode: req.UniqueCode,
+	}
+	action, err := facade.FacadeClient.Deal(param).HandleAction(req.Action, facade.GetInstance(req.Source))
+	if err != nil {
+		br.Msg = action + "失败"
+		br.ErrMsg = action + "失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = action + "成功"
+}
+
 // CollectCancel
 // @Title 东吴小程序图表取消收藏接口
 // @Description 东吴小程序图表取消收藏接口
@@ -319,7 +391,7 @@ func (this *ChartController) Collect() {
 
 	chartInfo, err := models.GetChartInfoByUniqueCode(req.UniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该图已被删除,请刷新页面"
 			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
 			return
@@ -428,7 +500,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (
 		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
-	yearMax := 0
+	var dateMax time.Time
 	if dateType == utils.DateTypeNYears {
 		for _, v := range mappingList {
 			if v.LatestDate != "" {
@@ -438,13 +510,17 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (
 					errMsg = "获取图表日期信息失败,Err:" + tErr.Error()
 					return
 				}
-				if lastDateT.Year() > yearMax {
-					yearMax = lastDateT.Year()
+				if lastDateT.After(dateMax) {
+					dateMax = lastDateT
 				}
 			}
 		}
 	}
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
+	if chartInfo.DateType == utils.DateTypeNYears && chartInfo.ChartType == utils.CHART_TYPE_SEASON {
+		// 季节性图表,要特殊处理起始日期, 最近N年
+		dateMax = time.Date(dateMax.Year()+1, 1, 1, 0, 0, 0, 0, time.Local)
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, dateMax)
 
 	extraConfigStr := chartInfo.ExtraConfig
 	// 柱方图的一些配置
@@ -474,6 +550,16 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (
 		return
 	}
 
+	// 面积图 面积堆积 数据处理
+	if chartType == utils.CHART_TYPE_AREA {
+		err, errMsg = fillAreaGraphData(extraConfigStr, edbList)
+		if err != nil {
+			msg = "获取失败"
+			errMsg = "获取面积图数据失败,Err:" + err.Error()
+			return
+		}
+	}
+
 	for _, v := range edbList {
 		// 指标别名
 		if barConfig.EdbInfoIdList != nil && len(barConfig.EdbInfoIdList) > 0 {
@@ -504,3 +590,57 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (
 	isOk = true
 	return
 }
+
+func fillAreaGraphData(extraConfigStr string, edbDataList []*models.ChartEdbInfoMapping) (err error, errMsg string) {
+
+	var tmpConfig data_manage.AreaExtraConf
+	if extraConfigStr != `` {
+		err = json.Unmarshal([]byte(extraConfigStr), &tmpConfig)
+		if err != nil {
+			errMsg = "面积图配置异常"
+			err = errors.New(errMsg)
+			return
+		}
+		if tmpConfig.StandardEdbInfoId <= 0 {
+			utils.FileLog.Info("面积图未开启面积堆积")
+			return
+		}
+	}
+	if tmpConfig.IsHeap == 1 {
+		standardIndexMap := make(map[string]*models.EdbDataList)
+		var startDate, endDate string
+		for _, v := range edbDataList {
+			// 判断是否为基准指标
+			if v.EdbInfoId == tmpConfig.StandardEdbInfoId {
+				if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+					startDate = dataList[0].DataTime
+					endDate = dataList[len(dataList)-1].DataTime
+					for _, dataObject := range dataList {
+						standardIndexMap[dataObject.DataTime] = dataObject
+					}
+				}
+				break
+			}
+		}
+		strategy, err := area_graph.CreateStrategy(tmpConfig.NullDealWay)
+		if err != nil {
+			return err, "创建空值处理器失败"
+		}
+		err = strategy.Deal(tmpConfig, edbDataList, standardIndexMap, startDate, endDate)
+		if err != nil {
+			return err, err.Error()
+		}
+
+		// 时间戳处理
+		for _, mapping := range edbDataList {
+			if dataList, ok := mapping.DataList.([]*models.EdbDataList); ok {
+				for _, dataInfo := range dataList {
+					toFormatTime := utils.StringToFormatTime(dataInfo.DataTime, utils.FormatDate)
+					dataInfo.DataTimestamp = toFormatTime.UnixMilli()
+				}
+			}
+		}
+	}
+
+	return nil, ""
+}

+ 8 - 1
controllers/chart_auth.go

@@ -64,7 +64,7 @@ func (this *ChartAuthController) ChartInfoDetail() {
 
 	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该图已被删除,请刷新页面"
 			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
 			return
@@ -99,6 +99,13 @@ func (this *ChartAuthController) ChartInfoDetail() {
 			br.ErrMsg = errMsg
 			return
 		}
+	case utils.CHART_SOURCE_RANGE_ANALYSIS:
+		resp, isOk, msg, errMsg = GetRangeAnalysisChartInfoDetailFromUniqueCode(chartInfo, key, this.Lang)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
 	default:
 		br.Msg = "错误的图表"
 		br.ErrMsg = "错误的图表"

+ 131 - 14
controllers/chart_common.go

@@ -17,6 +17,7 @@ import (
 	future_goodServ "eta/eta_chart_lib/services/data/future_good"
 	"eta/eta_chart_lib/services/data/line_equation"
 	lineFeatureServ "eta/eta_chart_lib/services/data/line_feature"
+	"eta/eta_chart_lib/services/data/range_analysis"
 	dwmini "eta/eta_chart_lib/services/dw_mini"
 	"eta/eta_chart_lib/utils"
 	"fmt"
@@ -31,6 +32,7 @@ import (
 // @Param   UniqueCode   query   int  true       "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
 // @Param   IsCache   query   bool  true       "是否走缓存,默认false"
 // @Param   Token   query   string  true       "东吴小程序token"
+// @Param   AuthToken   query   string  true       "图表权限鉴权token"
 // @Param   Source   query   int  true       "查询来源 1:东吴"
 // @Success 200 {object} data_manage.ChartInfoDetailFromUniqueCodeResp
 // @router /common/detail [get]
@@ -44,6 +46,7 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 	uniqueCode := this.GetString("UniqueCode")
 	token := this.GetString("Token")
 	source, _ := this.GetInt("Source")
+	authToken := this.GetString("AuthToken")
 	if uniqueCode == "" {
 		br.Msg = "参数错误"
 		br.ErrMsg = "参数错误,uniqueCode is empty"
@@ -52,6 +55,18 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 	key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
 	resp := new(models.ChartInfoDetailResp)
 
+	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			br.Msg = "该图已被删除,请刷新页面"
+			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
 	// 图表水印
 	conf, e := models.GetBusinessConf()
 	if e != nil {
@@ -59,6 +74,35 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 		br.ErrMsg = "获取配置信息失败, Err: " + e.Error()
 		return
 	}
+
+	// 图表有效期是否开启
+	if conf[models.BusinessConfIsOpenChartExpired] == "true" {
+		resp.ChartInfo = chartInfo
+		br.Data = resp
+
+		if authToken == `` {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "无鉴权"
+			return
+		}
+
+		tmpKey := fmt.Sprint(utils.CACHE_CHART_AUTH, authToken)
+		redisChartCode, err := utils.Rc.RedisString(tmpKey)
+		if err != nil {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			return
+		}
+		if redisChartCode != uniqueCode {
+			br.Ret = 200
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败"
+			return
+		}
+	}
+
 	var isCollect bool
 	if source == utils.CHART_SOURCE_DW && token != "" {
 		tmpIsCollect, err := dwmini.GetMyChartIsCollect(token, uniqueCode)
@@ -81,6 +125,7 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 					if isCollect {
 						resp.IsCollect = isCollect
 					}
+					resp.IsAuth = true
 					br.Ret = 200
 					br.Success = true
 					br.Msg = "获取成功"
@@ -92,18 +137,6 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 		}
 	}
 
-	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			br.Msg = "该图已被删除,请刷新页面"
-			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
-			return
-		}
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
-		return
-	}
-
 	//var resp interface{}
 	var isOk bool
 	var msg, errMsg string
@@ -129,6 +162,13 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 			br.ErrMsg = errMsg
 			return
 		}
+	case utils.CHART_SOURCE_RANGE_ANALYSIS:
+		resp, isOk, msg, errMsg = GetRangeAnalysisChartInfoDetailFromUniqueCode(chartInfo, key, this.Lang)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
 	default:
 		br.Msg = "错误的图表"
 		br.ErrMsg = "错误的图表"
@@ -147,6 +187,7 @@ func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
 	if conf[models.BusinessConfWatermarkChart] == "true" && conf[models.BusinessConfCompanyWatermark] != "" {
 		resp.WaterMark = conf[models.BusinessConfCompanyWatermark]
 	}
+	resp.IsAuth = true
 
 	br.Ret = 200
 	br.Success = true
@@ -703,7 +744,7 @@ func (this *ChartController) FutureGoodChartInfoRefresh() {
 	}
 	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该图已被删除,请刷新页面"
 			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
 			return
@@ -901,7 +942,7 @@ func (this *ChartController) CorrelationChartInfoRefresh() {
 	}
 	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该图已被删除,请刷新页面"
 			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
 			return
@@ -935,3 +976,79 @@ func (this *ChartController) CorrelationChartInfoRefresh() {
 	br.Success = true
 	br.Msg = "刷新成功"
 }
+
+// GetRangeAnalysisChartInfoDetailFromUniqueCode 根据编码获取区间计算图表详情
+func GetRangeAnalysisChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key, lang string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
+	resp = new(models.ChartInfoDetailResp)
+	// 获取主题样式
+	chartTheme, err := data.GetChartThemeConfig(chartInfo.ChartThemeId, utils.CHART_SOURCE_DEFAULT, 1)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取主题信息失败,Err:" + err.Error()
+		return
+	}
+	chartInfo.ChartThemeStyle = chartTheme.Config
+	chartInfo.ChartThemeId = chartTheme.ChartThemeId
+
+	chartInfoId := chartInfo.ChartInfoId
+
+	// 获取指标信息
+	//chartInfo.CorrelationLeadUnit = req.LeadUnit
+	edbInfoMappingList, err := models.GetChartEdbMappingList(chartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
+		return
+	}
+	dateType := chartInfo.DateType
+	// 开始/结束日期
+	startYear := chartInfo.StartYear
+	startDate := chartInfo.StartDate
+	endDate := chartInfo.EndDate
+
+	// 区间计算图表配置校验
+	var extraConfig models.ChartRangeAnalysisExtraConf
+	if chartInfo.ExtraConfig == `` {
+		msg = "配置信息错误"
+		return
+	}
+	err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConfig)
+	if err != nil {
+		msg = "配置信息错误"
+		errMsg = "图表配置信息错误,Err:" + err.Error()
+		return
+	}
+
+	// 获取图表数据
+	if len(edbInfoMappingList) == 0 {
+		msg = "获取失败"
+		errMsg = "图表没有指标,无法计算"
+		return
+	}
+
+	// 获取图表x轴y轴
+	edbList, xEdbIdValue, dataResp, e := range_analysis.GetChartDataByEdbInfoList(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, &extraConfig)
+	if e != nil {
+		msg = "获取失败"
+		errMsg = "获取区间计算图表, 图表计算值失败, Err:" + e.Error()
+		return
+	}
+
+	// 图表的指标来源
+	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+
+	resp.ChartInfo = chartInfo
+	resp.EdbInfoList = edbList
+	resp.XEdbIdValue = xEdbIdValue
+	resp.DataResp = dataResp
+
+	if utils.Re == nil {
+		jsonData, _ := json.Marshal(resp)
+		utils.Rc.Put(key, jsonData, 10*time.Minute)
+	}
+
+	isOk = true
+	return
+}

+ 54 - 0
controllers/eta_forum_chart.go

@@ -0,0 +1,54 @@
+package controllers
+
+import (
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/services/eta_forum"
+)
+
+type EtaForumChartController struct {
+	BaseCommonController
+}
+
+// CommonChartInfoDetailFromUniqueCode
+// @Title 根据编码获取图表详情
+// @Description 根据编码获取图表详情接口
+// @Param   UniqueCode   query   int  true       "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
+// @Param   IsCache   query   bool  true       "是否走缓存,默认false"
+// @Success 200 {object} data_manage.ChartInfoDetailFromUniqueCodeResp
+// @router /chart/common/detail [get]
+func (this *EtaForumChartController) CommonChartInfoDetailFromUniqueCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	uniqueCode := this.GetString("UniqueCode")
+	if uniqueCode == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,uniqueCode is empty"
+		return
+	}
+
+	resp := new(models.ChartInfoDetailResp)
+	//是否走缓存
+	isCache, _ := this.GetBool("IsCache")
+	forumResp, err, _ := eta_forum.GeChartFromUniqueCode(uniqueCode, isCache)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败, Err: " + err.Error()
+		return
+	}
+	chartInfo := forumResp.ChartInfo
+	resp.ChartInfo = chartInfo
+	resp.DataResp = forumResp.DataResp
+	resp.EdbInfoList = forumResp.EdbInfoList
+	resp.XDataList = forumResp.XDataList
+	resp.YDataList = forumResp.YDataList
+	resp.WaterMark = forumResp.WaterMark
+	resp.IsAuth = true
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 133 - 15
controllers/excel_info.go

@@ -11,9 +11,10 @@ import (
 	"eta/eta_chart_lib/services/excel"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/shopspring/decimal"
 	"strings"
 	"time"
+
+	"github.com/shopspring/decimal"
 )
 
 // ExcelInfoController excel表格
@@ -26,6 +27,7 @@ type ExcelInfoController struct {
 // @Description 获取表格表详情接口
 // @Param   UniqueCode   query   string  true       "表格表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
 // @Param   FromScene   query   int  true       "场景来源,1:智能研报,2:研报列表;3:英文研报;4:中文PPT;5:英文PPT"
+// @Param   AuthToken   query   string  true       "图表权限鉴权token"
 // @Success 200 {object} response.ExcelTableDetailResp
 // @router /detail [get]
 func (this *ExcelInfoController) GetTableDetail() {
@@ -42,8 +44,68 @@ func (this *ExcelInfoController) GetTableDetail() {
 		return
 	}
 	fromScene, _ := this.GetInt("FromScene", 0)
-	key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + uniqueCode
+	referencedId, _ := this.GetInt("ReferencedId", 0)
+	uuid := this.GetString("Uuid")
+	authToken := this.GetString("AuthToken")
+
+	businessConf, err := models.GetBusinessConfByKey(models.BusinessConfIsOpenChartExpired)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取配置失败,Err:" + err.Error()
+		return
+	}
+
 	resp := new(response.ExcelTableDetailResp)
+	excelInfo, err := models.GetExcelInfoByUniqueCode(uniqueCode)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			br.Msg = "该表格已被删除,请刷新页面"
+			br.ErrMsg = "该表格已被删除,请刷新页面,Err:" + err.Error()
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取表格表信息失败,Err:" + err.Error()
+		return
+	}
+
+	if businessConf.ConfVal == `true` {
+		resp.ExcelType = excelInfo.ExcelType
+		resp.ExcelName = excelInfo.ExcelName
+		resp.ExcelImage = excelInfo.ExcelImage
+		resp.UniqueCode = excelInfo.UniqueCode
+		resp.SourcesFrom = excelInfo.SourcesFrom
+
+		if authToken == `` {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "无鉴权"
+			br.Data = resp
+			return
+		}
+
+		tmpKey := fmt.Sprint(utils.CACHE_CHART_AUTH, authToken)
+		redisChartCode, err := utils.Rc.RedisString(tmpKey)
+		if err != nil {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+		if redisChartCode != uniqueCode {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+	}
+
+	key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + uniqueCode
+	switch fromScene {
+	case 1, 2:
+		fromScene = 2
+	}
 
 	//判断是否有缓存
 	//if utils.Re == nil {
@@ -79,17 +141,6 @@ func (this *ExcelInfoController) GetTableDetail() {
 	//	}
 	//}
 
-	excelInfo, err := models.GetExcelInfoByUniqueCode(uniqueCode)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			br.Msg = "该表格已被删除,请刷新页面"
-			br.ErrMsg = "该表格已被删除,请刷新页面,Err:" + err.Error()
-			return
-		}
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取表格表信息失败,Err:" + err.Error()
-		return
-	}
 	var tableData excel.TableData
 	switch excelInfo.Source {
 	case utils.EXCEL_DEFAULT:
@@ -150,7 +201,50 @@ func (this *ExcelInfoController) GetTableDetail() {
 			br.ErrMsg = "获取最新的数据失败,Err:" + tmpErr.Error()
 			return
 		}
-		tableData, err = excel.GetTableDataByMixedTableData(newResult, true)
+		tableData, err = excel.GetTableDataByMixedTableData(newResult, true, excelInfo.ExcelInfoId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "转换成table失败,Err:" + err.Error()
+			return
+		}
+		edbInfoIds := make([]int, 0)
+		edbInfoIdExist := make(map[int]bool)
+		if len(newResult) > 0 {
+			for _, t := range newResult {
+				for _, v := range t {
+					if v.EdbInfoId > 0 && !edbInfoIdExist[v.EdbInfoId] {
+						edbInfoIdExist[v.EdbInfoId] = true
+						edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+					}
+				}
+			}
+		}
+		sourceNameList, sourceNameEnList, err := data.GetEdbSourceByEdbInfoIdListForExcel(edbInfoIds)
+		if err != nil {
+			br.Msg = "自定义表格数据获取失败"
+			br.ErrMsg = "自定义表格数据获取失败,Err:" + err.Error()
+			return
+		}
+		resp.ExcelSource = strings.Join(sourceNameList, ",")
+		resp.ExcelSourceEn = strings.Join(sourceNameEnList, ",")
+	case utils.BALANCE_TABLE:
+		var result request.MixedTableReq
+		err = json.Unmarshal([]byte(excelInfo.Content), &result)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
+			return
+		}
+		newResult, tmpErr, tmpErrMsg := excel2.GetMixedTableCellData(result, this.Lang)
+		if tmpErr != nil {
+			br.Msg = "获取失败"
+			if tmpErrMsg != `` {
+				br.Msg = tmpErrMsg
+			}
+			br.ErrMsg = "获取最新的数据失败,Err:" + tmpErr.Error()
+			return
+		}
+		tableData, err = excel.GetTableDataByMixedTableData(newResult, true, excelInfo.ExcelInfoId)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "转换成table失败,Err:" + err.Error()
@@ -179,9 +273,23 @@ func (this *ExcelInfoController) GetTableDetail() {
 	}
 
 	tableData = excel.HandleTableCell(tableData)
+	// tableData, err = excel.HandleRuleToTableCell(excelInfo.ExcelInfoId, tableData)
+	// if err != nil {
+	// 	utils.FileLog.Info("表格管理规则处理失败,HandleRuleToTableCell err:", err.Error())
+	// }
 	config := response.ExcelTableDetailConfigResp{
 		FontSize: 9,
 	}
+	waterMarkConf, err := models.GetBusinessConfByKeys([]string{"WatermarkTable", "CompanyWatermark"})
+	if err != nil {
+		br.Msg = "获取水印失败"
+		br.ErrMsg = "获取水印失败,Err:" + err.Error()
+		return
+	}
+	if waterMarkConf["WatermarkTable"] == "true" && waterMarkConf["CompanyWatermark"] != "" {
+		config.Watermark = waterMarkConf["CompanyWatermark"]
+
+	}
 
 	// 获取配置的字体大小
 	confName := models.FromSceneMap[fromScene]
@@ -195,6 +303,15 @@ func (this *ExcelInfoController) GetTableDetail() {
 		}
 	}
 
+	// 获取表格引用
+	reference, err := models.GetReferencedExcelConfig(referencedId, fromScene, uniqueCode, uuid)
+	if err != nil && !utils.IsErrNoRow(err) {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取表格引用失败,Err:" + err.Error()
+		return
+	}
+
+	resp.IsAuth = true
 	resp.TableInfo = tableData
 	resp.Source = excelInfo.Source
 	resp.ExcelType = excelInfo.ExcelType
@@ -203,6 +320,7 @@ func (this *ExcelInfoController) GetTableDetail() {
 	resp.UniqueCode = excelInfo.UniqueCode
 	resp.Config = config
 	resp.SourcesFrom = excelInfo.SourcesFrom
+	resp.ReferencedExcelConfig = reference
 
 	if utils.Re == nil {
 		data, _ := json.Marshal(resp)
@@ -292,7 +410,7 @@ func (this *ExcelInfoController) Refresh() {
 	// 获取数据详情
 	excelDetail, errMsg, err := excel2.GetExcelDetailInfoByExcelInfoId(uniqueCode, this.Lang)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该表格已被删除,请刷新页面"
 			br.ErrMsg = "该表格已被删除,请刷新页面,Err:" + err.Error()
 			return

+ 1 - 1
controllers/table.go

@@ -53,7 +53,7 @@ func (this *TableController) TableInfoDetail() {
 
 	tableInfo, err := models.GetTableInfoByUniqueCode(uniqueCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "该表格已被删除,请刷新页面"
 			br.ErrMsg = "该表格已被删除,请刷新页面,Err:" + err.Error()
 			return

+ 146 - 0
facade/instance/ht_mini_facade.go

@@ -0,0 +1,146 @@
+package instance
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_chart_lib/facade"
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+)
+
+const (
+	bookMarkUrl      = "user/bookMark"
+	unBookMarkUrl    = "user/unBookMark"
+	checkBookMarkUrl = "user/checkBookMark"
+	target           = "ht"
+)
+
+type HTCollectionReq struct {
+	UniqueCode string `json:"uniqueCode"`
+}
+type HTMiniFacade struct {
+	facade.BaseMiniFacade
+}
+type HTResponse struct {
+	Ret     int
+	Msg     string
+	Data    interface{} `json:"data"`
+	ErrMsg  string
+	ErrCode int
+	Success bool
+}
+type HTRequest struct {
+	facade.BaseRequest
+	ChartInfoId int
+	ChartName   string
+	ChartImage  string
+	SourceType  string
+	SourceId    int
+}
+
+func dealChartInfo(baseReq facade.BaseRequest) (request HTRequest, err error) {
+	chartInfo, err := models.GetChartInfoByUniqueCode(baseReq.UniqueCode)
+	if err != nil {
+		utils.FileLog.Error("收藏失败,获取图表信息失败:%v", err.Error())
+		return
+	}
+	request = HTRequest{
+		BaseRequest: baseReq,
+		ChartImage:  chartInfo.ChartImage,
+		ChartInfoId: chartInfo.ChartInfoId,
+		ChartName:   chartInfo.ChartName,
+		SourceType:  "chart",
+		SourceId:    chartInfo.ChartInfoId,
+	}
+	return
+}
+func parseResult(resp string) (response HTResponse, err error) {
+	err = json.Unmarshal([]byte(resp), &response)
+	if err != nil {
+		utils.FileLog.Error("收藏失败,解析应答失败:%v,应答结果:%s", err.Error(), resp)
+	}
+	if !response.Success {
+		utils.FileLog.Error("收藏失败,应答结果:%d[%s]", response.ErrCode, response.ErrMsg)
+		err = errors.New(response.ErrMsg)
+	}
+	return
+}
+func (ht *HTMiniFacade) Collect(req facade.BaseRequest) (err error) {
+	param, err := dealChartInfo(req)
+	if err != nil {
+		utils.FileLog.Error("收藏失败,获取图表信息失败:%v", err.Error())
+		return err
+	}
+	url, err := generateUrl(bookMarkUrl)
+	if err != nil {
+		return
+	}
+	resp, err := ht.Post(url, param, req.Auth)
+	if err != nil {
+		utils.FileLog.Error("收藏失败,err:%v,resp:%v", err, resp)
+		return
+	}
+	_, err = parseResult(resp)
+	return
+}
+func (ht *HTMiniFacade) UnCollect(req facade.BaseRequest) (err error) {
+	param, err := dealChartInfo(req)
+	if err != nil {
+		utils.FileLog.Error("收藏失败,获取图表信息失败:%v", err.Error())
+		return err
+	}
+	url, err := generateUrl(unBookMarkUrl)
+	if err != nil {
+		return
+	}
+	resp, err := ht.Post(url, param, req.Auth)
+	if err != nil {
+		utils.FileLog.Error("取消收藏失败,err:%v,resp:%v", err, resp)
+		return
+	}
+	_, err = parseResult(resp)
+	return
+}
+func generateUrl(path string) (url string, err error) {
+	configPath := utils.GetMiniUrl(target)
+	if configPath == "" {
+		utils.FileLog.Error("获取mini接口地址失败", err)
+		err = errors.New("获取mini接口地址失败")
+		return
+	}
+	url = fmt.Sprintf("%s%s", configPath, path)
+	return
+}
+func (ht *HTMiniFacade) IsCollect(req facade.BaseRequest) bool {
+	param, err := dealChartInfo(req)
+	if err != nil {
+		utils.FileLog.Error("获取是否收藏失败,获取图表信息失败:%v", err.Error())
+		return false
+	}
+	url, err := generateUrl(checkBookMarkUrl)
+	if err != nil {
+		return false
+	}
+	resp, err := ht.Post(url, param, req.Auth)
+	if err != nil {
+		utils.FileLog.Error("获取是否收藏失败,err:%v,resp:%v", err, resp)
+		return false
+	}
+	response, err := parseResult(resp)
+	if err != nil {
+		utils.FileLog.Error("获取是否收藏失败,解析应答失败:%v,应答结果:%s", err, resp)
+		return false
+	}
+	var resMap = response.Data.(map[string]interface{})
+	bookMarked := resMap["isBookMarked"]
+	if bookMarked == nil {
+		return false
+	}
+	return bookMarked.(bool)
+}
+func init() {
+	facade.RegisterMiniFacade(target, &HTMiniFacade{
+		BaseMiniFacade: facade.FacadeClient,
+	})
+}

+ 234 - 0
facade/mini_facde.go

@@ -0,0 +1,234 @@
+package facade
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+	"io"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+)
+
+var (
+	once          sync.Once
+	miniFacadeMap = make(map[string]ChartCollect)
+
+	FacadeClient = BaseMiniFacade{
+		client: DefaultClient(),
+	}
+)
+
+const (
+	bookMark   = "bookMark"
+	unBookMark = "unBookMark"
+)
+
+func GetInstance(name string) ChartCollect {
+	return miniFacadeMap[name]
+}
+
+type ChartCollect interface {
+	Collect(data BaseRequest) (err error)
+	UnCollect(data BaseRequest) (err error)
+	IsCollect(data BaseRequest) bool
+}
+
+type BaseRequest struct {
+	Auth       string `json:"auth"`
+	UniqueCode string `json:"uniqueCode"`
+}
+
+func (bm *BaseMiniFacade) GetData() interface{} {
+	return bm.data
+}
+
+func (bm *BaseMiniFacade) Post(url string, data interface{}, auth string) (result string, err error) {
+	resp, err := bm.client.Post(url, data, auth)
+	if err != nil {
+		return
+	}
+	respBody, respErr := io.ReadAll(resp.Body)
+	if respErr != nil {
+		utils.FileLog.Error("读取body失败,err:%v", err)
+		return
+	}
+	result = string(respBody)
+	return
+}
+func (bm *BaseMiniFacade) Deal(data BaseRequest) *BaseMiniFacade {
+	bm.data = data
+	return bm
+}
+func (bm *BaseMiniFacade) HandleAction(action string, handler ChartCollect) (actionMsg string, err error) {
+	if handler == nil {
+		return "", errors.New("不支持的操作类型")
+	}
+	switch action {
+	case bookMark:
+		err = handler.Collect(bm.data)
+		actionMsg = "收藏"
+	case unBookMark:
+		err = handler.UnCollect(bm.data)
+		actionMsg = "取消收藏"
+	default:
+		err = errors.New("不支持的操作")
+	}
+	return
+}
+
+func (bm *BaseMiniFacade) IsCollect(handler ChartCollect) bool {
+	return handler.IsCollect(bm.data)
+}
+
+type BaseMiniFacade struct {
+	client *HttpClient
+	data   BaseRequest //返回参数
+}
+
+type HttpClient struct {
+	*http.Client
+	maxRetries     int
+	retryDelayFunc RetryDelayFunc
+}
+
+// NewClient 构造函数,其中 delayFunc 参数是可选的
+func NewClient(timeout time.Duration, maxRetries int, delayFunc ...RetryDelayFunc) *HttpClient {
+	var df RetryDelayFunc
+	if len(delayFunc) > 0 {
+		df = delayFunc[0]
+	} else {
+		df = defaultRetryDelayFunc
+	}
+	return &HttpClient{
+		Client:         &http.Client{Timeout: timeout},
+		maxRetries:     maxRetries,
+		retryDelayFunc: df,
+	}
+}
+
+func DefaultClient() *HttpClient {
+	return NewClient(time.Second*10, 3)
+}
+func defaultRetryDelayFunc(attempt int) time.Duration {
+	delay := time.Duration(attempt) * time.Second
+	if attempt > 0 {
+		delay *= 2
+	}
+	return delay
+}
+
+type RetryDelayFunc func(attempt int) time.Duration
+
+func retryErr(err error) bool {
+	return errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled)
+}
+
+// DoWithRetry 发送带有重试机制的HTTP请求,允许用户自定义重试延迟逻辑
+func (hc *HttpClient) DoWithRetry(ctx context.Context, req *http.Request) (resp *http.Response, err error) {
+	attempt := 0
+	for {
+		resp, err = hc.Do(req.WithContext(ctx))
+		if err != nil && retryErr(err) {
+			if attempt >= hc.maxRetries {
+
+				return nil, fmt.Errorf("请求失败: %w", err)
+			}
+			attempt++
+			delay := hc.retryDelayFunc(attempt)
+			time.Sleep(delay)
+			continue
+		}
+		return
+	}
+}
+
+func (hc *HttpClient) Post(url string, data interface{}, auth string) (resp *http.Response, err error) {
+	dataStr, err := json.Marshal(data)
+	if err != nil {
+		utils.FileLog.Error("请求data json序列化失败,err:" + err.Error())
+	}
+	body := io.NopCloser(strings.NewReader(string(dataStr)))
+	req, err := http.NewRequest(http.MethodPost, url, body)
+	req.Header.Set("Content-Type", "application/json")
+	req.Header.Set("Authorization", auth)
+	if err != nil {
+		utils.FileLog.Error("创建POST请求失败: %v", err.Error())
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	if err == nil {
+		code := resp.StatusCode
+		if code != 200 {
+			utils.FileLog.Error("请求错误应答,状态码:%d", code)
+			errMsg := fmt.Sprintf("请求状态码异常,StatusCode:[%d]", code)
+			respBody, respErr := io.ReadAll(resp.Body)
+			if respErr != nil {
+				utils.FileLog.Error("读取body失败,err:%v", err)
+				err = errors.New(errMsg)
+				return
+			}
+			utils.FileLog.Error("请求错误应答,body:%s", string(respBody))
+			errMsg = fmt.Sprintf("%s,body:%s", errMsg, string(respBody))
+			err = errors.New(errMsg)
+			return
+		}
+	} else {
+		utils.FileLog.Error("未知的应答错误,获取第三方授权信息失败", err.Error())
+	}
+	return
+}
+func (hc *HttpClient) PostWithAuth(url string, data interface{}, token string) (resp *http.Response, err error) {
+	dataStr, err := json.Marshal(data)
+	if err != nil {
+		utils.FileLog.Error("请求data json序列化失败,err:" + err.Error())
+	}
+	body := io.NopCloser(strings.NewReader(string(dataStr)))
+	req, err := http.NewRequest(http.MethodPost, url, body)
+	req.Header.Set("Content-Type", "application/json")
+	req.Header.Set("Authorization", token)
+	if err != nil {
+		utils.FileLog.Error("创建POST请求失败: %v", err)
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	code := resp.StatusCode
+	if code != 200 {
+		utils.FileLog.Error("请求错误应答,状态码:%d", code)
+		errMsg := fmt.Sprintf("请求状态码异常,StatusCode:[%d]", code)
+		respBody, respErr := io.ReadAll(resp.Body)
+		if respErr != nil {
+			utils.FileLog.Error("读取body失败,err:%v", err)
+			err = errors.New(errMsg)
+			return
+		}
+		utils.FileLog.Error("请求错误应答,body:%s", string(respBody))
+		errMsg = fmt.Sprintf("%s,body:%s", errMsg, string(respBody))
+		err = errors.New(errMsg)
+		return
+	}
+	return
+}
+func (hc *HttpClient) Get(url string) (resp *http.Response, err error) {
+	req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil)
+	if err != nil {
+		utils.FileLog.Error("创建请求失败: %v", err)
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	return
+}
+
+func RegisterMiniFacade(name string, facade ChartCollect) {
+	if facade == nil {
+		panic("实例不存在,无法注册")
+	}
+	if _, ok := miniFacadeMap[name]; ok {
+		utils.FileLog.Error("请勿重复注册小程序插件:" + name)
+	}
+	miniFacadeMap[name] = facade
+}
+
+func init() {
+
+}

+ 16 - 0
global/global.go

@@ -0,0 +1,16 @@
+package global
+
+import (
+	_ "github.com/go-sql-driver/mysql"
+	"gorm.io/gorm"
+)
+
+var (
+	DbMap      map[string]*gorm.DB //数据库连接配置
+	DEFAULT_DB *gorm.DB            //默认数据库连接配置
+)
+
+func init() {
+	// 初始化数据库连接
+	InitDb()
+}

+ 167 - 0
global/initDb.go

@@ -0,0 +1,167 @@
+package global
+
+import (
+	"database/sql/driver"
+	_ "dm"
+	dm "dmgorm2"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+	"gorm.io/gorm/schema"
+	"io"
+	"log"
+	"os"
+	"strings"
+	"time"
+)
+
+var (
+	//需要钩子函数执行的数据库表
+	tableMap = map[string]int{
+		"base_from_mysteel_chemical_data": 1,
+		"future_good_edb_info":            1,
+	}
+)
+
+type LocalTime time.Time
+
+// InitDb
+// @Description: 数据库初始化
+func InitDb() {
+	dbMap := make(map[string]*gorm.DB)
+
+	//开启日志
+	logWriter := io.MultiWriter(utils.Binlog) //binlog日志,记录到文件中去
+	if utils.RunMode == `dev` {               // 测试环境,默认输出在控制台,不需要的话,可以注释if里面下面的这行
+		logWriter = io.MultiWriter(utils.Binlog, os.Stdout)
+	}
+	newLogger := logger.New(log.New(logWriter, "\r\n", log.LstdFlags), logger.Config{
+		SlowThreshold:             200 * time.Millisecond, //慢sql :200ms
+		LogLevel:                  logger.Info,            //记录的日志类型,info代表所有信息都记录
+		IgnoreRecordNotFoundError: true,                   //是否忽略找不到数据错误信息(只是日志记录记录成err还是普通的输出的区别,并不影响业务代码中的:找不到数据行error)
+		Colorful:                  false,                  //是否颜色输出
+	})
+
+	// 默认库
+	connectDb(utils.MYSQL_URL, utils.DbNameMaster, newLogger, dbMap, true)
+
+	// 手工数据库
+	connectDb(utils.MYSQL_URL_EDB, utils.DbNameManualIndex, newLogger, dbMap, false)
+	// 指标库
+	connectDb(utils.MYSQL_URL_DATA, utils.DbNameIndex, newLogger, dbMap, false)
+
+	// gorm前置处理
+	for _, db := range dbMap {
+		_ = db.Callback().Query().Before("gorm:query").Register("before_query", func(tx *gorm.DB) {
+			orgSql := tx.Statement.SQL.String()
+			if _, ok := tableMap[tx.Statement.Table]; ok && strings.Contains(strings.ToLower(orgSql), "select") {
+				newSql := utils.ReplaceDriverKeywords(utils.DbDriverName, orgSql)
+				tx.Statement.SQL.Reset()
+				tx.Statement.SQL.WriteString(newSql)
+			}
+		})
+		_ = db.Callback().Raw().Before("gorm:raw").Register("before_raw", func(tx *gorm.DB) {
+			orgSql := tx.Statement.SQL.String()
+			if _, ok := tableMap[tx.Statement.Table]; ok &&
+				(strings.Contains(strings.ToLower(orgSql), "delete") ||
+					strings.Contains(strings.ToLower(orgSql), "update") ||
+					strings.Contains(strings.ToLower(orgSql), "insert")) {
+				newSql := utils.ReplaceDriverKeywords(utils.DbDriverName, orgSql)
+				tx.Statement.SQL.Reset()
+				tx.Statement.SQL.WriteString(newSql)
+			}
+		})
+	}
+
+	//全局赋值数据库链接
+	DbMap = dbMap
+
+}
+
+// connectDb
+// @Description: 达梦数据库连接
+// @param dsn
+// @param aliasName
+// @param newLogger
+// @param dbMap
+// @param isDefault
+func connectDb(dsn, aliasName string, newLogger logger.Interface, dbMap map[string]*gorm.DB, isDefault bool) {
+	//fmt.Println("dsn:", dsn, "  ==  ;aliasName:", aliasName)
+	if dsn == `` {
+		return
+	}
+
+	var dialector gorm.Dialector
+	switch utils.DbDriverName {
+	case utils.DbDriverByMysql:
+		if !strings.Contains(dsn, `parseTime`) {
+			dsn += `&parseTime=true`
+		}
+		dialector = mysql.Open(dsn)
+	case utils.DbDriverByDm:
+		dialector = dm.Open(dsn)
+	default:
+		panic(fmt.Errorf("数据库 链接异常,错误的数据库类型,数据库:%s", utils.DbDriverName))
+	}
+	db, err := gorm.Open(dialector, &gorm.Config{
+		Logger: newLogger,
+		NamingStrategy: schema.NamingStrategy{
+			SingularTable: true, // 表示使用单数表名,启用该选项后,GORM 将不会对表名进行复数化处理
+		},
+	})
+	if err != nil {
+		//global.LOG.Errorf("mysql 启动异常,数据库:default;Err:", err)
+		panic(fmt.Errorf("数据库 链接异常,数据库:%s;Err:%s", aliasName, err))
+	}
+	//创建连接池
+	sqlDB, err := db.DB()
+	if err != nil {
+		//global.LOG.Errorf("达梦 创建连接池失败,数据库:default;Err:", err)
+		panic(fmt.Errorf("数据库 创建连接池失败,数据库:%s;Err:%s", aliasName, err))
+	}
+
+	dbMap[aliasName] = db
+
+	//默认数据库连接
+	if isDefault {
+		DEFAULT_DB = db
+	}
+
+	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
+	sqlDB.SetMaxIdleConns(50)
+
+	// SetMaxOpenConns 设置打开数据库连接的最大数量。
+	sqlDB.SetMaxOpenConns(100)
+
+	// SetConnMaxLifetime 设置了连接可复用的最大时间。
+	sqlDB.SetConnMaxLifetime(10 * time.Minute)
+
+}
+
+func (t *LocalTime) MarshalJSON() ([]byte, error) {
+	tTime := time.Time(*t)
+	if tTime.IsZero() {
+		return []byte("\"\""), nil
+	}
+	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
+}
+
+func (t LocalTime) Value() (driver.Value, error) {
+	var zeroTime time.Time
+	tlt := time.Time(t)
+	//判断给定时间是否和默认零时间的时间戳相同
+	if tlt.UnixNano() == zeroTime.UnixNano() {
+		return nil, nil
+	}
+	return tlt, nil
+}
+
+func (t *LocalTime) Scan(v interface{}) error {
+	if value, ok := v.(time.Time); ok {
+		*t = LocalTime(value)
+		return nil
+	}
+	return fmt.Errorf("can not convert %v to timestamp", v)
+}

+ 4 - 0
go.mod

@@ -16,6 +16,8 @@ require (
 	github.com/yidane/formula v0.0.0-20220322063702-c9da84ba3476
 	go.mongodb.org/mongo-driver v1.15.0
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
+	gorm.io/driver/mysql v1.5.7
+	gorm.io/gorm v1.25.12
 )
 
 require (
@@ -35,6 +37,8 @@ require (
 	github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect
 	github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/leodido/go-urn v1.2.0 // indirect

+ 9 - 0
go.sum

@@ -109,6 +109,10 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
@@ -342,3 +346,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
+gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
+gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
+gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=

+ 7 - 3
main.go

@@ -2,16 +2,17 @@ package main
 
 import (
 	"eta/eta_chart_lib/controllers"
+	_ "eta/eta_chart_lib/facade/instance"
+	"eta/eta_chart_lib/models"
 	_ "eta/eta_chart_lib/routers"
 	"eta/eta_chart_lib/services/alarm_msg"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"runtime"
-	"time"
-
 	"github.com/beego/beego/v2/adapter/logs"
 	beego "github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/server/web/context"
+	"runtime"
+	"time"
 )
 
 func main() {
@@ -20,6 +21,9 @@ func main() {
 		beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
 	}
 
+	// 初始化表数据入库
+	models.AfterInitTable()
+
 	// 异常处理
 	beego.ErrorController(&controllers.ErrorController{})
 

+ 1 - 1
models/base.go

@@ -27,7 +27,7 @@ type BaseResponseResult struct {
 }
 
 func (r *BaseResponse) Init() *BaseResponse {
-	return &BaseResponse{Ret: 403,IsSendEmail: true}
+	return &BaseResponse{Ret: 403, IsSendEmail: true}
 }
 
 type BaseRequest struct {

+ 28 - 9
models/business_conf.go

@@ -1,17 +1,18 @@
 package models
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"html"
 	"time"
 )
 
 const (
-	BusinessConfCompanyName      = "CompanyName"
-	BusinessConfCompanyWatermark = "CompanyWatermark"
-	BusinessConfWatermarkChart   = "WatermarkChart"
+	BusinessConfCompanyName        = "CompanyName"
+	BusinessConfCompanyWatermark   = "CompanyWatermark"
+	BusinessConfWatermarkChart     = "WatermarkChart"
+	BusinessConfIsOpenChartExpired = "IsOpenChartExpired" // 图表是否鉴权
 )
 
 // FromSceneMap 数据源名称与数据源ID的对应关系
@@ -25,7 +26,8 @@ var FromSceneMap = map[int]string{
 
 // BusinessConf 商户配置表
 type BusinessConf struct {
-	Id         int    `orm:"column(id);pk"`
+	//Id         int    `orm:"column(id);pk"`
+	Id         int    `gorm:"column:id;primaryKey"`
 	ConfKey    string `description:"配置Key"`
 	ConfVal    string `description:"配置值"`
 	ValType    int    `description:"1-字符串;2-数值;3-字符串数组;4-富文本;"`
@@ -39,9 +41,8 @@ func GetBusinessConf() (list map[string]string, err error) {
 	list = make(map[string]string)
 
 	var items []*BusinessConf
-	o := orm.NewOrm()
 	sql := `SELECT * FROM business_conf`
-	_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	if err != nil {
 		return
 	}
@@ -57,9 +58,27 @@ func GetBusinessConf() (list map[string]string, err error) {
 }
 
 func GetBusinessConfByKey(key string) (item *BusinessConf, err error) {
-	o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT * FROM business_conf WHERE conf_key = ? LIMIT 1`)
-	err = o.Raw(sql, key).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, key).First(&item).Error
+	return
+}
+
+func GetBusinessConfByKeys(key []string) (list map[string]string, err error) {
+	list = make(map[string]string)
+	if len(key) == 0 {
+		return
+	}
+	var items []*BusinessConf
+	sql := fmt.Sprintf(`SELECT * FROM business_conf WHERE conf_key IN (?) `)
+	err = global.DEFAULT_DB.Raw(sql, key).Find(&items).Error
+
+	for _, v := range items {
+		if v.ValType == 4 {
+			list[v.ConfKey] = html.UnescapeString(v.ConfVal)
+			continue
+		}
+		list[v.ConfKey] = v.ConfVal
+	}
 	return
 }
 

+ 100 - 43
models/chart.go

@@ -2,20 +2,22 @@ package models
 
 import (
 	"errors"
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/models/mgo"
 	"eta/eta_chart_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"time"
 
-	"github.com/beego/beego/v2/client/orm"
 	"go.mongodb.org/mongo-driver/bson"
 
 	"github.com/nosixtools/solarlunar"
 )
 
 type ChartInfo struct {
-	ChartInfoId       int       `json:"-" orm:"column(chart_info_id);pk"`
+	//ChartInfoId       int       `json:"-" orm:"column(chart_info_id);pk"`
+	ChartInfoId       int       `json:"-" gorm:"column:chart_info_id;primaryKey"`
 	ChartName         string    `description:"来源名称"`
 	ChartNameEn       string    `description:"英文图表名称"`
 	ChartClassifyId   int       `json:"-" description:"图表分类id"`
@@ -47,7 +49,7 @@ type ChartInfo struct {
 	Source            int       `description:"1:ETA图库;2:商品价格曲线"`
 	Unit              string    `description:"中文单位名称"`
 	UnitEn            string    `description:"英文单位名称"`
-	ExtraConfig       string    `description:"图表额外配置,json数据" json:"-"`
+	ExtraConfig       string    `description:"图表额外配置,json数据"`
 	ChartSource       string    `description:"图表来源str"`
 	ChartSourceEn     string    `description:"图表来源(英文)"`
 	SeasonExtraConfig string    `description:"季节性图表中的配置,json数据"`
@@ -60,44 +62,59 @@ type ChartInfo struct {
 	MarkersAreas      string    `description:"标识区"`
 }
 
+func (m *ChartInfo) ConvertDate() {
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.SeasonStartDate = utils.GormDateStrToDateStr(m.SeasonStartDate)
+	m.SeasonEndDate = utils.GormDateStrToDateStr(m.SeasonEndDate)
+
+	return
+}
+
 func GetChartInfoByUniqueCode(uniqueCode string) (item *ChartInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM chart_info WHERE unique_code=? `
-	err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	//err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, uniqueCode).First(&item).Error
+	if err != nil {
+		item.ConvertDate()
+	}
+
 	return
 }
 
 type ChartEdbInfoMapping struct {
-	EdbInfoId         int     `description:"指标id"`
-	SourceName        string  `description:"来源名称"`
-	Source            int     `description:"来源id"`
-	EdbCode           string  `description:"指标编码"`
-	EdbName           string  `description:"指标名称"`
-	EdbAliasName      string  `description:"指标名称(别名)"`
-	EdbAliasNameEn    string  `description:"英文指标名称(别名)"`
-	EdbNameEn         string  `description:"英文指标名称"`
-	Frequency         string  `description:"频率"`
-	FrequencyEn       string  `description:"英文频率"`
-	Unit              string  `description:"单位"`
-	UnitEn            string  `description:"英文单位"`
-	StartDate         string  `description:"起始日期"`
-	EndDate           string  `description:"终止日期"`
-	ModifyTime        string  `description:"指标最后更新时间"`
-	ChartEdbMappingId int     `description:"图表指标id" json:"-"`
-	ChartInfoId       int     `description:"图表id"`
-	MaxData           float64 `description:"上限"`
-	MinData           float64 `description:"下限"`
-	IsOrder           bool    `description:"true:正序,false:逆序"`
-	IsAxis            int     `description:"1:左轴,0:右轴"`
-	EdbInfoType       int     `description:"1:标准指标,0:领先指标"`
-	EdbType           int     `description:"指标类型:1:基础指标,2:计算指标"`
-	LeadValue         int     `description:"领先值"`
-	LeadUnit          string  `description:"领先单位"`
-	LeadUnitEn        string  `description:"领先英文单位"`
-	ChartStyle        string  `description:"图表类型"`
-	ChartColor        string  `description:"颜色"`
-	ChartWidth        float64 `description:"线条大小"`
-	DataList          interface{}
+	EdbInfoId         int         `description:"指标id"`
+	SourceName        string      `description:"来源名称"`
+	Source            int         `description:"来源id"`
+	EdbCode           string      `description:"指标编码"`
+	EdbName           string      `description:"指标名称"`
+	EdbAliasName      string      `description:"指标名称(别名)"`
+	EdbAliasNameEn    string      `description:"英文指标名称(别名)"`
+	EdbNameEn         string      `description:"英文指标名称"`
+	Frequency         string      `description:"频率"`
+	FrequencyEn       string      `description:"英文频率"`
+	Unit              string      `description:"单位"`
+	UnitEn            string      `description:"英文单位"`
+	StartDate         string      `description:"起始日期"`
+	EndDate           string      `description:"终止日期"`
+	ModifyTime        string      `description:"指标最后更新时间"`
+	ChartEdbMappingId int         `description:"图表指标id" json:"-"`
+	ChartInfoId       int         `description:"图表id"`
+	MaxData           float64     `description:"上限"`
+	MinData           float64     `description:"下限"`
+	IsOrder           bool        `description:"true:正序,false:逆序"`
+	IsAxis            int         `description:"1:左轴,0:右轴"`
+	EdbInfoType       int         `description:"1:标准指标,0:领先指标"`
+	EdbType           int         `description:"指标类型:1:基础指标,2:计算指标"`
+	LeadValue         int         `description:"领先值"`
+	LeadUnit          string      `description:"领先单位"`
+	LeadUnitEn        string      `description:"领先英文单位"`
+	ChartStyle        string      `description:"图表类型"`
+	ChartColor        string      `description:"颜色"`
+	ChartWidth        float64     `description:"线条大小"`
+	ChartScale        float64     `description:"参考刻度线"`
+	DataList          interface{} `gorm:"-"`
 
 	EdbInfoCategoryType int     `description:"0:普通指标,1:预测指标"`
 	PredictChartColor   string  `description:"预测数据的颜色"`
@@ -119,18 +136,40 @@ type ChartEdbInfoMapping struct {
 	ConvertValue        float64 `description:"数据转换值"`
 	ConvertUnit         string  `description:"数据转换单位"`
 	ConvertEnUnit       string  `description:"数据转换单位"`
+	ClassifyId          int     `description:"分类id"`
+	IsJoinPermission    int     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+}
+
+func (m *ChartEdbInfoMapping) AfterFind(db *gorm.DB) (err error) {
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.LatestDate = utils.GormDateStrToDateStr(m.LatestDate)
+	m.MoveLatestDate = utils.GormDateStrToDateStr(m.MoveLatestDate)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+
+	return
+}
+
+func (m *ChartEdbInfoMapping) ConvertDate() {
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.LatestDate = utils.GormDateStrToDateStr(m.LatestDate)
+	m.MoveLatestDate = utils.GormDateStrToDateStr(m.MoveLatestDate)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+
+	return
 }
 
 func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
-	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source,a.edb_alias_name`
+	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source,a.edb_alias_name,a.chart_scale`
 	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.edb_type,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.sub_source,
 a.is_convert, a.convert_type, a.convert_value, a.convert_unit, a.convert_en_unit 
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE chart_info_id=? 
              ORDER BY chart_edb_mapping_id ASC `
-	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).Find(&list).Error
 	return
 }
 
@@ -139,7 +178,13 @@ type EdbDataList struct {
 	EdbInfoId     int     `json:"-" description:"指标ID"`
 	DataTime      string  `description:"数据日期"`
 	DataTimestamp int64   `description:"数据日期"`
-	Value         float64 `description:"数据值"`
+	Value         float64 `description:"数据值" gorm:"column:value"`
+}
+
+func (m *EdbDataList) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 // GetEdbDataList 获取指标的数据(日期正序返回)
@@ -189,8 +234,14 @@ func getEdbDataListByMysql(source, subSource, edbInfoId int, startDate, endDate
 	}
 	sql += ` ORDER BY data_time ASC  `
 	sql = fmt.Sprintf(sql, tableName)
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, edbInfoId, pars).QueryRows(&list)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Raw(sql, edbInfoId, pars).QueryRows(&list)
+	newPars := utils.ForwardPars(pars, edbInfoId)
+	pars = append(pars, edbInfoId)
+	sql = utils.ReplaceDriverKeywords("", sql)
+
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, newPars...).Find(&list).Error
+
 	return
 }
 
@@ -286,6 +337,7 @@ type ChartInfoDetailResp struct {
 	DataResp             interface{}      `description:"图表数据,根据图的类型而定的,没有确定的数据格式"`
 	WaterMark            string           `description:"水印"`
 	IsCollect            bool             `description:"是否收藏"`
+	IsAuth               bool             `description:"是否授权"`
 }
 
 // XData 商品价格曲线的的x轴数据
@@ -944,9 +996,14 @@ type ChartTimeCombineDataResp struct {
 }
 
 func GetChartInfoById(chartInfoId int) (item *ChartInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM chart_info WHERE chart_info_id=? `
-	err = o.Raw(sql, chartInfoId).QueryRow(&item)
+	//err = o.Raw(sql, chartInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).First(&item).Error
+	if err != nil {
+		item.ConvertDate()
+	}
+
 	return
 }
 

+ 41 - 15
models/chart_edb_mapping.go

@@ -1,13 +1,13 @@
 package models
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 )
 
 // GetEtaEdbChartEdbMapping       商品曲线图查询对应的普通指标
 func GetEtaEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 
 	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
 	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type
@@ -15,13 +15,19 @@ func GetEtaEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err e
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
-	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).QueryRow(&item)
+	//err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).First(&item).Error
+	if err != nil {
+		return
+	}
+	item.ConvertDate()
+
 	return
 }
 
 // GetEtaEdbChartEdbMappingList       商品曲线图查询对应的普通指标
 func GetEtaEdbChartEdbMappingList(chartInfoId int) (items []*ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
 
 	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.classify_id,b.is_join_permission
@@ -29,43 +35,57 @@ func GetEtaEdbChartEdbMappingList(chartInfoId int) (items []*ChartEdbInfoMapping
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
-	_, err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).QueryRows(&items)
+	//_, err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).Find(&items).Error
 	return
 }
 
 // GetFutureGoodEdbChartEdbMapping       商品曲线图查询对应的商品指标
 func GetFutureGoodEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
 	sql := ` SELECT ` + aField + `,b.future_good_edb_info_id,b.future_good_edb_code as edb_code,b.future_good_edb_name as edb_name,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value
              FROM chart_edb_mapping AS a
 			 INNER JOIN future_good_edb_info AS b ON a.edb_info_id=b.future_good_edb_info_id
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
-	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).QueryRow(&item)
+	//err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).First(&item).Error
+	if err != nil {
+		return
+	}
+	item.ConvertDate()
+
 	return
 }
 
 // GetFutureGoodEdbChartEdbMappingList       商品曲线图查询对应的商品指标
 func GetFutureGoodEdbChartEdbMappingList(chartInfoId int) (items []*ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
 	sql := ` SELECT ` + aField + `,b.future_good_edb_info_id,b.future_good_edb_code as edb_code,b.future_good_edb_name as edb_name,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value
              FROM chart_edb_mapping AS a
 			 INNER JOIN future_good_edb_info AS b ON a.edb_info_id=b.future_good_edb_info_id
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
-	_, err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).QueryRows(&items)
+	//_, err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).Find(&items).Error
 	return
 }
 
 // GetChartEdbMappingByEdbInfoId 根据指标id获取edb_mapping
 func GetChartEdbMappingByEdbInfoId(edbInfoId int) (item *ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT edb_info_id,source_name,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value
              FROM edb_info
 			 WHERE edb_info_id = ? limit 1`
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).First(&item).Error
+	if err != nil {
+		return
+	}
+	item.ConvertDate()
+
 	return
 }
 
@@ -75,12 +95,18 @@ func GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (list []*ChartEdbInf
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT edb_info_id,source_name,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value,edb_type
              FROM edb_info
-			 WHERE edb_info_id IN(` + utils.GetOrmInReplace(num) + `)
-			ORDER BY FIELD(edb_info_id,` + utils.GetOrmInReplace(num) + `)
+			 WHERE edb_info_id IN ?
+			ORDER BY FIELD(edb_info_id,` + utils.GetNumOrmInReplace(num) + `)
               `
-	_, err = o.Raw(sql, edbIdList, edbIdList).QueryRows(&list)
+	//_, err = o.Raw(sql, edbIdList, edbIdList).QueryRows(&list)
+	var pars []interface{}
+	pars = append(pars, edbIdList)
+	for i := 0; i < num; i++ {
+		pars = append(pars, edbIdList[i])
+	}
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
 	return
 }

+ 118 - 0
models/chart_info_range_analysis.go

@@ -0,0 +1,118 @@
+package models
+
+import (
+	"time"
+)
+
+type ChartRangeAnalysisExtraConf struct {
+	EdbInfoMode           int                                `description:"指标模式 0: 单指标,1: 多指标"`
+	DateRangeType         int                                `description:"区间划分类型 0:智能划分,1:手工划分,2:跨年划分"`
+	AutoDateConf          ChartRangeAnalysisAutoDateConf     `description:"智能划分时间区间配置"`
+	ManualDateConf        []ChartRangeAnalysisManualDateConf `description:"手工划分时间区间配置"`
+	YearDateConf          ChartRangeAnalysisYearDateConf     `description:"跨年划分时间区间配置"`
+	CalculateType         int                                `description:"计算类型 0: 区间均值,1: 区间累计值,2:区间涨幅,3:区间年化增长率,4:区间最大值,5:区间最小值"`
+	UnNormalDataDealType  int                                `description:"异常值处理配置 0:不处理,1:剔除,2替换"`
+	UnNormalDataConf      ChartRangeAnalysisDeleteDataConf
+	DataConvertType       int                               `description:"数据转换类型 0不转, 1乘 2除 3对数"`
+	DataConvertConf       ChartRangeAnalysisDataConvertConf `description:"数据转换详情"`
+	SeriesName            string                            `description:"指标系列名称"`
+	EdbInfoType           int                               `description:"指标类型:0普通指标,1预测指标"`
+	MultipleGraphConfigId int                               `description:"配置ID"`
+}
+
+type ChartRangeAnalysisAutoDateChangeConf struct {
+	BaseDateType int `description:"基准日期类型:0指标日期,1系统日期"`
+	MoveForward  int `description:"前移的期数"`
+	DateChange   []*EdbDataDateChangeConf
+}
+
+type EdbDataDateChangeConf struct {
+	Year         int
+	Month        int
+	Day          int
+	Frequency    string `description:"频度变换"`
+	FrequencyDay string `description:"频度的固定日期"`
+	ChangeType   int    `description:"日期变换类型1日期位移,2指定频率"`
+}
+
+type ChartRangeAnalysisDeleteDataConf struct {
+	Formula      string  `description:"比较符号:=、>、<、>=、<="`
+	Value        float64 `description:"比较的值"`
+	ReplaceValue float64 `description:"替换的值"`
+}
+
+type ChartRangeAnalysisDataConvertConf struct {
+	Value  float64 `description:"数据转换值"`
+	Unit   string  `description:"数据转换单位"`
+	EnUnit string  `description:"数据转换单位"`
+}
+
+type ChartRangeAnalysisManualDateConf struct { //手工划分
+	StartDate string `description:"开始日期"`
+	EndDate   string `description:"结束日期"`
+}
+
+type ChartRangeAnalysisAutoDateConf struct { //智能划分
+	IsAutoStartDate int                                  `description:"起始日期是否是动态设置:0固定,1动态"`
+	StartDate       string                               `description:"固定模式下的起始日期"`
+	EndDate         string                               `description:"固定模式下的截止日期"`
+	IsAutoEndDate   int                                  `description:"截止日期是否是动态设置:0固定,1动态"`
+	StartDateConf   ChartRangeAnalysisAutoDateChangeConf `description:"动态起始日期配置"`
+	EndDateConf     ChartRangeAnalysisAutoDateChangeConf `description:"动态截止日期配置"`
+}
+
+type ChartRangeAnalysisYearDateConf struct {
+	StartDay string `description:"开始日"`
+	EndDay   string `description:"结束日"`
+}
+
+type ChartRangeAnalysisManualDateConfList []ChartRangeAnalysisManualDateConf
+
+func (a ChartRangeAnalysisManualDateConfList) Len() int      { return len(a) }
+func (a ChartRangeAnalysisManualDateConfList) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a ChartRangeAnalysisManualDateConfList) Less(i, j int) bool {
+	return a[i].StartDate < a[j].StartDate
+}
+
+type ChartRangeAnalysisDataResp struct { //图表详情返回值
+	*ChartRangeAnalysisExtraConf
+	SeriesId     int `description:"指标系列ID"`
+	ConfigEdbNum int `description:"生成的指标数"`
+}
+
+type ChartRangeAnalysisDateDataItem struct {
+	StartDate time.Time
+	EndDate   time.Time
+	DataList  []*EdbDataList
+}
+
+// ChartRangeAnalysisConfigEdbResp 指标列表
+type ChartRangeAnalysisConfigEdbResp struct {
+	EdbInfoList []*ChartRangeAnalysisConfigEdbItem `description:"指标列表"`
+}
+
+type ChartRangeAnalysisConfigEdbItem struct {
+	EdbInfoId     int    `description:"指标id"`
+	EdbName       string `description:"指标名称"`
+	EdbNameEn     string `description:"指标名称"`
+	Frequency     string `description:"频度"`
+	Unit          string `description:"单位"`
+	UnitEn        string `description:"单位"`
+	ClassifyId    int    `description:"分类id"`
+	FromEdbInfoId int    `description:"计算来源指标id"`
+	EdbTypeInfo   int    `description:"指标类型,0普通指标,1预测指标"`
+}
+
+type SortEdbDataList []*EdbDataList
+
+func (m SortEdbDataList) Len() int {
+	return len(m)
+}
+
+func (m SortEdbDataList) Less(i, j int) bool {
+	return m[i].DataTime > m[j].DataTime
+}
+
+func (m SortEdbDataList) Swap(i, j int) {
+	m[i], m[j] = m[j], m[i]
+}

+ 44 - 24
models/chart_series.go

@@ -2,14 +2,15 @@ package models
 
 import (
 	"encoding/json"
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 type ChartSeries struct {
-	ChartSeriesId int       `orm:"column(chart_series_id);pk"`
+	//ChartSeriesId int       `orm:"column(chart_series_id);pk"`
+	ChartSeriesId int       `gorm:"column:chart_series_id;primaryKey"`
 	SeriesName    string    `description:"系列名称"`
 	SeriesNameEn  string    `description:"系列英文名称"`
 	ChartInfoId   int       `description:"图表ID"`
@@ -31,16 +32,18 @@ func (c *ChartSeries) TableName() string {
 }
 
 func GetChartSeriesByChartInfoId(chartInfoId int) (items []*ChartSeries, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := "SELECT * FROM chart_series WHERE chart_info_id = ?"
-	_, err = o.Raw(sql, chartInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, chartInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).Find(&items).Error
 	return
 }
 
 // EditChartSeriesAndEdbMapping
 func EditChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
+	//o := orm.NewOrmUsingDB("data")
+	//to, err := o.Begin()
+	to := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -72,7 +75,8 @@ func EditChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err e
 	}
 
 	// 删除所有的指标映射
-	_, err = o.Raw("DELETE FROM chart_series_edb_mapping WHERE chart_info_id = ?", chartInfoId).Exec()
+	//_, err = o.Raw("DELETE FROM chart_series_edb_mapping WHERE chart_info_id = ?", chartInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec("DELETE FROM chart_series_edb_mapping WHERE chart_info_id = ?", chartInfoId).Error
 	if err != nil {
 		return
 	}
@@ -102,16 +106,20 @@ func EditChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err e
 			}
 			//新增
 			tmp.CreateTime = time.Now()
-			seriesIdTmp, e := to.Insert(tmp)
+			//seriesIdTmp, e := to.Insert(tmp)
+			e := to.Create(&tmp).Error
 			if e != nil {
 				err = fmt.Errorf("AddChartSeries Err:" + e.Error())
 				return
 			}
-			seriesId = int(seriesIdTmp)
+			//seriesId = int(seriesIdTmp)
+			seriesId = tmp.ChartSeriesId
 		} else {
 			//编辑
 			delete(seriesDeleteMap, v.ChartSeriesId)
-			_, e := to.Update(tmp)
+			//_, e := to.Update(tmp)
+			//e := to.Model(tmp).Select("*").Updates(tmp).Error
+			e := to.Save(&tmp).Error
 			if e != nil {
 				err = fmt.Errorf("UpdateChartSeries Err:" + e.Error())
 				return
@@ -141,7 +149,8 @@ func EditChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err e
 			addSeriesEdbList = append(addSeriesEdbList, edbTmp)
 		}
 		if len(addSeriesEdbList) > 0 {
-			_, err = to.InsertMulti(len(addSeriesEdbList), addSeriesEdbList)
+			//_, err = to.InsertMulti(len(addSeriesEdbList), addSeriesEdbList)
+			err = to.CreateInBatches(addSeriesEdbList, len(addSeriesEdbList)).Error
 			if err != nil {
 				err = fmt.Errorf("AddChartSeries Err:" + err.Error())
 				return
@@ -154,14 +163,18 @@ func EditChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err e
 		seriesIds = append(seriesIds, id)
 	}
 	if len(seriesIds) > 0 {
-		sql := `DELETE FROM chart_series WHERE chart_series_id IN (` + utils.GetOrmInReplace(len(seriesIds)) + `) and chart_info_id=?`
-		_, err = to.Raw(sql, seriesIds, chartInfoId).Exec()
+		//sql := `DELETE FROM chart_series WHERE chart_series_id IN (` + utils.GetOrmInReplace(len(seriesIds)) + `) and chart_info_id=?`
+		//_, err = to.Raw(sql, seriesIds, chartInfoId).Exec()
+		sql := `DELETE FROM chart_series WHERE chart_series_id IN ? and chart_info_id=?`
+		err = to.Exec(sql, seriesIds, chartInfoId).Error
 		if err != nil {
 			err = fmt.Errorf("删除系列失败 Err:" + err.Error())
 			return
 		}
-		sql = `DELETE FROM chart_series_edb_mapping WHERE chart_series_id IN (` + utils.GetOrmInReplace(len(seriesIds)) + `) and chart_info_id=?`
-		_, err = to.Raw(sql, seriesIds, chartInfoId).Exec()
+		//sql = `DELETE FROM chart_series_edb_mapping WHERE chart_series_id IN (` + utils.GetOrmInReplace(len(seriesIds)) + `) and chart_info_id=?`
+		//_, err = to.Raw(sql, seriesIds, chartInfoId).Exec()
+		sql = `DELETE FROM chart_series_edb_mapping WHERE chart_series_id IN ? and chart_info_id=?`
+		err = to.Exec(sql, seriesIds, chartInfoId).Error
 		if err != nil {
 			err = fmt.Errorf("删除系列指标 Err:" + err.Error())
 			return
@@ -172,8 +185,9 @@ func EditChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err e
 }
 
 func AddChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
+	//o := orm.NewOrmUsingDB("data")
+	//to, err := o.Begin()
+	to := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -209,12 +223,14 @@ func AddChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err er
 			CreateTime:   time.Now(),
 			ModifyTime:   time.Now(),
 		}
-		seriesIdTmp, e := to.Insert(tmp)
+		//seriesIdTmp, e := to.Insert(tmp)
+		e := to.Create(&tmp).Error
 		if e != nil {
 			err = fmt.Errorf("AddChartSeries Err:" + e.Error())
 			return
 		}
-		seriesId := int(seriesIdTmp)
+		//seriesId := int(seriesIdTmp)
+		seriesId := tmp.ChartSeriesId
 		addSeriesEdbList := make([]*ChartSeriesEdbMapping, 0)
 		for _, edbItem := range v.EdbInfoList {
 			dateConfStrByte, e := json.Marshal(edbItem.DateConf)
@@ -238,7 +254,8 @@ func AddChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err er
 			addSeriesEdbList = append(addSeriesEdbList, edbTmp)
 		}
 		if len(addSeriesEdbList) > 0 {
-			_, e = to.InsertMulti(len(addSeriesEdbList), addSeriesEdbList)
+			//_, e = to.InsertMulti(len(addSeriesEdbList), addSeriesEdbList)
+			e = to.CreateInBatches(addSeriesEdbList, len(addSeriesEdbList)).Error
 			if e != nil {
 				err = fmt.Errorf("AddChartSeries Err:" + e.Error())
 				return
@@ -249,8 +266,9 @@ func AddChartSeriesAndEdbMapping(extraConfigStr string, chartInfoId int) (err er
 }
 
 func DeleteChartSeriesAndEdbMapping(chartInfoId int) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
+	//o := orm.NewOrmUsingDB("data")
+	//to, err := o.Begin()
+	to := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -263,12 +281,14 @@ func DeleteChartSeriesAndEdbMapping(chartInfoId int) (err error) {
 	}()
 
 	sql := ` DELETE FROM chart_series WHERE chart_info_id=? `
-	_, err = to.Raw(sql, chartInfoId).Exec()
+	//_, err = to.Raw(sql, chartInfoId).Exec()
+	err = to.Exec(sql, chartInfoId).Error
 	if err != nil {
 		return
 	}
 	sql = ` DELETE FROM  chart_series_edb_mapping WHERE chart_info_id=? `
-	_, err = to.Raw(sql, chartInfoId).Exec()
+	//_, err = to.Raw(sql, chartInfoId).Exec()
+	err = to.Exec(sql, chartInfoId).Error
 	return
 }
 

+ 7 - 4
models/chart_series_edb_mapping.go

@@ -1,12 +1,14 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 type ChartSeriesEdbMapping struct {
-	ChartSeriesEdbMappingId int       `orm:"column(chart_series_edb_mapping_id);pk"`
+	//ChartSeriesEdbMappingId int       `orm:"column(chart_series_edb_mapping_id);pk"`
+	ChartSeriesEdbMappingId int       `gorm:"column:chart_series_edb_mapping_id;primaryKey"`
 	ChartSeriesId           int       `description:"系列ID"`
 	ChartInfoId             int       `description:"图表ID"`
 	EdbInfoId               int       `description:"指标id"`
@@ -22,8 +24,9 @@ func (c *ChartSeriesEdbMapping) TableName() string {
 }
 
 func GetChartSeriesEdbByChartInfoId(chartInfoId int) (items []*ChartSeriesEdbMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := "SELECT * FROM chart_series_edb_mapping WHERE chart_info_id = ?"
-	_, err = o.Raw(sql, chartInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, chartInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).Find(&items).Error
 	return
 }

+ 63 - 42
models/data_manage/chart_info.go

@@ -1,59 +1,80 @@
 package data_manage
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
+	"gorm.io/gorm"
 )
 
 type ChartEdbInfoMapping struct {
-	EdbInfoId           int     `description:"指标id"`
-	SourceName          string  `description:"来源名称"`
-	Source              int     `description:"来源id"`
-	EdbCode             string  `description:"指标编码"`
-	EdbName             string  `description:"指标名称"`
-	EdbAliasName        string  `description:"指标名称(别名)"`
-	EdbNameEn           string  `description:"英文指标名称"`
-	EdbAliasNameEn      string  `description:"英文指标名称(别名)"`
-	EdbType             int     `description:"指标类型:1:基础指标,2:计算指标"`
-	Frequency           string  `description:"频率"`
-	FrequencyEn         string  `description:"英文频率"`
-	Unit                string  `description:"单位"`
-	UnitEn              string  `description:"英文单位"`
-	StartDate           string  `description:"起始日期"`
-	EndDate             string  `description:"终止日期"`
-	ModifyTime          string  `description:"指标最后更新时间"`
-	ChartEdbMappingId   int     `description:"图表指标id"`
-	ChartInfoId         int     `description:"图表id"`
-	MaxData             float64 `description:"上限"`
-	MinData             float64 `description:"下限"`
-	IsOrder             bool    `description:"true:正序,false:逆序"`
-	IsAxis              int     `description:"1:左轴,0:右轴"`
-	EdbInfoType         int     `description:"1:标准指标,0:领先指标"`
-	EdbInfoCategoryType int     `description:"0:普通指标,1:预测指标"`
-	LeadValue           int     `description:"领先值"`
-	LeadUnit            string  `description:"领先单位"`
-	LeadUnitEn          string  `description:"领先英文单位"`
-	ChartStyle          string  `description:"图表类型"`
-	ChartColor          string  `description:"颜色"`
-	PredictChartColor   string  `description:"预测数据的颜色"`
-	ChartWidth          float64 `description:"线条大小"`
-	ChartType           int     `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图"`
-	LatestDate          string  `description:"数据最新日期"`
-	LatestValue         float64 `description:"数据最新值"`
-	UniqueCode          string  `description:"指标唯一编码"`
-	MinValue            float64 `json:"-" description:"最小值"`
-	MaxValue            float64 `json:"-" description:"最大值"`
-	DataList            interface{}
-	IsNullData          bool `json:"-" description:"是否空数据"`
+	EdbInfoId           int         `description:"指标id"`
+	SourceName          string      `description:"来源名称"`
+	Source              int         `description:"来源id"`
+	EdbCode             string      `description:"指标编码"`
+	EdbName             string      `description:"指标名称"`
+	EdbAliasName        string      `description:"指标名称(别名)"`
+	EdbNameEn           string      `description:"英文指标名称"`
+	EdbAliasNameEn      string      `description:"英文指标名称(别名)"`
+	EdbType             int         `description:"指标类型:1:基础指标,2:计算指标"`
+	Frequency           string      `description:"频率"`
+	FrequencyEn         string      `description:"英文频率"`
+	Unit                string      `description:"单位"`
+	UnitEn              string      `description:"英文单位"`
+	StartDate           string      `description:"起始日期"`
+	EndDate             string      `description:"终止日期"`
+	ModifyTime          string      `description:"指标最后更新时间"`
+	ChartEdbMappingId   int         `description:"图表指标id"`
+	ChartInfoId         int         `description:"图表id"`
+	MaxData             float64     `description:"上限"`
+	MinData             float64     `description:"下限"`
+	IsOrder             bool        `description:"true:正序,false:逆序"`
+	IsAxis              int         `description:"1:左轴,0:右轴"`
+	EdbInfoType         int         `description:"1:标准指标,0:领先指标"`
+	EdbInfoCategoryType int         `description:"0:普通指标,1:预测指标"`
+	LeadValue           int         `description:"领先值"`
+	LeadUnit            string      `description:"领先单位"`
+	LeadUnitEn          string      `description:"领先英文单位"`
+	ChartStyle          string      `description:"图表类型"`
+	ChartColor          string      `description:"颜色"`
+	PredictChartColor   string      `description:"预测数据的颜色"`
+	ChartWidth          float64     `description:"线条大小"`
+	ChartType           int         `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图"`
+	LatestDate          string      `description:"数据最新日期"`
+	LatestValue         float64     `description:"数据最新值"`
+	UniqueCode          string      `description:"指标唯一编码"`
+	MinValue            float64     `json:"-" description:"最小值"`
+	MaxValue            float64     `json:"-" description:"最大值"`
+	DataList            interface{} `gorm:"-"`
+	IsNullData          bool        `gorm:"-" json:"-" description:"是否空数据"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *ChartEdbInfoMapping) AfterFind(db *gorm.DB) (err error) {
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.LatestDate = utils.GormDateStrToDateStr(m.LatestDate)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+
+	return
+}
+
+// AreaExtraConf 面积图配置
+type AreaExtraConf struct {
+	IsHeap            int `description:"是否堆积 1-堆积 2-不堆积"`
+	HeapWay           int `description:"堆积方式 1-普通 2-百分比"`
+	StandardEdbInfoId int `description:"基准指标id"`
+	NullDealWay       int `description:"空值处理方式,1-插值填充 2-前值填充 3-后值填充 4-等于0 5-删除日期"`
 }
 
 func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.*,b.source_name,b.source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE chart_info_id=? 
              ORDER BY chart_edb_mapping_id ASC `
-	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).Find(&list).Error
 	return
 }
 

+ 25 - 17
models/data_manage/chart_info_correlation.go

@@ -1,15 +1,17 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
 
 // ChartInfoCorrelation 相关性图表-扩展信息
 type ChartInfoCorrelation struct {
-	CorrelationChartInfoId int       `orm:"column(correlation_chart_info_id);pk" description:"相关性图表ID(chart_info表source=3的)"`
+	//CorrelationChartInfoId int       `orm:"column(correlation_chart_info_id);pk" description:"相关性图表ID(chart_info表source=3的)"`
+	CorrelationChartInfoId int       `gorm:"column:correlation_chart_info_id;primaryKey" description:"相关性图表ID(chart_info表source=3的)"`
 	LeadValue              int       `description:"领先值"`
 	LeadUnit               string    `description:"领先单位"`
 	CalculateValue         int       `description:"计算窗口"`
@@ -33,44 +35,49 @@ func (m *ChartInfoCorrelation) TableName() string {
 }
 
 func (m *ChartInfoCorrelation) Create() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Insert(m)
-	if err != nil {
-		return
-	}
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
 	//m.CorrelationChartInfoId = int(id)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
 	return
 }
 
 func (m *ChartInfoCorrelation) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *ChartInfoCorrelation) Delete() (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE correlation_chart_info_id = ? LIMIT 1`, m.TableName())
-	_, err = o.Raw(sql, m.CorrelationChartInfoId).Exec()
+	//_, err = o.Raw(sql, m.CorrelationChartInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, m.CorrelationChartInfoId).Error
 	return
 }
 
 func (m *ChartInfoCorrelation) GetItemById(id int) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE correlation_chart_info_id = ? LIMIT 1`, m.TableName())
-	err = o.Raw(sql, id).QueryRow(&m)
+	//err = o.Raw(sql, id).QueryRow(&m)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&m).Error
 	return
 }
 
 func (m *ChartInfoCorrelation) GetItemByCondition(condition string, pars []interface{}) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&m)
+	//err = o.Raw(sql, pars).QueryRow(&m)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&m).Error
 	return
 }
 
 func (m *ChartInfoCorrelation) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ChartInfoCorrelation, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -80,7 +87,8 @@ func (m *ChartInfoCorrelation) GetItemsByCondition(condition string, pars []inte
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 

+ 36 - 32
models/data_manage/chart_theme/chart_theme.go

@@ -2,14 +2,16 @@ package chart_theme
 
 import (
 	"errors"
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // ChartTheme
 // @Description: 图表主题表
 type ChartTheme struct {
-	ChartThemeId     int       `description:"图表主题类型ID" orm:"column(chart_theme_id);pk"`
+	//ChartThemeId     int       `description:"图表主题类型ID" orm:"column(chart_theme_id);pk"`
+	ChartThemeId     int       `description:"图表主题类型ID" gorm:"column:chart_theme_id;primaryKey"`
 	ChartThemeName   string    `description:"图表主题名称"`
 	ChartThemeTypeId int       `description:"图表主题类型ID"`
 	ChartImage       string    `description:"缩略图"`
@@ -30,10 +32,10 @@ type ChartTheme struct {
 // @return item *ChartTheme
 // @return err error
 func GetChartThemeId(chartThemeId int) (item *ChartTheme, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme where chart_theme_id = ? AND is_delete = 0`
-	err = o.Raw(sql, chartThemeId).QueryRow(&item)
-
+	//err = o.Raw(sql, chartThemeId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartThemeId).First(&item).Error
 	return
 }
 
@@ -49,12 +51,13 @@ func (m *ChartTheme) Add() (err error) {
 		err = errors.New("该配置已存在")
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	lastId, err := o.Insert(m)
+	//o := orm.NewOrmUsingDB("data")
+	//lastId, err := o.Insert(m)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
 	if err != nil {
 		return
 	}
-	m.ChartThemeId = int(lastId)
+	//m.ChartThemeId = int(lastId)
 
 	return
 }
@@ -67,8 +70,9 @@ func (m *ChartTheme) Add() (err error) {
 // @param cols []string
 // @return err error
 func (m *ChartTheme) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
@@ -79,10 +83,10 @@ func (m *ChartTheme) Update(cols []string) (err error) {
 // @return list []*ChartTheme
 // @return err error
 func GetChartThemeListByTypeId(chartThemeTypeId int) (list []*ChartTheme, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme WHERE chart_theme_type_id = ? AND  is_delete=0 ORDER BY chart_theme_id ASC `
-	_, err = o.Raw(sql, chartThemeTypeId).QueryRows(&list)
-
+	//_, err = o.Raw(sql, chartThemeTypeId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartThemeTypeId).Find(&list).Error
 	return
 }
 
@@ -93,10 +97,10 @@ func GetChartThemeListByTypeId(chartThemeTypeId int) (list []*ChartTheme, err er
 // @return list []*ChartTheme
 // @return err error
 func GetAllChartThemeList() (list []*ChartTheme, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme WHERE  is_delete=0 ORDER BY chart_theme_id ASC `
-	_, err = o.Raw(sql).QueryRows(&list)
-
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&list).Error
 	return
 }
 
@@ -125,12 +129,12 @@ type ChartThemeItem struct {
 // @return list []*ChartThemeConfig
 // @return err error
 func GetChartThemeItemList(chartThemeTypeId int) (list []*ChartThemeItem, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT a.*,b.default_chart_theme_id FROM chart_theme a 
          JOIN chart_theme_type b on a.chart_theme_type_id =b.chart_theme_type_id 
          WHERE a.chart_theme_type_id = ? AND a.is_delete=0 ORDER BY a.chart_theme_id ASC `
-	_, err = o.Raw(sql, chartThemeTypeId).QueryRows(&list)
-
+	//_, err = o.Raw(sql, chartThemeTypeId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartThemeTypeId).Find(&list).Error
 	return
 }
 
@@ -142,11 +146,11 @@ func GetChartThemeItemList(chartThemeTypeId int) (list []*ChartThemeItem, err er
 // @return item *ChartTheme
 // @return err error
 func GetSystemChartTheme(chartThemeTypeId int) (item *ChartTheme, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT a.* FROM chart_theme a
          WHERE a.chart_theme_type_id = ? AND a.is_system_theme=1 ORDER BY a.chart_theme_id ASC `
-	err = o.Raw(sql, chartThemeTypeId).QueryRow(&item)
-
+	//err = o.Raw(sql, chartThemeTypeId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartThemeTypeId).First(&item).Error
 	return
 }
 
@@ -191,7 +195,7 @@ type DrawOption struct {
 
 type LineOptions struct {
 	DashStyle string  `json:"dashStyle"`
-	LineWidth float64     `json:"lineWidth"`
+	LineWidth float64 `json:"lineWidth"`
 	LineType  string  `json:"lineType"`
 	Radius    float64 `json:"radius"`
 }
@@ -223,13 +227,13 @@ type NewLineOptions struct {
 }
 
 type LineStyleOptions struct {
-	DashStyle string `json:"dashStyle"`
-	Color     string `json:"color"`
-	LineWidth float64    `json:"lineWidth"`
-	LineType  string `json:"lineType"`
-	Radius    int    `json:"radius"`
-	DataMark  string `json:"dataMark"`
-	MarkType  string `json:"markType"`
-	MarkSize  int    `json:"markSize"`
-	MarkColor string `json:"markColor"`
+	DashStyle string  `json:"dashStyle"`
+	Color     string  `json:"color"`
+	LineWidth float64 `json:"lineWidth"`
+	LineType  string  `json:"lineType"`
+	Radius    int     `json:"radius"`
+	DataMark  string  `json:"dataMark"`
+	MarkType  string  `json:"markType"`
+	MarkSize  int     `json:"markSize"`
+	MarkColor string  `json:"markColor"`
 }

+ 19 - 16
models/data_manage/chart_theme/chart_theme_type.go

@@ -1,14 +1,16 @@
 package chart_theme
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // ChartThemeType
 // @Description: 图表主题类型表
 type ChartThemeType struct {
-	ChartThemeTypeId    int       `description:"图表主题类型ID" orm:"column(chart_theme_type_id);pk"`
+	//ChartThemeTypeId    int       `description:"图表主题类型ID" orm:"column(chart_theme_type_id);pk"`
+	ChartThemeTypeId    int       `description:"图表主题类型ID" gorm:"column:chart_theme_type_id;primaryKey"`
 	ChartTypeName       string    `description:"类型名称"`
 	ChartType           int       `description:"图表类型"`
 	ChartSource         int       `description:"图表来源"`
@@ -25,8 +27,9 @@ type ChartThemeType struct {
 // @param cols []string
 // @return err error
 func (m *ChartThemeType) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
@@ -37,10 +40,10 @@ func (m *ChartThemeType) Update(cols []string) (err error) {
 // @return list []*ChartThemeType
 // @return err error
 func GetAllChartThemeTypeList() (list []*ChartThemeType, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme_type ORDER BY chart_theme_type_id ASC `
-	_, err = o.Raw(sql).QueryRows(&list)
-
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&list).Error
 	return
 }
 
@@ -52,10 +55,10 @@ func GetAllChartThemeTypeList() (list []*ChartThemeType, err error) {
 // @return list []*ChartThemeType
 // @return err error
 func GetChartThemeTypeListBySource(source int) (list []*ChartThemeType, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme_type WHERE chart_source = ?  ORDER BY chart_theme_type_id ASC `
-	_, err = o.Raw(sql, source).QueryRows(&list)
-
+	//_, err = o.Raw(sql, source).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source).Find(&list).Error
 	return
 }
 
@@ -67,10 +70,10 @@ func GetChartThemeTypeListBySource(source int) (list []*ChartThemeType, err erro
 // @return item *ChartThemeType
 // @return err error
 func GetChartThemeTypeById(chartThemeTypeId int) (item *ChartThemeType, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme_type where chart_theme_type_id = ? `
-	err = o.Raw(sql, chartThemeTypeId).QueryRow(&item)
-
+	//err = o.Raw(sql, chartThemeTypeId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartThemeTypeId).First(&item).Error
 	return
 }
 
@@ -82,9 +85,9 @@ func GetChartThemeTypeById(chartThemeTypeId int) (item *ChartThemeType, err erro
 // @return item *ChartThemeType
 // @return err error
 func GetChartThemeTypeByChartTypeAndSource(chartType, source int) (item *ChartThemeType, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_theme_type where chart_type = ? AND chart_source = ? `
-	err = o.Raw(sql, chartType, source).QueryRow(&item)
-
+	//err = o.Raw(sql, chartType, source).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartType, source).First(&item).Error
 	return
 }

+ 14 - 10
models/data_manage/cross_variety/chart_tag.go

@@ -1,15 +1,16 @@
 package cross_variety
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ChartTag
 // @Description: chart_tag 图表标签表
 type ChartTag struct {
-	ChartTagId      int       `orm:"column(chart_tag_id);pk"`
+	//ChartTagId      int       `orm:"column(chart_tag_id);pk"`
+	ChartTagId      int       `gorm:"column:chart_tag_id;primaryKey"`
 	ChartTagName    string    `description:"标签名称"`
 	ChartTagNameEn  string    `description:"标签名称(英文)"`
 	SysUserId       int       `description:"创建人id"`
@@ -26,16 +27,18 @@ type ChartTag struct {
 // @param updateColList []string
 // @return err error
 func (item *ChartTag) Update(updateColList []string) (err error) {
-	to := orm.NewOrmUsingDB("data")
-	_, err = to.Update(item, updateColList...)
+	//to := orm.NewOrmUsingDB("data")
+	//_, err = to.Update(item, updateColList...)
 
+	err = global.DbMap[utils.DbNameIndex].Model(&item).Select(updateColList).Updates(&item).Error
 	return
 }
 
 // Delete 删除
 func (item *ChartTag) Delete() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Delete(item)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Delete(item)
+	err = global.DbMap[utils.DbNameIndex].Delete(&item).Error
 	return
 }
 
@@ -51,9 +54,10 @@ func GetTagListByIdList(idList []int) (items []*ChartTag, err error) {
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM chart_tag WHERE 1 = 1 AND chart_tag_id in (` + utils.GetOrmInReplace(num) + `)`
-	_, err = o.Raw(sql, idList).QueryRows(&items)
-
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `SELECT * FROM chart_tag WHERE 1 = 1 AND chart_tag_id in (` + utils.GetOrmInReplace(num) + `)`
+	//_, err = o.Raw(sql, idList).QueryRows(&items)
+	sql := `SELECT * FROM chart_tag WHERE 1 = 1 AND chart_tag_id in ?`
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, idList).Find(&items).Error
 	return
 }

+ 8 - 6
models/data_manage/cross_variety/chart_tag_variety.go

@@ -1,15 +1,16 @@
 package cross_variety
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ChartTagVariety
 // @Description: chart_tag_variety 图表标签品种关系表
 type ChartTagVariety struct {
-	Id                        int       `orm:"column(id);pk"`
+	//Id                        int       `orm:"column(id);pk"`
+	Id                        int       `gorm:"column:id;primaryKey"`
 	ChartTagId                int       `description:"标签id"`
 	ChartVarietyId            int       `description:"品种id"`
 	EdbInfoId                 int       `description:"指标id"`
@@ -32,9 +33,10 @@ func GetChartTagVarietyListByTagAndVariety(chartTagId int, varietyIdList []int)
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM chart_tag_variety WHERE chart_tag_id = ? AND chart_variety_id in (` + utils.GetOrmInReplace(num) + `) `
-	_, err = o.Raw(sql, chartTagId, varietyIdList).QueryRows(&items)
-
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `SELECT * FROM chart_tag_variety WHERE chart_tag_id = ? AND chart_variety_id in (` + utils.GetOrmInReplace(num) + `) `
+	sql := `SELECT * FROM chart_tag_variety WHERE chart_tag_id = ? AND chart_variety_id in ? `
+	//_, err = o.Raw(sql, chartTagId, varietyIdList).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartTagId, varietyIdList).Find(&items).Error
 	return
 }

+ 27 - 23
models/data_manage/cross_variety/chart_variety.go

@@ -1,15 +1,16 @@
 package cross_variety
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ChartVariety
 // @Description: chart_variety 图表品种表
 type ChartVariety struct {
-	ChartVarietyId     int       `orm:"column(chart_variety_id);pk"`
+	//ChartVarietyId     int       `orm:"column(chart_variety_id);pk"`
+	ChartVarietyId     int       `gorm:"column:chart_variety_id;primaryKey"`
 	ChartVarietyName   string    `description:"品种名称"`
 	ChartVarietyNameEn string    `description:"品种名称(英文)"`
 	SysUserId          int       `description:"创建人id"`
@@ -26,10 +27,10 @@ type ChartVariety struct {
 // @return item *ChartVariety
 // @return err error
 func GetVarietyById(id int) (item *ChartVariety, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_variety WHERE chart_variety_id = ?`
-	err = o.Raw(sql, id).QueryRow(&item)
-
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }
 
@@ -41,10 +42,10 @@ func GetVarietyById(id int) (item *ChartVariety, err error) {
 // @return item *ChartVariety
 // @return err error
 func GetVarietyByName(name string) (item *ChartVariety, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_variety WHERE chart_variety_name = ?`
-	err = o.Raw(sql, name).QueryRow(&item)
-
+	//err = o.Raw(sql, name).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, name).First(&item).Error
 	return
 }
 
@@ -55,13 +56,14 @@ func GetVarietyByName(name string) (item *ChartVariety, err error) {
 // @param item *ChartVariety
 // @return err error
 func AddVariety(item *ChartVariety) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	lastId, err := o.Insert(item)
+	//o := orm.NewOrmUsingDB("data")
+	//lastId, err := o.Insert(item)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
 	if err != nil {
 		return
 	}
 
-	item.ChartVarietyId = int(lastId)
+	//item.ChartVarietyId = int(lastId)
 
 	return
 }
@@ -74,16 +76,17 @@ func AddVariety(item *ChartVariety) (err error) {
 // @param updateColList []string
 // @return err error
 func (item *ChartVariety) Update(updateColList []string) (err error) {
-	to := orm.NewOrmUsingDB("data")
-	_, err = to.Update(item, updateColList...)
-
+	//to := orm.NewOrmUsingDB("data")
+	//_, err = to.Update(item, updateColList...)
+	err = global.DbMap[utils.DbNameIndex].Model(&item).Select(updateColList).Updates(&item).Error
 	return
 }
 
 // Delete 删除
 func (item *ChartVariety) Delete() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Delete(item)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Delete(item)
+	err = global.DbMap[utils.DbNameIndex].Delete(&item).Error
 	return
 }
 
@@ -94,10 +97,10 @@ func (item *ChartVariety) Delete() (err error) {
 // @return items []*ChartVariety
 // @return err error
 func GetVarietyList() (items []*ChartVariety, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM chart_variety WHERE 1 = 1 `
-	_, err = o.Raw(sql).QueryRows(&items)
-
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
 
@@ -113,9 +116,10 @@ func GetVarietyListByIdList(idList []int) (items []*ChartVariety, err error) {
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM chart_variety WHERE 1 = 1 AND chart_variety_id in (` + utils.GetOrmInReplace(num) + `)`
-	_, err = o.Raw(sql, idList).QueryRows(&items)
-
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `SELECT * FROM chart_variety WHERE 1 = 1 AND chart_variety_id in (` + utils.GetOrmInReplace(num) + `)`
+	sql := `SELECT * FROM chart_variety WHERE 1 = 1 AND chart_variety_id in ?`
+	//_, err = o.Raw(sql, idList).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, idList).Find(&items).Error
 	return
 }

+ 22 - 8
models/data_manage/edb_info.go

@@ -1,13 +1,15 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"time"
 )
 
 type EdbInfo struct {
-	EdbInfoId        int    `orm:"column(edb_info_id);pk"`
+	//EdbInfoId        int    `orm:"column(edb_info_id);pk"`
+	EdbInfoId        int    `gorm:"column:edb_info_id;primaryKey"`
 	EdbInfoType      int    `description:"指标类型,0:普通指标,1:预测指标"`
 	SourceName       string `description:"来源名称"`
 	Source           int    `description:"来源id"`
@@ -43,6 +45,15 @@ type EdbInfo struct {
 	StockCode        string  `description:"证券代码"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *EdbInfo) AfterFind(db *gorm.DB) (err error) {
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.LatestDate = utils.GormDateStrToDateStr(m.LatestDate)
+
+	return
+}
+
 type EdbInfoMaxAndMinInfo struct {
 	MinDate     string  `description:"最小日期"`
 	MaxDate     string  `description:"最大日期"`
@@ -52,9 +63,10 @@ type EdbInfoMaxAndMinInfo struct {
 }
 
 func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM edb_info WHERE edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).First(&item).Error
 	return
 }
 
@@ -64,15 +76,17 @@ func GetEdbInfoByIdList(edbInfoIdList []int) (items []*EdbInfo, err error) {
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
-	_, err = o.Raw(sql, edbInfoIdList).QueryRows(&items)
+	//o := orm.NewOrmUsingDB("data")
+	//sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id in ?`
+	//_, err = o.Raw(sql, edbInfoIdList).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoIdList).Find(&items).Error
 	return
 }
 
 func GetRefreshEdbInfoFromBase(edbInfoId, source int) (baseEdbInfoArr, calculateInfoArr []*EdbInfo, err error) {
 	calculateList, err := GetEdbInfoCalculateMap(edbInfoId, source)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	for _, item := range calculateList {

+ 18 - 9
models/data_manage/edb_info_calculate.go

@@ -1,13 +1,13 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 
 	//calculateTableName := GetEdbInfoCalculateTableName(source)
 
@@ -20,7 +20,8 @@ func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfo, err error)
 	sql := ` SELECT b.* 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 `
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).Find(&list).Error
 	return
 }
 
@@ -31,19 +32,26 @@ func GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList []int) (list []*EdbInfo
 		return
 	}
 
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
+	//sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
+	//		 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
+	//         WHERE a.from_edb_info_id in (` + utils.GetOrmInReplace(num) + `)
+	//		 GROUP BY a.edb_info_id
+	//		 ORDER BY a.edb_info_id ASC `
 	sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
-             WHERE a.from_edb_info_id in (` + utils.GetOrmInReplace(num) + `)
+             WHERE a.from_edb_info_id in ?
 			 GROUP BY a.edb_info_id
 			 ORDER BY a.edb_info_id ASC `
-	_, err = o.Raw(sql, edbInfoIdList).QueryRows(&list)
+	//_, err = o.Raw(sql, edbInfoIdList).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoIdList).Find(&list).Error
 	return
 }
 
 // EdbInfoCalculateMappingInfo
 type EdbInfoCalculateMappingInfo struct {
-	EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
+	//EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
+	EdbInfoCalculateMappingId int       `gorm:"column:edb_info_calculate_mapping_id;primaryKey"`
 	EdbInfoId                 int       `description:"计算指标id"`
 	Source                    int       `description:"计算指标来源"`
 	SourceName                string    `description:"计算指标来源名称"`
@@ -66,10 +74,11 @@ type EdbInfoCalculateMappingInfo struct {
 
 // GetEdbInfoCalculateMappingListByEdbInfoId 根据生成的指标id获取来源的指标id列表
 func GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId int) (items []*EdbInfoCalculateMappingInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.*,b.edb_type as from_edb_type,b.edb_info_type as from_edb_info_type, b.unique_code AS from_unique_code, b.classify_id AS from_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=? `
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).Find(&items).Error
 	return
 }

+ 5 - 6
models/data_manage/edb_source.go

@@ -1,9 +1,9 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 )
 
@@ -13,7 +13,8 @@ var (
 
 // EdbSource 指标来源表
 type EdbSource struct {
-	EdbSourceId      int    `orm:"column(edb_source_id);pk"`
+	//EdbSourceId      int    `orm:"column(edb_source_id);pk"`
+	EdbSourceId      int    `gorm:"column:edb_source_id;primaryKey"`
 	SourceName       string `description:"指标来源名称"`
 	TableName        string `description:"数据表名"`
 	EdbAddMethod     string `description:"指标新增接口"`
@@ -27,7 +28,6 @@ type EdbSource struct {
 
 // GetEdbSourceItemsByCondition 获取指标来源列表
 func GetEdbSourceItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EdbSource, err error) {
-	o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -37,7 +37,7 @@ func GetEdbSourceItemsByCondition(condition string, pars []interface{}, fieldArr
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM edb_source WHERE 1=1 %s %s`, fields, condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -52,9 +52,8 @@ type EdbSourceChild struct {
 
 // GetEdbSourceItemByCondition 获取指标来源
 func GetEdbSourceItemByCondition(condition string, pars []interface{}) (item *EdbSource, err error) {
-	o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM edb_source WHERE 1=1 %s`, condition)
-	err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars).First(&item).Error
 	return
 }
 

+ 27 - 16
models/data_manage/excel/excel_chart_data.go

@@ -1,14 +1,16 @@
 package excel
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 type ExcelChartData struct {
-	ExcelChartDataId int `orm:"column(excel_chart_data_id);pk"`
+	//ExcelChartDataId int `orm:"column(excel_chart_data_id);pk"`
+	ExcelChartDataId int `gorm:"column:excel_chart_data_id;primaryKey"`
 	ExcelInfoId      int `description:"表格id"`
 	ExcelChartEdbId  int `description:"指标ID"`
 	ChartInfoId      int `description:"图表id"`
@@ -25,38 +27,43 @@ func (e *ExcelChartData) TableName() string {
 
 // 新增
 func (e *ExcelChartData) Add() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Insert(e)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Insert(e)
+	err = global.DbMap[utils.DbNameIndex].Create(&e).Error
 	return
 }
 
 // 修改
 func (e *ExcelChartData) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(e, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(e, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&e).Select(cols).Updates(&e).Error
 	return
 }
 
 // 删除
 func (e *ExcelChartData) Delete() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Delete(e)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Delete(e)
+	err = global.DbMap[utils.DbNameIndex].Delete(&e).Error
 	return
 }
 
 // 查询
 func GetExcelChartDataByExcelInfoId(excelInfoId int) (list []*ExcelChartData, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
              FROM excel_chart_data
 			 WHERE excel_info_id=? 
             ORDER BY excel_chart_edb_id ASC, data_time desc, excel_chart_data_id ASC `
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&list).Error
 	return
 }
 
 func BatchUpdateChartEdbData(excelInfoId int, excelEdbMap map[int]*ExcelChartEdb, excelDataMap map[int][]*models.EdbDataList) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -69,7 +76,8 @@ func BatchUpdateChartEdbData(excelInfoId int, excelEdbMap map[int]*ExcelChartEdb
 	}()
 	//如果有数据则删除所有的数据
 	sql := `delete from excel_chart_data where excel_info_id = ?`
-	_, err = o.Raw(sql, excelInfoId).Exec()
+	//_, err = o.Raw(sql, excelInfoId).Exec()
+	err = o.Exec(sql, excelInfoId).Error
 	if err != nil {
 		return
 	}
@@ -96,7 +104,8 @@ func BatchUpdateChartEdbData(excelInfoId int, excelEdbMap map[int]*ExcelChartEdb
 			addList = append(addList, chartData)
 			// data信息入库
 			if len(addList) > 1000 {
-				_, err = o.InsertMulti(len(addList), addList)
+				//_, err = o.InsertMulti(len(addList), addList)
+				err = o.CreateInBatches(addList, len(addList)).Error
 				if err != nil {
 					return
 				}
@@ -107,7 +116,8 @@ func BatchUpdateChartEdbData(excelInfoId int, excelEdbMap map[int]*ExcelChartEdb
 
 	// data信息入库
 	if len(addList) > 0 {
-		_, err = o.InsertMulti(len(addList), addList)
+		//_, err = o.InsertMulti(len(addList), addList)
+		err = o.CreateInBatches(addList, len(addList)).Error
 		if err != nil {
 			return
 		}
@@ -116,11 +126,12 @@ func BatchUpdateChartEdbData(excelInfoId int, excelEdbMap map[int]*ExcelChartEdb
 }
 
 func GetExcelChartDataByChartInfoId(chartInfoId int) (list []*ExcelChartData, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
              FROM excel_chart_Data
 			 WHERE chart_info_id=? 
              ORDER BY excel_chart_edb_id ASC `
-	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).Find(&list).Error
 	return
 }

+ 86 - 47
models/data_manage/excel/excel_chart_edb.go

@@ -1,17 +1,20 @@
 package excel
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/models"
 	"eta/eta_chart_lib/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type ExcelChartEdb struct {
-	ExcelChartEdbId int       `orm:"column(excel_chart_edb_id);pk"`
+	//ExcelChartEdbId int       `orm:"column(excel_chart_edb_id);pk"`
+	ExcelChartEdbId int       `gorm:"column:excel_chart_edb_id;primaryKey"`
 	ExcelInfoId     int       `description:"表格id"`
 	ChartInfoId     int       `description:"图表id"`
 	EdbCode         string    `description:"指标编码"`
@@ -79,22 +82,25 @@ func (e *ExcelChartEdb) TableName() string {
 
 // 新增
 func (e *ExcelChartEdb) Add() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Insert(e)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Insert(e)
+	err = global.DbMap[utils.DbNameIndex].Create(&e).Error
 	return
 }
 
 // 修改
 func (e *ExcelChartEdb) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(e, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(e, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&e).Select(cols).Updates(&e).Error
 	return
 }
 
 // 删除
 func (e *ExcelChartEdb) Delete() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Delete(e)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Delete(e)
+	err = global.DbMap[utils.DbNameIndex].Delete(&e).Error
 	return
 }
 
@@ -105,7 +111,8 @@ type AddChartEdbAndDataItem struct {
 
 // 同时添加指标和指标数据
 func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chartInfo *models.ChartInfo, deleteEdbIds []int) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -119,8 +126,10 @@ func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chart
 
 	// 先删除原先的绑定的指标
 	if len(deleteEdbIds) > 0 && chartInfo.ChartInfoId > 0 {
-		sql := `DELETE FROM excel_chart_edb WHERE chart_info_id = ? AND excel_chart_edb_id in (` + utils.GetOrmInReplace(len(deleteEdbIds)) + `)`
-		_, err = o.Raw(sql, chartInfo.ChartInfoId, deleteEdbIds).Exec()
+		//sql := `DELETE FROM excel_chart_edb WHERE chart_info_id = ? AND excel_chart_edb_id in (` + utils.GetOrmInReplace(len(deleteEdbIds)) + `)`
+		sql := `DELETE FROM excel_chart_edb WHERE chart_info_id = ? AND excel_chart_edb_id in ?`
+		//_, err = o.Raw(sql, chartInfo.ChartInfoId, deleteEdbIds).Exec()
+		err = o.Exec(sql, chartInfo.ChartInfoId, deleteEdbIds).Error
 		if err != nil {
 			err = fmt.Errorf("删除原先的指标失败:%v", err)
 			return
@@ -141,14 +150,17 @@ func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chart
 	//新增图表
 	chartInfoId := chartInfo.ChartInfoId
 	if chartInfo.ChartInfoId <= 0 {
-		lastId, e := o.Insert(chartInfo)
-		if e != nil {
+		//lastId, e := o.Insert(chartInfo)
+		err = o.Create(&chartInfo).Error
+		if err != nil {
 			err = fmt.Errorf("新增图表失败,AddChartEdbAndData: %v", e)
 			return
 		}
-		chartInfoId = int(lastId)
+		//chartInfoId = int(lastId)
+		chartInfoId = chartInfo.ChartInfoId
 	} else {
-		_, err = o.Update(chartInfo)
+		//_, err = o.Update(chartInfo)
+		err = o.Save(&chartInfo).Error
 		if err != nil {
 			err = fmt.Errorf("更新图表失败,AddChartEdbAndData: %v", e)
 			return
@@ -156,8 +168,10 @@ func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chart
 	}
 
 	//更新图表id
-	sql := `update excel_chart_edb set chart_info_id = ? where excel_chart_edb_id in (` + utils.GetOrmInReplace(len(updateIds)) + `) and chart_info_id=0`
-	_, err = o.Raw(sql, chartInfoId, updateIds).Exec()
+	//sql := `update excel_chart_edb set chart_info_id = ? where excel_chart_edb_id in (` + utils.GetOrmInReplace(len(updateIds)) + `) and chart_info_id=0`
+	sql := `update excel_chart_edb set chart_info_id = ? where excel_chart_edb_id in ? and chart_info_id=0`
+	//_, err = o.Raw(sql, chartInfoId, updateIds).Exec()
+	err = o.Exec(sql, chartInfoId, updateIds).Error
 	if err != nil {
 		err = fmt.Errorf("更新图表id失败,AddChartEdbAndData: %v", err)
 		return
@@ -167,30 +181,36 @@ func (e *ExcelChartEdb) AddChartEdbAndData(list []*AddChartEdbAndDataItem, chart
 		edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 		//更新图表关联的指标id
 		sql = `update chart_info set edb_info_ids = ? where chart_info_id = ?`
-		_, err = o.Raw(sql, edbInfoIdStr, chartInfoId).Exec()
+		//_, err = o.Raw(sql, edbInfoIdStr, chartInfoId).Exec()
+		err = o.Exec(sql, edbInfoIdStr, chartInfoId).Error
 	}
 	return
 }
 
-func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dataList []*ExcelChartData) (err error) {
+// func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dataList []*ExcelChartData) (err error) {
+func addChartEdbAndData(o *gorm.DB, chartEdb *ExcelChartEdb, dataList []*ExcelChartData) (err error) {
 	// 图表指标信息入库
 	excelChartEdbId := chartEdb.ExcelChartEdbId
 	if chartEdb.ExcelChartEdbId <= 0 {
-		lastId, e := o.Insert(chartEdb)
+		//lastId, e := o.Insert(chartEdb)
+		e := o.Create(&chartEdb).Error
 		if e != nil {
 			err = fmt.Errorf("新增指标失败,addChartEdbAndData: %v", e)
 			return
 		}
-		excelChartEdbId = int(lastId)
+		//excelChartEdbId = int(lastId)
+		excelChartEdbId = chartEdb.ExcelChartEdbId
 	} else {
-		_, e := o.Update(chartEdb)
+		//_, e := o.Update(chartEdb)
+		e := o.Save(&chartEdb).Error
 		if e != nil {
 			err = fmt.Errorf("更新指标失败,addChartEdbAndData: %v", e)
 			return
 		}
 		//如果有数据则删除所有的数据
 		sql := `delete from excel_chart_data where excel_chart_edb_id = ?`
-		_, err = o.Raw(sql, excelChartEdbId).Exec()
+		//_, err = o.Raw(sql, excelChartEdbId).Exec()
+		err = o.Exec(sql, excelChartEdbId).Error
 		if err != nil {
 			return
 		}
@@ -215,7 +235,8 @@ func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dataList []*Exce
 			addList = append(addList, chartData)
 			// data信息入库
 			if len(addList) > 1000 {
-				_, err = o.InsertMulti(len(addList), addList)
+				//_, err = o.InsertMulti(len(addList), addList)
+				err = o.CreateInBatches(addList, len(addList)).Error
 				if err != nil {
 					return
 				}
@@ -226,7 +247,8 @@ func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dataList []*Exce
 
 	// data信息入库
 	if len(addList) > 0 {
-		_, err = o.InsertMulti(len(addList), addList)
+		//_, err = o.InsertMulti(len(addList), addList)
+		err = o.CreateInBatches(addList, len(addList)).Error
 		if err != nil {
 			return
 		}
@@ -235,53 +257,62 @@ func addChartEdbAndData(o orm.TxOrmer, chartEdb *ExcelChartEdb, dataList []*Exce
 }
 
 func GetExcelChartEdbMappingByExcelInfoId(excelInfoId int) (list []*ExcelChartEdb, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
              FROM excel_chart_edb 
 			 WHERE excel_info_id=? 
              ORDER BY chart_info_id asc, excel_chart_edb_id ASC `
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&list).Error
 	return
 }
 
 func GetExcelChartEdbMappingByExcelInfoIds(excelInfoIds []int) (list []*ExcelChartEdb, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
+	//sql := ` SELECT *
+	//         FROM excel_chart_edb
+	//		 WHERE excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
 	sql := ` SELECT *
              FROM excel_chart_edb 
-			 WHERE excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
-	_, err = o.Raw(sql, excelInfoIds).QueryRows(&list)
+			 WHERE excel_info_id in ?`
+	//_, err = o.Raw(sql, excelInfoIds).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoIds).Find(&list).Error
 	return
 }
 
 func GetExcelChartEdbById(id int) (item *ExcelChartEdb, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_chart_edb WHERE excel_chart_edb_id=? `
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }
 
 func GetExcelChartEdbMappingByChartInfoId(chartInfoId int) (list []*ExcelChartEdb, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
              FROM excel_chart_edb 
 			 WHERE chart_info_id=? 
              ORDER BY excel_chart_edb_id ASC `
-	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).Find(&list).Error
 	return
 }
 
 func GetExcelInfoByChartInfoId(chartInfoId int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT i.*
              FROM excel_chart_edb e left join excel_info i on e.excel_info_id=i.excel_info_id
 			 WHERE e.chart_info_id=? limit 1`
-	err = o.Raw(sql, chartInfoId).QueryRow(&item)
+	//err = o.Raw(sql, chartInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartInfoId).First(&item).Error
 	return
 }
 
 // 同时删除指标和指标数据
 func DeleteExcelChartEdbAndData(excelInfoIds []int, chartInfoIds []int) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -294,16 +325,20 @@ func DeleteExcelChartEdbAndData(excelInfoIds []int, chartInfoIds []int) (err err
 	}()
 	// 把对应的表格状态改成删除状态
 	//更新图表id
-	sql := `update excel_info set is_delete = 1, modify_time = ? where excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
-	_, err = o.Raw(sql, time.Now(), excelInfoIds).Exec()
+	//sql := `update excel_info set is_delete = 1, modify_time = ? where excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
+	sql := `update excel_info set is_delete = 1, modify_time = ? where excel_info_id in ?`
+	//_, err = o.Raw(sql, time.Now(), excelInfoIds).Exec()
+	err = o.Exec(sql, time.Now(), excelInfoIds).Error
 	if err != nil {
 		err = fmt.Errorf("更新图表id失败,AddChartEdbAndData: %v", err)
 		return
 	}
 	// 把删除图表状态
 	if len(chartInfoIds) > 0 {
-		sql := `DELETE FROM chart_info WHERE  chart_info_id in (` + utils.GetOrmInReplace(len(chartInfoIds)) + `)`
-		_, err = o.Raw(sql, chartInfoIds).Exec()
+		//sql := `DELETE FROM chart_info WHERE  chart_info_id in (` + utils.GetOrmInReplace(len(chartInfoIds)) + `)`
+		sql := `DELETE FROM chart_info WHERE  chart_info_id in ?`
+		//_, err = o.Raw(sql, chartInfoIds).Exec()
+		err = o.Exec(sql, chartInfoIds).Error
 		if err != nil {
 			err = fmt.Errorf("删除原先的指标失败:%v", err)
 			return
@@ -312,15 +347,19 @@ func DeleteExcelChartEdbAndData(excelInfoIds []int, chartInfoIds []int) (err err
 		// todo 如果加入到我的图库中,则删除我的图库中的数据
 	}
 	// 删除原先的绑定的指标
-	sql = `DELETE FROM excel_chart_edb WHERE  excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
-	_, err = o.Raw(sql, excelInfoIds).Exec()
+	//sql = `DELETE FROM excel_chart_edb WHERE  excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
+	//_, err = o.Raw(sql, excelInfoIds).Exec()
+	sql = `DELETE FROM excel_chart_edb WHERE  excel_info_id in ?`
+	err = o.Exec(sql, excelInfoIds).Error
 	if err != nil {
 		err = fmt.Errorf("删除原先的指标失败:%v", err)
 		return
 	}
 	// 删除指标数据
-	sql = `DELETE FROM excel_chart_data WHERE  excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
-	_, err = o.Raw(sql, excelInfoIds).Exec()
+	//sql = `DELETE FROM excel_chart_data WHERE  excel_info_id in (` + utils.GetOrmInReplace(len(excelInfoIds)) + `)`
+	//_, err = o.Raw(sql, excelInfoIds).Exec()
+	sql = `DELETE FROM excel_chart_data WHERE  excel_info_id in ?`
+	err = o.Exec(sql, excelInfoIds).Error
 	if err != nil {
 		err = fmt.Errorf("删除原先的指标失败:%v", err)
 		return
@@ -343,20 +382,20 @@ func DeleteBalanceExcelChartInfoAndData(chartInfoId int) (err error) {
 		}
 	}()
 
-	sql := ` DELETE FROM chart_info WHERE chart_info_id=? `
+	sql := ` DELETE FROM chart_info WHERE chart_info_id = ? `
 	_, err = to.Raw(sql, chartInfoId).Exec()
 	if err != nil {
 		err = fmt.Errorf("删除平衡表图表失败 %s", err.Error())
 		return
 	}
-	sql = ` DELETE FROM  excel_chart_edb WHERE chart_info_id=? `
+	sql = ` DELETE FROM  excel_chart_edb WHERE chart_info_id = ? `
 	_, err = to.Raw(sql, chartInfoId).Exec()
 	if err != nil {
 		err = fmt.Errorf("删除平衡表图表指标失败 %s", err.Error())
 		return
 	}
 	// 删除表格里的数据
-	sql = ` DELETE FROM  excel_chart_data WHERE chart_info_id=? `
+	sql = ` DELETE FROM  excel_chart_data WHERE chart_info_id = ? `
 	_, err = to.Raw(sql, chartInfoId).Exec()
 	if err != nil {
 		err = fmt.Errorf("删除平衡表图表指标失败 %s", err.Error())

+ 65 - 47
models/data_manage/excel/excel_classify.go

@@ -1,15 +1,16 @@
 package excel
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ExcelClassify excel表格分类
 type ExcelClassify struct {
-	ExcelClassifyId   int       `orm:"column(excel_classify_id);pk"`
+	//ExcelClassifyId   int       `orm:"column(excel_classify_id);pk"`
+	ExcelClassifyId   int       `gorm:"column:excel_classify_id;primaryKey"`
 	Source            int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
 	ExcelClassifyName string    `description:"分类名称"`
 	ParentId          int       `description:"父级id"`
@@ -26,28 +27,30 @@ type ExcelClassify struct {
 
 // AddExcelClassify 添加excel分类
 func AddExcelClassify(item *ExcelClassify) (lastId int64, err error) {
-	o := orm.NewOrmUsingDB("data")
-	lastId, err = o.Insert(item)
-	if err != nil {
-		return
-	}
-	item.ExcelClassifyId = int(lastId)
-
+	//o := orm.NewOrmUsingDB("data")
+	//lastId, err = o.Insert(item)
+	//if err != nil {
+	//	return
+	//}
+	//item.ExcelClassifyId = int(lastId)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
 	return
 }
 
 // GetExcelClassifyCount 获取同级分类下存在同名分类的数量
 func GetExcelClassifyCount(ExcelClassifyName string, parentId, source int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) AS count FROM excel_classify WHERE parent_id=? AND source = ? AND excel_classify_name=? AND is_delete=0 `
-	err = o.Raw(sql, parentId, source, ExcelClassifyName).QueryRow(&count)
+	//err = o.Raw(sql, parentId, source, ExcelClassifyName).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, source, ExcelClassifyName).Scan(&count).Error
 	return
 }
 
 func GetExcelClassifyById(classifyId int) (item *ExcelClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM excel_classify WHERE excel_classify_id=? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
@@ -63,9 +66,11 @@ func GetExcelClassifyByIdList(classifyIdList []int) (items []*ExcelClassify, err
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM excel_classify WHERE excel_classify_id in (` + utils.GetOrmInReplace(num) + `) AND is_delete=0 `
-	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `SELECT * FROM excel_classify WHERE excel_classify_id in (` + utils.GetOrmInReplace(num) + `) AND is_delete=0 `
+	//_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+	sql := `SELECT * FROM excel_classify WHERE excel_classify_id in ? AND is_delete=0 `
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyIdList).Find(&items).Error
 	return
 }
 
@@ -77,44 +82,49 @@ func GetExcelClassifyByIdList(classifyIdList []int) (items []*ExcelClassify, err
 // @return items []*ExcelClassify
 // @return err error
 func GetExcelClassifyBySourceAndIsJoinPermission(source, isJoinPermission int) (items []*ExcelClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM excel_classify WHERE source = ? AND is_join_permission = ? `
-	_, err = o.Raw(sql, source, isJoinPermission).QueryRows(&items)
-
+	//_, err = o.Raw(sql, source, isJoinPermission).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source, isJoinPermission).Find(&items).Error
 	return
 }
 
 func GetChildClassifyById(classifyId int) (items []*ExcelClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM excel_classify WHERE parent_id=? AND is_delete=0 `
-	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	//_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).Find(&items).Error
 	return
 }
 
 func GetExcelClassifyByParentId(parentId, source int) (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE parent_id=? AND source = ? AND is_delete=0 order by sort asc,excel_classify_id asc`
-	_, err = o.Raw(sql, parentId, source).QueryRows(&items)
+	//_, err = o.Raw(sql, parentId, source).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, source).Find(&items).Error
 	return
 }
 
 func GetExcelClassifyBySource(source int) (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE  source = ? AND is_delete=0 order by sort asc,excel_classify_id asc`
-	_, err = o.Raw(sql, source).QueryRows(&items)
+	//_, err = o.Raw(sql, source).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source).Find(&items).Error
 	return
 }
 
 func GetExcelClassifyBySourceOrderByLevel(source int) (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE  source = ? AND is_delete=0 order by level asc, sort asc,excel_classify_id asc`
-	_, err = o.Raw(sql, source).QueryRows(&items)
+	//_, err = o.Raw(sql, source).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source).Find(&items).Error
 	return
 }
 func GetExcelClassifyAll() (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE parent_id<>0 AND is_delete=0 order by sort asc,excel_classify_id asc`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
 
@@ -135,58 +145,64 @@ type ExcelClassifyItems struct {
 }
 
 func GetExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetNextExcelClassifyByCondition 获取下一个分类
 func GetNextExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += " ORDER BY sort asc , create_time ASC LIMIT 1 "
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetFirstExcelClassifyByParentId 获取当前父级图表分类下的排序第一条的数据
 func GetFirstExcelClassifyByParentId(parentId int) (item *ExcelClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_classify WHERE parent_id=? AND is_delete=0 order by sort asc,excel_classify_id asc limit 1`
-	err = o.Raw(sql, parentId).QueryRow(&item)
+	//err = o.Raw(sql, parentId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId).First(&item).Error
 	return
 }
 
 // UpdateExcelClassifySortByParentId 根据图表父类id更新排序
 func UpdateExcelClassifySortByParentId(parentId, classifyId, nowSort int, updateSort string, source int) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` update excel_classify set sort = ` + updateSort + ` WHERE parent_id=? and source=? and sort > ? AND is_delete=0 `
 	if classifyId > 0 {
 		sql += ` or ( excel_classify_id > ` + fmt.Sprint(classifyId) + ` and sort= ` + fmt.Sprint(nowSort) + `)`
 	}
-	_, err = o.Raw(sql, parentId, source, nowSort).Exec()
+	//_, err = o.Raw(sql, parentId, source, nowSort).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, parentId, source, nowSort).Error
 	return
 }
 
 // Update 更新图表分类基础信息
 func (ExcelClassify *ExcelClassify) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(ExcelClassify, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(ExcelClassify, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&ExcelClassify).Select(cols).Updates(&ExcelClassify).Error
 	return
 }
 
 // GetExcelClassifyMaxSort 获取图表分类下最大的排序数
 func GetExcelClassifyMaxSort(parentId int, source int) (sort int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT Max(sort) AS sort FROM excel_classify WHERE parent_id=? AND source = ? AND is_delete=0 `
-	err = o.Raw(sql, parentId, source).QueryRow(&sort)
+	//err = o.Raw(sql, parentId, source).QueryRow(&sort)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, source).Scan(&sort).Error
 	return
 }
 
@@ -197,9 +213,10 @@ type ExcelClassifyView struct {
 }
 
 func GetExcelClassifyViewById(classifyId int) (item *ExcelClassifyView, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM excel_classify WHERE excel_classify_id=? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
@@ -220,9 +237,10 @@ func GetClassifyByIdList(classifyIdList []int) (items []*ExcelClassify, err erro
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM excel_classify WHERE excel_classify_id in (` + utils.GetOrmInReplace(num) + `) AND is_delete=0 `
-	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
-
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `SELECT * FROM excel_classify WHERE excel_classify_id in (` + utils.GetOrmInReplace(num) + `) AND is_delete=0 `
+	sql := `SELECT * FROM excel_classify WHERE excel_classify_id in ? AND is_delete=0 `
+	//_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyIdList).Find(&items).Error
 	return
 }

+ 14 - 10
models/data_manage/excel/excel_draft.go

@@ -1,13 +1,15 @@
 package excel
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // ExcelDraft 沙盘推演草稿表
 type ExcelDraft struct {
-	ExcelDraftId int       `orm:"column(excel_draft_id);pk" description:"excel表格草稿记录id"`
+	//ExcelDraftId int       `orm:"column(excel_draft_id);pk" description:"excel表格草稿记录id"`
+	ExcelDraftId int       `gorm:"column:excel_draft_id;primaryKey" description:"excel表格草稿记录id"`
 	ExcelId      int       `description:"excel表格id"`
 	Name         string    `description:"excel表格名称"`
 	Content      string    `description:"excel数据"`
@@ -18,20 +20,22 @@ type ExcelDraft struct {
 
 // AddExcelDraft 添加一个新的excel表格草稿
 func AddExcelDraft(excelDraft *ExcelDraft) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	// 新增草稿
-	id, err := o.Insert(excelDraft)
-	if err != nil {
-		return
-	}
-	excelDraft.ExcelDraftId = int(id)
+	//id, err := o.Insert(excelDraft)
+	//if err != nil {
+	//	return
+	//}
+	//excelDraft.ExcelDraftId = int(id)
+	err = global.DbMap[utils.DbNameIndex].Create(&excelDraft).Error
 	return
 }
 
 // GetLastExcelDraftById 根据沙盘id获取最后一条沙盘草稿详情
 func GetLastExcelDraftById(excelId int) (excelDraft *ExcelDraft, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `select * from excel_draft where excel_id = ? order by excel_draft_id desc `
-	err = o.Raw(sql, excelId).QueryRow(&excelDraft)
+	//err = o.Raw(sql, excelId).QueryRow(&excelDraft)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelId).First(&excelDraft).Error
 	return
 }

+ 30 - 22
models/data_manage/excel/excel_edb_mapping.go

@@ -1,15 +1,16 @@
 package excel
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ExcelEdbMapping excel与指标的关系表
 type ExcelEdbMapping struct {
-	ExcelEdbMappingId int       `orm:"column(excel_edb_mapping_id);pk"`
+	//ExcelEdbMappingId int       `orm:"column(excel_edb_mapping_id);pk"`
+	ExcelEdbMappingId int       `gorm:"column:excel_edb_mapping_id;primaryKey"`
 	ExcelInfoId       int       `description:"excel的id"`
 	Source            int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
 	EdbInfoId         int       `description:"计算指标id"`
@@ -19,35 +20,38 @@ type ExcelEdbMapping struct {
 
 // AddExcelEdbMappingMulti 批量添加excel与指标的关系
 func AddExcelEdbMappingMulti(items []*ExcelEdbMapping) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.InsertMulti(len(items), items)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DbMap[utils.DbNameIndex].CreateInBatches(items, len(items)).Error
 	return
 }
 
 // Add 添加excel与指标的关系
 func (e *ExcelEdbMapping) Add() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Insert(e)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Insert(e)
+	err = global.DbMap[utils.DbNameIndex].Create(&e).Error
 	return
 }
 
 // GetExcelEdbMappingByEdbInfoId 根据指标id获取配置关系
 func GetExcelEdbMappingByEdbInfoId(edbInfoId int) (item *ExcelEdbMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *  FROM excel_edb_mapping WHERE 1=1 AND edb_info_id = ? `
 
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).First(&item).Error
 	return
 }
 
 // GetExcelEdbMappingByExcelInfoId 根据excel的id获取配置关系
 func GetExcelEdbMappingByExcelInfoId(excelInfoId int) (items []*ExcelEdbMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *  FROM excel_edb_mapping AS a 
            join edb_info as b on a.edb_info_id = b.edb_info_id
            WHERE 1=1 AND a.excel_info_id = ? `
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
-
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&items).Error
 	return
 }
 
@@ -71,30 +75,33 @@ type CalculateFormula struct {
 
 // GetAllExcelEdbMappingItemByExcelInfoId 根据品种id获取所有的指标结果集
 func GetAllExcelEdbMappingItemByExcelInfoId(excelInfoId int) (items []*ExcelEdbMappingItem, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT a.edb_info_id,a.unique_code,a.edb_name,a.classify_id,a.frequency,a.unit,calculate_formula FROM edb_info AS a 
          JOIN excel_edb_mapping AS b ON a.edb_info_id=b.edb_info_id 
          WHERE b.excel_info_id = ? ORDER BY b.excel_edb_mapping_id ASC `
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&items).Error
 	return
 }
 
 // GetNoCustomAnalysisExcelEdbMappingCount 根据指标id获取非自定义分析的关联关系
 func GetNoCustomAnalysisExcelEdbMappingCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM excel_edb_mapping a 
                           join excel_info b on a.excel_info_id=b.excel_info_id
                           WHERE edb_info_id=? AND a.source != 4 AND b.is_delete = 0`
-	err = o.Raw(sql, edbInfoId).QueryRow(&count)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).Scan(&count).Error
 	return
 }
 
 // GetAllExcelEdbMappingByExcelInfoId 根据excel的id获取所有的指标
 func GetAllExcelEdbMappingByExcelInfoId(excelInfoId int) (items []*ExcelEdbMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT a.* FROM  excel_edb_mapping a
          WHERE a.excel_info_id = ? ORDER BY a.excel_edb_mapping_id ASC `
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&items).Error
 	return
 }
 
@@ -105,16 +112,16 @@ func GetAllExcelEdbMappingByExcelInfoId(excelInfoId int) (items []*ExcelEdbMappi
 // @param excelInfoId int
 // @return err error
 func DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(excelInfoId int) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `DELETE FROM excel_edb_mapping WHERE source = ? AND edb_info_id = ? LIMIT 1`
-	_, err = o.Raw(sql, utils.CUSTOM_ANALYSIS_TABLE, excelInfoId).Exec()
-
+	//_, err = o.Raw(sql, utils.CUSTOM_ANALYSIS_TABLE, excelInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, utils.CUSTOM_ANALYSIS_TABLE, excelInfoId).Error
 	return
 }
 
 // GetExcelEdbMappingItemByExcelInfoIdOrKeyword 根据表格ID或关键词获取指标
 func GetExcelEdbMappingItemByExcelInfoIdOrKeyword(excelInfoId int, keyword string) (items []*ExcelEdbMappingItem, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	cond := `b.excel_info_id = ?`
 	pars := make([]interface{}, 0)
 	pars = append(pars, excelInfoId)
@@ -137,6 +144,7 @@ func GetExcelEdbMappingItemByExcelInfoIdOrKeyword(excelInfoId int, keyword strin
 			%s
 		ORDER BY
 			b.excel_edb_mapping_id ASC`, cond)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }

+ 153 - 95
models/data_manage/excel/excel_info.go

@@ -1,15 +1,16 @@
 package excel
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ExcelInfo excel表格详情表
 type ExcelInfo struct {
-	ExcelInfoId        int       `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId        int       `orm:"column(excel_info_id);pk"`
+	ExcelInfoId        int       `gorm:"column:excel_info_id;primaryKey"`
 	Source             int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
 	ExcelType          int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName          string    `description:"表格名称"`
@@ -34,13 +35,15 @@ type ExcelInfo struct {
 
 // Update 更新 excel表格基础信息
 func (excelInfo *ExcelInfo) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(excelInfo, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(excelInfo, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&excelInfo).Select(cols).Updates(&excelInfo).Error
 	return
 }
 
 type MyExcelInfoList struct {
-	ExcelInfoId      int       `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId      int       `orm:"column(excel_info_id);pk"`
+	ExcelInfoId      int       `gorm:"column:excel_info_id;primaryKey"`
 	Source           int       `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
 	ExcelType        int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName        string    `description:"表格名称"`
@@ -59,7 +62,8 @@ type MyExcelInfoList struct {
 
 // AddExcelInfo 新增表格
 func AddExcelInfo(excelInfo *ExcelInfo, excelEdbMappingList []*ExcelEdbMapping) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -71,12 +75,15 @@ func AddExcelInfo(excelInfo *ExcelInfo, excelEdbMappingList []*ExcelEdbMapping)
 		}
 	}()
 	// 表格信息入库
-	lastId, err := o.Insert(excelInfo)
+	//lastId, err := o.Insert(excelInfo)
+	//if err != nil {
+	//	return
+	//}
+	//excelInfo.ExcelInfoId = int(lastId)
+	err = o.Create(&excelInfo).Error
 	if err != nil {
 		return
 	}
-	excelInfo.ExcelInfoId = int(lastId)
-
 	// excel与指标的关联关系
 	dataNum := len(excelEdbMappingList)
 	if dataNum > 0 {
@@ -84,7 +91,8 @@ func AddExcelInfo(excelInfo *ExcelInfo, excelEdbMappingList []*ExcelEdbMapping)
 			v.ExcelInfoId = excelInfo.ExcelInfoId
 			excelEdbMappingList[k] = v
 		}
-		_, err = o.InsertMulti(dataNum, excelEdbMappingList)
+		//_, err = o.InsertMulti(dataNum, excelEdbMappingList)
+		err = o.CreateInBatches(excelEdbMappingList, dataNum).Error
 	}
 
 	return
@@ -92,7 +100,8 @@ func AddExcelInfo(excelInfo *ExcelInfo, excelEdbMappingList []*ExcelEdbMapping)
 
 // EditExcelInfo 编辑表格
 func EditExcelInfo(excelInfo *ExcelInfo, updateExcelInfoParams []string, excelEdbMappingList []*ExcelEdbMapping) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -105,14 +114,16 @@ func EditExcelInfo(excelInfo *ExcelInfo, updateExcelInfoParams []string, excelEd
 	}()
 
 	// ETA表格信息变更
-	_, err = o.Update(excelInfo, updateExcelInfoParams...)
+	//_, err = o.Update(excelInfo, updateExcelInfoParams...)
+	err = o.Model(&excelInfo).Select(updateExcelInfoParams).Updates(&excelInfo).Error
 	if err != nil {
 		return
 	}
 
 	// 删除关系表
 	sql := `DELETE FROM excel_edb_mapping WHERE excel_info_id=? `
-	_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+	//_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+	err = o.Exec(sql, excelInfo.ExcelInfoId).Error
 
 	// excel与指标的关联关系
 	dataNum := len(excelEdbMappingList)
@@ -121,7 +132,8 @@ func EditExcelInfo(excelInfo *ExcelInfo, updateExcelInfoParams []string, excelEd
 			v.ExcelInfoId = excelInfo.ExcelInfoId
 			excelEdbMappingList[k] = v
 		}
-		_, err = o.InsertMulti(dataNum, excelEdbMappingList)
+		//_, err = o.InsertMulti(dataNum, excelEdbMappingList)
+		err = o.CreateInBatches(excelEdbMappingList, dataNum).Error
 	}
 
 	return
@@ -129,17 +141,18 @@ func EditExcelInfo(excelInfo *ExcelInfo, updateExcelInfoParams []string, excelEd
 
 // GetExcelInfoAll 获取所有表格列表,用于分类展示
 func GetExcelInfoAll() (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
              unique_code,sys_user_id,sys_user_real_name,is_join_permission
             FROM excel_info where is_delete=0 ORDER BY sort asc,create_time ASC `
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
 
 // GetNoContentExcelInfoAll 获取不含content的表格列表 用于分类展示
 func GetNoContentExcelInfoAll(source, userId int) (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
              unique_code,sys_user_id,sys_user_real_name,sort,is_join_permission
             FROM excel_info where is_delete=0 AND source = ?  `
@@ -151,53 +164,59 @@ func GetNoContentExcelInfoAll(source, userId int) (items []*ExcelClassifyItems,
 		pars = append(pars, userId)
 	}
 	sql += `  ORDER BY sort asc,excel_info_id desc `
-	_, err = o.Raw(sql, pars...).QueryRows(&items)
+	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 // GetAllExcelInfoBySource 根据来源获取包含content的表格列表
 func GetAllExcelInfoBySource(source int) (items []*ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info where is_delete=0  AND source = ?  ORDER BY sort asc,create_time desc `
-	_, err = o.Raw(sql, source).QueryRows(&items)
+	//_, err = o.Raw(sql, source).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, source).Find(&items).Error
 	return
 }
 
 // GetExcelInfoById 根据id 获取eta表格详情
 func GetExcelInfoById(excelInfoId int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_info_id=? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 // GetExcelInfoByUnicode 编码获取表格
 func GetExcelInfoByUnicode(unicode string) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE unique_code = ? AND is_delete = 0 `
-	err = o.Raw(sql, unicode).QueryRow(&item)
+	//err = o.Raw(sql, unicode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, unicode).First(&item).Error
 	return
 }
 
 func GetExcelInfoViewById(excelInfoId int) (item *ExcelInfoView, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_info_id=? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 func GetExcelInfoCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func GetNoContentExcelInfoListByCondition(condition string, pars []interface{}, startSize, pageSize int) (items []*ExcelClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
              unique_code,sys_user_id,sys_user_real_name,sort,is_join_permission FROM excel_info WHERE 1=1 `
 	if condition != "" {
@@ -205,51 +224,57 @@ func GetNoContentExcelInfoListByCondition(condition string, pars []interface{},
 	}
 
 	sql += ` AND is_delete=0 ORDER BY excel_info_id DESC LIMIT ?,? `
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 func GetExcelInfoByCondition(condition string, pars []interface{}) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetNextExcelInfoByCondition 根据条件获取下一个表格
 func GetNextExcelInfoByCondition(condition string, pars []interface{}) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += " ORDER BY sort asc , create_time desc LIMIT 1 "
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetNextExcelInfo 根据分类id获取下一个excel表格
 func GetNextExcelInfo(classifyId, classifySort, source int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT b.* FROM excel_classify AS a
 			INNER JOIN excel_info AS b ON a.excel_classify_id=b.excel_classify_id
 			WHERE (a.sort>? OR (a.sort=? and a.excel_classify_id>?) ) AND a.is_delete=0 AND b.is_delete=0
 			AND a.source = ? AND b.source = ? 
 			ORDER BY a.sort ASC,b.sort asc,b.create_time desc
 			LIMIT 1 `
-	err = o.Raw(sql, classifySort, classifySort, classifyId, source, source).QueryRow(&item)
+	//err = o.Raw(sql, classifySort, classifySort, classifyId, source, source).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifySort, classifySort, classifyId, source, source).First(&item).Error
 	return
 }
 
 // EditExcelInfoImage 修改excel表格的图片
 func EditExcelInfoImage(excelInfoId int, imageUrl string) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 
 	sql := ` UPDATE  excel_info SET excel_image=?, modify_time = NOW() WHERE excel_info_id = ? AND is_delete=0 `
-	_, err = o.Raw(sql, imageUrl, excelInfoId).Exec()
+	//_, err = o.Raw(sql, imageUrl, excelInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, imageUrl, excelInfoId).Error
 	if err != nil {
 		fmt.Println("EditExcelInfoImage Err:", err.Error())
 		return err
@@ -260,35 +285,39 @@ func EditExcelInfoImage(excelInfoId int, imageUrl string) (err error) {
 
 // GetExcelInfoByUniqueCode 根据unique_code来获取excel表格详情
 func GetExcelInfoByUniqueCode(uniqueCode string) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE unique_code=? AND is_delete=0 `
-	err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	//err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, uniqueCode).First(&item).Error
 	return
 }
 
 // GetFirstExcelInfoByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
 func GetFirstExcelInfoByClassifyId(classifyId int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_classify_id=? AND is_delete=0 order by sort asc,excel_info_id desc limit 1`
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
 // UpdateExcelInfoSortByClassifyId 根据表格id更新排序
 func UpdateExcelInfoSortByClassifyId(classifyId, nowSort, prevExcelInfoId int, updateSort string, source int) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` update excel_info set sort = ` + updateSort + ` WHERE excel_classify_id=? AND source=? AND is_delete=0 AND ( sort > ? `
 	// todo 前一个兄弟节点后移
 	if prevExcelInfoId > 0 {
 		sql += ` or (excel_info_id < ` + fmt.Sprint(prevExcelInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
 	}
 	sql += `)`
-	_, err = o.Raw(sql, classifyId, source, nowSort).Exec()
+	//_, err = o.Raw(sql, classifyId, source, nowSort).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, classifyId, source, nowSort).Error
 	return
 }
 
 type ExcelInfoView struct {
-	ExcelInfoId       int    `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId       int    `orm:"column(excel_info_id);pk"`
+	ExcelInfoId       int    `gorm:"column:excel_info_id;primaryKey"`
 	ExcelName         string `description:"来源名称"`
 	ExcelClassifyId   int    `description:"表格分类id"`
 	ExcelClassifyName string `description:"表格名称"`
@@ -321,15 +350,16 @@ type ExcelInfoView struct {
 
 // GetExcelInfoByClassifyIdAndName 根据分类id和表格名获取表格信息
 func GetExcelInfoByClassifyIdAndName(classifyId int, excelName string) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_classify_id = ? and excel_name=? AND is_delete=0 `
-	err = o.Raw(sql, classifyId, excelName).QueryRow(&item)
+	//err = o.Raw(sql, classifyId, excelName).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId, excelName).First(&item).Error
 	return
 }
 
 // GetNoContentExcelListByCondition 获取没有content的excel表格列表数据
 func GetNoContentExcelListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission
 FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
@@ -337,76 +367,84 @@ FROM excel_info WHERE 1=1 AND is_delete=0 `
 	}
 	//sql += " ORDER BY sort ASC,chart_info_id DESC LIMIT ?,? "
 	sql += " ORDER BY create_time DESC LIMIT ?,? "
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	pars = append(pars, pageSize, startSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 func GetExcelListCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 // GetExcelViewInfoByExcelInfoId 根据excelInfoId 获取ETA表格详情
 func GetExcelViewInfoByExcelInfoId(excelInfoId int) (item *MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission FROM excel_info WHERE excel_info_id = ? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 // GetExcelInfoCountByClassifyId 根据分类id获取名下表格数量
 func GetExcelInfoCountByClassifyId(classifyId int) (total int64, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT count(1) total FROM excel_info WHERE excel_classify_id = ? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&total)
+	//err = o.Raw(sql, classifyId).QueryRow(&total)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).Count(&total).Error
 	return
 }
 
 // UpdateExcelInfoClassifyId 更改表格分类
 func UpdateExcelInfoClassifyId(classifyId, excelInfoId int) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` update excel_info set excel_classify_id = ? WHERE excel_info_id=? `
-	_, err = o.Raw(sql, classifyId, excelInfoId).Exec()
-
+	//_, err = o.Raw(sql, classifyId, excelInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, classifyId, excelInfoId).Error
 	return
 }
 
 // GetNoContentExcelInfoByName 根据名称 获取eta表格详情
 func GetNoContentExcelInfoByName(excelName string, source int) (item *MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission 
  FROM excel_info WHERE excel_name = ? AND source = ? AND is_delete=0 `
-	err = o.Raw(sql, excelName, source).QueryRow(&item)
-
+	//err = o.Raw(sql, excelName, source).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelName, source).First(&item).Error
 	return
 }
 
 // GetNoContentExcelInfoByUniqueCode 根据unique_code来获取excel表格详情
 func GetNoContentExcelInfoByUniqueCode(uniqueCode string) (item *MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission 
  FROM excel_info WHERE unique_code=? AND is_delete=0 `
-	err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	//err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, uniqueCode).First(&item).Error
 	return
 }
 
 // GetNoContentExcelInfoByExcelId 根据表格id来获取excel表格详情
 func GetNoContentExcelInfoByExcelId(excelInfoId int) (item *MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,source,excel_type,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time,is_join_permission 
  FROM excel_info WHERE excel_info_id=? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 // AddExcelInfoAndSheet 新增excel
 func AddExcelInfoAndSheet(excelInfo *ExcelInfo, sheetParamsList []AddExcelSheetParams) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -419,11 +457,15 @@ func AddExcelInfoAndSheet(excelInfo *ExcelInfo, sheetParamsList []AddExcelSheetP
 	}()
 
 	// 表格信息入库
-	lastId, err := o.Insert(excelInfo)
+	//lastId, err := o.Insert(excelInfo)
+	//if err != nil {
+	//	return
+	//}
+	//excelInfo.ExcelInfoId = int(lastId)
+	err = o.Create(&excelInfo).Error
 	if err != nil {
 		return
 	}
-	excelInfo.ExcelInfoId = int(lastId)
 
 	// sheet信息入库
 	for _, sheetInfo := range sheetParamsList {
@@ -442,12 +484,13 @@ func AddExcelInfoAndSheet(excelInfo *ExcelInfo, sheetParamsList []AddExcelSheetP
 			ModifyTime:   time.Now(),
 			CreateTime:   time.Now(),
 		}
-		sheetId, tmpErr := o.Insert(excelSheetInfo)
+		//sheetId, tmpErr := o.Insert(excelSheetInfo)
+		tmpErr := o.Create(&excelSheetInfo).Error
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
-		excelSheetInfo.ExcelSheetId = int(sheetId)
+		//excelSheetInfo.ExcelSheetId = int(sheetId)
 
 		// data信息入库
 		if dataNum > 0 {
@@ -455,7 +498,8 @@ func AddExcelInfoAndSheet(excelInfo *ExcelInfo, sheetParamsList []AddExcelSheetP
 				sheetInfo.DataList[k].ExcelSheetId = excelSheetInfo.ExcelSheetId
 				sheetInfo.DataList[k].ExcelInfoId = excelSheetInfo.ExcelInfoId
 			}
-			_, tmpErr = o.InsertMulti(dataNum, sheetInfo.DataList)
+			//_, tmpErr = o.InsertMulti(dataNum, sheetInfo.DataList)
+			tmpErr = o.CreateInBatches(sheetInfo.DataList, dataNum).Error
 			if tmpErr != nil {
 				err = tmpErr
 				return
@@ -468,7 +512,8 @@ func AddExcelInfoAndSheet(excelInfo *ExcelInfo, sheetParamsList []AddExcelSheetP
 
 // SaveExcelInfoAndSheet 编辑保存
 func SaveExcelInfoAndSheet(excelInfo *ExcelInfo, updateExcelInfoParam []string, sheetParamsList []AddExcelSheetParams) (err error) {
-	o, err := orm.NewOrmUsingDB("data").Begin()
+	//o, err := orm.NewOrmUsingDB("data").Begin()
+	o := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
@@ -481,21 +526,24 @@ func SaveExcelInfoAndSheet(excelInfo *ExcelInfo, updateExcelInfoParam []string,
 	}()
 
 	// 表格信息入库
-	_, err = o.Update(excelInfo, updateExcelInfoParam...)
+	//_, err = o.Update(excelInfo, updateExcelInfoParam...)
+	err = o.Model(&excelInfo).Select(updateExcelInfoParam).Updates(&excelInfo).Error
 	if err != nil {
 		return
 	}
 
 	// 先删除历史的sheet信息
 	sql := `DELETE FROM excel_sheet WHERE excel_info_id = ?`
-	_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+	//_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+	err = o.Exec(sql, excelInfo.ExcelInfoId).Error
 	if err != nil {
 		return
 	}
 
 	// 再删除历史sheet中的cell data信息
 	sql = `DELETE FROM excel_sheet_data WHERE excel_info_id = ?`
-	_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+	//_, err = o.Raw(sql, excelInfo.ExcelInfoId).Exec()
+	err = o.Exec(sql, excelInfo.ExcelInfoId).Error
 	if err != nil {
 		return
 	}
@@ -517,12 +565,13 @@ func SaveExcelInfoAndSheet(excelInfo *ExcelInfo, updateExcelInfoParam []string,
 			ModifyTime:   time.Now(),
 			CreateTime:   time.Now(),
 		}
-		sheetId, tmpErr := o.Insert(excelSheetInfo)
+		//sheetId, tmpErr := o.Insert(excelSheetInfo)
+		tmpErr := o.Create(&excelSheetInfo).Error
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
-		excelSheetInfo.ExcelSheetId = int(sheetId)
+		//excelSheetInfo.ExcelSheetId = int(sheetId)
 
 		// data信息入库
 		if dataNum > 0 {
@@ -530,7 +579,8 @@ func SaveExcelInfoAndSheet(excelInfo *ExcelInfo, updateExcelInfoParam []string,
 				sheetInfo.DataList[k].ExcelSheetId = excelSheetInfo.ExcelSheetId
 				sheetInfo.DataList[k].ExcelInfoId = excelSheetInfo.ExcelInfoId
 			}
-			_, tmpErr = o.InsertMulti(dataNum, sheetInfo.DataList)
+			//_, tmpErr = o.InsertMulti(dataNum, sheetInfo.DataList)
+			tmpErr = o.CreateInBatches(sheetInfo.DataList, dataNum).Error
 			if tmpErr != nil {
 				err = tmpErr
 				return
@@ -551,9 +601,10 @@ type BatchRefreshExcelReq struct {
 
 // GetExcelMaxSortByClassifyId 获取当前分类下,且排序数最大的excel
 func GetExcelMaxSortByClassifyId(classifyId int, source int) (sort int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT Max(sort) AS sort FROM excel_info WHERE excel_classify_id=? AND source = ? AND is_delete=0 order by sort desc,excel_info_id desc limit 1`
-	err = o.Raw(sql, classifyId, source).QueryRow(&sort)
+	//err = o.Raw(sql, classifyId, source).QueryRow(&sort)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId, source).Scan(&sort).Error
 	return
 }
 
@@ -567,10 +618,11 @@ func GetNoContentExcelListByExcelInfoIdList(excelInfoIdList []string) (items []*
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
-	_, err = o.Raw(sql, excelInfoIdList).QueryRows(&items)
-
+	//o := orm.NewOrmUsingDB("data")
+	//sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
+	//_, err = o.Raw(sql, excelInfoIdList).QueryRows(&items)
+	sql := ` SELECT * FROM excel_info WHERE excel_info_id in ? order by excel_info_id DESC `
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoIdList).Find(&items).Error
 	return
 }
 
@@ -584,10 +636,11 @@ func GetNoContentExcelListByUserId(userIdList []int) (items []*MyExcelInfoList,
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
-	_, err = o.Raw(sql, userIdList).QueryRows(&items)
-
+	//o := orm.NewOrmUsingDB("data")
+	//sql := ` SELECT * FROM excel_info WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) order by excel_info_id DESC `
+	//_, err = o.Raw(sql, userIdList).QueryRows(&items)
+	sql := ` SELECT * FROM excel_info WHERE excel_info_id in ? order by excel_info_id DESC `
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, userIdList).Find(&items).Error
 	return
 }
 
@@ -604,9 +657,11 @@ func ModifyExcelInfoUserIdByCodeList(excelIdList []string, userId int, userName
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) `
-	_, err = o.Raw(sql, userId, userName, excelIdList).Exec()
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE excel_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE excel_info_id in ? `
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, userId, userName, excelIdList).Error
+	//_, err = o.Raw(sql, userId, userName, excelIdList).Exec()
 	return
 }
 
@@ -623,15 +678,18 @@ func ModifyExcelInfoUserIdByOldUserId(oldUserIdList []int, userId int, userName
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE is_delete=0 AND sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
-	_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+	//o := orm.NewOrmUsingDB("data")
+	//sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE is_delete=0 AND sys_user_id in (` + utils.GetOrmInReplace(num) + `) `
+	sql := `UPDATE excel_info SET sys_user_id=?,sys_user_real_name=? WHERE is_delete=0 AND sys_user_id in ?`
+	//_, err = o.Raw(sql, userId, userName, oldUserIdList).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, userId, userName, oldUserIdList).Error
 	return
 }
 
 // ExcelInfoDetail excel表格详情(前端使用)
 type ExcelInfoDetail struct {
-	ExcelInfoId     int         `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId     int         `orm:"column(excel_info_id);pk"`
+	ExcelInfoId     int         `gorm:"column:excel_info_id;primaryKey"`
 	Source          int         `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
 	ExcelType       int         `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName       string      `description:"表格名称"`

+ 24 - 16
models/data_manage/excel/excel_sheet.go

@@ -1,13 +1,15 @@
 package excel
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // ExcelSheet excel表格详情表
 type ExcelSheet struct {
-	ExcelSheetId int       `orm:"column(excel_sheet_id);pk"`
+	//ExcelSheetId int       `orm:"column(excel_sheet_id);pk"`
+	ExcelSheetId int       `gorm:"column:excel_sheet_id;primaryKey"`
 	ExcelInfoId  int       `description:"excel的id"`
 	SheetName    string    `description:"sheet名称"`
 	PageNum      int       `description:"总页码数"`
@@ -21,38 +23,41 @@ type ExcelSheet struct {
 
 // Update 更新 excel表格的sheet基础信息
 func (excelSheet *ExcelSheet) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(excelSheet, cols...)
-
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(excelSheet, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&excelSheet).Select(cols).Updates(&excelSheet).Error
 	return
 }
 
 // AddExcelSheet 新增excel表格的sheet基础信息
 func AddExcelSheet(excelInfo *ExcelSheet) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	// 表格信息入库
-	lastId, err := o.Insert(excelInfo)
+	//lastId, err := o.Insert(excelInfo)
+	err = global.DbMap[utils.DbNameIndex].Create(&excelInfo).Error
 	if err != nil {
 		return
 	}
-	excelInfo.ExcelInfoId = int(lastId)
+	//excelInfo.ExcelInfoId = int(lastId)
 
 	return
 }
 
 // GetAllSheetList 根据excel_id获取所有的sheet
 func GetAllSheetList(excelInfoId int) (item []*ExcelSheet, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
 FROM excel_sheet WHERE 1=1 AND excel_info_id = ? `
 	sql += " ORDER BY sort asc "
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&item).Error
 	return
 }
 
 // SheetItem excel表格详情表
 type SheetItem struct {
-	ExcelSheetId int             `orm:"column(excel_sheet_id);pk" json:"-"`
+	//ExcelSheetId int             `orm:"column(excel_sheet_id);pk" json:"-"`
+	ExcelSheetId int             `gorm:"column:excel_sheet_id;primaryKey" json:"-"`
 	ExcelInfoId  int             `description:"excel的id"  json:"-"`
 	SheetName    string          `description:"sheet名称"`
 	PageNum      int             `description:"数据总页码数"`
@@ -67,27 +72,30 @@ type SheetItem struct {
 
 // GetAllSheetItemList 根据excel_id获取所有的sheet详情
 func GetAllSheetItemList(excelInfoId int) (item []*SheetItem, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
 FROM excel_sheet WHERE 1=1 AND excel_info_id = ? `
 	sql += " ORDER BY sort asc "
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&item).Error
 	return
 }
 
 // GetAllNoConfigSheetItemList 根据excel_id获取所有的sheet详情
 func GetAllNoConfigSheetItemList(excelInfoId int) (item []*SheetItem, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_sheet_id,excel_info_id,sheet_name,sort,page_num,create_time
 FROM excel_sheet WHERE 1=1 AND excel_info_id = ? `
 	sql += " ORDER BY sort asc "
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&item).Error
 	return
 }
 
 // AddExcelSheetParams excel表格详情表
 type AddExcelSheetParams struct {
-	ExcelSheetId int               `orm:"column(excel_sheet_id);pk"`
+	//ExcelSheetId int               `orm:"column(excel_sheet_id);pk"`
+	ExcelSheetId int               `gorm:"column:excel_sheet_id;primaryKey"`
 	ExcelInfoId  int               `description:"excel的id"`
 	SheetName    string            `description:"sheet名称"`
 	Index        string            `description:"excel数据中的index"`

+ 19 - 15
models/data_manage/excel/excel_sheet_data.go

@@ -1,14 +1,15 @@
 package excel
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ExcelSheetData excel表格详情表
 type ExcelSheetData struct {
-	ExcelDataId  int       `orm:"column(excel_data_id);pk"`
+	//ExcelDataId  int       `orm:"column(excel_data_id);pk"`
+	ExcelDataId  int       `gorm:"column:excel_data_id;primaryKey"`
 	ExcelInfoId  int       `description:"数据归属的excel_info的id"`
 	ExcelSheetId int       `description:"数据归属sheet"`
 	Sort         int       `description:"数据排序"`
@@ -19,21 +20,22 @@ type ExcelSheetData struct {
 
 // Update 更新 excel表格的sheet基础信息
 func (ExcelSheetData *ExcelSheetData) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(ExcelSheetData, cols...)
-
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(ExcelSheetData, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&ExcelSheetData).Select(cols).Updates(&ExcelSheetData).Error
 	return
 }
 
 // AddExcelSheetData 新增excel表格的sheet基础信息
 func AddExcelSheetData(excelInfo *ExcelSheetData) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	// 表格信息入库
-	lastId, err := o.Insert(excelInfo)
+	//lastId, err := o.Insert(excelInfo)
+	err = global.DbMap[utils.DbNameIndex].Create(&excelInfo).Error
 	if err != nil {
 		return
 	}
-	excelInfo.ExcelInfoId = int(lastId)
+	//excelInfo.ExcelInfoId = int(lastId)
 
 	return
 }
@@ -44,20 +46,22 @@ func GetSheetDataListBySheetIdListAndPage(excelSheetIdList []int, page int) (ite
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
+	//	sql := ` SELECT *
+	//FROM excel_sheet_data WHERE 1=1 AND excel_sheet_id in (` + utils.GetOrmInReplace(num) + `) AND sort = ? `
 	sql := ` SELECT *
-FROM excel_sheet_data WHERE 1=1 AND excel_sheet_id in (` + utils.GetOrmInReplace(num) + `) AND sort = ? `
-	_, err = o.Raw(sql, excelSheetIdList, page).QueryRows(&items)
-
+FROM excel_sheet_data WHERE 1=1 AND excel_sheet_id in ? AND sort = ? `
+	//_, err = o.Raw(sql, excelSheetIdList, page).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelSheetIdList, page).Find(&items).Error
 	return
 }
 
 // GetAllSheetDataListByExcelInfoId 根据表格id获取所有的sheet的所有数据详情
 func GetAllSheetDataListByExcelInfoId(excelInfoId int) (items []*ExcelSheetData, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *
 FROM excel_sheet_data WHERE 1=1 AND excel_info_id = ? ORDER BY sort ASC `
-	_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
-
+	//_, err = o.Raw(sql, excelInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).Find(&items).Error
 	return
 }

+ 66 - 46
models/data_manage/factor_edb_series.go

@@ -2,9 +2,9 @@ package data_manage
 
 import (
 	"encoding/json"
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
@@ -17,7 +17,8 @@ const (
 
 // FactorEdbSeries 因子指标系列表
 type FactorEdbSeries struct {
-	FactorEdbSeriesId int       `orm:"column(factor_edb_series_id);pk"`
+	//FactorEdbSeriesId int       `orm:"column(factor_edb_series_id);pk"`
+	FactorEdbSeriesId int       `gorm:"column:factor_edb_series_id;primaryKey"`
 	SeriesName        string    `description:"系列名称"`
 	EdbInfoType       int       `description:"关联指标类型:0-普通指标;1-预测指标"`
 	CalculateStep     string    `description:"计算步骤-JSON"`
@@ -53,12 +54,13 @@ func (m *FactorEdbSeries) Cols() FactorEdbSeriesCols {
 }
 
 func (m *FactorEdbSeries) Create() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	id, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.FactorEdbSeriesId = int(id)
+	//o := orm.NewOrmUsingDB("data")
+	//id, err := o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
+	//m.FactorEdbSeriesId = int(id)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
 	return
 }
 
@@ -66,21 +68,24 @@ func (m *FactorEdbSeries) CreateMulti(items []*FactorEdbSeries) (err error) {
 	if len(items) == 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.InsertMulti(len(items), items)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DbMap[utils.DbNameIndex].CreateInBatches(items, len(items)).Error
 	return
 }
 
 func (m *FactorEdbSeries) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *FactorEdbSeries) Remove() (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	_, err = o.Raw(sql, m.FactorEdbSeriesId).Exec()
+	//_, err = o.Raw(sql, m.FactorEdbSeriesId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, m.FactorEdbSeriesId).Error
 	return
 }
 
@@ -88,39 +93,44 @@ func (m *FactorEdbSeries) MultiRemove(ids []int) (err error) {
 	if len(ids) == 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
-	_, err = o.Raw(sql, ids).Exec()
+	//o := orm.NewOrmUsingDB("data")
+	//sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	//_, err = o.Raw(sql, ids).Exec()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, ids).Error
 	return
 }
 
 func (m *FactorEdbSeries) GetItemById(id int) (item *FactorEdbSeries, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }
 
 func (m *FactorEdbSeries) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *FactorEdbSeries, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	order := ``
 	if orderRule != "" {
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
-	err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
+	//err = o.Raw(sql, pars).QueryRow(&item)
 	return
 }
 
 func (m *FactorEdbSeries) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func (m *FactorEdbSeries) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*FactorEdbSeries, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -130,12 +140,13 @@ func (m *FactorEdbSeries) GetItemsByCondition(condition string, pars []interface
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
 func (m *FactorEdbSeries) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*FactorEdbSeries, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -145,7 +156,9 @@ func (m *FactorEdbSeries) GetPageItemsByCondition(condition string, pars []inter
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -190,12 +203,13 @@ func (m *FactorEdbSeries) CreateSeriesAndMapping(item *FactorEdbSeries, mappings
 		err = fmt.Errorf("series is nil")
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	tx, e := o.Begin()
-	if e != nil {
-		err = fmt.Errorf("orm begin err: %v", e)
-		return
-	}
+	//o := orm.NewOrmUsingDB("data")
+	//tx, e := o.Begin()
+	tx := global.DbMap[utils.DbNameIndex].Begin()
+	//if e != nil {
+	//	err = fmt.Errorf("orm begin err: %v", e)
+	//	return
+	//}
 	defer func() {
 		if err != nil {
 			_ = tx.Rollback()
@@ -204,19 +218,21 @@ func (m *FactorEdbSeries) CreateSeriesAndMapping(item *FactorEdbSeries, mappings
 		_ = tx.Commit()
 	}()
 
-	id, e := tx.Insert(item)
+	//id, e := tx.Insert(item)
+	e := tx.Create(&item).Error
 	if e != nil {
 		err = fmt.Errorf("insert series err: %v", e)
 		return
 	}
-	seriesId = int(id)
-	item.FactorEdbSeriesId = seriesId
+	//seriesId = int(id)
+	//item.FactorEdbSeriesId = seriesId
 
 	if len(mappings) > 0 {
 		for _, v := range mappings {
 			v.FactorEdbSeriesId = seriesId
 		}
-		_, e = tx.InsertMulti(200, mappings)
+		e = tx.CreateInBatches(mappings, 200).Error
+		//_, e = tx.InsertMulti(200, mappings)
 		if e != nil {
 			err = fmt.Errorf("insert multi mapping err: %v", e)
 			return
@@ -231,12 +247,13 @@ func (m *FactorEdbSeries) EditSeriesAndMapping(item *FactorEdbSeries, mappings [
 		err = fmt.Errorf("series is nil")
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	tx, e := o.Begin()
-	if e != nil {
-		err = fmt.Errorf("orm begin err: %v", e)
-		return
-	}
+	//o := orm.NewOrmUsingDB("data")
+	//tx, e := o.Begin()
+	//if e != nil {
+	//	err = fmt.Errorf("orm begin err: %v", e)
+	//	return
+	//}
+	tx := global.DbMap[utils.DbNameIndex].Begin()
 	defer func() {
 		if err != nil {
 			_ = tx.Rollback()
@@ -245,7 +262,8 @@ func (m *FactorEdbSeries) EditSeriesAndMapping(item *FactorEdbSeries, mappings [
 		_ = tx.Commit()
 	}()
 
-	_, e = tx.Update(item, updateCols...)
+	//_, e = tx.Update(item, updateCols...)
+	e := tx.Model(&item).Select(updateCols).Updates(&item).Error
 	if e != nil {
 		err = fmt.Errorf("update series err: %v", e)
 		return
@@ -257,7 +275,8 @@ func (m *FactorEdbSeries) EditSeriesAndMapping(item *FactorEdbSeries, mappings [
 	pars := make([]interface{}, 0)
 	pars = append(pars, item.FactorEdbSeriesId)
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, mappingOb.TableName(), cond)
-	_, e = tx.Raw(sql, pars).Exec()
+	//_, e = tx.Raw(sql, pars).Exec()
+	e = tx.Exec(sql, pars...).Error
 	if e != nil {
 		err = fmt.Errorf("remove mapping err: %v", e)
 		return
@@ -267,7 +286,8 @@ func (m *FactorEdbSeries) EditSeriesAndMapping(item *FactorEdbSeries, mappings [
 		for _, v := range mappings {
 			v.FactorEdbSeriesId = item.FactorEdbSeriesId
 		}
-		_, e = tx.InsertMulti(200, mappings)
+		//_, e = tx.InsertMulti(200, mappings)
+		e = tx.CreateInBatches(mappings, 200).Error
 		if e != nil {
 			err = fmt.Errorf("insert multi mapping err: %v", e)
 			return

+ 51 - 29
models/data_manage/factor_edb_series_chart_mapping.go

@@ -1,9 +1,9 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
@@ -14,7 +14,8 @@ const (
 
 // FactorEdbSeriesChartMapping 因子指标系列-图表关联
 type FactorEdbSeriesChartMapping struct {
-	FactorEdbSeriesChartMappingId int       `orm:"column(factor_edb_series_chart_mapping_id);pk"`
+	//FactorEdbSeriesChartMappingId int       `orm:"column(factor_edb_series_chart_mapping_id);pk"`
+	FactorEdbSeriesChartMappingId int       `gorm:"column:factor_edb_series_chart_mapping_id;primaryKey"`
 	ChartInfoId                   int       `description:"图表ID"`
 	Source                        int       `description:"图表来源, 同chart_info表source"`
 	CalculateType                 int       `description:"计算方式: 1-相关性"`
@@ -62,12 +63,13 @@ func (m *FactorEdbSeriesChartMapping) Cols() MultipleFactorSeriesChartMappingCol
 }
 
 func (m *FactorEdbSeriesChartMapping) Create() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	id, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.FactorEdbSeriesChartMappingId = int(id)
+	//o := orm.NewOrmUsingDB("data")
+	//id, err := o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
+	//m.FactorEdbSeriesChartMappingId = int(id)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
 	return
 }
 
@@ -75,21 +77,24 @@ func (m *FactorEdbSeriesChartMapping) CreateMulti(items []*FactorEdbSeriesChartM
 	if len(items) == 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.InsertMulti(len(items), items)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DbMap[utils.DbNameIndex].CreateInBatches(items, len(items)).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) Remove() (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	_, err = o.Raw(sql, m.FactorEdbSeriesChartMappingId).Exec()
+	//_, err = o.Raw(sql, m.FactorEdbSeriesChartMappingId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, m.FactorEdbSeriesChartMappingId).Error
 	return
 }
 
@@ -97,39 +102,44 @@ func (m *FactorEdbSeriesChartMapping) MultiRemove(ids []int) (err error) {
 	if len(ids) == 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
-	_, err = o.Raw(sql, ids).Exec()
+	//o := orm.NewOrmUsingDB("data")
+	//sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	//_, err = o.Raw(sql, ids).Exec()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, ids).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) GetItemById(id int) (item *FactorEdbSeriesChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *FactorEdbSeriesChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	order := ``
 	if orderRule != "" {
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*FactorEdbSeriesChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -139,12 +149,13 @@ func (m *FactorEdbSeriesChartMapping) GetItemsByCondition(condition string, pars
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 func (m *FactorEdbSeriesChartMapping) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*FactorEdbSeriesChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -154,14 +165,25 @@ func (m *FactorEdbSeriesChartMapping) GetPageItemsByCondition(condition string,
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 // GetDistinctSeriesIdByChartId 获取图表关联的系列ID
 func (m *FactorEdbSeriesChartMapping) GetDistinctSeriesIdByChartId(chartId int) (seriesIds []int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT DISTINCT %s FROM %s WHERE %s = ?`, m.Cols().FactorEdbSeriesId, m.TableName(), m.Cols().ChartInfoId)
-	_, err = o.Raw(sql, chartId).QueryRows(&seriesIds)
+	//_, err = o.Raw(sql, chartId).QueryRows(&seriesIds)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartId).Scan(&seriesIds).Error
+	return
+}
+
+func (m *FactorEdbSeriesChartMapping) GetItemByChartInfoId(id int) (item *FactorEdbSeriesChartMapping, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().ChartInfoId)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }

+ 46 - 31
models/data_manage/factor_edb_series_mapping.go

@@ -1,16 +1,17 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
 
 // FactorEdbSeriesMapping 因子指标系列-指标关联表
 type FactorEdbSeriesMapping struct {
-	FactorEdbSeriesMappingId int       `orm:"column(factor_edb_series_mapping_id);pk"`
+	//FactorEdbSeriesMappingId int       `orm:"column(factor_edb_series_mapping_id);pk"`
+	FactorEdbSeriesMappingId int       `gorm:"column:factor_edb_series_mapping_id;primaryKey"`
 	FactorEdbSeriesId        int       `description:"因子指标系列ID"`
 	EdbInfoId                int       `description:"指标ID"`
 	EdbCode                  string    `description:"指标编码"`
@@ -43,12 +44,13 @@ func (m *FactorEdbSeriesMapping) Cols() FactorEdbSeriesMappingCols {
 }
 
 func (m *FactorEdbSeriesMapping) Create() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	id, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.FactorEdbSeriesMappingId = int(id)
+	//o := orm.NewOrmUsingDB("data")
+	//id, err := o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
+	//m.FactorEdbSeriesMappingId = int(id)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
 	return
 }
 
@@ -56,21 +58,24 @@ func (m *FactorEdbSeriesMapping) CreateMulti(items []*FactorEdbSeriesMapping) (e
 	if len(items) == 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.InsertMulti(len(items), items)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DbMap[utils.DbNameIndex].CreateInBatches(items, len(items)).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) Remove() (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	_, err = o.Raw(sql, m.FactorEdbSeriesMappingId).Exec()
+	//_, err = o.Raw(sql, m.FactorEdbSeriesMappingId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, m.FactorEdbSeriesMappingId).Error
 	return
 }
 
@@ -78,9 +83,11 @@ func (m *FactorEdbSeriesMapping) MultiRemove(ids []int) (err error) {
 	if len(ids) == 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
-	_, err = o.Raw(sql, ids).Exec()
+	//o := orm.NewOrmUsingDB("data")
+	//sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	//_, err = o.Raw(sql, ids).Exec()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, ids).Error
 	return
 }
 
@@ -88,39 +95,43 @@ func (m *FactorEdbSeriesMapping) RemoveByCondition(condition string, pars []inte
 	if condition == "" {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
-	_, err = o.Raw(sql, pars).Exec()
+	//_, err = o.Raw(sql, pars).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, pars...).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) GetItemById(id int) (item *FactorEdbSeriesMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *FactorEdbSeriesMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	order := ``
 	if orderRule != "" {
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*FactorEdbSeriesMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -130,12 +141,13 @@ func (m *FactorEdbSeriesMapping) GetItemsByCondition(condition string, pars []in
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 func (m *FactorEdbSeriesMapping) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*FactorEdbSeriesMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -145,7 +157,9 @@ func (m *FactorEdbSeriesMapping) GetPageItemsByCondition(condition string, pars
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -199,12 +213,13 @@ func (m *FactorEdbSeriesMapping) Format2Item() (item *FactorEdbSeriesMappingItem
 
 // GetChartUsedFactorSeriesEdb 获取图表引用的系列指标
 func GetChartUsedFactorSeriesEdb(chartId int) (items []*FactorEdbSeriesMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	chartOb := new(FactorEdbSeriesChartMapping)
 	edbOb := new(FactorEdbSeriesMapping)
 	sql := fmt.Sprintf(`SELECT b.* FROM %s AS a
 	JOIN %s AS b ON a.%s = b.%s AND a.%s = b.%s
 	WHERE a.%s = ? ORDER BY %s ASC`, chartOb.TableName(), edbOb.TableName(), chartOb.Cols().FactorEdbSeriesId, edbOb.Cols().FactorEdbSeriesId, chartOb.Cols().EdbInfoId, edbOb.Cols().EdbInfoId, chartOb.Cols().ChartInfoId, edbOb.Cols().FactorEdbSeriesId)
-	_, err = o.Raw(sql, chartId).QueryRows(&items)
+	//_, err = o.Raw(sql, chartId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartId).Find(&items).Error
 	return
 }

+ 25 - 17
models/data_manage/future_good/chart_info_future_good_profit.go

@@ -1,15 +1,17 @@
 package future_good
 
 import (
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
 
 // ChartInfoFutureGoodProfit 商品利润图表-扩展信息
 type ChartInfoFutureGoodProfit struct {
-	ChartInfoId  int       `orm:"column(chart_info_id);pk" description:"商品利润图表ID(chart_info表source=5的)"`
+	//ChartInfoId  int       `orm:"column(chart_info_id);pk" description:"商品利润图表ID(chart_info表source=5的)"`
+	ChartInfoId  int       `gorm:"column:chart_info_id;primaryKey" description:"商品利润图表ID(chart_info表source=5的)"`
 	ProfitName   string    `description:"利润名称"`
 	ProfitNameEn string    `description:"利润英文名称"`
 	XValue       string    `description:"X轴数据值"`
@@ -36,44 +38,49 @@ func (m *ChartInfoFutureGoodProfit) TableName() string {
 }
 
 func (m *ChartInfoFutureGoodProfit) Create() (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Insert(m)
-	if err != nil {
-		return
-	}
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
 	//m.CorrelationChartInfoId = int(id)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
 	return
 }
 
 func (m *ChartInfoFutureGoodProfit) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *ChartInfoFutureGoodProfit) Delete() (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE chart_info_id = ? LIMIT 1`, m.TableName())
-	_, err = o.Raw(sql, m.ChartInfoId).Exec()
+	//_, err = o.Raw(sql, m.ChartInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, m.ChartInfoId).Error
 	return
 }
 
 func (m *ChartInfoFutureGoodProfit) GetItemById(id int) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE chart_info_id = ? LIMIT 1`, m.TableName())
-	err = o.Raw(sql, id).QueryRow(&m)
+	//err = o.Raw(sql, id).QueryRow(&m)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&m).Error
 	return
 }
 
 func (m *ChartInfoFutureGoodProfit) GetItemByCondition(condition string, pars []interface{}) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&m)
+	//err = o.Raw(sql, pars).QueryRow(&m)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&m).Error
 	return
 }
 
 func (m *ChartInfoFutureGoodProfit) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ChartInfoFutureGoodProfit, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -83,6 +90,7 @@ func (m *ChartInfoFutureGoodProfit) GetItemsByCondition(condition string, pars [
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }

+ 54 - 33
models/data_manage/future_good/future_good_chart_classify.go

@@ -1,14 +1,16 @@
 package future_good
 
 import (
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // FutureGoodChartClassify future_good_chart表格分类
 type FutureGoodChartClassify struct {
-	FutureGoodChartClassifyId   int       `orm:"column(future_good_chart_classify_id);pk"`
+	//FutureGoodChartClassifyId   int       `orm:"column(future_good_chart_classify_id);pk"`
+	FutureGoodChartClassifyId   int       `gorm:"column:future_good_chart_classify_id;primaryKey"`
 	FutureGoodChartClassifyName string    `description:"分类名称"`
 	ParentId                    int       `description:"父级id"`
 	SysUserId                   int       `description:"创建人id"`
@@ -23,37 +25,46 @@ type FutureGoodChartClassify struct {
 
 // AddFutureGoodChartClassify 添加future_good_chart分类
 func AddFutureGoodChartClassify(item *FutureGoodChartClassify) (lastId int64, err error) {
-	o := orm.NewOrmUsingDB("data")
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrmUsingDB("data")
+	//lastId, err = o.Insert(item)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.FutureGoodChartClassifyId)
 	return
 }
 
 // GetFutureGoodChartClassifyCount 获取同级分类下存在同名分类的数量
 func GetFutureGoodChartClassifyCount(FutureGoodChartClassifyName string, parentId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) AS count FROM future_good_chart_classify WHERE parent_id=? AND future_good_chart_classify_name=? AND is_delete=0 `
-	err = o.Raw(sql, parentId, FutureGoodChartClassifyName).QueryRow(&count)
+	//err = o.Raw(sql, parentId, FutureGoodChartClassifyName).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, FutureGoodChartClassifyName).Scan(&count).Error
 	return
 }
 
 func GetFutureGoodChartClassifyById(classifyId int) (item *FutureGoodChartClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_chart_classify WHERE future_good_chart_classify_id=? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
 func GetFutureGoodChartClassifyByParentId(parentId int) (items []*FutureGoodChartClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM future_good_chart_classify WHERE parent_id=? AND is_delete=0 order by sort asc,future_good_chart_classify_id asc`
-	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	//_, err = o.Raw(sql, parentId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId).Find(&items).Error
 	return
 }
 
 func GetFutureGoodChartClassifyAll() (items []*FutureGoodChartClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM future_good_chart_classify WHERE parent_id<>0 AND is_delete=0 order by sort asc,future_good_chart_classify_id asc`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
 
@@ -72,58 +83,64 @@ type FutureGoodChartClassifyItems struct {
 }
 
 func GetFutureGoodChartClassifyByCondition(condition string, pars []interface{}) (item *FutureGoodChartClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM future_good_chart_classify WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetNextFutureGoodChartClassifyByCondition 获取下一个分类
 func GetNextFutureGoodChartClassifyByCondition(condition string, pars []interface{}) (item *FutureGoodChartClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM future_good_chart_classify WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += " ORDER BY sort asc , create_time ASC LIMIT 1 "
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetFirstFutureGoodChartClassifyByParentId 获取当前父级图表分类下的排序第一条的数据
 func GetFirstFutureGoodChartClassifyByParentId(parentId int) (item *FutureGoodChartClassify, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM future_good_chart_classify WHERE parent_id=? AND is_delete=0 order by sort asc,future_good_chart_classify_id asc limit 1`
-	err = o.Raw(sql, parentId).QueryRow(&item)
+	//err = o.Raw(sql, parentId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId).First(&item).Error
 	return
 }
 
 // UpdateFutureGoodChartClassifySortByParentId 根据图表父类id更新排序
 func UpdateFutureGoodChartClassifySortByParentId(parentId, classifyId, nowSort int, updateSort string) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` update future_good_chart_classify set sort = ` + updateSort + ` WHERE parent_id=? and sort > ? AND is_delete=0 `
 	if classifyId > 0 {
 		sql += ` or ( future_good_chart_classify_id > ` + fmt.Sprint(classifyId) + ` and sort= ` + fmt.Sprint(nowSort) + `)`
 	}
-	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	//_, err = o.Raw(sql, parentId, nowSort).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, parentId, nowSort).Error
 	return
 }
 
 // Update 更新图表分类基础信息
 func (FutureGoodChartClassify *FutureGoodChartClassify) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(FutureGoodChartClassify, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(FutureGoodChartClassify, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&FutureGoodChartClassify).Select(cols).Updates(&FutureGoodChartClassify).Error
 	return
 }
 
 // GetFutureGoodChartClassifyMaxSort 获取图表分类下最大的排序数
 func GetFutureGoodChartClassifyMaxSort(parentId int) (sort int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT Max(sort) AS sort FROM future_good_chart_classify WHERE parent_id=? AND is_delete=0 `
-	err = o.Raw(sql, parentId).QueryRow(&sort)
+	//err = o.Raw(sql, parentId).QueryRow(&sort)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId).Scan(&sort).Error
 	return
 }
 
@@ -134,36 +151,40 @@ type FutureGoodChartClassifyView struct {
 }
 
 func GetFutureGoodChartClassifyViewById(classifyId int) (item *FutureGoodChartClassifyView, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_chart_classify WHERE future_good_chart_classify_id=? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
-//用于分类展示
+// 用于分类展示
 func GetChartInfoAll() (items []*FutureGoodChartClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
              unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
             FROM chart_info ORDER BY sort asc,create_time ASC `
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
 
 // GetNoContentFutureGoodInfoAll 获取不含content的表格列表 用于分类展示
 func GetNoContentFutureGoodInfoAll() (items []FutureGoodChartClassifyItems, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
              unique_code,sys_user_id,sys_user_real_name
             FROM excel_info where is_delete=0 ORDER BY sort asc,create_time desc `
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&items).Error
 	return
 }
 
 // GetFutureGoodChartInfoCountByClassifyId 根据分类id获取名下表格数量
 func GetFutureGoodChartInfoCountByClassifyId(classifyId int) (total int64, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT count(1) total FROM excel_info WHERE excel_classify_id = ? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&total)
+	//err = o.Raw(sql, classifyId).QueryRow(&total)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).Scan(&total).Error
 	return
 }

+ 41 - 22
models/data_manage/future_good/future_good_edb_info.go

@@ -1,13 +1,16 @@
 package future_good
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
+	"gorm.io/gorm"
 	"time"
 )
 
 // FutureGoodEdbInfo 期货指标表
 type FutureGoodEdbInfo struct {
-	FutureGoodEdbInfoId int       `orm:"column(future_good_edb_info_id);pk"`
+	//FutureGoodEdbInfoId int       `orm:"column(future_good_edb_info_id);pk"`
+	FutureGoodEdbInfoId int       `gorm:"column:future_good_edb_info_id;primaryKey"`
 	FutureGoodEdbCode   string    `description:"期货指标code"`
 	FutureGoodEdbName   string    `description:"期货指标名称"`
 	FutureGoodEdbNameEn string    `description:"期货指标英文名称"`
@@ -29,67 +32,82 @@ type FutureGoodEdbInfo struct {
 	ModifyTime          time.Time
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find或者First函数,Scan是不会触发该函数的来获取数据
+func (m *FutureGoodEdbInfo) AfterFind(db *gorm.DB) (err error) {
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+
+	return
+}
+
 // GetFutureGoodEdbInfo 期货指标
 func GetFutureGoodEdbInfo(edbInfoId int) (item *FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_info WHERE future_good_edb_info_id = ? `
 	sql += ` ORDER BY future_good_edb_info_id DESC `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).First(&item).Error
 	return
 }
 
 // GetFutureGoodEdbInfoByCode 根据期货code获取 期货指标信息
 func GetFutureGoodEdbInfoByCode(futureGoodEdbCode string) (item *FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_info WHERE future_good_edb_code = ? `
 	sql += ` ORDER BY future_good_edb_info_id DESC `
-	err = o.Raw(sql, futureGoodEdbCode).QueryRow(&item)
+	//err = o.Raw(sql, futureGoodEdbCode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, futureGoodEdbCode).First(&item).Error
 	return
 }
 
 // GetFutureGoodEdbInfoList 获取指标数据列表
 func GetFutureGoodEdbInfoList(condition string, pars []interface{}) (list []*FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += `ORDER BY future_good_edb_info_id DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 // GetAllFutureGoodEdbInfoList 获取指标数据列表
 func GetAllFutureGoodEdbInfoList() (list []*FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_info  ORDER BY future_good_edb_info_id DESC `
-	_, err = o.Raw(sql).QueryRows(&list)
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql).Find(&list).Error
 	return
 }
 
 // GetFutureGoodEdbInfoListByParentId 根据父级ID获取指标数据列表
 func GetFutureGoodEdbInfoListByParentId(parentId int) (list []*FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_info WHERE parent_id = ? or  future_good_edb_info_id = ? ORDER BY future_good_edb_info_id ASC `
-	_, err = o.Raw(sql, parentId, parentId).QueryRows(&list)
+	//_, err = o.Raw(sql, parentId, parentId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, parentId, parentId).Find(&list).Error
 	return
 }
 
 // AddFutureGoodEdbInfo 添加期货数据库指标
 func AddFutureGoodEdbInfo(item *FutureGoodEdbInfo) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	lastId, err := o.Insert(item)
-	if err != nil {
-		return
-	}
-	item.FutureGoodEdbInfoId = int(lastId)
+	//o := orm.NewOrmUsingDB("data")
+	//lastId, err := o.Insert(item)
+	//if err != nil {
+	//	return
+	//}
+	//item.FutureGoodEdbInfoId = int(lastId)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
 	return
 }
 
 // Update 更新指标基础信息
 func (FutureGoodEdbInfo *FutureGoodEdbInfo) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(FutureGoodEdbInfo, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(FutureGoodEdbInfo, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&FutureGoodEdbInfo).Select(cols).Updates(&FutureGoodEdbInfo).Error
 	return
 }
 
@@ -102,13 +120,14 @@ type FutureGoodEdbInfoGroupListResp struct {
 
 // GetFutureGoodEdbInfoGroupList 获取分組指标数据列表
 func GetFutureGoodEdbInfoGroupList(condition string, pars []interface{}) (list []*FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY future_good_edb_info_id DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
 	return
 }
 

+ 22 - 12
models/data_manage/future_good/future_good_edb_info_data.go

@@ -1,15 +1,16 @@
 package future_good
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
 // FutureGoodEdbData 期货指标数据的表
 type FutureGoodEdbData struct {
-	FutureGoodEdbDataId int       `orm:"column(future_good_edb_data_id);pk"`
+	//FutureGoodEdbDataId int       `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbDataId int       `gorm:"column:future_good_edb_data_id;primaryKey"`
 	FutureGoodEdbInfoId int       `description:"期货指标id"`
 	FutureGoodEdbCode   string    `description:"期货指标code"`
 	DataTime            time.Time `description:"数据日期"`
@@ -35,7 +36,8 @@ type FutureGoodEdbDataListResp struct {
 
 // FutureGoodEdbDataItem 期货指标数据列表数据
 type FutureGoodEdbDataItem struct {
-	FutureGoodEdbDataId int     `orm:"column(future_good_edb_data_id);pk"`
+	//FutureGoodEdbDataId int     `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbDataId int     `gorm:"column:future_good_edb_data_id;primaryKey"`
 	FutureGoodEdbInfoId int     `description:"期货指标id"`
 	FutureGoodEdbCode   string  `description:"期货指标code"`
 	FutureGoodEdbName   string  `description:"期货指标名称"`
@@ -56,24 +58,27 @@ type FutureGoodEdbDataItem struct {
 
 // GetFutureGoodEdbDataListCount 获取期货指标数据汇总数
 func GetFutureGoodEdbDataListCount(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) AS count FROM future_good_edb_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 // GetFutureGoodEdbDataList 获取期货指标数据列表
 func GetFutureGoodEdbDataList(condition string, pars []interface{}, startSize, pageSize int) (list []*FutureGoodEdbDataItem, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += `ORDER BY modify_time DESC LIMIT ?,?`
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
 	return
 }
 
@@ -98,14 +103,17 @@ func GetFutureGoodEdbDataListByDate(futureGoodEdbInfoId int, startDate, endDate
 	}
 
 	sql += ` ORDER BY data_time ASC `
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, futureGoodEdbInfoId, pars).QueryRows(&list)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Raw(sql, futureGoodEdbInfoId, pars).QueryRows(&list)
+	newPars := utils.ForwardPars(pars, futureGoodEdbInfoId)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, newPars...).Find(&list).Error
 	return
 }
 
 func GetFutureGoodEdbDataListByIdsAndDate(futureGoodEdbInfoIds []int, startDate, endDate string) (list []*FutureGoodEdbData, err error) {
 	var pars []interface{}
-	sql := `SELECT * FROM future_good_edb_data WHERE 1=1 AND future_good_edb_info_id in (` + utils.GetOrmInReplace(len(futureGoodEdbInfoIds)) + `)  `
+	//sql := `SELECT * FROM future_good_edb_data WHERE 1=1 AND future_good_edb_info_id in (` + utils.GetOrmInReplace(len(futureGoodEdbInfoIds)) + `)  `
+	sql := `SELECT * FROM future_good_edb_data WHERE 1=1 AND future_good_edb_info_id in ?`
 	if startDate != "" {
 		sql += ` AND data_time>=? `
 		pars = append(pars, startDate)
@@ -116,7 +124,9 @@ func GetFutureGoodEdbDataListByIdsAndDate(futureGoodEdbInfoIds []int, startDate,
 	}
 
 	sql += ` ORDER BY data_time ASC `
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, futureGoodEdbInfoIds, pars).QueryRows(&list)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Raw(sql, futureGoodEdbInfoIds, pars).QueryRows(&list)
+	newPars := utils.ForwardPars(pars, futureGoodEdbInfoIds)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, newPars...).Find(&list).Error
 	return
 }

+ 18 - 13
models/data_manage/multiple_graph_config.go

@@ -1,13 +1,15 @@
 package data_manage
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // MultipleGraphConfig 多图配置表
 type MultipleGraphConfig struct {
-	MultipleGraphConfigId int       `orm:"column(multiple_graph_config_id);pk"`
+	//MultipleGraphConfigId int       `orm:"column(multiple_graph_config_id);pk"`
+	MultipleGraphConfigId int       `gorm:"column:multiple_graph_config_id;primaryKey"`
 	EdbInfoIdA            int       `description:"指标A"`
 	EdbInfoIdB            int       `description:"指标B"`
 	Curve                 string    `description:"曲线图配置"`
@@ -21,29 +23,32 @@ type MultipleGraphConfig struct {
 
 // AddMultipleGraphConfig 新增多图配置
 func AddMultipleGraphConfig(item *MultipleGraphConfig) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	// 表格信息入库
-	lastId, err := o.Insert(item)
-	if err != nil {
-		return
-	}
-	item.MultipleGraphConfigId = int(lastId)
+	//o := orm.NewOrmUsingDB("data")
+	//// 表格信息入库
+	//lastId, err := o.Insert(item)
+	//if err != nil {
+	//	return
+	//}
+	//item.MultipleGraphConfigId = int(lastId)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
 	return
 }
 
 // Update 更新 基础信息
 func (item *MultipleGraphConfig) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(item, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(item, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&item).Select(cols).Updates(&item).Error
 	return
 }
 
 // GetMultipleGraphConfigById 根据配置id获取配置
 func GetMultipleGraphConfigById(id int) (item *MultipleGraphConfig, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM multiple_graph_config WHERE multiple_graph_config_id = ? `
 	// 表格信息入库
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
 	return
 }
 

+ 24 - 20
models/data_manage/multiple_graph_config_chart_mapping.go

@@ -1,13 +1,15 @@
 package data_manage
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // MultipleGraphConfigChartMapping 图表与多图配置的关系表
 type MultipleGraphConfigChartMapping struct {
-	Id                    int       `orm:"column(id);pk"`
+	//Id                    int       `orm:"column(id);pk"`
+	Id                    int       `gorm:"column:id;primaryKey"`
 	MultipleGraphConfigId int       `description:"多图配置id"`
 	ChartInfoId           int       `description:"图表id"`
 	Source                int       `description:"来源,1:曲线图,2:相关性图;3:滚动相关性图1;4:滚动相关性图2;"`
@@ -17,46 +19,48 @@ type MultipleGraphConfigChartMapping struct {
 
 // AddMultipleGraphConfigChartMapping 新增多图配置
 func AddMultipleGraphConfigChartMapping(item *MultipleGraphConfigChartMapping) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	// 表格信息入库
-	lastId, err := o.Insert(item)
-	if err != nil {
-		return
-	}
-	item.Id = int(lastId)
+	//o := orm.NewOrmUsingDB("data")
+	//// 表格信息入库
+	//lastId, err := o.Insert(item)
+	//if err != nil {
+	//	return
+	//}
+	//item.Id = int(lastId)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
 	return
 }
 
 // Update 更新 基础信息
 func (item *MultipleGraphConfigChartMapping) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(item, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(item, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&item).Select(cols).Updates(&item).Error
 	return
 }
 
 // GetMultipleGraphConfigChartMappingByIdAndSource 根据配置id和来源获取关联关系
 func GetMultipleGraphConfigChartMappingByIdAndSource(configId, source int) (item *MultipleGraphConfigChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM multiple_graph_config_chart_mapping WHERE multiple_graph_config_id = ? AND source = ? `
-	err = o.Raw(sql, configId, source).QueryRow(&item)
-
+	//err = o.Raw(sql, configId, source).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, configId, source).First(&item).Error
 	return
 }
 
 // GetMultipleGraphConfigChartMappingByChartId 根据图表id和来源获取关联关系
 func GetMultipleGraphConfigChartMappingByChartId(chartId int) (item *MultipleGraphConfigChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM multiple_graph_config_chart_mapping WHERE chart_info_id = ?  `
-	err = o.Raw(sql, chartId).QueryRow(&item)
-
+	//err = o.Raw(sql, chartId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, chartId).First(&item).Error
 	return
 }
 
 // GetMultipleGraphConfigChartMappingListById 根据配置id获取所有关联关系
 func GetMultipleGraphConfigChartMappingListById(configId int) (items []*MultipleGraphConfigChartMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM multiple_graph_config_chart_mapping WHERE multiple_graph_config_id = ? `
-	_, err = o.Raw(sql, configId).QueryRows(&items)
-
+	//_, err = o.Raw(sql, configId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, configId).Find(&items).Error
 	return
 }

+ 27 - 14
models/data_manage/multiple_graph_config_edb_mapping.go

@@ -1,13 +1,15 @@
 package data_manage
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // MultipleGraphConfigEdbMapping 指标与多图配置的关系表
 type MultipleGraphConfigEdbMapping struct {
-	Id                    int       `orm:"column(id);pk"`
+	//Id                    int       `orm:"column(id);pk"`
+	Id                    int       `gorm:"column:id;primaryKey"`
 	MultipleGraphConfigId int       `description:"多图配置id"`
 	EdbInfoId             int       `description:"指标id"`
 	Source                int       `description:"来源,1:曲线图,2:相关性图;3:滚动相关性图1;4:滚动相关性图2;"`
@@ -17,37 +19,48 @@ type MultipleGraphConfigEdbMapping struct {
 
 // AddMultipleGraphConfigEdbMapping 新增多图配置
 func AddMultipleGraphConfigEdbMapping(item *MultipleGraphConfigEdbMapping) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	// 表格信息入库
-	lastId, err := o.Insert(item)
-	if err != nil {
-		return
-	}
-	item.Id = int(lastId)
+	//lastId, err := o.Insert(item)
+	//if err != nil {
+	//	return
+	//}
+	//item.Id = int(lastId)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
 	return
 }
 
 // Update 更新 基础信息
 func (item *MultipleGraphConfigEdbMapping) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(item, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(item, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&item).Select(cols).Updates(&item).Error
 	return
 }
 
 // GetMultipleGraphConfigEdbMappingByIdAndSource 根据配置id和来源获取关联关系
 func GetMultipleGraphConfigEdbMappingByIdAndSource(configId, source int) (item *MultipleGraphConfigEdbMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM multiple_graph_config_edb_mapping WHERE multiple_graph_config_id = ? AND source = ? `
 	// 表格信息入库
-	err = o.Raw(sql, configId, source).QueryRow(&item)
+	//err = o.Raw(sql, configId, source).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, configId, source).First(&item).Error
 	return
 }
 
 // GetMultipleGraphConfigEdbMappingListById 根据配置id获取所有关联关系
 func GetMultipleGraphConfigEdbMappingListById(configId int) (items []*MultipleGraphConfigEdbMapping, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM multiple_graph_config_edb_mapping WHERE multiple_graph_config_id = ? `
-	_, err = o.Raw(sql, configId).QueryRows(&items)
+	//_, err = o.Raw(sql, configId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, configId).Find(&items).Error
+	return
+}
 
+func GetMultipleGraphConfigEdbMappingListByIdAndSource(configId, source int) (items []*MultipleGraphConfigEdbMapping, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM multiple_graph_config_edb_mapping WHERE multiple_graph_config_id = ? AND source = ? `
+	//_, err = o.Raw(sql, configId, source).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, configId, source).Find(&items).Error
 	return
 }

+ 46 - 28
models/data_manage/predict_edb_conf.go

@@ -1,15 +1,17 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/services/alarm_msg"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 type PredictEdbConf struct {
-	ConfigId         int       `orm:"column(config_id);pk" description:"规则id"`
-	PredictEdbInfoId int       `orm:"column(predict_edb_info_id)" description:"预测指标id"`
+	//ConfigId         int       `orm:"column(config_id);pk" description:"规则id"`
+	//PredictEdbInfoId int       `orm:"column(predict_edb_info_id)" description:"预测指标id"`
+	ConfigId         int       `gorm:"column:config_id;primaryKey" description:"规则id"`
+	PredictEdbInfoId int       `gorm:"column:predict_edb_info_id" description:"预测指标id"`
 	SourceEdbInfoId  int       `description:"来源指标id"`
 	RuleType         int       `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值"`
 	FixedValue       float64   `description:"固定值"`
@@ -21,62 +23,73 @@ type PredictEdbConf struct {
 
 // GetPredictEdbConfById 根据预测指标id获取预测指标配置信息
 func GetPredictEdbConfById(edbInfoId int) (item *PredictEdbConf, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM predict_edb_conf WHERE predict_edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).First(&item).Error
 	return
 }
 
 // GetPredictEdbConfBySourceEdbInfoId 根据来源指标id获取配置
 func GetPredictEdbConfBySourceEdbInfoId(sourceEdbInfoId int) (item *PredictEdbConf, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM predict_edb_conf WHERE source_edb_info_id=? `
-	err = o.Raw(sql, sourceEdbInfoId).QueryRow(&item)
+	//err = o.Raw(sql, sourceEdbInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, sourceEdbInfoId).First(&item).Error
 	return
 }
 
 // GetPredictEdbConfCount 根据来源指标id获取被引用的次数
 func GetPredictEdbConfCount(sourceEdbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM predict_edb_conf WHERE source_edb_info_id=? `
-	err = o.Raw(sql, sourceEdbInfoId).QueryRow(&count)
+	//err = o.Raw(sql, sourceEdbInfoId).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, sourceEdbInfoId).Scan(&count).Error
 	return
 }
 
 // AddPredictEdbConf 添加预测指标规则
 func AddPredictEdbConf(item *PredictEdbConf) (lastId int64, err error) {
-	o := orm.NewOrmUsingDB("data")
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrmUsingDB("data")
+	//lastId, err = o.Insert(item)
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.ConfigId)
 	return
 }
 
 // AddPredictEdb 添加预测指标
 func AddPredictEdb(item *EdbInfo, predictEdbConf *PredictEdbConf) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	tx, err := o.Begin()
+	//o := orm.NewOrmUsingDB("data")
+	//tx, err := o.Begin()
+	tx := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
 	defer func() {
 		if err != nil {
-			tmpErr := tx.Rollback()
+			tmpErr := tx.Rollback().Error
 			if tmpErr != nil {
 				go alarm_msg.SendAlarmMsg("AddPredictEdb 事务回滚失败,Err:"+tmpErr.Error(), 3)
 			}
 		} else {
-			err = tx.Commit()
+			err = tx.Commit().Error
 		}
 	}()
 	// 新增预测指标
-	edbInfoId, err := o.Insert(item)
+	//edbInfoId, err := o.Insert(item)
+	err = tx.Create(&item).Error
 	if err != nil {
 		return
 	}
-	item.EdbInfoId = int(edbInfoId)
+	//item.EdbInfoId = int(edbInfoId)
 
 	// 新增预测指标配置
 	predictEdbConf.PredictEdbInfoId = item.EdbInfoId
-	_, err = o.Insert(predictEdbConf)
+	//_, err = o.Insert(predictEdbConf)
+	err = tx.Create(&predictEdbConf).Error
 	if err != nil {
 		return
 	}
@@ -85,28 +98,31 @@ func AddPredictEdb(item *EdbInfo, predictEdbConf *PredictEdbConf) (err error) {
 
 // EditPredictEdb 修改预测指标
 func EditPredictEdb(edbInfo *EdbInfo, predictEdbConf *PredictEdbConf, updateEdbInfoCol, updatePredictEdbConfCol []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	tx, err := o.Begin()
+	//o := orm.NewOrmUsingDB("data")
+	//tx, err := o.Begin()
+	tx := global.DbMap[utils.DbNameIndex].Begin()
 	if err != nil {
 		return
 	}
 	defer func() {
 		if err != nil {
-			tmpErr := tx.Rollback()
+			tmpErr := tx.Rollback().Error
 			if tmpErr != nil {
 				go alarm_msg.SendAlarmMsg("AddPredictEdb 事务回滚失败,Err:"+tmpErr.Error(), 3)
 			}
 		} else {
-			err = tx.Commit()
+			err = tx.Commit().Error
 		}
 	}()
 	// 修改预测指标
-	_, err = o.Update(edbInfo, updateEdbInfoCol...)
+	//_, err = o.Update(edbInfo, updateEdbInfoCol...)
+	err = tx.Model(&edbInfo).Select(updateEdbInfoCol).Updates(edbInfo).Error
 	if err != nil {
 		return
 	}
 	// 修改预测指标配置
-	_, err = o.Update(predictEdbConf, updatePredictEdbConfCol...)
+	//_, err = o.Update(predictEdbConf, updatePredictEdbConfCol...)
+	err = tx.Model(&predictEdbConf).Select(updatePredictEdbConfCol).Updates(predictEdbConf).Error
 	if err != nil {
 		return
 	}
@@ -119,20 +135,22 @@ func GetPredictEdbInfoAllCalculate(edbInfoIdList []int) (list []*EdbInfo, err er
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT b.* FROM predict_edb_conf AS a
 			 INNER JOIN edb_info AS b ON a.source_edb_info_id=b.edb_info_id
              WHERE a.predict_edb_info_id in (` + utils.GetOrmInReplace(num) + `)
 			 GROUP BY a.source_edb_info_id
 			 ORDER BY a.source_edb_info_id ASC `
-	_, err = o.Raw(sql, edbInfoIdList).QueryRows(&list)
+	//_, err = o.Raw(sql, edbInfoIdList).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoIdList).Find(&list).Error
 	return
 }
 
 // GetPredictEdbConfListById 根据预测指标id获取预测指标配置信息列表
 func GetPredictEdbConfListById(edbInfoId int) (items []*PredictEdbConf, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM predict_edb_conf WHERE predict_edb_info_id=? ORDER BY config_id ASC`
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).Find(&items).Error
 	return
 }

+ 20 - 13
models/data_manage/predict_edb_conf_calculate_mapping.go

@@ -1,14 +1,15 @@
 package data_manage
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // PredictEdbConfCalculateMapping 预测基础指标规则 与 计算预测指标关联关系表
 type PredictEdbConfCalculateMapping struct {
-	PredictEdbConfCalculateMappingId int       `orm:"column(predict_edb_conf_calculate_mapping_id);pk"`
+	//PredictEdbConfCalculateMappingId int       `orm:"column(predict_edb_conf_calculate_mapping_id);pk"`
+	PredictEdbConfCalculateMappingId int       `gorm:"column:predict_edb_conf_calculate_mapping_id;primaryKey"`
 	EdbInfoId                        int       `description:"指标id"`
 	ConfigId                         int       `description:"配置id"`
 	FromEdbInfoId                    int       `description:"基础指标id"`
@@ -24,22 +25,25 @@ type PredictEdbConfCalculateMapping struct {
 
 // GetPredictEdbConfCalculateMappingListById 根据预测指标id获取预测指标配置的关联指标信息列表
 func GetPredictEdbConfCalculateMappingListById(edbInfoId int) (items []*PredictEdbConf, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM predict_edb_conf_calculate_mapping WHERE edb_info_id=? ORDER BY predict_edb_conf_calculate_mapping_id ASC`
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).Find(&items).Error
 	return
 }
 
 // GetPredictEdbConfCalculateMappingListByConfigId 根据预测指标配置id获取预测指标配置的关联指标信息列表
 func GetPredictEdbConfCalculateMappingListByConfigId(edbInfoId, configId int) (items []*PredictEdbConf, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM predict_edb_conf_calculate_mapping WHERE edb_info_id=? AND config_id=? ORDER BY predict_edb_conf_calculate_mapping_id ASC`
-	_, err = o.Raw(sql, edbInfoId, configId).QueryRows(&items)
+	//_, err = o.Raw(sql, edbInfoId, configId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId, configId).Find(&items).Error
 	return
 }
 
 type PredictEdbConfCalculateMappingDetail struct {
-	PredictEdbConfCalculateMappingId int       `orm:"column(predict_edb_conf_calculate_mapping_id);pk"`
+	//PredictEdbConfCalculateMappingId int       `orm:"column(predict_edb_conf_calculate_mapping_id);pk"`
+	PredictEdbConfCalculateMappingId int       `gorm:"column:predict_edb_conf_calculate_mapping_id;primaryKey"`
 	EdbInfoId                        int       `description:"指标id"`
 	ConfigId                         int       `description:"配置id"`
 	FromEdbInfoId                    int       `description:"基础指标id"`
@@ -59,23 +63,25 @@ type PredictEdbConfCalculateMappingDetail struct {
 
 // GetPredictEdbConfCalculateMappingDetailListById 根据配置id获取 配置关联指标信息
 func GetPredictEdbConfCalculateMappingDetailListById(edbInfoId int) (list []*PredictEdbConfCalculateMappingDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.predict_edb_conf_calculate_mapping_id,a.edb_info_id,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,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.edb_type FROM predict_edb_conf_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 `
 
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
+	//_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId).Find(&list).Error
 	return
 }
 
 // GetPredictEdbConfCalculateMappingDetailListByConfigId 根据配置id和指标id获取 配置关联指标信息
 func GetPredictEdbConfCalculateMappingDetailListByConfigId(edbInfoId, configId int) (list []*PredictEdbConfCalculateMappingDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.predict_edb_conf_calculate_mapping_id,a.edb_info_id,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,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.edb_type FROM predict_edb_conf_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=? AND a.config_id=?  ORDER BY sort ASC `
 
-	_, err = o.Raw(sql, edbInfoId, configId).QueryRows(&list)
+	//_, err = o.Raw(sql, edbInfoId, configId).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, edbInfoId, configId).Find(&list).Error
 	return
 }
 
@@ -85,11 +91,12 @@ func GetPredictEdbConfCalculateMappingDetailListByEdbInfoId(fromEdbInfoIdList []
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.predict_edb_conf_calculate_mapping_id,a.edb_info_id,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,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.edb_type,b.edb_code FROM predict_edb_conf_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 in (` + utils.GetOrmInReplace(num) + `) GROUP BY a.edb_info_id ORDER BY sort ASC `
 
-	_, err = o.Raw(sql, fromEdbInfoIdList).QueryRows(&list)
+	//_, err = o.Raw(sql, fromEdbInfoIdList).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, fromEdbInfoIdList).Find(&list).Error
 	return
 }

+ 8 - 4
models/data_manage/predict_edb_rule_data.go

@@ -1,13 +1,15 @@
 package data_manage
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // PredictEdbRuleData 预测指标,动态规则的计算数据
 type PredictEdbRuleData struct {
-	PredictEdbRuleDataId int `orm:"column(predict_edb_rule_data_id);pk"`
+	//PredictEdbRuleDataId int `orm:"column(predict_edb_rule_data_id);pk"`
+	PredictEdbRuleDataId int `gorm:"column:predict_edb_rule_data_id;primaryKey"`
 	EdbInfoId            int
 	ConfigId             int
 	DataTime             string
@@ -19,7 +21,7 @@ type PredictEdbRuleData struct {
 
 // GetPredictEdbRuleDataList 根据基础预测指标id集合 获取 所有的普通指标列表数据
 func GetPredictEdbRuleDataList(edbInfoId, configId int, startDate, endDate string) (list []*PredictEdbRuleData, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	var pars []interface{}
 	sql := ` SELECT * FROM predict_edb_rule_data WHERE edb_info_id = ? AND config_id = ? `
 	if startDate != "" {
@@ -31,6 +33,8 @@ func GetPredictEdbRuleDataList(edbInfoId, configId int, startDate, endDate strin
 		pars = append(pars, endDate)
 	}
 	sql += ` ORDER BY data_time ASC `
-	_, err = o.Raw(sql, edbInfoId, configId, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, edbInfoId, configId, pars).QueryRows(&list)
+	pars = utils.ForwardPars(pars, []int{edbInfoId, configId})
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
 	return
 }

+ 5 - 4
models/db.go

@@ -10,7 +10,7 @@ import (
 	"github.com/beego/beego/v2/client/orm"
 )
 
-func init() {
+func init2() {
 
 	_ = orm.RegisterDataBase("default", "mysql", utils.MYSQL_URL)
 	orm.SetMaxIdleConns("default", 50)
@@ -38,12 +38,13 @@ func init() {
 		new(data_manage.PredictEdbRuleData),             //预测指标配置生成的数据
 		new(data_manage.PredictEdbConfCalculateMapping), //预测指标关系表
 		new(data_manage.ChartInfoCorrelation),           // 图表相关性信息
+		new(FactorEdbSeriesCalculateDataQjjs),           // 因子指标系列-区间计算数据
 	)
 	// 期货数据库
 	initFutureGood()
 
 	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
-	afterInitTable()
+	AfterInitTable()
 }
 
 // initFutureGood 注册期货数据 数据表
@@ -56,11 +57,11 @@ func initFutureGood() {
 	)
 }
 
-// afterInitTable
+// AfterInitTable
 // @Description: 初始化表结构的的后置操作
 // @author: Roc
 // @datetime 2024-07-01 13:31:09
-func afterInitTable() {
+func AfterInitTable() {
 	// 初始化指标来源配置
 	data_manage.InitEdbSourceVar()
 

+ 2 - 0
models/edb_data_base.go

@@ -170,6 +170,8 @@ func GetEdbDataTableName(source, subSource int) (tableName string) {
 		tableName = "edb_data_icpi"
 	case utils.DATA_SOURCE_SCI99: //卓创资讯->85
 		tableName = "edb_data_sci99"
+	case utils.DATA_SOURCE_PREDICT: // 基础预测指标->30
+		tableName = "edb_data_predict_base"
 	default:
 		edbSource := data_manage.EdbSourceIdMap[source]
 		if edbSource != nil {

+ 79 - 49
models/excel_info.go

@@ -1,15 +1,16 @@
 package models
 
 import (
+	"eta/eta_chart_lib/global"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
 // ExcelInfo excel表格详情表
 type ExcelInfo struct {
-	ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
+	ExcelInfoId     int       `gorm:"column:excel_info_id;primaryKey"`
 	Source          int       `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
 	ExcelType       int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName       string    `description:"表格名称"`
@@ -28,13 +29,15 @@ type ExcelInfo struct {
 
 // Update 更新 excel表格基础信息
 func (excelInfo *ExcelInfo) Update(cols []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Update(excelInfo, cols...)
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(excelInfo, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&excelInfo).Select(cols).Updates(&excelInfo).Error
 	return
 }
 
 type MyExcelInfoList struct {
-	ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
+	ExcelInfoId     int       `gorm:"column:excel_info_id;primaryKey"`
 	ExcelName       string    `description:"表格名称"`
 	UniqueCode      string    `description:"表格唯一编码"`
 	ExcelClassifyId int       `description:"表格分类id"`
@@ -49,77 +52,85 @@ type MyExcelInfoList struct {
 
 // AddExcelInfo 新增表格
 func AddExcelInfo(excelInfo *ExcelInfo) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	// 表格信息入库
-	lastId, err := o.Insert(excelInfo)
-	if err != nil {
-		return
-	}
-	excelInfo.ExcelInfoId = int(lastId)
+	//lastId, err := o.Insert(excelInfo)
+	err = global.DbMap[utils.DbNameIndex].Model(&excelInfo).Create(&excelInfo).Error
+	//if err != nil {
+	//	return
+	//}
+	//excelInfo.ExcelInfoId = int(lastId)
 	return
 }
 
 // EditExcelInfo 编辑表格
 func EditExcelInfo(excelInfo *ExcelInfo, updateExcelInfoParams []string) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	// ETA表格信息变更
-	_, err = o.Update(excelInfo, updateExcelInfoParams...)
+	//_, err = o.Update(excelInfo, updateExcelInfoParams...)
+	err = global.DbMap[utils.DbNameIndex].Model(&excelInfo).Select(updateExcelInfoParams).Updates(&excelInfo).Error
 	return
 }
 
 // GetExcelInfoById 根据id 获取eta表格详情
 func GetExcelInfoById(excelInfoId int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_info_id=? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 func GetExcelInfoViewById(excelInfoId int) (item *ExcelInfoView, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_info_id=? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 func GetExcelInfoCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func GetExcelInfoByCondition(condition string, pars []interface{}) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetNextExcelInfo 根据分类id获取下一个excel表格
 func GetNextExcelInfo(classifyId int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT b.* FROM excel_classify AS a
 			INNER JOIN excel_info AS b ON a.excel_classify_id=b.excel_classify_id
 			WHERE a.excel_classify_id>? AND is_delete=0
 			ORDER BY a.excel_classify_id ASC
 			LIMIT 1 `
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
 // EditExcelInfoImage 修改excel表格的图片
 func EditExcelInfoImage(excelInfoId int, imageUrl string) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 
 	sql := ` UPDATE  excel_info SET excel_image=?, modify_time = NOW() WHERE excel_info_id = ? AND is_delete=0 `
-	_, err = o.Raw(sql, imageUrl, excelInfoId).Exec()
+	//_, err = o.Raw(sql, imageUrl, excelInfoId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, imageUrl, excelInfoId).Error
 	if err != nil {
 		fmt.Println("EditExcelInfoImage Err:", err.Error())
 		return err
@@ -130,33 +141,37 @@ func EditExcelInfoImage(excelInfoId int, imageUrl string) (err error) {
 
 // GetExcelInfoByUniqueCode 根据unique_code来获取excel表格详情
 func GetExcelInfoByUniqueCode(uniqueCode string) (item *ExcelInfoView, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE unique_code=? AND is_delete=0 `
-	err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	//err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, uniqueCode).First(&item).Error
 	return
 }
 
 // GetFirstExcelInfoByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
 func GetFirstExcelInfoByClassifyId(classifyId int) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_classify_id=? AND is_delete=0 order by sort asc,excel_info_id asc limit 1`
-	err = o.Raw(sql, classifyId).QueryRow(&item)
+	//err = o.Raw(sql, classifyId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).First(&item).Error
 	return
 }
 
 // UpdateExcelInfoSortByClassifyId 根据表格id更新排序
 func UpdateExcelInfoSortByClassifyId(classifyId, nowSort, prevExcelInfoId int, updateSort string) (err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` update excel_info set sort = ` + updateSort + ` WHERE excel_classify_id=? and sort > ? AND is_delete=0 `
 	if prevExcelInfoId > 0 {
 		sql += ` or (excel_info_id > ` + fmt.Sprint(prevExcelInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
 	}
-	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	//_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, classifyId, nowSort).Error
 	return
 }
 
 type ExcelInfoView struct {
-	ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
+	//ExcelInfoId     int       `orm:"column(excel_info_id);pk"`
+	ExcelInfoId     int       `gorm:"column:excel_info_id;primaryKey"`
 	Source          int       `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
 	ExcelType       int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName       string    `description:"表格名称"`
@@ -176,9 +191,10 @@ type ExcelInfoView struct {
 
 // GetExcelInfoByClassifyIdAndName 根据分类id和表格名获取表格信息
 func GetExcelInfoByClassifyIdAndName(classifyId int, excelName string) (item *ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_classify_id = ? and excel_name=? AND is_delete=0 `
-	err = o.Raw(sql, classifyId, excelName).QueryRow(&item)
+	//err = o.Raw(sql, classifyId, excelName).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId, excelName).First(&item).Error
 	return
 }
 
@@ -188,28 +204,36 @@ func GetExcelInfoListByUniqueCodeSlice(uniqueCodeSlice []string) (total int64, i
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM excel_info WHERE unique_code in ("` + utils.GetOrmInReplace(num) + `") AND is_delete=0 `
-	total, err = o.Raw(sql, uniqueCodeSlice).QueryRows(&items)
+	//o := orm.NewOrmUsingDB("data")
+	//sql := ` SELECT * FROM excel_info WHERE unique_code in ("` + utils.GetOrmInReplace(num) + `") AND is_delete=0 `
+	//total, err = o.Raw(sql, uniqueCodeSlice).QueryRows(&items)
+	sql := ` SELECT * FROM excel_info WHERE unique_code in ? AND is_delete=0 `
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, uniqueCodeSlice).Find(&items).Error
+	if err != nil {
+		return
+	}
+	total = int64(len(items))
 	return
 }
 
 // GetExcelListByCondition 获取excel表格列表数据
 func GetExcelListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
 	//sql += " ORDER BY sort ASC,chart_info_id DESC LIMIT ?,? "
 	sql += " ORDER BY create_time DESC LIMIT ?,? "
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // GetNoContentExcelListByCondition 获取没有content的excel表格列表数据
 func GetNoContentExcelListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT excel_info_id,excel_name,unique_code,excel_classify_id,sys_user_id,sys_user_real_name,excel_image,file_url,sort,create_time,modify_time
 FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
@@ -217,43 +241,49 @@ FROM excel_info WHERE 1=1 AND is_delete=0 `
 	}
 	//sql += " ORDER BY sort ASC,chart_info_id DESC LIMIT ?,? "
 	sql += " ORDER BY create_time DESC LIMIT ?,? "
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Error
 	return
 }
 
 func GetExcelListCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 // GetExcelViewInfoByExcelInfoId 根据excelInfoId 获取ETA表格详情
 func GetExcelViewInfoByExcelInfoId(excelInfoId int) (item *MyExcelInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE excel_info_id = ? AND is_delete=0 `
-	err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	//err = o.Raw(sql, excelInfoId).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, excelInfoId).First(&item).Error
 	return
 }
 
 // GetExcelInfoCountByClassifyId 根据分类id获取名下表格数量
 func GetExcelInfoCountByClassifyId(classifyId int) (total int64, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT count(1) total FROM excel_info WHERE excel_classify_id = ? AND is_delete=0 `
-	err = o.Raw(sql, classifyId).QueryRow(&total)
+	//err = o.Raw(sql, classifyId).QueryRow(&total)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyId).Count(&total).Error
 	return
 }
 
 func GetExcelInfoListByCondition(condition string, pars []interface{}) (items []*ExcelInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM excel_info WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY sort asc, excel_info_id asc`
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
 	return
 }

+ 93 - 0
models/excel_info_rule_mapping.go

@@ -0,0 +1,93 @@
+package models
+
+import (
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
+	"time"
+)
+
+type ExcelInfoRuleMapping struct {
+	//ExcelInfoRuleMappingId int       `orm:"pk" description:"主键"`
+	ExcelInfoRuleMappingId int       `gorm:"primaryKey"`
+	ExcelInfoId            int       `description:"Excel信息ID"`
+	RuleType               int       `description:"规则类型"`
+	LeftValue              string    `description:"左值"`
+	LeftValueShow          string    `description:"左值前端显示"`
+	LeftValueType          int       `description:"左值类型"`
+	RightValue             string    `description:"右值"`
+	RightValueShow         string    `description:"右值前端显示"`
+	RightValueType         int       `description:"右值类型"`
+	FontColor              string    `description:"字体颜色"`
+	BackgroundColor        string    `description:"背景颜色"`
+	Remark                 string    `description:"预设颜色说明"`
+	RemarkEn               string    `description:"预设颜色英文说明"`
+	Scope                  string    `description:"作用范围"`
+	ScopeCoord             string    `description:"作用范围坐标"`
+	ScopeShow              string    `description:"作用范围坐标前端显示"`
+	CreateTime             time.Time `description:"创建时间"`
+}
+
+type ExcelInfoRuleMappingView struct {
+	//ExcelInfoRuleMappingId int    `orm:"pk" description:"主键"`
+	ExcelInfoRuleMappingId int    `gorm:"primaryKey"`
+	ExcelInfoId            int    `description:"Excel信息ID"`
+	RuleType               int    `description:"规则类型:1-大于,2-小于,3-介于,4-等于,5-发生日期"`
+	LeftValue              string `description:"左值"`
+	LeftValueBack          string `description:"左值前端显示"`
+	LeftValueType          int    `description:"左值类型"`
+	RightValue             string `description:"右值"`
+	RightValueBack         string `description:"右值前端显示"`
+	RightValueType         int    `description:"右值类型"`
+	FontColor              string `description:"字体颜色"`
+	BackgroundColor        string `description:"背景颜色"`
+	Remark                 string `description:"预设颜色说明"`
+	RemarkEn               string `description:"预设颜色英文说明"`
+	Scope                  string `description:"作用范围"`
+	ScopeCoord             string `description:"作用范围坐标"`
+	ScopeShow              string `description:"作用范围坐标前端显示"`
+	CreateTime             string `description:"创建时间"`
+}
+
+func (e *ExcelInfoRuleMapping) Insert() (insertId int64, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	//insertId, err = o.Insert(e)
+	err = global.DbMap[utils.DbNameIndex].Create(&e).Error
+	if err != nil {
+		return
+	}
+	insertId = int64(e.ExcelInfoRuleMappingId)
+	return
+}
+
+func (e *ExcelInfoRuleMapping) Update(cols []string) (err error) {
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(e, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&e).Select(cols).Updates(&e).Error
+	return
+}
+
+// GetExcelRuleMappingByExcelInfoId 根据excelInfoId获取规则映射信息
+func GetExcelRuleMappingByExcelInfoId(id int) (items []*ExcelInfoRuleMappingView, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_info_rule_mapping WHERE excel_info_id = ? ORDER BY create_time ASC`
+	//_, err = o.Raw(sql, id).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).Find(&items).Error
+	return
+}
+
+// GetExcelRuleMappingById 根据主键Id获取规则映射信息
+func GetExcelRuleMappingById(id int) (item *ExcelInfoRuleMappingView, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_info_rule_mapping WHERE excel_info_rule_mapping_id = ?`
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
+	return
+}
+
+func DeleteExcelRuleMappingById(id int) (err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := `DELETE FROM excel_info_rule_mapping WHERE excel_info_rule_mapping_id = ?`
+	//_, err = o.Raw(sql, id).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, id).Error
+	return
+}

+ 213 - 0
models/factor_edb_series_calculate_data_qjjs.go

@@ -0,0 +1,213 @@
+package models
+
+import (
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// FactorEdbSeriesCalculateDataQjjs 因子指标系列-区间计算数据表
+type FactorEdbSeriesCalculateDataQjjs struct {
+	//FactorEdbSeriesCalculateDataId int       `orm:"column(factor_edb_series_calculate_data_id);pk"`
+	FactorEdbSeriesCalculateDataId int       `gorm:"column:factor_edb_series_calculate_data_id;primaryKey"`
+	FactorEdbSeriesId              int       `description:"因子指标系列ID"`
+	EdbInfoId                      int       `description:"指标ID"`
+	EdbCode                        string    `description:"指标编码"`
+	DataTime                       time.Time `description:"数据日期"`
+	Value                          float64   `description:"数据值"`
+	CreateTime                     time.Time `description:"创建时间"`
+	ModifyTime                     time.Time `description:"修改时间"`
+	DataTimestamp                  int64     `description:"数据日期时间戳"`
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) TableName() string {
+	return "factor_edb_series_calculate_data_qjjs"
+}
+
+type FactorEdbSeriesCalculateDataQjjsCols struct {
+	PrimaryId         string
+	FactorEdbSeriesId string
+	EdbInfoId         string
+	EdbCode           string
+	DataTime          string
+	Value             string
+	CreateTime        string
+	ModifyTime        string
+	DataTimestamp     string
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) Cols() FactorEdbSeriesCalculateDataQjjsCols {
+	return FactorEdbSeriesCalculateDataQjjsCols{
+		PrimaryId:         "factor_edb_series_calculate_data_id",
+		FactorEdbSeriesId: "factor_edb_series_id",
+		EdbInfoId:         "edb_info_id",
+		EdbCode:           "edb_code",
+		DataTime:          "data_time",
+		Value:             "value",
+		CreateTime:        "create_time",
+		ModifyTime:        "modify_time",
+		DataTimestamp:     "data_timestamp",
+	}
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) Create() (err error) {
+	//o := orm.NewOrmUsingDB("data")
+	//id, err := o.Insert(m)
+	err = global.DbMap[utils.DbNameIndex].Create(&m).Error
+	if err != nil {
+		return
+	}
+	//m.FactorEdbSeriesCalculateDataId = int(id)
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) CreateMulti(items []*FactorEdbSeriesCalculateDataQjjs) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.InsertMulti(500, items)
+	err = global.DbMap[utils.DbNameIndex].CreateInBatches(items, 500).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) Update(cols []string) (err error) {
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Update(m, cols...)
+	err = global.DbMap[utils.DbNameIndex].Model(&m).Select(cols).Updates(&m).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) Remove() (err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	//_, err = o.Raw(sql, m.FactorEdbSeriesCalculateDataId).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, m.FactorEdbSeriesCalculateDataId).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	//o := orm.NewOrmUsingDB("data")
+	//sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	//_, err = o.Raw(sql, ids).Exec()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, ids).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	//o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	//_, err = o.Raw(sql, pars).Exec()
+	err = global.DbMap[utils.DbNameIndex].Exec(sql, pars...).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) GetItemById(id int) (item *FactorEdbSeriesCalculateDataQjjs, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *FactorEdbSeriesCalculateDataQjjs, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*FactorEdbSeriesCalculateDataQjjs, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*FactorEdbSeriesCalculateDataQjjs, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// FactorEdbSeriesCalculateDataQjjsItem 因子指标系列-计算数据信息
+type FactorEdbSeriesCalculateDataQjjsItem struct {
+	DataId            int     `description:"数据ID"`
+	FactorEdbSeriesId int     `description:"因子指标系列ID"`
+	EdbInfoId         int     `description:"指标ID"`
+	EdbCode           string  `description:"指标编码"`
+	DataTime          string  `description:"数据日期"`
+	Value             float64 `description:"数据值"`
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) Format2Item() (item *FactorEdbSeriesCalculateDataQjjsItem) {
+	item = new(FactorEdbSeriesCalculateDataQjjsItem)
+	item.DataId = m.FactorEdbSeriesCalculateDataId
+	item.FactorEdbSeriesId = m.FactorEdbSeriesId
+	item.EdbInfoId = m.EdbInfoId
+	item.EdbCode = m.EdbCode
+	return
+}
+
+func (m *FactorEdbSeriesCalculateDataQjjs) GetEdbDataList(seriesId int, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+	var pars []interface{}
+	sql := `SELECT factor_edb_series_calculate_data_id as edb_data_id  ,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? and factor_edb_series_id=? `
+	pars = append(pars, edbInfoId, seriesId)
+	if startDate != "" {
+		sql += ` AND data_time>=? `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql += ` AND data_time<=? `
+		pars = append(pars, endDate)
+	}
+
+	sql += ` ORDER BY data_time ASC `
+	sql = fmt.Sprintf(sql, m.TableName())
+	//o := orm.NewOrmUsingDB("data")
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
+	return
+}

+ 31 - 0
models/referenced_excel_config.go

@@ -0,0 +1,31 @@
+package models
+
+import (
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
+	"time"
+)
+
+type ReferencedExcelConfig struct {
+	//ReferencedExcelConfigId int       `orm:"column(referenced_excel_config_id);pk;auto" ` // excel表格配置id
+	ReferencedExcelConfigId int       `gorm:"column:referenced_excel_config_id;primaryKey;autoIncrement" ` // excel表格配置id
+	UniqueCode              string    // 表格唯一编码
+	ReferencedId            int       // 被引用的id,报告就是报告id,pptId
+	FromScene               int       // 引用类型 1智能研报 2研报列表 3英文研报 4PPT 5英文ppt
+	Uuid                    string    // 引用唯一标识
+	WidthList               string    // 宽度数组
+	HeightList              string    // 高度数组
+	OpUserId                int       // 当前编辑操作的用户id
+	OpUserName              string    // 当前编辑的用户名称(冗余字段,避免查表)
+	CreateTime              time.Time // 创建时间
+	Content                 string    // 内容
+	ModifyTime              time.Time // 修改时间
+}
+
+// getByCode
+func GetReferencedExcelConfig(referencedId, fromScene int, uniqueCode, uuid string) (item ReferencedExcelConfig, err error) {
+	o := global.DbMap[utils.DbNameIndex]
+	sql := ` SELECT * FROM referenced_excel_config WHERE referenced_id = ? AND from_scene = ? AND unique_code = ? AND uuid = ? `
+	err = o.Raw(sql, referencedId, fromScene, uniqueCode, uuid).First(&item).Error
+	return
+}

+ 8 - 0
models/request/mini.go

@@ -0,0 +1,8 @@
+package request
+
+type ChartCollectReq struct {
+	UniqueCode string `json:"uniqueCode"`
+	Source     string `json:"source"`
+	Action     string `json:"action"`
+	ExtraInfo  string `json:"extraInfo"` //通用额外信息传输需要的扩展信息
+}

+ 10 - 2
models/request/mixed_table.go

@@ -160,8 +160,16 @@ type MixDateCalculateTagReq struct {
 
 // MixCellShowStyle 混合表格 单元格样式展示计算
 type MixCellShowStyle struct {
-	Pn int    `description:"小数点位数增加或减少,正数表述增加,负数表示减少" json:"pn"`
-	Nt string `description:"变换类型:number 小数点位数改变,percent百分比," json:"nt"`
+	Pn              int         `description:"小数点位数增加或减少,正数表述增加,负数表示减少" json:"pn"`
+	Nt              string      `description:"变换类型:number 小数点位数改变,percent百分比," json:"nt"`
+	GlObj           interface{} `description:"公式对象:1:数值,2:百分比,3:文本" json:"glObj"`
+	Decimal         *int        `description:"小数点位数" json:"decimal"`
+	Last            string      `description:"起始操作:nt|decimal" json:"last"`
+	Color           string      `description:"颜色值,#RRG" json:"color"`
+	BackgroundColor string      `description:"背景颜色值,#RRG" json:"background-color"`
+	Width           float64     `description:"单元格宽度" json:"width"`
+	Align           string      `description:"对齐方式:left|center|right" json:"align"`
+	FontSize        string      `description:"字体大小" json:"font-size"`
 }
 
 type DateDataBeforeAfterReq struct {

+ 14 - 11
models/response/excel_info.go

@@ -10,22 +10,25 @@ import (
 // ExcelTableDetailResp  excel表格详情
 type ExcelTableDetailResp struct {
 	//ChartInfo   *ChartInfo
-	UniqueCode    string `description:"表格唯一code"`
-	Source        int    `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
-	ExcelType     int    `description:"表格类型,1:指标列,2:日期列,默认:1"`
-	ExcelImage    string `description:"表格截图"`
-	ExcelName     string `description:"表格名称"`
-	SourcesFrom   string `description:"图表来源"`
-	ExcelSource   string `description:"表格来源str"`
-	ExcelSourceEn string `description:"表格来源(英文)"`
-	TableInfo     excel.TableData
-	Config        ExcelTableDetailConfigResp
+	UniqueCode            string `description:"表格唯一code"`
+	Source                int    `description:"表格来源,1:excel插件的表格,2:自定义表格,默认:1"`
+	ExcelType             int    `description:"表格类型,1:指标列,2:日期列,默认:1"`
+	ExcelImage            string `description:"表格截图"`
+	ExcelName             string `description:"表格名称"`
+	SourcesFrom           string `description:"图表来源"`
+	ExcelSource           string `description:"表格来源str"`
+	ExcelSourceEn         string `description:"表格来源(英文)"`
+	IsAuth        bool   `description:"是否授权"`
+	TableInfo             excel.TableData
+	Config                ExcelTableDetailConfigResp
+	ReferencedExcelConfig models.ReferencedExcelConfig `description:"表格引用信息"`
 }
 
 // ExcelTableDetailConfigResp
 // @Description: Excel表格的配置信息
 type ExcelTableDetailConfigResp struct {
-	FontSize int
+	FontSize  int
+	Watermark string
 }
 
 // TableCellResp 单元格

+ 11 - 4
models/share_chart_refresh_log.go

@@ -1,13 +1,15 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 // ShareChartRefreshLog 分享图表的日志
 type ShareChartRefreshLog struct {
-	Id         int    `orm:"column(id);pk"`
+	//Id         int    `orm:"column(id);pk"`
+	Id         int    `gorm:"column:id;primaryKey"`
 	Ip         string `description:"来源ip"`
 	ChartId    int    `description:"图表分类id"`
 	CreateTime time.Time
@@ -15,7 +17,12 @@ type ShareChartRefreshLog struct {
 
 // AddShareChartRefreshLog 添加日志
 func AddShareChartRefreshLog(item *ShareChartRefreshLog) (lastId int64, err error) {
-	o := orm.NewOrmUsingDB("data")
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrmUsingDB("data")
+	err = global.DbMap[utils.DbNameIndex].Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.Id)
+	//lastId, err = o.Insert(item)
 	return
 }

+ 7 - 4
models/table.go

@@ -1,12 +1,14 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 type TableInfo struct {
-	TableInfoId     int       `orm:"column(table_info_id);pk"`
+	TableInfoId int `gorm:"column:table_info_id;primaryKey"`
+	//TableInfoId     int       `orm:"column(table_info_id);pk"`
 	TableName       string    `description:"表格名称"`
 	UniqueCode      string    `description:"表格唯一编码"`
 	TableClassifyId int       `description:"表格分类id"`
@@ -24,9 +26,10 @@ type TableInfo struct {
 
 // GetTableInfoByUniqueCode 根据union_code 获取表格信息
 func GetTableInfoByUniqueCode(uniqueCode string) (item *TableInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM table_info WHERE unique_code=? `
-	err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	//err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, uniqueCode).First(&item).Error
 	return
 }
 

+ 7 - 5
models/table_data.go

@@ -1,12 +1,14 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_chart_lib/global"
+	"eta/eta_chart_lib/utils"
 	"time"
 )
 
 type TableData struct {
-	TableDataId       int       `orm:"column(table_data_id);pk"`
+	//TableDataId       int       `orm:"column(table_data_id);pk"`
+	TableDataId       int       `gorm:"column:table_data_id;primaryKey"`
 	TableInfoId       int       `description:"表格id"`
 	Date              time.Time `description:"指标时间"`
 	DataCol1          string    `orm:"column(data_col_1);" description:"第1个表格的数据"`
@@ -29,12 +31,12 @@ type TableData struct {
 
 // GetTableDataListByTableInfoId 根据表格id获取数据列表
 func GetTableDataListByTableInfoId(tableInfoId int) (items []*TableData, err error) {
-	o := orm.NewOrmUsingDB("data")
+	//o := orm.NewOrmUsingDB("data")
 	pars := make([]interface{}, 0)
 	pars = append(pars, tableInfoId)
 
 	sql := ` SELECT * FROM table_data WHERE table_info_id = ? order by sort asc `
-
-	_, err = o.Raw(sql, tableInfoId).QueryRows(&items)
+	err = global.DbMap[utils.DbNameIndex].Raw(sql, tableInfoId).Find(&items).Error
+	//_, err = o.Raw(sql, tableInfoId).QueryRows(&items)
 	return
 }

+ 18 - 0
routers/commentsRouter.go

@@ -70,6 +70,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:ChartController"] = append(beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:ChartController"],
+        beego.ControllerComments{
+            Method: "MiniBookMark",
+            Router: `/mini/bookMark`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:ChartController"] = append(beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:ChartController"],
         beego.ControllerComments{
             Method: "ChartInfoRefresh",
@@ -79,6 +88,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:EtaForumChartController"] = append(beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:EtaForumChartController"],
+        beego.ControllerComments{
+            Method: "CommonChartInfoDetailFromUniqueCode",
+            Router: `/chart/common/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_chart_lib/controllers:ExcelInfoController"],
         beego.ControllerComments{
             Method: "GetTableDetail",

+ 5 - 0
routers/router.go

@@ -34,6 +34,11 @@ func init() {
 				&controllers.ExcelInfoController{},
 			),
 		),
+		web.NSNamespace("/eta_forum",
+			web.NSInclude(
+				&controllers.EtaForumChartController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 593 - 0
services/data/area_graph/processor_business_logic.go

@@ -0,0 +1,593 @@
+package area_graph
+
+import (
+	"errors"
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/models/data_manage"
+	"eta/eta_chart_lib/utils"
+	"github.com/shopspring/decimal"
+	"math"
+	"sort"
+	"time"
+)
+
+type InterpolateStrategy struct{}
+
+// Deal 空值填充:插值法填充
+func (i *InterpolateStrategy) Deal(tmpConfig data_manage.AreaExtraConf, edbDataList []*models.ChartEdbInfoMapping, standardIndexMap map[string]*models.EdbDataList, startDate string, endDate string) (err error) {
+	for _, v := range edbDataList {
+		if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
+			if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+
+				// 存放补充数据
+				var replenishDataList []*models.EdbDataList
+
+				// 处理从 startDate 到第一个数据的日期补充
+				if len(dataList) > 0 {
+					firstData := dataList[0]
+					// 将 startDate 到第一个数据日期之间的自然日填充补充数据,值为 0
+					startDataTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+					firstDataTime, _ := time.ParseInLocation(utils.FormatDate, firstData.DataTime, time.Local)
+
+					// 计算两个日期之间的天数差
+					if !startDataTime.Equal(firstDataTime) {
+						for startDataTime.Before(firstDataTime) {
+							// 补充数据
+							nextDay := startDataTime.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: startDataTime.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 startDataTime 到下一个日期
+							startDataTime = startDataTime.AddDate(0, 0, 1)
+						}
+					}
+				}
+
+				// 插值法补充数据
+				var startEdbInfoData *models.EdbDataList
+				for index := 0; index < len(dataList); index++ {
+					// 获取当前数据和下一个数据
+					currentIndexData := dataList[index]
+					//afterIndexData := dataList[index+1]
+
+					if startEdbInfoData == nil {
+						startEdbInfoData = currentIndexData
+						continue
+					}
+
+					// 获取两条数据之间相差的天数
+					startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
+					currDataTime, _ := time.ParseInLocation(utils.FormatDate, currentIndexData.DataTime, time.Local)
+					betweenHour := int(currDataTime.Sub(startDataTime).Hours())
+					betweenDay := betweenHour / 24
+
+					// 如果相差一天,那么过滤
+					if betweenDay <= 1 {
+						startEdbInfoData = currentIndexData
+						continue
+					}
+
+					// 生成线性方程式
+					var a, b float64
+					{
+						coordinateData := make([]utils.Coordinate, 0)
+						tmpCoordinate1 := utils.Coordinate{
+							X: 1,
+							Y: startEdbInfoData.Value,
+						}
+						coordinateData = append(coordinateData, tmpCoordinate1)
+						tmpCoordinate2 := utils.Coordinate{
+							X: float64(betweenDay) + 1,
+							Y: currentIndexData.Value,
+						}
+						coordinateData = append(coordinateData, tmpCoordinate2)
+
+						a, b = utils.GetLinearResult(coordinateData)
+						if math.IsNaN(a) || math.IsNaN(b) {
+							err = errors.New("线性方程公式生成失败")
+							return
+						}
+					}
+
+					// 插值补充数据
+					for i := 1; i < betweenDay; i++ {
+						tmpDataTime := startDataTime.AddDate(0, 0, i)
+						aDecimal := decimal.NewFromFloat(a)
+						xDecimal := decimal.NewFromInt(int64(i) + 1)
+						bDecimal := decimal.NewFromFloat(b)
+
+						val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
+						nextDay := tmpDataTime.Format(utils.FormatDate)
+
+						replenishIndexData := models.EdbDataList{
+							EdbDataId:     currentIndexData.EdbDataId,
+							DataTime:      nextDay,
+							DataTimestamp: tmpDataTime.UnixMilli(),
+							Value:         val,
+						}
+
+						// 将补充数据加入补充数据列表
+						replenishDataList = append(replenishDataList, &replenishIndexData)
+					}
+					startEdbInfoData = currentIndexData
+				}
+
+				// 处理从最后一个数据到 endDate 的日期补充
+				if len(dataList) > 0 {
+					lastData := dataList[len(dataList)-1]
+					// 将最后一个数据日期到 endDate 之间的自然日填充补充数据,值为 0
+					lastDataTime, _ := time.ParseInLocation(utils.FormatDate, lastData.DataTime, time.Local)
+					endDataTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+
+					// 如果 lastDataTime 不等于 endDate,进行补充
+					if !lastDataTime.Equal(endDataTime) {
+						// 补充数据直到 endDate
+						for lastDataTime.Before(endDataTime) {
+							// 补充数据
+							addDate := lastDataTime.AddDate(0, 0, 1)
+							nextDay := addDate.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: addDate.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 lastDataTime 到下一个日期
+							lastDataTime = addDate
+						}
+					}
+				}
+
+				dataList = append(dataList, replenishDataList...)
+
+				// 根据基准指标筛选出符合数据
+				var resultDataList []*models.EdbDataList
+				for _, dataObject := range dataList {
+					if _, ok := standardIndexMap[dataObject.DataTime]; ok {
+						// 存在才保留
+						resultDataList = append(resultDataList, dataObject)
+					}
+				}
+
+				// 排序
+				sort.Slice(resultDataList, func(i, j int) bool {
+					return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
+				})
+
+				v.DataList = resultDataList
+			}
+		}
+	}
+	return nil
+}
+
+type FillWithPreviousStrategy struct{}
+
+// Deal 空值填充:前值填充
+func (f *FillWithPreviousStrategy) Deal(tmpConfig data_manage.AreaExtraConf, edbDataList []*models.ChartEdbInfoMapping, standardIndexMap map[string]*models.EdbDataList, startDate string, endDate string) (err error) {
+	// 按自然日补充,再根据基准指标取对应数据
+	for _, v := range edbDataList {
+		if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
+			if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+				// 存放补充数据
+				var replenishDataList []*models.EdbDataList
+
+				// 处理从 startDate 到第一个数据的日期补充
+				if len(dataList) > 0 {
+					firstData := dataList[0]
+					// 将 startDate 到第一个数据日期之间的自然日填充补充数据,值为 0
+					startDataTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+					firstDataTime, _ := time.ParseInLocation(utils.FormatDate, firstData.DataTime, time.Local)
+
+					// 计算两个日期之间的天数差
+					if !startDataTime.Equal(firstDataTime) {
+						for startDataTime.Before(firstDataTime) {
+							// 补充数据
+							nextDay := startDataTime.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: startDataTime.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 startDataTime 到下一个日期
+							startDataTime = startDataTime.AddDate(0, 0, 1)
+						}
+					}
+				}
+
+				// 处理指标中空值数据
+				for index := 0; index < len(dataList)-1; index++ {
+					// 获取当前数据和下一个数据
+					beforeIndexData := dataList[index]
+					afterIndexData := dataList[index+1]
+
+					for utils.IsMoreThanOneDay(beforeIndexData.DataTime, afterIndexData.DataTime) {
+						// 创建补充数据
+						nextDay := utils.GetNextDay(beforeIndexData.DataTime)
+
+						toTime := utils.StringToTime(nextDay)
+						replenishIndexData := models.EdbDataList{
+							EdbInfoId:     v.EdbInfoId,
+							DataTime:      nextDay,
+							DataTimestamp: toTime.UnixMilli(),
+							Value:         beforeIndexData.Value,
+						}
+
+						// 将补充数据加入补充数据列表
+						replenishDataList = append(replenishDataList, &replenishIndexData)
+
+						// 更新 beforeIndexData 为新创建的补充数据
+						beforeIndexData = &replenishIndexData
+					}
+				}
+
+				// 处理从最后一个数据到 endDate 的日期补充
+				if len(dataList) > 0 {
+					lastData := dataList[len(dataList)-1]
+					// 将最后一个数据日期到 endDate 之间的自然日填充补充数据,值为 0
+					lastDataTime, _ := time.ParseInLocation(utils.FormatDate, lastData.DataTime, time.Local)
+					endDataTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+
+					// 如果 lastDataTime 不等于 endDate,进行补充
+					if !lastDataTime.Equal(endDataTime) {
+						// 补充数据直到 endDate
+						for lastDataTime.Before(endDataTime) {
+							// 补充数据
+							addDate := lastDataTime.AddDate(0, 0, 1)
+							nextDay := addDate.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: addDate.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 lastDataTime 到下一个日期
+							lastDataTime = addDate
+						}
+					}
+				}
+
+				dataList = append(dataList, replenishDataList...)
+
+				// 根据基准指标筛选出符合数据
+				var resultDataList []*models.EdbDataList
+				for _, dataObject := range dataList {
+					_, ok = standardIndexMap[dataObject.DataTime]
+					if ok {
+						// 存在才保留
+						resultDataList = append(resultDataList, dataObject)
+					}
+				}
+
+				// 排序
+				sort.Slice(resultDataList, func(i, j int) bool {
+					return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
+				})
+
+				v.DataList = resultDataList
+			}
+		}
+	}
+	return nil
+}
+
+type FillWithNextStrategy struct{}
+
+// Deal 空值填充:后值填充
+func (f *FillWithNextStrategy) Deal(tmpConfig data_manage.AreaExtraConf, edbDataList []*models.ChartEdbInfoMapping, standardIndexMap map[string]*models.EdbDataList, startDate string, endDate string) (err error) {
+	// 按自然日补充,再根据基准指标取对应数据
+	for _, v := range edbDataList {
+		if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
+			if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+
+				// 存放补充数据
+				var replenishDataList []*models.EdbDataList
+
+				// 处理从 startDate 到第一个数据的日期补充
+				if len(dataList) > 0 {
+					firstData := dataList[0]
+					// 将 startDate 到第一个数据日期之间的自然日填充补充数据,值为 0
+					startDataTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+					firstDataTime, _ := time.ParseInLocation(utils.FormatDate, firstData.DataTime, time.Local)
+
+					// 计算两个日期之间的天数差
+					if !startDataTime.Equal(firstDataTime) {
+						for !startDataTime.After(firstDataTime) {
+							// 补充数据
+							nextDay := startDataTime.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: startDataTime.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 startDataTime 到下一个日期
+							startDataTime = startDataTime.AddDate(0, 0, 1)
+						}
+					}
+				}
+
+				// 处理从最后一个数据到 endDate 的日期补充
+				if len(dataList) > 0 {
+					lastData := dataList[len(dataList)-1]
+					// 将最后一个数据日期到 endDate 之间的自然日填充补充数据,值为 0
+					lastDataTime, _ := time.ParseInLocation(utils.FormatDate, lastData.DataTime, time.Local)
+					endDataTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+
+					// 如果 lastDataTime 不等于 endDate,进行补充
+					if !lastDataTime.Equal(endDataTime) {
+						// 补充数据直到 endDate
+						for lastDataTime.Before(endDataTime) {
+							// 补充数据
+							addDate := lastDataTime.AddDate(0, 0, 1)
+							nextDay := addDate.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: addDate.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 lastDataTime 到下一个日期
+							lastDataTime = addDate
+						}
+					}
+				}
+
+				// 将切片数据倒序
+				reverseSlice(dataList)
+
+				// 处理指标中空值数据
+				for index := 0; index < len(dataList)-1; index++ {
+					// 获取当前数据和下一个数据
+					beforeIndexData := dataList[index]
+					afterIndexData := dataList[index+1]
+
+					for utils.IsMoreThanOneDay(afterIndexData.DataTime, beforeIndexData.DataTime) {
+						// 创建补充数据
+						nextDay := utils.GetNextDay(afterIndexData.DataTime)
+
+						toTime := utils.StringToTime(nextDay)
+						replenishIndexData := models.EdbDataList{
+							EdbInfoId:     v.EdbInfoId,
+							DataTime:      nextDay,
+							DataTimestamp: toTime.UnixMilli(),
+							Value:         beforeIndexData.Value,
+						}
+
+						// 将补充数据加入补充数据列表
+						replenishDataList = append(replenishDataList, &replenishIndexData)
+
+						// 更新 beforeIndexData 为新创建的补充数据
+						afterIndexData = &replenishIndexData
+					}
+				}
+
+				dataList = append(dataList, replenishDataList...)
+
+				// 根据基准指标筛选出符合数据
+				var resultDataList []*models.EdbDataList
+				for _, dataObject := range dataList {
+					_, ok = standardIndexMap[dataObject.DataTime]
+					if ok {
+						// 存在才保留
+						resultDataList = append(resultDataList, dataObject)
+					}
+				}
+
+				// 排序
+				sort.Slice(resultDataList, func(i, j int) bool {
+					return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
+				})
+
+				v.DataList = resultDataList
+			}
+		}
+	}
+	return nil
+}
+
+type SetToZeroStrategy struct{}
+
+// Deal 空值填充:设为0
+func (s *SetToZeroStrategy) Deal(tmpConfig data_manage.AreaExtraConf, edbDataList []*models.ChartEdbInfoMapping, standardIndexMap map[string]*models.EdbDataList, startDate string, endDate string) (err error) {
+	// 按自然日补充,再根据基准指标取对应数据
+	for _, v := range edbDataList {
+		if v.EdbInfoId != tmpConfig.StandardEdbInfoId {
+			if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+				// 存放补充数据
+				var replenishDataList []*models.EdbDataList
+
+				// 处理从 startDate 到第一个数据的日期补充
+				if len(dataList) > 0 {
+					firstData := dataList[0]
+					// 将 startDate 到第一个数据日期之间的自然日填充补充数据,值为 0
+					startDataTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+					firstDataTime, _ := time.ParseInLocation(utils.FormatDate, firstData.DataTime, time.Local)
+
+					// 计算两个日期之间的天数差
+					if !startDataTime.Equal(firstDataTime) {
+						for startDataTime.Before(firstDataTime) {
+							// 补充数据
+							nextDay := startDataTime.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: startDataTime.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 startDataTime 到下一个日期
+							startDataTime = startDataTime.AddDate(0, 0, 1)
+						}
+					}
+				}
+
+				// 处理指标中空值数据
+				for index := 0; index < len(dataList)-1; index++ {
+					// 获取当前数据和下一个数据
+					beforeIndexData := dataList[index]
+					afterIndexData := dataList[index+1]
+
+					for utils.IsMoreThanOneDay(beforeIndexData.DataTime, afterIndexData.DataTime) {
+						// 创建补充数据
+						nextDay := utils.GetNextDay(beforeIndexData.DataTime)
+
+						toTime := utils.StringToTime(nextDay)
+						replenishIndexData := models.EdbDataList{
+							EdbInfoId:     v.EdbInfoId,
+							DataTime:      nextDay,
+							DataTimestamp: toTime.UnixMilli(),
+							Value:         0,
+						}
+
+						// 将补充数据加入补充数据列表
+						replenishDataList = append(replenishDataList, &replenishIndexData)
+
+						// 更新 beforeIndexData 为新创建的补充数据
+						beforeIndexData = &replenishIndexData
+					}
+				}
+
+				// 处理从最后一个数据到 endDate 的日期补充
+				if len(dataList) > 0 {
+					lastData := dataList[len(dataList)-1]
+					// 将最后一个数据日期到 endDate 之间的自然日填充补充数据,值为 0
+					lastDataTime, _ := time.ParseInLocation(utils.FormatDate, lastData.DataTime, time.Local)
+					endDataTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+
+					// 如果 lastDataTime 不等于 endDate,进行补充
+					if !lastDataTime.Equal(endDataTime) {
+						// 补充数据直到 endDate
+						for lastDataTime.Before(endDataTime) {
+							// 补充数据
+							addDate := lastDataTime.AddDate(0, 0, 1)
+							nextDay := addDate.Format(utils.FormatDate)
+
+							// 生成补充数据,值为 0
+							replenishIndexData := models.EdbDataList{
+								EdbInfoId:     v.EdbInfoId,
+								DataTime:      nextDay,
+								DataTimestamp: addDate.UnixMilli(),
+								Value:         0,
+							}
+
+							// 将补充数据加入补充数据列表
+							replenishDataList = append(replenishDataList, &replenishIndexData)
+
+							// 更新 lastDataTime 到下一个日期
+							lastDataTime = addDate
+						}
+					}
+				}
+
+				dataList = append(dataList, replenishDataList...)
+
+				// 根据基准指标筛选出符合数据
+				var resultDataList []*models.EdbDataList
+				for _, dataObject := range dataList {
+					_, ok = standardIndexMap[dataObject.DataTime]
+					if ok {
+						// 存在才保留
+						resultDataList = append(resultDataList, dataObject)
+					}
+				}
+
+				// 排序
+				sort.Slice(resultDataList, func(i, j int) bool {
+					return resultDataList[i].DataTimestamp < resultDataList[j].DataTimestamp
+				})
+
+				v.DataList = resultDataList
+			}
+		}
+	}
+	return nil
+}
+
+type DeleteDateStrategy struct{}
+
+// Deal 删除日期
+func (d *DeleteDateStrategy) Deal(tmpConfig data_manage.AreaExtraConf, edbDataList []*models.ChartEdbInfoMapping, standardIndexMap map[string]*models.EdbDataList, startDate string, endDate string) error {
+	// 取所有指标的时间交集
+	// 创建一个 map 来保存每个时间点的出现次数
+	timeMap := make(map[string]int)
+	for _, v := range edbDataList {
+		if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+			// 遍历所有的 dataList,为每个 DataTime 增加一个计数
+			for _, dataObject := range dataList {
+				timeMap[dataObject.DataTime]++
+			}
+		}
+	}
+
+	for _, v := range edbDataList {
+		if dataList, ok := v.DataList.([]*models.EdbDataList); ok {
+			// 遍历所有的 dataList,保留所有时间点在所有指标中都存在的数据
+			var resultDataList []*models.EdbDataList
+			for _, dataObject := range dataList {
+				if timeMap[dataObject.DataTime] == len(edbDataList) {
+					// 如果该时间点在所有指标中都存在,加入到结果列表
+					resultDataList = append(resultDataList, dataObject)
+				}
+			}
+
+			// 将符合条件的数据重新赋值回 v.DataList
+			v.DataList = resultDataList
+		}
+	}
+	return nil
+}
+
+// 将列表颠倒
+func reverseSlice(dataList []*models.EdbDataList) {
+	// 使用双指针法,前后两个指针向中间逼近
+	for i, j := 0, len(dataList)-1; i < j; i, j = i+1, j-1 {
+		// 交换位置
+		dataList[i], dataList[j] = dataList[j], dataList[i]
+	}
+}

+ 28 - 0
services/data/area_graph/processor_factory.go

@@ -0,0 +1,28 @@
+package area_graph
+
+import (
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/models/data_manage"
+	"fmt"
+)
+
+type NullDealStrategy interface {
+	Deal(tmpConfig data_manage.AreaExtraConf, edbDataList []*models.ChartEdbInfoMapping, standardIndexMap map[string]*models.EdbDataList, startDate string, endDate string) (err error)
+}
+
+func CreateStrategy(dealWay int) (NullDealStrategy, error) {
+	switch dealWay {
+	case 1:
+		return &InterpolateStrategy{}, nil
+	case 2:
+		return &FillWithPreviousStrategy{}, nil
+	case 3:
+		return &FillWithNextStrategy{}, nil
+	case 4:
+		return &SetToZeroStrategy{}, nil
+	case 5:
+		return &DeleteDateStrategy{}, nil
+	default:
+		return nil, fmt.Errorf("未知的空值处理类型: %d", dealWay)
+	}
+}

+ 332 - 21
services/data/chart_info.go

@@ -293,7 +293,7 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
 			// 季节性图计算不管图上数据时间,拿所有数据
-			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			_, tempEdbList, e := getEdbDataMapListForSeason(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
 			if e != nil {
 				err = e
 				return
@@ -364,7 +364,13 @@ func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*models.EdbDataList, edbList []*models.ChartEdbInfoMapping, err error) {
 	// 指标对应的所有数据
 	edbDataListMap = make(map[int][]*models.EdbDataList)
-
+	seasonXStartDateWithYear := ""
+	seasonXEndDateWithYear := ""
+	if chartType == 2 {
+		sort.Slice(mappingList, func(i, j int) bool {
+			return mappingList[i].IsAxis > mappingList[j].IsAxis
+		})
+	}
 	for _, v := range mappingList {
 		//fmt.Println("v:", v.EdbInfoId)
 		item := new(models.ChartEdbInfoMapping)
@@ -399,6 +405,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 			item.ChartStyle = ""
 			item.ChartColor = ""
 			item.ChartWidth = 0
+			item.ChartScale = 0
 			item.MaxData = v.MaxValue
 			item.MinData = v.MinValue
 		} else {
@@ -412,6 +419,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 			item.ChartStyle = v.ChartStyle
 			item.ChartColor = v.ChartColor
 			item.ChartWidth = v.ChartWidth
+			item.ChartScale = v.ChartScale
 			item.IsOrder = v.IsOrder
 			item.MaxData = v.MaxData
 			item.MinData = v.MinData
@@ -535,9 +543,14 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		if chartType == 2 && item.IsAxis == 1 {
 			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
 			if tmpErr != nil {
+				//item.DataList = dataList
+				item.IsNullData = true
+				edbList = append(edbList, item)
+				continue
 				err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
 				return
 			}
+
 			if calendar == "农历" {
 				if len(dataList) <= 0 {
 					result := new(models.EdbDataResult)
@@ -548,33 +561,29 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 						err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
 						return
 					}
-					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
+					quarterDataList, xStartDateWithYearTmp, xEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
 					if tErr != nil {
 						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 						return
 					}
 					item.DataList = quarterDataList
+					seasonXStartDateWithYear = xStartDateWithYearTmp
+					seasonXEndDateWithYear = xEndDateWithYearTmp
 				}
 
 			} else {
-				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
+				quarterDataList, xStartDateWithYearTmp, xEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
 				if tErr != nil {
 					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 					return
 				}
 				item.DataList = quarterDataList
+				seasonXStartDateWithYear = xStartDateWithYearTmp
+				seasonXEndDateWithYear = xEndDateWithYearTmp
 			}
+
 		} else if chartType == 2 && item.IsAxis == 0 {
-			// 右轴数据处理,只要最新一年
-			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
-			if tmpErr != nil {
-				//item.DataList = dataList
-				item.IsNullData = true
-				edbList = append(edbList, item)
-				continue
-				err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
-				return
-			}
+			// 右轴数据处理
 			newDataList := make([]*models.EdbDataList, 0)
 			for _, v := range dataList {
 				dataTime, e := time.Parse(utils.FormatDate, v.DataTime)
@@ -582,7 +591,10 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 					err = errors.New("季节性图处理右轴指标数据转换日期失败,Err:" + e.Error())
 					return
 				}
-				if dataTime.Year() == latestDate.Year() {
+				seasonXStartDateWithYearT, _ := time.Parse(utils.FormatDate, seasonXStartDateWithYear)
+				seasonXEndDateWithYearT, _ := time.Parse(utils.FormatDate, seasonXEndDateWithYear)
+
+				if (dataTime.After(seasonXStartDateWithYearT) && dataTime.Before(seasonXEndDateWithYearT)) || dataTime.Equal(seasonXStartDateWithYearT) || dataTime.Equal(seasonXEndDateWithYearT) {
 					newDataList = append(newDataList, v)
 				}
 			}
@@ -599,7 +611,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 }
 
 // GetSeasonEdbInfoDataListByXDate 季节性图的指标数据根据横轴展示
-func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate time.Time, seasonExtraConfig string) (quarterDataListSort models.QuarterDataList, err error) {
+func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate time.Time, seasonExtraConfig string) (quarterDataListSort models.QuarterDataList, xStartDateWithYear string, xEndDateWithYear string, err error) {
 	xStartDate := "01-01"
 	xEndDate := "12-31"
 	jumpYear := 0
@@ -649,7 +661,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 		return
 	}
 	endYear := lastDateT.Year()
-	nowYear := time.Now().Year()
+	nowYear := endYear
 	chartLegendMaxYear := 0
 	dataMap := make(map[string]models.QuarterXDateItem, 0)
 
@@ -700,6 +712,8 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 		dataMap[name] = item
 		chartLegendMap[name] = idx
 		idx++
+		xStartDateWithYear = startStr
+		xEndDateWithYear = endStr
 		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
 		if lastDateT.Before(endT) {
 			//如果最新的日期在起始日之前,则跳出循环
@@ -794,7 +808,7 @@ func GetSeasonEdbInfoDataListByXDate(dataList []*models.EdbDataList, latestDate
 }
 
 // GetSeasonEdbInfoDataListByXDateNong 季节性图的指标数据根据横轴选择农历时展示
-func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDate time.Time, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort models.QuarterDataList, err error) {
+func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDate time.Time, seasonExtraConfig string, calendarPreYear int) (quarterDataListSort models.QuarterDataList, xStartDateWithYear string, xEndDateWithYear string, err error) {
 	xStartDate := "01-01"
 	xEndDate := "12-31"
 	jumpYear := 0
@@ -846,7 +860,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 		return
 	}
 	endYear := lastDateT.Year()
-	nowYear := time.Now().Year()
+	nowYear := endYear
 	chartLegendMaxYear := 0
 	dataMap := make(map[string]models.QuarterXDateItem, 0)
 
@@ -899,6 +913,8 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 		endTmpT = endT
 		chartLegendMap[showName] = idx
 		idx++
+		xStartDateWithYear = startStr
+		xEndDateWithYear = endStr
 		if lastDateT.Before(endT) {
 			//如果最新的日期在起始日之前,则跳出循环
 			break
@@ -965,6 +981,10 @@ func GetSeasonEdbInfoDataListByXDateNong(result *models.EdbDataResult, latestDat
 				Value:         item.Value,
 			}
 			dataTimeT, _ := time.Parse(utils.FormatDate, item.DataTime)
+			// year := dataTimeT.Year()
+			// newItemDate := dataTimeT.AddDate(nowYear-year, 0, 0)
+			// timestamp := newItemDate.UnixNano() / 1e6
+			// tmpVal.DataTimestamp = timestamp
 			if (startTmpT.Before(dataTimeT) && endTmpT.After(dataTimeT)) || startTmpT == dataTimeT || endTmpT == dataTimeT {
 				tmpV := &tmpVal
 				if findVal, ok := quarterMap[name]; !ok {
@@ -2013,6 +2033,11 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 					if v.ChartLegend == strconv.Itoa(time.Now().Year()) {
 						continue
 					}
+					// 农历时dataTimeList的年份为最新年份,图例时间的年份才是真实年份
+					chartLegend, _ := strconv.Atoi(v.ChartLegend)
+					if chartLegend < startYear {
+						continue
+					}
 					for _, date := range dataTimeList {
 						dateTime, e := time.Parse(utils.FormatDate, date)
 						if e != nil {
@@ -2144,6 +2169,11 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 						if dateTime.Year() < startYear {
 							continue
 						}
+						// 农历时dataTimeList的年份为最新年份,图例时间的年份才是真实年份
+						chartLegend, _ := strconv.Atoi(v.ChartLegend)
+						if chartLegend < startYear {
+							continue
+						}
 						// 月度的2月29号日期改为2月28日
 						if dateTime.Month() == 2 && dateTime.Day() == 29 {
 							dateTime = dateTime.AddDate(0, 0, -1)
@@ -2294,6 +2324,7 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 			dataTimeList := make([]string, 0)
 			valueMap := make(map[time.Time]float64)
 			averageDataList := make([]*models.SamePeriodAverageData, 0)
+			dateNumMap := make(map[time.Time]float64)
 			for i := len(quarterDataList) - 1; i >= 0; i-- {
 				// 插值成日度
 				dataTimeList, _, err = HandleDataByLinearRegressionToList(quarterDataList[i].DataList, handleDataMap)
@@ -2311,6 +2342,11 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 					if dateTime.Year() < startYear {
 						continue
 					}
+					// 农历时dataTimeList的年份为最新年份,图例时间的年份才是真实年份
+					chartLegend, _ := strconv.Atoi(quarterDataList[i].ChartLegend)
+					if chartLegend < startYear {
+						continue
+					}
 					// 不包含2月29号
 					if dateTime.Month() == 2 && dateTime.Day() == 29 {
 						continue
@@ -2322,19 +2358,26 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
-						valueMap[newDate] = (handleDataMap[date] + value) / 2
+						valueMap[newDate] = handleDataMap[date] + value
 					} else {
 						valueMap[newDate] = handleDataMap[date]
 					}
+					dateNumMap[newDate] += 1
 
 					dataTimeMap[newDate] = newDate
 				}
 			}
 
+			//year := float64(seasonConfig.SamePeriodAverage.Year)
 			for _, v := range dataTimeMap {
 				averageItem := &models.SamePeriodAverageData{}
+				year := dateNumMap[v]
 				if value, ok := valueMap[v]; ok {
-					averageItem.Value = value
+					if year > 0 {
+						averageItem.Value = value / year
+					} else {
+						averageItem.Value = value
+					}
 				}
 				averageItem.DataTime = v.Format(utils.FormatDate)
 				averageItem.DataTimestamp = v.UnixNano() / 1e6
@@ -2387,6 +2430,11 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 					if dateTime.Year() < startYear {
 						continue
 					}
+					// 农历时dataTimeList的年份为最新年份,图例时间的年份才是真实年份
+					chartLegend, _ := strconv.Atoi(quarterDataList[i].ChartLegend)
+					if chartLegend < startYear {
+						continue
+					}
 					// 不包含2月29号
 					if dateTime.Month() == 2 && dateTime.Day() == 29 {
 						continue
@@ -2464,3 +2512,266 @@ func SeasonChartData(dataList []*models.ChartEdbInfoMapping, seasonExtraConfig s
 
 	return
 }
+
+// getEdbDataMapListForSeason 获取指标最后的基础数据-插值补充好数据-季节性图用
+func getEdbDataMapListForSeason(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, seasonExtraConfig string) (edbDataListMap map[int][]*models.EdbDataList, edbList []*models.ChartEdbInfoMapping, err error) {
+	// 指标对应的所有数据
+	edbDataListMap = make(map[int][]*models.EdbDataList)
+	seasonXStartDateWithYear := ""
+	seasonXEndDateWithYear := ""
+	if chartType == 2 {
+		sort.Slice(mappingList, func(i, j int) bool {
+			return mappingList[i].IsAxis > mappingList[j].IsAxis
+		})
+	}
+	for _, v := range mappingList {
+		//fmt.Println("v:", v.EdbInfoId)
+		item := new(models.ChartEdbInfoMapping)
+		item.EdbInfoId = v.EdbInfoId
+		item.SourceName = v.SourceName
+		item.Source = v.Source
+		item.EdbCode = v.EdbCode
+		item.EdbName = v.EdbName
+		item.EdbNameEn = v.EdbNameEn
+		item.Frequency = v.Frequency
+		item.EdbType = v.EdbType
+		item.FrequencyEn = GetFrequencyEn(v.Frequency)
+		if v.Unit != `无` {
+			item.Unit = v.Unit
+		}
+		item.UnitEn = v.UnitEn
+		item.StartDate = v.StartDate
+		item.EndDate = v.EndDate
+		item.ModifyTime = v.ModifyTime
+		item.EdbInfoCategoryType = v.EdbInfoCategoryType
+		item.PredictChartColor = v.PredictChartColor
+		item.ClassifyId = v.ClassifyId
+		if chartInfoId <= 0 {
+			item.IsAxis = 1
+			item.LeadValue = 0
+			item.LeadUnit = ""
+			item.ChartEdbMappingId = 0
+			item.ChartInfoId = 0
+			item.IsOrder = false
+			item.EdbInfoType = 1
+			item.ChartStyle = ""
+			item.ChartColor = ""
+			item.ChartWidth = 0
+			item.MaxData = v.MaxValue
+			item.MinData = v.MinValue
+		} else {
+			item.IsAxis = v.IsAxis
+			item.EdbInfoType = v.EdbInfoType
+			item.LeadValue = v.LeadValue
+			item.LeadUnit = v.LeadUnit
+			item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
+			item.ChartEdbMappingId = v.ChartEdbMappingId
+			item.ChartInfoId = v.ChartInfoId
+			item.ChartStyle = v.ChartStyle
+			item.ChartColor = v.ChartColor
+			item.ChartWidth = v.ChartWidth
+			item.IsOrder = v.IsOrder
+			item.MaxData = v.MaxData
+			item.MinData = v.MinData
+		}
+		item.LatestValue = v.LatestValue
+		item.LatestDate = v.LatestDate
+		item.UniqueCode = v.UniqueCode
+		item.MoveLatestDate = v.LatestDate
+		item.EdbAliasName = v.EdbAliasName
+		item.IsConvert = v.IsConvert
+		item.ConvertType = v.ConvertType
+		item.ConvertValue = v.ConvertValue
+		item.ConvertUnit = v.ConvertUnit
+		item.ConvertEnUnit = v.ConvertEnUnit
+		item.IsJoinPermission = v.IsJoinPermission
+
+		var startDateReal string
+		var diffSeconds int64
+		if chartType == 2 { //季节性图
+			startDateReal = startDate
+			if len(mappingList) > 1 {
+				item.IsAxis = v.IsAxis
+			}
+		} else {
+			if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
+				var startTimeRealTemp time.Time
+				startDateParse, _ := time.Parse(utils.FormatDate, startDate)
+				switch v.LeadUnit {
+				case "天":
+					startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
+				case "月":
+					startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
+				case "季":
+					startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
+				case "周":
+					startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
+				case "年":
+					startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
+				}
+				if startTimeRealTemp.Before(startDateParse) {
+					startDateReal = startTimeRealTemp.Format(utils.FormatDate)
+					diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
+				} else {
+					startDateReal = startDate
+					diffSeconds = 0
+				}
+
+				// 预测指标的开始日期也要偏移
+				{
+					day, tmpErr := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+					moveLatestDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, item.MoveLatestDate, time.Local)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+					item.MoveLatestDate = moveLatestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
+				}
+			} else {
+				startDateReal = startDate
+			}
+		}
+		//fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
+		calendarPreYear := 0
+		if calendar == "农历" {
+			newStartDateReal, err := time.Parse(utils.FormatDate, startDateReal)
+			if err != nil {
+				fmt.Println("time.Parse:" + err.Error())
+			}
+			calendarPreYear = newStartDateReal.Year() - 1
+			newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
+			startDateReal = newStartDateReal.Format(utils.FormatDate)
+		}
+		dataList := make([]*models.EdbDataList, 0)
+		//fmt.Println("chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
+		//fmt.Println("calendarPreYear:", calendarPreYear)
+		//var newEdbInfo *data_manage.EdbInfo
+		switch v.EdbInfoCategoryType {
+		case 0:
+			dataList, err = models.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, startDateReal, endDate)
+		case 1:
+			_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, true)
+		default:
+			err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoCategoryType))
+		}
+		if err != nil {
+			return
+		}
+
+		handleDataMap := make(map[string]float64)
+		newDataList, _, _, e := HandleDataByLinearRegressionToListV3(dataList, handleDataMap)
+		if e != nil {
+			err = e
+			return
+		}
+
+		if v.IsConvert == 1 {
+			switch v.ConvertType {
+			case 1:
+				for i, data := range newDataList {
+					newDataList[i].Value = data.Value * v.ConvertValue
+				}
+				//item.MaxData = item.MaxData * v.ConvertValue
+				//item.MinData = item.MinData * v.ConvertValue
+			case 2:
+				for i, data := range newDataList {
+					newDataList[i].Value = data.Value / v.ConvertValue
+				}
+				//item.MaxData = item.MaxData / v.ConvertValue
+				//item.MinData = item.MinData / v.ConvertValue
+			case 3:
+				for i, data := range newDataList {
+					if data.Value <= 0 {
+						err = errors.New("数据中含有负数或0,无法对数运算")
+						return
+					}
+					newDataList[i].Value = math.Log(data.Value) / math.Log(v.ConvertValue)
+				}
+				//item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
+				//item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
+			}
+		}
+
+		edbDataListMap[v.EdbInfoId] = newDataList
+
+		if diffSeconds != 0 && v.EdbInfoType == 0 {
+			newDataListLen := len(newDataList)
+			for i := 0; i < newDataListLen; i++ {
+				newDataList[i].DataTimestamp = newDataList[i].DataTimestamp - diffSeconds
+			}
+		}
+
+		if chartType == 2 && item.IsAxis == 1 {
+			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
+			if tmpErr != nil {
+				//item.DataList = newDataList
+				item.IsNullData = true
+				edbList = append(edbList, item)
+				continue
+				err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + v.LatestDate))
+				return
+			}
+
+			if calendar == "农历" {
+				if len(newDataList) <= 0 {
+					result := new(models.EdbDataResult)
+					item.DataList = result
+				} else {
+					result, tmpErr := models.AddCalculateQuarterV6(newDataList)
+					if tmpErr != nil {
+						err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
+						return
+					}
+					quarterDataList, xStartDateWithYearTmp, xEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
+					if tErr != nil {
+						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+						return
+					}
+					seasonXStartDateWithYear = xStartDateWithYearTmp
+					seasonXEndDateWithYear = xEndDateWithYearTmp
+					item.DataList = quarterDataList
+				}
+
+			} else {
+				quarterDataList, xStartDateWithYearTmp, xEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDate(newDataList, latestDate, seasonExtraConfig)
+				if tErr != nil {
+					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
+					return
+				}
+				seasonXStartDateWithYear = xStartDateWithYearTmp
+				seasonXEndDateWithYear = xEndDateWithYearTmp
+				item.DataList = quarterDataList
+			}
+
+		} else if chartType == 2 && item.IsAxis == 0 {
+			// 右轴数据处理
+			// 右轴数据处理
+			newDataList := make([]*models.EdbDataList, 0)
+			for _, v := range dataList {
+				dataTime, e := time.Parse(utils.FormatDate, v.DataTime)
+				if e != nil {
+					err = errors.New("季节性图处理右轴指标数据转换日期失败,Err:" + e.Error())
+					return
+				}
+				seasonXStartDateWithYearT, _ := time.Parse(utils.FormatDate, seasonXStartDateWithYear)
+				seasonXEndDateWithYearT, _ := time.Parse(utils.FormatDate, seasonXEndDateWithYear)
+
+				if (dataTime.After(seasonXStartDateWithYearT) && dataTime.Before(seasonXEndDateWithYearT)) || dataTime.Equal(seasonXStartDateWithYearT) || dataTime.Equal(seasonXEndDateWithYearT) {
+					newDataList = append(newDataList, v)
+				}
+			}
+			item.DataList = newDataList
+		} else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
+			//item.DataList = newDataList
+		} else {
+			item.DataList = newDataList
+		}
+		edbList = append(edbList, item)
+	}
+
+	return
+}

+ 39 - 7
services/data/chart_info_excel_balance.go

@@ -63,7 +63,7 @@ func GetBalanceExcelChartDetail(chartInfo *models.ChartInfo, mappingListTmp []*e
 			dateType = 3
 		}
 	}
-	yearMax := 0
+	var dateMax time.Time
 	if dateType == utils.DateTypeNYears {
 		for _, v := range mappingList {
 			if v.LatestDate != "" {
@@ -73,13 +73,16 @@ func GetBalanceExcelChartDetail(chartInfo *models.ChartInfo, mappingListTmp []*e
 					err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
 					return
 				}
-				if lastDateT.Year() > yearMax {
-					yearMax = lastDateT.Year()
+				if lastDateT.After(dateMax) {
+					dateMax = lastDateT
 				}
 			}
 		}
 	}
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
+	if chartType == utils.CHART_TYPE_SEASON && dateType == utils.DateTypeNYears {
+		dateMax = time.Date(dateMax.Year()+1, 1, 1, 0, 0, 0, 0, time.Local)
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, dateMax)
 
 	if chartInfo.ChartType == 2 {
 		chartInfo.StartDate = startDate
@@ -145,6 +148,13 @@ func GetBalanceExcelChartDetail(chartInfo *models.ChartInfo, mappingListTmp []*e
 func GetBalanceExcelEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*models.ChartEdbInfoMapping, seasonExtraConfig string, dataListMap map[int][]*models.EdbDataList) (edbDataListMap map[int][]*models.EdbDataList, edbList []*models.ChartEdbInfoMapping, err error) {
 	// 指标对应的所有数据
 	edbDataListMap = make(map[int][]*models.EdbDataList)
+	seasonXStartDateWithYear := ""
+	seasonXEndDateWithYear := ""
+	if chartType == 2 {
+		sort.Slice(mappingList, func(i, j int) bool {
+			return mappingList[i].IsAxis > mappingList[j].IsAxis
+		})
+	}
 
 	for _, v := range mappingList {
 		//fmt.Println("v:", v.EdbInfoId)
@@ -312,7 +322,7 @@ func GetBalanceExcelEdbDataMapList(chartInfoId, chartType int, calendar, startDa
 			}
 		}
 
-		if chartType == 2 {
+		if chartType == 2 && v.IsAxis == 1 {
 			latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
 			if tmpErr != nil {
 				//item.DataList = dataList
@@ -331,23 +341,45 @@ func GetBalanceExcelEdbDataMapList(chartInfoId, chartType int, calendar, startDa
 						err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
 						return
 					}
-					quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
+					quarterDataList, xStartDateWithYearTmp, xEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
 					if tErr != nil {
 						err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 						return
 					}
+					seasonXStartDateWithYear = xStartDateWithYearTmp
+					seasonXEndDateWithYear = xEndDateWithYearTmp
 					item.DataList = quarterDataList
 				}
 
 			} else {
-				quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
+				quarterDataList, xStartDateWithYearTmp, xEndDateWithYearTmp, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
 				if tErr != nil {
 					err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
 					return
 				}
+				seasonXStartDateWithYear = xStartDateWithYearTmp
+				seasonXEndDateWithYear = xEndDateWithYearTmp
 				item.DataList = quarterDataList
 			}
 
+		} else if chartType == 2 && v.IsAxis == 0 {
+			// 右轴数据处理
+			// 右轴数据处理
+			newDataList := make([]*models.EdbDataList, 0)
+			for _, v := range dataList {
+				dataTime, e := time.Parse(utils.FormatDate, v.DataTime)
+				if e != nil {
+					err = errors.New("季节性图处理右轴指标数据转换日期失败,Err:" + e.Error())
+					return
+				}
+				seasonXStartDateWithYearT, _ := time.Parse(utils.FormatDate, seasonXStartDateWithYear)
+				seasonXEndDateWithYearT, _ := time.Parse(utils.FormatDate, seasonXEndDateWithYear)
+
+				if (dataTime.After(seasonXStartDateWithYearT) && dataTime.Before(seasonXEndDateWithYearT)) || dataTime.Equal(seasonXStartDateWithYearT) || dataTime.Equal(seasonXEndDateWithYearT) {
+					newDataList = append(newDataList, v)
+				}
+			}
+			item.DataList = newDataList
 		} else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
 			//item.DataList = dataList
 		} else {

+ 5 - 6
services/data/chart_theme.go

@@ -17,14 +17,14 @@ import (
 // @return err error
 func GetChartThemeConfig(chartThemeId, source, chartType int) (chartTheme *chart_theme.ChartTheme, err error) {
 	chartTheme, err = chart_theme.GetChartThemeId(chartThemeId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	err = nil
 
 	// 如果找到了,那么就返回
-	if chartTheme != nil {
+	if chartTheme != nil && chartTheme.ChartThemeId > 0 {
 		// 兼容历史数据,加入新字段LineOptionList
 		newConfig, e := ConvertOldChartOptions(chartTheme.Config)
 		if e == nil {
@@ -46,14 +46,14 @@ func GetChartThemeConfig(chartThemeId, source, chartType int) (chartTheme *chart
 
 	// 寻找默认的主题id
 	chartTheme, err = chart_theme.GetChartThemeId(chartThemeType.DefaultChartThemeId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	err = nil
 
 	// 如果找到了,那么就返回
-	if chartTheme != nil {
+	if chartTheme != nil && chartTheme.ChartThemeTypeId > 0 {
 		// 兼容历史数据,加入新字段LineOptionList
 		newConfig, e := ConvertOldChartOptions(chartTheme.Config)
 		if e == nil {
@@ -79,7 +79,6 @@ func GetChartThemeConfig(chartThemeId, source, chartType int) (chartTheme *chart
 	return
 }
 
-
 // 兼容历史数据,加入新字段LineOptionList
 func ConvertOldChartOptions(config string) (newConfig string, err error) {
 	var oldTheme chart_theme.OldChartOptions
@@ -108,4 +107,4 @@ func ConvertOldChartOptions(config string) (newConfig string, err error) {
 	newThemeStr, _ := json.Marshal(newTheme)
 	newConfig = string(newThemeStr)
 	return
-}
+}

+ 83 - 4
services/data/edb_info.go

@@ -317,7 +317,7 @@ func EdbInfoRefreshAllFromBaseBak(edbInfoIdList []int, refreshAll bool) (err err
 // getRefreshEdbInfoList 获取待更新的指标(普通基础指标、普通运算指标,预测运算指标)
 func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int, err error, errMsg string) {
 	calculateList, err := data_manage.GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		err = errors.New("GetEdbInfoAllCalculate Err:" + err.Error())
 		return
 	}
@@ -1268,9 +1268,8 @@ func GetEdbSourceByEdbInfoIdListForExcel(edbInfoIdList []int) (sourceNameList, s
 	return
 }
 
-
 // HandleDataByLinearRegressionToList 插值法补充数据(线性方程式)
-func HandleDataByLinearRegressionToList (edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (dataTimeList []string,valueList []float64, err error) {
+func HandleDataByLinearRegressionToList(edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (dataTimeList []string, valueList []float64, err error) {
 	if len(edbInfoDataList) < 2 {
 		return
 	}
@@ -1406,4 +1405,84 @@ func HandleDataByLinearRegressionToListV2(edbInfoDataList []*models.EdbDataList,
 	}
 
 	return
-}
+}
+
+// HandleDataByLinearRegressionToListV3 插值法补充数据(线性方程式)-直接补充指标起始日期间的所有数据
+func HandleDataByLinearRegressionToListV3(edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (newEdbInfoDataList []*models.EdbDataList, dataTimeList []string, valueList []float64, err error) {
+	if len(edbInfoDataList) < 2 {
+		return
+	}
+
+	var startEdbInfoData *models.EdbDataList
+	for _, v := range edbInfoDataList {
+		handleDataMap[v.DataTime] = v.Value
+		newEdbInfoDataList = append(newEdbInfoDataList, v)
+		dataTimeList = append(dataTimeList, v.DataTime)
+		// 第一个数据就给过滤了,给后面的试用
+		if startEdbInfoData == nil {
+			startEdbInfoData = v
+			//startEdbInfoData.DataTime = startEdbInfoData.DataTime[:5]+ "01-01"
+			continue
+		}
+
+		// 获取两条数据之间相差的天数
+		startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
+		currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
+		betweenHour := int(currDataTime.Sub(startDataTime).Hours())
+		betweenDay := betweenHour / 24
+
+		// 如果相差一天,那么过滤
+		if betweenDay <= 1 {
+			startEdbInfoData = v
+			continue
+		}
+
+		// 生成线性方程式
+		var a, b float64
+		{
+			coordinateData := make([]utils.Coordinate, 0)
+			tmpCoordinate1 := utils.Coordinate{
+				X: 1,
+				Y: startEdbInfoData.Value,
+			}
+			coordinateData = append(coordinateData, tmpCoordinate1)
+			tmpCoordinate2 := utils.Coordinate{
+				X: float64(betweenDay) + 1,
+				Y: v.Value,
+			}
+			coordinateData = append(coordinateData, tmpCoordinate2)
+
+			a, b = utils.GetLinearResult(coordinateData)
+			if math.IsNaN(a) || math.IsNaN(b) {
+				err = errors.New("线性方程公式生成失败")
+				return
+			}
+		}
+
+		// 生成对应的值
+		{
+			for i := 1; i < betweenDay; i++ {
+				tmpDataTime := startDataTime.AddDate(0, 0, i)
+				aDecimal := decimal.NewFromFloat(a)
+				xDecimal := decimal.NewFromInt(int64(i) + 1)
+				bDecimal := decimal.NewFromFloat(b)
+
+				val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
+				handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
+				dataTimeList = append(dataTimeList, tmpDataTime.Format(utils.FormatDate))
+				valueList = append(valueList, val)
+				newEdbInfoDataList = append(newEdbInfoDataList, &models.EdbDataList{
+					EdbDataId:     v.EdbDataId,
+					EdbInfoId:     v.EdbInfoId,
+					DataTime:      tmpDataTime.Format(utils.FormatDate),
+					DataTimestamp: tmpDataTime.UnixNano() / 1e6,
+					Value:         val,
+				})
+			}
+		}
+
+		startEdbInfoData = v
+	}
+
+	return
+}

+ 1 - 1
services/data/excel/balance_table.go

@@ -80,7 +80,7 @@ func GetBalanceExcelChartSingle(chartInfoId, ChartEdbId int, lang string) (mappi
 	excelInfoId := mappingListTmp[0].ExcelInfoId
 	excelInfo, err := excel.GetExcelInfoById(excelInfoId)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			errMsg = "表格不存在"
 			err = fmt.Errorf(errMsg)
 			return

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

@@ -1125,7 +1125,7 @@ func GetExcelDetailInfoByExcelInfoId(uniqueCode, lang string) (excelDetail excel
 	excelInfo, err := excel.GetExcelInfoByUniqueCode(uniqueCode)
 	if err != nil {
 		err = errors.New("获取ETA表格信息失败,Err:" + err.Error())
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			errMsg = "ETA表格被删除,请刷新页面"
 			err = errors.New("ETA表格被删除,请刷新页面,Err:" + err.Error())
 		}

+ 52 - 8
services/data/excel/mixed_table.go

@@ -9,12 +9,13 @@ import (
 	"eta/eta_chart_lib/services/data"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/shopspring/decimal"
-	"github.com/yidane/formula"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/shopspring/decimal"
+	"github.com/yidane/formula"
 )
 
 // BaseCalculate
@@ -1185,10 +1186,19 @@ func handleMixCellShowStyle(showStyleList []string, calculateCellMap map[string]
 
 			cell := config[cellPosition.Column][cellPosition.Row]
 			val := cell.ShowValue
-			isPercent := false
-			if strings.Contains(val, "%") {
-				isPercent = true
-				val = strings.Trim(val, "%")
+			// 不支持手动输入的%数
+			// isPercent := false
+			// if strings.Contains(val, "%") {
+			// 	isPercent = true
+			// 	val = strings.Trim(val, "%")
+			// }
+			// 如果没有showValue, 则使用value
+			if cell.ShowValue == "" {
+				_, err := strconv.ParseFloat(cell.Value, 64)
+				if err == nil {
+					val = cell.Value
+					cell.ShowValue = cell.Value
+				}
 			}
 			_, e := strconv.ParseFloat(val, 64) // 将字符串转换成float类型
 			if e != nil {                       // 如果没有错误发生则返回true,说明该字符串是一个合法的数字
@@ -1200,13 +1210,47 @@ func handleMixCellShowStyle(showStyleList []string, calculateCellMap map[string]
 				err = fmt.Errorf("日期计算配置json解析失败失败: %s, Err:%s", config, err.Error())
 				return
 			}
+			hasPercent := false
+			if styleConf.Nt == "percent" {
+				hasPercent = true
+			}
 
 			if styleConf.Pn != 0 || styleConf.Nt != "" {
-				val = changePointDecimalPlaces(val, styleConf.Pn, styleConf.Nt, isPercent)
-				cell.ShowFormatValue = val
+				// val = changePointDecimalPlaces(val, styleConf.Pn, styleConf.Nt, isPercent)
+				// cell.ShowFormatValue = val
+				// 修复历史数据,没有保存小数位数,重置小数位数
+				if styleConf.Pn != 0 {
+					if styleConf.Decimal == nil {
+						styleConf.Decimal = new(int)
+					}
+					*styleConf.Decimal += styleConf.Pn
+					if *styleConf.Decimal < 0 {
+						*styleConf.Decimal = 0
+					}
+					cell.ShowFormatValue = utils.RoundNumber(cell.ShowValue, *styleConf.Decimal, hasPercent)
+					styleConf.Pn = 0
+				} else if styleConf.Decimal != nil {
+					cell.ShowFormatValue = utils.RoundNumber(cell.ShowValue, *styleConf.Decimal, hasPercent)
+				} else {
+					if hasPercent {
+						numDecimal, _ := decimal.NewFromString(cell.ShowValue)
+						tmpStr := numDecimal.Mul(decimal.NewFromInt(100)).String()
+						cell.ShowFormatValue = tmpStr + "%"
+					} else {
+						cell.ShowFormatValue = cell.ShowValue
+					}
+				}
+			} else if styleConf.Decimal != nil {
+				cell.ShowFormatValue = utils.RoundNumber(cell.ShowValue, *styleConf.Decimal, hasPercent)
 			} else {
 				cell.ShowFormatValue = cell.ShowValue
 			}
+			// 前端传过来的json中有可能有glObj,需要去掉
+			styleConf.GlObj = nil
+			tmpStyleConf, err := json.Marshal(styleConf)
+			if err == nil {
+				cell.ShowStyle = string(tmpStyleConf)
+			}
 			config[cellPosition.Column][cellPosition.Row] = cell
 		}
 	}

+ 58 - 3
services/data/excel/time_table.go

@@ -8,12 +8,13 @@ import (
 	"eta/eta_chart_lib/services/data"
 	"eta/eta_chart_lib/utils"
 	"fmt"
-	"github.com/shopspring/decimal"
-	"github.com/yidane/formula"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/shopspring/decimal"
+	"github.com/yidane/formula"
 )
 
 // TableDataConfig
@@ -27,6 +28,13 @@ type TableDataConfig struct {
 	ManualDate       []string                  `description:"手动配置的日期(未来的日期)"`
 	TableEdbInfoList []TableEdbInfo            `description:"表格内指标信息"`
 	TextRowData      [][]request.ManualDataReq `description:"文本列表"`
+	DecimalConfig    []DecimalConfig           `description:"小数位数配置"`
+}
+
+type DecimalConfig struct {
+	Row     string `description:"行上的索引, 目前仅保存指标的日期"`
+	Col     int    `description:"列上的索引, 目前仅保存edbInfoId"`
+	Decimal int    `description:"小数位数, 从左至右,从上到下的顺序"`
 }
 
 // TableEdbInfo
@@ -329,7 +337,7 @@ func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp reque
 			d[k2].ShowValue = utils.FormatTableDataShowValue(vf)
 		}
 	}
-
+	data = SetExcelShowValueByDecimalConfig(data, tableDataConfig.DecimalConfig)
 	resultResp = request.TableDataReq{
 		EdbInfoIdList: edbInfoIdList,
 		Sort:          tableDataConfig.Sort,
@@ -340,6 +348,53 @@ func GetDataByTableDataConfig(tableDataConfig TableDataConfig) (resultResp reque
 	return
 }
 
+func SetExcelShowValueByDecimalConfig(edbData []request.EdbInfoData, decimalConfig []DecimalConfig) []request.EdbInfoData {
+	if len(decimalConfig) <= 0 || len(edbData) <= 0 {
+		return edbData
+	}
+	edbInfoIndexMap := make(map[int]int)
+	dateIndexMap := make(map[string]int)
+	for i, edbInfo := range edbData {
+		edbInfoIndexMap[edbInfo.EdbInfoId] = i
+	}
+	for i, date := range edbData[0].Data {
+		dateIndexMap[date.DataTime] = i
+	}
+	for _, conf := range decimalConfig {
+		if conf.Col > 0 {
+			if edbIndex, ok := edbInfoIndexMap[conf.Col]; ok {
+				for i := 0; i < len(edbData[edbIndex].Data); i++ {
+					f, err := strconv.ParseFloat(edbData[edbIndex].Data[i].Value, 64)
+					if err != nil {
+						continue
+					}
+					if conf.Decimal == -1 {
+						continue
+					}
+					formatStr := fmt.Sprintf("%%.%df", conf.Decimal)
+					edbData[edbIndex].Data[i].ShowValue = fmt.Sprintf(formatStr, f)
+				}
+			}
+		}
+		if conf.Row != `` {
+			if dateIndex, ok := dateIndexMap[conf.Row]; ok {
+				for i := 0; i < len(edbData); i++ {
+					f, err := strconv.ParseFloat(edbData[i].Data[dateIndex].Value, 64)
+					if err != nil {
+						continue
+					}
+					if conf.Decimal == -1 {
+						continue
+					}
+					formatStr := fmt.Sprintf("%%.%df", conf.Decimal)
+					edbData[i].Data[dateIndex].ShowValue = fmt.Sprintf(formatStr, f)
+				}
+			}
+		}
+	}
+	return edbData
+}
+
 // GetTableDataConfig 根据TableDataReq配置获取相关数据配置
 func GetTableDataConfig(reqData request.TableDataReq) (tableDataConfig TableDataConfig, err error) {
 	// 指标数据

+ 3 - 83
services/data/predict_edb_info.go

@@ -96,90 +96,10 @@ func GetPredictDataListByPredictEdbInfoId(edbInfoId int, startDate, endDate stri
 // GetPredictDataListByPredictEdbInfo 根据预测指标信息获取预测指标的数据
 func GetPredictDataListByPredictEdbInfo(edbInfo *data_manage.EdbInfo, startDate, endDate string, isTimeBetween bool) (dataList []*models.EdbDataList, sourceEdbInfoItem *data_manage.EdbInfo, predictEdbConf *data_manage.PredictEdbConf, err error, errMsg string) {
 	// 非计算指标,直接从表里获取数据
-	if edbInfo.EdbType != 1 {
-		if !isTimeBetween {
-			endDate = ``
-		}
-		return GetPredictCalculateDataListByPredictEdbInfo(edbInfo, startDate, endDate)
-	}
-	// 查找该预测指标配置
-	predictEdbConfList, err := data_manage.GetPredictEdbConfListById(edbInfo.EdbInfoId)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		errMsg = "获取预测指标配置信息失败"
-		return
-	}
-	if len(predictEdbConfList) == 0 {
-		errMsg = "获取预测指标配置信息失败"
-		err = errors.New(errMsg)
-		return
+	if !isTimeBetween {
+		endDate = ``
 	}
-	predictEdbConf = predictEdbConfList[0]
-	if predictEdbConf == nil {
-		errMsg = "获取预测指标配置信息失败"
-		err = errors.New(errMsg)
-		return
-	}
-
-	// 来源指标
-	sourceEdbInfoItem, err = data_manage.GetEdbInfoById(predictEdbConf.SourceEdbInfoId)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			errMsg = "找不到来源指标信息"
-			err = errors.New(errMsg)
-		}
-		return
-	}
-
-	// 所有数据
-	allDataList := make([]*models.EdbDataList, 0)
-	//获取指标数据(实际已生成)
-	dataList, err = models.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, startDate, endDate)
-	if err != nil {
-		return
-	}
-	// 如果选择了日期,那么需要筛选所有的数据,用于未来指标的生成
-	if startDate != `` {
-		allDataList, err = models.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, "", "")
-		if err != nil {
-			return
-		}
-	} else {
-		allDataList = dataList
-	}
-
-	// 获取预测指标未来的数据
-	predictDataList := make([]*models.EdbDataList, 0)
-
-	endDateStr := edbInfo.EndDate //预测指标的结束日期
-
-	if isTimeBetween && endDate != `` { //如果是时间区间,同时截止日期不为空的情况,那么
-		reqEndDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
-		endDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfo.EndDate, time.Local)
-		// 如果选择的时间区间结束日期 晚于 当天,那么预测数据截止到当天
-		if reqEndDateTime.Before(endDateTime) {
-			endDateStr = endDate
-		}
-	}
-	//predictDataList, err = GetChartPredictEdbInfoDataList(*predictEdbConf, startDate, sourceEdbInfoItem.LatestDate, sourceEdbInfoItem.LatestValue, endDateStr, edbInfo.Frequency)
-	var predictMinValue, predictMaxValue float64
-	predictDataList, predictMinValue, predictMaxValue, err = GetChartPredictEdbInfoDataListByConfList(predictEdbConfList, startDate, sourceEdbInfoItem.LatestDate, endDateStr, edbInfo.Frequency, edbInfo.DataDateType, allDataList)
-
-	if err != nil {
-		return
-	}
-	dataList = append(dataList, predictDataList...)
-	if len(predictDataList) > 0 {
-		// 如果最小值 大于 预测值,那么将预测值作为最小值数据返回
-		if edbInfo.MinValue > predictMinValue {
-			edbInfo.MinValue = predictMinValue
-		}
-
-		// 如果最大值 小于 预测值,那么将预测值作为最大值数据返回
-		if edbInfo.MaxValue < predictMaxValue {
-			edbInfo.MaxValue = predictMaxValue
-		}
-	}
-	return
+	return GetPredictCalculateDataListByPredictEdbInfo(edbInfo, startDate, endDate)
 }
 
 // GetPredictCalculateDataListByPredictEdbInfo 根据预测运算指标信息获取预测指标的数据

+ 1059 - 0
services/data/range_analysis/chart_info.go

@@ -0,0 +1,1059 @@
+package range_analysis
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/models/data_manage"
+	"eta/eta_chart_lib/services/alarm_msg"
+	"eta/eta_chart_lib/services/data"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+	"math"
+	"time"
+
+	"github.com/shopspring/decimal"
+)
+
+// GetAutoCalculateDateDataList 获取当前时间相关的区间作为计算依据
+func GetAutoCalculateDateDataList(currentDate string, dataList []*models.EdbDataList, req *models.ChartRangeAnalysisExtraConf) (newDataList []*models.EdbDataList, err error) {
+	currentDateTime, _ := time.ParseInLocation(utils.FormatDate, currentDate, time.Local)
+	switch req.DateRangeType {
+	case 0:
+		// 智能划分得到一个开始日期,和结束日期
+		var startDateTime time.Time
+		if req.AutoDateConf.IsAutoStartDate == 0 { //固定设置
+			startDate := req.AutoDateConf.StartDate
+			if startDate == "" {
+				startDate = "2020-01-01"
+			}
+			startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		} else {
+			startConf := req.AutoDateConf.StartDateConf
+			startDate := ""
+			if startConf.BaseDateType == 0 { //
+				startDate = currentDate
+			} else if startConf.BaseDateType == 1 {
+				startDate = time.Now().Format(utils.FormatDate)
+			}
+			if startConf.MoveForward > 0 {
+				startDate = GetEdbDateByMoveForward(startDate, startConf.MoveForward, dataList)
+			}
+			if len(startConf.DateChange) > 0 {
+				startDate, err = HandleEdbDateChange(startDate, startConf.DateChange)
+				if err != nil {
+					err = fmt.Errorf("智能划分开始日期处理失败:%s", err.Error())
+					return
+				}
+			}
+			startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		}
+		var calStartTime, calEndTime time.Time
+		if currentDateTime.Before(startDateTime) {
+			calStartTime = currentDateTime
+			calEndTime = startDateTime
+		} else {
+			calStartTime = startDateTime
+			calEndTime = currentDateTime
+		}
+		// 根据日期,获取数据
+		for _, vv := range dataList {
+			dataTimeT, _ := time.ParseInLocation(utils.FormatDate, vv.DataTime, time.Local)
+			if dataTimeT.After(calStartTime) && dataTimeT.Before(calEndTime) ||
+				dataTimeT.Equal(calStartTime) ||
+				dataTimeT.Equal(calEndTime) {
+				newDataList = append(newDataList, vv)
+			}
+		}
+	}
+	return
+}
+
+// HandleDataByCalculateType 根据计算公式处理数据
+func HandleDataByCalculateType(originList []*models.ChartRangeAnalysisDateDataItem, originDataList []*models.EdbDataList, req *models.ChartRangeAnalysisExtraConf) (newList []*models.EdbDataList, err error) {
+	if len(originList) == 0 {
+		return
+	}
+	calculateType := req.CalculateType
+	switch calculateType {
+	case 0: //均值
+		var sum float64
+		if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
+			for _, item := range originList {
+				for _, v := range item.DataList {
+					sum = 0
+					//计算的数据返回需要重新确定
+					calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
+					if e != nil {
+						err = fmt.Errorf("获取区间数据失败:%s", e.Error())
+						return
+					}
+					for _, vv := range calDataList {
+						sum += vv.Value
+					}
+					val := sum / float64(len(calDataList))
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{
+						DataTime:      v.DataTime,
+						Value:         val,
+						DataTimestamp: v.DataTimestamp,
+					})
+				}
+			}
+		} else {
+			for _, item := range originList {
+				sum = 0
+				for k, v := range item.DataList {
+					sum += v.Value
+					val := sum / float64(k+1)
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{
+						DataTime:      v.DataTime,
+						Value:         val,
+						DataTimestamp: v.DataTimestamp,
+					})
+				}
+			}
+		}
+
+	case 1: //累计值
+		var sum float64
+		if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
+			for _, item := range originList {
+				sum = 0
+				for _, v := range item.DataList {
+					sum = 0
+					//计算的数据返回需要重新确定
+					calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
+					if e != nil {
+						err = fmt.Errorf("获取区间数据失败:%s", e.Error())
+						return
+					}
+					for _, vv := range calDataList {
+						sum += vv.Value
+					}
+					val := sum
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{
+						DataTime:      v.DataTime,
+						Value:         val,
+						DataTimestamp: v.DataTimestamp,
+					})
+				}
+			}
+		} else {
+			for _, item := range originList {
+				sum = 0
+				for _, v := range item.DataList {
+					sum += v.Value
+					val := sum
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{
+						DataTime:      v.DataTime,
+						Value:         val,
+						DataTimestamp: v.DataTimestamp,
+					})
+				}
+			}
+		}
+
+	case 2: //涨幅
+		if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
+			for _, item := range originList {
+				for _, v := range item.DataList {
+					var baseVal float64
+					//计算的数据返回需要重新确定
+					calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
+					if e != nil {
+						err = fmt.Errorf("获取区间数据失败:%s", e.Error())
+						return
+					}
+					if len(calDataList) == 0 {
+						continue
+					}
+					baseVal = calDataList[0].Value
+					baseDate := calDataList[0].DataTime
+					if baseVal == 0 {
+						continue
+					}
+					if v.DataTime == baseDate {
+						continue
+					}
+
+					val := (v.Value - baseVal) / baseVal
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{
+						DataTime:      v.DataTime,
+						Value:         val,
+						DataTimestamp: v.DataTimestamp,
+					})
+				}
+			}
+		} else {
+			for _, item := range originList {
+				if len(item.DataList) == 0 {
+					break
+				}
+				baseVal := item.DataList[0].Value
+				baseDate := item.DataList[0].DataTime
+				if baseVal == 0 {
+					break
+				}
+				for _, v := range item.DataList {
+					if v.DataTime == baseDate {
+						continue
+					}
+					val := (v.Value - baseVal) / baseVal
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{
+						DataTime:      v.DataTime,
+						Value:         val,
+						DataTimestamp: v.DataTimestamp,
+					})
+				}
+			}
+		}
+	case 3: //复合增长率
+		if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
+			for _, item := range originList {
+				for _, v := range item.DataList {
+					var baseVal float64
+					var baseDate string
+					calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
+					if e != nil {
+						err = fmt.Errorf("获取区间数据失败:%s", e.Error())
+						return
+					}
+					if len(calDataList) == 0 {
+						continue
+					}
+					baseVal = calDataList[0].Value
+					baseDate = calDataList[0].DataTime
+					if v.DataTime == baseDate {
+						continue
+					}
+					if baseVal == 0 {
+						continue
+					}
+
+					baseDateT, e := time.ParseInLocation(utils.FormatDate, baseDate, time.Local)
+					if e != nil {
+						err = fmt.Errorf("time.ParseInLocation err: %v", e)
+						return
+					}
+					tmpT, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
+					if e != nil {
+						err = fmt.Errorf("time.ParseInLocation err: %v", e)
+						return
+					}
+					// 计算两个日期相差的天数
+					diff := tmpT.Sub(baseDateT).Hours() / 24 / 365
+					val := v.Value / baseVal
+					val = math.Pow(val, 1/diff) - 1
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
+				}
+			}
+		} else {
+			for _, item := range originList {
+				if len(item.DataList) == 0 {
+					break
+				}
+				baseVal := item.DataList[0].Value
+				baseDate := item.DataList[0].DataTime
+				if baseVal == 0 {
+					break
+				}
+				for _, v := range item.DataList {
+					if v.DataTime == baseDate {
+						continue
+					}
+					baseDateT, e := time.ParseInLocation(utils.FormatDate, baseDate, time.Local)
+					if e != nil {
+						err = fmt.Errorf("time.ParseInLocation err: %v", e)
+						return
+					}
+					tmpT, e := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
+					if e != nil {
+						err = fmt.Errorf("time.ParseInLocation err: %v", e)
+						return
+					}
+					// 计算两个日期相差的天数
+					diff := tmpT.Sub(baseDateT).Hours() / 24 / 365
+					val := v.Value / baseVal
+					val = math.Pow(val, 1/diff) - 1
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
+				}
+			}
+		}
+	case 4: //最大值
+		var maxVal float64
+		if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
+			for _, item := range originList {
+				for _, v := range item.DataList {
+					calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
+					if e != nil {
+						err = fmt.Errorf("获取区间数据失败:%s", e.Error())
+						return
+					}
+					for kk, vv := range calDataList {
+						if kk == 0 {
+							maxVal = vv.Value
+						}
+						if vv.Value > maxVal {
+							maxVal = vv.Value
+						}
+					}
+
+					val := maxVal
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
+				}
+			}
+		} else {
+			for _, item := range originList {
+				for k, v := range item.DataList {
+					if k == 0 {
+						maxVal = v.Value
+					}
+					if v.Value > maxVal {
+						maxVal = v.Value
+					}
+					val := maxVal
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
+				}
+			}
+		}
+	case 5: //最小值
+		var minVal float64
+		if req.DateRangeType == 0 && req.AutoDateConf.IsAutoStartDate > 0 {
+			for _, item := range originList {
+				for _, v := range item.DataList {
+					calDataList, e := GetAutoCalculateDateDataList(v.DataTime, originDataList, req)
+					if e != nil {
+						err = fmt.Errorf("获取区间数据失败:%s", e.Error())
+						return
+					}
+					for kk, vv := range calDataList {
+						if kk == 0 {
+							minVal = vv.Value
+						}
+						if vv.Value < minVal {
+							minVal = vv.Value
+						}
+					}
+					val := minVal
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
+				}
+			}
+		} else {
+			for _, item := range originList {
+				for k, v := range item.DataList {
+					if k == 0 {
+						minVal = v.Value
+					}
+					if v.Value < minVal {
+						minVal = v.Value
+					}
+					val := minVal
+					val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+					newList = append(newList, &models.EdbDataList{DataTime: v.DataTime, Value: val, DataTimestamp: v.DataTimestamp})
+				}
+			}
+		}
+	}
+
+	return
+}
+
+// GetChartEdbInfoFormat 区间计算图表-获取指标信息
+func GetChartEdbInfoFormat(chartInfoId int, edbInfoMappingList []*models.ChartEdbInfoMapping) (edbList []*models.ChartEdbInfoMapping, err error) {
+	edbList = make([]*models.ChartEdbInfoMapping, 0)
+	for _, edbInfoMapping := range edbInfoMappingList {
+		if edbInfoMapping == nil {
+			err = fmt.Errorf("指标信息有误")
+			return
+		}
+
+		edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
+		if edbInfoMapping.Unit == `无` {
+			edbInfoMapping.Unit = ``
+		}
+		if chartInfoId <= 0 {
+			edbInfoMapping.IsAxis = 1
+			edbInfoMapping.LeadValue = 0
+			edbInfoMapping.LeadUnit = ""
+			edbInfoMapping.ChartEdbMappingId = 0
+			edbInfoMapping.ChartInfoId = 0
+			edbInfoMapping.IsOrder = false
+			edbInfoMapping.EdbInfoType = 1
+			edbInfoMapping.ChartStyle = ""
+			edbInfoMapping.ChartColor = ""
+			edbInfoMapping.ChartWidth = 0
+		} else {
+			edbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(edbInfoMapping.LeadUnit)
+		}
+		edbList = append(edbList, edbInfoMapping)
+	}
+	return
+}
+
+// GetChartDataByEdbInfoList 区间计算图表-根据指标信息获取x轴和y轴
+func GetChartDataByEdbInfoList(chartInfoId int, dateType, startYear int, startDate, endDate string, edbInfoMappingList []*models.ChartEdbInfoMapping, req *models.ChartRangeAnalysisExtraConf) (edbList []*models.ChartEdbInfoMapping, xEdbIdValue []int, dataResp models.ChartRangeAnalysisDataResp, err error) {
+	if chartInfoId > 0 && req.EdbInfoMode == 1 {
+		edbList, xEdbIdValue, dataResp, err = GetChartDataByEdbInfoListBySeries(chartInfoId, dateType, startYear, startDate, endDate, edbInfoMappingList, req)
+		return
+	}
+	for _, edbInfoMapping := range edbInfoMappingList {
+		edbInfoMapping, err = getChartDataByEdbInfo(edbInfoMapping, req)
+		if err != nil {
+			return
+		}
+		edbInfoMapping.ConvertUnit = edbInfoMapping.Unit
+		edbInfoMapping.ConvertEnUnit = edbInfoMapping.UnitEn
+		if req.CalculateType == 2 || req.CalculateType == 3 {
+			edbInfoMapping.ConvertUnit = "无"
+			edbInfoMapping.ConvertEnUnit = "无"
+		}
+		if req.DataConvertType > 0 && req.DataConvertConf.Unit != "" {
+			edbInfoMapping.ConvertUnit = req.DataConvertConf.Unit
+			edbInfoMapping.ConvertEnUnit = req.DataConvertConf.Unit
+		}
+		if edbInfoMapping.ConvertUnit == "无" {
+			edbInfoMapping.ConvertUnit = ""
+		}
+		if edbInfoMapping.ConvertEnUnit == "无" {
+			edbInfoMapping.ConvertEnUnit = ""
+		}
+		dataList := edbInfoMapping.DataList.([]*models.EdbDataList)
+		// 处理上下限
+		var maxData, minData float64
+		if len(dataList) > 0 {
+			maxData = dataList[0].Value
+			minData = dataList[0].Value
+			for _, v := range dataList {
+				if v.Value > maxData {
+					maxData = v.Value
+				}
+				if v.Value < minData {
+					minData = v.Value
+				}
+			}
+		}
+		edbInfoMapping.MaxData = maxData
+		edbInfoMapping.MinData = minData
+		xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
+	}
+	//根据时间类型来筛选最终的数据
+	var dateMax time.Time
+	if dateType == utils.DateTypeNYears {
+		for _, v := range edbInfoMappingList {
+			dataList := v.DataList.([]*models.EdbDataList)
+			if len(dataList) > 0 {
+				latestDate := dataList[len(dataList)-1].DataTime
+				if latestDate != "" {
+					lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
+					if tErr != nil {
+						err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
+					}
+					if lastDateT.After(dateMax) {
+						dateMax = lastDateT
+					}
+				}
+			}
+		}
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, dateMax)
+
+	if startDate != "" {
+		for k, v := range edbInfoMappingList {
+			var maxData, minData float64
+			dataList := v.DataList.([]*models.EdbDataList)
+			newDataList := make([]*models.EdbDataList, 0)
+			if len(dataList) == 0 {
+				newDataList = dataList
+			} else {
+				firstFlag := true
+				for _, d := range dataList {
+					if endDate != "" && d.DataTime > endDate {
+						continue
+					}
+					if d.DataTime < startDate {
+						continue
+					}
+					newDataList = append(newDataList, d)
+					if firstFlag {
+						maxData = d.Value
+						minData = d.Value
+						firstFlag = false
+					} else {
+						if d.Value > maxData {
+							maxData = d.Value
+						}
+						if d.Value < minData {
+							minData = d.Value
+						}
+					}
+				}
+			}
+			edbInfoMappingList[k].DataList = newDataList
+			edbInfoMappingList[k].MinData = minData
+			edbInfoMappingList[k].MaxData = maxData
+		}
+	}
+	dataResp = models.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req}
+	if req.MultipleGraphConfigId > 0 {
+		multipleGraphConfigEdbMappingList, e := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, utils.CHART_SOURCE_RANGE_ANALYSIS)
+		if e != nil && !utils.IsErrNoRow(e) {
+			err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
+			return
+		}
+		// 查询是否已经生成指标
+		dataResp.ConfigEdbNum = len(multipleGraphConfigEdbMappingList)
+	}
+	edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
+	if err != nil {
+		err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
+		return
+	}
+	return
+}
+
+func GetChartDataByEdbInfoListBySeries(chartInfoId int, dateType, startYear int, startDate, endDate string, edbInfoMappingList []*models.ChartEdbInfoMapping, req *models.ChartRangeAnalysisExtraConf) (edbList []*models.ChartEdbInfoMapping, xEdbIdValue []int, dataResp models.ChartRangeAnalysisDataResp, err error) {
+	//查询seriesId
+	chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
+	seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfoId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			err = fmt.Errorf("图表关联关系不存在")
+			return
+		} else {
+			err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
+			return
+		}
+	}
+	//根据seriesId查询数据
+	//并把数据放到dataList中
+	for _, edbInfoMapping := range edbInfoMappingList {
+		dataOb := new(models.FactorEdbSeriesCalculateDataQjjs)
+		dataList, e := dataOb.GetEdbDataList(seriesMappingItem.FactorEdbSeriesId, edbInfoMapping.EdbInfoId, startDate, endDate)
+		if e != nil {
+			err = e
+			return
+		}
+		edbInfoMapping.ConvertUnit = edbInfoMapping.Unit
+		edbInfoMapping.ConvertEnUnit = edbInfoMapping.UnitEn
+		if req.CalculateType == 2 || req.CalculateType == 3 {
+			edbInfoMapping.ConvertUnit = "无"
+			edbInfoMapping.ConvertEnUnit = "无"
+		}
+		if req.DataConvertType > 0 && req.DataConvertConf.Unit != "" {
+			edbInfoMapping.ConvertUnit = req.DataConvertConf.Unit
+			edbInfoMapping.ConvertEnUnit = req.DataConvertConf.Unit
+		}
+		if edbInfoMapping.ConvertUnit == "无" {
+			edbInfoMapping.ConvertUnit = ""
+		}
+		if edbInfoMapping.ConvertEnUnit == "无" {
+			edbInfoMapping.ConvertEnUnit = ""
+		}
+		edbInfoMapping.DataList = dataList
+		// 处理上下限
+		var maxData, minData float64
+		if len(dataList) > 0 {
+			maxData = dataList[0].Value
+			minData = dataList[0].Value
+			for _, v := range dataList {
+				if v.Value > maxData {
+					maxData = v.Value
+				}
+				if v.Value < minData {
+					minData = v.Value
+				}
+			}
+		}
+		edbInfoMapping.MaxData = maxData
+		edbInfoMapping.MinData = minData
+		xEdbIdValue = append(xEdbIdValue, edbInfoMapping.EdbInfoId)
+	}
+	var dateMax time.Time
+	if dateType == utils.DateTypeNYears {
+		for _, v := range edbInfoMappingList {
+			dataList := v.DataList.([]*models.EdbDataList)
+			latestDate := dataList[len(dataList)-1].DataTime
+			if latestDate != "" {
+				lastDateT, tErr := time.Parse(utils.FormatDate, latestDate)
+				if tErr != nil {
+					err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
+					return
+				}
+				if lastDateT.After(dateMax) {
+					dateMax = lastDateT
+				}
+			}
+		}
+	}
+	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, dateMax)
+
+	if startDate != "" {
+		for k, v := range edbInfoMappingList {
+			var maxData, minData float64
+			dataList := v.DataList.([]*models.EdbDataList)
+			newDataList := make([]*models.EdbDataList, 0)
+			if len(dataList) == 0 {
+				newDataList = dataList
+			} else {
+				firstFlag := true
+				for _, d := range dataList {
+					if endDate != "" && d.DataTime > endDate {
+						continue
+					}
+					if d.DataTime < startDate {
+						continue
+					}
+					newDataList = append(newDataList, d)
+					if firstFlag {
+						maxData = d.Value
+						minData = d.Value
+						firstFlag = false
+					} else {
+						if d.Value > maxData {
+							maxData = d.Value
+						}
+						if d.Value < minData {
+							minData = d.Value
+						}
+					}
+				}
+			}
+			edbInfoMappingList[k].DataList = newDataList
+			edbInfoMappingList[k].MinData = minData
+			edbInfoMappingList[k].MaxData = maxData
+		}
+	}
+	dataResp = models.ChartRangeAnalysisDataResp{ChartRangeAnalysisExtraConf: req, SeriesId: seriesMappingItem.FactorEdbSeriesId}
+	// 查询配置关联关系
+	if req.MultipleGraphConfigId > 0 {
+		multipleGraphConfigEdbMappingList, e := data_manage.GetMultipleGraphConfigEdbMappingListByIdAndSource(req.MultipleGraphConfigId, utils.CHART_SOURCE_RANGE_ANALYSIS)
+		if e != nil && !utils.IsErrNoRow(e) {
+			err = fmt.Errorf("获取区间计算图表, 指标信息失败, Err:" + e.Error())
+			return
+		}
+		// 查询是否已经生成指标
+		dataResp.ConfigEdbNum = len(multipleGraphConfigEdbMappingList)
+	}
+
+	edbList, err = GetChartEdbInfoFormat(chartInfoId, edbInfoMappingList)
+	if err != nil {
+		err = fmt.Errorf("获取区间计算图表, 完善指标信息失败, Err:" + err.Error())
+		return
+	}
+	return
+}
+
+// getChartDataByEdbInfo 区间计算图表-根据指标信息获取x轴和y轴
+func getChartDataByEdbInfo(edbInfoMapping *models.ChartEdbInfoMapping, req *models.ChartRangeAnalysisExtraConf) (newEdbInfoMapping *models.ChartEdbInfoMapping, err error) {
+	newEdbInfoMapping = edbInfoMapping
+	// 指标的开始日期和结束日期
+	edbStartDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfoMapping.StartDate, time.Local)
+	//edbStartDate := edbStartDateTime.AddDate(0, 0, 1).Format(utils.FormatDate)
+	edbEndDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfoMapping.EndDate, time.Local)
+	edbEndDate := edbEndDateTime.Format(utils.FormatDate)
+
+	// 获取时间基准指标在时间区间内的值
+	dataList := make([]*models.EdbDataList, 0)
+	switch edbInfoMapping.EdbInfoCategoryType {
+	case 0:
+		dataList, err = models.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.SubSource, edbInfoMapping.EdbInfoId, "", "")
+	case 1:
+		_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfoMapping.EdbInfoId, "", "", false)
+	default:
+		err = errors.New("指标base类型异常")
+		return
+	}
+
+	dateList := make([]*models.ChartRangeAnalysisDateDataItem, 0)
+	switch req.DateRangeType {
+	case 0:
+		// 智能划分得到一个开始日期,和结束日期
+		var startDateTime, endDateTime time.Time
+		startDateTime = edbStartDateTime
+		if req.AutoDateConf.IsAutoStartDate == 0 { //固定设置
+			startDate := req.AutoDateConf.StartDate
+			if startDate == "" {
+				startDate = "2020-01-01"
+			}
+			startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		}
+		if req.AutoDateConf.IsAutoEndDate == 0 { //固定设置
+			endDate := req.AutoDateConf.EndDate
+			if endDate == "" {
+				err = fmt.Errorf("智能划分截止日期处理失败:请输入截止日期")
+				return
+			}
+			// todo 如果截止日期比指标日期还要大,则用指标的最新日期
+			endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+		} else {
+			endConf := req.AutoDateConf.EndDateConf
+			endDate := edbEndDate
+			if endConf.MoveForward > 0 {
+				endDate = GetEdbDateByMoveForward(endDate, endConf.MoveForward, dataList)
+			}
+			if len(endConf.DateChange) > 0 {
+				endDate, err = HandleEdbDateChange(endDate, endConf.DateChange)
+				if err != nil {
+					err = fmt.Errorf("智能划分结束日期处理失败:%s", err.Error())
+					return
+				}
+			}
+			endDateTime, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+		}
+
+		dateList = append(dateList, &models.ChartRangeAnalysisDateDataItem{
+			StartDate: startDateTime,
+			EndDate:   endDateTime})
+	case 1:
+		// 手工划分得到多个开始日期和结束日期(已排序)
+		for _, v := range req.ManualDateConf {
+			startDateT, _ := time.ParseInLocation(utils.FormatDate, v.StartDate, time.Local)
+			endDateT, _ := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
+			tmp := &models.ChartRangeAnalysisDateDataItem{
+				StartDate: startDateT,
+				EndDate:   endDateT,
+			}
+			dateList = append(dateList, tmp)
+		}
+	case 2:
+		// 跨年划分得到多个开始日期和结束日期
+		startYear := edbStartDateTime.Year()
+		endYear := edbEndDateTime.Year()
+		startDay := req.YearDateConf.StartDay
+		endDay := req.YearDateConf.EndDay
+		for year := startYear; year <= endYear; year++ {
+			startDate := fmt.Sprintf("%d-%s", year, startDay)
+			endDate := fmt.Sprintf("%d-%s", year+1, endDay)
+			startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+			endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+			if startDateTime.Before(edbStartDateTime) {
+				break
+			}
+
+			tmp := &models.ChartRangeAnalysisDateDataItem{
+				StartDate: startDateTime,
+				EndDate:   endDateTime,
+			}
+			dateList = append(dateList, tmp)
+		}
+	}
+	// 根据日期,获取数据
+	for _, v := range dateList {
+		for _, vv := range dataList {
+			dataTimeT, _ := time.ParseInLocation(utils.FormatDate, vv.DataTime, time.Local)
+			if dataTimeT.After(v.StartDate) && dataTimeT.Before(v.EndDate) ||
+				dataTimeT.Equal(v.StartDate) ||
+				dataTimeT.Equal(v.EndDate) {
+				v.DataList = append(v.DataList, vv)
+			}
+		}
+	}
+	// 根据时间区间类型来获取数据的计算窗口,然后再拼接成整段数据
+	newDataList, err := HandleDataByCalculateType(dateList, dataList, req)
+	if err != nil {
+		return
+	}
+	if req.UnNormalDataDealType > 0 {
+		switch req.UnNormalDataDealType { //0:不处理,1:剔除,2替换
+		case 1:
+			dealDataList := make([]*models.EdbDataList, 0)
+			for _, v := range newDataList {
+				if !utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
+					dealDataList = append(dealDataList, v)
+				}
+			}
+			newDataList = dealDataList
+		case 2:
+			for i, v := range newDataList {
+				if utils.CompareFloatByOpStrings(req.UnNormalDataConf.Formula, v.Value, req.UnNormalDataConf.Value) {
+					newDataList[i].Value = req.UnNormalDataConf.ReplaceValue
+				}
+			}
+		}
+	}
+
+	if req.DataConvertType > 0 {
+		// 数据转换类型 0不转, 1乘 2除 3对数
+		switch req.DataConvertType {
+		case 1:
+			for i, v := range newDataList {
+				val := v.Value * req.DataConvertConf.Value
+				val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+				newDataList[i].Value = val
+			}
+			//item.MaxData = item.MaxData * v.ConvertValue
+			//item.MinData = item.MinData * v.ConvertValue
+		case 2:
+			for i, v := range newDataList {
+				val := v.Value / req.DataConvertConf.Value
+				val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+				newDataList[i].Value = val
+			}
+			//item.MaxData = item.MaxData / v.ConvertValue
+			//item.MinData = item.MinData / v.ConvertValue
+		case 3:
+			for i, v := range newDataList {
+				if v.Value <= 0 {
+					err = errors.New("数据中含有负数或0,无法对数运算")
+					return
+				}
+				val := math.Log(v.Value) / math.Log(req.DataConvertConf.Value)
+				val, _ = decimal.NewFromFloat(val).Round(4).Float64()
+				newDataList[i].Value = val
+			}
+			//item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
+			//item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
+		}
+	}
+	newEdbInfoMapping.DataList = newDataList
+	//时间处理
+
+	return
+}
+
+// RollingCorrelationChartDataResp 滚动区间计算图表数据
+type RollingCorrelationChartDataResp struct {
+	MaxData             float64
+	MinData             float64
+	LatestDate          string `description:"真实数据的最后日期"`
+	EdbInfoCategoryType int
+	ChartColor          string
+	ChartStyle          string
+	PredictChartColor   string
+	ChartType           int
+	ChartWidth          int
+	EdbName             string
+	EdbNameEn           string
+	Unit                string
+	UnitEn              string
+	IsAxis              int
+	DataList            []models.EdbDataList
+}
+
+// ChartInfoRefresh 图表刷新
+func ChartInfoRefresh(chartInfoId int, uniqueCode string) (isAsync bool, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("CorrelationChartInfoRefresh: %s", errMsg)
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+	var chartInfo *models.ChartInfo
+	if chartInfoId > 0 {
+		chartInfo, err = models.GetChartInfoById(chartInfoId)
+		if err != nil {
+			if utils.IsErrNoRow(err) {
+				errMsg = "图表已被删除,请刷新页面"
+				err = errors.New(errMsg)
+				return
+			}
+			errMsg = "获取图表信息失败"
+			err = errors.New("获取图表信息失败,Err:" + err.Error())
+			return
+		}
+	} else {
+		chartInfo, err = models.GetChartInfoByUniqueCode(uniqueCode)
+		if err != nil {
+			if utils.IsErrNoRow(err) {
+				errMsg = "图表已被删除,请刷新页面"
+				err = errors.New(errMsg)
+				return
+			}
+			errMsg = "获取图表信息失败"
+			err = errors.New("获取图表信息失败,Err:" + err.Error())
+			return
+		}
+	}
+
+	// 1.刷新图表关联的指标
+	mappings, e := data_manage.GetChartEdbMappingList(chartInfoId)
+	if e != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取图表关联指标失败, err: %v", e))
+		return
+	}
+	if len(mappings) == 0 {
+		utils.FileLog.Info("图表无关联指标")
+		return
+	}
+	var edbIds []int
+	for _, v := range mappings {
+		edbIds = append(edbIds, v.EdbInfoId)
+	}
+	if e, _ = data.EdbInfoRefreshAllFromBase(edbIds, false); e != nil {
+		utils.FileLog.Info(fmt.Sprintf("批量刷新指标失败, err: %v", e))
+		return
+	}
+
+	// todo 重新计算
+	// 区间计算图表配置校验
+	var extraConfig models.ChartRangeAnalysisExtraConf
+	err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConfig)
+	if err != nil {
+		errMsg = "配置信息错误"
+		err = errors.New(errMsg + ", Err: " + err.Error())
+		return
+	}
+	chartSeriesOb := new(data_manage.FactorEdbSeriesChartMapping)
+	seriesMappingItem, err := chartSeriesOb.GetItemByChartInfoId(chartInfo.ChartInfoId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			err = nil
+		} else {
+			err = fmt.Errorf("获取图表关联失败, Err: " + err.Error())
+			return
+		}
+	} else {
+		_, e = FactorEdbStepCalculateRange(seriesMappingItem.FactorEdbSeriesId, edbIds, extraConfig, true)
+		if e != nil {
+			err = fmt.Errorf("计算因子指标失败, Err: " + e.Error())
+			return
+		}
+	}
+	// 4.清除图表缓存
+	key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
+	_ = utils.Rc.Delete(key)
+
+	return
+}
+
+func GetEdbDateByMoveForward(startDate string, moveForward int, edbDataList []*models.EdbDataList) (date string) {
+	// 根据日期进行排序
+	index := 0
+	length := len(edbDataList)
+	for i := length - 1; i >= 0; i-- {
+		item := edbDataList[i]
+		if item.DataTime == startDate {
+			index += 1
+			continue
+		}
+		if index >= moveForward {
+			date = item.DataTime
+			break
+		}
+		if index > 0 {
+			index += 1
+			date = item.DataTime
+		}
+	}
+	return
+}
+
+// HandleEdbDateChange 处理日期变换
+func HandleEdbDateChange(date string, dateChange []*models.EdbDataDateChangeConf) (newDate string, err error) {
+	newDate = date
+	if newDate != "" {
+		if len(dateChange) > 0 {
+			var dateTime time.Time
+			dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
+			if err != nil {
+				err = fmt.Errorf("日期解析失败: %s", err.Error())
+				return
+			}
+			for _, v := range dateChange {
+				if v.ChangeType == 1 {
+					dateTime = dateTime.AddDate(v.Year, v.Month, v.Day)
+					newDate = dateTime.Format(utils.FormatDate)
+				} else if v.ChangeType == 2 {
+					newDate, err, _ = utils.HandleSystemAppointDateT(dateTime, v.FrequencyDay, v.Frequency)
+					if err != nil {
+						return
+					}
+					dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
+					if err != nil {
+						err = fmt.Errorf("日期解析失败: %s", err.Error())
+						return
+					}
+				}
+			}
+		}
+	}
+
+	return
+}
+
+// FactorEdbStepCalculateRange 因子指标-区间计算
+func FactorEdbStepCalculateRange(seriesId int, edbArr []int, extraConf models.ChartRangeAnalysisExtraConf, recalculate bool) (calculateResp data_manage.FactorEdbSeriesStepCalculateResp, err error) {
+	// todo 如果指标已保存,则用指标数据还是图表指标数据?
+	// 获取图表x轴y轴
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("FactorEdbStepCalculateRange 区间计算, ErrMsg: %v", err)
+			fmt.Println(tips)
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+		/*if len(calculateResp.Fail) > 0 {
+			tips := "StepCalculate计算失败, ErrMsg: "
+			for _, f := range calculateResp.Fail {
+				tips += fmt.Sprintf("code: %s, err: %s\n", f.EdbCode, f.ErrMsg)
+			}
+			fmt.Println(tips)
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 2)
+		}*/
+	}()
+
+	edbInfoMappingList, e := models.GetChartEdbMappingListByEdbInfoIdList(edbArr)
+	if e != nil {
+		err = fmt.Errorf("获取区间计算图表, A指标mapping信息失败, Err:%v", e)
+		return
+	}
+
+	_, _, _, err = GetChartDataByEdbInfoList(0, 0, 0, "", "", edbInfoMappingList, &extraConf)
+	if err != nil {
+		err = fmt.Errorf("获取图表数据失败, ErrMsg: %v", err)
+		return
+	}
+
+	// 重新计算-先清除原数据
+	calculateDataOb := new(models.FactorEdbSeriesCalculateDataQjjs)
+
+	cond := fmt.Sprintf("%s = ?", calculateDataOb.Cols().FactorEdbSeriesId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, seriesId)
+	if e := calculateDataOb.RemoveByCondition(cond, pars); e != nil {
+		err = fmt.Errorf("清除原数据失败, err: %v", e)
+		return
+	}
+
+	// 计算成功的保存结果
+	dataArr := make([]*models.FactorEdbSeriesCalculateDataQjjs, 0)
+	for _, v := range edbInfoMappingList {
+		dataList := v.DataList.([]*models.EdbDataList)
+		for _, dataItem := range dataList {
+			dataTime, _ := time.ParseInLocation(utils.FormatDate, dataItem.DataTime, time.Local)
+			dataArr = append(dataArr, &models.FactorEdbSeriesCalculateDataQjjs{
+				FactorEdbSeriesId: seriesId,
+				EdbInfoId:         v.EdbInfoId,
+				EdbCode:           v.EdbCode,
+				DataTime:          dataTime,
+				Value:             dataItem.Value,
+				CreateTime:        time.Now().Local(),
+				ModifyTime:        time.Now().Local(),
+				DataTimestamp:     dataItem.DataTimestamp,
+			})
+		}
+	}
+	if len(dataArr) == 0 {
+		err = fmt.Errorf("计算结果无数据, seriesId: %d", seriesId)
+		return
+	}
+	if e = calculateDataOb.CreateMulti(dataArr); e != nil {
+		err = fmt.Errorf("保存计算结果失败, seriesId: %d, err: %v, ", seriesId, e)
+		return
+	}
+	return
+}

+ 57 - 0
services/eta_forum/chart_collect.go

@@ -0,0 +1,57 @@
+package eta_forum
+
+import (
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/services/alarm_msg"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+)
+
+type ChartFromUniqueCodeResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        *ChartFromUniqueCodeRespItem
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+type ChartFromUniqueCodeRespItem struct {
+	ChartInfo   *models.ChartInfo
+	EdbInfoList []*models.ChartEdbInfoMapping
+	XEdbIdValue []int          `description:"柱方图的x轴数据,指标id"`
+	YDataList   []models.YData `description:"柱方图的y轴数据"`
+	XDataList   []models.XData `description:"商品价格曲线的X轴数据"`
+	//BarChartInfo BarChartInfoReq `description:"柱方图的配置"`
+	//CorrelationChartInfo *CorrelationInfo `description:"相关性图表信息"`
+	DataResp  interface{} `description:"图表数据,根据图的类型而定的,没有确定的数据格式"`
+	WaterMark string      `description:"水印"`
+}
+
+// GeChartFromUniqueCode 社区中根据唯一编码查询图表
+func GeChartFromUniqueCode(uniqueCode string, isCache bool) (resp ChartFromUniqueCodeRespItem, err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			msg := fmt.Sprintf("查询社区中对用户可见的图表列表 GeChartFromUniqueCode:Err:%v,ErrMsg:%s", err, errMsg)
+			utils.FileLog.Info(msg)
+			go alarm_msg.SendAlarmMsg(msg, 3)
+		}
+	}()
+	urlQuery := fmt.Sprintf("UniqueCode=%s&isCache=%v", uniqueCode, isCache)
+	result, err := getChartFromUniqueCodeLib(urlQuery)
+	if err != nil {
+		errMsg = "查询失败"
+		err = fmt.Errorf("查询失败,Err:" + err.Error())
+		return
+	}
+	if result.Ret != 200 {
+		errMsg = "查询失败"
+		err = fmt.Errorf(result.Msg + result.ErrMsg)
+		return
+	}
+	resp = *result.Data
+
+	return
+}

+ 58 - 0
services/eta_forum/eta_forum_hub_lib.go

@@ -0,0 +1,58 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+)
+
+// getChartFromUniqueCodeLib 根据唯一编码查询图表
+func getChartFromUniqueCodeLib(req string) (resp ChartFromUniqueCodeResp, err error) {
+	_, resultByte, err := get(req, "/v1/chart/common/from_unique_code")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// get
+func get(paramStr string, urlStr string) (resp *models.BaseResponse, result []byte, err error) {
+	if utils.ETA_FORUM_HUB_URL == "" {
+		err = fmt.Errorf("ETA社区桥接服务地址为空")
+		return
+	}
+	urlStr = urlStr + "?" + paramStr
+	getUrl := utils.ETA_FORUM_HUB_URL + urlStr
+	result, err = HttpGet(getUrl)
+	if err != nil {
+		err = fmt.Errorf("调用ETA社区桥接服务接口失败 error:%s", err.Error())
+		return
+	}
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+func HttpGet(url string) ([]byte, error) {
+	client := &http.Client{}
+	req, err := http.NewRequest("GET", url, nil)
+	if err != nil {
+		return nil, err
+	}
+	req.Header.Set("authorization", utils.MD5(utils.ETA_FORUM_HUB_NAME_EN+utils.ETA_FORUM_HUB_MD5_KEY))
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Debug("HttpPost:" + string(b))
+	return b, err
+}

+ 231 - 0
services/excel/luck_sheet_table.go

@@ -0,0 +1,231 @@
+package excel
+
+import (
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/models/request"
+	"eta/eta_chart_lib/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// HandleRuleToTableCell 根据管理规则渲染单元格数据
+// func HandleRuleToTableCell(excelInfoId int, oldTableData TableData) (newTableData TableData, err error) {
+// 	newTableData = oldTableData
+// 	excelRuleMappingList, err := models.GetExcelRuleMappingByExcelInfoId(excelInfoId)
+// 	if err != nil {
+// 		return
+// 	}
+// 	if len(excelRuleMappingList) == 0 {
+// 		return
+// 	}
+// 	tableDataList := oldTableData.TableDataList
+// 	excelRuleMap := make(map[int]*models.ExcelInfoRuleMappingView)
+// 	for _, v := range excelRuleMappingList {
+// 		excelRuleMap[v.ExcelInfoRuleMappingId] = v
+// 	}
+// 	ruleScopeMap := generateRuleScopeIndexMap(excelRuleMappingList)
+// 	for row, scopeValues := range ruleScopeMap {
+// 		for col, ruleId := range scopeValues {
+// 			if v, ok := excelRuleMap[ruleId]; ok {
+// 				if len(tableDataList) > row && len(tableDataList[row]) > col {
+// 					// 符合管理规则要求,则进行字体和背景颜色的渲染
+// 					if checkCellRule(v, tableDataList[row][col].Monitor, tableDataList) {
+// 						tableDataList[row][col].Background = v.BackgroundColor
+// 						tableDataList[row][col].FontColor = v.FontColor
+// 					}
+// 				} else {
+// 					continue
+// 				}
+// 			} else {
+// 				continue
+// 			}
+// 		}
+// 	}
+// 	return
+// }
+
+func getCellValueByType(value string, valueType int, tableDataList [][]request.MixedTableCellDataReq) (float64, bool) {
+	if valueType == 2 {
+		coords := strings.Split(value, ",")
+		var coordIntArr []int
+		for _, v := range coords {
+			t, _ := strconv.Atoi(v)
+			coordIntArr = append(coordIntArr, t)
+		}
+		if len(coordIntArr) == 2 {
+			x, y := coordIntArr[0]-1, coordIntArr[1]-1
+			conditionValue, err := strconv.ParseFloat(tableDataList[y][x].ShowValue, 64)
+			if err != nil {
+				return 0, false
+			}
+			return conditionValue, true
+		}
+	} else {
+		conditionValue, err := strconv.ParseFloat(value, 64)
+		if err != nil {
+			return 0, false
+		}
+		return conditionValue, true
+	}
+	return 0, false
+}
+
+func checkCellRule(ruleInfo *models.ExcelInfoRuleMappingView, value string, tableDataList [][]request.MixedTableCellDataReq) bool {
+	var tableValue float64
+	var tableTime time.Time
+	var err error
+
+	if ruleInfo.RuleType == 5 {
+		tableTime, err = time.ParseInLocation(utils.FormatDate, value, time.Local)
+		if err != nil {
+			return false
+		}
+	} else {
+		tableValue, err = strconv.ParseFloat(value, 64)
+		if err != nil {
+			return false
+		}
+	}
+	switch ruleInfo.RuleType {
+	// 大于
+	case 1:
+		conditionValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
+		if !ok {
+			return false
+		}
+		if tableValue > conditionValue {
+			return true
+		}
+	// 小于
+	case 2:
+		conditionValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
+		if !ok {
+			return false
+		}
+		if tableValue < conditionValue {
+			return true
+		}
+	// 介于
+	case 3:
+		leftcondValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
+		if !ok {
+			return false
+		}
+		rightcondValue, ok := getCellValueByType(ruleInfo.RightValue, ruleInfo.RightValueType, tableDataList)
+		if !ok {
+			return false
+		}
+		if leftcondValue <= tableValue && tableValue <= rightcondValue {
+			return true
+		}
+	// 等于
+	case 4:
+		conditionValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
+		if !ok {
+			return false
+		}
+		if tableValue == conditionValue {
+			return true
+		}
+	// 发生日期
+	case 5:
+		// 发生日期
+		var dateStart, dataEnd time.Time
+		switch ruleInfo.LeftValueBack {
+		// 今天
+		case "today":
+			// 获得今天的零点零分零秒
+			dateStart = utils.Today()
+			if tableTime == dateStart {
+				return true
+			}
+		// 明天
+		case "tomorrow":
+			dateStart = utils.Tomorrow()
+			if tableTime == dateStart {
+				return true
+			}
+		// 最近7天
+		case "last7days":
+			dateStart, dataEnd = utils.Last7Days()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		// 上周
+		case "lastweek":
+			dateStart, dataEnd = utils.LastWeek()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		// 本周
+		case "thisweek":
+			dateStart, dataEnd = utils.ThisWeek()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		// 下周
+		case "nextweek":
+			dateStart, dataEnd = utils.NextWeek()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		// 上月
+		case "lastmonth":
+			dateStart, dataEnd = utils.LastMonth()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		// 本月
+		case "thismonth":
+			dateStart, dataEnd = utils.ThisMonth()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		// 下月
+		case "nextmonth":
+			dateStart, dataEnd = utils.NextMonth()
+			if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
+				return true
+			}
+		default:
+			return false
+		}
+
+	}
+	return false
+}
+
+func generateRuleScopeIndexMap(items []*models.ExcelInfoRuleMappingView) (ruleScopeMap map[int]map[int][]int) {
+	ruleScopeMap = make(map[int]map[int][]int)
+	for _, item := range items {
+		coords := strings.Split(item.ScopeCoord, ",")
+		var coordIntArr []int
+		for _, v := range coords {
+			t, _ := strconv.Atoi(v)
+			coordIntArr = append(coordIntArr, t)
+		}
+
+		if len(coords) == 4 {
+			xmin, ymin, xmax, ymax := coordIntArr[0]-1, coordIntArr[1]-1, coordIntArr[2]-1, coordIntArr[3]-1
+			for i := ymin; i <= ymax; i++ {
+				for j := xmin; j <= xmax; j++ {
+					if _, ok := ruleScopeMap[i]; !ok {
+						ruleScopeMap[i] = make(map[int][]int)
+					}
+					ruleScopeMap[i][j] = append(ruleScopeMap[i][j], item.ExcelInfoRuleMappingId)
+					// ruleScopeMap[i][j] = item.ExcelInfoRuleMappingId
+				}
+			}
+		}
+		if len(coords) == 2 {
+			x, y := coordIntArr[0]-1, coordIntArr[1]-1
+			if _, ok := ruleScopeMap[y]; !ok {
+				ruleScopeMap[y] = make(map[int][]int)
+			}
+			ruleScopeMap[y][x] = append(ruleScopeMap[y][x], item.ExcelInfoRuleMappingId)
+			// ruleScopeMap[y][x] = item.ExcelInfoRuleMappingId
+		}
+	}
+	return
+}

+ 157 - 14
services/excel/lucky_sheet.go

@@ -2,12 +2,16 @@ package excel
 
 import (
 	"encoding/json"
+	"eta/eta_chart_lib/models"
 	"eta/eta_chart_lib/models/request"
 	"eta/eta_chart_lib/utils"
 	"fmt"
 	"reflect"
 	"sort"
 	"strconv"
+	"strings"
+
+	"github.com/shopspring/decimal"
 )
 
 type LuckySheetDataBak struct {
@@ -1032,12 +1036,16 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq, lang str
 					if v.Data[i].DataType == 5 {
 						background = "#ffefdd"
 					}
-					dataCol = append(dataCol, LuckySheetDataValue{
+					tmpCol := LuckySheetDataValue{
 						Value:      v.Data[i].Value,
 						Monitor:    v.Data[i].ShowValue,
 						MergeCell:  LuckySheetDataConfigMerge{},
 						Background: background,
-					})
+					}
+					if tmpCol.Monitor == `` {
+						tmpCol.Monitor = "-"
+					}
+					dataCol = append(dataCol, tmpCol)
 				}
 
 				tableDataList = append(tableDataList, dataCol)
@@ -1049,11 +1057,16 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq, lang str
 			for _, textColList := range data.TextRowData {
 				dataCol := make([]LuckySheetDataValue, 0)
 				for _, v := range textColList {
-					dataCol = append(dataCol, LuckySheetDataValue{
+					tmpCol := LuckySheetDataValue{
 						Value:     v.Value,
 						Monitor:   v.ShowValue,
 						MergeCell: LuckySheetDataConfigMerge{},
-					})
+					}
+					tmpCol.Value = v.Value
+					if tmpCol.Monitor == "" {
+						tmpCol.Monitor = "-"
+					}
+					dataCol = append(dataCol, tmpCol)
 				}
 				tableDataList = append(tableDataList, dataCol)
 			}
@@ -1099,11 +1112,15 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq, lang str
 
 			// 文本列
 			for _, textColList := range data.TextRowData {
-				firstCol = append(firstCol, LuckySheetDataValue{
+				tmpCol := LuckySheetDataValue{
 					Value:     textColList[0].Value,
 					Monitor:   textColList[0].ShowValue,
 					MergeCell: LuckySheetDataConfigMerge{},
-				})
+				}
+				if tmpCol.Monitor == `` {
+					tmpCol.Monitor = "-"
+				}
+				firstCol = append(firstCol, tmpCol)
 			}
 
 			tableDataList = append(tableDataList, firstCol)
@@ -1157,23 +1174,30 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq, lang str
 				if tmpData.DataType == 5 {
 					background = "#ffefdd"
 				}
-				dataCol = append(dataCol, LuckySheetDataValue{
+				tmpCol := LuckySheetDataValue{
 					Value:      tmpData.Value,
 					Monitor:    tmpData.ShowValue,
 					MergeCell:  LuckySheetDataConfigMerge{},
 					Background: background,
-				})
+				}
+				if tmpCol.Monitor == `` {
+					tmpCol.Monitor = "-"
+				}
+				dataCol = append(dataCol, tmpCol)
 			}
 
 			// 文本列
 			for _, textColList := range data.TextRowData {
-				dataCol = append(dataCol, LuckySheetDataValue{
+				tmpCol := LuckySheetDataValue{
 					Value:     textColList[i+1].Value,
 					Monitor:   textColList[i+1].ShowValue,
 					MergeCell: LuckySheetDataConfigMerge{},
-				})
+				}
+				if tmpCol.Monitor == `` {
+					tmpCol.Monitor = "-"
+				}
+				dataCol = append(dataCol, tmpCol)
 			}
-
 			tableDataList = append(tableDataList, dataCol)
 		}
 
@@ -1186,20 +1210,35 @@ func GetTableDataByCustomData(excelType int, data request.TableDataReq, lang str
 }
 
 // GetTableDataByMixedTableData 通过混合表格数据获取表格数据
-func GetTableDataByMixedTableData(config [][]request.MixedTableCellDataReq, hideMerged bool) (selfTableData TableData, err error) {
+func GetTableDataByMixedTableData(config [][]request.MixedTableCellDataReq, hideMerged bool, excelInfoId int) (selfTableData TableData, err error) {
 	tableDataList := make([][]LuckySheetDataValue, 0)
 	mergeList := make([]TableDataMerge, 0)
 
+	// 获取管理规则
+	excelRuleMappingList, err := models.GetExcelRuleMappingByExcelInfoId(excelInfoId)
+	if err != nil {
+		return
+	}
+	excelRuleMap := make(map[int]*models.ExcelInfoRuleMappingView)
+	for _, v := range excelRuleMappingList {
+		excelRuleMap[v.ExcelInfoRuleMappingId] = v
+	}
+	ruleScopeMap := generateRuleScopeIndexMap(excelRuleMappingList)
+
 	// 开始文本行了
 	{
-		for _, row := range config {
+		for i, row := range config {
 			dataCol := make([]LuckySheetDataValue, 0)
-			for _, cell := range row {
+			for j, cell := range row {
 				tmp := LuckySheetDataValue{
 					Value:     cell.Value,
 					Monitor:   cell.ShowValue,
 					MergeCell: LuckySheetDataConfigMerge{},
 				}
+				if cell.DataType != request.CustomTextDT && tmp.Monitor == `` {
+					tmp.Monitor = "-"
+					cell.ShowFormatValue = "-"
+				}
 				// 前端需要隐藏被合并的单元格, 混合表格/平衡表通过这个字段判断, 不通过HandleTableCell方法隐藏
 				if cell.MerData != nil {
 					if hideMerged && cell.MerData.Type == "merged" {
@@ -1211,7 +1250,111 @@ func GetTableDataByMixedTableData(config [][]request.MixedTableCellDataReq, hide
 					tmp.MergeCell.Column = cell.MerData.Mer.Col
 				}
 				if cell.ShowStyle != "" {
+					var styleConfig request.MixCellShowStyle
+					if err := json.Unmarshal([]byte(cell.ShowStyle), &styleConfig); err != nil {
+						utils.FileLog.Info("表格样式showStyle解析失败", err.Error())
+					}
+					if styleConfig.BackgroundColor != "" {
+						tmp.Background = styleConfig.BackgroundColor
+					}
+					if styleConfig.Color != "" {
+						tmp.FontColor = styleConfig.Color
+					}
+					switch styleConfig.Align {
+					case "center":
+						tmp.HorizontalType = 0
+						tmp.Ht = 0
+					case "left":
+						tmp.HorizontalType = 1
+						tmp.Ht = 1
+					case "right":
+						tmp.HorizontalType = 2
+						tmp.Ht = 2
+					}
+					if styleConfig.FontSize != "" {
+						tmp.Fs = styleConfig.FontSize
+					}
 					tmp.Monitor = cell.ShowFormatValue
+					// 如果没有showValue, 则使用value
+					if cell.ShowValue == "" {
+						_, err := strconv.ParseFloat(cell.Value, 64)
+						if err == nil {
+							cell.ShowValue = cell.Value
+						}
+					}
+					_, err := strconv.ParseFloat(cell.ShowValue, 64)
+					if err == nil {
+						hasPercent := false
+						if styleConfig.Nt == "percent" {
+							hasPercent = true
+						}
+						// 修复历史数据
+						if styleConfig.Pn != 0 {
+							if styleConfig.Decimal == nil {
+								styleConfig.Decimal = new(int)
+							}
+							*styleConfig.Decimal += styleConfig.Pn
+							if *styleConfig.Decimal < 0 {
+								*styleConfig.Decimal = 0
+							}
+						}
+
+						if styleConfig.Decimal != nil {
+							tmp.Monitor = utils.RoundNumber(cell.ShowValue, *styleConfig.Decimal, hasPercent)
+						} else {
+							if hasPercent {
+								numDecimal, _ := decimal.NewFromString(cell.ShowValue)
+								tmpStr := numDecimal.Mul(decimal.NewFromInt(100)).String()
+								tmp.Monitor = tmpStr + "%"
+							} else {
+								tmp.Monitor = cell.ShowValue
+							}
+						}
+						// switch styleConfig.Last {
+						// case "nt":
+						// 	// 先进行数字的百分比计算,然后保留小数点位数
+						// 	percent := tmpShowValue * 100
+						// 	if styleConfig.Decimal == nil {
+						// 		continue
+						// 	}
+						// 	factor := math.Pow(10, float64(*styleConfig.Decimal))
+						// 	rounded := math.Round(percent*factor) / factor
+						// 	tmp.Monitor = fmt.Sprintf("%g%%", rounded)
+						// case "decimal":
+						// 	// 先保留小数点位数,再进行百分比计算
+						// 	if styleConfig.Decimal == nil {
+						// 		continue
+						// 	}
+						// 	factor := math.Pow(10, float64(*styleConfig.Decimal))
+						// 	rounded := math.Round(tmpShowValue*factor) / factor
+						// 	if styleConfig.Nt == "percent" {
+						// 		percent := rounded * 100
+						// 		var precisionStr string
+						// 		if *styleConfig.Decimal > 2 {
+						// 			precision := *styleConfig.Decimal - 2
+						// 			precisionStr = strconv.FormatFloat(rounded, 'f', precision, 64)
+						// 		} else {
+						// 			precisionStr = strconv.FormatFloat(math.Round(percent), 'f', -1, 64)
+						// 		}
+						// 		tmp.Monitor = fmt.Sprintf("%s%%", precisionStr)
+						// 	} else {
+						// 		tmp.Monitor = fmt.Sprintf("%g", rounded)
+						// 	}
+						// }
+					} else {
+						if cell.DataType == request.CustomTextDT {
+							tmp.Monitor = cell.Value
+						}
+
+					}
+				}
+				if ruleIds, ok := ruleScopeMap[i][j]; ok {
+					for _, ruleId := range ruleIds {
+						if checkCellRule(excelRuleMap[ruleId], cell.ShowValue, config) {
+							tmp.Background = strings.TrimSpace(excelRuleMap[ruleId].BackgroundColor)
+							tmp.FontColor = strings.TrimSpace(excelRuleMap[ruleId].FontColor)
+						}
+					}
 				}
 				dataCol = append(dataCol, tmp)
 			}

+ 273 - 7
utils/common.go

@@ -9,7 +9,9 @@ import (
 	"encoding/base64"
 	"encoding/hex"
 	"encoding/json"
+	"errors"
 	"fmt"
+	"gorm.io/gorm"
 	"image"
 	"image/png"
 	"io"
@@ -207,7 +209,18 @@ func StrListToString(strList []string) (str string) {
 
 // 数据没有记录
 func ErrNoRow() string {
-	return "<QuerySeter> no row found"
+	return "record not found"
+}
+
+// IsErrNoRow
+// @Description: 判断是否是gorm的查询不到数据的报错
+// @param err
+// @return bool
+func IsErrNoRow(err error) bool {
+	if err == nil {
+		return false
+	}
+	return errors.Is(err, gorm.ErrRecordNotFound)
 }
 
 // 校验邮箱格式
@@ -623,6 +636,21 @@ func StrTimeToTime(strTime string) time.Time {
 
 // GetOrmInReplace 获取orm的in查询替换?的方法
 func GetOrmInReplace(num int) string {
+	//template := make([]string, num)
+	//for i := 0; i < num; i++ {
+	//	template[i] = "?"
+	//}
+	//return strings.Join(template, ",")
+	return "?"
+}
+
+// GetNumOrmInReplace
+// @Description: 获取orm的in查询替换?的方法(这个是真的要返回N个?,用来做排序使用)
+// @author: Roc
+// @datetime 2025-03-19 13:43:12
+// @param num int
+// @return string
+func GetNumOrmInReplace(num int) string {
 	template := make([]string, num)
 	for i := 0; i < num; i++ {
 		template[i] = "?"
@@ -1007,7 +1035,7 @@ func GetLocalIP() (ip string, err error) {
 	return
 }
 
-func GetDateByDateTypeV2(dateType int, tmpStartDate, tmpEndDate string, startYear, yearMax int) (startDate, endDate string) {
+func GetDateByDateTypeV2(dateType int, tmpStartDate, tmpEndDate string, startYear int, latestDate time.Time) (startDate, endDate string) {
 	startDate = tmpStartDate
 	endDate = tmpEndDate
 	switch dateType {
@@ -1042,16 +1070,20 @@ func GetDateByDateTypeV2(dateType int, tmpStartDate, tmpEndDate string, startYea
 	case 11:
 		startDate = "2022-01-01"
 		endDate = ""
+	case 12:
+		startDate = "2023-01-01"
+		endDate = ""
+	case 13:
+		startDate = "2024-01-01"
+		endDate = ""
 	case DateTypeNYears:
 		if startYear == 0 { //默认取最近5年
 			startYear = 5
 		}
-		if yearMax == 0 {
+		if latestDate.IsZero() {
 			return
 		}
-		startYear = startYear - 1
-		baseDate, _ := time.Parse(FormatDate, fmt.Sprintf("%d-01-01", yearMax))
-		startDate = baseDate.AddDate(-startYear, 0, 0).Format(FormatDate)
+		startDate = latestDate.AddDate(-startYear, 0, 0).Format(FormatDate)
 		endDate = ""
 	}
 
@@ -1061,7 +1093,11 @@ func GetDateByDateTypeV2(dateType int, tmpStartDate, tmpEndDate string, startYea
 			startDate = startDate + "-01"
 		}
 		if strings.Count(endDate, "-") == 1 {
-			endDate = endDate + "-01"
+			endTime, err := time.Parse(FormatYearMonthDate, endDate)
+			if err != nil {
+				return
+			}
+			endDate = endTime.AddDate(0, 1, -1).Format(FormatDate)
 		}
 	}
 
@@ -1213,3 +1249,233 @@ func TimeTransferString(format string, t time.Time) string {
 	}
 	return str
 }
+
+// handleSystemAppointDateT
+// @Description: 处理系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
+// @author: Roc
+// @datetime2023-10-27 09:31:35
+// @param Frequency string
+// @param Day string
+// @return date string
+// @return err error
+// @return errMsg string
+func HandleSystemAppointDateT(currDate time.Time, appointDay, frequency string) (date string, err error, errMsg string) {
+	//currDate := time.Now()
+	switch frequency {
+	case "本周":
+		day := int(currDate.Weekday())
+		if day == 0 { // 周日
+			day = 7
+		}
+		num := 0
+		switch appointDay {
+		case "周一":
+			num = 1
+		case "周二":
+			num = 2
+		case "周三":
+			num = 3
+		case "周四":
+			num = 4
+		case "周五":
+			num = 5
+		case "周六":
+			num = 6
+		case "周日":
+			num = 7
+		}
+		day = num - day
+		date = currDate.AddDate(0, 0, day).Format(FormatDate)
+	case "本旬":
+		day := currDate.Day()
+		var tmpDate time.Time
+		switch appointDay {
+		case "第一天":
+			if day <= 10 {
+				tmpDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, currDate.Location())
+			} else if day <= 20 {
+				tmpDate = time.Date(currDate.Year(), currDate.Month(), 11, 0, 0, 0, 0, currDate.Location())
+			} else {
+				tmpDate = time.Date(currDate.Year(), currDate.Month(), 21, 0, 0, 0, 0, currDate.Location())
+			}
+		case "最后一天":
+			if day <= 10 {
+				tmpDate = time.Date(currDate.Year(), currDate.Month(), 10, 0, 0, 0, 0, currDate.Location())
+			} else if day <= 20 {
+				tmpDate = time.Date(currDate.Year(), currDate.Month(), 20, 0, 0, 0, 0, currDate.Location())
+			} else {
+				tmpDate = time.Date(currDate.Year(), currDate.Month()+1, 1, 0, 0, 0, 0, currDate.Location()).AddDate(0, 0, -1)
+			}
+		}
+		date = tmpDate.Format(FormatDate)
+	case "本月":
+		var tmpDate time.Time
+		switch appointDay {
+		case "第一天":
+			tmpDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, currDate.Location())
+		case "最后一天":
+			tmpDate = time.Date(currDate.Year(), currDate.Month()+1, 1, 0, 0, 0, 0, currDate.Location()).AddDate(0, 0, -1)
+		}
+		date = tmpDate.Format(FormatDate)
+	case "本季":
+		month := currDate.Month()
+		var tmpDate time.Time
+		switch appointDay {
+		case "第一天":
+			if month <= 3 {
+				tmpDate = time.Date(currDate.Year(), 1, 1, 0, 0, 0, 0, currDate.Location())
+			} else if month <= 6 {
+				tmpDate = time.Date(currDate.Year(), 4, 1, 0, 0, 0, 0, currDate.Location())
+			} else if month <= 9 {
+				tmpDate = time.Date(currDate.Year(), 7, 1, 0, 0, 0, 0, currDate.Location())
+			} else {
+				tmpDate = time.Date(currDate.Year(), 10, 1, 0, 0, 0, 0, currDate.Location())
+			}
+		case "最后一天":
+			if month <= 3 {
+				tmpDate = time.Date(currDate.Year(), 3, 31, 0, 0, 0, 0, currDate.Location())
+			} else if month <= 6 {
+				tmpDate = time.Date(currDate.Year(), 6, 30, 0, 0, 0, 0, currDate.Location())
+			} else if month <= 9 {
+				tmpDate = time.Date(currDate.Year(), 9, 30, 0, 0, 0, 0, currDate.Location())
+			} else {
+				tmpDate = time.Date(currDate.Year(), 12, 31, 0, 0, 0, 0, currDate.Location())
+			}
+		}
+		date = tmpDate.Format(FormatDate)
+	case "本半年":
+		month := currDate.Month()
+		var tmpDate time.Time
+		switch appointDay {
+		case "第一天":
+			if month <= 6 {
+				tmpDate = time.Date(currDate.Year(), 1, 1, 0, 0, 0, 0, currDate.Location())
+			} else {
+				tmpDate = time.Date(currDate.Year(), 7, 1, 0, 0, 0, 0, currDate.Location())
+			}
+		case "最后一天":
+			if month <= 6 {
+				tmpDate = time.Date(currDate.Year(), 6, 30, 0, 0, 0, 0, currDate.Location())
+			} else {
+				tmpDate = time.Date(currDate.Year(), 12, 31, 0, 0, 0, 0, currDate.Location())
+			}
+		}
+		date = tmpDate.Format(FormatDate)
+	case "本年":
+		var tmpDate time.Time
+		switch appointDay {
+		case "第一天":
+			tmpDate = time.Date(currDate.Year(), 1, 1, 0, 0, 0, 0, currDate.Location())
+		case "最后一天":
+			tmpDate = time.Date(currDate.Year(), 12, 31, 0, 0, 0, 0, currDate.Location())
+		}
+		date = tmpDate.Format(FormatDate)
+	default:
+		errMsg = "错误的日期频度:" + frequency
+		err = errors.New(errMsg)
+		return
+	}
+
+	return
+}
+
+func CompareFloatByOpStrings(op string, a, b float64) bool {
+	switch op {
+	case "=":
+		return a == b
+	case ">":
+		return a > b
+	case ">=":
+		return a >= b
+	case "<=":
+		return a <= b
+	case "<":
+		return a < b
+	}
+	return false
+}
+
+// RoundNumber 保留小数位数
+func RoundNumber(num string, decimalPlaces int, hasPercent bool) string {
+	numDecimal, _ := decimal.NewFromString(num)
+	if hasPercent {
+		numDecimal = numDecimal.Mul(decimal.NewFromInt(100))
+	}
+	numStr := numDecimal.Round(int32(decimalPlaces)).StringFixed(int32(decimalPlaces))
+	if hasPercent {
+		numStr += "%"
+	}
+	return numStr
+}
+
+// ForwardPars
+// @Description: 向前插入参数
+// @param pars
+// @param values
+// @return []interface{}
+func ForwardPars(pars []interface{}, values ...interface{}) []interface{} {
+	if len(values) <= 0 {
+		return pars
+	}
+	return append(values, pars...)
+}
+
+// GormDateStrToDateTimeStr
+// @Description: gorm日期字符串格式转正常显示的日期时间字符串
+// @param originalString
+// @return formatStr
+func GormDateStrToDateTimeStr(originalString string) (formatStr string) {
+	if originalString == `` {
+		return
+	}
+	if strings.Contains(originalString, "0001-01-01") {
+		return
+	}
+
+	formatStr = originalString
+	if !strings.Contains(originalString, "T") {
+		return
+	}
+
+	// 解析原始字符串
+	t, err := time.Parse(FormatDateWallWithLoc, originalString)
+	if err != nil {
+		fmt.Println("Error parsing time:", err)
+		return
+	}
+
+	// 重新格式化时间
+	formatStr = t.Format(FormatDateTime)
+
+	return
+}
+
+// GormDateStrToDateStr
+// @Description: gorm日期字符串格式转正常显示的日期字符串
+// @param originalString
+// @return formatStr
+func GormDateStrToDateStr(originalString string) (formatStr string) {
+	if originalString == `` {
+		return
+	}
+	if strings.Contains(originalString, "0001-01-01") {
+		return
+	}
+
+	formatStr = originalString
+	if !strings.Contains(originalString, "T") {
+		return
+	}
+
+	// 解析原始字符串
+	t, err := time.Parse(FormatDateWallWithLoc, originalString)
+	if err != nil {
+		fmt.Println("Error parsing time:", err)
+		return
+	}
+
+	// 重新格式化时间
+	formatStr = t.Format(FormatDate)
+
+	return
+}

+ 30 - 0
utils/config.go

@@ -17,6 +17,7 @@ var (
 	MYSQL_URL      string //数据库连接
 	MYSQL_URL_DATA string
 	MYSQL_URL_EDB  string
+	DbDriverName   string // 数据库驱动名称
 	MgoUrlData     string // mongodb数据库连接配置
 
 	REDIS_CACHE string //缓存地址
@@ -66,6 +67,13 @@ var (
 	UseMongo bool // 是否使用mongo
 )
 
+// eta_forum_hub ETA社区桥接服务地址
+var (
+	ETA_FORUM_HUB_URL     string
+	ETA_FORUM_HUB_NAME_EN string
+	ETA_FORUM_HUB_MD5_KEY string
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -100,6 +108,12 @@ func init() {
 	MYSQL_URL_DATA = config["mysql_url_data"]
 	MYSQL_URL_EDB = config["mysql_url_edb"]
 
+	// 数据库驱动名称
+	DbDriverName = config["db_driver_name"]
+	if DbDriverName == "" {
+		DbDriverName = "mysql"
+	}
+
 	// mongodb数据库连接配置
 	MgoUrlData = config["mgo_url_data"]
 
@@ -155,6 +169,13 @@ func init() {
 		logMaxDaysStr := config["log_max_day"]
 		LogMaxDays, _ = strconv.Atoi(logMaxDaysStr)
 	}
+
+	// eta_forum_hub ETA社区桥接服务地址
+	{
+		ETA_FORUM_HUB_URL = config["eta_forum_hub_url"]
+		ETA_FORUM_HUB_NAME_EN = config["eta_forum_hub_name_en"]
+		ETA_FORUM_HUB_MD5_KEY = config["eta_forum_hub_md5_key"]
+	}
 }
 
 // FormatMixTableDataShowValue 格式化自定表格显示数据
@@ -231,3 +252,12 @@ func FormatTableDataShowValue(x float64) (res string) {
 	}
 	return
 }
+
+func GetMiniUrl(source string) string {
+	config, err := web.AppConfig.GetSection(RunMode)
+	if err != nil {
+		panic("配置文件读取错误 " + err.Error())
+	}
+	urlName := fmt.Sprintf("mini_url_%s", source)
+	return config[urlName]
+}

+ 32 - 7
utils/constants.go

@@ -2,13 +2,15 @@ package utils
 
 // 常量定义
 const (
-	FormatTime            = "15:04:05"                //时间格式
-	FormatDate            = "2006-01-02"              //日期格式
-	FormatDateUnSpace     = "20060102"                //日期格式
-	FormatDateTime        = "2006-01-02 15:04:05"     //完整时间格式
-	HlbFormatDateTime     = "2006-01-02_15:04:05.999" //完整时间格式
-	FormatDateTimeUnSpace = "20060102150405"          //完整时间格式
-	PageSize15            = 15                        //列表页每页数据量
+	FormatTime            = "15:04:05"                  //时间格式
+	FormatDate            = "2006-01-02"                //日期格式
+	FormatDateUnSpace     = "20060102"                  //日期格式
+	FormatDateWallWithLoc = "2006-01-02T15:04:05-07:00" //日期格式
+	FormatDateTime        = "2006-01-02 15:04:05"       //完整时间格式
+	HlbFormatDateTime     = "2006-01-02_15:04:05.999"   //完整时间格式
+	FormatDateTimeUnSpace = "20060102150405"            //完整时间格式
+	FormatYearMonthDate   = "2006-01"                   //日期格式
+	PageSize15            = 15                          //列表页每页数据量
 	PageSize5             = 5
 	PageSize10            = 10
 	PageSize20            = 20
@@ -141,6 +143,7 @@ const (
 	CHART_SOURCE_LINE_FEATURE_FREQUENCY          = 9  // 统计特征-频率分布图表
 	CHART_SOURCE_CROSS_HEDGING                   = 10 // 跨品种分析图表
 	CHART_SOURCE_BALANCE_EXCEL                   = 11 // 平衡表图表
+	CHART_SOURCE_RANGE_ANALYSIS                  = 12 // 	区间分析图表
 )
 
 // 图表来源
@@ -154,11 +157,14 @@ const (
 	TIME_TABLE            = 2 // 时间序列表格
 	MIXED_TABLE           = 3 // 混合表格
 	CUSTOM_ANALYSIS_TABLE = 4 // 自定义分析表格
+	BALANCE_TABLE         = 5 // 平衡表
 )
 
 // 图表样式类型
 const (
 	CHART_TYPE_CURVE           = 1  //曲线图
+	CHART_TYPE_SEASON          = 2  //季节性图
+	CHART_TYPE_AREA            = 3  // 面积图
 	CHART_TYPE_BAR             = 7  //柱形图
 	CHART_TYPE_SECTION_SCATTER = 10 //截面散点图样式
 	CHART_TYPE_RADAR           = 11 //雷达图
@@ -225,3 +231,22 @@ const (
 	ZhLangVersion = "zh" // 中文语言版本
 	EnLangVersion = "en" // 英文语言版本
 )
+
+const (
+	CACHE_CHART_AUTH = "eta:chart:auth:" //图表数据
+)
+
+const (
+	DbDriverByMysql = "mysql"
+	DbDriverByDm    = "dm"
+)
+
+const (
+	DbNameMaster      = "eta_master"
+	DbNameReport      = "eta_report"
+	DbNameManualIndex = "eta_manual_index"
+	DbNameIndex       = "eta_index"
+	DbNameGL          = "eta_gl"
+	DbNameAI          = "eta_ai"
+	DbNameWeekly      = "weekly_report"
+)

+ 135 - 0
utils/date_util.go

@@ -0,0 +1,135 @@
+package utils
+
+import (
+	"time"
+)
+
+// 定义时间格式常量
+const (
+	YearMonthDay     = "2006-01-02"                     // yyyy-MM-dd
+	YearMonthDayTime = "2006-01-02 15:04:05"            // yyyy-MM-dd HH:mm:ss
+	MonthDay         = "01-02"                          // MM-dd
+	DayMonthYear     = "02-01-2006"                     // dd-MM-yyyy
+	YearMonth        = "2006-01"                        // yyyy-MM
+	FullDate         = "Monday, 02-Jan-06 15:04:05 PST" // 完整日期:例如:Monday, 02-Jan-06 15:04:05 PST
+)
+
+// GetPreYearTime 获取当前时间 前n年的时间 返回yyyy-MM-dd 格式的时间
+func GetPreYearTime(n int) string {
+	// 获取当前时间
+	now := time.Now()
+	// 计算前n年的时间
+	preYearTime := now.AddDate(-n, 0, 0)
+	// 格式化时间
+	return preYearTime.Format("2006-01-02")
+}
+
+// IsMoreThanOneDay 判断两个yyyy-MM-dd类型的时间,相差是否大于1天
+func IsMoreThanOneDay(startDate, endDate string) bool {
+	startTime, _ := time.Parse("2006-01-02", startDate)
+	endTime, _ := time.Parse("2006-01-02", endDate)
+	diff := endTime.Sub(startTime)
+	days := diff.Hours() / 24
+	return days > 1
+}
+
+// GetNextDay 获取 yyyy-MM-dd类型的时间的下一天
+func GetNextDay(date string) string {
+	t, _ := time.Parse("2006-01-02", date)
+	nextDay := t.AddDate(0, 0, 1)
+	return nextDay.Format("2006-01-02")
+}
+
+// GetNextDayN 获取 yyyy-MM-dd 类型的时间的下n天
+func GetNextDayN(date string, n int) string {
+	t, _ := time.Parse("2006-01-02", date)
+	nextDay := t.AddDate(0, 0, n)
+	return nextDay.Format("2006-01-02")
+}
+
+var daysOfMonth = [...]int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
+
+// AddDate 解决 Go time 包 AddDate() 添加年份/月份溢出到下一个月的问题。
+// 例如:
+//
+//	2024-02-29 AddDate(1, 0, 0) 期望结果: 2025-02-28
+//	2024-08-31 AddDate(0, 1, 1) 期望结果: 2024-09-30
+func AddDate(t time.Time, years, months int) time.Time {
+	month := t.Month()
+
+	// 规范年份和月份
+	years, months = norm(years, months, 12)
+
+	// 计算目标月份
+	targetMonth := int(month) + months
+	if targetMonth <= 0 {
+		// 处理负值月份
+		targetMonth += 12 * ((-targetMonth)/12 + 1)
+	}
+	// 取余计算目标月份
+	targetMonth = (targetMonth-1)%12 + 1
+
+	// 计算目标年份
+	targetYear := t.Year() + years + (int(month)+months-1)/12
+
+	// 计算目标月份最大天数
+	maxDayOfTargetMonth := daysOfMonth[targetMonth-1]
+	if isLeap(targetYear) && targetMonth == 2 {
+		maxDayOfTargetMonth++ // 闰年2月多一天
+	}
+
+	// 计算目标日期
+	targetDay := t.Day()
+	if targetDay > maxDayOfTargetMonth {
+		// 如果目标日期超出该月的天数,设置为该月的最后一天
+		targetDay = maxDayOfTargetMonth
+	}
+
+	// 返回新的日期
+	return time.Date(targetYear, time.Month(targetMonth), targetDay, t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())
+}
+
+// norm 规范化年份和月份
+func norm(hi, lo, base int) (nhi, nlo int) {
+	if lo < 0 {
+		n := (-lo-1)/base + 1
+		hi -= n
+		lo += n * base
+	}
+	if lo >= base {
+		n := lo / base
+		hi += n
+		lo -= n * base
+	}
+	return hi, lo
+}
+
+// isLeap 判断是否为闰年
+func isLeap(year int) bool {
+	return year%4 == 0 && (year%100 != 0 || year%400 == 0)
+}
+
+// StringToTime string 类型时间 转换为 time.Time 类型
+func StringToTime(date string) time.Time {
+	t, _ := time.ParseInLocation("2006-01-02", date, time.Local)
+	return t
+}
+
+// StringToFormatTime string 类型时间 转换为指定格式的 time.Time类型
+func StringToFormatTime(data string, format string) time.Time {
+	t, _ := time.ParseInLocation(format, data, time.Local)
+	return t
+}
+
+// TimeToString time.Time 类型时间 转换为 string 类型
+func TimeToString(t time.Time, format string) string {
+	formattedTime := t.Format(format)
+	return formattedTime
+}
+
+// CompareDate 判断传入的两个字符串时间的前后顺序
+func CompareDate(data1, data2 string) bool {
+	t1, _ := time.Parse("2006-01-02", data1)
+	t2, _ := time.Parse("2006-01-02", data2)
+	return !t1.After(t2)
+}

+ 358 - 0
utils/sql.go

@@ -0,0 +1,358 @@
+package utils
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"reflect"
+	"regexp"
+	"text/template"
+)
+
+type Driver string
+type SqlCondition string
+
+const (
+	DM            Driver       = "dm"
+	MySql         Driver       = "mysql"
+	GroupUnit     SqlCondition = "GroupUnit"
+	Distinct      SqlCondition = "Distinct"
+	Order         SqlCondition = "Order"
+	Delimiter     SqlCondition = "Delimiter"
+	ConvertColumn SqlCondition = "ConvertColumn"
+)
+
+var TemplateMap = map[SqlCondition]map[Driver]string{
+	GroupUnit: {
+		MySql: `GROUP_CONCAT({{.Distinct}} {{.Column}} {{.Order}} SEPARATOR '{{.Delimiter}}')`,
+		DM:    `LISTAGG({{.Distinct}} {{.Column}},'{{.Delimiter}}') WITHIN GROUP ({{.Order}})`,
+	},
+	ConvertColumn: {
+		MySql: `CONVERT({{.ConvertColumn}} USING gbk )`,
+		DM:    `{{.ConvertColumn}}`,
+	},
+}
+
+var supportDriverMap = map[string]Driver{
+	"mysql": MySql,
+	"dm":    DM,
+	//"postgres": Postgres,
+}
+
+type QueryParam struct {
+	Driver        string
+	Column        string
+	Order         string
+	Distinct      string
+	Delimiter     string
+	OrderField    string
+	OrderRule     string
+	ConvertColumn string `description:"Convert指令传递的clounm"`
+	HasDistinct   bool
+}
+type SqlParam interface {
+	GetParamName() string
+	GetFormatConditionStr(param *QueryParam) string
+}
+type DistinctParam struct {
+}
+
+func (distinctParam *DistinctParam) GetParamName() string {
+	return "Distinct"
+}
+func (distinctParam *DistinctParam) GetFormatConditionStr(param *QueryParam) string {
+	if param.HasDistinct {
+		return "DISTINCT"
+	}
+	return ""
+}
+
+type ConvertParam struct {
+}
+
+func (convertParam *ConvertParam) GetParamName() string {
+	return "Convert"
+}
+func (convertParam *ConvertParam) GetFormatConditionStr(param *QueryParam) (sqlStr string) {
+	dbDriver, _ := getDriverInstance(param.Driver)
+	if param.ConvertColumn == "" {
+		FileLog.Error("转换字段为空,无法生成聚合sql")
+		return
+	}
+	var templateSqlStr string
+	if _, ok := TemplateMap[ConvertColumn][dbDriver]; !ok {
+		templateSqlStr = TemplateMap[ConvertColumn][MySql]
+	} else {
+		templateSqlStr = TemplateMap[ConvertColumn][dbDriver]
+	}
+	if templateSqlStr == "" {
+		FileLog.Error("转换sql模板不存在,无法生成转换sql")
+		return
+	}
+	templateSql, err := template.New("ConvertColumn").Parse(templateSqlStr)
+	if err != nil {
+		FileLog.Error("failed to parse template: %v", err)
+		return
+	}
+	//反射获取结构体的值
+	value := reflect.ValueOf(param)
+	// 检查是否是指针
+	if value.Kind() != reflect.Ptr {
+		fmt.Println("请求参数必须是一个结构体")
+		return
+	}
+	// 获取结构体的元素
+	elem := value.Elem()
+	// 检查是否是结构体
+	if elem.Kind() != reflect.Struct {
+		fmt.Println("请求参数必须是一个结构体")
+		return
+	}
+	// 获取字段的值
+	fieldValue := elem.FieldByName("ConvertColumn")
+	// 检查字段是否存在
+	if !fieldValue.IsValid() {
+		fmt.Printf("Error: field %s not found\n", "ConvertColumn")
+		return
+	}
+	// 检查字段是否可导出
+	if !fieldValue.CanSet() {
+		fmt.Printf("Error: field %s is not exported and cannot be set\n", "ConvertColumn")
+		return
+	}
+	// 渲染模板
+	var buf bytes.Buffer
+	err = templateSql.Execute(&buf, param)
+	if err != nil {
+		fmt.Sprintf("执行模板填充失败: %v", err)
+		return
+	}
+	sqlStr = buf.String()
+	fmt.Printf("生成的准换编码语句为:%s\n", sqlStr)
+	return sqlStr
+}
+
+var sqlGeneratorFactory = map[SqlCondition]SqlParam{
+	// 添加支持的语法
+	GroupUnit: &GroupUnitParam{
+		supportGrams: []SqlCondition{
+			Distinct,
+			Order,
+			Delimiter,
+		},
+	},
+	Order:         &OrderParam{},
+	Delimiter:     &DelimiterParam{},
+	Distinct:      &DistinctParam{},
+	ConvertColumn: &ConvertParam{},
+}
+
+type DelimiterParam struct {
+}
+
+func (delimiterParam *DelimiterParam) GetParamName() string {
+	return "Delimiter"
+}
+func (delimiterParam *DelimiterParam) GetFormatConditionStr(param *QueryParam) string {
+	if param.Delimiter == "" {
+		return ","
+	}
+	return param.Delimiter
+}
+
+type OrderParam struct {
+	Field string
+	Rule  string
+}
+
+func (orderParam *OrderParam) GetParamName() string {
+	return "Order"
+}
+
+func (orderParam *OrderParam) GetFormatConditionStr(param *QueryParam) string {
+	if param.OrderField == "" {
+		orderParam.Field = param.Column
+	} else {
+		orderParam.Field = param.OrderField
+	}
+	if param.OrderRule != "" {
+		if param.OrderRule == "ASC" || param.OrderRule == "DESC" {
+			orderParam.Rule = param.OrderRule
+		}
+	}
+	return fmt.Sprintf("ORDER BY %s %s", orderParam.Field, orderParam.Rule)
+}
+
+// 高级语法聚合
+type GroupUnitParam struct {
+	supportGrams []SqlCondition
+}
+
+func (groupUnitParam *GroupUnitParam) GetParamName() string {
+	return "GroupUnit"
+}
+
+func (groupUnitParam *GroupUnitParam) GetFormatConditionStr(param *QueryParam) (sqlStr string) {
+	dbDriver, _ := getDriverInstance(param.Driver)
+	if param.Column == "" {
+		FileLog.Error("聚合字段为空,无法生成聚合sql")
+		return
+	}
+	var templateSqlStr string
+	if _, ok := TemplateMap[GroupUnit][dbDriver]; !ok {
+		templateSqlStr = TemplateMap[GroupUnit][MySql]
+	} else {
+		templateSqlStr = TemplateMap[GroupUnit][dbDriver]
+	}
+	if templateSqlStr == "" {
+		FileLog.Error("聚合sql模板不存在,无法生成聚合sql")
+		return
+	}
+	templateSql, err := template.New("GroupUnit").Parse(templateSqlStr)
+	if err != nil {
+		FileLog.Error("failed to parse template: %v", err)
+		return
+	}
+	//反射获取结构体的值
+	value := reflect.ValueOf(param)
+	// 检查是否是指针
+	if value.Kind() != reflect.Ptr {
+		fmt.Println("请求参数必须是一个结构体")
+		return
+	}
+	// 获取结构体的元素
+	elem := value.Elem()
+	// 检查是否是结构体
+	if elem.Kind() != reflect.Struct {
+		fmt.Println("请求参数必须是一个结构体")
+		return
+	}
+	for _, supportGram := range groupUnitParam.supportGrams {
+		// 获取字段的值
+		fieldValue := elem.FieldByName(string(supportGram))
+		// 检查字段是否存在
+		if !fieldValue.IsValid() {
+			fmt.Printf("Error: field %s not found\n", supportGram)
+			continue
+		}
+		// 检查字段是否可导出
+		if !fieldValue.CanSet() {
+			fmt.Printf("Error: field %s is not exported and cannot be set\n", supportGram)
+			continue
+		}
+		newValue := sqlGeneratorFactory[supportGram].GetFormatConditionStr(param)
+		// 检查新值的类型是否匹配
+		newValueValue := reflect.ValueOf(newValue)
+		if fieldValue.Type() != newValueValue.Type() {
+			fmt.Printf("字段%s类型不匹配 : 期望的类型是 %s, 传入的类型为: %s", supportGram, fieldValue.Type(), newValueValue.Type())
+			return
+		}
+		// 设置字段的值
+		fieldValue.Set(newValueValue)
+	}
+	// 渲染模板
+	var buf bytes.Buffer
+	err = templateSql.Execute(&buf, param)
+	if err != nil {
+		fmt.Sprintf("执行模板填充失败: %v", err)
+		return
+	}
+	sqlStr = buf.String()
+	fmt.Printf("生成的聚合语句为:%s\n", sqlStr)
+	return sqlStr
+}
+
+func GroupUnitFunc(driver string, column, delimiter string, columnOrder bool, orderField, orderRule string, hasDistinct bool) (sqlStr string) {
+	dbDriver, _ := getDriverInstance(driver)
+	if delimiter == "" {
+		delimiter = ","
+	}
+	if column == "" {
+		column = "[UNKNOWN COLUMN]"
+	}
+	//if tableAlia != "" {
+	//	column = fmt.Sprintf("%s.%s", tableAlia, column)
+	//}
+	var sqlOrder, strDistinct string
+	if hasDistinct {
+		strDistinct = "DISTINCT"
+	}
+	if columnOrder && orderField == "" {
+		orderField = column
+	}
+	switch dbDriver {
+	case DM:
+		if columnOrder {
+			sqlOrder = fmt.Sprintf("WITHIN GROUP (ORDER BY %s %s)", orderField, orderRule)
+		}
+		sqlStr = fmt.Sprintf("LISTAGG(%s %s, '%s') %s", strDistinct, column, delimiter, sqlOrder)
+	default:
+		// 默认使用MySQL的语法
+		if columnOrder {
+			sqlOrder = fmt.Sprintf("ORDER BY %s %s", orderField, orderRule)
+		}
+		sqlStr = fmt.Sprintf("GROUP_CONCAT(%s %s %s SEPARATOR '%s')", strDistinct, column, sqlOrder, delimiter)
+	}
+	return sqlStr
+}
+
+func getDriverInstance(driver string) (dbDriver Driver, err error) {
+	if driver == "" {
+		dbDriver = supportDriverMap[DbDriverName]
+	}
+	if currentDriver, ok := supportDriverMap[driver]; !ok {
+		err = errors.New("不支持的数据库驱动类型")
+		return
+	} else {
+		dbDriver = currentDriver
+	}
+	return
+}
+
+func NeedDateOrTimeFormat(driver string) bool {
+	var dbDriver Driver
+	if driver == "" {
+		dbDriver = supportDriverMap[DbDriverName]
+	} else {
+		dbDriver, _ = getDriverInstance(driver)
+	}
+	if dbDriver == DM {
+		return true
+	}
+	return false
+}
+
+func ReplaceDriverKeywords(driver string, sql string) string {
+	dbDriver, _ := getDriverInstance(driver)
+	rules := map[Driver]map[string]string{
+		DM: {
+			"admin":    `"admin"`,
+			"value":    `"value"`,
+			"exchange": `"exchange"`,
+			"size":     `"size"`,
+			"a.from":   `a."from"`,
+			"b.from":   `b."from"`,
+		},
+	}
+	replacements, ok := rules[dbDriver]
+	if !ok {
+		return sql
+	}
+	for keyword, replace := range replacements {
+		// 仅替换单独的单词,复合单词含关键词不管
+		pattern := fmt.Sprintf(`\b%s\b`, regexp.QuoteMeta(keyword))
+		re := regexp.MustCompile(pattern)
+		sql = re.ReplaceAllString(sql, replace)
+	}
+	return sql
+}
+
+func GenerateQuerySql(gram SqlCondition, param *QueryParam) (sqlGenerator string) {
+	if exec, ok := sqlGeneratorFactory[gram]; !ok {
+		FileLog.Error("不支持的语法:%s", gram)
+		return
+	} else {
+		sqlGenerator = exec.GetFormatConditionStr(param)
+	}
+	return
+}

+ 74 - 0
utils/time.go

@@ -0,0 +1,74 @@
+package utils
+
+import "time"
+
+// 获取今天的日期(零点零分零秒)
+func Today() time.Time {
+	now := time.Now()
+	return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+}
+
+// 获取明天的日期(零点零分零秒)
+func Tomorrow() time.Time {
+	return Today().AddDate(0, 0, 1)
+}
+
+// 获取最近7天的日期范围
+func Last7Days() (time.Time, time.Time) {
+	today := Today()
+	return today.AddDate(0, 0, -6), today.Add(time.Hour * 23).Add(time.Minute * 59).Add(time.Second * 59)
+}
+
+// 获取上周的日期范围
+func LastWeek() (time.Time, time.Time) {
+	start := Today().AddDate(0, 0, -7)
+	end := start.AddDate(0, 0, 6).Add(time.Hour * 23).Add(time.Minute * 59).Add(time.Second * 59)
+	return start, end
+}
+
+// 获取本周的日期范围
+func ThisWeek() (time.Time, time.Time) {
+	start := Today().Round(0).Local().AddDate(0, 0, 0-int(time.Now().Weekday())+1) // 0是本周的第一天,+1是因为AddDate是相对于当前时间的
+	end := start.AddDate(0, 0, 6).Add(time.Hour * 23).Add(time.Minute * 59).Add(time.Second * 59)
+	return start, end
+}
+
+// 获取下周的日期范围
+func NextWeek() (time.Time, time.Time) {
+	_, thisEnd := ThisWeek()
+	start := thisEnd.AddDate(0, 0, 1)
+	end := start.AddDate(0, 0, 6).Add(time.Hour * 23).Add(time.Minute * 59).Add(time.Second * 59)
+	return start, end
+}
+
+// 获取上月的日期范围
+func LastMonth() (time.Time, time.Time) {
+	today := time.Now()
+	year, month, _ := today.Date()
+	start := time.Date(year, month-1, 1, 0, 0, 0, 0, today.Location())
+	end := time.Date(year, month, 0, 23, 59, 59, 999999999, today.Location())
+	return start, end
+}
+
+// 获取本月的日期范围
+func ThisMonth() (time.Time, time.Time) {
+	today := time.Now()
+	year, month, _ := today.Date()
+	start := time.Date(year, month, 1, 0, 0, 0, 0, today.Location())
+	end := time.Date(year, month+1, 0, 23, 59, 59, 999999999, today.Location())
+	return start, end
+}
+
+// 获取下月的日期范围
+func NextMonth() (time.Time, time.Time) {
+	now := time.Now()
+	year, month, _ := now.Date()
+	nextMonth := month + 1
+	if nextMonth > 12 {
+		nextMonth = 1
+		year++
+	}
+	startOfNextMonth := time.Date(year, nextMonth, 1, 0, 0, 0, 0, now.Location())
+	endOfNextMonth := startOfNextMonth.AddDate(0, 1, -1).Add(time.Hour*23 + time.Minute*59 + time.Second*59)
+	return startOfNextMonth, endOfNextMonth
+}