Browse Source

Merge remote-tracking branch 'origin/master' into eta/1.3.1

# Conflicts:
#	models/data_manage/edb_info.go
Roc 1 year ago
parent
commit
1acdcf0a8d
100 changed files with 3539 additions and 5213 deletions
  1. 1 1
      .gitignore
  2. 3 1
      controllers/base_auth.go
  3. 3 1
      controllers/base_common.go
  4. 2 3
      controllers/cloud_disk.go
  5. 52 13
      controllers/data_manage/chart_info.go
  6. 3 3
      controllers/data_manage/com_trade.go
  7. 480 97
      controllers/data_manage/edb_info.go
  8. 1 1
      controllers/data_manage/edb_info_calculate.go
  9. 3 3
      controllers/data_manage/excel/excel_info.go
  10. 1 1
      controllers/data_manage/excel/mixed_table.go
  11. 3 3
      controllers/data_manage/future_good/future_good_chart_info.go
  12. 1 1
      controllers/data_manage/future_good/future_good_edb_info.go
  13. 21 3
      controllers/data_manage/my_chart.go
  14. 5 5
      controllers/data_manage/mysteel_chemical_data.go
  15. 8 8
      controllers/data_manage/predict_edb_info.go
  16. 2 2
      controllers/data_manage/supply_analysis/variety.go
  17. 2 2
      controllers/data_manage/supply_analysis/variety_edb.go
  18. 842 0
      controllers/data_stat/edb_source_stat.go
  19. 200 0
      controllers/data_stat/edb_terminal.go
  20. 3 4
      controllers/english_report/english_company.go
  21. 14 2
      controllers/english_report/report.go
  22. 21 0
      controllers/error.go
  23. 1 1
      controllers/ppt_english.go
  24. 1 1
      controllers/ppt_v2.go
  25. 32 2
      controllers/report.go
  26. 2 2
      controllers/report_author.go
  27. 6 3
      controllers/sandbox/sandbox.go
  28. 1 1
      controllers/semantic_analysis/sa_compare.go
  29. 11 1
      controllers/smart_report/smart_report.go
  30. 2 1
      controllers/sys_admin.go
  31. 2 3
      controllers/sys_role_admin.go
  32. 4 3
      controllers/target.go
  33. 42 24
      controllers/user_login.go
  34. 6 1
      main.go
  35. 27 12
      models/classify.go
  36. 2 2
      models/data_manage/baiinfo_data.go
  37. 1 1
      models/data_manage/base_from_eia_stero.go
  38. 7 7
      models/data_manage/chart_edb_mapping.go
  39. 17 13
      models/data_manage/chart_info.go
  40. 3 2
      models/data_manage/coal_data.go
  41. 2 2
      models/data_manage/edb_data_baiinfo.go
  42. 44 6
      models/data_manage/edb_data_base.go
  43. 4 4
      models/data_manage/edb_data_calculate.go
  44. 8 8
      models/data_manage/edb_data_calculate_time_shift.go
  45. 2 79
      models/data_manage/edb_data_cffex.go
  46. 2 2
      models/data_manage/edb_data_coal.go
  47. 0 348
      models/data_manage/edb_data_dl.go
  48. 0 469
      models/data_manage/edb_data_gie.go
  49. 2 2
      models/data_manage/edb_data_gl.go
  50. 1 1
      models/data_manage/edb_data_insert_config.go
  51. 2 2
      models/data_manage/edb_data_lz.go
  52. 0 303
      models/data_manage/edb_data_manual.go
  53. 2 2
      models/data_manage/edb_data_quarter.go
  54. 2 2
      models/data_manage/edb_data_sci.go
  55. 0 345
      models/data_manage/edb_data_sh.go
  56. 0 350
      models/data_manage/edb_data_shfe.go
  57. 63 0
      models/data_manage/edb_data_wind_wsd.go
  58. 4 4
      models/data_manage/edb_data_ys.go
  59. 0 350
      models/data_manage/edb_data_zz.go
  60. 218 325
      models/data_manage/edb_info.go
  61. 1 1
      models/data_manage/edb_info_calculate.go
  62. 8 8
      models/data_manage/edb_info_calculate_bp.go
  63. 10 10
      models/data_manage/edb_info_calculate_hbz.go
  64. 10 10
      models/data_manage/edb_info_calculate_hcz.go
  65. 13 276
      models/data_manage/edb_info_calculate_ljztbpj.go
  66. 7 7
      models/data_manage/edb_info_calculate_ljzzy.go
  67. 3 260
      models/data_manage/edb_info_calculate_nszydpjjs.go
  68. 2 725
      models/data_manage/edb_info_calculate_tbz.go
  69. 8 8
      models/data_manage/edb_info_calculate_tcz.go
  70. 5 429
      models/data_manage/edb_info_calculate_zjpj.go
  71. 105 2
      models/data_manage/edb_terminal.go
  72. 2 2
      models/data_manage/excel/excel_info.go
  73. 3 2
      models/data_manage/gl_data.go
  74. 8 0
      models/data_manage/my_chart.go
  75. 7 0
      models/data_manage/response/chart.go
  76. 3 3
      models/data_manage/sci_data.go
  77. 2 2
      models/data_manage/smm_data.go
  78. 2 2
      models/data_source/longzhong.go
  79. 114 0
      models/data_stat/edb_info_delete_log.go
  80. 74 0
      models/data_stat/edb_info_stat_column.go
  81. 104 0
      models/data_stat/edb_info_update_log.go
  82. 145 0
      models/data_stat/edb_info_update_stat.go
  83. 75 0
      models/data_stat/edb_source_stat.go
  84. 14 0
      models/db.go
  85. 18 14
      models/english_report.go
  86. 2 1
      models/english_report_email.go
  87. 2 2
      models/report_chapter_ticker.go
  88. 16 8
      models/target.go
  89. 126 0
      routers/commentsRouter.go
  90. 7 0
      routers/router.go
  91. 21 2
      services/data/base_edb_lib.go
  92. 121 232
      services/data/chart_info.go
  93. 4 4
      services/data/correlation/chart_info.go
  94. 8 6
      services/data/edb_classify.go
  95. 3 3
      services/data/edb_data.go
  96. 250 323
      services/data/edb_info.go
  97. 2 2
      services/data/edb_info_calculate.go
  98. 35 25
      services/data/excel/custom_analysis_edb.go
  99. 4 5
      services/data/excel/excel_info.go
  100. 1 1
      services/data/excel/mixed_table.go

+ 1 - 1
.gitignore

@@ -18,4 +18,4 @@
 eta_api.exe
 eta_api.exe~
 /static/tmpFile/*
-/etalogs
+etalogs/

+ 3 - 1
controllers/base_auth.go

@@ -302,6 +302,8 @@ func (c *BaseAuthController) ServeJSON(encoding ...bool) {
 
 func (c *BaseAuthController) JSON(data interface{}, hasIndent bool, coding bool) error {
 	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	desEncrypt := utils.DesBase64Encrypt([]byte(utils.DesKey), utils.DesKeySalt)
+	c.Ctx.Output.Header("Dk", string(desEncrypt)) // des3加解密key
 	var content []byte
 	var err error
 	if hasIndent {
@@ -324,7 +326,7 @@ func (c *BaseAuthController) JSON(data interface{}, hasIndent bool, coding bool)
 	c.logUri(content, requestBody, ip)
 	// 如果不是debug分支的话,那么需要加密返回
 	if utils.RunMode != "debug" {
-		content = utils.DesBase64Encrypt(content)
+		content = utils.DesBase64Encrypt(content, utils.DesKey)
 		// get请求时,不加双引号就获取不到数据,不知道什么原因,所以还是在前后加上双引号吧
 		content = []byte(`"` + string(content) + `"`)
 	}

+ 3 - 1
controllers/base_common.go

@@ -85,6 +85,8 @@ func (c *BaseCommonController) ServeJSON(encoding ...bool) {
 
 func (c *BaseCommonController) JSON(data interface{}, hasIndent bool, coding bool) error {
 	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	desEncrypt := utils.DesBase64Encrypt([]byte(utils.DesKey), utils.DesKeySalt)
+	c.Ctx.Output.Header("Dk", string(desEncrypt)) // des3加解密key
 	var content []byte
 	var err error
 	if hasIndent {
@@ -104,7 +106,7 @@ func (c *BaseCommonController) JSON(data interface{}, hasIndent bool, coding boo
 	c.logUri(content, requestBody, ip)
 	// 如果不是debug分支的话,那么需要加密返回
 	if utils.RunMode != "debug" {
-		content = utils.DesBase64Encrypt(content)
+		content = utils.DesBase64Encrypt(content, utils.DesKey)
 		// get请求时,不加双引号就获取不到数据,不知道什么原因,所以还是在前后加上双引号吧
 		content = []byte(`"` + string(content) + `"`)
 	}

+ 2 - 3
controllers/cloud_disk.go

@@ -794,11 +794,10 @@ func (this *CloudDiskController) List() {
 	resourcePars := make([]interface{}, 0)
 	if keyword != "" {
 		// 有关键词时全局搜索
-		kw := "%" + keyword + "%"
 		menuCond += ` AND menu_name LIKE ? `
-		menuPars = append(menuPars, kw)
+		menuPars = append(menuPars, utils.GetLikeKeyword(keyword))
 		resourceCond += ` AND resource_name LIKE ? `
-		resourcePars = append(resourcePars, kw)
+		resourcePars = append(resourcePars, utils.GetLikeKeyword(keyword))
 	} else {
 		menuCond += ` AND parent_id = ? `
 		menuPars = append(menuPars, menuId)

+ 52 - 13
controllers/data_manage/chart_info.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
@@ -1466,14 +1467,14 @@ func (this *ChartInfoController) ChartInfoEdbInfoDetail() {
 
 	switch edbInfo.EdbInfoType {
 	case 0: //普通源指标
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDateReal, endDate)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDateReal, endDate)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.Msg = "获取失败,Err:" + err.Error()
 			return
 		}
 		//查询区间内最大最小值
-		minData, maxData, err = data_manage.GetEdbDataListMinAndMax(edbInfo.Source, edbInfoId, startDateReal, endDate)
+		minData, maxData, err = data_manage.GetEdbDataListMinAndMax(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDateReal, endDate)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error()
@@ -1490,7 +1491,7 @@ func (this *ChartInfoController) ChartInfoEdbInfoDetail() {
 		// 有预测数据,且为普通的预测指标
 		if len(dataList) > 0 && edbInfo.EdbInfoType == 0 {
 			//查询区间内最大最小值
-			minData, maxData, err = data_manage.GetEdbDataListMinAndMax(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, startDateReal, endDate)
+			minData, maxData, err = data_manage.GetEdbDataListMinAndMax(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, startDateReal, endDate)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error()
@@ -2297,24 +2298,22 @@ func (this *EdbInfoController) BatchChartInfoRefresh() {
 		return
 	}
 
-	err, isAsync := data.BatchChartInfoRefreshV2(chartInfoList)
+	redisKey := data.GetBatchChartRefreshKey(req.Source, req.ReportId, req.ReportChapterId)
+
+	// 图表中的指标刷新
+	err, isAsync := data.BatchChartInfoRefreshV2(chartInfoList, redisKey)
 	if err != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
 		return
 	}
-
-	//清除图表缓存
-	for _, v := range chartInfoList {
-		key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
-		_ = utils.Rc.Delete(key)
-	}
-	br.Ret = 200
-	br.Success = true
 	br.Msg = "刷新成功"
 	if isAsync {
-		br.Msg = "图表关联指标较多,请10分钟后刷新页面查看最新数据"
+		br.Msg = "研报中图表关联指标较多,请10分钟后刷新页面查看最新数据"
 	}
+	br.Ret = 200
+	br.Success = true
+
 }
 
 // CopyChartInfo
@@ -2744,6 +2743,46 @@ func (this *ChartInfoController) PreviewSectionScatterChartInfo() {
 	br.Data = resp
 }
 
+// GetBatchChartRefreshResult
+// @Title 获取批量刷新图表结果的接口
+// @Description 获取批量刷新图表结果的接口
+// @Param	request	body data_manage.BatchChartRefreshReq true "type json string"
+// @Success Ret=200 刷新成功
+// @router /chart_info/batch_refresh/result [post]
+func (this *EdbInfoController) GetBatchChartRefreshResult() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage.BatchChartRefreshReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 刷新结果,默认是刷新完成了
+	refreshResult := data.CheckBatchChartRefreshResult(req.Source, req.ReportId, req.ReportChapterId)
+
+	resp := response.ChartRefreshResp{
+		RefreshResult: refreshResult,
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+
+}
+
 //
 //修复数据时间戳
 

+ 3 - 3
controllers/data_manage/com_trade.go

@@ -1,11 +1,11 @@
 package data_manage
 
 import (
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
@@ -236,7 +236,7 @@ func (this *EdbInfoController) ComTradeList() {
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
 		condition += ` AND ( index_name_cn like ? or index_code like ? ) `
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	list, err := data_manage.GetComTradeIndexList(condition, pars)

+ 480 - 97
controllers/data_manage/edb_info.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data_stat"
 	"eta/eta_api/services/elastic"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
@@ -31,7 +32,9 @@ type EdbInfoController struct {
 // @Title 新增指标-查询指标信息接口
 // @Description 新增指标-查询指标信息接口
 // @Param   Source   query   int  true       "来源:1:同花顺,2:wind,3:彭博"
-// @Param   EdbCode   query   string  false       "指标编码"
+// @Param   SubSource   query   int  true       "子数据来源:0:经济数据库,1:日期序列"
+// @Param   EdbCode   query   string  false       "指标编码/指标代码"
+// @Param   StockCode   query   string  false       "证券代码"
 // @Success 200 {object} data_manage.EdbInfoSearchResp
 // @router /edb_info/search [get]
 func (this *EdbInfoController) EdbInfoSearch() {
@@ -45,11 +48,14 @@ func (this *EdbInfoController) EdbInfoSearch() {
 	edbCode = strings.Trim(edbCode, "\t")
 	edbCode = strings.Trim(edbCode, " ")
 	edbCode = strings.Replace(edbCode, "\t", "", -1)
+	subSource, _ := this.GetInt("SubSource")
+	stockCode := this.GetString("StockCode")
 
 	if source <= 0 {
 		br.Msg = "无效的数据来源"
 		return
 	}
+
 	if edbCode == "" {
 		br.Msg = "请输入指标ID"
 		return
@@ -155,7 +161,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 
 		searchItem := new(data_manage.EdbInfoSearch)
 		if source == utils.DATA_SOURCE_THS {
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_THS, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_THS, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取Ths已存在信息失败,Err:" + err.Error()
@@ -197,34 +203,63 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				isAdd = true
 			}
 		} else if source == utils.DATA_SOURCE_WIND {
-			fmt.Println("wind data exist")
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_WIND, utils.EDB_DATA_LIMIT)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取Wind已存在信息失败,Err:" + err.Error()
-				return
-			}
-			fmt.Println("wind dataItems:", len(dataItems))
-			if len(dataItems) > 0 {
-				searchItem.EdbCode = edbCode
-				minDate, maxDate, err := data_manage.GetEdbDataWindMaxOrMinDate(edbCode)
-				if err != nil {
+			fmt.Println("subSource:", subSource)
+			if subSource == utils.DATA_SUB_SOURCE_EDB {
+				dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_WIND, subSource, utils.EDB_DATA_LIMIT)
+				if err != nil && err.Error() != utils.ErrNoRow() {
 					br.Msg = "获取失败"
-					br.ErrMsg = "获取wind日期信息失败,Err:" + err.Error()
+					br.ErrMsg = "获取Wind已存在信息失败,Err:" + err.Error()
 					return
 				}
-				searchItem.DataList = dataItems
-				searchItem.StartDate = minDate
-				searchItem.EndDate = maxDate
-			} else {
-				//endDate := dateNow.Format(utils.FormatDate)
-				//searchItem, err = data.GetEdbDataByWind(edbCode, startDate, endDate)
-				//if err != nil {
-				//	br.Msg = "获取失败"
-				//	br.ErrMsg = "wind 获取失败,Err:" + err.Error()
-				//	return
-				//}
-				respItem, err := data.AddEdbData(source, edbCode)
+				fmt.Println("wind dataItems:", len(dataItems))
+				if len(dataItems) > 0 {
+					searchItem.EdbCode = edbCode
+					minDate, maxDate, err := data_manage.GetEdbDataWindMaxOrMinDate(edbCode)
+					if err != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取wind日期信息失败,Err:" + err.Error()
+						return
+					}
+					searchItem.DataList = dataItems
+					searchItem.StartDate = minDate
+					searchItem.EndDate = maxDate
+				} else {
+					//endDate := dateNow.Format(utils.FormatDate)
+					//searchItem, err = data.GetEdbDataByWind(edbCode, startDate, endDate)
+					//if err != nil {
+					//	br.Msg = "获取失败"
+					//	br.ErrMsg = "wind 获取失败,Err:" + err.Error()
+					//	return
+					//}
+					respItem, err := data.AddEdbData(source, edbCode)
+					if err != nil {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取失败,Err:" + err.Error()
+						return
+					}
+					if respItem.Ret != 200 {
+						if respItem.Ret == 421 {
+							br.Msg = "该渠道已超过添加上限"
+						} else if respItem.Ret == 4052 {
+							br.Msg = "该指标已下架"
+						} else {
+							br.Msg = "未搜索到该指标"
+						}
+						br.ErrMsg = respItem.ErrMsg + ";EdbCode:" + edbCode
+						return
+					}
+					isAdd = true
+				}
+			} else if subSource == utils.DATA_SUB_SOURCE_DATE {
+				if stockCode == "" {
+					br.Msg = "请输入证券代码"
+					return
+				}
+				if edbCode == "" {
+					br.Msg = "请输入指标代码"
+					return
+				}
+				respItem, err := data.AddEdbDataWindWsd(source, stockCode, edbCode)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -242,10 +277,13 @@ func (this *EdbInfoController) EdbInfoSearch() {
 					return
 				}
 				isAdd = true
+			} else {
+				br.Msg = "无效的渠道来源"
+				return
 			}
 		} else if source == utils.DATA_SOURCE_PB || source == utils.DATA_SOURCE_PB_FINANCE {
 			fmt.Println("pb data exist")
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取Pb已存在信息失败,Err:" + err.Error()
@@ -286,7 +324,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				isAdd = true
 			}
 		} else if source == utils.DATA_SOURCE_MANUAL { //手工数据指标
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_MANUAL, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_MANUAL, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取Ths已存在信息失败,Err:" + err.Error()
@@ -340,7 +378,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 
 		} else if source == utils.DATA_SOURCE_LZ {
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_LZ, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_LZ, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取隆众已存在信息失败,Err:" + err.Error()
@@ -409,7 +447,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbName = lzInfo.SampleName + lzInfo.BreedName + lzInfo.QuotaName
 			}
 		} else if source == utils.DATA_SOURCE_YS { //有色网
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取Ys已存在信息失败,Err:" + err.Error()
@@ -469,7 +507,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 
 		} else if source == utils.DATA_SOURCE_GL { //钢联
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
@@ -533,7 +571,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取郑商所已存在信息失败,Err:" + err.Error()
@@ -611,7 +649,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取大商所已存在信息失败,Err:" + err.Error()
@@ -690,7 +728,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取上期所已存在信息失败,Err:" + err.Error()
@@ -769,7 +807,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取中金所已存在信息失败,Err:" + err.Error()
@@ -848,7 +886,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取上期能源已存在信息失败,Err:" + err.Error()
@@ -942,7 +980,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取欧洲天然气已存在信息失败,Err:" + err.Error()
@@ -1050,7 +1088,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "暂不支持编码中含有=的指标"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_LT, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_LT, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取 lt 已存在信息失败,Err:" + err.Error()
@@ -1059,7 +1097,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			fmt.Println("lt dataItems:", len(dataItems))
 			if len(dataItems) > 0 {
 				searchItem.EdbCode = edbCode
-				edbInfoMaxAndMinInfo, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				edbInfoMaxAndMinInfo, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取lt日期信息失败,Err:" + err.Error()
@@ -1106,7 +1144,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				br.ErrMsg = "指标code异常"
 				return
 			}
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取煤炭网已存在信息失败,Err:" + err.Error()
@@ -1167,7 +1205,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbName = coalInfo.IndexName
 			}
 		} else if source == utils.DATA_SOURCE_GOOGLE_TRAVEL { //谷歌出行数据
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取煤炭网已存在信息失败,Err:" + err.Error()
@@ -1176,7 +1214,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 
 			if len(dataItems) > 0 {
 				searchItem.EdbCode = edbCode
-				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取煤炭网日期信息失败,Err:" + err.Error()
@@ -1202,7 +1240,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				isAdd = true
 			}
 		} else if source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL { //钢联化工
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
@@ -1254,7 +1292,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbName = glInfo.IndexName
 			}
 		} else if source == utils.DATA_SOURCE_EIA_STEO { //eia steo报告
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
@@ -1263,7 +1301,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 
 			if len(dataItems) > 0 {
 				searchItem.EdbCode = edbCode
-				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取eia steo日期信息失败,Err:" + err.Error()
@@ -1299,7 +1337,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbName = eiasteoInfo.IndexName
 			}
 		} else if source == utils.DATA_SOURCE_COM_TRADE { // un数据源
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取联合国商品贸易数据已存在信息失败,Err:" + err.Error()
@@ -1308,7 +1346,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 
 			if len(dataItems) > 0 {
 				searchItem.EdbCode = edbCode
-				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取联合国商品贸易数据日期信息失败,Err:" + err.Error()
@@ -1353,7 +1391,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbName = eiasteoInfo.Name
 			}
 		} else if source == utils.DATA_SOURCE_SCI { //卓创数据(红桃三)
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取SCI已存在信息失败,Err:" + err.Error()
@@ -1413,7 +1451,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 
 		} else if source == utils.DATA_SOURCE_BAIINFO { //百川盈孚
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取BAIINFO已存在信息失败,Err:" + err.Error()
@@ -1473,7 +1511,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 
 		} else if source == utils.DATA_SOURCE_NATIONAL_STATISTICS { // 国家统计局
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取国家统计局已存在信息失败,Err:" + err.Error()
@@ -1482,7 +1520,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 
 			if len(dataItems) > 0 {
 				searchItem.EdbCode = edbCode
-				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				item, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 				if err != nil {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取国家统计局日期信息失败,Err:" + err.Error()
@@ -1518,7 +1556,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbName = fmt.Sprintf("%s%s", nationalInfo.Reg, nationalInfo.IndexName)
 			}
 		} else if source == utils.DATA_SOURCE_FUBAO { //数宝
-			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_FUBAO, utils.EDB_DATA_LIMIT)
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_FUBAO, subSource, utils.EDB_DATA_LIMIT)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取Fubao已存在信息失败,Err:" + err.Error()
@@ -1561,7 +1599,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 
 			// 获取指标数据
-			dataList, e := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
+			dataList, e := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
 			if e != nil {
 				br.Msg = "获取失败"
 				br.ErrMsg = "获取指标数据失败, Err: " + e.Error()
@@ -1571,7 +1609,7 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.EdbCode = edbCode
 				searchItem.DataList = dataList
 				// 获取最大最小值
-				edbInfoMaxAndMinInfo, e := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+				edbInfoMaxAndMinInfo, e := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 				if e != nil && e.Error() != utils.ErrNoRow() {
 					br.Msg = "获取失败"
 					br.ErrMsg = "获取数据失败, GetEdbInfoMaxAndMinInfo Err:" + e.Error()
@@ -1625,31 +1663,115 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			}
 		}
 		if isAdd {
-			dataList, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, utils.EDB_DATA_LIMIT)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取数据失败,GetEdbDataAllByEdbCode Err:" + err.Error()
-				return
-			}
-			searchItem.DataList = dataList
+			if subSource == utils.DATA_SUB_SOURCE_DATE {
+				//wsdData := windWsdRespItem.Data
+				//var buf bytes.Buffer
+				//// 创建一个encoder并指定目标为buf
+				//enc := gob.NewEncoder(&buf)
+				//
+				//// 将data编码到buf中
+				//err = enc.Encode(wsdData)
+				//if err != nil {
+				//	br.Msg = "获取失败"
+				//	br.ErrMsg = "获取数据失败,wind wsd encoding GOB Err:" + err.Error()
+				//	return
+				//}
+				//
+				//wsdDataMap := make(map[string]map[string]interface{})
+				//err = json.Unmarshal(buf.Bytes(), &wsdDataMap)
+				//if err != nil {
+				//	br.Msg = "获取失败"
+				//	br.ErrMsg = "获取数据失败,wind wsd json.Unmarshal Err:" + err.Error()
+				//	return
+				//}
+				//
+				//stockList := make([]*data_manage.StockInfo, 0)
+				//
+				//dataList := make([]*data_manage.EdbInfoSearchData, 0)
+				//for wk, wv := range wsdDataMap {
+				//	for vk, vv := range wv {
+				//		wkInt, err := strconv.ParseInt(wk, 10, 64)
+				//		if err != nil {
+				//			br.Msg = "获取失败"
+				//			br.ErrMsg = "获取数据失败,转换日期类型失败 Err:" + err.Error()
+				//			return
+				//		}
+				//
+				//		vk = strings.ToLower(vk)
+				//		wkInt = wkInt / 1000
+				//		t := time.Unix(wkInt, 0)
+				//		dateTime := t.Format(utils.FormatDate)
+				//		//saveVal := utils.SubFloatToString(val, 20)
+				//		if vv == nil {
+				//			continue
+				//		}
+				//		var saveVal string
+				//		switch vt := vv.(type) {
+				//		case int:
+				//			saveVal = strconv.Itoa(vt)
+				//		case float64:
+				//			saveVal = utils.SubFloatToFloatStr(vt, 20)
+				//		case string:
+				//			saveVal = vt
+				//		}
+				//
+				//		dataItem := new(data_manage.EdbInfoSearchData)
+				//		dataItem.Value = saveVal
+				//		dataItem.DataTime = dateTime
+				//		dataList = append(dataList, dataItem)
+				//		if len(dataList) >= 10 {
+				//			break
+				//		}
+				//	}
+				//}
+				//searchItem.StockList = stockList
 
-			edbInfoMaxAndMinInfo, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取数据失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
-				return
-			}
-			searchItem.EdbCode = edbCode
-			searchItem.DataList = dataList
-			if edbInfoMaxAndMinInfo != nil {
-				searchItem.StartDate = edbInfoMaxAndMinInfo.MinDate
-				searchItem.EndDate = edbInfoMaxAndMinInfo.MaxDate
-			}
+				stockList := make([]*data_manage.StockInfo, 0)
+				edbCodeArr := strings.Split(edbCode, ",")
+				for _, v := range edbCodeArr {
+					indexCode := utils.WindDbWsd + stockCode + v
 
-			//edb指标信息
-			edbInfoItem, err := data_manage.GetEdbInfoByEdbCode(source, edbCode)
-			if edbInfoItem != nil {
-				searchItem.EdbName = edbInfoItem.EdbName
+					dataList, err := data_manage.GetEdbDataAllByEdbCodeAndSubSource(indexCode, source, utils.DATA_SUB_SOURCE_DATE, utils.EDB_DATA_LIMIT)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						br.Msg = "获取失败"
+						br.ErrMsg = "获取数据失败,GetEdbDataAllByEdbCode Err:" + err.Error()
+						return
+					}
+
+					stockInfo := new(data_manage.StockInfo)
+					stockInfo.StockCode = stockCode
+					stockInfo.EdbCode = v
+					stockInfo.DataList = dataList
+					stockList = append(stockList, stockInfo)
+				}
+				searchItem.StockList = stockList
+			} else {
+				dataList, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取数据失败,GetEdbDataAllByEdbCode Err:" + err.Error()
+					return
+				}
+				searchItem.DataList = dataList
+
+				edbInfoMaxAndMinInfo, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取数据失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
+					return
+				}
+				searchItem.EdbCode = edbCode
+				searchItem.DataList = dataList
+				if edbInfoMaxAndMinInfo != nil {
+					searchItem.StartDate = edbInfoMaxAndMinInfo.MinDate
+					searchItem.EndDate = edbInfoMaxAndMinInfo.MaxDate
+				}
+
+				//edb指标信息
+				edbInfoItem, err := data_manage.GetEdbInfoByEdbCode(source, edbCode)
+				if edbInfoItem != nil {
+					searchItem.EdbName = edbInfoItem.EdbName
+				}
 			}
 		}
 		resp.Status = 2
@@ -1778,20 +1900,37 @@ func (this *EdbInfoController) EdbInfoList() {
 	dataCondition += ` AND edb_info_id=? `
 	dataPars = append(dataPars, edbInfoItem.EdbInfoId)
 
-	dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取指标信息失败"
-		br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
-		return
-	}
-	page = paging.GetPaging(currentIndex, pageSize, dataCount)
-	dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
-	if err != nil {
-		br.Msg = "获取指标信息失败"
-		br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-		return
+	if edbInfoItem.SubSource == utils.DATA_SUB_SOURCE_DATE {
+		dataCount, err := data_manage.GetEdbWsdDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+			return
+		}
+		page = paging.GetPaging(currentIndex, pageSize, dataCount)
+		dataList, err := data_manage.GetEdbWsdDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		edbInfoItem.DataList = dataList
+	} else {
+		dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+			return
+		}
+		page = paging.GetPaging(currentIndex, pageSize, dataCount)
+		dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource, pageSize, startSize)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		edbInfoItem.DataList = dataList
 	}
-	edbInfoItem.DataList = dataList
 
 	// 获取指标插入配置
 	{
@@ -1930,7 +2069,7 @@ func (this *EdbInfoController) EdbInfoAdd() {
 	}
 
 	// 指标入库
-	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(source, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, req.StartDate, req.EndDate, sysUser.AdminId, sysUser.RealName)
+	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, req.StartDate, req.EndDate, sysUser.AdminId, sysUser.RealName)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -2132,6 +2271,11 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	// 修改关联的预测指标基础信息
 	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
 
+	// 添加钢联指标更新日志
+	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+		go data_stat.AddEdbInfoUpdateLog(req.EdbInfoId, 1, "", sysUser)
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"
@@ -3061,9 +3205,9 @@ func (this *ChartInfoController) EdbInfoData() {
 		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
 		maxYear = latestDateT.Year()
 	}
-
+	dataList := make([]*data_manage.EdbDataList, 0)
 	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
-	dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDate, endDate)
+	dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDate, endDate)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
@@ -3192,7 +3336,7 @@ func (this *ChartInfoController) EdbInfoReplace() {
 
 	sysAdminId := sysUser.AdminId
 	//replaceChartTotal, replaceCalculateTotal, err := data.EdbInfoReplace(oldEdbInfo, newEdbInfo, sysAdminId, sysUser.RealName)
-	_, _, err = data_manage.EdbInfoReplaceV2(oldEdbInfo, newEdbInfo, sysAdminId, sysUser.RealName)
+	_, _, err = data.EdbInfoReplace(oldEdbInfo, newEdbInfo, sysAdminId, sysUser.RealName)
 	//msgContent := ``
 	isFail := false
 	var errmsg string
@@ -3522,7 +3666,7 @@ func (this *EdbInfoController) RelationEdbList() {
 
 		dataList := make([]*data_manage.EdbDataList, 0)
 		if v.EdbInfoType == 0 {
-			dataList, err = data_manage.GetEdbDataList(v.Source, v.EdbInfoId, "", "")
+			dataList, err = data_manage.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, "", "")
 		} else {
 			_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, "", "", false)
 		}
@@ -3797,7 +3941,7 @@ func (this *ChartInfoController) EdbInfoDataTb() {
 		//同比值的计算方式,是需要与去年同期对比,所以如果用户需要某个时间段的数据的话,获取基础数据时,需要往前面推(1年+兼容的日期频度(目前是35天))
 		startDate = startDateTime.AddDate(-1, 0, -35).Format(utils.FormatDate)
 	}
-	tmpDataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDate, endDate)
+	tmpDataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDate, endDate)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.Msg = "获取失败,Err:" + err.Error()
@@ -4849,3 +4993,242 @@ func (this *EdbInfoController) ChartImageSet() {
 	br.Success = true
 	br.Msg = "保存成功"
 }
+
+// EdbInfoExistCheck
+// @Title 新增指标-检验指标是否存在接口
+// @Description 新增指标-检验指标是否存在接口
+// @Param   Source   query   int  true       "来源:1:同花顺,2:wind"
+// @Param   SubSource   query   int  true       "子数据来源:0:经济数据库,1:日期序列"
+// @Param   EdbCode   query   string  false       "指标编码/指标代码"
+// @Param   StockCode   query   string  false       "证券代码"
+// @Success 200 {object} data_manage.EdbInfoExistCheckResp
+// @router /edb_info/exist/check [get]
+func (this *EdbInfoController) EdbInfoExistCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source, _ := this.GetInt("Source")
+	edbCode := this.GetString("EdbCode")
+	edbCode = strings.Trim(edbCode, "\t")
+	edbCode = strings.Trim(edbCode, " ")
+	edbCode = strings.Replace(edbCode, "\t", "", -1)
+	subSource, _ := this.GetInt("SubSource")
+	stockCode := this.GetString("StockCode")
+
+	if source <= 0 {
+		br.Msg = "无效的数据来源"
+		return
+	}
+
+	if edbCode == "" {
+		br.Msg = "请输入指标ID"
+		return
+	}
+
+	if source != utils.DATA_SOURCE_WIND {
+		br.Msg = "无效的数据来源"
+		return
+	}
+	if subSource != utils.DATA_SUB_SOURCE_DATE {
+		br.Msg = "无效的数据库来源"
+		return
+	}
+
+	var indexCodeArr []string
+	edbCodeArr := strings.Split(edbCode, ",")
+	stockCodeArr := strings.Split(stockCode, ",")
+
+	for _, sv := range stockCodeArr {
+		for _, ev := range edbCodeArr {
+			indexCode := utils.WindDbWsd + sv + ev
+			indexCodeArr = append(indexCodeArr, indexCode)
+		}
+	}
+	indexList, err := data_manage.GetEdbInfoByEdbCodeList(source, indexCodeArr)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "校验指标是否存在失败"
+		br.ErrMsg = "校验指标是否存在失败,Err:" + err.Error()
+		return
+	}
+	var existStockCodeArr []string
+	var existEdbCodeArr []string
+	for _, indexItem := range indexList {
+		for _, sv := range stockCodeArr {
+			for _, ev := range edbCodeArr {
+				if strings.Contains(indexItem.EdbCode, sv) {
+					existStockCodeArr = append(existStockCodeArr, sv)
+				}
+				if strings.Contains(indexItem.EdbCode, ev) {
+					existEdbCodeArr = append(existEdbCodeArr, ev)
+				}
+			}
+		}
+	}
+
+	resp := new(data_manage.EdbInfoExistCheckResp)
+	if len(indexList) > 0 {
+		resp.IndexExist = true
+	}
+	resp.ExistEdbCodeArr = existEdbCodeArr
+	resp.ExistStockCodeArr = existStockCodeArr
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbInfoAdd
+// @Title 指标批量保存接口
+// @Description 指标批量保存接口
+// @Param	request	body data_manage.BatchAddEdbInfoReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_info/batch/add [post]
+func (this *EdbInfoController) EdbInfoBatchAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	deleteCache := true
+	cacheKey := "CACHE_EDB_INFO_BATCH_ADD_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	var req data_manage.BatchAddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	source := utils.DATA_SOURCE_WIND
+	if source <= 0 {
+		br.Msg = "无效的数据来源"
+		return
+	}
+
+	resp := new(data_manage.AddEdbInfoResp)
+
+	for k, v := range req.BatchList {
+		v.EdbName = strings.Trim(v.EdbName, " ")
+		v.EdbCode = strings.Trim(v.EdbCode, " ")
+		v.StockCode = strings.Trim(v.StockCode, " ")
+
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不能为空"
+			return
+		}
+
+		if v.StockCode == "" {
+			br.Msg = "证券代码不能为空"
+			return
+		}
+
+		if v.EdbName == "" {
+			br.Msg = "指标名称不能为空"
+			return
+		}
+
+		if v.Frequency == "" {
+			br.Msg = "频率不能为空"
+			return
+		}
+
+		if v.ClassifyId <= 0 {
+			br.Msg = "请选择分类"
+			return
+		}
+
+		edbInfoItem := new(data_manage.EdbInfo)
+		edbInfoItem.Source = source
+		switch source {
+		case utils.DATA_SOURCE_WIND:
+			edbInfoItem.SourceName = "wind"
+		}
+		edbInfoItem.SubSource = 1
+		edbInfoItem.SubSourceName = "日期序列"
+		edbInfoItem.EdbCode = utils.WindDbWsd + v.StockCode + v.EdbCode
+		edbInfoItem.EdbName = v.EdbName
+		edbInfoItem.Frequency = v.Frequency
+		edbInfoItem.Unit = v.Unit
+		edbInfoItem.ClassifyId = v.ClassifyId
+		edbInfoItem.SysUserId = sysUser.AdminId
+		edbInfoItem.SysUserRealName = sysUser.RealName
+		edbInfoItem.IndicatorCode = v.EdbCode
+		edbInfoItem.StockCode = v.StockCode
+
+		// 指标入库
+		edbInfo, err, errMsg, isSendEmail := data.EdbInfoWsdAdd(edbInfoItem)
+		if err != nil {
+			br.Msg = "保存失败"
+			if errMsg != `` {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = err.Error()
+			br.IsSendEmail = isSendEmail
+			return
+		}
+		//新增操作日志
+		{
+			edbLog := new(data_manage.EdbInfoLog)
+			edbLog.EdbInfoId = edbInfo.EdbInfoId
+			edbLog.SourceName = edbInfo.SourceName
+			edbLog.Source = edbInfo.Source
+			edbLog.EdbCode = edbInfo.EdbCode
+			edbLog.EdbName = edbInfo.EdbName
+			edbLog.ClassifyId = edbInfo.ClassifyId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(this.Ctx.Input.RequestBody)
+			edbLog.Status = "新增指标"
+			edbLog.Method = this.Ctx.Input.URI()
+			go data_manage.AddEdbInfoLog(edbLog)
+		}
+
+		if k <= 0 {
+			resp.EdbInfoId = edbInfo.EdbInfoId
+			resp.UniqueCode = edbInfo.UniqueCode
+		}
+	}
+
+	// 试用平台更新用户累计新增指标数
+	adminItem, e := system.GetSysAdminById(sysUser.AdminId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取系统用户数据失败,Err:" + err.Error()
+		return
+	}
+	if utils.BusinessCode == utils.BusinessCodeSandbox && adminItem.DepartmentName == "ETA试用客户" {
+		go func() {
+			var r etaTrialService.EtaTrialUserReq
+			r.Mobile = adminItem.Mobile
+			_, _ = etaTrialService.UpdateUserIndexNum(r)
+		}()
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 1 - 1
controllers/data_manage/edb_info_calculate.go

@@ -1418,7 +1418,7 @@ func (this *EdbInfoController) QueryEdbDataTable() {
 		return
 	}
 
-	tableName := data_manage.GetEdbDataTableName(edbInfo.Source)
+	tableName := data_manage.GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
 
 	columnList := []map[string]string{
 		{

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

@@ -351,7 +351,7 @@ func (c *ExcelInfoController) List() {
 	}
 	if keyword != "" {
 		condition += ` AND  ( excel_name LIKE ? )`
-		pars = append(pars, `%`+keyword+`%`)
+		pars = utils.GetLikeKeywordPars(pars, keyword, 1)
 	}
 	if adminId > 0 {
 		condition += " AND sys_user_id = ? "
@@ -862,7 +862,7 @@ func (c *ExcelInfoController) Move() {
 		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
 		if firstClassify != nil && firstClassify.Sort == 0 {
 			updateSortStr := ` sort + 1 `
-			_ = excel3.UpdateExcelInfoSortByClassifyId(firstClassify.ExcelClassifyId, 0, firstClassify.ExcelInfoId-1, updateSortStr)
+			_ = excel3.UpdateExcelInfoSortByClassifyId(firstClassify.ExcelClassifyId, 0, firstClassify.ExcelInfoId+1, updateSortStr)
 		}
 
 		// 变更表格在当前分类下的排序
@@ -1570,7 +1570,7 @@ func (c *ExcelInfoController) GetFutureDateData() {
 	{
 		switch baseEdbInfo.EdbInfoType {
 		case 0:
-			firstEdbDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, req.StartDate, ``)
+			firstEdbDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.SubSource, baseEdbInfo.EdbInfoId, req.StartDate, ``)
 		case 1:
 			_, firstEdbDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, req.StartDate, ``, false)
 		default:

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

@@ -97,7 +97,7 @@ func (c *ExcelInfoController) CalculateData() {
 	dataList := make([]*data_manage.EdbDataList, 0)
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+		dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
 	case 1:
 		_, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
 	default:

+ 3 - 3
controllers/data_manage/future_good/future_good_chart_info.go

@@ -1818,14 +1818,14 @@ func (this *FutureGoodChartInfoController) ChartInfoEdbInfoDetail() {
 
 	switch edbInfo.EdbInfoType {
 	case 0: //普通源指标
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDateReal, endDate)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDateReal, endDate)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.Msg = "获取失败,Err:" + err.Error()
 			return
 		}
 		//查询区间内最大最小值
-		minData, maxData, err = data_manage.GetEdbDataListMinAndMax(edbInfo.Source, edbInfoId, startDateReal, endDate)
+		minData, maxData, err = data_manage.GetEdbDataListMinAndMax(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDateReal, endDate)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error()
@@ -1842,7 +1842,7 @@ func (this *FutureGoodChartInfoController) ChartInfoEdbInfoDetail() {
 		// 有预测数据,且为普通的预测指标
 		if len(dataList) > 0 && edbInfo.EdbInfoType == 0 {
 			//查询区间内最大最小值
-			minData, maxData, err = data_manage.GetEdbDataListMinAndMax(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, startDateReal, endDate)
+			minData, maxData, err = data_manage.GetEdbDataListMinAndMax(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, startDateReal, endDate)
 			if err != nil {
 				br.Msg = "获取失败"
 				br.Msg = "获取指标最新的最大最小值失败,Err:" + err.Error()

+ 1 - 1
controllers/data_manage/future_good/future_good_edb_info.go

@@ -42,7 +42,7 @@ func (this *FutureGoodEdbInfoController) FutureGoodEdbInfoList() {
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
 		condition += ` AND ( future_good_edb_name like ? or future_good_edb_code like ? ) `
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	// @Param   RegionType   query   string  false       "交易所来源,海外还是国内"

+ 21 - 3
controllers/data_manage/my_chart.go

@@ -1141,6 +1141,7 @@ func (this *MyChartController) MyChartEdit() {
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   MyChartClassifyId   query   int  true       "我的图表分类id"
 // @Param   MyChartId   query   int  true       "我的图表id"
+// @Param   IsShared   query   bool  false       "是否可分享(如从图库框架请求的属于可分享的)"
 // @Success 200 {object} data_manage.MyChartListResp
 // @router /list [get]
 func (this *MyChartController) MyChartList() {
@@ -1164,6 +1165,7 @@ func (this *MyChartController) MyChartList() {
 	currentIndex, _ := this.GetInt("CurrentIndex")
 
 	myChartId, _ := this.GetInt("MyChartId")
+	isShared, _ := this.GetBool("IsShared")
 
 	var total int
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -1180,14 +1182,30 @@ func (this *MyChartController) MyChartList() {
 	var condition string
 	var pars []interface{}
 
-	condition += " AND (a.admin_id=?  or  d.is_public=1)"
-	pars = append(pars, sysUser.AdminId)
-
+	chartAdminId := sysUser.AdminId
 	if myChartClassifyId > 0 {
 		condition += " AND c.my_chart_classify_id=? "
 		pars = append(pars, myChartClassifyId)
+
+		// 可共享
+		if isShared {
+			myClassify, e := data_manage.GetMyChartClassifyByClassifyId(myChartClassifyId)
+			if e != nil {
+				if e.Error() == utils.ErrNoRow() {
+					br.Msg = "分类已被删除, 请刷新页面"
+					return
+				}
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类失败, Err: " + e.Error()
+				return
+			}
+			chartAdminId = myClassify.AdminId
+		}
 	}
 
+	condition += " AND (a.admin_id = ? OR d.is_public = 1)"
+	pars = append(pars, chartAdminId)
+
 	if myChartId > 0 {
 		condition += " AND a.my_chart_id=? "
 		pars = append(pars, myChartId)

+ 5 - 5
controllers/data_manage/mysteel_chemical_data.go

@@ -368,7 +368,7 @@ func (this *EdbInfoController) MysteelChemicalSearch() {
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
 		condition += " AND (index_name like ? OR index_code like ?) "
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	list, err := data_manage.GetMysteelChemicalIndex(condition, pars)
@@ -464,7 +464,7 @@ func (this *EdbInfoController) MysteelChemicalFrequency() {
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
 		condition += " AND (index_name like ? OR index_code like ?) "
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	edbFrequencyList := make([]string, 0)
@@ -565,7 +565,7 @@ func (this *EdbInfoController) MysteelChemicalData() {
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
 		condition += " AND (index_name like ? OR index_code like ?) "
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	//获取指标
@@ -646,7 +646,7 @@ func (this *EdbClassifyController) MysteelChemicalExport() {
 	keyword := this.GetString("Keyword")
 	if keyword != `` {
 		condition += " AND (index_name like ? OR index_code like ?) "
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	var frequencies []string
@@ -687,7 +687,7 @@ func (this *EdbClassifyController) MysteelChemicalExport() {
 		keyword := this.GetString("Keyword")
 		if keyword != `` {
 			tmpCondition += " AND (index_name like ? OR index_code like ?) "
-			tmpPars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 		}
 		//获取指标
 		secNameList, err := data_manage.GetMysteelChemicalIndex(tmpCondition, tmpPars)

+ 8 - 8
controllers/data_manage/predict_edb_info.go

@@ -285,14 +285,14 @@ func (this *PredictEdbInfoController) List() {
 			dataCondition += ` AND edb_info_id=? `
 			dataPars = append(dataPars, sourceEdbInfoItem.EdbInfoId)
 
-			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source)
+			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
 				return
 			}
 			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source, pageSize, startSize)
+			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, pageSize, startSize)
 			if err != nil {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
@@ -303,7 +303,7 @@ func (this *PredictEdbInfoController) List() {
 
 		// 第一页才需要 获取预测指标未来的数据
 		if currentIndex == 1 {
-			allDataList, err := data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, "", "")
+			allDataList, err := data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, "", "")
 			if err != nil {
 				br.Msg = "获取失败"
 				br.Msg = "获取失败,Err:" + err.Error()
@@ -352,14 +352,14 @@ func (this *PredictEdbInfoController) List() {
 			dataCondition += ` AND edb_info_id=? AND data_time <= ? `
 			dataPars = append(dataPars, edbInfoItem.EdbInfoId, edbInfoItem.LatestDate)
 
-			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
+			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
 				return
 			}
 			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource, pageSize, startSize)
 			if err != nil {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
@@ -376,7 +376,7 @@ func (this *PredictEdbInfoController) List() {
 			dataCondition += ` AND edb_info_id=? AND data_time > ? `
 			dataPars = append(dataPars, edbInfoItem.EdbInfoId, edbInfoItem.LatestDate)
 
-			predictDataList, err = data_manage.GetAllEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source)
+			predictDataList, err = data_manage.GetAllEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
 			if err != nil {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
@@ -1551,7 +1551,7 @@ func (this *PredictEdbInfoController) ChartDataList() {
 	maxValue := sourceEdbInfoItem.MaxValue
 	allDataList := make([]*data_manage.EdbDataList, 0)
 	//获取指标数据(实际已生成)
-	dataList, err := data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, startDate, endDate)
+	dataList, err := data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, startDate, endDate)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.Msg = "获取失败,Err:" + err.Error()
@@ -1560,7 +1560,7 @@ func (this *PredictEdbInfoController) ChartDataList() {
 
 	// 如果选择了日期,那么需要筛选所有的数据,用于未来指标的生成
 	if startDate != `` {
-		allDataList, err = data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, "", "")
+		allDataList, err = data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, sourceEdbInfoItem.EdbInfoId, "", "")
 		if err != nil {
 			br.Msg = "获取失败"
 			br.Msg = "获取失败,Err:" + err.Error()

+ 2 - 2
controllers/data_manage/supply_analysis/variety.go

@@ -57,7 +57,7 @@ func (this *VarietyController) List() {
 
 	if keyword != `` {
 		condition += ` AND (a.variety_name like ? OR c.edb_code like ? ) `
-		pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	// 是否超管
@@ -584,7 +584,7 @@ func (this *VarietyController) Analysis() {
 						continue
 					}
 					// 刷新指标数据
-					go data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, edbInfo.StartDate)
+					go data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, edbInfo.StartDate)
 				}
 			}
 		}

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

@@ -232,7 +232,7 @@ func (this *VarietyController) AddToEdb() {
 	prefixCode := "HZ_V"
 	suffixCode := time.Now().Format("060102") + randStr
 	edbCode := fmt.Sprint(prefixCode, varietyEdbInfo.Source, suffixCode)
-	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(utils.DATA_SOURCE_STOCK_PLANT, req.ClassifyId, edbCode, req.EdbName, req.Frequency, req.Unit, varietyEdbInfo.StartDate.Format(utils.FormatDate), varietyEdbInfo.EndDate.Format(utils.FormatDate), sysUser.AdminId, sysUser.RealName)
+	edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(utils.DATA_SOURCE_STOCK_PLANT, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, edbCode, req.EdbName, req.Frequency, req.Unit, varietyEdbInfo.StartDate.Format(utils.FormatDate), varietyEdbInfo.EndDate.Format(utils.FormatDate), sysUser.AdminId, sysUser.RealName)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -259,7 +259,7 @@ func (this *VarietyController) AddToEdb() {
 
 	// 更新ETA指标库信息
 	{
-		data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, edbInfo.StartDate)
+		data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, edbInfo.StartDate)
 	}
 
 	//新增操作日志

+ 842 - 0
controllers/data_stat/edb_source_stat.go

@@ -0,0 +1,842 @@
+package data_stat
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_stat"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// EdbSourceStatController 数据源统计表管理模块
+type EdbSourceStatController struct {
+	controllers.BaseAuthController
+}
+
+// Column
+// @Title 数据源统计表自定义列列表
+// @Description 查询 数据源统计表自定义列列表
+// @Success 200 {object} data_stat.StatColumnList
+// @router /source_column [get]
+func (this *EdbSourceStatController) Column() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	columnType, _ := this.GetInt("ColumnType")
+	if columnType <= 0 {
+		br.Msg = "请选择表类型"
+		return
+	}
+	tmpList, err := data_stat.GetStatColumn(columnType)
+	if err != nil {
+		br.Msg = "获取自定义列失败"
+		br.ErrMsg = "获取自定义列失败,Err:" + err.Error()
+		return
+	}
+	var list []*data_stat.EdbInfoStatColumnListItem
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoStatColumnListItem)
+		tmp.ColumnKey = v.ColumnKey
+		tmp.IsShow = v.IsShow
+		tmp.ColumnName = v.ColumnName
+		tmp.Id = v.Id
+		tmp.IsMust = v.IsMust
+		tmp.IsSort = v.IsSort
+		tmp.Type = v.Type
+		list = append(list, tmp)
+	}
+	var statColumnList data_stat.StatColumnList
+	statColumnList.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = statColumnList
+}
+
+// EditColumn
+// @Title 编辑数据源统计表自定义列
+// @Description 编辑 数据源统计表自定义列列表
+// @Success 200 {object} data_stat.StatColumnList
+// @router /source_column/edit [post]
+func (this *EdbSourceStatController) EditColumn() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_stat.EditStatColumnReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if len(req.List) <= 0 {
+		br.Msg = "请选择要修改的列"
+		br.IsSendEmail = false
+		return
+	}
+
+	tmpList, err := data_stat.GetAllStatColumn()
+	if err != nil {
+		br.Msg = "获取自定义列失败"
+		br.ErrMsg = "获取自定义列失败,Err:" + err.Error()
+		return
+	}
+	isMustMap := make(map[int]data_stat.EdbInfoStatColumn)
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			if v.IsMust == 1 {
+				isMustMap[v.Id] = v
+			}
+		}
+	}
+
+	var list []*data_stat.EdbInfoStatColumn
+	for k, v := range req.List {
+		if v.Id == 0 {
+			br.Msg = "列序号不能为空"
+			return
+		}
+
+		if v.IsShow == 0 {
+			if exist, ok := isMustMap[v.Id]; ok {
+				br.Msg = exist.ColumnName + "为必选列!"
+				return
+			}
+		}
+		tmp := new(data_stat.EdbInfoStatColumn)
+		tmp.Id = v.Id
+		tmp.Sort = k + 1
+		tmp.IsShow = v.IsShow
+		list = append(list, tmp)
+	}
+
+	err = data_stat.UpdateStatColumn(list)
+	if err != nil {
+		br.Msg = "更新自定义列操作失败!"
+		br.ErrMsg = "更新自定义列操作失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	return
+}
+
+// EdbDeleteLog
+// @Title 查询删除指标列表
+// @Description 查询删除指标列表接口
+// @Success 200 {object} data_stat.GetEdbDeleteLogResp
+// @router /edb_delete_log [get]
+func (this *EdbSourceStatController) EdbDeleteLog() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "CreateTime":
+			sortParam = "create_time"
+		case "DataUpdateTime":
+			sortParam = "data_update_time"
+		case "ErDataUpdateDate":
+			sortParam = "er_data_update_date"
+		case "LatestDate":
+			sortParam = "latest_date"
+		case "StartDate":
+			sortParam = "start_date"
+		}
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbDeleteLogCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标删除列表总数失败"
+			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoDeleteLogItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbDeleteLogResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbDeleteLogByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标删除列表失败"
+		br.ErrMsg = "获取指标删除列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoDeleteLogItem)
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.Id = v.Id
+		tmp.StartDate = v.StartDate
+		tmp.EndDate = v.EndDate
+		tmp.Unit = v.Unit
+		tmp.TerminalCode = v.TerminalCode
+		tmp.CreateTime = v.CreateTime
+		tmp.EdbCreateTime = v.EdbCreateTime
+		tmp.Frequency = v.Frequency
+		tmp.Source = v.Source
+		tmp.SourceName = v.SourceName
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameEn = v.EdbNameEn
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.LatestDate = v.LatestDate
+
+		tmp.DelSysUserId = v.DelSysUserId
+		tmp.DelSysUserRealName = v.DelSysUserRealName
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.LatestValue = v.LatestValue
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbDeleteLogResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbUpdateLog
+// @Title 查询指标信息变更列表
+// @Description 查询指标信息变更列表接口
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /edb_update_log [get]
+func (this *EdbSourceStatController) EdbUpdateLog() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ? and (data_update_result=1 or data_update_result=0)"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "CreateTime":
+			sortParam = "create_time"
+		case "DataUpdateTime":
+			sortParam = "data_update_time"
+		case "ErDataUpdateDate":
+			sortParam = "er_data_update_date"
+		case "LatestDate":
+			sortParam = "latest_date"
+		case "StartDate":
+			sortParam = "start_date"
+		}
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbUpdateLogCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标删除列表总数失败"
+			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoUpdateLogItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbUpdateLogResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbUpdateLogByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标更新列表失败"
+		br.ErrMsg = "获取指标更新列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoUpdateLogItem)
+		tmp.Id = v.Id
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.Frequency = v.Frequency
+		tmp.Unit = v.Unit
+		tmp.StartDate = v.StartDate
+		tmp.EndDate = v.EndDate
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.UpdateSysUserRealName = v.UpdateSysUserRealName
+		tmp.UpdateSysUserId = v.UpdateSysUserId
+		tmp.UniqueCode = v.UniqueCode
+		tmp.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		tmp.LatestDate = v.LatestDate
+		tmp.LatestValue = v.LatestValue
+		tmp.TerminalCode = v.TerminalCode
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbUpdateLogResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbUpdateStat
+// @Title 查询数据源明细列表
+// @Description 查询数据源明细列表接口
+// @Success 200 {object} data_stat.GetEdbUpdateStatResp
+// @router /edb_update_stat [get]
+func (this *EdbSourceStatController) EdbUpdateStat() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	terminalCode := this.GetString("TerminalCode", "")
+	sysUserId := this.GetString("SysUserId", "")
+	frequency := this.GetString("Frequency", "")
+	keyWord := this.GetString("KeyWord", "") //指标编码/指标名称
+
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	if terminalCode != "" {
+		codeSlice := strings.Split(terminalCode, ",")
+		condition += ` AND terminal_code IN (` + utils.GetOrmInReplace(len(codeSlice)) + `)`
+		pars = append(pars, codeSlice)
+	}
+
+	if sysUserId != "" {
+		sysUserIdSlice := strings.Split(sysUserId, ",")
+		condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
+		pars = append(pars, sysUserIdSlice)
+	}
+
+	if frequency != "" {
+		frequencySlice := strings.Split(frequency, ",")
+		condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencySlice)) + `)`
+		pars = append(pars, frequencySlice)
+	}
+
+	if keyWord != "" {
+		condition += ` AND (edb_name LIKE ? OR edb_code LIKE ? ) `
+		pars = append(pars, "%"+keyWord+"%", "%"+keyWord+"%")
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "CreateTime":
+			sortParam = "create_time"
+		case "UpdateTime":
+			sortParam = "update_time"
+		case "DataUpdateTime":
+			sortParam = "data_update_time"
+		case "ErDataUpdateDate":
+			sortParam = "er_data_update_date"
+		case "LatestDate":
+			sortParam = "latest_date"
+		case "StartDate":
+			sortParam = "start_date"
+		}
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbUpdateStatCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标删除列表总数失败"
+			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoUpdateStatItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbUpdateStatResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbUpdateStatByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标更新列表失败"
+		br.ErrMsg = "获取指标更新列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoUpdateStatItem)
+		tmp.Id = v.Id
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.Frequency = v.Frequency
+		tmp.Unit = v.Unit
+		tmp.StartDate = v.StartDate
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.LatestDate = v.LatestDate
+		tmp.LatestValue = v.LatestValue
+		tmp.TerminalCode = v.TerminalCode
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		tmp.DataUpdateResult = v.DataUpdateResult
+		tmp.DataUpdateFailedReason = v.DataUpdateFailedReason
+		if v.UpdateTime != utils.EmptyDateTimeStr {
+			tmp.UpdateTime = v.UpdateTime
+		}
+		tmp.IsAdd = v.IsAdd
+		tmp.NeedRefresh = v.NeedRefresh
+		tmp.HasRefresh = v.HasRefresh
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbUpdateStatResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbSourceStat
+// @Title 查询数据源统计列表
+// @Description 查询数据源统计列表接口
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /source_stat [get]
+func (this *EdbSourceStatController) EdbSourceStat() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "EdbNum":
+			sortParam = "edb_num"
+		case "NeedRefreshNum":
+			sortParam = "need_refresh_num"
+		case "hasRefreshNum":
+			sortParam = "has_refresh_num"
+		case "UpdateSuccessNum":
+			sortParam = "update_success_num"
+		case "UpdateFailedNum":
+			sortParam = "update_failed_num"
+		}
+
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbSourceStatCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取数据源统计列表总数失败"
+			br.ErrMsg = "获取数据源统计列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoSourceStatItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbSourceStatResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbSourceStatByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标删除列表失败"
+		br.ErrMsg = "获取指标删除列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoSourceStatItem)
+		tmp.Id = v.Id
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.TerminalCode = v.TerminalCode
+		tmp.EdbNum = v.EdbNum
+		tmp.EdbNewNum = v.EdbNewNum
+		tmp.EdbDelNum = v.EdbDelNum
+		tmp.NeedRefreshNum = v.NeedRefreshNum
+		tmp.HasRefreshNum = v.HasRefreshNum
+		tmp.UpdateSuccessNum = v.UpdateSuccessNum
+		tmp.UpdateFailedNum = v.UpdateFailedNum
+		tmp.RefreshSuccessNum = v.RefreshSuccessNum
+		tmp.RefreshFailedNum = v.RefreshFailedNum
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbSourceStatResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbUpdateFailedList
+// @Title 查询指标更新失败详情列表
+// @Description 查询指标更新失败详情列表
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /edb_update_stat/failed [get]
+func (this *EdbSourceStatController) EdbUpdateFailedList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	terminalCode := this.GetString("TerminalCode", "")
+	createTime := this.GetString("CreateTime", "")
+
+	if terminalCode == "" {
+		br.Msg = "请选择对应的终端信息"
+		return
+	}
+	terminalInfo, err := data_manage.GetEdbTerminalByTerminalCode(terminalCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "终端不存在"
+			return
+		}
+		br.Msg = "查询终端信息出错"
+		br.ErrMsg = "查询终端信息出错 Err:" + err.Error()
+		return
+	}
+	condition := " and source = ? and terminal_code = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, terminalCode)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	tmpList, err := data_stat.GetEdbUpdateStatFailedGroupByCondition(condition, pars)
+	if err != nil {
+		br.Msg = "获取指标更新失败详情列表 失败"
+		br.ErrMsg = "获取指标更新失败详情列表 失败,Err:" + err.Error()
+		return
+	}
+
+	list := make([]*data_stat.EdbUpdateFailedList, 0)
+	successNum := 0
+	failedNum := 0
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			if v.SourceUpdateResult == 1 {
+				successNum += v.Num
+			} else {
+				failedNum += v.Num
+				list = append(list, v)
+			}
+		}
+	}
+	resp := data_stat.GetEdbUpdateFailedResp{
+		List:             list,
+		Name:             terminalInfo.Name,
+		TerminalCode:     terminalCode,
+		DirPath:          terminalInfo.DirPath,
+		UpdateSuccessNum: successNum,
+		UpdateFailedNum:  failedNum,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 200 - 0
controllers/data_stat/edb_terminal.go

@@ -0,0 +1,200 @@
+package data_stat
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/services/data_stat"
+	"eta/eta_api/utils"
+)
+
+// EdbTerminalController 数据源终端管理
+type EdbTerminalController struct {
+	controllers.BaseAuthController
+}
+
+// Save
+// @Title 保存数据源终端
+// @Description 保存数据源终端接口
+// @Param	request  body  true data_manage.AddEdbTerminalListReq  "type json string"
+// @Success 200 string "操作成功"
+// @router /terminal/save [post]
+func (this *EdbTerminalController) Save() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req *data_manage.AddEdbTerminalListReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Name == "" {
+		br.Msg = "请输入终端名称"
+		return
+	}
+	/*if req.ServerUrl == "" && req.Value == "" {
+		br.Msg = "请输入终端地址或者token"
+		return
+	}*/
+	if req.Num <= 0 {
+		br.Msg = "请输入指标数据量"
+		return
+	}
+	if req.Source == 0 {
+		br.Msg = "请输入终端类型"
+		return
+	}
+
+	// todo 校验终端数据
+
+	errMsg, err := data_stat.SaveEdbTerminal(req)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "SaveEnglishVideoCover ErrMsg:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	return
+}
+
+// SetStatus
+// @Title 启用/禁用数据源终端
+// @Description 启用/禁用数据源终端
+// @Param	request  body  true data_manage.SetEdbTerminalStatusReq  "type json string"
+// @Success 200 string "操作成功"
+// @router /terminal/status/set [post]
+func (this *EdbTerminalController) SetStatus() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req *data_manage.SetEdbTerminalStatusReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.TerminalId <= 0 {
+		br.Msg = "请选择要操作的终端"
+		return
+	}
+
+	if req.Status != 1 && req.Status != 2 {
+		br.Msg = "请选择正确的终端状态"
+		return
+	}
+
+	errMsg, err := data_stat.SetEdbTerminalStatus(req.TerminalId, req.Status)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "SetEdbTerminalStatus ErrMsg:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	return
+}
+
+// List
+// @Title 数据源终端列表
+// @Description 数据源终端列表接口
+// @Success 200 {object} data_manage.EdbTerminalLisResp
+// @router /terminal/list [get]
+func (this *EdbTerminalController) List() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	list, err := data_manage.GetEdbTerminalList()
+	if err != nil {
+		br.Msg = "获取终端列表失败"
+		br.ErrMsg = "获取终端列表失败 ErrMsg:" + err.Error()
+		return
+	}
+	resp := &data_manage.EdbTerminalListResp{
+		List: list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// TerminalCodeList
+// @Title 数据源终端列表
+// @Description 数据源终端列表接口
+// @Success 200 {object} data_manage.EdbTerminalCodeResp
+// @router /terminal/code [get]
+func (this *EdbTerminalController) TerminalCodeList() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	source, _ := this.GetInt("Source", utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+	list, err := data_manage.GetEdbTerminalBySource(source)
+	if err != nil {
+		br.Msg = "获取终端列表失败"
+		br.ErrMsg = "获取终端列表失败 ErrMsg:" + err.Error()
+		return
+	}
+	codeList := make([]*data_manage.EdbTerminalCode, 0)
+	if len(list) > 0 {
+		for _, v := range list {
+			tmp := new(data_manage.EdbTerminalCode)
+			tmp.TerminalCode = v.TerminalCode
+			tmp.Source = v.Source
+			tmp.Name = v.Name
+			codeList = append(codeList, tmp)
+		}
+	}
+	resp := &data_manage.EdbTerminalCodeResp{
+		List: codeList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 3 - 4
controllers/english_report/english_company.go

@@ -2,14 +2,14 @@ package english_report
 
 import (
 	"encoding/json"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
 	"strings"
 	"time"
@@ -62,8 +62,7 @@ func (this *EnglishCompanyController) List() {
 	var cond, order string
 	var pars []interface{}
 	if keywords != "" {
-		k := "%" + keywords + "%"
-		companyIds, e := models.GetEnCompanyIdsByKeyword(k)
+		companyIds, e := models.GetEnCompanyIdsByKeyword(keywords)
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "关键词获取英文客户IDs失败, Err: " + e.Error()

+ 14 - 2
controllers/english_report/report.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -361,7 +362,8 @@ func (this *EnglishReportController) ListReport() {
 	var pars []interface{}
 
 	if keyWord != "" {
-		condition += ` AND (title LIKE '%` + keyWord + `%' OR admin_real_name LIKE '%` + keyWord + `%' ) `
+		condition += ` AND (title LIKE ? OR admin_real_name LIKE ? ) `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	}
 
 	if timeType == "" {
@@ -643,6 +645,7 @@ func (this *EnglishReportController) ListReport() {
 	br.Data = resp
 }
 
+// PublishReport
 // @Title 发布报告接口
 // @Description 发布报告
 // @Param	request	body models.PublishReq true "type json string"
@@ -687,6 +690,15 @@ func (this *EnglishReportController) PublishReport() {
 			return
 		}
 
+		// 图表刷新状态
+		refreshResult := data.CheckBatchChartRefreshResult("report", vint, 0)
+		if !refreshResult {
+			br.Msg = "图表刷新未完成,请稍后操作"
+			br.ErrMsg = "图表刷新未完成,请稍后操作"
+			br.IsSendEmail = false
+			return
+		}
+
 		var tmpErr error
 
 		if report.Content == "" {
@@ -1056,7 +1068,7 @@ func (this *EnglishReportController) Author() {
 
 	if keyword != `` {
 		condition += ` AND report_author like ? `
-		pars = append(pars, "%"+keyword+"%")
+		pars = append(pars, utils.GetLikeKeyword(keyword))
 	}
 
 	_, items, err := models.GetReportAuthorList(condition, pars, 0, 10000)

+ 21 - 0
controllers/error.go

@@ -0,0 +1,21 @@
+package controllers
+
+import "eta/eta_api/models"
+
+// ErrorController
+// @Description: 该控制器处理页面错误请求
+type ErrorController struct {
+	BaseCommonController
+}
+
+func (c *ErrorController) Error404() {
+	c.Data["content"] = "很抱歉您访问的地址或者方法不存在"
+	//c.TplName = "error/404.html"
+
+	br := new(models.BaseResponse).Init()
+
+	br.Msg = "您访问的资源不存在"
+	br.Ret = 404
+	c.Data["json"] = br
+	c.ServeJSON()
+}

+ 1 - 1
controllers/ppt_english.go

@@ -68,7 +68,7 @@ func (this *PptEnglishController) ListPpt() {
 
 	if keyWord != "" {
 		condition += ` AND (title LIKE ? OR admin_real_name LIKE ? ) `
-		pars = append(pars, "%"+keyWord+"%", "%"+keyWord+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	}
 	total, err := ppt_english.GetPptEnglishListCount(condition, pars)
 

+ 1 - 1
controllers/ppt_v2.go

@@ -69,7 +69,7 @@ func (this *PptV2Controller) ListPpt() {
 
 	if keyWord != "" {
 		condition += ` AND (title LIKE ? OR admin_real_name LIKE ? ) `
-		pars = append(pars, "%"+keyWord+"%", "%"+keyWord+"%")
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	}
 	total, err := models.GetPptV2ListCount(condition, pars)
 	if err != nil {

+ 32 - 2
controllers/report.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/company"
 	"eta/eta_api/services"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/server/web"
@@ -94,7 +95,8 @@ func (this *ReportController) ListReport() {
 	var pars []interface{}
 
 	if keyWord != "" {
-		condition += ` AND (title LIKE '%` + keyWord + `%' OR admin_real_name LIKE '%` + keyWord + `%' ) `
+		condition += ` AND (title LIKE ? OR admin_real_name LIKE ? ) `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	}
 	if startDate != "" {
 		condition += ` AND ` + timeType + ` >= ? `
@@ -283,6 +285,15 @@ func (this *ReportController) PublishReport() {
 			br.Msg = "报告不存在"
 			return
 		}
+
+		refreshResult := data.CheckBatchChartRefreshResult("report", vint, 0)
+		if !refreshResult {
+			br.Msg = "图表刷新未完成,请稍后操作"
+			br.ErrMsg = "图表刷新未完成,请稍后操作"
+			br.IsSendEmail = false
+			return
+		}
+
 		var publishTime time.Time
 		if report.MsgIsSend == 1 && report.PublishTime != "" { //如果报告曾经发布过,并且已经发送过模版消息,则章节的发布时间为报告的发布时间
 			publishTime, _ = time.ParseInLocation(utils.FormatDateTime, report.PublishTime, time.Local)
@@ -1046,7 +1057,7 @@ func (this *ReportController) Author() {
 
 	if keyword != `` {
 		condition += ` AND report_author like ? `
-		pars = append(pars, "%"+keyword+"%")
+		pars = append(pars, utils.GetLikeKeyword(keyword))
 	}
 
 	_, items, err := models.GetReportAuthorList(condition, pars, 0, 10000)
@@ -2738,6 +2749,15 @@ func (this *ReportController) PublishDayWeekReportChapter() {
 		return
 	}
 
+	// 图表刷新状态
+	refreshResult := data.CheckBatchChartRefreshResult("report", chapterInfo.ReportId, chapterInfo.ReportChapterId)
+	if !refreshResult {
+		br.Msg = "图表刷新未完成,请稍后操作"
+		br.ErrMsg = "图表刷新未完成,请稍后操作"
+		br.IsSendEmail = false
+		return
+	}
+
 	// 获取规则配置
 	reportChapterTypeRule, err := models.GetReportChapterTypeById(chapterInfo.TypeId)
 	if err != nil {
@@ -2910,6 +2930,16 @@ func (this *ReportController) PublishDayWeekReport() {
 		br.Msg = "该报告已发布"
 		return
 	}
+
+	// 图表刷新状态
+	refreshResult := data.CheckBatchChartRefreshResult("report", reportId, 0)
+	if !refreshResult {
+		br.Msg = "图表刷新未完成,请稍后操作"
+		br.ErrMsg = "图表刷新未完成,请稍后操作"
+		br.IsSendEmail = false
+		return
+	}
+
 	tips, err := services.PublishDayWeekReport(reportId)
 	if err != nil {
 		br.Msg = "发布失败"

+ 2 - 2
controllers/report_author.go

@@ -2,9 +2,9 @@ package controllers
 
 import (
 	"encoding/json"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/models"
 	"eta/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
 )
@@ -57,7 +57,7 @@ func (this *ReportAuthorController) Author() {
 
 	if keyword != `` {
 		condition += ` AND report_author like ? `
-		pars = append(pars, "%"+keyword+"%")
+		pars = append(pars, utils.GetLikeKeyword(keyword))
 	}
 
 	total, items, err := models.GetReportAuthorList(condition, pars, startSize, pageSize)

+ 6 - 3
controllers/sandbox/sandbox.go

@@ -177,7 +177,8 @@ func (this *SandboxController) FirstVersionList() {
 	condition += " AND b.curr_version < a.curr_version "
 
 	if keyword != "" {
-		condition += ` AND  ( a.name LIKE '%` + keyword + `%'  OR  b.name LIKE '%` + keyword + `%' )`
+		condition += ` AND  ( a.name LIKE ?  OR  b.name LIKE ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	//获取指标信息
@@ -250,7 +251,8 @@ func (this *SandboxController) VersionList() {
 	condition += " AND b.curr_version < a.curr_version "
 
 	if keyWord != "" {
-		condition += ` AND  ( a.op_user_name LIKE '%` + keyWord + `%'  OR  a.name LIKE '%` + keyWord + `%' or a.op_user_name LIKE '%` + keyWord + `%'  OR  a.name LIKE '%` + keyWord + `%' )`
+		condition += ` AND  ( a.op_user_name LIKE ? OR  a.name LIKE ? or a.op_user_name LIKE ? OR  a.name LIKE ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 4)
 	}
 
 	//获取指标信息
@@ -787,7 +789,8 @@ func (this *SandboxController) ListByQuote() {
 	}
 
 	if keyword != "" {
-		condition += ` AND  ( a.name LIKE '%` + keyword + `%' OR  a.chart_permission_name LIKE '%` + keyword + `%' )`
+		condition += ` AND  ( a.name LIKE ? OR  a.chart_permission_name LIKE ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 
 	//获取指标信息

+ 1 - 1
controllers/semantic_analysis/sa_compare.go

@@ -698,7 +698,7 @@ func (this *SaCompareController) Search() {
 	existPars := make([]interface{}, 0)
 	if keyword != "" {
 		existCond += ` AND  ( title LIKE ? )`
-		existPars = append(existPars, `%`+keyword+`%`)
+		existPars = append(existPars, utils.GetLikeKeyword(keyword))
 	}
 	total, list, err = saCompare.GetPageItemsByCondition(startSize, pageSize, existCond, existPars, []string{}, "")
 	if err != nil && err.Error() != utils.ErrNoRow() {

+ 11 - 1
controllers/smart_report/smart_report.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/smart_report"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
+	"eta/eta_api/services/data"
 	smartReportService "eta/eta_api/services/smart_report"
 	"eta/eta_api/utils"
 	"fmt"
@@ -426,6 +427,15 @@ func (this *SmartReportController) Publish() {
 		return
 	}
 
+	// 图表刷新状态
+	refreshResult := data.CheckBatchChartRefreshResult("report", item.SmartReportId, 0)
+	if !refreshResult {
+		br.Msg = "图表刷新未完成,请稍后操作"
+		br.ErrMsg = "图表刷新未完成,请稍后操作"
+		br.IsSendEmail = false
+		return
+	}
+
 	cols := []string{"State", "ModifyTime"}
 	item.State = req.PublishState
 	item.ModifyTime = time.Now().Local()
@@ -453,7 +463,7 @@ func (this *SmartReportController) Publish() {
 	recordItem := &models.ReportStateRecord{
 		ReportId:   req.SmartReportId,
 		ReportType: 2,
-		State:     req.PublishState,
+		State:      req.PublishState,
 		AdminId:    this.SysUser.AdminId,
 		AdminName:  this.SysUser.AdminName,
 		CreateTime: time.Now(),

+ 2 - 1
controllers/sys_admin.go

@@ -76,7 +76,8 @@ func (this *SysAdminController) ListSysuser() {
 	}
 
 	if keyWord != "" {
-		condition += ` AND (real_name LIKE '%` + keyWord + `%' OR admin_name LIKE '%` + keyWord + `%' OR mobile LIKE '%` + keyWord + `%' )  `
+		condition += ` AND (real_name LIKE ? OR admin_name LIKE ? OR mobile LIKE ? ) `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 3)
 	}
 
 	var total int

+ 2 - 3
controllers/sys_role_admin.go

@@ -2,12 +2,12 @@ package controllers
 
 import (
 	"encoding/json"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/models"
 	"eta/eta_api/models/system"
 	"eta/eta_api/models/system/request"
 	"eta/eta_api/models/system/response"
 	"eta/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
 	"strings"
 	"time"
@@ -75,9 +75,8 @@ func (this *SysRoleAdminController) List() {
 
 	reqKeyword := this.GetString("Keyword")
 	if reqKeyword != "" {
-		reqKeyword = "%" + reqKeyword + "%"
 		condition += " AND (a.real_name LIKE ? OR a.mobile LIKE ?)"
-		pars = append(pars, reqKeyword, reqKeyword)
+		pars = utils.GetLikeKeywordPars(pars, reqKeyword, 2)
 	}
 	adminList, err := system.GetRoleAdminList(condition, pars, startSize, pageSize)
 	if err != nil {

+ 4 - 3
controllers/target.go

@@ -81,7 +81,8 @@ func (this *TargetController) DataList() {
 	var pars []interface{}
 
 	if keyWord != "" {
-		condition += ` AND a.SEC_NAME LIKE '%` + keyWord + `%' `
+		condition += ` AND a.SEC_NAME LIKE ? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
 	}
 	if startDate != "" {
 		condition += ` AND c.DT >= ? `
@@ -3475,7 +3476,7 @@ func (this *TargetController) ExcelDataAdd() {
 			if i > 4 {
 				for index := 1; index < len(req.Data[i]); index++ {
 					if req.Data[i][index] == nil {
-						break
+						continue
 					}
 					valueMap := req.Data[i][index].(map[string]interface{})
 					value, _ := valueMap["m"]
@@ -3485,7 +3486,7 @@ func (this *TargetController) ExcelDataAdd() {
 					valueListMap[index] = valueMap["m"].(string)
 
 					// 09-27 千位分隔符时用 "m" 取字符串存数据库会把逗号当小数点,现在换用 "v" 直接取数字再转为字符串,看看会不会有问题
-					if ct, ok := valueMap["ct"].(map[string]interface{}); ok{
+					if ct, ok := valueMap["ct"].(map[string]interface{}); ok {
 						fa, _ := ct["fa"]
 						if fa == "#,##0.000" {
 							value = valueMap["v"]

+ 42 - 24
controllers/user_login.go

@@ -242,7 +242,7 @@ func (this *UserLoginController) GetVerifyCode() {
 func (this *UserLoginController) Login() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
-		if br.ErrMsg != "" {
+		if br.ErrMsg == "" {
 			br.IsSendEmail = false
 		}
 		this.Data["json"] = br
@@ -257,6 +257,7 @@ func (this *UserLoginController) Login() {
 		Mobile     string `description:"手机号"`
 		Email      string `description:"邮箱"`
 		VerifyCode string `description:"验证码"`
+		ReqTime    string `description:"登录时间戳"`
 	}
 	var req UserLoginReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
@@ -308,38 +309,55 @@ func (this *UserLoginController) Login() {
 			return
 		}
 
-		// 账号密码校验
+		// 查询账号信息
 		errPassKey := fmt.Sprint(utils.CACHE_LOGIN_ERR_PASS, req.Username)
-		accountUser, e := system.CheckSysUser(req.Username, req.Password)
+		accountUser, e := system.GetSysUserByAdminName(req.Username)
 		if e != nil {
 			br.Ret = models.BaseRespCodeLoginErr
-			if e.Error() == utils.ErrNoRow() {
-				br.Msg = "登录失败, 账号或密码错误"
-				if isAbnormal != "" {
-					return
-				}
-				// 错误密码计数, 超过6次标记异常
-				if !utils.Rc.IsExist(errPassKey) {
-					_ = utils.Rc.Put(errPassKey, 1, utils.GetTodayLastSecond())
-					return
-				}
-				errNum, _ := utils.Rc.RedisInt(errPassKey)
-				errNum += 1
-				if errNum >= 6 {
-					br.Ret = models.BaseRespCodeAbnormalLogin
-					br.Msg = "账号异常, 请进行手机号/邮箱校验"
-					// 标记异常登录, 重置计数
-					_ = utils.Rc.Put(abnormalKey, "true", utils.GetTodayLastSecond())
-					_ = utils.Rc.Delete(errPassKey)
-					return
-				}
+			br.Msg = "登录失败, 账号或密码错误"
+			// 账号查询异常均进行标记, 避免一直尝试进行登录
+			if !utils.Rc.IsExist(errPassKey) {
+				_ = utils.Rc.Put(errPassKey, 1, utils.GetTodayLastSecond())
+				return
+			}
+			errNum, _ := utils.Rc.RedisInt(errPassKey)
+			errNum += 1
+			if errNum < 6 {
 				_ = utils.Rc.Put(errPassKey, errNum, utils.GetTodayLastSecond())
 				return
 			}
+			// 标记异常登录, 重置计数
+			br.Ret = models.BaseRespCodeAbnormalLogin
+			br.Msg = "账号异常, 请进行手机号/邮箱校验"
+			_ = utils.Rc.Put(abnormalKey, "true", utils.GetTodayLastSecond())
+			_ = utils.Rc.Delete(errPassKey)
+			return
+		}
+
+		// 账号密码校验
+		dbPass := utils.MD5(fmt.Sprintf("%s%s%s", accountUser.Password, utils.UserLoginSalt, req.ReqTime))
+		if req.Password != dbPass {
+			br.Ret = models.BaseRespCodeLoginErr
 			br.Msg = "登录失败, 账号或密码错误"
-			br.ErrMsg = "登录失败, Err:" + e.Error()
+			// 错误密码计数, 超过6次标记异常
+			if !utils.Rc.IsExist(errPassKey) {
+				_ = utils.Rc.Put(errPassKey, 1, utils.GetTodayLastSecond())
+				return
+			}
+			errNum, _ := utils.Rc.RedisInt(errPassKey)
+			errNum += 1
+			if errNum < 6 {
+				_ = utils.Rc.Put(errPassKey, errNum, utils.GetTodayLastSecond())
+				return
+			}
+			// 标记异常登录, 重置计数
+			br.Ret = models.BaseRespCodeAbnormalLogin
+			br.Msg = "账号异常, 请进行手机号/邮箱校验"
+			_ = utils.Rc.Put(abnormalKey, "true", utils.GetTodayLastSecond())
+			_ = utils.Rc.Delete(errPassKey)
 			return
 		}
+
 		if accountUser.Enabled == 0 {
 			br.Msg = "您的账号已被禁用, 如需登录, 请联系管理员"
 			br.ErrMsg = fmt.Sprintf("账号已被禁用, 登录账号: %s, 账户名称: %s", accountUser.AdminName, accountUser.RealName)

+ 6 - 1
main.go

@@ -1,8 +1,9 @@
 package main
 
 import (
-	"fmt"
+	"eta/eta_api/controllers"
 	"eta/eta_api/services/alarm_msg"
+	"fmt"
 	"runtime"
 	"time"
 
@@ -21,6 +22,10 @@ func main() {
 		web.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
 	}
 	go services.Task()
+
+	// 异常处理
+	web.ErrorController(&controllers.ErrorController{})
+
 	web.BConfig.RecoverFunc = Recover
 	web.Run()
 }

+ 27 - 12
models/classify.go

@@ -214,17 +214,19 @@ func GetClassifyList(startSize, pageSize int, keyWord, companyType string, hideD
 	} else if companyType == "权益" {
 		companyTypeSqlStr = " AND (id = 40 or parent_id = 40)  "
 	}
+	pars := make([]interface{}, 0)
 	if keyWord != "" {
 		sql = `SELECT * FROM (
                    SELECT * FROM classify
-                   WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE '%` + keyWord + `%'
+                   WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE ?
                    UNION
                    SELECT * FROM classify
-                   WHERE id IN(SELECT parent_id FROM classify
-                   WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE '%` + keyWord + `%')
+                   WHERE id IN( SELECT parent_id FROM classify
+                   WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE ? )
                    )AS t
                    ORDER BY sort ASC,create_time ASC
                    LIMIT ?,? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	} else {
 		sql = `SELECT * FROM classify WHERE parent_id=0 ` + companyTypeSqlStr
 		if hideDayWeek == 1 {
@@ -232,8 +234,10 @@ func GetClassifyList(startSize, pageSize int, keyWord, companyType string, hideD
 		}
 		sql += ` ORDER BY sort ASC, create_time ASC LIMIT ?,? `
 	}
+	pars = append(pars, startSize, pageSize)
+
 	o := orm.NewOrmUsingDB("rddp")
-	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
 	return
 }
 
@@ -246,16 +250,19 @@ func GetClassifyListCount(keyWord, companyType string, hideDayWeek int) (count i
 	} else if companyType == "权益" {
 		companyTypeSqlStr = " AND (id = 40 or parent_id = 40)  "
 	}
+
+	pars := make([]interface{}, 0)
+
 	if keyWord != "" {
 		sqlCount = `SELECT  COUNT(1) AS count FROM (
                SELECT * FROM classify
-               WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE '%` + keyWord + `%'
+               WHERE parent_id=0 ` + companyTypeSqlStr + `  AND classify_name LIKE ?
                UNION
                SELECT * FROM classify
                WHERE id IN(SELECT parent_id FROM classify
-               WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE '%` + keyWord + `%')
+               WHERE parent_id>0 ` + companyTypeSqlStr + `  AND classify_name LIKE ? )
                )AS t `
-
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 2)
 	} else {
 		sqlCount = `SELECT COUNT(1) AS count FROM classify WHERE parent_id=0 ` + companyTypeSqlStr
 		if hideDayWeek == 1 {
@@ -263,7 +270,7 @@ func GetClassifyListCount(keyWord, companyType string, hideDayWeek int) (count i
 		}
 	}
 	o := orm.NewOrmUsingDB("rddp")
-	err = o.Raw(sqlCount).QueryRow(&count)
+	err = o.Raw(sqlCount, pars...).QueryRow(&count)
 	return
 }
 
@@ -292,12 +299,16 @@ type FindByIdClassifyReq struct {
 func GetClassifyChild(parentId int, keyWord string) (items []*Classify, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ``
+	pars := make([]interface{}, 0)
 	if keyWord != "" {
-		sql = `SELECT * FROM classify WHERE parent_id=? AND classify_name LIKE '%` + keyWord + `%' ORDER BY create_time ASC `
+		sql = `SELECT * FROM classify WHERE classify_name LIKE ? AND parent_id=? ORDER BY create_time ASC `
+		pars = append(pars, utils.GetLikeKeyword(keyWord))
 	} else {
 		sql = `SELECT * FROM classify WHERE parent_id=? ORDER BY create_time ASC `
 	}
-	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	pars = append(pars, parentId)
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+
 	return
 }
 
@@ -308,12 +319,16 @@ func GetClassifyChildByParentIds(parentId []int, keyWord string) (items []*Class
 	}
 	o := orm.NewOrmUsingDB("rddp")
 	sql := ``
+	pars := make([]interface{}, 0)
+	pars = append(pars, parentId)
 	if keyWord != "" {
-		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) AND classify_name LIKE '%` + keyWord + `%' ORDER BY create_time ASC `
+		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) AND classify_name LIKE ? ORDER BY create_time ASC `
+		pars = append(pars, utils.GetLikeKeyword(keyWord))
 	} else {
 		sql = `SELECT * FROM classify WHERE parent_id IN (` + utils.GetOrmInReplace(parentIdLen) + `) ORDER BY create_time ASC `
 	}
-	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+
 	return
 }
 

+ 2 - 2
models/data_manage/baiinfo_data.go

@@ -138,8 +138,8 @@ func GetBaiinfoIndexDataCount(indexCode string) (count int, err error) {
 // GetBaiinfoItemList 模糊查询Baiinfo数据库指标列表
 func GetBaiinfoItemList(keyword string) (items []*BaiinfoIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := "SELECT * FROM base_from_baiinfo_index WHERE CONCAT(index_name,index_code) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM base_from_baiinfo_index WHERE CONCAT(index_name,index_code) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 }
 

+ 1 - 1
models/data_manage/base_from_eia_stero.go

@@ -134,7 +134,7 @@ func GetEiaSteoIndexDataList(indexCode string, startSize, pageSize int) (items [
 func GetEiaSteoItemList(keyword string) (items []*BaseFromEiaSteoIndexItem, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := "SELECT * FROM base_from_eia_steo_index WHERE index_name LIKE ?  OR index_code like ?"
-	_, err = o.Raw(sql, `%`+keyword+`%`, `%`+keyword+`%`).QueryRows(&items)
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 }
 

+ 7 - 7
models/data_manage/chart_edb_mapping.go

@@ -36,7 +36,7 @@ func AddChartEdbMapping(items []*ChartEdbMapping) (err error) {
 
 func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.source_name,b.source,b.classify_id,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.edb_type
+	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.classify_id,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.edb_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=? 
@@ -47,7 +47,7 @@ func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err e
 
 func GetChartEdbMappingListByChartInfoIds(chartInfoIds string) (list []*ChartEdbInfoMapping, err error) {
 	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,b.edb_type
+	sql := ` SELECT a.*,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.edb_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 in (` + chartInfoIds + `) 
@@ -58,7 +58,7 @@ func GetChartEdbMappingListByChartInfoIds(chartInfoIds string) (list []*ChartEdb
 
 func GetChartEdbMappingListByEdbInfoId(edbInfoStr string) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,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
+	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(` + edbInfoStr + `)
 			ORDER BY FIELD(edb_info_id,` + edbInfoStr + `)
@@ -74,7 +74,7 @@ func GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (list []*ChartEdbInf
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,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
+	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) + `)
@@ -90,7 +90,7 @@ func GetChartEdbMappingListByIdList(chartInfoIdList []int) (list []*ChartEdbInfo
 		return
 	}
 	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,b.edb_type AS edb_info_category_type
+	sql := ` SELECT a.*,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,b.edb_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 in (` + utils.GetOrmInReplace(num) + `) 
@@ -134,7 +134,7 @@ func GetEtaEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err e
 	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.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
+	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
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE a.chart_info_id=? AND a.source = ?
@@ -182,7 +182,7 @@ func GetChartEdbMappingListV2(chartInfoId int) (list []*ChartEdbInfoMapping, err
 // GetChartEdbMappingByEdbInfoId 根据指标id获取edb_mapping
 func GetChartEdbMappingByEdbInfoId(edbInfoId int) (item *ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,classify_id,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
+	sql := ` SELECT edb_info_id,source_name,classify_id,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)

+ 17 - 13
models/data_manage/chart_info.go

@@ -322,8 +322,8 @@ type EdbDataList struct {
 }
 
 // GetEdbDataList 获取指标的数据(日期正序返回)
-func GetEdbDataList(source, endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
-	tableName := GetEdbDataTableName(source)
+func GetEdbDataList(source, subSource, endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+	tableName := GetEdbDataTableName(source, subSource)
 	if tableName == "" {
 		err = errors.New("无效的渠道:" + strconv.Itoa(source))
 		list = make([]*EdbDataList, 0)
@@ -355,8 +355,8 @@ type EdbDataListByUniqueCode struct {
 	Value         float64 `description:"数据值"`
 }
 
-func GetEdbDataListByByUniqueCode(source, endInfoId int, startDate, endDate string) (list []*EdbDataListByUniqueCode, err error) {
-	tableName := GetEdbDataTableName(source)
+func GetEdbDataListByByUniqueCode(source, subSource, endInfoId int, startDate, endDate string) (list []*EdbDataListByUniqueCode, err error) {
+	tableName := GetEdbDataTableName(source, subSource)
 	if tableName == "" {
 		err = errors.New("无效的渠道:" + strconv.Itoa(source))
 		list = make([]*EdbDataListByUniqueCode, 0)
@@ -389,8 +389,8 @@ func GetEdbDataLunarList(endInfoId int, startDate, endDate string) (list []*EdbD
 	return
 }
 
-func GetEdbDataListMinAndMax(source, endInfoId int, startDate, endDate string) (min_data, max_data float64, err error) {
-	tableName := GetEdbDataTableName(source)
+func GetEdbDataListMinAndMax(source, subSource, endInfoId int, startDate, endDate string) (min_data, max_data float64, err error) {
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT min(value) AS min_data,max(value) AS max_data FROM %s WHERE edb_info_id=? `
 	var pars []interface{}
 	var condition string
@@ -420,6 +420,7 @@ type ChartEdbInfoMapping struct {
 	EdbInfoId           int     `description:"指标id"`
 	SourceName          string  `description:"来源名称"`
 	Source              int     `description:"来源id"`
+	SubSource           int     `description:"来源id"`
 	EdbCode             string  `description:"指标编码"`
 	EdbName             string  `description:"指标名称"`
 	EdbAliasName        string  `description:"指标名称(别名)"`
@@ -1012,8 +1013,8 @@ func EditChartEnInfoAndEdbEnInfo(req *EditChartEnInfoReq) (err error) {
 	return
 }
 
-func ModifyEdbDatadTimestamp(source, edbDataId int, dataTimestamp int64) (err error) {
-	tableName := GetEdbDataTableName(source)
+func ModifyEdbDatadTimestamp(source, subSource, edbDataId int, dataTimestamp int64) (err error) {
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := `UPDATE %s SET data_timestamp=? WHERE edb_data_id=? `
 	sql = fmt.Sprintf(sql, tableName)
 	o := orm.NewOrmUsingDB("data")
@@ -1102,15 +1103,15 @@ func ChartInfoExist(condition, edbInfoIdStr string) (count int, err error) {
 	return
 }
 
-func ChartInfoSearchByKeyWord(KeyWord string, showSysId int) (searchList []*ChartInfo, err error) {
+func ChartInfoSearchByKeyWord(keyword string, showSysId int) (searchList []*ChartInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM chart_info WHERE 1=1 `
 
 	var pars []interface{}
 
-	if KeyWord != "" {
+	if keyword != "" {
 		sql += `AND chart_name LIKE ?  `
-		pars = append(pars, "%"+KeyWord+"%")
+		pars = append(pars, utils.GetLikeKeyword(keyword))
 	}
 
 	if showSysId > 0 {
@@ -1118,7 +1119,7 @@ func ChartInfoSearchByKeyWord(KeyWord string, showSysId int) (searchList []*Char
 		pars = append(pars, showSysId)
 	}
 	sql += ` ORDER BY create_time DESC `
-	if KeyWord == "" {
+	if keyword == "" {
 		sql += ` LIMIT 100 `
 	}
 	_, err = o.Raw(sql, pars).QueryRows(&searchList)
@@ -1376,7 +1377,10 @@ func GetChartInfoByClassifyIdAndName(classifyId int, chartName string) (item *Ch
 
 // BatchChartRefreshReq 批量刷新图表请求
 type BatchChartRefreshReq struct {
-	ChartInfoCode []string `description:"图表编码数组"`
+	ChartInfoCode   []string `description:"图表编码数组"`
+	ReportId        int      `description:"报告id"`
+	ReportChapterId int      `description:"报告章节id"`
+	Source          string   `description:"来源,枚举值:report、english_report、smart_report"`
 }
 
 // GetChartInfoListByUniqueCodeSlice 根据图表编码获取图表列表数据

+ 3 - 2
models/data_manage/coal_data.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 )
@@ -15,8 +16,8 @@ type BaseFromCoalmineMapping struct {
 // GetCoalItemList 模糊查询Smm数据库指标列表
 func GetCoalItemList(keyword string) (items []*BaseFromCoalmineMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := "SELECT * FROM base_from_coalmine_mapping WHERE CONCAT(index_name,index_code) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM base_from_coalmine_mapping WHERE CONCAT(index_name,index_code) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 }
 

+ 2 - 2
models/data_manage/edb_data_baiinfo.go

@@ -25,7 +25,7 @@ func GetEdbDataBaiinfoMaxAndMinDate(edbCode string) (min_date, max_date string,
 }
 
 // 全部刷新有色数据
-func RefreshAllEdbDataByBaiinfo(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataByBaiinfo(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -46,7 +46,7 @@ func RefreshAllEdbDataByBaiinfo(edbInfoId, source int, edbCode, startDate, endDa
 
 	//获取已存在指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)

+ 44 - 6
models/data_manage/edb_data_base.go

@@ -8,12 +8,16 @@ import (
 )
 
 // GetEdbDataTableName 指标数据->存储表
-func GetEdbDataTableName(source int) (tableName string) {
+func GetEdbDataTableName(source, subSource int) (tableName string) {
 	switch source {
 	case utils.DATA_SOURCE_THS:
 		tableName = "edb_data_ths"
 	case utils.DATA_SOURCE_WIND:
-		tableName = "edb_data_wind"
+		if subSource == utils.DATA_SUB_SOURCE_DATE {
+			tableName = "edb_data_wind_wsd"
+		} else {
+			tableName = "edb_data_wind"
+		}
 	case utils.DATA_SOURCE_PB, utils.DATA_SOURCE_PB_FINANCE: //彭博经济数据、彭博财务数据
 		tableName = "edb_data_pb"
 	case utils.DATA_SOURCE_CALCULATE:
@@ -202,12 +206,12 @@ type EdbDataBase struct {
 	DataTimestamp int64
 }
 
-func GetEdbDataAllByEdbCode(edbCode string, source, limit int) (items []*EdbInfoSearchData, err error) {
+func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
 	var pars []interface{}
 	pars = append(pars, edbCode)
 	o := orm.NewOrmUsingDB("data")
 
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT * FROM %s WHERE edb_code=? ORDER BY data_time DESC`
 	if limit > 0 {
 		sql += `  LIMIT ?  `
@@ -218,11 +222,45 @@ func GetEdbDataAllByEdbCode(edbCode string, source, limit int) (items []*EdbInfo
 	return
 }
 
-func GetEdbDataBaseByCodeAndDate(source int, edbCode string, startDate string) (count int, err error) {
+func GetEdbDataBaseByCodeAndDate(source, subSource int, edbCode string, startDate string) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT COUNT(1) AS count FROM %s WHERE edb_code=? AND data_time=? `
 	sql = fmt.Sprintf(sql, tableName)
 	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
 	return
 }
+
+func GetEdbDataAllByEdbCodeAndSubSource(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCode)
+	o := orm.NewOrmUsingDB("data")
+
+	tableName := GetEdbDataTableNameAndSubSource(source, subSource)
+	sql := ` SELECT * FROM %s WHERE edb_code=? ORDER BY data_time DESC`
+	if limit > 0 {
+		sql += `  LIMIT ?  `
+		pars = append(pars, limit)
+	}
+	sql = fmt.Sprintf(sql, tableName)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetEdbDataTableName 指标数据->存储表
+func GetEdbDataTableNameAndSubSource(source, subSource int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_WIND:
+		if subSource == utils.DATA_SUB_SOURCE_EDB {
+			tableName = "edb_data_wind"
+		} else {
+			tableName = "edb_data_wind_wsd"
+		}
+	default:
+		edbSource := EdbSourceIdMap[source]
+		if edbSource != nil {
+			tableName = edbSource.TableName
+		}
+	}
+	return
+}

+ 4 - 4
models/data_manage/edb_data_calculate.go

@@ -2,10 +2,10 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/yidane/formula"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -50,7 +50,7 @@ func GetEdbDataCalculateByCodeAndDate(edbCode string, startDate string) (count i
 }
 
 // 刷新全部数据
-func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
+func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source, subSource int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -79,7 +79,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 			pars = append(pars, endDate)
 		}
 		fmt.Println("v.Source:", v.Source)
-		dataList, err := GetEdbDataListAll(condition, pars, v.Source, 1)
+		dataList, err := GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
 		if err != nil {
 			return err
 		}
@@ -106,7 +106,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
 
 	//获取指标所有数据
 	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)

+ 8 - 8
models/data_manage/edb_data_calculate_time_shift.go

@@ -2,10 +2,10 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -91,7 +91,7 @@ func AddCalculateTimeShift(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbIn
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TIME_SHIFT)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SUB_SOURCE_EDB)
 		fmt.Println("dataTableName:" + dataTableName)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
@@ -128,7 +128,7 @@ func AddCalculateTimeShift(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbIn
 	} else {
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -277,7 +277,7 @@ func EditCalculateTimeShift(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbI
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
 		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -368,7 +368,7 @@ func RefreshCalculateTimeShift(edbInfoId, formulaInt, moveType int, fromEdbInfo
 	if moveType == 2 {
 		shiftDay = -shiftDay
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -427,7 +427,7 @@ func GetEdbInfoCalculateTimeShiftDetail(edbInfoId int) (item *EdbInfoCalculateTb
 }
 
 // 刷新所有变频数据
-func RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, moveType int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate, moveFrequency string) (err error) {
+func RefreshAllCalculateTimeShift(edbInfoId, source, subSource, formulaInt, moveType int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate, moveFrequency string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -482,7 +482,7 @@ func RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, moveType int, f
 		shiftDay = -shiftDay
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -495,7 +495,7 @@ func RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, moveType int, f
 	fmt.Println("source:", source)
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	fmt.Println("dataTableName:", dataTableName)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)

+ 2 - 79
models/data_manage/edb_data_cffex.go

@@ -64,83 +64,6 @@ func GetEdbDataCffexMaxOrMinDate(edbCode string) (minDate, maxDate string, err e
 	return
 }
 
-func GetEdbDataByCffex(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	cffexBaseDataAll, err := GetBaseFromCffexDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	dataList := make([]*EdbInfoSearchData, 0)
-	existMap := make(map[string]string)
-
-	for _, sv := range cffexBaseDataAll {
-		eDate := sv.DataTime
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			fmt.Println("time.Parse Err:" + eDate)
-			return nil, err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		if _, ok := existMap[eDate]; !ok {
-			if suffix == "deal" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
-			} else if suffix == "buy" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
-			} else {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
-			}
-			isAdd = true
-		}
-		if suffix == "deal" {
-			existMap[eDate] = sv.DealValue
-		} else if suffix == "buy" {
-			existMap[eDate] = sv.BuyValue
-		} else {
-			existMap[eDate] = sv.SoldValue
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return searchItem, err
-		}
-	}
-	if err != nil {
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_CFFEX, size)
-	if err != nil {
-		utils.FileLogData.Info("GetEdbDataCffexByCode Err:%s", err.Error())
-		return searchItem, err
-	}
-	minDate, maxDate, err := GetEdbDataCffexMaxOrMinDate(edbCode)
-	if err != nil {
-		return searchItem, err
-	}
-	searchItem.DataList = dataList
-	searchItem.StartDate = minDate
-	searchItem.EndDate = maxDate
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
 // RefreshEdbDataByCffex 刷新中金所指标数据
 func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -246,7 +169,7 @@ func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate string) (e
 }
 
 // RefreshAllEdbDataByCffex 全部刷新中金所
-func RefreshAllEdbDataByCffex(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataByCffex(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -297,7 +220,7 @@ func RefreshAllEdbDataByCffex(edbInfoId, source int, edbCode, startDate, endDate
 
 	//获取指标所有数据
 	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)

+ 2 - 2
models/data_manage/edb_data_coal.go

@@ -156,7 +156,7 @@ func RefreshEdbDataByCoal(edbInfoId int, edbCode, startDate, endDate string) (er
 }
 
 // RefreshAllEdbDataByCoal 全部刷新中金所
-func RefreshAllEdbDataByCoal(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataByCoal(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -205,7 +205,7 @@ func RefreshAllEdbDataByCoal(edbInfoId, source int, edbCode, startDate, endDate
 
 	//获取指标所有数据
 	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)

+ 0 - 348
models/data_manage/edb_data_dl.go

@@ -1,11 +1,8 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -64,305 +61,6 @@ func GetEdbDataDlMaxOrMinDate(edbCode string) (minDate, maxDate string, err erro
 	return
 }
 
-func GetEdbDataByDl(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	dlBaseDataAll, err := GetBaseFromDalianDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	dataList := make([]*EdbInfoSearchData, 0)
-	existMap := make(map[string]string)
-
-	for _, sv := range dlBaseDataAll {
-		eDate := sv.DataTime
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			fmt.Println("time.Parse Err:" + eDate)
-			return nil, err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		if _, ok := existMap[eDate]; !ok {
-			if suffix == "deal" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
-			} else if suffix == "buy" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
-			} else {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
-			}
-			isAdd = true
-		}
-		if suffix == "deal" {
-			existMap[eDate] = sv.DealValue
-		} else if suffix == "buy" {
-			existMap[eDate] = sv.BuyValue
-		} else {
-			existMap[eDate] = sv.SoldValue
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return searchItem, err
-		}
-	}
-	if err != nil {
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-
-	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_DL, size)
-	if err != nil {
-		utils.FileLogData.Info("GetEdbDataDlByCode Err:%s", err.Error())
-		return searchItem, err
-	}
-	minDate, maxDate, err := GetEdbDataDlMaxOrMinDate(edbCode)
-	if err != nil {
-		return searchItem, err
-	}
-	searchItem.DataList = dataList
-	searchItem.StartDate = minDate
-	searchItem.EndDate = maxDate
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-// RefreshEdbDataByDl 刷新大商所指标数据
-func RefreshEdbDataByDl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetDlDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataDlByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataDl(int64(edbInfoId), v.DataTime, value)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataByDl 全部刷新大商所
-func RefreshAllEdbDataByDl(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetDlDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 // GetBaseInfoFromDalianByIndexCode 获取指标信息
 func GetBaseInfoFromDalianByIndexCode(indexCode, suffix string) (list []*BaseInfoFromDl, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -371,49 +69,3 @@ func GetBaseInfoFromDalianByIndexCode(indexCode, suffix string) (list []*BaseInf
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetDlDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromDlDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_dalian_index WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func AddEdbDataDlBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataDlByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_dl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetBaseFromDalianDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeDalianIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `
-	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
-func GetEdbDataDlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_dl WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataDl(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_dl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 0 - 469
models/data_manage/edb_data_gie.go

@@ -3,9 +3,6 @@ package data_manage
 import (
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"eta/eta_api/utils"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -21,401 +18,6 @@ func GetEdbDataGieMaxOrMinDate(edbCode string) (minDate, maxDate string, err err
 	return
 }
 
-func GetEdbDataByGie(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	eicBaseDataAll, err := GetBaseFromEicDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		fmt.Println("GetBaseFromEicDataAllByIndexCode err:", err)
-		return
-	}
-
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	dataList := make([]*EdbInfoSearchData, 0)
-	existMap := make(map[string]string)
-
-	for _, sv := range eicBaseDataAll {
-		eDate := sv.GasDayStartedOn
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			fmt.Println("time.Parse Err:" + eDate)
-			return nil, err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		//var name string
-		if _, ok := existMap[eDate]; !ok {
-			if suffix == "GS" {
-				//name = "gas_in_storage"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.GasInStorage)
-				existMap[eDate] = sv.GasInStorage
-			} else if suffix == "F" {
-				//name = "full"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Full)
-				existMap[eDate] = sv.Full
-			} else if suffix == "T" {
-				//name = "trend"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Trend)
-				existMap[eDate] = sv.Trend
-			} else if suffix == "In" {
-				//name = "injection"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Injection)
-				existMap[eDate] = sv.Injection
-			} else if suffix == "Out" {
-				//name = "withdrawal"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Withdrawal)
-				existMap[eDate] = sv.Withdrawal
-			} else if suffix == "WGV" {
-				//name = "working_gas_volume"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.WorkingGasVolume)
-				existMap[eDate] = sv.WorkingGasVolume
-			} else if suffix == "IC" {
-				//name = "injection_capacity"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.InjectionCapacity)
-				existMap[eDate] = sv.InjectionCapacity
-			} else if suffix == "WC" {
-				//name = "withdrawal_capacity"
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.WithdrawalCapacity)
-				existMap[eDate] = sv.WithdrawalCapacity
-			}
-			isAdd = true
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("addSql err:", err)
-			return searchItem, err
-		}
-	}
-	if err != nil {
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_GIE, size)
-	if err != nil {
-		utils.FileLogData.Info("GetEdbDataGieByCode Err:%s", err.Error())
-		return searchItem, err
-	}
-	minDate, maxDate, err := GetEdbDataGieMaxOrMinDate(edbCode)
-	if err != nil {
-		return searchItem, err
-	}
-	searchItem.DataList = dataList
-	searchItem.StartDate = minDate
-	searchItem.EndDate = maxDate
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-// RefreshEdbDataByGie 刷新欧洲天然气指标数据
-func RefreshEdbDataByGie(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		fmt.Println("refresh err:", err)
-		return
-	}
-	var suffix string
-	l := len(edbCode)
-	if strings.Contains(edbCode[l-2:], "GS") {
-		suffix = "GS"
-	} else if strings.Contains(edbCode[l-2:], "CF") {
-		suffix = "CF"
-	} else if strings.Contains(edbCode[l-1:], "T") {
-		suffix = "T"
-	} else if strings.Contains(edbCode[l-2:], "In") {
-		suffix = "In"
-	} else if strings.Contains(edbCode[l-3:], "Out") {
-		suffix = "Out"
-	} else if strings.Contains(edbCode[l-3:], "WGV") {
-		suffix = "WGV"
-	} else if strings.Contains(edbCode[l-2:], "IC") {
-		suffix = "IC"
-	} else if strings.Contains(edbCode[l-2:], "WC") {
-		suffix = "WC"
-	} else if strings.Contains(edbCode[l-1:], "F") {
-		suffix = "F"
-	} else if strings.Contains(edbCode[l-1:], "C") {
-		suffix = "C"
-	} else {
-		suffix = ""
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND eic_code=? "
-		pars = append(pars, edbCode[:l-len(suffix)])
-	}
-
-	if startDate != "" {
-		condition += " AND gas_day_started_on>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND gas_day_started_on<=? "
-		pars = append(pars, endDate)
-	}
-
-	eicDataList, err := GetGieDataByTradeCodeV2(condition, pars)
-	fmt.Println("eicDataList", len(eicDataList))
-	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range eicDataList {
-		var value string
-		if suffix == "GS" {
-			value = v.GasInStorage
-		} else if suffix == "C" {
-			value = v.Consumption
-		} else if suffix == "CF" {
-			value = v.ConsumptionFull
-		} else if suffix == "F" {
-			value = v.Full
-		} else if suffix == "T" {
-			value = v.Trend
-		} else if suffix == "In" {
-			value = v.Injection
-		} else if suffix == "Out" {
-			value = v.Withdrawal
-		} else if suffix == "WGV" {
-			value = v.WorkingGasVolume
-		} else if suffix == "IC" {
-			value = v.InjectionCapacity
-		} else if suffix == "WC" {
-			value = v.WithdrawalCapacity
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.GasDayStart]; !ok {
-			count, err := GetEdbDataGieByCodeAndDate(edbCode, v.GasDayStart)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.GasDayStart
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataGie(int64(edbInfoId), v.GasDayStart, value)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.GasDayStart] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataByGie 全部刷新欧洲天然气
-func RefreshAllEdbDataByGie(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	l := len(edbCode)
-	if strings.Contains(edbCode[l-2:], "GS") {
-		suffix = "GS"
-	} else if strings.Contains(edbCode[l-2:], "CF") {
-		suffix = "CF"
-	} else if strings.Contains(edbCode[l-1:], "T") {
-		suffix = "T"
-	} else if strings.Contains(edbCode[l-2:], "In") {
-		suffix = "In"
-	} else if strings.Contains(edbCode[l-3:], "Out") {
-		suffix = "Out"
-	} else if strings.Contains(edbCode[l-3:], "WGV") {
-		suffix = "WGV"
-	} else if strings.Contains(edbCode[l-2:], "IC") {
-		suffix = "IC"
-	} else if strings.Contains(edbCode[l-2:], "WC") {
-		suffix = "WC"
-	} else if strings.Contains(edbCode[l-1:], "F") {
-		suffix = "F"
-	} else if strings.Contains(edbCode[l-1:], "C") {
-		suffix = "C"
-	} else {
-		suffix = ""
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND eic_code=? "
-		pars = append(pars, edbCode[:l-len(suffix)])
-	}
-
-	if startDate != "" {
-		condition += " AND gas_day_start>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND gas_day_start<=? "
-		pars = append(pars, endDate)
-	}
-
-	eicDataList, err := GetGieDataByTradeCodeV2(condition, pars)
-	fmt.Println("all eicDataList", len(eicDataList))
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range eicDataList {
-		var value string
-		if suffix == "GS" {
-			value = v.GasInStorage
-		} else if suffix == "C" {
-			value = v.Consumption
-		} else if suffix == "CF" {
-			value = v.ConsumptionFull
-		} else if suffix == "F" {
-			value = v.Full
-		} else if suffix == "T" {
-			value = v.Trend
-		} else if suffix == "In" {
-			value = v.Injection
-		} else if suffix == "Out" {
-			value = v.Withdrawal
-		} else if suffix == "WGV" {
-			value = v.WorkingGasVolume
-		} else if suffix == "IC" {
-			value = v.InjectionCapacity
-		} else if suffix == "WC" {
-			value = v.WithdrawalCapacity
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.GasDayStart]; !ok {
-			eDate := item.GasDayStart
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.GasDayStart] = v.GasDayStart
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// GetBaseInfoFromEicByIndexCode 获取指标信息
-func GetBaseInfoFromEicByIndexCode(indexCode, suffix string) (list []*BaseFromTradeEicIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM base_from_trade_eic_index WHERE %s_code=? `
-	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
-func GetGieDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromTradeEicIndex, err error) {
-	sql := ` SELECT * FROM base_from_trade_eic_index WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY gas_day_started_on DESC `
-	fmt.Println(sql, pars)
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
 type EicIndexV2 struct {
 	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
 	Type                   string
@@ -450,63 +52,6 @@ type EicIndexV2 struct {
 	Children               []BaseFromTradeEicIndexV2
 }
 
-func GetGieDataByTradeCodeV2(condition string, pars []interface{}) (item []*EicIndexV2, err error) {
-	sql := ` SELECT * FROM base_from_trade_eic_index_v2 WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY gas_day_start DESC `
-	fmt.Println(sql, pars)
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func AddEdbDataGieBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataGieByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_gie WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetBaseFromEicDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeEicIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	var name string
-	if suffix == "" {
-		name = "eic_code"
-	} else if suffix == "GS" {
-		name = "gas_in_storage_code"
-	} else if suffix == "C" {
-		name = "consumption_code"
-	} else if suffix == "CF" {
-		name = "consumption_full_code"
-	} else if suffix == "F" {
-		name = "full_code"
-	} else if suffix == "T" {
-		name = "trend_code"
-	} else if suffix == "In" {
-		name = "injection_code"
-	} else if suffix == "Out" {
-		name = "withdrawal_code"
-	} else if suffix == "WGV" {
-		name = "working_gas_volume_code"
-	} else if suffix == "IC" {
-		name = "injection_capacity_code"
-	} else if suffix == "WC" {
-		name = "withdrawal_capacity_code"
-	}
-	sql := `SELECT * FROM base_from_trade_eic_index_v2 WHERE %s=? `
-	sql = fmt.Sprintf(sql, name)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
 func GetBaseFromEicDataAllByIndexCodeV2(indexCode, suffix string) (list []*BaseFromTradeEicIndexV2, err error) {
 	o := orm.NewOrmUsingDB("data")
 	var name string
@@ -538,17 +83,3 @@ func GetBaseFromEicDataAllByIndexCodeV2(indexCode, suffix string) (list []*BaseF
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetEdbDataGieByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_gie WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataGie(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_gie SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 2 - 2
models/data_manage/edb_data_gl.go

@@ -235,7 +235,7 @@ func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err
 }
 
 // 全部刷新隆众数据
-func RefreshAllEdbDataByGl(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataByGl(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -276,7 +276,7 @@ func RefreshAllEdbDataByGl(edbInfoId, source int, edbCode, startDate, endDate st
 
 	//获取指标所有数据
 	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)

+ 1 - 1
models/data_manage/edb_data_insert_config.go

@@ -43,7 +43,7 @@ func GetEdbDataInsertConfigByEdbIdList(edbInfoIdList []int) (items []*EdbDataIns
 func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value float64) (err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
-	tableName := GetEdbDataTableName(edbInfo.Source)
+	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
 	if tableName == `` {
 		err = errors.New("找不到该指标的数据表")
 		return

+ 2 - 2
models/data_manage/edb_data_lz.go

@@ -234,7 +234,7 @@ func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err
 }
 
 // 全部刷新隆众数据
-func RefreshAllEdbDataByLz(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataByLz(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -275,7 +275,7 @@ func RefreshAllEdbDataByLz(edbInfoId, source int, edbCode, startDate, endDate st
 
 	//获取指标所有数据
 	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)

+ 0 - 303
models/data_manage/edb_data_manual.go

@@ -1,20 +1,10 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
-func AddEdbDataManualBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
 func GetEdbDataManualMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_manual WHERE edb_code=? `
@@ -28,296 +18,3 @@ type ManualEdbdata struct {
 	Close      string    `orm:"column(CLOSE)" description:"值"`
 	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
 }
-
-func GetEdbdataManualByTradeCode(condition string, pars []interface{}) (item []*ManualEdbdata, err error) {
-	sql := ` SELECT  * FROM edbdata WHERE 1=1 `
-	o := orm.NewOrmUsingDB("edb")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY DT DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func GetEdbDataManualByCode(edbCode string, size int) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_manual WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, size).QueryRows(&items)
-	return
-}
-
-func GetEdbDataByManual(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND TRADE_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	manualDataList, err := GetEdbdataManualByTradeCode(condition, pars)
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	dataLen := len(manualDataList)
-
-	if dataLen > 0 {
-		var isAdd bool
-		addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		nowStr := time.Now().Format(utils.FormatDateTime)
-		dataList := make([]*EdbInfoSearchData, 0)
-		for i := 0; i < dataLen; i++ {
-			item := manualDataList[i]
-			eDate := item.Dt
-			sValue := item.Close
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return nil, err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += "("
-			addSql += "0," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
-				"," + "'" + nowStr + "'" + "," + "0" + "," + "'" + timeStr + "'"
-			addSql += "),"
-			isAdd = true
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			err = AddEdbDataManualBySql(addSql)
-			if err != nil {
-				utils.FileLogData.Info("AddEdbDataThsBySql Err:%s", err.Error())
-				return
-			}
-		}
-
-		size := utils.EDB_DATA_LIMIT
-		dataList, err := GetEdbDataManualByCode(edbCode, size)
-		if err != nil {
-			utils.FileLogData.Info("GetEdbDataThsByCode Err:%s", err.Error())
-			return searchItem, err
-		}
-		minDate, maxDate, err := GetEdbDataManualMaxOrMinDate(edbCode)
-		if err != nil {
-			return searchItem, err
-		}
-		searchItem.DataList = dataList
-		searchItem.StartDate = minDate
-		searchItem.EndDate = maxDate
-	}
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-func GetEdbDataManualByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_manual WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataManual(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_manual SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-// 刷新手工指标数据
-func RefreshEdbDataByManual(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND TRADE_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND DT>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND DT<=? "
-		pars = append(pars, endDate)
-	}
-
-	manualDataList, err := GetEdbdataManualByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for _, v := range manualDataList {
-		item := v
-		count, err := GetEdbDataManualByCodeAndDate(v.TradeCode, v.Dt)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			return err
-		}
-		if count <= 0 {
-			nowStr := time.Now().Format(utils.FormatDateTime)
-			eDate := item.Dt
-			sValue := item.Close
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += "("
-			addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
-				"," + "'" + nowStr + "'" + "," + "1" + "," + "'" + timeStr + "'"
-			addSql += "),"
-			isAdd = true
-		} else {
-			err = ModifyEdbDataManual(int64(edbInfoId), v.Dt, v.Close)
-			if err != nil {
-				return err
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// 刷新手工指标数据
-func RefreshAllEdbDataByManual(edbInfoId, source int, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND TRADE_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	manualDataList, err := GetEdbdataManualByTradeCode(condition, pars)
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]*EdbDataBase)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	manualMap := make(map[string]*ManualEdbdata)
-	fmt.Println("manualDataList:", len(manualDataList))
-	for _, v := range manualDataList {
-		item := v
-		fmt.Println("Item:", item.Dt, item.Close, item.TradeCode, item.ModifyTime)
-		if findItem, ok := existDataMap[v.Dt]; !ok {
-			eDate := item.Dt
-			sValue := item.Close
-
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-
-			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-			isAdd = true
-		} else {
-			if findItem.Value != item.Close {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, item.Close, edbInfoId, item.Dt).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-		manualMap[v.Dt] = v
-	}
-	for _, v := range existDataList {
-		if _, ok := manualMap[v.DataTime]; !ok {
-			go DeleteEdbDataByIdAndSource(v.EdbDataId, utils.DATA_SOURCE_MANUAL)
-		}
-	}
-	fmt.Println("isAdd:", isAdd)
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllEdbDataByManual add Err", err.Error())
-			return
-		}
-	}
-	return
-}
-
-func DeleteEdbDataByIdAndSource(edbDataId, source int) (err error) {
-	sql := ` DELETE FROM %s WHERE edb_data_id=? `
-	tableName := GetEdbDataTableName(source)
-	sql = fmt.Sprintf(sql, tableName)
-
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, edbDataId).Exec()
-	return
-}

+ 2 - 2
models/data_manage/edb_data_quarter.go

@@ -43,7 +43,7 @@ func AddCalculateQuarter(edbInfoId, source int, edbCode string) (err error) {
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
 	pars = append(pars, edbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, source, utils.DATA_SUB_SOURCE_EDB, 0)
 	if err != nil {
 		return err
 	}
@@ -226,7 +226,7 @@ func AddCalculateQuarterV2(edbInfoId, source int, edbCode string) (err error) {
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
 	pars = append(pars, edbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, source, utils.DATA_SUB_SOURCE_EDB, 0)
 	if err != nil {
 		return err
 	}

+ 2 - 2
models/data_manage/edb_data_sci.go

@@ -25,7 +25,7 @@ func GetEdbDataSciMaxAndMinDate(edbCode string) (min_date, max_date string, err
 }
 
 // 全部刷新有色数据
-func RefreshAllEdbDataBySci(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataBySci(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -46,7 +46,7 @@ func RefreshAllEdbDataBySci(edbInfoId, source int, edbCode, startDate, endDate s
 
 	//获取已存在指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)

+ 0 - 345
models/data_manage/edb_data_sh.go

@@ -1,11 +1,8 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -64,302 +61,6 @@ func GetEdbDataShMaxOrMinDate(edbCode string) (minDate, maxDate string, err erro
 	return
 }
 
-func GetEdbDataBySh(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	shBaseDataAll, err := GetBaseFromShDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	dataList := make([]*EdbInfoSearchData, 0)
-	existMap := make(map[string]string)
-
-	for _, sv := range shBaseDataAll {
-		eDate := sv.DataTime
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			fmt.Println("time.Parse Err:" + eDate)
-			return nil, err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		if _, ok := existMap[eDate]; !ok {
-			if suffix == "deal" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
-			} else if suffix == "buy" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
-			} else {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
-			}
-			isAdd = true
-		}
-		if suffix == "deal" {
-			existMap[eDate] = sv.DealValue
-		} else if suffix == "buy" {
-			existMap[eDate] = sv.BuyValue
-		} else {
-			existMap[eDate] = sv.SoldValue
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return searchItem, err
-		}
-	}
-	if err != nil {
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-
-	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_SH, size)
-	if err != nil {
-		utils.FileLogData.Info("GetEdbDataShByCode Err:%s", err.Error())
-		return searchItem, err
-	}
-	minDate, maxDate, err := GetEdbDataShMaxOrMinDate(edbCode)
-	if err != nil {
-		return searchItem, err
-	}
-	searchItem.DataList = dataList
-	searchItem.StartDate = minDate
-	searchItem.EndDate = maxDate
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-// RefreshEdbDataBySh 刷新上期所指标数据
-func RefreshEdbDataBySh(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetShDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataShByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataSh(int64(edbInfoId), v.DataTime, value)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataBySh 全部刷新上期所
-func RefreshAllEdbDataBySh(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetShDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 // GetBaseInfoFromShByIndexCode 获取指标信息
 func GetBaseInfoFromShByIndexCode(indexCode, suffix string) (list []*BaseInfoFromSh, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -368,49 +69,3 @@ func GetBaseInfoFromShByIndexCode(indexCode, suffix string) (list []*BaseInfoFro
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetShDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_shanghai_index WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func AddEdbDataShBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataShByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_sh WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetBaseFromShDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM base_from_trade_shanghai_index WHERE %s_code=? `
-	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
-func GetEdbDataShByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_sh WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataSh(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_sh SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 0 - 350
models/data_manage/edb_data_shfe.go

@@ -1,11 +1,8 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -64,307 +61,6 @@ func GetEdbDataShfeMaxOrMinDate(edbCode string) (minDate, maxDate string, err er
 	return
 }
 
-func GetEdbDataByShfe(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	ineBaseDataAll, err := GetBaseFromShfeDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	dataList := make([]*EdbInfoSearchData, 0)
-	existMap := make(map[string]string)
-
-	for _, sv := range ineBaseDataAll {
-		eDate := sv.DataTime
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			fmt.Println("time.Parse Err:" + eDate)
-			return nil, err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		if _, ok := existMap[eDate]; !ok {
-			if suffix == "deal" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
-			} else if suffix == "buy" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
-			} else {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
-			}
-			isAdd = true
-		}
-		if suffix == "deal" {
-			existMap[eDate] = sv.DealValue
-		} else if suffix == "buy" {
-			existMap[eDate] = sv.BuyValue
-		} else {
-			existMap[eDate] = sv.SoldValue
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return searchItem, err
-		}
-	}
-	if err != nil {
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_SHFE, size)
-	if err != nil {
-		utils.FileLogData.Info("GetEdbDataShfeByCode Err:%s", err.Error())
-		return searchItem, err
-	}
-	minDate, maxDate, err := GetEdbDataShfeMaxOrMinDate(edbCode)
-	if err != nil {
-		return searchItem, err
-	}
-	searchItem.DataList = dataList
-	searchItem.StartDate = minDate
-	searchItem.EndDate = maxDate
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-// RefreshEdbDataByShfe 刷新上期能源指标数据
-func RefreshEdbDataByShfe(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetShfeDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataShfeByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataShfe(int64(edbInfoId), v.DataTime, value)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataByShfe 全部刷新上期能源
-func RefreshAllEdbDataByShfe(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetShfeDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 // GetBaseInfoFromShfeByIndexCode 获取指标信息
 func GetBaseInfoFromShfeByIndexCode(indexCode, suffix string) (list []*BaseInfoFromShfe, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -373,49 +69,3 @@ func GetBaseInfoFromShfeByIndexCode(indexCode, suffix string) (list []*BaseInfoF
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func AddEdbDataShfeBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataShfeByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_ine WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetBaseFromShfeDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShfeIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
-	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
-func GetEdbDataShfeByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_ine WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataShfe(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_ine SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 63 - 0
models/data_manage/edb_data_wind_wsd.go

@@ -0,0 +1,63 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+)
+
+func ModifyEdbInfoWindWsdDataStatus(edbInfoId int64, edbCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tableName := `edb_data_wind_wsd`
+	sql := ` UPDATE %s SET edb_info_id=?,modify_time=NOW() WHERE edb_code=? `
+	sql = fmt.Sprintf(sql, tableName)
+	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
+	return
+}
+
+// GetEdbDataList 获取指标的数据(日期正序返回)
+func GetEdbDataWsdList(endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+	tableName := `edb_data_wind_wsd`
+	var pars []interface{}
+	sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? `
+	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, tableName)
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, endInfoId, pars).QueryRows(&list)
+	return
+}
+
+func GetEdbWsdDataCountByCondition(condition string, pars []interface{}, source int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	tableName := `edb_data_wind_wsd`
+	sql := ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
+	sql = fmt.Sprintf(sql, tableName)
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetEdbWsdDataListByCondition(condition string, pars []interface{}, source, pageSize, startSize int) (item []*EdbData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	tableName := `edb_data_wind_wsd`
+	sql := ` SELECT * FROM %s WHERE 1=1 `
+	sql = fmt.Sprintf(sql, tableName)
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}

+ 4 - 4
models/data_manage/edb_data_ys.go

@@ -10,9 +10,9 @@ import (
 	"encoding/hex"
 	"encoding/json"
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"eta/eta_api/utils"
 	"io/ioutil"
 	"net/http"
 	"net/url"
@@ -84,7 +84,7 @@ func GetEdbDataByYs(edbCode, startDate, endDate string) (searchItem *EdbInfoSear
 		_ = to.Commit()
 	}
 	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, size)
+	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, utils.DATA_SUB_SOURCE_EDB, size)
 	if err != nil {
 		utils.FileLogData.Info("GetEdbDataThsByCode Err:%s", err.Error())
 		return searchItem, err
@@ -103,7 +103,7 @@ func GetEdbDataByYs(edbCode, startDate, endDate string) (searchItem *EdbInfoSear
 }
 
 // 全部刷新有色数据
-func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+func RefreshAllEdbDataByYs(edbInfoId, source, subSource int, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -129,7 +129,7 @@ func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate st
 	}
 	//获取已存在指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)

+ 0 - 350
models/data_manage/edb_data_zz.go

@@ -1,11 +1,8 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -64,307 +61,6 @@ func GetEdbDataZzMaxOrMinDate(edbCode string) (minDate, maxDate string, err erro
 	return
 }
 
-func GetEdbDataByZz(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	zzBaseDataAll, err := GetBaseFromZhengzhouDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-
-	var isAdd bool
-	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	dataList := make([]*EdbInfoSearchData, 0)
-	existMap := make(map[string]string)
-
-	for _, sv := range zzBaseDataAll {
-		eDate := sv.DataTime
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			fmt.Println("time.Parse Err:" + eDate)
-			return nil, err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		if _, ok := existMap[eDate]; !ok {
-			if suffix == "deal" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
-			} else if suffix == "buy" {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
-			} else {
-				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
-			}
-			isAdd = true
-		}
-		if suffix == "deal" {
-			existMap[eDate] = sv.DealValue
-		} else if suffix == "buy" {
-			existMap[eDate] = sv.BuyValue
-		} else {
-			existMap[eDate] = sv.SoldValue
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return searchItem, err
-		}
-	}
-	if err != nil {
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-	size := utils.EDB_DATA_LIMIT
-	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_ZZ, size)
-	if err != nil {
-		utils.FileLogData.Info("GetEdbDataZzByCode Err:%s", err.Error())
-		return searchItem, err
-	}
-	minDate, maxDate, err := GetEdbDataZzMaxOrMinDate(edbCode)
-	if err != nil {
-		return searchItem, err
-	}
-	searchItem.DataList = dataList
-	searchItem.StartDate = minDate
-	searchItem.EndDate = maxDate
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-// RefreshEdbDataByZz 刷新郑商所指标数据
-func RefreshEdbDataByZz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetZzDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataZzByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataZz(int64(edbInfoId), v.DataTime, value)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataByZz 全部刷新郑商所
-func RefreshAllEdbDataByZz(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetZzDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 // GetBaseInfoFromZhengzhouByIndexCode 获取指标信息
 func GetBaseInfoFromZhengzhouByIndexCode(indexCode, suffix string) (list []*BaseInfoFromZz, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -373,49 +69,3 @@ func GetBaseInfoFromZhengzhouByIndexCode(indexCode, suffix string) (list []*Base
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetZzDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromZzDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_zhengzhou_index WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func AddEdbDataZzBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataZzByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_zz WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetBaseFromZhengzhouDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeZhengzhouIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM base_from_trade_zhengzhou_index WHERE %s_code=? `
-	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
-func GetEdbDataZzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_zz WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataZz(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_zz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 218 - 325
models/data_manage/edb_info.go

@@ -47,7 +47,16 @@ type EdbInfo struct {
 	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
 	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
 	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
+	TerminalCode     string  `description:"终端编码,用于配置在机器上"`
+	DataUpdateTime   string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate string  `description:"本次更新,数据发生变化的最早日期"`
+	SourceIndexName  string  `description:"数据源中的指标名称"`
+	SubSource        int     `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName    string  `description:"子数据来源名称"`
+	IndicatorCode    string  `description:"指标代码"`
+	StockCode        string  `description:"证券代码"`
 }
+
 type EdbInfoFullClassify struct {
 	*EdbInfo
 	CorrelationStr string `description:"相关性系数字符串"`
@@ -99,6 +108,13 @@ type EdbInfoSearch struct {
 	Unit      string `description:"单位"`
 	Frequency string `description:"频率"`
 	DataList  []*EdbInfoSearchData
+	StockList []*StockInfo `description:"时序数据"`
+}
+
+type StockInfo struct {
+	StockCode string
+	EdbCode   string
+	DataList  []*EdbInfoSearchData
 }
 
 type EdbInfoSearchData struct {
@@ -107,9 +123,10 @@ type EdbInfoSearchData struct {
 }
 
 type EdbInfoSearchResp struct {
-	SearchItem   *EdbInfoSearch `description:"指标分类"`
-	Status       int            `description:"1:数据已存在于弘则数据库,2:新数据,3:数据已存在于弘则数据库,但是当前账号无权限"`
-	ClassifyList []*EdbClassifySimplify
+	SearchItem      *EdbInfoSearch `description:"指标分类"`
+	Status          int            `description:"1:数据已存在于弘则数据库,2:新数据,3:数据已存在于弘则数据库,但是当前账号无权限"`
+	ClassifyList    []*EdbClassifySimplify
+	StockSearchList []*EdbInfoSearch
 }
 
 func GetEdbInfoByEdbCode(source int, edbCode string) (item *EdbInfo, err error) {
@@ -149,7 +166,7 @@ type AddEdbInfoReq struct {
 	EndDate    string `description:"终止日期"`
 }
 
-func DeleteEdbInfoAndData(edbInfoId, source int) (err error) {
+func DeleteEdbInfoAndData(edbInfoId, source, subSource int) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -170,8 +187,16 @@ func DeleteEdbInfoAndData(edbInfoId, source int) (err error) {
 		return
 	}
 
-	// 删除指标数据
-	tableName := GetEdbDataTableName(source)
+	var tableName string
+	if subSource == 0 {
+		// 删除指标数据
+		tableName = GetEdbDataTableName(source, subSource)
+	} else {
+		if source == utils.DATA_SOURCE_WIND {
+			tableName = "edb_data_wind_wsd"
+		}
+	}
+
 	if tableName != "" {
 		sql = ` DELETE FROM %s WHERE edb_info_id=? `
 		sql = fmt.Sprintf(sql, tableName)
@@ -286,6 +311,10 @@ type EdbInfoList struct {
 	IsEnEdb          bool                    `description:"是否展示英文标识"`
 	DataInsertConfig EdbDataInsertConfigItem `description:"指标数据插入配置"`
 	DataDateType     string                  `description:"数据日期类型,枚举值:交易日、自然日"`
+	SubSource        int                     `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName    string                  `description:"子数据来源名称"`
+	IndicatorCode    string                  `description:"指标代码"`
+	StockCode        string                  `description:"证券代码"`
 }
 
 type EdbDataInsertConfigItem struct {
@@ -317,9 +346,9 @@ func GetEdbInfoByCondition(condition string, pars []interface{}) (item *EdbInfoL
 	return
 }
 
-func GetEdbDataCountByCondition(condition string, pars []interface{}, source int) (count int, err error) {
+func GetEdbDataCountByCondition(condition string, pars []interface{}, source, subSource int) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, tableName)
 	if condition != "" {
@@ -329,9 +358,9 @@ func GetEdbDataCountByCondition(condition string, pars []interface{}, source int
 	return
 }
 
-func GetEdbDataListByCondition(condition string, pars []interface{}, source, pageSize, startSize int) (item []*EdbData, err error) {
+func GetEdbDataListByCondition(condition string, pars []interface{}, source, subSource, pageSize, startSize int) (item []*EdbData, err error) {
 	o := orm.NewOrmUsingDB("data")
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT * FROM %s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, tableName)
 
@@ -345,9 +374,9 @@ func GetEdbDataListByCondition(condition string, pars []interface{}, source, pag
 }
 
 // GetAllEdbDataListByCondition 根据条件获取所有的数据
-func GetAllEdbDataListByCondition(condition string, pars []interface{}, source int) (item []*EdbData, err error) {
+func GetAllEdbDataListByCondition(condition string, pars []interface{}, source, subSource int) (item []*EdbData, err error) {
 	o := orm.NewOrmUsingDB("data")
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT * FROM %s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, tableName)
 
@@ -434,14 +463,16 @@ type ChartEdbInfo struct {
 	EdbNameAlias string `json:"-" description:"指标名称,别名"`
 }
 
-func EdbInfoSearchByKeyWord(KeyWord string) (searchList []*ChartEdbInfo, err error) {
+func EdbInfoSearchByKeyWord(keyword string) (searchList []*ChartEdbInfo, err error) {
+	pars := make([]interface{}, 0)
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT edb_info_id,edb_name,source_name FROM edb_info WHERE 1=1 AND edb_info_type = 0  `
-	if KeyWord != "" {
-		sql += ` AND (edb_name LIKE '%` + KeyWord + `%' OR edb_code LIKE '%` + KeyWord + `%' ) `
+	if keyword != "" {
+		sql += ` AND (edb_name LIKE ? OR edb_code LIKE ? ) `
+		pars = append(pars, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword))
 	}
 	sql += ` ORDER BY create_time DESC `
-	_, err = o.Raw(sql).QueryRows(&searchList)
+	_, err = o.Raw(sql, pars...).QueryRows(&searchList)
 
 	return
 }
@@ -454,10 +485,10 @@ type EdbInfoMaxAndMinInfo struct {
 	LatestValue float64 `description:"最新值"`
 }
 
-func GetEdbInfoMaxAndMinInfo(source int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+func GetEdbInfoMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ``
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM %s WHERE edb_code=? `
 	sql = fmt.Sprintf(sql, tableName)
 	err = o.Raw(sql, edbCode).QueryRow(&item)
@@ -492,10 +523,10 @@ func GetEdbInfoFilter(condition string, pars []interface{}) (list []*EdbInfoList
 }
 
 //order:1升序,其余值为降序
-func GetEdbDataListAll(condition string, pars []interface{}, source, order int) (item []*EdbInfoSearchData, err error) {
+func GetEdbDataListAll(condition string, pars []interface{}, source, subSource, order int) (item []*EdbInfoSearchData, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ``
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT * FROM %s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, tableName)
 
@@ -512,10 +543,10 @@ func GetEdbDataListAll(condition string, pars []interface{}, source, order int)
 }
 
 // GetLastEdbData 获取最近的一条指标数据
-func GetLastEdbData(condition string, pars []interface{}, source int) (item *EdbInfoSearchData, err error) {
+func GetLastEdbData(condition string, pars []interface{}, source, subSource int) (item *EdbInfoSearchData, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ``
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT * FROM %s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, tableName)
 
@@ -528,10 +559,10 @@ func GetLastEdbData(condition string, pars []interface{}, source int) (item *Edb
 }
 
 //order:1升序,其余值为降序
-func GetEdbDataCount(condition string, pars []interface{}, source int) (count int, err error) {
+func GetEdbDataCount(condition string, pars []interface{}, source, subSource int) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ``
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, tableName)
 
@@ -713,10 +744,10 @@ func GetRefreshEdbInfoFromBase(edbInfoId, source int) (baseEdbInfoArr, calculate
 	return
 }
 
-func ModifyEdbInfoDataStatus(edbInfoId int64, source int, edbCode string) (err error) {
+func ModifyEdbInfoDataStatus(edbInfoId int64, source, subSource int, edbCode string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ``
-	tableName := GetEdbDataTableName(source)
+	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` UPDATE %s SET edb_info_id=?,modify_time=NOW() WHERE edb_code=? `
 	sql = fmt.Sprintf(sql, tableName)
 	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
@@ -766,261 +797,29 @@ type EdbInfoReplaceReq struct {
 	NewEdbInfoId int `description:"替换为指标ID"`
 }
 
-/*
-EdbInfoReplace 替换指标初始版本(已废弃,废弃时间:2022年01月05日15:33:42)
-1、替换图库中的指标
-2、替换计算指标中的指标,完了计算指标中的指标,全部重新计算
-*/
-func EdbInfoReplace(oldEdbInfo, newEdbInfo *EdbInfo, sysAdminId int, sysAdminRealName string) (replaceChartTotal, replaceCalculateTotal int, err error) {
-	var errmsg string
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if errmsg != "" {
-			fmt.Println("errmsg:" + errmsg)
-		}
-	}()
-	//替换图表
-	chartEdbMappingList := make([]*ChartEdbInfoMapping, 0)
-	csql := `SELECT * FROM chart_edb_mapping WHERE edb_info_id=?`
-	_, err = to.Raw(csql, oldEdbInfo.EdbInfoId).QueryRows(&chartEdbMappingList)
-	if err != nil {
-		errmsg = "获取指标关联图表信息失败:Err:" + err.Error()
-		return
-	}
-	replaceChartTotal = len(chartEdbMappingList)
-
-	for _, mv := range chartEdbMappingList {
-		//获取图表所有指标信息
-		chartEdbList := make([]*ChartEdbInfoMapping, 0)
-		csql := `SELECT * FROM chart_edb_mapping WHERE chart_info_id=?`
-		_, err = to.Raw(csql, mv.ChartInfoId).QueryRows(&chartEdbList)
-		if err != nil {
-			errmsg = "获取图表所有指标信息失败:Err:" + err.Error()
-			return
-		}
-		var minData, maxData float64
-		minData = newEdbInfo.MinValue
-		maxData = newEdbInfo.MaxValue
-
-		for _, cv := range chartEdbList {
-			if mv.IsAxis == cv.IsAxis {
-				if minData > cv.MinData {
-					minData = cv.MinData
-				}
-				if maxData < cv.MaxData {
-					maxData = cv.MaxData
-				}
-			}
-		}
-		//修改图表关联指标
-		rsql := ` UPDATE chart_edb_mapping SET edb_info_id=?,max_data=?,min_data=?,modify_time=NOW() WHERE chart_edb_mapping_id=? `
-		_, err = to.Raw(rsql, newEdbInfo.EdbInfoId, maxData, minData, mv.ChartEdbMappingId).Exec()
-		if err != nil {
-			errmsg = "更新图库指标信息失败:Err:" + err.Error()
-			return
-		}
-	}
-	//替换计算指标
-	//获取所有包含的计算指标
-	mappingList := make([]*EdbInfoCalculateMapping, 0)
-	msql := ` SELECT * FROM edb_info_calculate_mapping WHERE from_edb_info_id=?  GROUP BY edb_info_id `
-	_, err = to.Raw(msql, oldEdbInfo.EdbInfoId).QueryRows(&mappingList)
-	if err != nil {
-		errmsg = "获取计算指标关联基础指标信息失败:Err:" + err.Error()
-		return
-	}
-	replaceCalculateTotal = len(mappingList)
-	//计算指标
-	for _, mv := range mappingList {
-		//替换原指标
-		msql := `UPDATE edb_info_calculate_mapping SET from_edb_info_id=?,from_edb_code=?,from_edb_name=?,from_source=?,from_source_name=? WHERE edb_info_calculate_mapping_id=? `
-		_, err = to.Raw(msql, newEdbInfo.EdbInfoId, newEdbInfo.EdbCode, newEdbInfo.EdbName, newEdbInfo.Source, newEdbInfo.SourceName, mv.EdbInfoCalculateMappingId).Exec()
-		if err != nil {
-			return
-		}
-	}
-
-	if err != nil && errmsg != "" {
-		go alarm_msg.SendAlarmMsg("替换指标失败提醒,errmsg:"+errmsg, 3)
-		//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"替换指标失败提醒", "errmsg:"+errmsg, utils.EmailSendToUsers)
-		_ = to.Rollback()
-	} else {
-		_ = to.Commit()
-	}
-
-	//获取计算指标关联指标
-	allMappingList := make([]*EdbInfoCalculateMapping, 0)
-	allMapping := make(map[int]int)
-	tmpMapping := make(map[int]int)
-	for _, v := range mappingList {
-		if _, ok := allMapping[v.EdbInfoId]; !ok {
-			allMappingList = append(allMappingList, v)
-		}
-		newList, _ := GetAllCalculate(v.EdbInfoId, tmpMapping)
-		for _, nv := range newList {
-			if _, ok := allMapping[v.EdbInfoId]; !ok {
-				allMappingList = append(allMappingList, nv)
-			}
-			allMapping[v.EdbInfoId] = v.EdbInfoId
-		}
-		allMapping[v.EdbInfoId] = v.EdbInfoId
-	}
-	for mk, mv := range allMappingList { //原指标关联的所有计算指标
-		fmt.Println("mk/mv", mk, mv)
-		//重新计算计算指标
-		{
-			edbInfo, err := GetEdbInfoById(mv.EdbInfoId) //计算指标
-			if err != nil {
-				if err.Error() == utils.ErrNoRow() {
-					errmsg = "计算指标已被删除"
-					return replaceChartTotal, replaceCalculateTotal, err
-				}
-				errmsg = "获取计算指标失败:err:" + err.Error()
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-
-			fromEdbInfoList, err := GetEdbInfoCalculateDetail(mv.EdbInfoId, edbInfo.Source)
-			if err != nil {
-				errmsg = "获取计算指标失败:err:" + err.Error()
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-			if len(fromEdbInfoList) <= 0 {
-				errmsg = "计算指标所依赖指标不存在"
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-			fromEdbInfoItem := fromEdbInfoList[0]
-			if fromEdbInfoItem == nil {
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-			fromEdbInfo, err := GetEdbInfoById(fromEdbInfoItem.FromEdbInfoId)
-			if err != nil {
-				errmsg = "获取计算指标 来源指标失败:err:" + err.Error()
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-			edbCode := edbInfo.EdbCode
-			uniqueCode := edbInfo.UniqueCode
-			sourName := edbInfo.SourceName
-			source := edbInfo.Source
-			edbInfoId := edbInfo.EdbInfoId
-
-			req := new(EdbInfoCalculateBatchSaveReq)
-			req.EdbInfoId = edbInfoId
-			req.EdbName = edbInfo.EdbName
-			req.Frequency = edbInfo.Frequency
-			req.Unit = edbInfo.Unit
-			req.ClassifyId = edbInfo.ClassifyId
-			req.FromEdbInfoId = fromEdbInfoList[0].FromEdbInfoId
-
-			if source == utils.DATA_SOURCE_CALCULATE {
-				//检验公式
-				var formulaStr string
-				var edbInfoIdBytes []string
-				for _, v := range fromEdbInfoList {
-					formulaStr += v.FromTag + ","
-					edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
-				}
-				formulaStr = strings.Trim(formulaStr, ",")
-				formulaMap := CheckFormula(edbInfo.CalculateFormula)
-				for _, v := range formulaMap {
-					if !strings.Contains(formulaStr, v) {
-						errmsg = "公式错误,请重新填写"
-						return replaceChartTotal, replaceCalculateTotal, err
-					}
-				}
-
-				edbInfoList := make([]*EdbInfo, 0)
-
-				for _, v := range fromEdbInfoList {
-					edbInfo, err := GetEdbInfoById(v.FromEdbInfoId)
-					if err != nil {
-						if err.Error() == utils.ErrNoRow() {
-							errmsg = "指标 " + strconv.Itoa(v.FromEdbInfoId) + " 不存在"
-							return replaceChartTotal, replaceCalculateTotal, err
-						}
-						errmsg = "获取指标失败:Err:" + err.Error()
-						return replaceChartTotal, replaceCalculateTotal, err
-					}
-					edbInfoList = append(edbInfoList, edbInfo)
-				}
-				//清除历史数据
-				err = DeleteCalculateData(edbInfoId)
-				if err != nil {
-					errmsg = "清空运算指标失败:Err:" + err.Error() + " edb_info_id:" + strconv.Itoa(edbInfoId)
-					return replaceChartTotal, replaceCalculateTotal, err
-				}
-				err = Calculate(edbInfoList, int(edbInfoId), edbCode, edbInfo.CalculateFormula, edbInfoIdBytes)
-				if err != nil {
-					errmsg = "生成计算指标失败,Calculate Err:" + err.Error()
-					return replaceChartTotal, replaceCalculateTotal, err
-				}
-			} else if source == utils.DATA_SOURCE_CALCULATE_LJZZY {
-				_, err = AddCalculateLjzzy(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_TBZ {
-				sourName = "同比值"
-				edbInfoId, err = AddCalculateTbz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_TCZ {
-				sourName = "同差值"
-				edbInfoId, err = AddCalculateTcz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
-				sourName = "N数值移动平均计算"
-				formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-				edbInfoId, err = AddCalculateNszydpjjs(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName, formulaInt)
-			} else if source == utils.DATA_SOURCE_CALCULATE_HBZ {
-				sourName = "环比值"
-				formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-				edbInfoId, err = AddCalculateHbz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName, formulaInt)
-			} else if source == utils.DATA_SOURCE_CALCULATE_HCZ {
-				sourName = "环差值"
-				formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-				edbInfoId, err = AddCalculateHcz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName, formulaInt)
-			} else if source == utils.DATA_SOURCE_CALCULATE_BP {
-				sourName = "变频"
-				fmt.Println("变频", req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-				edbInfoId, err = AddCalculateBp(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else {
-				errmsg = "无效计算方式,source:" + strconv.Itoa(source)
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-			maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(source, edbCode)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				errmsg = "生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
-				return replaceChartTotal, replaceCalculateTotal, err
-			}
-			if maxAndMinItem != nil {
-				err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-			}
-		}
-	}
-	return
-}
-
 // EdbInfoReplaceV2 替换指标v2版本(更换时间:2022年01月05日15:33:42)
-func EdbInfoReplaceV2(oldEdbInfo, newEdbInfo *EdbInfo, sysAdminId int, sysAdminRealName string) (replaceChartTotal, replaceCalculateTotal int, err error) {
-	defer func() {
-		if err != nil {
-			fmt.Println("ERR:", err.Error())
-		}
-	}()
-	mappingList, replaceChartTotal, replaceCalculateTotal, err := replaceChartEdb(oldEdbInfo, newEdbInfo)
-	if err != nil {
-		return
-	}
-	err = replaceRelationEdbInfo(mappingList, oldEdbInfo, newEdbInfo, sysAdminId, sysAdminRealName)
-	return
-}
+//func EdbInfoReplaceV2(oldEdbInfo, newEdbInfo *EdbInfo, sysAdminId int, sysAdminRealName string) (mappingList,replaceChartTotal, replaceCalculateTotal int, err error) {
+//	defer func() {
+//		if err != nil {
+//			fmt.Println("ERR:", err.Error())
+//		}
+//	}()
+//
+//	// 替换关联表中的source_edb_info_id
+//	mappingList, replaceChartTotal, replaceCalculateTotal, err := replaceChartEdb(oldEdbInfo, newEdbInfo)
+//	if err != nil {
+//		return
+//	}
+//	err = replaceRelationEdbInfo(mappingList, oldEdbInfo, newEdbInfo, sysAdminId, sysAdminRealName)
+//	return
+//}
 
 // ReplaceChartEdb 替换图表中的指标
-func ReplaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo) (mappingList []*EdbInfoCalculateMapping, replaceChartTotal, replaceCalculateTotal int, err error) {
-	return replaceChartEdb(oldEdbInfo, newEdbInfo)
-}
-
-// replaceChartEdb 替换图表中的指标
-func replaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo) (mappingList []*EdbInfoCalculateMapping, replaceChartTotal, replaceCalculateTotal int, err error) {
+func ReplaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo) (relationEdbInfoIdList []int, replaceChartTotal, replaceCalculateTotal int, err error) {
 	var errmsg string
+	relationEdbInfoIdList = make([]int, 0) // 关联的指标id
+	logMsg := ``                           // 记录替换的日志
+
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -1031,6 +830,9 @@ func replaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo) (mappingList []*EdbInfoCal
 			_ = to.Rollback()
 		} else {
 			_ = to.Commit()
+			if logMsg != `` {
+				utils.FileLog.Info(fmt.Sprintf("替换指标记录,旧的指标id:%d,新的指标id:%d;%s", oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId, logMsg))
+			}
 		}
 		if errmsg != "" {
 			fmt.Println("errmsg:" + errmsg)
@@ -1041,68 +843,115 @@ func replaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo) (mappingList []*EdbInfoCal
 		}
 	}()
 	//替换图表
-	chartEdbMappingList := make([]*ChartEdbInfoMapping, 0)
-	csql := `SELECT * FROM chart_edb_mapping WHERE edb_info_id=?`
-	_, err = to.Raw(csql, oldEdbInfo.EdbInfoId).QueryRows(&chartEdbMappingList)
-	if err != nil {
-		errmsg = "获取指标关联图表信息失败:Err:" + err.Error()
-		return
-	}
-	replaceChartTotal = len(chartEdbMappingList)
-
-	for _, mv := range chartEdbMappingList {
-		//获取图表所有指标信息
-		chartEdbList := make([]*ChartEdbInfoMapping, 0)
-		csql := `SELECT * FROM chart_edb_mapping WHERE chart_info_id=?`
-		_, err = to.Raw(csql, mv.ChartInfoId).QueryRows(&chartEdbList)
+	{
+		chartEdbMappingList := make([]*ChartEdbInfoMapping, 0)
+		csql := `SELECT * FROM chart_edb_mapping WHERE edb_info_id=?`
+		_, err = to.Raw(csql, oldEdbInfo.EdbInfoId).QueryRows(&chartEdbMappingList)
 		if err != nil {
-			errmsg = "获取图表所有指标信息失败:Err:" + err.Error()
+			errmsg = "获取指标关联图表信息失败:Err:" + err.Error()
 			return
 		}
-		var minData, maxData float64
-		minData = newEdbInfo.MinValue
-		maxData = newEdbInfo.MaxValue
-
-		for _, cv := range chartEdbList {
-			if mv.IsAxis == cv.IsAxis {
-				if minData > cv.MinData {
-					minData = cv.MinData
+		replaceChartTotal = len(chartEdbMappingList)
+
+		if len(chartEdbMappingList) > 0 {
+			chartInfoIdList := make([]string, 0)
+			for _, mv := range chartEdbMappingList {
+				//获取图表所有指标信息
+				chartEdbList := make([]*ChartEdbInfoMapping, 0)
+				csql := `SELECT * FROM chart_edb_mapping WHERE chart_info_id=?`
+				_, err = to.Raw(csql, mv.ChartInfoId).QueryRows(&chartEdbList)
+				if err != nil {
+					errmsg = "获取图表所有指标信息失败:Err:" + err.Error()
+					return
+				}
+				var minData, maxData float64
+				minData = newEdbInfo.MinValue
+				maxData = newEdbInfo.MaxValue
+
+				for _, cv := range chartEdbList {
+					if mv.IsAxis == cv.IsAxis {
+						if minData > cv.MinData {
+							minData = cv.MinData
+						}
+						if maxData < cv.MaxData {
+							maxData = cv.MaxData
+						}
+					}
 				}
-				if maxData < cv.MaxData {
-					maxData = cv.MaxData
+				//修改图表关联指标
+				rsql := ` UPDATE chart_edb_mapping SET edb_info_id=?,max_data=?,min_data=?,modify_time=NOW() WHERE chart_edb_mapping_id=? `
+				_, err = to.Raw(rsql, newEdbInfo.EdbInfoId, maxData, minData, mv.ChartEdbMappingId).Exec()
+				if err != nil {
+					errmsg = "更新图库指标信息失败:Err:" + err.Error()
+					return
 				}
+
+				chartInfoIdList = append(chartInfoIdList, fmt.Sprint(mv.ChartInfoId))
 			}
+			logMsg += `涉及到的图表id:` + strings.Join(chartInfoIdList, ",") + ";"
 		}
-		//修改图表关联指标
-		rsql := ` UPDATE chart_edb_mapping SET edb_info_id=?,max_data=?,min_data=?,modify_time=NOW() WHERE chart_edb_mapping_id=? `
-		_, err = to.Raw(rsql, newEdbInfo.EdbInfoId, maxData, minData, mv.ChartEdbMappingId).Exec()
+	}
+
+	//替换计算指标
+	{
+		//获取所有包含的计算指标
+		mappingList := make([]*EdbInfoCalculateMapping, 0)
+		msql := ` SELECT * FROM edb_info_calculate_mapping WHERE from_edb_info_id=?  GROUP BY edb_info_id `
+		_, err = to.Raw(msql, oldEdbInfo.EdbInfoId).QueryRows(&mappingList)
 		if err != nil {
-			errmsg = "更新图库指标信息失败:Err:" + err.Error()
+			errmsg = "获取计算指标关联基础指标信息失败:Err:" + err.Error()
 			return
 		}
+		replaceCalculateTotal = len(mappingList)
+		//计算指标
+		if len(mappingList) > 0 {
+			edbInfoIdList := make([]string, 0)
+			for _, mv := range mappingList {
+				//如果即将替换的指标与当前指标id一致,那么就退出当前循环,进入下一循环
+				if mv.EdbInfoId == newEdbInfo.EdbInfoId {
+					continue
+				}
+				//替换原指标
+				msql := `UPDATE edb_info_calculate_mapping SET from_edb_info_id=?,from_edb_code=?,from_edb_name=?,from_source=?,from_source_name=? WHERE edb_info_calculate_mapping_id=? `
+				_, err = to.Raw(msql, newEdbInfo.EdbInfoId, newEdbInfo.EdbCode, newEdbInfo.EdbName, newEdbInfo.Source, newEdbInfo.SourceName, mv.EdbInfoCalculateMappingId).Exec()
+				if err != nil {
+					return
+				}
+				relationEdbInfoIdList = append(relationEdbInfoIdList, mv.EdbInfoId)
+
+				edbInfoIdList = append(edbInfoIdList, fmt.Sprint(mv.EdbInfoId))
+			}
+			logMsg += `涉及到的指标id:` + strings.Join(edbInfoIdList, ",") + ";"
+		}
 	}
-	//替换计算指标
-	//获取所有包含的计算指标
-	mappingList = make([]*EdbInfoCalculateMapping, 0)
-	msql := ` SELECT * FROM edb_info_calculate_mapping WHERE from_edb_info_id=?  GROUP BY edb_info_id `
-	_, err = to.Raw(msql, oldEdbInfo.EdbInfoId).QueryRows(&mappingList)
-	if err != nil {
-		errmsg = "获取计算指标关联基础指标信息失败:Err:" + err.Error()
-		return
-	}
-	replaceCalculateTotal = len(mappingList)
-	//计算指标
-	for _, mv := range mappingList {
-		//如果即将替换的指标与当前指标id一致,那么就退出当前循环,进入下一循环
-		if mv.EdbInfoId == newEdbInfo.EdbInfoId {
-			continue
+
+	// 替换预测指标中的来源指标
+	{
+		//获取所有包含的计算指标
+		predictEdbConfList := make([]*PredictEdbConf, 0)
+		msql := ` SELECT * FROM predict_edb_conf WHERE source_edb_info_id=?  GROUP BY predict_edb_info_id `
+		_, err = to.Raw(msql, oldEdbInfo.EdbInfoId).QueryRows(&predictEdbConfList)
+		if err != nil {
+			errmsg = "获取关联的预测指标信息失败:Err:" + err.Error()
+			return
 		}
-		//替换原指标
-		msql := `UPDATE edb_info_calculate_mapping SET from_edb_info_id=?,from_edb_code=?,from_edb_name=?,from_source=?,from_source_name=? WHERE edb_info_calculate_mapping_id=? `
-		_, err = to.Raw(msql, newEdbInfo.EdbInfoId, newEdbInfo.EdbCode, newEdbInfo.EdbName, newEdbInfo.Source, newEdbInfo.SourceName, mv.EdbInfoCalculateMappingId).Exec()
+		replaceCalculateTotal += len(predictEdbConfList)
+
+		//替换预测指标的来源指标
+		msql = `UPDATE predict_edb_conf SET source_edb_info_id=? WHERE source_edb_info_id=? `
+		_, err = to.Raw(msql, newEdbInfo.EdbInfoId, oldEdbInfo.EdbInfoId).Exec()
 		if err != nil {
 			return
 		}
+
+		if len(predictEdbConfList) > 0 {
+			edbInfoIdList := make([]string, 0)
+			for _, v := range predictEdbConfList {
+				relationEdbInfoIdList = append(relationEdbInfoIdList, v.PredictEdbInfoId)
+				edbInfoIdList = append(edbInfoIdList, fmt.Sprint(v.PredictEdbInfoId))
+			}
+			logMsg += `涉及到的预测指标id:` + strings.Join(edbInfoIdList, ",") + ";"
+		}
 	}
 
 	return
@@ -1177,6 +1026,7 @@ func replaceRelationEdbInfo(mappingList []*EdbInfoCalculateMapping, oldEdbInfo,
 			uniqueCode := edbInfo.UniqueCode
 			sourName := edbInfo.SourceName
 			source := edbInfo.Source
+			subSource := edbInfo.SubSource
 			edbInfoId := edbInfo.EdbInfoId
 
 			req := new(EdbInfoCalculateBatchSaveReq)
@@ -1427,7 +1277,7 @@ func replaceRelationEdbInfo(mappingList []*EdbInfoCalculateMapping, oldEdbInfo,
 				err = fmt.Errorf("无效计算方式,source:" + strconv.Itoa(source))
 				return
 			}
-			maxAndMinItem, tmpErr := GetEdbInfoMaxAndMinInfo(source, edbCode)
+			maxAndMinItem, tmpErr := GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 			err = tmpErr
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				errmsg = "生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
@@ -1468,6 +1318,10 @@ type EdbInfoView struct {
 	IsUpdate         int     `description:"当天是否已更新,1:未更新,2:已更新"`
 	LatestDate       string  `description:"数据最新日期(实际日期)"`
 	LatestValue      float64 `description:"数据最新值(实际值)"`
+	SubSource        int     `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName    string  `description:"子数据来源名称"`
+	IndicatorCode    string  `description:"指标代码"`
+	StockCode        string  `description:"证券代码"`
 	EndValue         float64 `description:"数据的最新值(预测日期的最新值)"`
 }
 
@@ -1796,3 +1650,42 @@ func GetEdbInfoAdminList(edbType int) (list []int, err error) {
 	_, err = o.Raw(sql, edbType).QueryRows(&list)
 	return
 }
+
+type EdbInfoExistCheckResp struct {
+	IndexExist        bool     `description:"指标是否存在:true,存在,false:不存在"`
+	ExistStockCodeArr []string `description:"存在的证券代码"`
+	ExistEdbCodeArr   []string `description:"存在的指标代码"`
+}
+
+type BatchAddEdbInfoReq struct {
+	BatchList []*BatchAddEdbInfo
+}
+
+type BatchAddEdbInfo struct {
+	Source     int    `description:"来源id"`
+	EdbName    string `description:"指标名称"`
+	Frequency  string `description:"频率"`
+	Unit       string `description:"单位"`
+	ClassifyId int    `description:"分类id"`
+	StockCode  string `description:"证券代码"`
+	EdbCode    string `description:"指标编码"`
+}
+
+func GetEdbInfoWsdMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ``
+	tableName := GetEdbDataTableNameAndSubSource(source, subSource)
+	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM %s WHERE edb_code=? `
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&item)
+	if err != nil {
+		return
+	}
+
+	var latest_value float64
+	sql = ` SELECT value AS latest_value FROM %s WHERE edb_code=? ORDER BY data_time DESC LIMIT 1 `
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&latest_value)
+	item.LatestValue = latest_value
+	return
+}

+ 1 - 1
models/data_manage/edb_info_calculate.go

@@ -400,7 +400,7 @@ func Calculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr strin
 		var pars []interface{}
 		condition += " AND edb_info_id=? "
 		pars = append(pars, v.EdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, v.Source, 1)
+		dataList, err := GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
 		if err != nil {
 			return err
 		}

+ 8 - 8
models/data_manage/edb_info_calculate_bp.go

@@ -2,10 +2,10 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -87,7 +87,7 @@ func AddCalculateBp(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edb
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_BP)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_BP, utils.DATA_SUB_SOURCE_EDB)
 		fmt.Println("dataTableName:" + dataTableName)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
@@ -108,7 +108,7 @@ func AddCalculateBp(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edb
 	} else {
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -284,7 +284,7 @@ func EditCalculateBp(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, ed
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
 		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -379,7 +379,7 @@ func RefreshCalculateBp(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate,
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -464,7 +464,7 @@ func GetEdbInfoCalculateBpDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail
 }
 
 // 刷新所有变频数据
-func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+func RefreshAllCalculateBp(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -499,7 +499,7 @@ func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode,
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -511,7 +511,7 @@ func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode,
 	}
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)

+ 10 - 10
models/data_manage/edb_info_calculate_hbz.go

@@ -2,9 +2,9 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -88,7 +88,7 @@ func AddCalculateHbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HBZ)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SUB_SOURCE_EDB)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
 		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
@@ -105,7 +105,7 @@ func AddCalculateHbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 	} else {
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -247,7 +247,7 @@ func EditCalculateHbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, e
 		var pars []interface{}
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -289,7 +289,7 @@ func EditCalculateHbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, e
 }
 
 // 刷新环比值数据
-func RefreshCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+func RefreshCalculateHbz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -322,14 +322,14 @@ func RefreshCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, s
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
 
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	fmt.Println("dataTableName:", dataTableName)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
@@ -416,7 +416,7 @@ func GetEdbInfoCalculateHbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetai
 }
 
 // 刷新所有环比值数据
-func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
+func RefreshAllCalculateHbz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -451,7 +451,7 @@ func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -464,7 +464,7 @@ func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode
 	fmt.Println("source:", source)
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	fmt.Println("dataTableName:", dataTableName)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)

+ 10 - 10
models/data_manage/edb_info_calculate_hcz.go

@@ -2,10 +2,10 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -88,7 +88,7 @@ func AddCalculateHcz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HCZ)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SUB_SOURCE_EDB)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
 		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
@@ -105,7 +105,7 @@ func AddCalculateHcz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 	} else {
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -255,7 +255,7 @@ func EditCalculateHcz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, e
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
 		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -305,7 +305,7 @@ func EditCalculateHcz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, e
 }
 
 // 刷新环比值数据
-func RefreshCalculateHcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+func RefreshCalculateHcz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -338,14 +338,14 @@ func RefreshCalculateHcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, s
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
 
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	fmt.Println("dataTableName:", dataTableName)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
@@ -431,7 +431,7 @@ func GetEdbInfoCalculateHczDetail(edbInfoId int) (item *EdbInfoCalculateHczDetai
 }
 
 // 刷新所有环差值数据
-func RefreshAllCalculateHcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
+func RefreshAllCalculateHcz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -465,7 +465,7 @@ func RefreshAllCalculateHcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -478,7 +478,7 @@ func RefreshAllCalculateHcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode
 	fmt.Println("source:", source)
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	fmt.Println("dataTableName:", dataTableName)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)

+ 13 - 276
models/data_manage/edb_info_calculate_ljztbpj.go

@@ -2,10 +2,10 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
-	"eta/eta_api/utils"
 	"sort"
 	"strings"
 	"time"
@@ -44,7 +44,7 @@ func AddCalculateLjztbpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, second
 		condition += " AND data_time like ? AND edb_info_id=? "
 		pars = append(pars, "%12-31", firstEdbInfo.EdbInfoId)
 
-		lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source)
+		lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource)
 		if tmpErr != nil {
 			return edbInfoId, tmpErr
 		}
@@ -56,7 +56,7 @@ func AddCalculateLjztbpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, second
 		condition += " AND data_time <= ? AND edb_info_id=? "
 		pars = append(pars, lastEdbData.DataTime, firstEdbInfo.EdbInfoId)
 
-		firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
+		firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
 		if tmpErr != nil {
 			return edbInfoId, tmpErr
 		}
@@ -110,7 +110,7 @@ func AddCalculateLjztbpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, second
 		edbInfo = tmpEdbInfo
 
 		//删除指标数据
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZTBPJ)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZTBPJ, utils.DATA_SUB_SOURCE_EDB)
 		fmt.Println("dataTableName:" + dataTableName)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
@@ -185,7 +185,7 @@ func AddCalculateLjztbpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, second
 		pars = append(pars, lastDateTime, secondEdbInfo.EdbInfoId)
 
 		//同比值指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
+		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
 		if tmpErr != nil {
 			return edbInfoId, tmpErr
 		}
@@ -340,7 +340,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 				}
 
 				//如果拼接指标变更了,那么需要删除所有的指标数据
-				tableName := GetEdbDataTableName(nowEdbInfo.Source)
+				tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
 				sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? `, tableName)
 
 				_, err = to.Raw(sql, edbInfoId).Exec()
@@ -380,7 +380,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 			pars = append(pars, "%12-31", firstEdbInfo.EdbInfoId)
 
 			//获取最新的待拼接指标
-			lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source)
+			lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource)
 			if tmpErr != nil {
 				return edbInfoId, tmpErr
 			}
@@ -392,7 +392,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 			condition += " AND data_time <= ? AND edb_info_id=? "
 			pars = append(pars, lastEdbData.DataTime, firstEdbInfo.EdbInfoId)
 
-			firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
+			firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
 			if tmpErr != nil {
 				return edbInfoId, tmpErr
 			}
@@ -411,7 +411,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 			condition += " AND edb_info_id=? and data_time <= ?"
 			pars = append(pars, nowEdbInfo.EdbInfoId, nowEdbInfo.CalculateFormula)
 
-			nowEdbDataList, tmpErr := GetEdbDataListAll(condition, pars, nowEdbInfo.Source, 0)
+			nowEdbDataList, tmpErr := GetEdbDataListAll(condition, pars, nowEdbInfo.Source, nowEdbInfo.SubSource, 0)
 			if tmpErr != nil {
 				return edbInfoId, tmpErr
 			}
@@ -443,7 +443,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 				}
 
 				//如果同比值指标变更了,那么需要删除所有计算出来的指标数据
-				tableName := GetEdbDataTableName(nowEdbInfo.Source)
+				tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
 				sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time > ? `, tableName)
 
 				_, err = to.Raw(sql, edbInfoId, nowEdbInfo.CalculateFormula).Exec()
@@ -483,7 +483,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 		pars = append(pars, lastDateTime, secondEdbInfo.EdbInfoId)
 
 		//同比值指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
+		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
 		if tmpErr != nil {
 			return edbInfoId, tmpErr
 		}
@@ -606,7 +606,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 			removeDateStr := strings.Join(removeDateList, `","`)
 			removeDateStr = `"` + removeDateStr + `"`
 			//如果拼接指标变更了,那么需要删除所有的指标数据
-			tableName := GetEdbDataTableName(nowEdbInfo.Source)
+			tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
 			sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
 
 			_, err = to.Raw(sql, edbInfoId).Exec()
@@ -619,7 +619,7 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 
 	//修改现有的数据中对应的值
 	{
-		tableName := GetEdbDataTableName(nowEdbInfo.Source)
+		tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
 		for edbDate, edbDataValue := range updateEdbDataMap {
 			sql = fmt.Sprintf(` UPDATE  %s set value = %f,modify_time=now() WHERE edb_info_id = ? and data_time = %s `, tableName, edbDataValue, edbDate)
 
@@ -648,266 +648,3 @@ func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEd
 
 	return
 }
-
-// RefreshAllCalculateLjztbpj 刷新所有 累计值同比拼接 数据
-func RefreshAllCalculateLjztbpj(edbInfo *EdbInfo) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//查询当前指标现有的数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfo.EdbInfoId)
-
-	//所有的数据
-	dataList, err := GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfo.EdbInfoId)
-	if err != nil {
-		return err
-	}
-
-	//待拼接指标map
-	pjDataMap := make(map[string]float64)     //需要入库的数据
-	nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
-	//拼接指标的日期切片数据
-	pjEdbDataTimeList := make([]string, 0)
-
-	dataMap := make(map[string]*EdbDataCalculateLjztbpj)
-	for _, v := range dataList {
-		pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
-		dataMap[v.DataTime] = v
-		nowEdbDataMap[v.DataTime] = v.Value
-	}
-
-	//查询关联指标信息
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfo.EdbInfoId)
-	existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	var existItemA, existItemB *EdbInfoCalculateMapping
-	for _, existItem := range existList {
-		if existItem.FromTag == "A" {
-			existItemA = existItem
-		} else if existItem.FromTag == "B" {
-			existItemB = existItem
-		}
-	}
-	// 原数据开始计算日期
-	startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.CalculateFormula, time.Local)
-
-	//待拼接指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time <= ? AND edb_info_id=? "
-		pars = append(pars, startCalculationDate, existItemA.FromEdbInfoId)
-
-		//第一个指标的数据列表
-		firstDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range firstDataList {
-			//时间戳
-			if edbData, ok := dataMap[v.DataTime]; ok {
-				if edbData.Value != v.Value {
-					//更新指标数据
-					edbData.Value = v.Value
-					_, err = to.Update(edbData, "Value")
-					if err != nil {
-						return
-					}
-
-					//将新的数据存入已入库指标map里面,以便后续计算
-					nowEdbDataMap[edbData.DataTime] = v.Value
-				}
-			}
-		}
-	}
-
-	//同比值指标map
-	tbzEdbDataMap := make(map[string]float64)
-
-	//同比值日期切片列表
-	tbzEdbDataTimeList := make([]string, 0)
-
-	//同比值指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time > ? AND edb_info_id = ? "
-		pars = append(pars, startCalculationDate, existItemB.FromEdbInfoId)
-
-		//第二个指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range secondDataList {
-			tbzEdbDataMap[v.DataTime] = v.Value
-			tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
-		}
-	}
-
-	sort.Strings(tbzEdbDataTimeList)
-
-	// 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
-	removeDateList := make([]string, 0)
-	for nowEdbDate := range nowEdbDataMap {
-		nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
-		//校验日期 需要 大于 拼接前日期
-		if startCalculationDate.Before(nowEdbDateTime) {
-			if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
-				// 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
-				removeDateList = append(removeDateList, nowEdbDate)
-			}
-		}
-	}
-
-	//待修改的指标数据map(index:日期,value:值)
-	updateEdbDataMap := make(map[string]float64)
-	for _, v := range tbzEdbDataTimeList {
-		tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
-
-		//获取拼接指标上一年同一天的数据
-		var pjDataTime time.Time
-		if tbzDataTime.Month() == 2 {
-			pjDataTime = tbzDataTime.AddDate(0, -11, 0)
-			pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
-		} else {
-			pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
-		}
-
-		//校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
-		if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
-			//获取去年今日的数据,获取到后,然后是去修改该日期的数据
-			if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-
-				if v == "2021-08-31" {
-					fmt.Println("进来了")
-				}
-				tbzDataValue := tbzEdbDataMap[v] //同比值
-				currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
-				currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
-				//如果计算出来的值与库里面的值不匹配,那么就去修改该值
-				if nowEdbDataValue != currValue {
-					//将计算后的数据存入待拼接指标map里面,以便后续计算
-					updateEdbDataMap[v] = currValue
-				}
-			}
-		} else {
-			//因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
-
-			//如果去年今日存在该数据,那么就去计算当前的数据
-			if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-				tbzDataValue := tbzEdbDataMap[v] //同比值
-				currValue := pjDataValue * (1 + tbzDataValue/100)
-
-				currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
-				//将计算后的数据存入已入库指标map里面,以便后续计算
-				nowEdbDataMap[v] = currValue
-
-				//将计算后的数据存入待拼接指标map里面,以便后续入库
-				pjDataMap[v] = currValue
-				pjEdbDataTimeList = append(pjEdbDataTimeList, v)
-			}
-		}
-	}
-
-	//新增的数据入库
-	{
-		addDataList := make([]*EdbDataCalculateLjztbpj, 0)
-		for dataTime, dataValue := range pjDataMap {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, dataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataLjztbpj := &EdbDataCalculateLjztbpj{
-				EdbInfoId:     edbInfo.EdbInfoId,
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      dataTime,
-				Value:         dataValue,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataLjztbpj)
-		}
-
-		tmpAddDataList := make([]*EdbDataCalculateLjztbpj, 0)
-		for _, v := range addDataList {
-			tmpAddDataList = append(tmpAddDataList, v)
-
-			if len(tmpAddDataList) >= 200 {
-				_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-				if tmpErr != nil {
-					err = tmpErr
-					return
-				}
-				//重新初始化需要加入的数据切片
-				tmpAddDataList = make([]*EdbDataCalculateLjztbpj, 0)
-			}
-		}
-		//最后如果还有需要新增的数据,那么就统一入库
-		if len(tmpAddDataList) > 0 {
-			_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-		}
-	}
-
-	//删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
-	{
-		if len(removeDateList) > 0 {
-			removeDateStr := strings.Join(removeDateList, `","`)
-			removeDateStr = `"` + removeDateStr + `"`
-			//如果拼接指标变更了,那么需要删除所有的指标数据
-			tableName := GetEdbDataTableName(edbInfo.Source)
-			sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
-
-			_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-
-	//修改现有的数据中对应的值
-	{
-		tableName := GetEdbDataTableName(edbInfo.Source)
-		for edbDate, edbDataValue := range updateEdbDataMap {
-			sql := fmt.Sprintf(` UPDATE  %s set value = ?,modify_time=now() WHERE edb_info_id = ? and data_time = ? `, tableName)
-
-			_, err = to.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
-			if err != nil {
-				err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-	return
-}

+ 7 - 7
models/data_manage/edb_info_calculate_ljzzy.go

@@ -108,7 +108,7 @@ func AddCalculateLjzzy(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo,
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZZY)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZZY, utils.DATA_SUB_SOURCE_EDB)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
 		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
@@ -124,7 +124,7 @@ func AddCalculateLjzzy(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo,
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
 	fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -342,7 +342,7 @@ func EditCalculateLjzzy(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo,
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
 		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -480,7 +480,7 @@ func RefreshCalculateLjzzy(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDa
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
 	if err != nil {
 		return err
 	}
@@ -637,7 +637,7 @@ func ModifyEdbDataCalculateLjzzy(edbInfoId int64, dataTime, value string) (err e
 }
 
 // 刷新全部数据
-func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+func RefreshAllCalculateLjzzy(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -670,7 +670,7 @@ func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCo
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
 	if err != nil {
 		return err
 	}
@@ -700,7 +700,7 @@ func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCo
 	var isAdd bool
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)

+ 3 - 260
models/data_manage/edb_info_calculate_nszydpjjs.go

@@ -103,7 +103,7 @@ func AddCalculateNszydpjjs(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbIn
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_NSZYDPJJS)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SUB_SOURCE_EDB)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
 		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
@@ -119,7 +119,7 @@ func AddCalculateNszydpjjs(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbIn
 	} else {
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -275,7 +275,7 @@ func EditCalculateNszydpjjs(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbI
 		var pars []interface{}
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -346,127 +346,6 @@ func EditCalculateNszydpjjs(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbI
 	return
 }
 
-// 刷新N数值移动平均计算
-func RefreshCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *EdbInfo, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
-			utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
-
-	existDataList, err := GetEdbDataListAll(condition, pars, source, 0)
-	if err != nil {
-		fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
-		return err
-	}
-
-	existDataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v
-	}
-	startDate := time.Now().AddDate(-2, 0, 0).Format(utils.FormatDate)
-	//计算来源数据
-	var fromCondition string
-	var fromPars []interface{}
-	fromCondition += " AND edb_info_id=? "
-	fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
-	fromCondition += " AND data_time>=? "
-	fromPars = append(fromPars, startDate)
-
-	fromDataList, err := GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
-	if err != nil {
-		fmt.Println("from GetEdbDataListAll Err:" + err.Error())
-		return err
-	}
-
-	var fromDateArr []string
-	fromDataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range fromDataList {
-		fromDateArr = append(fromDateArr, v.DataTime)
-		fromDataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-
-	arrLen := len(fromDateArr)
-	for ak, av := range fromDateArr {
-		if _, existOk := existDataMap[av]; !existOk {
-			//处理第一个值
-			var valArr []float64
-			if findItem, ok := fromDataMap[av]; ok {
-				valArr = append(valArr, findItem.Value)
-			} else {
-				continue
-			}
-			if ak+1 != arrLen {
-				//处理除第一个值之外的N-1个值
-				for i := 1; i < formulaInt; i++ {
-					arrIndex := ak + i
-					if arrIndex >= arrLen {
-						break
-					}
-					arrVal := fromDateArr[arrIndex]
-					if findItem, ok := fromDataMap[arrVal]; ok {
-						valArr = append(valArr, findItem.Value)
-					} else {
-						continue
-					}
-				}
-			}
-			valArrLen := len(valArr)
-			//var totalVal float64
-			totalVal := decimal.NewFromFloat(0.00)
-			for _, v := range valArr {
-				newDecimal := decimal.NewFromFloat(v)
-				totalVal = totalVal.Add(newDecimal)
-			}
-			af := totalVal //decimal.NewFromFloat(totalVal)
-			bf := decimal.NewFromFloat(float64(valArrLen))
-			val, _ := af.Div(bf).Float64()
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := utils.SubFloatToString(val, 4)
-			addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
-			isAdd = true
-		}
-	}
-
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 type EdbInfoCalculateNszydpjjsDetail struct {
 	EdbInfoCalculateNszydpjjsId int       `orm:"column(edb_info_calculate_nszydpjjs_id);pk"`
 	EdbInfoId                   int       `description:"指标id"`
@@ -492,139 +371,3 @@ func GetEdbInfoCalculateNszydpjjsDetail(edbInfoId int) (item *EdbInfoCalculateNs
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)
 	return
 }
-
-// 刷新全部N数值移动平均计算
-func RefreshAllCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *EdbInfo, edbCode, startDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
-			utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println(edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
-
-	existDataList, err := GetEdbDataListAll(condition, pars, source, 0)
-	if err != nil {
-		fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
-		return err
-	}
-
-	existDataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v
-	}
-
-	//计算来源数据
-	var fromCondition string
-	var fromPars []interface{}
-	fromCondition += " AND edb_info_id=? "
-	fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
-	fromCondition += " AND data_time>=? "
-	fromPars = append(fromPars, startDate)
-
-	fmt.Println("fromPars:", fromPars)
-	fromDataList, err := GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
-	if err != nil {
-		fmt.Println("from GetEdbDataListAll Err:" + err.Error())
-		return err
-	}
-
-	var fromDateArr []string
-	fromDataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range fromDataList {
-		fromDateArr = append(fromDateArr, v.DataTime)
-		fromDataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	dataTableName := GetEdbDataTableName(source)
-	arrLen := len(fromDateArr)
-	existAddDataMap := make(map[string]string)
-	for ak, av := range fromDateArr {
-		//处理第一个值
-		var valArr []float64
-		if findItem, ok := fromDataMap[av]; ok {
-			valArr = append(valArr, findItem.Value)
-		} else {
-			continue
-		}
-		if ak+1 != arrLen {
-			//处理除第一个值之外的N-1个值
-			for i := 1; i < formulaInt; i++ {
-				arrIndex := ak + i
-				if arrIndex >= arrLen {
-					break
-				}
-				arrVal := fromDateArr[arrIndex]
-				if findItem, ok := fromDataMap[arrVal]; ok {
-					valArr = append(valArr, findItem.Value)
-				} else {
-					continue
-				}
-			}
-		}
-		valArrLen := len(valArr)
-		//var totalVal float64
-		totalVal := decimal.NewFromFloat(0.00)
-		for _, v := range valArr {
-			newDecimal := decimal.NewFromFloat(v)
-			totalVal = totalVal.Add(newDecimal)
-		}
-		af := totalVal //decimal.NewFromFloat(totalVal)
-		bf := decimal.NewFromFloat(float64(valArrLen))
-		val, _ := af.Div(bf).Float64()
-		valStr := utils.SubFloatToString(val, 4)
-
-		if existVal, existOk := existDataMap[av]; !existOk {
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			if _, existOk := existAddDataMap[av]; !existOk {
-				addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
-				isAdd = true
-			}
-			existAddDataMap[av] = av
-		} else {
-			saveValue := utils.SubFloatToString(existVal.Value, 30)
-			if saveValue != valStr {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info("addSql:" + addSql)
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 2 - 725
models/data_manage/edb_info_calculate_tbz.go

@@ -1,7 +1,6 @@
 package data_manage
 
 import (
-	"errors"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
@@ -105,7 +104,7 @@ func AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TBZ)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TBZ, utils.DATA_SUB_SOURCE_EDB)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
 		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
@@ -122,7 +121,7 @@ func AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 	} else {
 		pars = append(pars, fromEdbInfo.EdbInfoId)
 	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -279,473 +278,6 @@ func TbzDiv(a, b float64) string {
 	return valStr
 }
 
-// 同比值
-func EditCalculateTbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, tmpErr := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if tmpErr != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 {
-		//删除指标关联计算指标
-		//sql := ` DELETE FROM edb_info_calculate_tbz WHERE edb_info_id = ? `
-		//_, err = to.Raw(sql, edbInfoId).Exec()
-		//if err != nil {
-		//	return
-		//}
-		//
-		//calculateItem := new(EdbInfoCalculateTbz)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return
-		//}
-
-		//删除,计算指标关联的,基础指标的关联关系
-		sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_tbz WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_TBZ
-			calculateMappingItem.SourceName = "同比值"
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		var dateArr []string
-		dataMap := make(map[string]*EdbInfoSearchData)
-		for _, v := range dataList {
-			dateArr = append(dateArr, v.DataTime)
-			dataMap[v.DataTime] = v
-		}
-
-		addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-		for _, av := range dateArr {
-			currentItem := dataMap[av]
-			if currentItem != nil {
-				//当前日期
-				currentDate, err := time.Parse(utils.FormatDate, av)
-				if err != nil {
-					return edbInfoId, err
-				}
-				//上一年的日期
-				preDate := currentDate.AddDate(-1, 0, 0)
-				preDateStr := preDate.Format(utils.FormatDate)
-				if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-					//dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := TbzDiv(currentItem.Value, findItem.Value)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-					utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-					continue
-				} else {
-					if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-						nextDateDay := preDate.AddDate(0, 1, 0)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-						preDateDay := preDate.AddDate(0, -1, 0)
-						preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-						for i := 0; i <= 6; i++ {
-							if i >= 1 {
-								nextDateDay = nextDateDay.AddDate(0, 0, i)
-								nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-								break
-							} else {
-								if i >= 1 {
-									preDateDay = preDate.AddDate(0, 0, -i)
-									preDateDayStr = nextDateDay.Format(utils.FormatDate)
-								}
-								if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TbzDiv(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-									break
-								}
-							}
-						}
-					} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-						if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-							break
-						}
-					} else {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-						preDateDay := preDate.AddDate(0, 0, -1)
-						preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-						for i := 0; i < 35; i++ {
-							if i >= 1 {
-								nextDateDay = nextDateDay.AddDate(0, 0, i)
-								nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-								break
-							} else {
-								if i >= 1 {
-									preDateDay = preDate.AddDate(0, 0, -i)
-									preDateDayStr = nextDateDay.Format(utils.FormatDate)
-								}
-								if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TbzDiv(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-									break
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 刷新同比值数据
-func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for _, av := range dateArr {
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TbzDiv(currentItem.Value, findItem.Value)
-
-				count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					return err
-				}
-				if count <= 0 {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-				} else {
-					err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
-					if err != nil {
-						return err
-					}
-				}
-				utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, i)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							fmt.Println(currentItem.Value, findItem.Value)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
-							if err != nil && err.Error() != utils.ErrNoRow() {
-								return err
-							}
-							if count <= 0 {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							} else {
-								err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
-								if err != nil {
-									return err
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -i)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
-								if err != nil && err.Error() != utils.ErrNoRow() {
-									return err
-								}
-								if count <= 0 {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								} else {
-									err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
-									if err != nil {
-										return err
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TbzDiv(currentItem.Value, findItem.Value)
-
-						count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
-						if err != nil && err.Error() != utils.ErrNoRow() {
-							return err
-						}
-						if count <= 0 {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-						} else {
-							err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
-							if err != nil {
-								return err
-							}
-						}
-						break
-					}
-				} else {
-					nextDateDay := preDate.AddDate(0, 0, 1)
-					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-					preDateDay := preDate.AddDate(0, 0, -1)
-					preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-					for i := 0; i < 35; i++ {
-						if i >= 1 {
-							nextDateDay = nextDateDay.AddDate(0, 0, i)
-							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-						}
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
-							if err != nil && err.Error() != utils.ErrNoRow() {
-								return err
-							}
-							if count <= 0 {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							} else {
-								err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
-								if err != nil {
-									return err
-								}
-							}
-							break
-						} else {
-							if i >= 1 {
-								preDateDay = preDate.AddDate(0, 0, -i)
-								preDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
-								if err != nil && err.Error() != utils.ErrNoRow() {
-									return err
-								}
-								if count <= 0 {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								} else {
-									err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
-									if err != nil {
-										return err
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 type EdbInfoCalculateTbzDetail struct {
 	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tbz_id);pk"`
 	EdbInfoId             int       `description:"指标id"`
@@ -785,258 +317,3 @@ func ModifyEdbDataCalculateTbz(edbInfoId int64, dataTime, value string) (err err
 	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
 	return
 }
-
-// 刷新所有同比值数据
-func RefreshAllCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existAddDataMap := make(map[string]string)
-	for _, av := range dateArr {
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TbzDiv(currentItem.Value, findItem.Value)
-				if existVal, ok := existDataMap[av]; !ok {
-					if _, existOk := existAddDataMap[av]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-						isAdd = true
-					}
-					existAddDataMap[av] = av
-				} else {
-					if existVal != val {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, i)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -i)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TbzDiv(currentItem.Value, findItem.Value)
-
-						if existVal, ok := existDataMap[av]; !ok {
-							if _, existOk := existAddDataMap[av]; !existOk {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existAddDataMap[av] = av
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-						break
-					}
-				} else {
-					nextDateDay := preDate.AddDate(0, 0, 1)
-					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-					preDateDay := preDate.AddDate(0, 0, -1)
-					preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-					for i := 0; i < 35; i++ {
-						if i >= 1 {
-							nextDateDay = nextDateDay.AddDate(0, 0, i)
-							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-						}
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							if i >= 1 {
-								preDateDay = preDate.AddDate(0, 0, -i)
-								preDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 8 - 8
models/data_manage/edb_info_calculate_tcz.go

@@ -2,10 +2,10 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
-	"eta/eta_api/utils"
 	"strconv"
 	"strings"
 	"time"
@@ -105,7 +105,7 @@ func AddCalculateTcz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 		}
 	} else {
 		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TCZ)
+		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TCZ, utils.DATA_SUB_SOURCE_EDB)
 		fmt.Println("dataTableName:", dataTableName)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
@@ -128,7 +128,7 @@ func AddCalculateTcz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, ed
 	}
 
 	fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return edbInfoId, err
 	}
@@ -386,7 +386,7 @@ func EditCalculateTcz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, e
 		condition += " AND edb_info_id=? "
 		pars = append(pars, req.FromEdbInfoId)
 		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 		if err != nil {
 			return edbInfoId, err
 		}
@@ -555,7 +555,7 @@ func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -774,7 +774,7 @@ func ModifyEdbDataCalculateTcz(edbInfoId int64, dataTime, value string) (err err
 }
 
 // 刷新全部同差值数据
-func RefreshAllCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+func RefreshAllCalculateTcz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
 	o := orm.NewOrmUsingDB("data")
 	to, err := o.Begin()
 	if err != nil {
@@ -809,7 +809,7 @@ func RefreshAllCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode
 		pars = append(pars, endDate)
 	}
 
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
 	if err != nil {
 		return err
 	}
@@ -821,7 +821,7 @@ func RefreshAllCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode
 	}
 	//获取指标所有数据
 	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source)
+	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)

+ 5 - 429
models/data_manage/edb_info_calculate_zjpj.go

@@ -2,234 +2,11 @@ package data_manage
 
 import (
 	"errors"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"eta/eta_api/utils"
-	"strings"
+	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
 
-// AddCalculateZjpj 新增直接拼接数据
-func AddCalculateZjpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, secondEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateZjpj")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("AddCalculateZjpj,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	var edbInfo *EdbInfo
-	if req.EdbInfoId <= 0 {
-		edbInfo = &EdbInfo{
-			SourceName:       "直接拼接",
-			Source:           utils.DATA_SOURCE_CALCULATE_ZJPJ,
-			EdbCode:          edbCode,
-			EdbName:          req.EdbName,
-			EdbNameSource:    req.EdbName,
-			Frequency:        req.Frequency,
-			Unit:             req.Unit,
-			StartDate:        firstEdbInfo.StartDate,
-			EndDate:          firstEdbInfo.EndDate,
-			ClassifyId:       req.ClassifyId,
-			SysUserId:        sysUserId,
-			SysUserRealName:  sysUserRealName,
-			UniqueCode:       uniqueCode,
-			CreateTime:       time.Now(),
-			ModifyTime:       time.Now(),
-			CalculateFormula: req.Formula,
-			EdbType:          2,
-		}
-		newEdbInfoId, err := to.Insert(edbInfo)
-		if err != nil {
-			return edbInfoId, err
-		}
-		edbInfoId = int(newEdbInfoId)
-	} else {
-		edbInfoId = req.EdbInfoId
-		//查询
-		tmpEdbInfo, tmpErr := GetEdbInfoById(edbInfoId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		tmpEdbInfo.EdbName = req.EdbName
-		tmpEdbInfo.ClassifyId = req.ClassifyId
-		tmpEdbInfo.Frequency = req.Frequency
-		tmpEdbInfo.Unit = req.Unit
-		tmpEdbInfo.CalculateFormula = req.Formula
-
-		edbInfo = tmpEdbInfo
-
-		//删除指标数据
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_ZJPJ)
-		fmt.Println("dataTableName:" + dataTableName)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-		if err != nil {
-			return 0, err
-		}
-
-		//删除指标关系
-		sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return
-		}
-	}
-
-	//关联关系
-
-	//第一个指标
-	{
-		calculateMappingItem := new(EdbInfoCalculateMapping)
-		calculateMappingItem.CreateTime = time.Now()
-		calculateMappingItem.ModifyTime = time.Now()
-		calculateMappingItem.Sort = 1
-		calculateMappingItem.EdbCode = edbCode
-		calculateMappingItem.EdbInfoId = edbInfoId
-		calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
-		calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
-		calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
-		calculateMappingItem.FromSource = firstEdbInfo.Source
-		calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
-		calculateMappingItem.FromTag = "A"
-		calculateMappingItem.Source = edbInfo.Source
-		calculateMappingItem.SourceName = edbInfo.SourceName
-		_, err = to.Insert(calculateMappingItem)
-		if err != nil {
-			return
-		}
-	}
-
-	//第二个指标
-	{
-		calculateMappingItem := new(EdbInfoCalculateMapping)
-		calculateMappingItem.CreateTime = time.Now()
-		calculateMappingItem.ModifyTime = time.Now()
-		calculateMappingItem.Sort = 1
-		calculateMappingItem.EdbCode = edbCode
-		calculateMappingItem.EdbInfoId = edbInfoId
-		calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
-		calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
-		calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
-		calculateMappingItem.FromSource = secondEdbInfo.Source
-		calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
-		calculateMappingItem.FromTag = "B"
-		calculateMappingItem.Source = edbInfo.Source
-		calculateMappingItem.SourceName = edbInfo.SourceName
-		_, err = to.Insert(calculateMappingItem)
-		if err != nil {
-			return
-		}
-	}
-
-	addDataList := make([]*EdbDataCalculateZjpj, 0)
-
-	//拼接数据
-
-	//第一个指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time < ? AND edb_info_id=? "
-		pars = append(pars, req.Formula, firstEdbInfo.EdbInfoId)
-
-		//第一个指标的数据列表
-		firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-
-		for _, v := range firstDataList {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataZjpj := &EdbDataCalculateZjpj{
-				EdbInfoId:     edbInfoId,
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      v.DataTime,
-				Value:         v.Value,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataZjpj)
-			if len(addDataList) >= 200 {
-				_, tmpErr := to.InsertMulti(len(addDataList), addDataList)
-				if tmpErr != nil {
-					err = tmpErr
-					return
-				}
-				//重新初始化需要加入的数据切片
-				addDataList = make([]*EdbDataCalculateZjpj, 0)
-			}
-		}
-	}
-
-	//第二个指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time >= ? AND edb_info_id = ? "
-		pars = append(pars, req.Formula, secondEdbInfo.EdbInfoId)
-
-		//第二个指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-
-		for _, v := range secondDataList {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataZjpj := &EdbDataCalculateZjpj{
-				EdbInfoId:     edbInfoId,
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      v.DataTime,
-				Value:         v.Value,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataZjpj)
-			if len(addDataList) >= 200 {
-				_, tmpErr := to.InsertMulti(len(addDataList), addDataList)
-				if tmpErr != nil {
-					err = tmpErr
-					return
-				}
-				//重新初始化需要加入的数据切片
-				addDataList = make([]*EdbDataCalculateZjpj, 0)
-			}
-		}
-	}
-
-	//将剩余的数据入库
-	if len(addDataList) > 0 {
-		_, tmpErr := to.InsertMulti(len(addDataList), addDataList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-	}
-	return
-}
-
 // EditCalculateZjpj 编辑直接拼接数据
 func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbInfo, secondEdbInfo *EdbInfo) (edbInfoId int, err error) {
 	edbInfoId = req.EdbInfoId
@@ -334,7 +111,7 @@ func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbIn
 			condition += " AND data_time < ? AND edb_info_id=? "
 			pars = append(pars, req.Formula, firstEdbInfo.EdbInfoId)
 
-			tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
+			tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
 			if tmpErr != nil {
 				return edbInfoId, tmpErr
 			}
@@ -367,7 +144,7 @@ func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbIn
 				condition += " AND data_time >= ?  AND data_time < ? AND edb_info_id=? "
 				pars = append(pars, nowFormulaDate, reqFormulaDate, firstEdbInfo.EdbInfoId)
 
-				tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, 0)
+				tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
 				if tmpErr != nil {
 					return edbInfoId, tmpErr
 				}
@@ -420,7 +197,7 @@ func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbIn
 			//第二个指标的数据列表
 			condition = " AND data_time >= ?  AND edb_info_id=? "
 			pars = append(pars, reqFormulaDate, secondEdbInfo.EdbInfoId)
-			tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
+			tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
 			if tmpErr != nil {
 				return edbInfoId, tmpErr
 			}
@@ -453,7 +230,7 @@ func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbIn
 				condition += " AND data_time >= ?  AND data_time < ? AND edb_info_id=? "
 				pars = append(pars, reqFormulaDate, nowFormulaDate, secondEdbInfo.EdbInfoId)
 
-				tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, 0)
+				tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
 				if tmpErr != nil {
 					return edbInfoId, tmpErr
 				}
@@ -507,204 +284,3 @@ func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbIn
 
 	return
 }
-
-// RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
-func RefreshAllCalculateZjpj(edbInfo *EdbInfo) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//查询当前指标现有的数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfo.EdbInfoId)
-
-	dataList, err := GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfo.EdbInfoId)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbDataCalculateZjpj)
-	removeDataTimeMap := make(map[string]int) //需要移除的日期数据
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-		removeDataTimeMap[v.DataTime] = 1
-	}
-
-	//查询关联指标信息
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfo.EdbInfoId)
-	existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	var existItemA, existItemB *EdbInfoCalculateMapping
-	for _, existItem := range existList {
-		if existItem.FromTag == "A" {
-			existItemA = existItem
-		} else if existItem.FromTag == "B" {
-			existItemB = existItem
-		}
-	}
-
-	addDataList := make([]*EdbDataCalculateZjpj, 0)
-	//第一个指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time < ? AND edb_info_id=? "
-		pars = append(pars, edbInfo.CalculateFormula, existItemA.FromEdbInfoId)
-
-		//第一个指标的数据列表
-		firstDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range firstDataList {
-			//校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
-			if _, ok := removeDataTimeMap[v.DataTime]; ok {
-				delete(removeDataTimeMap, v.DataTime)
-			}
-			//时间戳
-			if edbData, ok := dataMap[v.DataTime]; ok {
-				if edbData.Value != v.Value {
-					//更新指标数据
-					edbData.Value = v.Value
-					_, err = to.Update(edbData, "Value")
-					if err != nil {
-						return
-					}
-				}
-			} else {
-				//时间戳
-				currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-				timestamp := currentDate.UnixNano() / 1e6
-
-				edbDataZjpj := &EdbDataCalculateZjpj{
-					EdbInfoId:     edbInfo.EdbInfoId,
-					EdbCode:       edbInfo.EdbCode,
-					DataTime:      v.DataTime,
-					Value:         v.Value,
-					Status:        1,
-					CreateTime:    time.Now(),
-					ModifyTime:    time.Now(),
-					DataTimestamp: timestamp,
-				}
-				addDataList = append(addDataList, edbDataZjpj)
-			}
-		}
-	}
-
-	//第二个指标
-	{
-		condition = ``
-		pars = make([]interface{}, 0)
-
-		condition += " AND data_time >= ? AND edb_info_id = ? "
-		pars = append(pars, edbInfo.CalculateFormula, existItemB.FromEdbInfoId)
-
-		//第二个指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range secondDataList {
-			//校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
-			if _, ok := removeDataTimeMap[v.DataTime]; ok {
-				delete(removeDataTimeMap, v.DataTime)
-			}
-
-			if edbData, ok := dataMap[v.DataTime]; ok {
-				if edbData.Value != v.Value {
-					//更新指标数据
-					edbData.Value = v.Value
-					edbData.ModifyTime = time.Now()
-					_, tmpErr := to.Update(edbData, "Value", "ModifyTime")
-					if tmpErr != nil {
-						fmt.Println("tmpErr:", tmpErr)
-					}
-				}
-			} else {
-				//时间戳
-				currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-				timestamp := currentDate.UnixNano() / 1e6
-
-				edbDataZjpj := &EdbDataCalculateZjpj{
-					EdbInfoId:     edbInfo.EdbInfoId,
-					EdbCode:       edbInfo.EdbCode,
-					DataTime:      v.DataTime,
-					Value:         v.Value,
-					Status:        1,
-					CreateTime:    time.Now(),
-					ModifyTime:    time.Now(),
-					DataTimestamp: timestamp,
-				}
-				addDataList = append(addDataList, edbDataZjpj)
-			}
-		}
-	}
-
-	//删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
-	{
-		removeDateList := make([]string, 0)
-		for dateTime := range removeDataTimeMap {
-			removeDateList = append(removeDateList, dateTime)
-		}
-		if len(removeDateList) > 0 {
-			removeDateStr := strings.Join(removeDateList, `","`)
-			removeDateStr = `"` + removeDateStr + `"`
-			//如果拼接指标变更了,那么需要删除所有的指标数据
-			tableName := GetEdbDataTableName(edbInfo.Source)
-			sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
-
-			_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-
-	//数据入库
-	tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
-	for _, v := range addDataList {
-		tmpAddDataList = append(tmpAddDataList, v)
-
-		if len(tmpAddDataList) >= 200 {
-			_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			//重新初始化需要加入的数据切片
-			tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
-		}
-	}
-	//最后如果还有需要新增的数据,那么就统一入库
-	if len(tmpAddDataList) > 0 {
-		_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-	}
-	return
-}

+ 105 - 2
models/data_manage/edb_terminal.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -9,18 +10,120 @@ import (
 type EdbTerminal struct {
 	TerminalId   int       `orm:"column(terminal_id);pk"`
 	Source       int       `orm:"column(source)" description:"指标来源类型"`
-	Name         string    `description:"终端名"`
+	Name         string    `description:"终端名"`
 	TerminalCode string    `description:"终端编码,用于配置在机器上"`
 	ServerUrl    string    `description:"终端地址"`
+	DirPath      string    `description:"终端存放的文件夹路径"`
 	Num          int       `description:"终端最大指标数"`
+	Status       int       `description:"状态,1启用,2禁用"`
+	Value        string    `description:"终端相关的token"`
 	ModifyTime   time.Time `description:"修改时间"`
 	CreateTime   time.Time `description:"创建时间"`
 }
 
+type EdbTerminalItem struct {
+	TerminalId   int    `orm:"column(terminal_id);pk"`
+	Source       int    `description:"指标来源类型"`
+	Name         string `description:"终端别名"`
+	TerminalCode string `description:"终端编码,用于配置在机器上"`
+	ServerUrl    string `description:"终端地址"`
+	DirPath      string `description:"终端存放的文件夹路径"`
+	Num          int    `description:"终端最大指标数"`
+	Status       int    `description:"状态,1启用,2禁用"`
+	Value        string `description:"终端相关的token"`
+	ModifyTime   string `description:"修改时间"`
+	CreateTime   string `description:"创建时间"`
+}
+
+type EdbTerminalCode struct {
+	TerminalCode string `description:"终端编码,用于配置在机器上"`
+	Source       int    `description:"指标来源类型"`
+	Name         string `description:"终端别名"`
+}
+
 // GetEdbTerminalListBySource 根据指标来源类型获取所有的终端列表
 func GetEdbTerminalListBySource(source int) (items []*EdbTerminal, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT *  FROM edb_terminal WHERE source = ? ORDER BY terminal_id ASC `
+	sql := ` SELECT *  FROM edb_terminal WHERE source = ? and status=1 ORDER BY terminal_id ASC `
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 }
+
+type BaseIndexTerminalCode struct {
+	TerminalCode string `description:"终端编码,用于配置在机器上"`
+	IndexName    string
+}
+
+type EdbTerminalListResp struct {
+	List []*EdbTerminalItem `description:"列表数据"`
+}
+
+type EdbTerminalCodeResp struct {
+	List []*EdbTerminalCode `description:"终端编码列表"`
+}
+
+type AddEdbTerminalListReq struct {
+	TerminalId int    `description:"终端id"`
+	Source     int    `description:"指标来源类型"`
+	Name       string `description:"终端别名"`
+	//TerminalCode string `description:"终端编码,用于配置在机器上"`
+	ServerUrl string `description:"终端地址"`
+	DirPath   string `description:"终端存放的文件夹路径"`
+	Num       int    `description:"终端最大指标数"`
+	//Status    int    `description:"状态,1启用,2禁用"`
+	Value string `description:"终端相关的token"`
+}
+
+type SetEdbTerminalStatusReq struct {
+	TerminalId int `description:"终端id"`
+	Status     int `description:"状态,1启用,2禁用"`
+}
+
+// GetBaseIndexTerminalCode 获取数据源的终端code
+func GetBaseIndexTerminalCode(edbCode, tableName string) (item BaseIndexTerminalCode, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`select terminal_code, index_name from %s where index_code = ? `, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&item)
+	return
+}
+
+// GetEdbTerminalById 主键获取终端
+func GetEdbTerminalById(id int) (item *EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_terminal WHERE terminal_id = ? LIMIT 1`
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func GetEdbTerminalByTerminalCode(terminalCode string) (item *EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_terminal WHERE terminal_code = ? LIMIT 1`
+	err = o.Raw(sql, terminalCode).QueryRow(&item)
+	return
+}
+
+func GetEdbTerminalList() (item []*EdbTerminalItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_terminal ORDER BY terminal_id ASC`
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+func GetEdbTerminalBySource(source int) (item []*EdbTerminalItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_terminal where source=? ORDER BY terminal_id ASC`
+	_, err = o.Raw(sql, source).QueryRows(&item)
+	return
+}
+
+func (item *EdbTerminal) Add() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Insert(item)
+	return
+}
+
+func (item *EdbTerminal) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}

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

@@ -141,7 +141,7 @@ func GetNoContentExcelInfoAll(source, userId int) (items []*ExcelClassifyItems,
 		sql += ` AND sys_user_id = ? `
 		pars = append(pars, userId)
 	}
-	sql += `  ORDER BY sort asc,create_time desc `
+	sql += `  ORDER BY sort asc,excel_info_id desc `
 	_, err = o.Raw(sql, pars...).QueryRows(&items)
 	return
 }
@@ -239,7 +239,7 @@ func GetExcelInfoByUniqueCode(uniqueCode string) (item *ExcelInfo, err error) {
 // GetFirstExcelInfoByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
 func GetFirstExcelInfoByClassifyId(classifyId int) (item *ExcelInfo, err error) {
 	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`
+	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)
 	return
 }

+ 3 - 2
models/data_manage/gl_data.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
@@ -125,8 +126,8 @@ type GlSearchIndex struct {
 // GetGlItemList 模糊查询隆众数据库指标列表
 func GetGlItemList(keyword string) (items []*GlSearchIndex, err error) {
 	o := orm.NewOrmUsingDB("gl")
-	sql := "SELECT * FROM mb_index_main_info WHERE CONCAT(INDEX_NAME,INDEX_CODE) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM mb_index_main_info WHERE CONCAT(INDEX_NAME,INDEX_CODE) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 
 }

+ 8 - 0
models/data_manage/my_chart.go

@@ -893,3 +893,11 @@ func GetChartInfoByIdList(chartInfoIdList []int) (items []*ChartInfo, err error)
 	_, err = o.Raw(sql, chartInfoIdList).QueryRows(&items)
 	return
 }
+
+// GetMyChartClassifyByClassifyId 主键获取分类
+func GetMyChartClassifyByClassifyId(classifyId int) (item *MyChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM my_chart_classify WHERE my_chart_classify_id = ? `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}

+ 7 - 0
models/data_manage/response/chart.go

@@ -0,0 +1,7 @@
+package response
+
+// ChartRefreshResp
+// @Description: 图表更新结果
+type ChartRefreshResp struct {
+	RefreshResult bool `description:"刷新结果"`
+}

+ 3 - 3
models/data_manage/sci_data.go

@@ -1,9 +1,9 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"eta/eta_api/utils"
 )
 
 type SciClassify struct {
@@ -138,8 +138,8 @@ func GetSciIndexDataCount(indexCode string) (count int, err error) {
 // GetSciItemList 模糊查询Sci数据库指标列表
 func GetSciItemList(keyword string) (items []*SciIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := "SELECT * FROM base_from_sci_index WHERE CONCAT(index_name,index_code) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM base_from_sci_index WHERE CONCAT(index_name,index_code) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 }
 

+ 2 - 2
models/data_manage/smm_data.go

@@ -159,8 +159,8 @@ func GetSmmIndexDataCount(indexCode string) (count int, err error) {
 // GetSmmItemList 模糊查询Smm数据库指标列表
 func GetSmmItemList(keyword string) (items []*SmmIndexItem, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := "SELECT * FROM base_from_smm_index WHERE CONCAT(index_name,index_code) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM base_from_smm_index WHERE CONCAT(index_name,index_code) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 }
 

+ 2 - 2
models/data_source/longzhong.go

@@ -167,8 +167,8 @@ func GetLongzhongSurveyDataById(lzInfoId int) (items []*LongzhongSurveyData, err
 func GetLzItemList(keyword string) (items []*data_manage.LongzhongSurveyProduct, err error) {
 	o := orm.NewOrmUsingDB("edb")
 
-	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
 	return
 
 }

+ 114 - 0
models/data_stat/edb_info_delete_log.go

@@ -0,0 +1,114 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// EdbInfoDeleteLog 指标删除日志表
+type EdbInfoDeleteLog struct {
+	Id                 uint64  `orm:"column(id);pk"`
+	EdbInfoId          int     `description:"指标ID"`
+	EdbInfoType        int     `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName         string  `description:"来源名称"`
+	Source             int     `description:"来源id"`
+	EdbCode            string  `description:"指标编码"`
+	EdbName            string  `description:"指标名称"`
+	EdbNameEn          string  `description:"英文指标名称"`
+	EdbNameSource      string  `description:"指标名称来源"`
+	Frequency          string  `description:"频率"`
+	Unit               string  `description:"单位"`
+	UnitEn             string  `description:"英文单位"`
+	StartDate          string  `description:"起始日期"`
+	EndDate            string  `description:"终止日期"`
+	SysUserId          int     `description:"创建人ID"`
+	SysUserRealName    string  `description:"创建人姓名"`
+	UniqueCode         string  `description:"指标唯一编码"`
+	EdbCreateTime      string  `description:"指标创建时间"`
+	EdbModifyTime      string  `description:"指标修改时间"`
+	CreateTime         string  `description:"创建时间即删除时间"`
+	MinValue           float64 `description:"指标最小值"`
+	MaxValue           float64 `description:"指标最大值"`
+	CalculateFormula   string  `description:"计算公式"`
+	EdbType            int     `description:"指标类型:1:基础指标,2:计算指标"`
+	LatestDate         string  `description:"数据最新日期"`
+	LatestValue        float64 `description:"数据最新值"`
+	MoveType           int     `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency      string  `description:"移动频度"`
+	NoUpdate           int8    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	ChartImage         string  `description:"图表图片"`
+	Calendar           string  `description:"公历/农历" orm:"default(公历);"`
+	DataDateType       string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
+	ManualSave         int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
+	TerminalCode       string  `description:"终端编码,用于配置在机器上"`
+	DelSysUserId       int     `description:"删除人ID"`
+	DelSysUserRealName string  `description:"删除人姓名"`
+	DataUpdateTime     string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate   string  `description:"本次更新,数据发生变化的最早日期"`
+}
+
+type EdbInfoDeleteLogItem struct {
+	Id                 uint64  `orm:"column(id);"`
+	EdbInfoId          int     `description:"指标ID"`
+	EdbInfoType        int     `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName         string  `description:"来源名称"`
+	Source             int     `description:"来源id"`
+	EdbCode            string  `description:"指标编码"`
+	EdbName            string  `description:"指标名称"`
+	EdbNameEn          string  `description:"英文指标名称"`
+	EdbNameSource      string  `description:"指标名称来源"`
+	Frequency          string  `description:"频率"`
+	Unit               string  `description:"单位"`
+	StartDate          string  `description:"起始日期"`
+	EndDate            string  `description:"终止日期"`
+	SysUserId          int     `description:"创建人ID"`
+	SysUserRealName    string  `description:"创建人姓名"`
+	EdbCreateTime      string  `description:"指标创建时间"`
+	CreateTime         string  `description:"创建时间即删除时间"`
+	LatestDate         string  `description:"数据最新日期"`
+	LatestValue        float64 `description:"数据最新值"`
+	TerminalCode       string  `description:"终端编码,用于配置在机器上"`
+	DelSysUserId       int     `description:"删除人ID"`
+	DelSysUserRealName string  `description:"删除人姓名"`
+	DataUpdateTime     string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate   string  `description:"本次更新,数据发生变化的最早日期"`
+}
+
+func AddEdbDeleteLog(item *EdbInfoDeleteLog) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type GetEdbDeleteLogResp struct {
+	List   []*EdbInfoDeleteLogItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbDeleteLogByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbInfoDeleteLog, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info_delete_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbDeleteLogCount
+func GetEdbDeleteLogCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_info_delete_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 74 - 0
models/data_stat/edb_info_stat_column.go

@@ -0,0 +1,74 @@
+package data_stat
+
+import "github.com/beego/beego/v2/client/orm"
+
+// EdbInfoStatColumn 数据源统计表自定义列
+type EdbInfoStatColumn struct {
+	Id         int    `orm:"column(id);pk" description:"自增id"`
+	ColumnName string `description:"字段名称"`
+	ColumnKey  string `description:"字段"`
+	CreateTime string `description:" 创建时间"`
+	ModifyTime string `description:"修改时间"`
+	Type       int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
+	Sort       int    `description:"列排序"`
+	IsMust     int    `description:"是否必选列: 0非必选 1必须"`
+	IsSort     int    `description:"是否是允许排序的列,0否,1是"`
+	IsShow     int    `description:"是否展示:1展示,0不展示"`
+}
+
+type EdbInfoStatColumnListItem struct {
+	Id         int    `description:"自增id"`
+	ColumnName string `description:"字段名称"`
+	ColumnKey  string `description:"字段"`
+	Type       int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
+	IsMust     int    `description:"是否必选列: 0非必选 1必须"`
+	IsSort     int    `description:"是否是允许排序的列,0否,1是"`
+	IsShow     int    `description:"是否展示:1展示,0不展示"`
+}
+
+type StatColumnList struct {
+	List []*EdbInfoStatColumnListItem
+}
+
+type EditStatColumnReq struct {
+	List []*EdbInfoStatColumnListReq
+}
+type EdbInfoStatColumnListReq struct {
+	Id     int `description:"自增id"`
+	IsShow int `description:"是否展示:1展示,0不展示"`
+}
+
+// GetStatColumn 获取自定义列
+func GetStatColumn(columnType int) (list []EdbInfoStatColumn, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_stat_column WHERE type=? ORDER BY sort asc, id asc `
+	_, err = o.Raw(sql, columnType).QueryRows(&list)
+	return
+}
+
+// GetAllStatColumn 获取所有自定义列
+func GetAllStatColumn() (list []EdbInfoStatColumn, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_stat_column ORDER BY sort asc, id asc  `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// UpdateStatColumn 批量更新自定义列
+func UpdateStatColumn(list []*EdbInfoStatColumn) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	p, err := o.Raw("UPDATE edb_info_stat_column SET is_show = ?, sort=? WHERE id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range list {
+		_, err = p.Exec(v.IsShow, v.Sort, v.Id)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 104 - 0
models/data_stat/edb_info_update_log.go

@@ -0,0 +1,104 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// EdbInfoUpdateLog 指标更新/刷新日志列表
+type EdbInfoUpdateLog struct {
+	Id                     uint64    `orm:"column(id);pk"`
+	EdbInfoId              int       `description:"指标ID"`
+	SourceName             string    `description:"来源名称"`
+	Source                 int       `description:"来源id"`
+	EdbCode                string    `description:"指标编码"`
+	EdbName                string    `description:"指标名称"`
+	EdbNameSource          string    `description:"指标名称来源"`
+	Frequency              string    `description:"频率"`
+	Unit                   string    `description:"单位"`
+	StartDate              string    `description:"起始日期"`
+	EndDate                string    `description:"终止日期"`
+	SysUserId              int       `description:"创建人ID"`
+	SysUserRealName        string    `description:"创建人姓名"`
+	UniqueCode             string    `description:"指标唯一编码"`
+	EdbCreateTime          time.Time `description:"指标创建时间"`
+	EdbModifyTime          time.Time `description:"指标修改时间"`
+	CreateTime             time.Time `description:"创建时间"`
+	UpdateSysUserId        int       `description:"变更人ID"`
+	UpdateSysUserRealName  string    `description:"变更人姓名"`
+	LatestDate             string    `description:"数据最新日期"`
+	LatestValue            float64   `description:"数据最新值"`
+	TerminalCode           string    `description:"终端编码,用于配置在机器上"`
+	ErDataUpdateDate       string    `description:"本次更新,数据发生变化的最早日期"`
+	UpdateResult           int       `description:"本次刷新操作结果:1成功,2失败"`
+	UpdateFailedReason     string    `description:"刷新失败原因"`
+	DataUpdateResult       int       `description:"数据更新结果:1成功,2失败"`
+	DataUpdateFailedReason string    `description:"数据未正常更新原因"`
+	DataUpdateTime         string    `description:"数据更新时间"`
+	IsSourceRefresh        int       `description:"是否为终端刷新到数据源的刷新操作:0否,1是"`
+}
+
+type EdbInfoUpdateLogItem struct {
+	Id                    uint64 `orm:"column(id);pk"`
+	EdbInfoId             int    `description:"指标ID"`
+	SourceName            string `description:"来源名称"`
+	Source                int    `description:"来源id"`
+	EdbCode               string `description:"指标编码"`
+	EdbName               string `description:"指标名称"`
+	EdbNameSource         string `description:"指标名称来源"`
+	Frequency             string `description:"频率"`
+	Unit                  string `description:"单位"`
+	StartDate             string `description:"起始日期"`
+	EndDate               string `description:"终止日期"`
+	SysUserId             int    `description:"创建人ID"`
+	SysUserRealName       string `description:"创建人姓名"`
+	UpdateSysUserId       int    `description:"变更人ID"`
+	UpdateSysUserRealName string `description:"变更人姓名"`
+	CreateTime            string
+	UniqueCode            string  `description:"指标唯一编码"`
+	LatestDate            string  `description:"数据最新日期"`
+	LatestValue           float64 `description:"数据最新值"`
+	TerminalCode          string  `description:"终端编码,用于配置在机器上"`
+	DataUpdateTime        string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate      string  `description:"本次更新,数据发生变化的最早日期"`
+}
+
+func AddEdbUpdateLog(item *EdbInfoUpdateLog) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type GetEdbUpdateLogResp struct {
+	List   []*EdbInfoUpdateLogItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbUpdateLogByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbInfoUpdateLog, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info_update_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbUpdateLogCount
+func GetEdbUpdateLogCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_info_update_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 145 - 0
models/data_stat/edb_info_update_stat.go

@@ -0,0 +1,145 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// EdbInfoUpdateStat 指标更新/刷新 汇总表(数据源明细表)
+type EdbInfoUpdateStat struct {
+	Id                     uint64    `orm:"column(id);pk"`
+	EdbInfoId              int       `description:"指标ID"`
+	SourceName             string    `description:"来源名称"`
+	Source                 int       `description:"来源id"`
+	EdbCode                string    `description:"指标编码"`
+	EdbName                string    `description:"指标名称"`
+	EdbNameSource          string    `description:"指标名称来源"`
+	Frequency              string    `description:"频率"`
+	Unit                   string    `description:"单位"`
+	StartDate              string    `description:"起始日期"`
+	EndDate                string    `description:"终止日期"`
+	SysUserId              int       `description:"创建人ID"`
+	SysUserRealName        string    `description:"创建人姓名"`
+	UniqueCode             string    `description:"指标唯一编码"`
+	EdbCreateTime          time.Time `description:"指标创建时间"`
+	EdbModifyTime          time.Time `description:"指标修改时间"`
+	CreateTime             time.Time
+	UpdateTime             string  `description:"刷新时间"`
+	LatestDate             string  `description:"数据最新日期"`
+	LatestValue            float64 `description:"数据最新值"`
+	TerminalCode           string  `description:"终端编码,用于配置在机器上"`
+	ErDataUpdateDate       string  `description:"本次更新,数据发生变化的最早日期"`
+	DataUpdateResult       int     `description:"数据更新结果:1成功,2失败"`
+	DataUpdateFailedReason string  `description:"数据未正常更新原因"`
+	DataUpdateTime         string  `description:"数据更新时间"`
+	UpdateResult           int     `description:"本次刷新操作结果:1成功,2失败"`
+	UpdateFailedReason     string  `description:"刷新失败原因"`
+	ModifyTime             string  `description:"修改时间"`
+	IsAdd                  int8    `description:"是否是当日新增的指标:1是,2否"`
+	NeedRefresh            int8    `description:"今日是否需要定时刷新,1需要,0不需要"` //todo 确认该字段
+	HasRefresh             int8    `description:"今日是否已刷新,1是,0否"`
+}
+
+type EdbInfoUpdateStatItem struct {
+	Id                     uint64  `orm:"column(id);pk"`
+	EdbInfoId              int     `description:"指标ID"`
+	SourceName             string  `description:"来源名称"`
+	Source                 int     `description:"来源id"`
+	EdbCode                string  `description:"指标编码"`
+	EdbName                string  `description:"指标名称"`
+	EdbNameSource          string  `description:"指标名称来源"`
+	Frequency              string  `description:"频率"`
+	Unit                   string  `description:"单位"`
+	StartDate              string  `description:"起始日期"`
+	SysUserId              int     `description:"创建人ID"`
+	SysUserRealName        string  `description:"创建人姓名"`
+	LatestDate             string  `description:"数据最新日期"`
+	CreateTime             string  `description:"创建时间"`
+	LatestValue            float64 `description:"数据最新值"`
+	TerminalCode           string  `description:"终端编码,用于配置在机器上"`
+	ErDataUpdateDate       string  `description:"本次更新,数据发生变化的最早日期"`
+	DataUpdateResult       int     `description:"数据更新结果:1成功,2失败"`
+	DataUpdateFailedReason string  `description:"数据未正常更新原因"`
+	DataUpdateTime         string  `description:"数据更新时间"`
+	UpdateResult           int     `description:"本次刷新操作结果:1成功,2失败"`
+	UpdateFailedReason     string  `description:"刷新失败原因"`
+	UpdateTime             string  `description:"刷新时间"`
+	IsAdd                  int8    `description:"是否是当日新增的指标:1是,2否"`
+	NeedRefresh            int8    `description:"今日是否需要定时刷新,1需要,0不需要"`
+	HasRefresh             int8    `description:"今日是否已刷新,1是,0否"`
+}
+
+type GetEdbUpdateStatResp struct {
+	List   []*EdbInfoUpdateStatItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbUpdateStatByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbInfoUpdateStat, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info_update_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbUpdateStatCount
+func GetEdbUpdateStatCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_info_update_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+type EdbUpdateFailedList struct {
+	TerminalCode             string `description:"终端编码,用于配置在机器上"`
+	SourceUpdateFailedReason string `description:"从终端刷新到数据源的数据未正常刷新原因"`
+	Frequency                string `description:"频率"`
+	SourceUpdateResult       int    `description:"从终端刷新到数据源的刷新结果:1成功,2失败"`
+	Num                      int
+}
+
+type GetEdbUpdateFailedResp struct {
+	List             []*EdbUpdateFailedList
+	Name             string `description:"终端名称"`
+	TerminalCode     string `description:"终端编码,用于配置在机器上"`
+	DirPath          string `description:"终端存放的文件夹路径"`
+	UpdateSuccessNum int    `description:"今日已更新成功指标数"`
+	UpdateFailedNum  int    `description:"今日已更新失败指标数"`
+}
+
+func GetEdbUpdateStatFailedGroupByCondition(condition string, pars []interface{}) (item []*EdbUpdateFailedList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT
+	terminal_code,
+	data_update_result as source_update_result,
+	frequency,
+	data_update_failed_reason as source_update_failed_reason,
+	count(*) as num
+FROM
+	edb_info_update_stat 
+WHERE
+	data_update_result != 0`
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY
+	data_update_result,
+	frequency,
+	data_update_failed_reason
+	ORDER BY count(*) desc`
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 75 - 0
models/data_stat/edb_source_stat.go

@@ -0,0 +1,75 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// EdbSourceStat 数据源统计表
+type EdbSourceStat struct {
+	Id                uint64    `orm:"column(id);pk"`
+	SourceName        string    `description:"来源名称"`
+	Source            int       `description:"来源id"`
+	TerminalCode      string    `description:"终端编码,用于配置在机器上"`
+	EdbNum            int32     `description:"指标总数"`
+	EdbNewNum         int32     `description:"今日新增指标数"`
+	EdbDelNum         int32     `description:"今日删除指标数"`
+	NeedRefreshNum    int       `description:"今日需刷新指标"`
+	HasRefreshNum     int       `description:"今日发起刷新任务指标数"`
+	UpdateSuccessNum  int       `description:"今日已更新成功指标数"`
+	UpdateFailedNum   int       `description:"今日已更新失败指标数"`
+	RefreshSuccessNum int       `description:"今日已刷新成功指标数"`
+	RefreshFailedNum  int       `description:"今日已刷新失败指标数"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"修改时间"`
+}
+
+type EdbInfoSourceStatItem struct {
+	Id                uint64 `orm:"column(id);pk"`
+	SourceName        string `description:"来源名称"`
+	Source            int    `description:"来源id"`
+	TerminalCode      string `description:"终端编码,用于配置在机器上"`
+	EdbNum            int32  `description:"指标总数"`
+	EdbNewNum         int32  `description:"今日新增指标数"`
+	EdbDelNum         int32  `description:"今日删除指标数"`
+	NeedRefreshNum    int    `description:"今日需刷新指标"`
+	HasRefreshNum     int    `description:"今日发起刷新任务指标数"`
+	UpdateSuccessNum  int    `description:"今日已更新成功指标数"`
+	UpdateFailedNum   int    `description:"今日已更新失败指标数"`
+	RefreshSuccessNum int    `description:"今日已刷新成功指标数"`
+	RefreshFailedNum  int    `description:"今日已刷新失败指标数"`
+}
+
+type GetEdbSourceStatResp struct {
+	List   []*EdbInfoSourceStatItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbSourceStatByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbSourceStat, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_source_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbSourceStatCount
+func GetEdbSourceStatCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_source_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 14 - 0
models/db.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage/excel"
 	future_good2 "eta/eta_api/models/data_manage/future_good"
 	"eta/eta_api/models/data_manage/supply_analysis"
+	"eta/eta_api/models/data_stat"
 	"eta/eta_api/models/eta_trial"
 	"eta/eta_api/models/ppt_english"
 	"eta/eta_api/models/sandbox"
@@ -151,6 +152,9 @@ func init() {
 		initEtaTrial()
 	}
 
+	// initDataStat 数据源统计管理相关表
+	initDataStat()
+
 	// 初始化EXCEL的表
 	initExcel()
 
@@ -433,6 +437,16 @@ func initEtaTrial() {
 	)
 }
 
+// initDataStat 数据源统计管理相关表
+func initDataStat() {
+	orm.RegisterModel(
+		new(data_stat.EdbInfoDeleteLog),  // 指标删除日志表
+		new(data_stat.EdbInfoUpdateStat), // 指标更新/刷新 汇总表(数据源明细表)
+		new(data_stat.EdbInfoUpdateLog),  // 指标更新/刷新日志列表
+		new(data_stat.EdbSourceStat),     // 数据源统计表
+	)
+}
+
 // initChartFramework 图库框架相关表
 func initChartFramework() {
 	orm.RegisterModel(

+ 18 - 14
models/english_report.go

@@ -419,21 +419,21 @@ type EnglishClassifyListResp struct {
 }
 
 // GetEnglishClassifyRootId 获取一级分类列表
-func GetEnglishClassifyRootId(startSize, pageSize int, keyWord string) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyRootId(startSize, pageSize int, keyword string) (items []*EnglishClassifyList, err error) {
 	sql := ``
 	o := orm.NewOrmUsingDB("rddp")
-	if keyWord != "" {
+	if keyword != "" {
 		sql = `SELECT * FROM (
 			                   SELECT * FROM english_classify
-                   WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
+                   WHERE parent_id=0 AND classify_name ?
                    UNION
                    SELECT * FROM english_classify
                    WHERE id IN(SELECT parent_id FROM english_classify
-                   WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
+                   WHERE parent_id>0 AND classify_name LIKE ?)
                    )AS t
                    ORDER BY sort ASC,create_time ASC
                    LIMIT ?,? `
-		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+		_, err = o.Raw(sql, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword), startSize, pageSize).QueryRows(&items)
 	} else {
 		sql = `SELECT * FROM english_classify WHERE parent_id=0 ORDER BY sort ASC,create_time ASC LIMIT ?,? `
 		_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
@@ -441,19 +441,19 @@ func GetEnglishClassifyRootId(startSize, pageSize int, keyWord string) (items []
 	return
 }
 
-func GetEnglishClassifyListCount(keyWord string) (count int, err error) {
+func GetEnglishClassifyListCount(keyword string) (count int, err error) {
 	sqlCount := ``
 	o := orm.NewOrmUsingDB("rddp")
-	if keyWord != "" {
+	if keyword != "" {
 		sqlCount = `SELECT  COUNT(1) AS count FROM (
                SELECT * FROM english_classify
-               WHERE parent_id=0 AND classify_name LIKE '%` + keyWord + `%'
+               WHERE parent_id=0 AND classify_name LIKE ?
                UNION
                SELECT * FROM english_classify
                WHERE id IN(SELECT parent_id FROM english_classify
-               WHERE parent_id>0 AND classify_name LIKE '%` + keyWord + `%')
+               WHERE parent_id>0 AND classify_name LIKE ?)
                )AS t `
-		err = o.Raw(sqlCount).QueryRow(&count)
+		err = o.Raw(sqlCount, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword)).QueryRow(&count)
 	} else {
 		sqlCount = `SELECT COUNT(1) AS count FROM english_classify WHERE parent_id=0`
 		err = o.Raw(sqlCount).QueryRow(&count)
@@ -462,18 +462,22 @@ func GetEnglishClassifyListCount(keyWord string) (count int, err error) {
 	return
 }
 
-func GetEnglishClassifyListByRootId(rootIds []int, keyWord string) (items []*EnglishClassifyList, err error) {
+func GetEnglishClassifyListByRootId(rootIds []int, keyword string) (items []*EnglishClassifyList, err error) {
 	sql := ``
+	pars := make([]interface{}, 0)
+
 	o := orm.NewOrmUsingDB("rddp")
-	if keyWord != "" {
+	if keyword != "" {
 		sql = `SELECT
 	a.*
 FROM
 	english_classify a
 	LEFT JOIN english_classify b ON a.root_id = b.id
 	LEFT JOIN english_classify c ON a.parent_id = c.id
-	WHERE a.parent_id>0 and a.classify_name LIKE '%` + keyWord + `%' and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
-		_, err = o.Raw(sql, rootIds).QueryRows(&items)
+	WHERE a.parent_id>0 and a.classify_name LIKE ? and a.root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `)`
+		pars = append(pars, utils.GetLikeKeyword(keyword))
+		pars = append(pars, rootIds)
+		_, err = o.Raw(sql, pars).QueryRows(&items)
 	} else {
 		sql = `SELECT * FROM english_classify WHERE parent_id>0 and root_id IN (` + utils.GetOrmInReplace(len(rootIds)) + `) `
 		_, err = o.Raw(sql, rootIds).QueryRows(&items)

+ 2 - 1
models/english_report_email.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -289,6 +290,6 @@ func GetEnCompanyIdsByKeyword(keyword string) (companyIds []int, err error) {
 			JOIN english_company AS b ON a.company_id = b.company_id AND b.is_deleted = 0
 			WHERE
 				a.is_deleted = 0 AND a.status = 1 AND (a.email LIKE ? OR a.mobile LIKE ? OR b.company_name LIKE ?)`
-	_, err = o.Raw(sql, keyword, keyword, keyword).QueryRows(&companyIds)
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword), utils.GetLikeKeyword(keyword)).QueryRows(&companyIds)
 	return
 }

+ 2 - 2
models/report_chapter_ticker.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 )
@@ -61,8 +62,7 @@ func GetDailyBaseColumnList(keyword string, typeId int) (list []*DailyBaseColumn
 	sql := ` SELECT * FROM daily_base_column WHERE 1 = 1 `
 	pars := make([]interface{}, 0)
 	if keyword != "" {
-		keyword = "%" + keyword + "%"
-		pars = append(pars, keyword)
+		pars = append(pars, utils.GetLikeKeyword(keyword))
 		sql += ` AND base_column_name like ? `
 	}
 	pars = append(pars, typeId)

+ 16 - 8
models/target.go

@@ -300,13 +300,16 @@ func EditEdbinfo(tradeCode, secName, unit, frequency, noticeTime string, classif
 
 func SearchTargetEntry(classifyId int, keyWord string) (items []*Edbinfo, err error) {
 	where := ""
+	pars := make([]interface{}, 0)
+	sql := `SELECT * FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' AND REMARK='手动' AND classify_id>0 AND classify_id=? `
+	pars = append(pars, classifyId)
 	if keyWord != "" {
-		where = `AND SEC_NAME LIKE '%` + keyWord + `%'`
+		sql += `AND SEC_NAME LIKE ? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
 	}
-	sql := `SELECT * FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' AND REMARK='手动' AND classify_id>0 AND classify_id=? `
 	sql += where
 	o := orm.NewOrmUsingDB("edb")
-	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
 	return
 }
 
@@ -484,7 +487,8 @@ func GetDataListForExport(startDate, endDate, frequency, keyWord string, classif
 	where := ``
 	var pars []interface{}
 	if keyWord != "" {
-		where = ` AND SEC_NAME LIKE '%` + keyWord + `%`
+		where = ` AND SEC_NAME LIKE ? `
+		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
 	}
 	if startDate != "" {
 		where += ` AND create_date>=? `
@@ -1192,6 +1196,8 @@ type EdbInfoItem struct {
 func GetTargetItemList(classifyId, edbShowType int, frequency, keyword, tradeCode string, classifyIdStrList []string) (items []*EdbInfoItem, err error) {
 	o := orm.NewOrmUsingDB("edb")
 
+	pars := make([]interface{}, 0)
+
 	sql := ` SELECT a.*,'' modify_date,'' STATUS FROM edbinfo AS a `
 	if edbShowType != 0 {
 		sql = ` SELECT a.*,b.DT,'' modify_date,'' STATUS FROM edbinfo AS a 
@@ -1215,7 +1221,8 @@ left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
 	}
 	//关键字
 	if keyword != "" {
-		sql += ` AND (a.SEC_NAME like "%` + keyword + `%"  or a.TRADE_CODE like "%` + keyword + `%" )`
+		sql += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 	}
 	//指定指标
 	if tradeCode != "" {
@@ -1231,7 +1238,7 @@ left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
 	sql += ` GROUP BY a.TRADE_CODE `
 
 	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
-	_, err = o.Raw(sql).QueryRows(&items)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 
 }
@@ -1240,8 +1247,9 @@ left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
 func GetLzItemList(keyword string) (items []*data_manage.LongzhongSurveyProduct, err error) {
 	o := orm.NewOrmUsingDB("edb")
 
-	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE '%" + keyword + "%'"
-	_, err = o.Raw(sql).QueryRows(&items)
+	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE ?"
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
+
 	return
 
 }

+ 126 - 0
routers/commentsRouter.go

@@ -2518,6 +2518,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "GetBatchChartRefreshResult",
+            Router: `/chart_info/batch_refresh/result`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoRefresh",
@@ -2608,6 +2617,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoBatchAdd",
+            Router: `/edb_info/batch/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "EdbChartList",
@@ -2662,6 +2680,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoExistCheck",
+            Router: `/edb_info/exist/check`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "EdbInfoFilter",
@@ -3931,6 +3958,105 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbDeleteLog",
+            Router: `/edb_delete_log`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateLog",
+            Router: `/edb_update_log`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateStat",
+            Router: `/edb_update_stat`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateFailedList",
+            Router: `/edb_update_stat/failed`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "Column",
+            Router: `/source_column`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EditColumn",
+            Router: `/source_column/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbSourceStat",
+            Router: `/source_stat`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "TerminalCodeList",
+            Router: `/terminal/code`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/terminal/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "Save",
+            Router: `/terminal/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "SetStatus",
+            Router: `/terminal/status/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
             Method: "Add",

+ 7 - 0
routers/router.go

@@ -17,6 +17,7 @@ import (
 	"eta/eta_api/controllers/data_manage/line_equation"
 	"eta/eta_api/controllers/data_manage/line_feature"
 	"eta/eta_api/controllers/data_manage/supply_analysis"
+	"eta/eta_api/controllers/data_stat"
 	"eta/eta_api/controllers/english_report"
 	"eta/eta_api/controllers/eta_trial"
 	"eta/eta_api/controllers/roadshow"
@@ -296,6 +297,12 @@ func init() {
 				&controllers.MeetingProbabilitiesController{},
 			),
 		),
+		web.NSNamespace("/data_stat/",
+			web.NSInclude(
+				&data_stat.EdbSourceStatController{},
+				&data_stat.EdbTerminalController{},
+			),
+		),
 		web.NSNamespace("/chart_framework",
 			web.NSInclude(
 				&data_manage.ChartFrameworkController{},

+ 21 - 2
services/data/base_edb_lib.go

@@ -80,6 +80,21 @@ func AddEdbData(source int, edbCode string) (resp *models.BaseResponse, err erro
 	return
 }
 
+// AddEdbData 新增指标数据
+func AddEdbDataWindWsd(source int, stockCode, edbCode string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	param["StockCode"] = stockCode
+	param["Source"] = source
+	urlStr := `wind/wsd/add`
+	if urlStr == "" {
+		err = fmt.Errorf("未实现该指标的刷新接口,请联系管理员")
+		return
+	}
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
 type AddPredictEdbDataResponse struct {
 	Ret         int
 	Msg         string
@@ -125,7 +140,7 @@ func BatchSavePredictEdbData(edbInfoCalculateBatchSaveReqStr string) (resp *AddP
 }
 
 // RefreshEdbData 刷新指标数据
-func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *models.BaseResponse, err error) {
+func RefreshEdbData(edbInfoId, source, subSource int, edbCode, startDate string) (resp *models.BaseResponse, err error) {
 	param := make(map[string]interface{})
 	param["EdbCode"] = edbCode
 	param["EdbInfoId"] = edbInfoId
@@ -136,7 +151,11 @@ func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *mod
 	case utils.DATA_SOURCE_THS:
 		urlStr = "ths/refresh"
 	case utils.DATA_SOURCE_WIND:
-		urlStr = "wind/refresh"
+		if subSource == 0 {
+			urlStr = "wind/refresh"
+		} else {
+			urlStr = "wind/wsd/refresh"
+		}
 	case utils.DATA_SOURCE_PB:
 		urlStr = "pb/refresh"
 	case utils.DATA_SOURCE_PB_FINANCE:

+ 121 - 232
services/data/chart_info.go

@@ -157,6 +157,7 @@ func BatchChartInfoRefresh(chartInfoList []*data_manage.ChartInfo) (err error) {
 // refreshBaseEdbInfo 刷新基础指标
 func refreshBaseEdbInfo(bv *data_manage.EdbInfo) (err error, errMsg string) {
 	source := bv.Source
+	subSource := bv.SubSource
 	edbInfoId := bv.EdbInfoId
 	edbCode := bv.EdbCode
 	//startDate := bv.StartDate
@@ -188,7 +189,7 @@ func refreshBaseEdbInfo(bv *data_manage.EdbInfo) (err error, errMsg string) {
 	startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
 
 	fmt.Println("source:", source)
-	respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
+	respItem, err := RefreshEdbData(edbInfoId, source, subSource, edbCode, startDate)
 	if err != nil {
 		errMsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
 		return
@@ -198,221 +199,7 @@ func refreshBaseEdbInfo(bv *data_manage.EdbInfo) (err error, errMsg string) {
 		return
 	}
 
-	//if source == utils.DATA_SOURCE_THS {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = RefreshEdbDataByThs(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByThs Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshThsEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshThsEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_WIND {
-	//	//endDate := time.Now().Format(utils.FormatDate)
-	//	//err = RefreshEdbDataByWind(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByWind Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshWindEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshWindEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_PB {
-	//	//startDate := sTime.Format(utils.FormatDateUnSpace)
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDateUnSpace)
-	//	//err = RefreshEdbDataByPb(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByPb Err:" + err.Error()
-	//	//}
-	//	startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDateUnSpace)
-	//	respItem, err :=RefreshPbEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshPbEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_MANUAL {
-	//	//fmt.Println("RefreshAllEdbDataByManual:" + edbCode)
-	//	//err = data_manage.RefreshAllEdbDataByManual(edbInfoId, bv.Source, edbCode)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByManual Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshManualEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshManualEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_LZ {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByLz(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByLz Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshLzEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshLzEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_YS {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshAllEdbDataByYs(edbInfoId, source, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByYs Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshSmmEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshSmmEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_GL {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByGl(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByGl Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshMysteelEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshMysteelEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_LT {
-	//	//endDate := time.Now().Format(utils.FormatDate)
-	//	//err = data_manage.RefreshAllEdbDataByLt(edbInfoId, source, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshAllEdbDataByLT Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshLtEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshLtEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_ZZ {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByZz(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshAllEdbDataByZz Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshZzEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshZzEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_DL {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByDl(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshAllEdbDataByDl Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshDlEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshDlEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_SH {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataBySh(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshAllEdbDataBySh Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshShEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshShEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_CFFEX {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByCffex(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshAllEdbDataByCffex Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshCffexEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshCffexEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_SHFE {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByShfe(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshAllEdbDataByShfe Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshShfeEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshShfeEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//} else if source == utils.DATA_SOURCE_GIE {
-	//	//endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-	//	//err = data_manage.RefreshEdbDataByGie(edbInfoId, edbCode, startDate, endDate)
-	//	//if err != nil {
-	//	//	errmsg = "RefreshEdbDataByGie Err:" + err.Error()
-	//	//}
-	//	respItem, err :=RefreshGieEdbData(edbInfoId,edbCode,startDate)
-	//	if err != nil {
-	//		errmsg=errors.New("RefreshGieEdbData Err:"+err.Error()).Error()
-	//		return err
-	//	}
-	//	if respItem.Ret != 200 {
-	//		errmsg=errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
-	//		return err
-	//	}
-	//}
-
-	maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+	maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 	if err != nil {
 		return
 	}
@@ -725,7 +512,7 @@ func getEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 		//var newEdbInfo *data_manage.EdbInfo
 		switch v.EdbInfoCategoryType {
 		case 0:
-			dataList, err = data_manage.GetEdbDataList(v.Source, v.EdbInfoId, startDateReal, endDate)
+			dataList, err = data_manage.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, startDateReal, endDate)
 		case 1:
 			_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(v.EdbInfoId, startDateReal, endDate, true)
 		default:
@@ -1025,6 +812,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	itemLength := len(result.List[length-1].Items)
 	//获取数据的最新日期
 	lastDate := result.List[length-1].Items[itemLength-1].DataTime
+	maxY := result.List[length-1].Year
 	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
 	if tmpErr != nil {
 		err = tmpErr
@@ -1039,6 +827,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	quarterMap := make(map[string][]*data_manage.EdbDataList, 0)
 
 	//整理出日期
+	var startTmpT, endTmpT time.Time
 	idx := 1
 	chartLegendMap := make(map[string]int, 0)
 	for currentStartYear := startYear; currentStartYear <= endYear; currentStartYear++ {
@@ -1077,6 +866,8 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 		}
 		dataMap[showName] = item
 		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
+		startTmpT = startT
+		endTmpT = endT
 		chartLegendMap[showName] = idx
 		idx++
 		if lastDateT.Before(endT) {
@@ -1099,7 +890,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	}
 
 	//判断哪些点应该落在同一条时间线上
-	maxY := lastDateT.Year()
+	/*maxY := lastDateT.Year()
 	changeFlag := false
 	if lastDateT.Month() >= 11 {
 		maxY = maxY + 1
@@ -1107,22 +898,28 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	if maxY < nowYear {
 		changeFlag = true
 		maxY = nowYear
-	}
-	endTmp := fmt.Sprintf("%d-%s", maxY, xEndDate)
+	}*/
+	/*endTmp := fmt.Sprintf("%d-%s", maxY, xEndDate)
 	endTmpT, _ := time.Parse(utils.FormatDate, endTmp)
 	minY := maxY
 	if jumpYear == 1 {
 		minY = maxY - 1
 	}
 	startTmp := fmt.Sprintf("%d-%s", minY, xStartDate)
-	startTmpT, _ := time.Parse(utils.FormatDate, startTmp)
+	startTmpT, _ := time.Parse(utils.FormatDate, startTmp)*/
 
 	fmt.Println("横轴截取日" + startTmpT.Format(utils.FormatDate) + " " + endTmpT.Format(utils.FormatDate))
+	fmt.Printf("lastDateT.Year() 为%d \n", lastDateT.Year())
+	fmt.Printf("maxY 为%d \n", maxY)
 	for name, dateItem := range dataMap {
-		lv, ok1 := yearDataListMap[dateItem.EndDate.Year()]
-		if changeFlag {
-			lv, ok1 = yearDataListMap[dateItem.StartDate.Year()]
+		tY := dateItem.EndDate.Year()
+		if lastDateT.Month() >= 11 {
+			if maxY > endTmpT.Year() {
+				tY = tY + 1
+			}
 		}
+		lv, ok1 := yearDataListMap[tY]
+		fmt.Printf("name %s yearDataListMap[%d]\n", name, tY)
 		if !ok1 {
 			continue
 		}
@@ -1434,6 +1231,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error, isAsync bool) {
 
 	// 批量刷新
 	err, isAsync = EdbInfoRefreshAllFromBaseV3(edbIdList, false, false)
+
 	if err != nil {
 		return
 	}
@@ -1445,7 +1243,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error, isAsync bool) {
 // @author Roc
 // @datetime 2022-09-16 10:15:38
 // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成  只获取使用的指标id,然后遍历去调用“指标刷新服务”
-func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error, isAsync bool) {
+func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo, redisKey string) (err error, isAsync bool) {
 	if len(chartInfoList) <= 0 {
 		return
 	}
@@ -1454,15 +1252,28 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error,
 		chartInfoIdSlice = append(chartInfoIdSlice, chartInfo.ChartInfoId)
 	}
 
-	var errmsg string
+	var errMsg string
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errmsg, 3)
+			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
 			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
-			fmt.Println("ChartInfoRefresh Err:" + errmsg)
+			fmt.Println("ChartInfoRefresh Err:" + errMsg)
 		}
 	}()
 
+	// 是否删除缓存
+	isDeleteCache := true
+	if redisKey != `` {
+		//设置最多10分钟缓存
+		utils.Rc.SetNX(redisKey, 1, time.Minute*10)
+		defer func() {
+			if isDeleteCache {
+				utils.Rc.Delete(redisKey)
+			}
+		}()
+	}
+
+	// 获取需要刷新的指标信息
 	edbIdList := make([]int, 0)
 	edbInfoIdMap := make(map[int]int)
 	edbMappingList, err := data_manage.GetChartEdbMappingListByIdList(chartInfoIdSlice)
@@ -1473,10 +1284,88 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error,
 		}
 	}
 
-	// 批量刷新
-	err, isAsync = EdbInfoRefreshAllFromBaseV3(edbIdList, false, false)
-	if err != nil {
-		return
+	// 获取需要刷新的指标列表
+	newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr := getEdbInfoIdList(edbIdList)
+
+	// 需要刷新的指标数量
+	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
+
+	if totalEdbInfo > 20 { // 关联指标过多的时候,异步刷新
+		isAsync = true
+		isDeleteCache = false // 不删除缓存
+		go refreshChartEdbInfo(chartInfoList, redisKey, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	} else {
+		err = edbInfoRefreshAll(false, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+
+		//清除图表缓存
+		for _, v := range chartInfoList {
+			key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
+			_ = utils.Rc.Delete(key)
+		}
+	}
+
+	return
+}
+
+// refreshChartEdbInfo
+// @Description: 刷新图表中的质保列表
+// @author: Roc
+// @datetime 2023-12-01 16:05:39
+// @param chartInfoList []*data_manage.ChartInfo
+// @param redisKey string
+// @param newBaseEdbInfoArr []*data_manage.EdbInfo
+// @param newBasePredictEdbInfoArr []*data_manage.EdbInfo
+// @param newCalculateMap map[int]*data_manage.EdbInfo
+// @param newPredictCalculateMap map[int]*data_manage.EdbInfo
+// @param calculateArr []int
+// @param predictCalculateArr []int
+func refreshChartEdbInfo(chartInfoList []*data_manage.ChartInfo, redisKey string, newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) {
+	edbInfoRefreshAll(false, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+
+	//清除图表缓存
+	for _, v := range chartInfoList {
+		key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
+		_ = utils.Rc.Delete(key)
+	}
+	// 如果是有插入redisKey,那么刷新结束后就清除缓存
+	if redisKey != `` {
+		utils.Rc.Delete(redisKey)
+	}
+}
+
+// GetBatchChartRefreshKey
+// @Description: 获取批量刷新key
+// @author: Roc
+// @datetime 2023-11-30 13:30:26
+// @param source string
+// @param reportId int
+// @param reportChapterId int
+// @return string
+func GetBatchChartRefreshKey(source string, reportId, reportChapterId int) string {
+	if source == `` {
+		return ``
+	}
+
+	return fmt.Sprint("batch_chart_refresh:", source, ":", reportId, ":", reportChapterId)
+}
+
+// CheckBatchChartRefreshResult
+// @Description: 判断报告中的图表是否刷新完成
+// @author: Roc
+// @datetime 2023-11-30 13:30:26
+// @param source string
+// @param reportId int
+// @param reportChapterId int
+// @return string
+func CheckBatchChartRefreshResult(source string, reportId, reportChapterId int) (refreshResult bool) {
+	refreshResult = true
+	redisKey := GetBatchChartRefreshKey(source, reportId, reportChapterId)
+	if redisKey != `` {
+		// 如果找到了key,那么就是还在更新中
+		isOk := utils.Rc.IsExist(redisKey)
+		if isOk {
+			refreshResult = false
+		}
 	}
 
 	return

+ 4 - 4
services/data/correlation/chart_info.go

@@ -230,7 +230,7 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEd
 	aDataList := make([]*data_manage.EdbDataList, 0)
 	switch baseEdbInfo.EdbInfoCategoryType {
 	case 0:
-		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
+		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.SubSource, baseEdbInfo.EdbInfoId, startDate, endDate)
 	case 1:
 		_, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
 	default:
@@ -242,7 +242,7 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEd
 	bDataList := make([]*data_manage.EdbDataList, 0)
 	switch changeEdbInfo.EdbInfoCategoryType {
 	case 0:
-		bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
+		bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.SubSource, changeEdbInfo.EdbInfoId, "", "")
 	case 1:
 		_, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
 	default:
@@ -434,7 +434,7 @@ func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *d
 	aDataList := make([]*data_manage.EdbDataList, 0)
 	switch baseEdbInfo.EdbInfoCategoryType {
 	case 0:
-		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
+		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.SubSource, baseEdbInfo.EdbInfoId, startDate, endDate)
 	case 1:
 		_, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, true)
 	default:
@@ -446,7 +446,7 @@ func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *d
 	bDataList := make([]*data_manage.EdbDataList, 0)
 	switch changeEdbInfo.EdbInfoCategoryType {
 	case 0:
-		bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.EdbInfoId, "", "")
+		bDataList, err = data_manage.GetEdbDataList(changeEdbInfo.Source, changeEdbInfo.SubSource, changeEdbInfo.EdbInfoId, "", "")
 	case 1:
 		_, bDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(changeEdbInfo.EdbInfoId, "", "", false)
 	default:

+ 8 - 6
services/data/edb_classify.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data_stat"
 	"eta/eta_api/utils"
 	"fmt"
 	"strconv"
@@ -662,13 +663,15 @@ func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, reque
 		}
 
 		//真实删除
-		tmpErr = data_manage.DeleteEdbInfoAndData(edbInfo.EdbInfoId, edbInfo.Source)
+		tmpErr = data_manage.DeleteEdbInfoAndData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource)
 		if tmpErr != nil {
 			errMsg = "删除失败"
 			err = errors.New("删除失败,Err:" + tmpErr.Error())
 			return
 		}
 
+		go data_stat.AddEdbDeleteLog(edbInfo, sysUser)
+
 		// 如果删除的指标是自定义分析的来源,那么还需要删除指标与excel的关系
 		if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_ZDYFX {
 			tmpErr = excel.DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
@@ -1176,11 +1179,10 @@ func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType in
 		button.OpButton = true
 		button.DeleteButton = true
 		button.MoveButton = true
-
-		// ETA指标的基础指标才允许插入值
-		if edbInfoType == 0 && edbType == 1 {
-			button.InsertNewDataButton = true
-		}
+	}
+	// ETA指标的基础指标才允许插入值
+	if edbInfoType == 0 && edbType == 1 {
+		button.InsertNewDataButton = true
 	}
 	button.ShowEdbRelation = true
 	button.ShowChartRelation = true

+ 3 - 3
services/data/edb_data.go

@@ -201,7 +201,7 @@ func GetChartEdbSeasonalData(calendar, startDate, endDate string, edbInfo *data_
 
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, startDateReal, endDate)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, startDateReal, endDate)
 	case 1:
 		_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, startDateReal, endDate, false)
 	default:
@@ -337,7 +337,7 @@ func GetDateData(edbInfo *data_manage.EdbInfo, startDate, endDate string) (item
 	var dataList []*data_manage.EdbDataList
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, startDate, endDate)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, startDate, endDate)
 	case 1:
 		_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, startDate, endDate, false)
 	default:
@@ -362,7 +362,7 @@ func GetEdbBeforeAndAfterDateData(edbInfo *data_manage.EdbInfo, startDate, endDa
 	var dataList []*data_manage.EdbDataList
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, startDate, endDate)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, startDate, endDate)
 	case 1:
 		_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, startDate, endDate, true)
 	default:

+ 250 - 323
services/data/edb_info.go

@@ -73,9 +73,9 @@ func EdbInfoRefreshAllFromBaseV3Bak(edbInfoIdList []int, refreshAll, isSync bool
 //	@datetime 2023-10-23 09:57:55
 //	@param edbInfoIdList []int
 //	@param refreshAll bool
-//	@param isSync bool
+//	@param isSync bool 是否同步执行
 //	@return err error
-//	@return isAsync bool
+//	@return isAsync bool 是否异步刷新
 func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (err error, isAsync bool) {
 	var errmsg string
 	defer func() {
@@ -84,6 +84,35 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (
 			go alarm_msg.SendAlarmMsg("EdbInfoRefreshAllFromBaseV3,Err"+err.Error()+";errMsg:"+errmsg, 3)
 		}
 	}()
+
+	// 获取需要刷新的指标列表
+	newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr := getEdbInfoIdList(edbInfoIdList)
+
+	// 需要刷新的指标数量
+	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
+
+	if totalEdbInfo <= 20 || isSync {
+		err = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	} else {
+		isAsync = true
+		go edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	}
+
+	return
+}
+
+// getEdbInfoIdList
+// @Description: 获取待更新的指标列表
+// @author: Roc
+// @datetime 2023-12-01 16:19:42
+// @param edbInfoIdList []int
+// @return newBaseEdbInfoArr []*data_manage.EdbInfo
+// @return newBasePredictEdbInfoArr []*data_manage.EdbInfo
+// @return newCalculateMap map[int]*data_manage.EdbInfo
+// @return newPredictCalculateMap map[int]*data_manage.EdbInfo
+// @return calculateArr []int
+// @return predictCalculateArr []int
+func getEdbInfoIdList(edbInfoIdList []int) (newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) {
 	traceEdbInfoList, err := TraceEdbInfoByEdbInfoIdList(edbInfoIdList)
 	if err != nil {
 		return
@@ -92,16 +121,16 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (
 	existEdbInfoIdMap := make(map[int]int)
 
 	// 基础指标
-	newBaseEdbInfoArr := make([]*data_manage.EdbInfo, 0)
-	newBasePredictEdbInfoArr := make([]*data_manage.EdbInfo, 0)
+	newBaseEdbInfoArr = make([]*data_manage.EdbInfo, 0)
+	newBasePredictEdbInfoArr = make([]*data_manage.EdbInfo, 0)
 	newBaseMap := make(map[int]*data_manage.EdbInfo)
 	newPredictBaseMap := make(map[int]*data_manage.EdbInfo)
 
 	// 计算指标
-	newCalculateMap := make(map[int]*data_manage.EdbInfo)
-	newPredictCalculateMap := make(map[int]*data_manage.EdbInfo)
-	calculateArr := make([]int, 0)
-	predictCalculateArr := make([]int, 0)
+	newCalculateMap = make(map[int]*data_manage.EdbInfo)
+	newPredictCalculateMap = make(map[int]*data_manage.EdbInfo)
+	calculateArr = make([]int, 0)
+	predictCalculateArr = make([]int, 0)
 
 	// 获取关联指标
 	for _, traceEdbInfo := range traceEdbInfoList {
@@ -145,16 +174,6 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (
 	// 预测计算指标的id
 	sort.Ints(predictCalculateArr)
 
-	// 需要刷新的指标数量
-	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
-
-	if totalEdbInfo <= 20 || isSync {
-		err = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
-	} else {
-		isAsync = true
-		go edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
-	}
-
 	return
 }
 
@@ -264,7 +283,7 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 			}
 			startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
 		}
-		result, err := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.EdbCode, startDate)
+		result, err := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.SubSource, bv.EdbCode, startDate)
 		if err != nil {
 			fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
 			errmsg = "RefreshBaseEdbData Err:" + err.Error()
@@ -413,7 +432,7 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 			return fmt.Errorf("刷新失败, err:", errmsg)
 		}
 		for _, bv := range predictEdbConfCalculateMappingDetailList {
-			result, err := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, bv.EdbCode, "")
+			result, err := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, utils.DATA_SUB_SOURCE_EDB, bv.EdbCode, "")
 			if err != nil {
 				fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err", time.Now())
 				errmsg = "RefreshBasePredictEdbData Err:" + err.Error()
@@ -534,7 +553,7 @@ func EdbInfoRefresh(edbInfo *data_manage.EdbInfoView, refreshAll bool) (err erro
 				}
 				startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
 			}
-			result, err := RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, startDate)
+			result, err := RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, startDate)
 			if err != nil {
 				fmt.Println(edbInfo.EdbInfoId, "RefreshBaseEdbData err", time.Now())
 				errmsg = "RefreshBaseEdbData Err:" + err.Error()
@@ -636,7 +655,7 @@ func EdbInfoRefresh(edbInfo *data_manage.EdbInfoView, refreshAll bool) (err erro
 					return fmt.Errorf("刷新失败, err:", errmsg)
 				}
 				for _, bv := range predictEdbConfCalculateMappingDetailList {
-					result, err := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, bv.EdbCode, "")
+					result, err := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, utils.DATA_SUB_SOURCE_EDB, bv.EdbCode, "")
 					if err != nil {
 						fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err", time.Now())
 						errmsg = "RefreshBasePredictEdbData Err:" + err.Error()
@@ -1167,271 +1186,6 @@ func RefreshManualData(edbCode string) {
 	return
 }
 
-// EdbInfoReplace 替换指标v2版本(更换时间:2022年01月05日15:33:42)
-func EdbInfoReplace(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, sysAdminId int, sysAdminRealName string) (replaceChartTotal, replaceCalculateTotal int, err error) {
-	defer func() {
-		if err != nil {
-			fmt.Println("ERR:", err.Error())
-		}
-	}()
-	mappingList, replaceChartTotal, replaceCalculateTotal, err := data_manage.ReplaceChartEdb(oldEdbInfo, newEdbInfo)
-	if err != nil {
-		return
-	}
-	//更新指标
-	err = replaceRelationEdbInfo(mappingList, oldEdbInfo, newEdbInfo, sysAdminId, sysAdminRealName)
-	return
-}
-
-// replaceRelationEdbInfo 刷新指标
-func replaceRelationEdbInfo(mappingList []*data_manage.EdbInfoCalculateMapping, oldEdbInfo, newEdbInfo *data_manage.EdbInfo, sysAdminId int, sysAdminRealName string) (err error) {
-	errmsg := ``
-	defer func() {
-		if errmsg != "" {
-			fmt.Println("errmsg:" + errmsg)
-		}
-		if err != nil && errmsg != "" {
-			go alarm_msg.SendAlarmMsg("替换关联指标失败提醒,errmsg:"+errmsg, 3)
-			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"替换指标失败提醒", "errmsg:"+errmsg, utils.EmailSendToUsers)
-		}
-	}()
-	//获取计算指标关联指标
-	allMappingList := make([]*data_manage.EdbInfoCalculateMapping, 0)
-	allMapping := make(map[int]int)
-	tmpMapping := make(map[int]int)
-	for _, v := range mappingList {
-		if _, ok := allMapping[v.EdbInfoId]; !ok {
-			allMappingList = append(allMappingList, v)
-		}
-		newList, _ := data_manage.GetAllCalculateV2(v.EdbInfoId, newEdbInfo.EdbInfoId, tmpMapping)
-		for _, nv := range newList {
-			if _, ok := allMapping[v.EdbInfoId]; !ok {
-				allMappingList = append(allMappingList, nv)
-			}
-			allMapping[v.EdbInfoId] = v.EdbInfoId
-		}
-		allMapping[v.EdbInfoId] = v.EdbInfoId
-	}
-	for mk, mv := range allMappingList { //原指标关联的所有计算指标
-		fmt.Println("mk/mv", mk, mv)
-		//重新计算计算指标
-		{
-			edbInfo, tmpErr := data_manage.GetEdbInfoById(mv.EdbInfoId) //计算指标
-			err = tmpErr
-			if err != nil {
-				if err.Error() == utils.ErrNoRow() {
-					errmsg = "计算指标已被删除"
-				} else {
-					errmsg = "获取计算指标失败:err:" + err.Error()
-				}
-				return
-			}
-
-			fromEdbInfoList, tmpErr := data_manage.GetEdbInfoCalculateDetail(mv.EdbInfoId, edbInfo.Source)
-			err = tmpErr
-			if err != nil {
-				errmsg = "获取计算指标失败:err:" + err.Error()
-				return
-			}
-			if len(fromEdbInfoList) <= 0 {
-				errmsg = "计算指标所依赖指标不存在"
-				err = fmt.Errorf("计算指标所依赖指标不存在")
-				return
-			}
-			fromEdbInfoItem := fromEdbInfoList[0]
-			if fromEdbInfoItem == nil {
-				return
-			}
-			fromEdbInfo, tmpErr := data_manage.GetEdbInfoById(fromEdbInfoItem.FromEdbInfoId)
-			err = tmpErr
-			if err != nil {
-				errmsg = "获取计算指标 来源指标失败:err:" + err.Error()
-				return
-			}
-			edbCode := edbInfo.EdbCode
-			//uniqueCode := edbInfo.UniqueCode
-			sourName := edbInfo.SourceName
-			source := edbInfo.Source
-			edbInfoId := edbInfo.EdbInfoId
-
-			req := &data_manage.EdbInfoCalculateBatchSaveReqByEdbLib{
-				AdminId:          sysAdminId,
-				AdminName:        sysAdminRealName,
-				EdbInfoId:        edbInfoId,
-				EdbName:          edbInfo.EdbName,
-				Frequency:        edbInfo.Frequency,
-				Unit:             edbInfo.Unit,
-				ClassifyId:       edbInfo.ClassifyId,
-				Formula:          edbInfo.CalculateFormula, //N数值移动平均计算、环比值、环差值
-				FromEdbInfoId:    fromEdbInfoList[0].FromEdbInfoId,
-				Source:           edbInfo.Source,
-				MoveType:         edbInfo.MoveType,
-				MoveFrequency:    edbInfo.MoveFrequency,
-				CalculateFormula: edbInfo.CalculateFormula,
-				EdbInfoIdArr:     nil,
-			}
-
-			if source == utils.DATA_SOURCE_CALCULATE_ZJPJ {
-				edbInfoIdArr := make([]data_manage.EdbInfoFromTag, 0)
-				//A指标
-				aFromEdbInfoId := fromEdbInfoList[0].FromEdbInfoId
-				//找出需要替换的指标
-				{
-					for _, v := range fromEdbInfoList {
-						if v.FromTag == "A" {
-							if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-								aFromEdbInfoId = newEdbInfo.EdbInfoId
-							} else {
-								aFromEdbInfoId = fromEdbInfoList[0].FromEdbInfoId
-							}
-						}
-						if v.FromTag == "B" {
-							if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-								edbInfoIdArr = append(edbInfoIdArr, data_manage.EdbInfoFromTag{
-									EdbInfoId: newEdbInfo.EdbInfoId,
-									FromTag:   v.FromTag,
-								})
-							} else {
-								edbInfoIdArr = append(edbInfoIdArr, data_manage.EdbInfoFromTag{
-									EdbInfoId: v.FromEdbInfoId,
-									FromTag:   v.FromTag,
-								})
-							}
-						}
-					}
-				}
-
-				req.FromEdbInfoId = aFromEdbInfoId
-				req.EdbInfoIdArr = edbInfoIdArr
-
-				sourName = "直接拼接"
-				if len(req.EdbInfoIdArr) != 1 {
-					errmsg = "请传入拼接日期之后的指标"
-					err = fmt.Errorf("请传入拼接日期之后的指标")
-					return
-				}
-
-				secondEdbInfoReq := req.EdbInfoIdArr[0]
-				secondEdbInfo, tmpErr := data_manage.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
-				err = tmpErr
-				if err != nil {
-					errmsg = "获取拼接日期之后的指标信息失败:Err:" + err.Error()
-					err = fmt.Errorf("获取拼接日期之后的指标信息失败:Err:" + err.Error())
-					return
-				}
-
-				if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
-					errmsg = "两个指标不允许为同一个"
-					err = fmt.Errorf("两个指标不允许为同一个")
-					return
-				}
-			} else if source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //累计值同比拼接
-				edbInfoIdArr := make([]data_manage.EdbInfoFromTag, 0)
-				//A指标
-				aFromEdbInfoId := fromEdbInfoList[0].FromEdbInfoId
-				// 找出需要替换的指标
-				{
-					for _, v := range fromEdbInfoList {
-						if v.FromTag == "A" {
-							if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-								aFromEdbInfoId = newEdbInfo.EdbInfoId
-							} else {
-								aFromEdbInfoId = fromEdbInfoList[0].FromEdbInfoId
-							}
-						}
-						if v.FromTag == "B" {
-							if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-								edbInfoIdArr = append(edbInfoIdArr, data_manage.EdbInfoFromTag{
-									EdbInfoId: newEdbInfo.EdbInfoId,
-									FromTag:   v.FromTag,
-								})
-							} else {
-								edbInfoIdArr = append(edbInfoIdArr, data_manage.EdbInfoFromTag{
-									EdbInfoId: v.FromEdbInfoId,
-									FromTag:   v.FromTag,
-								})
-							}
-						}
-					}
-				}
-
-				req.FromEdbInfoId = aFromEdbInfoId
-				req.EdbInfoIdArr = edbInfoIdArr
-
-				sourName = "累计值同比拼接"
-
-				if fromEdbInfo.Frequency != "月度" {
-					errmsg = "累计值同比拼接,待拼接指标只能筛选月度指标"
-					err = fmt.Errorf("累计值同比拼接,待拼接指标只能筛选月度指标")
-					return
-				}
-				if len(req.EdbInfoIdArr) != 1 {
-					errmsg = "请传入同比值指标"
-					err = fmt.Errorf("请传入同比值指标")
-					return
-				}
-
-				secondEdbInfoReq := req.EdbInfoIdArr[0]
-				tbzEdbInfo, tmpErr := data_manage.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
-				err = tmpErr
-				if err != nil {
-					errmsg = "获取同比值指标信息失败:Err:" + err.Error()
-					err = fmt.Errorf("获取同比值指标信息失败:Err:" + err.Error())
-					return
-				}
-				if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
-					errmsg = "指标必须是传入同比值指标类型"
-					err = fmt.Errorf("指标必须是传入同比值指标类型")
-					return
-				}
-				if tbzEdbInfo.Frequency != "月度" {
-					errmsg = "同比值指标只能筛选月度指标"
-					err = fmt.Errorf("同比值指标只能筛选月度指标")
-					return
-				}
-
-				if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
-					errmsg = "两个指标不允许为同一个"
-					err = fmt.Errorf("两个指标不允许为同一个")
-					return
-				}
-			} else {
-				errmsg = "无效计算方式,source:" + strconv.Itoa(source)
-				err = fmt.Errorf("无效计算方式,source:" + strconv.Itoa(source))
-				return
-			}
-
-			// 调用指标库去更新
-			reqJson, tmpErr := json.Marshal(req)
-			if tmpErr == nil {
-				respItem, tmpErr := EditEdbCalculateData(string(reqJson))
-				if err != nil {
-					err = tmpErr
-					return
-				}
-				if respItem.Ret != 200 {
-					err = errors.New("修改失败")
-					return
-				}
-			} else {
-				err = tmpErr
-			}
-
-			maxAndMinItem, tmpErr := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
-			err = tmpErr
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				errmsg = "生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
-				err = fmt.Errorf("生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error())
-				return
-			}
-			if maxAndMinItem != nil {
-				err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-			}
-		}
-	}
-	return
-}
-
 // 获取频度的英文版
 func GetFrequencyEn(frequency string) (frequencyEn string) {
 	switch frequency {
@@ -1955,7 +1709,7 @@ func GetMoveEdbChartList(source, userId int, keyword, classify string, startSize
 	case 1: //手工数据指标
 		if keyword != "" {
 			condition += ` AND (a.SEC_NAME LIKE ? OR a.TRADE_CODE like ? ) `
-			pars = append(pars, `%`+keyword+`%`, `%`+keyword+`%`)
+			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 		}
 		if userId > 0 {
 			condition += ` AND a.user_id = ? `
@@ -2006,7 +1760,7 @@ func GetMoveEdbChartList(source, userId int, keyword, classify string, startSize
 	case 2: //钢联化工数据库
 		if keyword != `` {
 			condition += " AND (index_name like ? OR index_code like ? OR sys_user_real_name like ? ) "
-			pars = append(pars, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
+			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
 		}
 		if userId > 0 {
 			condition += ` AND sys_user_id = ? `
@@ -2040,7 +1794,7 @@ func GetMoveEdbChartList(source, userId int, keyword, classify string, startSize
 	case 3, 4: //ETA指标库、ETA预测指标
 		if keyword != `` {
 			condition += " AND (edb_code like ? OR edb_name like ? OR sys_user_real_name like ? ) "
-			pars = append(pars, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
+			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
 		}
 		if userId > 0 {
 			condition += ` AND sys_user_id = ? `
@@ -2080,7 +1834,7 @@ func GetMoveEdbChartList(source, userId int, keyword, classify string, startSize
 	case 5: //图库
 		if keyword != `` {
 			condition += " AND (chart_name like ?  OR sys_user_real_name like ? ) "
-			pars = append(pars, "%"+keyword+"%", "%"+keyword+"%")
+			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
 		}
 		if userId > 0 {
 			condition += ` AND sys_user_id = ? `
@@ -2485,7 +2239,7 @@ func GetEdbChartClassifyList(source int) (resp data_manage.EdbChartClassifyResp,
 }
 
 // EdbInfoAdd 添加指标到指标库
-func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 	//判断指标名称是否存在
 	var condition string
@@ -2558,7 +2312,7 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	if source == utils.DATA_SOURCE_STOCK_PLANT {
 		edbType = 2 //计算指标
 	}
-	//从缓存中获取
+	// todo 如果缓存中的终端信息丢了是否需要调整 从缓存中获取
 	serverUrl := ``
 	if edbInfo.Source == utils.DATA_SOURCE_WIND {
 		windCacheKey := utils.CACHE_WIND_URL + ":" + edbCode
@@ -2569,6 +2323,19 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 			}
 		}
 	}
+	// 获取终端信息
+	terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + edbCode
+	terminalCode, tE := utils.Rc.RedisString(terminalCodeCacheKey)
+	if tE != nil {
+		utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", tE))
+	}
+	var sourceIndexName string
+	if terminalCode == "" {
+		terminalCode, sourceIndexName, tE = GetTerminalFromBaseIndex(source, edbCode)
+		if tE != nil {
+			utils.FileLog.Info(fmt.Sprintf("获取数据源终端信息失败, Err: %s", tE))
+		}
+	}
 	//获取该层级下最大的排序数
 	maxSort, err := GetEdbClassifyMaxSort(classifyId, 0)
 	if err != nil {
@@ -2592,9 +2359,11 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	edbInfo.ServerUrl = serverUrl
 	edbInfo.Sort = maxSort + 1
 	edbInfo.DataDateType = `交易日`
+	edbInfo.TerminalCode = terminalCode
+	edbInfo.SourceIndexName = sourceIndexName
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-	itemVal, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+	itemVal, err := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 	if itemVal != nil && err == nil {
 		edbInfo.MaxValue = itemVal.MaxValue
 		edbInfo.MinValue = itemVal.MinValue
@@ -2608,36 +2377,9 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	}
 	edbInfo.EdbInfoId = int(edbInfoId)
 	//保存数据
-	data_manage.ModifyEdbInfoDataStatus(edbInfoId, source, edbCode)
-
-	//处理同名指标
-	//{
-	//	edbNameList, tmpErr := data_manage.GetEdbInfoByName(edbName)
-	//	if tmpErr != nil {
-	//		errMsg = "保存失败"
-	//		err = errors.New("获取指标信息失败,Err:" + tmpErr.Error())
-	//		return
-	//	}
-	//	if len(edbNameList) >= 2 {
-	//		for _, v := range edbNameList {
-	//			edbName := v.EdbName + "(" + v.SourceName + ")"
-	//			err = data_manage.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
-	//			if err != nil {
-	//				errMsg = "保存失败"
-	//				err = errors.New("修改指标名称失败,Err:" + err.Error())
-	//				return
-	//			}
-	//		}
-	//	}
-	//}
+	data_manage.ModifyEdbInfoDataStatus(edbInfoId, source, subSource, edbCode)
 
-	//上传到ES
-	//indexName := utils.DATA_INDEX_NAME
-	//docId := strconv.Itoa(int(edbInfoId))
-	//
-	//go data.EsAddOrEditEdbInfo(indexName, docId, edbInfo)
-
-	maxAndMinItem, _ := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+	maxAndMinItem, _ := data_manage.GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
 	if maxAndMinItem != nil {
 		err = data_manage.ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
 	}
@@ -3084,6 +2826,25 @@ func GetEdbChartAdminList(source int) (list []int, err error) {
 	return
 }
 
+// EdbInfoReplace 替换指标v2版本(更换时间:2022年01月05日15:33:42)
+func EdbInfoReplace(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, sysAdminId int, sysAdminRealName string) (replaceChartTotal, replaceCalculateTotal int, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("ERR:", err.Error())
+		}
+	}()
+
+	// 替换关联表中的source_edb_info_id
+	relationEdbInfoIdList, replaceChartTotal, replaceCalculateTotal, err := data_manage.ReplaceChartEdb(oldEdbInfo, newEdbInfo)
+	if err != nil {
+		return
+	}
+
+	// 更新所有的关联指标
+	err, _ = EdbInfoRefreshAllFromBaseV3(relationEdbInfoIdList, true, true)
+	return
+}
+
 // GetEdbMenuTreeRecursive 递归指标库菜单树
 func GetEdbMenuTreeRecursive(list []*data_manage.EdbClassifyItems, parentId int) []*data_manage.EdbChartClassify {
 	res := make([]*data_manage.EdbChartClassify, 0)
@@ -3115,3 +2876,169 @@ func GetChartMenuTreeRecursive(list []*data_manage.ChartClassifyItems, parentId
 	}
 	return res
 }
+
+func GetTerminalFromBaseIndex(source int, edbCode string) (terminalCode string, sourceIndexName string, err error) {
+	tbName := GetBaseIndexTableName(source)
+	if tbName != "" {
+		var item data_manage.BaseIndexTerminalCode
+		item, err = data_manage.GetBaseIndexTerminalCode(edbCode, tbName)
+		if err != nil {
+			err = fmt.Errorf("查询数据源指标信息失败, Err: %s", err)
+			return
+		}
+		terminalCode = item.TerminalCode
+		sourceIndexName = item.IndexName
+	}
+	return
+}
+
+func GetBaseIndexTableName(source int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_YS:
+		tableName = "base_from_smm_index"
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
+		tableName = "base_from_mysteel_chemical_index"
+	case utils.DATA_SOURCE_SCI:
+		tableName = "base_from_sci_index"
+	case utils.DATA_SOURCE_BAIINFO:
+		tableName = "base_from_baiinfo_index"
+	default:
+	}
+	return
+}
+
+// EdbInfoAdd 添加指标到指标库
+func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	//判断指标名称是否存在
+	var condition string
+	var pars []interface{}
+
+	condition += " AND edb_name=? "
+	pars = append(pars, item.EdbName)
+
+	count, err := data_manage.GetEdbInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断指标名称是否存在失败"
+		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "指标名称已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	source := item.Source
+
+	edbInfo = new(data_manage.EdbInfo)
+	edbInfo.Source = source
+	sourceNameMap := map[int]string{
+		utils.DATA_SOURCE_THS:                 "同花顺",
+		utils.DATA_SOURCE_WIND:                "wind",
+		utils.DATA_SOURCE_PB:                  "彭博",
+		utils.DATA_SOURCE_PB_FINANCE:          "彭博财务",
+		utils.DATA_SOURCE_MANUAL:              "手工数据",
+		utils.DATA_SOURCE_LZ:                  "隆众",
+		utils.DATA_SOURCE_YS:                  "SMM",
+		utils.DATA_SOURCE_GL:                  "钢联",
+		utils.DATA_SOURCE_ZZ:                  "郑商所",
+		utils.DATA_SOURCE_DL:                  "大商所",
+		utils.DATA_SOURCE_SH:                  "上期所",
+		utils.DATA_SOURCE_CFFEX:               "中金所",
+		utils.DATA_SOURCE_SHFE:                "上期能源",
+		utils.DATA_SOURCE_GIE:                 "欧洲天然气",
+		utils.DATA_SOURCE_LT:                  "路透",
+		utils.DATA_SOURCE_COAL:                "中国煤炭网",
+		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
+		utils.DATA_SOURCE_COM_TRADE:           "UN",
+		utils.DATA_SOURCE_SCI:                 "SCI",
+		utils.DATA_SOURCE_BAIINFO:             "BAIINFO",
+		utils.DATA_SOURCE_STOCK_PLANT:         "存量装置",
+		utils.DATA_SOURCE_NATIONAL_STATISTICS: "国家统计局",
+		utils.DATA_SOURCE_FUBAO:               "富宝数据",
+	}
+
+	sourceName, ok := sourceNameMap[source]
+	if !ok {
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			sourceName = edbSource.SourceName
+		}
+		if sourceName == "" {
+			errMsg = "指标来源异常"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+	edbInfo.SourceName = sourceName
+
+	edbType := 1 //基础指标
+	if source == utils.DATA_SOURCE_STOCK_PLANT {
+		edbType = 2 //计算指标
+	}
+	//从缓存中获取
+	serverUrl := ``
+	if edbInfo.Source == utils.DATA_SOURCE_WIND {
+		windCacheKey := utils.CACHE_WIND_URL + ":" + item.EdbCode
+		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
+		if serverUrl == `` {
+			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
+				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
+			}
+		}
+	}
+	//获取该层级下最大的排序数
+	maxSort, err := GetEdbClassifyMaxSort(item.ClassifyId, 0)
+	if err != nil {
+		errMsg = "获取失败"
+		err = errors.New("查询排序信息失败,Err:" + err.Error())
+		return
+	}
+
+	edbInfo.EdbCode = item.EdbCode
+	edbInfo.EdbName = item.EdbName
+	edbInfo.EdbNameSource = item.EdbName
+	edbInfo.Frequency = item.Frequency
+	edbInfo.Unit = item.Unit
+	edbInfo.ClassifyId = item.ClassifyId
+	edbInfo.SysUserId = item.SysUserId
+	edbInfo.SysUserRealName = item.SysUserRealName
+	edbInfo.CreateTime = time.Now()
+	edbInfo.ModifyTime = time.Now()
+	edbInfo.ServerUrl = serverUrl
+	edbInfo.Sort = maxSort + 1
+	edbInfo.DataDateType = `交易日`
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	edbInfo.EdbType = edbType
+	edbInfo.SubSource = item.SubSource
+	edbInfo.SubSourceName = "日期序列"
+	edbInfo.IndicatorCode = item.IndicatorCode
+	edbInfo.StockCode = item.StockCode
+	edbInfoId, err := data_manage.AddEdbInfo(edbInfo)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+	edbInfo.EdbInfoId = int(edbInfoId)
+	//保存数据
+	err = data_manage.ModifyEdbInfoWindWsdDataStatus(edbInfoId, item.EdbCode)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("修改数据对应指标ID失败,Err:" + err.Error())
+		return
+	}
+	maxAndMinItem, _ := data_manage.GetEdbInfoWsdMaxAndMinInfo(source, item.SubSource, item.EdbCode)
+	if maxAndMinItem != nil {
+		err = data_manage.ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
+	}
+	//添加es
+	AddOrEditEdbInfoToEs(int(edbInfoId))
+	return
+}

+ 2 - 2
services/data/edb_info_calculate.go

@@ -74,7 +74,7 @@ func Calculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCode, form
 		var pars []interface{}
 		condition += " AND edb_info_id=? "
 		pars = append(pars, v.EdbInfoId)
-		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, 1)
+		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
 		if err != nil {
 			return err
 		}
@@ -468,7 +468,7 @@ func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCod
 			condition += " AND data_time<=? "
 			pars = append(pars, endDate)
 		}
-		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, 1)
+		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
 		if err != nil {
 			return err
 		}

+ 35 - 25
services/data/excel/custom_analysis_edb.go

@@ -100,17 +100,14 @@ func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateLis
 	}
 	dataList := make([]dataStruct, 0)
 	{
-		var startData bool
 		for _, v := range dataSequenceVal {
 			// 如果没有数据集,那么就过滤
 			if v == `` {
 				// 如果开始插入数据了,那么就需要插入不存在值
-				if startData {
-					dataList = append(dataList, dataStruct{
-						Value: 0,
-						Ok:    false,
-					})
-				}
+				dataList = append(dataList, dataStruct{
+					Value: 0,
+					Ok:    false,
+				})
 				continue
 			}
 
@@ -118,19 +115,38 @@ func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateLis
 			v = strings.Replace(v, ",", "", -1)
 			// 过滤空格
 			v = strings.Replace(v, " ", "", -1)
-			tmpValDec, tmpErr := decimal.NewFromString(v)
-			if tmpErr != nil {
-				if startData {
+
+			var tmpVal float64
+			if strings.Contains(v, "%") {
+				// 百分比的数
+				isPercentage, percentageValue := utils.IsPercentage(v)
+				if !isPercentage {
 					dataList = append(dataList, dataStruct{
 						Value: 0,
 						Ok:    false,
 					})
+					continue
 				}
-				continue
+				tmpValDec, tmpErr := decimal.NewFromString(percentageValue)
+				if tmpErr != nil {
+					dataList = append(dataList, dataStruct{
+						Value: 0,
+						Ok:    false,
+					})
+					continue
+				}
+				tmpVal, _ = tmpValDec.Div(decimal.NewFromFloat(100)).Float64()
+			} else {
+				tmpValDec, tmpErr := decimal.NewFromString(v)
+				if tmpErr != nil {
+					dataList = append(dataList, dataStruct{
+						Value: 0,
+						Ok:    false,
+					})
+					continue
+				}
+				tmpVal, _ = tmpValDec.Float64()
 			}
-			startData = true
-
-			tmpVal, _ := tmpValDec.Float64()
 			dataList = append(dataList, dataStruct{
 				Value: tmpVal,
 				Ok:    true,
@@ -141,14 +157,11 @@ func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateLis
 	// 日期集
 	dateList := make([]string, 0)
 	{
-		var startData bool
 		for _, v := range dateSequenceVal {
 			// 如果没有数据集,那么就过滤
 			if v == `` {
 				// 如果开始插入数据了,那么就需要插入不存在值
-				if startData {
-					dateList = append(dateList, "")
-				}
+				dateList = append(dateList, "")
 				continue
 			}
 
@@ -156,12 +169,9 @@ func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateLis
 			v = strings.Replace(v, " ", "", -1)
 			t1, tmpErr := dateparse.ParseAny(v)
 			if tmpErr != nil {
-				if startData {
-					dateList = append(dateList, "")
-				}
+				dateList = append(dateList, "")
 				continue
 			}
-			startData = true
 
 			dateList = append(dateList, t1.Format(utils.FormatDate))
 		}
@@ -178,15 +188,15 @@ func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateLis
 
 	for i := 0; i < num; i++ {
 		date := dateList[i]
-		data := dataList[i]
+		tmpData := dataList[i]
 
 		// 日期为空、数据为空
-		if !data.Ok || date == `` {
+		if !tmpData.Ok || date == `` {
 			continue
 		}
 
 		newDateList = append(newDateList, date)
-		newDataList = append(newDataList, data.Value)
+		newDataList = append(newDataList, tmpData.Value)
 	}
 
 	return

+ 4 - 5
services/data/excel/excel_info.go

@@ -96,7 +96,6 @@ func GetExcelInfoOpButton(sysUser *system.Admin, belongUserId, source int) (butt
 	button.CopyButton = true
 	button.DownloadButton = true
 
-
 	// 1、本用户创建的表格,可编辑、刷新、另存为、下载、删除,删除需二次确认;
 	// 2、管理员角色对所有表格有如上权限;
 	// 3、在线excel所有人都能编辑
@@ -121,7 +120,7 @@ func GetFirstEdbDataList(edbInfo *data_manage.EdbInfo, num int, manualDateList [
 	var dataList []*data_manage.EdbDataList
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
 	case 1:
 		_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
 	default:
@@ -222,7 +221,7 @@ func GetOtherEdbDataList(edbInfo *data_manage.EdbInfo, dateList []string) (resul
 	var dataList []*data_manage.EdbDataList
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
 	case 1:
 		_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
 	default:
@@ -316,7 +315,7 @@ func GetFirstHistoryEdbDataList(edbInfo *data_manage.EdbInfo, num int, endDate s
 	var dataList []*data_manage.EdbDataList
 	switch edbInfo.EdbInfoType {
 	case 0:
-		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, endDate)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, endDate)
 	case 1:
 		_, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, endDate, true)
 	default:
@@ -499,7 +498,7 @@ func GetTableDataConfig(reqData request.TableDataReq) (tableDataConfig TableData
 		var firstDataList []*data_manage.EdbDataList
 		switch edbInfo.EdbInfoType {
 		case 0:
-			firstDataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+			firstDataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
 		case 1:
 			_, firstDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
 		default:

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

@@ -82,7 +82,7 @@ func GetMixedTableCellData(mixedTableReq request.MixedTableReq) (newMixedTableCe
 		dataList := make([]*data_manage.EdbDataList, 0)
 		switch edbInfo.EdbInfoType {
 		case 0:
-			dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+			dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
 		case 1:
 			_, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
 		default:

Some files were not shown because too many files changed in this diff