Эх сурвалжийг харах

Merge remote-tracking branch 'origin/feature/eta_2.3.5'

# Conflicts:
#	models/data_manage/edb_info.go
#	utils/constants.go
Roc 1 сар өмнө
parent
commit
c55d122fb8
62 өөрчлөгдсөн 5038 нэмэгдсэн , 428 устгасан
  1. 1 1
      controllers/commodity_trade_base_index.go
  2. 23 1
      controllers/data_manage/ai_predict_model/classify.go
  3. 60 2
      controllers/data_manage/ai_predict_model/index.go
  4. 101 71
      controllers/data_manage/base_from_ths_hf.go
  5. 77 15
      controllers/data_manage/bloomberg_data.go
  6. 43 17
      controllers/data_manage/business_data.go
  7. 25 3
      controllers/data_manage/chart_framework.go
  8. 6 3
      controllers/data_manage/chart_info.go
  9. 6 2
      controllers/data_manage/correlation/correlation_chart_info.go
  10. 8 3
      controllers/data_manage/cross_variety/chart_info.go
  11. 50 3
      controllers/data_manage/edb_info.go
  12. 10 1
      controllers/data_manage/edb_info_refresh.go
  13. 1 0
      controllers/data_manage/eia_steo.go
  14. 5 0
      controllers/data_manage/excel/balance_table.go
  15. 11 0
      controllers/data_manage/excel/custom_analysis.go
  16. 248 0
      controllers/data_manage/excel/excel_info.go
  17. 8 3
      controllers/data_manage/future_good/future_good_chart_info.go
  18. 59 10
      controllers/data_manage/gl_data.go
  19. 22 0
      controllers/data_manage/jiayue_edb_source.go
  20. 6 2
      controllers/data_manage/line_equation/line_chart_info.go
  21. 6 2
      controllers/data_manage/line_feature/chart_info.go
  22. 45 11
      controllers/data_manage/manual_edb.go
  23. 9 0
      controllers/data_manage/predict_edb_info.go
  24. 6 2
      controllers/data_manage/range_analysis/chart_info.go
  25. 50 25
      controllers/data_manage/smm_api.go
  26. 3 0
      controllers/data_manage/smm_data.go
  27. 6 1
      controllers/data_manage/stl/stl.go
  28. 272 0
      controllers/data_source/data_source.go
  29. 6 2
      controllers/trade_analysis/warehouse.go
  30. 2 0
      models/ai_predict_model/ai_predict_model_index.go
  31. 46 38
      models/business_conf.go
  32. 1 0
      models/data_manage/base_from_eia_stero.go
  33. 21 14
      models/data_manage/base_from_mtjh.go
  34. 1 1
      models/data_manage/base_from_smm_classify.go
  35. 7 0
      models/data_manage/chart_framework.go
  36. 4 3
      models/data_manage/chart_info.go
  37. 9 1
      models/data_manage/data_manage_permission/excel.go
  38. 1 0
      models/data_manage/edb_info.go
  39. 14 3
      models/data_manage/excel/excel_info.go
  40. 6 0
      models/data_manage/excel/response/excel_info.go
  41. 33 7
      models/data_manage/gl_data.go
  42. 1 0
      models/data_manage/my_chart.go
  43. 18 16
      models/data_source/base_from_sci99.go
  44. 2119 0
      models/data_source/data_source.go
  45. 2 0
      models/data_source/icpi.go
  46. 1 2
      models/db.go
  47. 25 21
      models/manual_edb.go
  48. 18 0
      routers/commentsRouter.go
  49. 31 0
      services/binlog/binlog.go
  50. 35 0
      services/binlog/data_source.go
  51. 184 47
      services/binlog/handler.go
  52. 1 1
      services/data/chart_info_elastic.go
  53. 110 54
      services/data/edb_info_refresh.go
  54. 37 18
      services/data/edb_info_relation.go
  55. 10 1
      services/data/stl/stl.go
  56. 478 16
      services/elastic/elastic.go
  57. 28 0
      services/excel/excel_elastic.go
  58. 65 0
      services/excel_info.go
  59. 11 2
      services/task.go
  60. 533 0
      services/temp_fix.go
  61. 6 0
      utils/config.go
  62. 7 3
      utils/constants.go

+ 1 - 1
controllers/commodity_trade_base_index.go

@@ -2741,7 +2741,7 @@ func (this *TradeCommonController) MtjhSingleData() {
 	}
 
 	modifyTime, err := data_manage.GetMtjhIndexLatestDate(indexCode)
-	if err != nil {
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取更新时间失败"
 		br.ErrMsg = "获取更新时间失败,Err:" + err.Error()
 		return

+ 23 - 1
controllers/data_manage/ai_predict_model/classify.go

@@ -6,7 +6,9 @@ import (
 	"eta/eta_api/models"
 	aiPredictModel "eta/eta_api/models/ai_predict_model"
 	"eta/eta_api/models/data_manage"
+	dataSourceModel "eta/eta_api/models/data_source"
 	"eta/eta_api/services"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
 	"sort"
@@ -430,7 +432,7 @@ func (this *AiPredictModelClassifyController) Remove() {
 	// 删除标的
 	if req.IndexId > 0 {
 		indexOb := new(aiPredictModel.AiPredictModelIndex)
-		_, e := indexOb.GetItemById(req.IndexId)
+		aiIndex, e := indexOb.GetItemById(req.IndexId)
 		if e != nil {
 			if e.Error() == utils.ErrNoRow() {
 				br.Ret = 200
@@ -449,6 +451,26 @@ func (this *AiPredictModelClassifyController) Remove() {
 			br.ErrMsg = fmt.Sprintf("删除标的及数据失败, %v", e)
 			return
 		}
+
+		// ES标记删除
+		go func() {
+			indexItem := new(dataSourceModel.SearchDataSource)
+			indexItem.PrimaryId = aiIndex.AiPredictModelIndexId
+			indexItem.IndexName = aiIndex.IndexName
+			indexItem.IndexCode = aiIndex.IndexCode
+			indexItem.ClassifyId = aiIndex.ClassifyId
+			indexItem.Source = utils.DATA_SOURCE_AI_PREDICT_MODEL
+			indexItem.SourceName = "AI预测模型"
+			indexItem.IsDeleted = 1
+			indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, aiIndex.CreateTime)
+			indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, aiIndex.ModifyTime)
+
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				utils.FileLog.Info("AI预测模型-标记删除es失败, %v", e)
+				return
+			}
+		}()
 	}
 
 	br.Ret = 200

+ 60 - 2
controllers/data_manage/ai_predict_model/index.go

@@ -5,8 +5,10 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	aiPredictModel "eta/eta_api/models/ai_predict_model"
+	dataSourceModel "eta/eta_api/models/data_source"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -50,6 +52,9 @@ func (this *AiPredictModelIndexController) List() {
 	classifyId, _ := this.GetInt("ClassifyId")
 	indexId, _ := this.GetInt("IndexId")
 	keyword := this.GetString("KeyWord")
+	if keyword == "" {
+		keyword = this.GetString("Keyword")
+	}
 	keyword = strings.TrimSpace(keyword)
 	resp := new(aiPredictModel.AiPredictModelIndexPageListResp)
 
@@ -79,6 +84,7 @@ func (this *AiPredictModelIndexController) List() {
 	}
 
 	// 筛选条件
+	highlightMap := make(map[int]string)
 	indexOb := new(aiPredictModel.AiPredictModelIndex)
 	var cond string
 	var pars []interface{}
@@ -91,9 +97,34 @@ func (this *AiPredictModelIndexController) List() {
 			cond += fmt.Sprintf(" AND %s = ?", indexOb.Cols().ClassifyId)
 			pars = append(pars, classifyId)
 		}
+		//if keyword != "" {
+		//	cond += fmt.Sprintf(" AND %s LIKE ?", indexOb.Cols().IndexName)
+		//	pars = append(pars, fmt.Sprint("%", keyword, "%"))
+		//}
+
+		// 有关键词从es中搜索
 		if keyword != "" {
-			cond += fmt.Sprintf(" AND %s LIKE ?", indexOb.Cols().IndexName)
-			pars = append(pars, fmt.Sprint("%", keyword, "%"))
+			_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_AI_PREDICT_MODEL, 0, []int{}, []int{}, []string{}, startSize, pageSize)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("ES-搜索手工指标列表失败, %v", e)
+				return
+			}
+			if len(list) == 0 {
+				resp.List = make([]*aiPredictModel.AiPredictModelIndexItem, 0)
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				br.Data = resp
+				return
+			}
+			var ids []int
+			for _, v := range list {
+				ids = append(ids, v.PrimaryId)
+				highlightMap[v.PrimaryId] = v.SearchText
+			}
+			cond += fmt.Sprintf(` AND %s IN (%s)`, indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+			pars = append(pars, ids)
 		}
 	}
 
@@ -114,6 +145,12 @@ func (this *AiPredictModelIndexController) List() {
 	for _, v := range list {
 		t := v.Format2Item()
 		t.ClassifyName = classifyIdName[v.ClassifyId]
+		// 搜索高亮
+		t.SearchText = v.IndexName
+		s := highlightMap[v.AiPredictModelIndexId]
+		if s != "" {
+			t.SearchText = s
+		}
 		pageList = append(pageList, t)
 	}
 
@@ -570,6 +607,27 @@ func (this *AiPredictModelIndexController) Import() {
 		return
 	}
 
+	// 写入es
+	go func() {
+		for _, v := range importIndexes {
+			indexItem := new(dataSourceModel.SearchDataSource)
+			indexItem.PrimaryId = v.Index.AiPredictModelIndexId
+			indexItem.IndexName = v.Index.IndexName
+			indexItem.IndexCode = v.Index.IndexCode
+			indexItem.ClassifyId = v.Index.ClassifyId
+			indexItem.Source = utils.DATA_SOURCE_AI_PREDICT_MODEL
+			indexItem.SourceName = "AI预测模型"
+			indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, v.Index.CreateTime)
+			indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, v.Index.ModifyTime)
+
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				utils.FileLog.Info("AI预测模型-写入es失败, %v", e)
+				continue
+			}
+		}
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 101 - 71
controllers/data_manage/base_from_ths_hf.go

@@ -5,8 +5,10 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	dataSourceModel "eta/eta_api/models/data_source"
 	"eta/eta_api/models/mgo"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -296,6 +298,7 @@ func (this *BaseFromThsHfController) List() {
 		br.ErrMsg = fmt.Sprintf("参数有误, SortType: %d", params.SortType)
 		return
 	}
+	params.Keywords = strings.TrimSpace(params.Keywords)
 	resp := new(data_manage.ThsHfIndexPageListResp)
 	resp.List = make([]*data_manage.BaseFromThsHfIndexItem, 0)
 
@@ -316,18 +319,30 @@ func (this *BaseFromThsHfController) List() {
 		//classifies = list
 	}
 
+	// 分页查询
+	var startSize int
+	if params.PageSize <= 0 {
+		params.PageSize = utils.PageSize20
+	}
+	if params.CurrentIndex <= 0 {
+		params.CurrentIndex = 1
+	}
+	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
+
 	// 筛选项
 	var (
-		cond      string
-		pars      []interface{}
-		listOrder string
+		cond         string
+		pars         []interface{}
+		listOrder    string
+		classifyIds  []int
+		adminIds     []int
+		frequencyArr []string
 	)
 	indexOb := new(data_manage.BaseFromThsHfIndex)
 	{
 		// 分类
 		if params.ClassifyId != "" {
 			classifyIdArr := strings.Split(params.ClassifyId, ",")
-			classifyIds := make([]int, 0)
 			for _, v := range classifyIdArr {
 				t, _ := strconv.Atoi(v)
 				if t > 0 {
@@ -344,65 +359,23 @@ func (this *BaseFromThsHfController) List() {
 			}
 			cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(classifyIds)))
 			pars = append(pars, classifyIds)
-
-			//// 不包含子分类
-			//if len(classifyIds) > 0 && !params.IncludeChild {
-			//	cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(classifyIds)))
-			//	pars = append(pars, classifyIds)
-			//}
-			//
-			//// 包含子分类
-			//if len(classifyIds) > 0 && params.IncludeChild {
-			//	queryClassifyIds := make([]int, 0)
-			//	queryClassifyExist := make(map[int]bool)
-			//
-			//	for _, v := range classifyIds {
-			//		// 遍历所有分类从LevelPath中找含有查询分类ID的...=_=!
-			//		for _, cv := range classifies {
-			//			if queryClassifyExist[cv.BaseFromThsHfClassifyId] {
-			//				continue
-			//			}
-			//			if cv.LevelPath == "" {
-			//				continue
-			//			}
-			//			strArr := strings.Split(cv.LevelPath, ",")
-			//			if len(strArr) == 0 {
-			//				continue
-			//			}
-			//			for _, sv := range strArr {
-			//				tv, _ := strconv.Atoi(sv)
-			//				if tv == v {
-			//					queryClassifyIds = append(queryClassifyIds, cv.BaseFromThsHfClassifyId)
-			//					queryClassifyExist[cv.BaseFromThsHfClassifyId] = true
-			//					break
-			//				}
-			//			}
-			//		}
-			//	}
-			//
-			//	if len(queryClassifyIds) == 0 {
-			//		page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
-			//		resp.Paging = page
-			//		br.Ret = 200
-			//		br.Success = true
-			//		br.Msg = "获取成功"
-			//		return
-			//	}
-			//	cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(queryClassifyIds)))
-			//	pars = append(pars, queryClassifyIds)
-			//}
 		}
 
 		if params.Frequency != "" {
-			frequencyArr := strings.Split(params.Frequency, ",")
-			if len(frequencyArr) > 0 {
-				cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().Frequency, utils.GetOrmInReplace(len(frequencyArr)))
-				pars = append(pars, frequencyArr)
+			frequencyArr = strings.Split(params.Frequency, ",")
+			if len(frequencyArr) == 0 {
+				page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
+				resp.Paging = page
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				return
 			}
+			cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().Frequency, utils.GetOrmInReplace(len(frequencyArr)))
+			pars = append(pars, frequencyArr)
 		}
 		if params.SysAdminId != "" {
 			adminIdArr := strings.Split(params.SysAdminId, ",")
-			adminIds := make([]int, 0)
 			for _, v := range adminIdArr {
 				t, _ := strconv.Atoi(v)
 				if t > 0 {
@@ -410,15 +383,60 @@ func (this *BaseFromThsHfController) List() {
 				}
 			}
 			if len(adminIds) > 0 {
-				cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().SysUserId, utils.GetOrmInReplace(len(adminIds)))
-				pars = append(pars, adminIds)
+				page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
+				resp.Paging = page
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				return
 			}
+			cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().SysUserId, utils.GetOrmInReplace(len(adminIds)))
+			pars = append(pars, adminIds)
 		}
-		params.Keywords = strings.TrimSpace(params.Keywords)
+
+		// 关键词空格拆分
 		if params.Keywords != "" {
-			cond += fmt.Sprintf(" AND (%s LIKE ? OR %s LIKE ?)", indexOb.Cols().IndexCode, indexOb.Cols().IndexName)
-			kw := fmt.Sprint("%", params.Keywords, "%")
-			pars = append(pars, kw, kw)
+			indexCodeCol := indexOb.Cols().IndexCode
+			indexNameCol := indexOb.Cols().IndexName
+			keywordArr := strings.Split(params.Keywords, " ")
+			if len(keywordArr) > 1 {
+				sliceArr := make([]string, 0)
+				sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
+				pars = utils.GetLikeKeywordPars(pars, params.Keywords, 2)
+				for _, v := range keywordArr {
+					if v == ` ` || v == `` {
+						continue
+					}
+					sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
+					pars = utils.GetLikeKeywordPars(pars, v, 2)
+				}
+				cond += ` AND (` + strings.Join(sliceArr, " OR ") + `)`
+			} else {
+				cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, indexCodeCol, indexNameCol)
+				pars = utils.GetLikeKeywordPars(pars, params.Keywords, 2)
+			}
+
+			// ES关键词搜索
+			//_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, params.Keywords, utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_HIGH_FREQUENCY, []int{}, []int{}, []string{}, startSize, params.PageSize)
+			//if e != nil {
+			//	br.Msg = "获取失败"
+			//	br.ErrMsg = fmt.Sprintf("ES-搜索高频数据指标失败, %v", e)
+			//	return
+			//}
+			//if len(list) == 0 {
+			//	page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
+			//	resp.Paging = page
+			//	br.Ret = 200
+			//	br.Success = true
+			//	br.Msg = "获取成功"
+			//	return
+			//}
+			//var indexIds []int
+			//for _, v := range list {
+			//	indexIds = append(indexIds, v.PrimaryId)
+			//}
+			//cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(indexIds)))
+			//pars = append(pars, indexIds)
 		}
 
 		// 排序
@@ -446,15 +464,6 @@ func (this *BaseFromThsHfController) List() {
 		return
 	}
 
-	// 分页查询
-	var startSize int
-	if params.PageSize <= 0 {
-		params.PageSize = utils.PageSize20
-	}
-	if params.CurrentIndex <= 0 {
-		params.CurrentIndex = 1
-	}
-	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
 	items, e := indexOb.GetPageItemsByCondition(cond, pars, []string{}, listOrder, startSize, params.PageSize)
 	if e != nil {
 		br.Msg = "获取失败"
@@ -1004,6 +1013,27 @@ func (this *BaseFromThsHfController) Remove() {
 		}
 	}
 
+	// ES标记删除
+	go func() {
+		indexItem := new(dataSourceModel.SearchDataSource)
+		indexItem.PrimaryId = item.BaseFromThsHfIndexId
+		indexItem.IndexName = item.IndexName
+		indexItem.IndexCode = item.IndexCode
+		indexItem.ClassifyId = item.BaseFromThsHfClassifyId
+		indexItem.Source = utils.DATA_SOURCE_THS
+		indexItem.SubSource = utils.DATA_SUB_SOURCE_HIGH_FREQUENCY
+		indexItem.SourceName = "同花顺高频"
+		indexItem.IsDeleted = 1
+		indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
+		indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, item.ModifyTime)
+
+		docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+		if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+			utils.FileLog.Info("同花顺高频-标记删除es失败, %v", e)
+			return
+		}
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 77 - 15
controllers/data_manage/bloomberg_data.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/elastic"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -57,16 +58,68 @@ func (this *BloombergDataController) List() {
 		return
 	}
 
+	var startSize int
+	if params.PageSize <= 0 {
+		params.PageSize = utils.PageSize20
+	}
+	if params.CurrentIndex <= 0 {
+		params.CurrentIndex = 1
+	}
+	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
+	dataResp := new(data_manage.BloombergSourceListResp)
+
 	cond := ``
 	pars := make([]interface{}, 0)
 	// 筛选项
 	{
 		params.Keywords = strings.TrimSpace(params.Keywords)
 		if params.Keywords != "" {
-			cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, data_manage.BaseFromBloombergIndexCols.IndexCode, data_manage.BaseFromBloombergIndexCols.IndexName)
-			kw := fmt.Sprint("%", params.Keywords, "%")
-			pars = append(pars, kw, kw)
+			// 空格分词搜
+			//indexCodeCol := data_manage.BaseFromBloombergIndexCols.IndexCode
+			//indexNameCol := data_manage.BaseFromBloombergIndexCols.IndexName
+			//keywordArr := strings.Split(params.Keywords, " ")
+			//if len(keywordArr) > 1 {
+			//	sliceArr := make([]string, 0)
+			//	sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
+			//	pars = utils.GetLikeKeywordPars(pars, params.Keywords, 2)
+			//
+			//	for _, v := range keywordArr {
+			//		if v == ` ` || v == `` {
+			//			continue
+			//		}
+			//		sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
+			//		pars = utils.GetLikeKeywordPars(pars, v, 2)
+			//	}
+			//	cond += ` AND (` + strings.Join(sliceArr, " OR ") + `)`
+			//} else {
+			//	cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, indexCodeCol, indexNameCol)
+			//	pars = utils.GetLikeKeywordPars(pars, params.Keywords, 2)
+			//}
+
+			// ES搜
+			_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, params.Keywords, utils.DATA_SOURCE_BLOOMBERG, 0, []int{}, []int{}, []string{}, startSize, params.PageSize)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("ES-搜索Bloomberg指标失败, %v", e)
+				return
+			}
+			if len(list) == 0 {
+				dataResp.Paging = paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
+				dataResp.List = make([]*data_manage.BaseFromBloombergIndexItem, 0)
+				br.Data = dataResp
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				return
+			}
+			var indexIds []int
+			for _, v := range list {
+				indexIds = append(indexIds, v.PrimaryId)
+			}
+			cond += fmt.Sprintf(" AND %s IN (%s)", data_manage.BaseFromBloombergIndexCols.BaseFromBloombergIndexId, utils.GetOrmInReplace(len(indexIds)))
+			pars = append(pars, indexIds)
 		}
+
 		if params.Frequency != "" {
 			cond += fmt.Sprintf(` AND %s = ?`, data_manage.BaseFromBloombergIndexCols.Frequency)
 			pars = append(pars, params.Frequency)
@@ -81,14 +134,6 @@ func (this *BloombergDataController) List() {
 		br.ErrMsg = "获取Bloomberg原始指标列表总数失败, Err: " + e.Error()
 		return
 	}
-	var startSize int
-	if params.PageSize <= 0 {
-		params.PageSize = utils.PageSize20
-	}
-	if params.CurrentIndex <= 0 {
-		params.CurrentIndex = 1
-	}
-	startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
 
 	// 排序, 默认创建时间倒序
 	orderFields := map[int]string{
@@ -143,7 +188,6 @@ func (this *BloombergDataController) List() {
 		respList = append(respList, t)
 	}
 	page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
-	dataResp := new(data_manage.BloombergSourceListResp)
 	dataResp.Paging = page
 	dataResp.List = respList
 
@@ -479,9 +523,27 @@ func (this *BloombergDataController) AddCheck() {
 	// 筛选项
 	req.Keywords = strings.TrimSpace(req.Keywords)
 	if req.Keywords != "" {
-		cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, data_manage.BaseFromBloombergIndexCols.IndexCode, data_manage.BaseFromBloombergIndexCols.IndexName)
-		kw := fmt.Sprint("%", req.Keywords, "%")
-		pars = append(pars, kw, kw)
+		// 空格分词搜
+		indexCodeCol := data_manage.BaseFromBloombergIndexCols.IndexCode
+		indexNameCol := data_manage.BaseFromBloombergIndexCols.IndexName
+		keywordArr := strings.Split(req.Keywords, " ")
+		if len(keywordArr) > 1 {
+			sliceArr := make([]string, 0)
+			sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
+			pars = utils.GetLikeKeywordPars(pars, req.Keywords, 2)
+
+			for _, v := range keywordArr {
+				if v == ` ` || v == `` {
+					continue
+				}
+				sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
+				pars = utils.GetLikeKeywordPars(pars, v, 2)
+			}
+			cond += ` AND (` + strings.Join(sliceArr, " OR ") + `)`
+		} else {
+			cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, indexCodeCol, indexNameCol)
+			pars = utils.GetLikeKeywordPars(pars, req.Keywords, 2)
+		}
 	}
 	if req.Frequency != "" {
 		cond += fmt.Sprintf(` AND %s = ?`, data_manage.BaseFromBloombergIndexCols.Frequency)

+ 43 - 17
controllers/data_manage/business_data.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/elastic"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -90,26 +91,51 @@ func (c *EdbBusinessController) List() {
 	var condition string
 	var pars []interface{}
 
+	keywords = strings.TrimSpace(keywords)
 	if keywords != "" {
-		keywordSlice := strings.Split(keywords, " ")
-		if len(keywordSlice) > 0 {
-			tmpConditionSlice := make([]string, 0)
-			tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
-			pars = utils.GetLikeKeywordPars(pars, keywords, 2)
-
-			for _, v := range keywordSlice {
-				if v == ` ` || v == `` {
-					continue
-				}
-				tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
-				pars = utils.GetLikeKeywordPars(pars, v, 2)
+		//keywordSlice := strings.Split(keywords, " ")
+		//if len(keywordSlice) > 0 {
+		//	tmpConditionSlice := make([]string, 0)
+		//	tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
+		//	pars = utils.GetLikeKeywordPars(pars, keywords, 2)
+		//
+		//	for _, v := range keywordSlice {
+		//		if v == ` ` || v == `` {
+		//			continue
+		//		}
+		//		tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
+		//		pars = utils.GetLikeKeywordPars(pars, v, 2)
+		//	}
+		//	condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+		//
+		//} else {
+		//	condition += ` a.index_name like ? or a.index_code like ? `
+		//	pars = utils.GetLikeKeywordPars(pars, keywords, 2)
+		//}
+
+		// ES搜
+		_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keywords, utils.DATA_SOURCE_BUSINESS, 0, []int{}, []int{}, []string{}, startSize, req.PageSize)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("ES-搜索自有数据指标失败, %v", e)
+			return
+		}
+		if len(list) == 0 {
+			br.Data = data_manage.BusinessIndexListResp{
+				List:   make([]*data_manage.BaseFromBusinessIndexItem, 0),
+				Paging: paging.GetPaging(req.CurrentIndex, req.PageSize, 0),
 			}
-			condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
-
-		} else {
-			condition += ` a.index_name like ? or a.index_code like ? `
-			pars = utils.GetLikeKeywordPars(pars, keywords, 2)
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			return
+		}
+		var indexIds []int
+		for _, v := range list {
+			indexIds = append(indexIds, v.PrimaryId)
 		}
+		condition += fmt.Sprintf(" AND a.base_from_business_index_id IN (%s)", utils.GetOrmInReplace(len(indexIds)))
+		pars = append(pars, indexIds)
 	}
 
 	if frequency != "" {

+ 25 - 3
controllers/data_manage/chart_framework.go

@@ -9,6 +9,7 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
 )
@@ -43,6 +44,9 @@ func (this *ChartFrameworkController) List() {
 		return
 	}
 
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
 	adminId, _ := this.GetInt("AdminId")
 	visibility, _ := this.GetInt("Visibility")
 	if visibility == 1 && adminId <= 0 {
@@ -68,19 +72,37 @@ func (this *ChartFrameworkController) List() {
 		pars = append(pars, visibilityArr[visibility])
 	}
 
+	var total, startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize15
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	t, e := frameworkOb.GetCountByCondition(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取框架列表总数失败, Err: " + e.Error()
+		return
+	}
+	total = t
 	orderRule := `sort ASC, create_time DESC`
-	list, e := frameworkOb.GetItemsByCondition(cond, pars, []string{}, orderRule)
+	list, e := frameworkOb.GetPageItemsByCondition(cond, pars, []string{}, orderRule, startSize, pageSize)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取框架列表失败, Err: " + e.Error()
 		return
 	}
-	resp := make([]*data_manage.ChartFrameworkItem, 0)
+	resp := new(data_manage.ChartFrameworkListResp)
+	resp.List = make([]*data_manage.ChartFrameworkItem, 0)
 	for _, v := range list {
 		t := data_manage.FormatChartFramework2Item(v, make([]*data_manage.ChartFrameworkNodeItem, 0))
-		resp = append(resp, t)
+		resp.List = append(resp.List, t)
 	}
 
+	resp.Paging = paging.GetPaging(currentIndex, pageSize, total)
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true

+ 6 - 3
controllers/data_manage/chart_info.go

@@ -2227,7 +2227,7 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 		showSysId = sysUser.AdminId
 	}
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -2336,7 +2336,7 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
@@ -2346,7 +2346,10 @@ func (this *ChartInfoController) ChartInfoSearchByEs() {
 			if currClassify, ok := chartClassifyMap[v.ChartClassifyId]; ok {
 				tmp.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.ChartInfoId, v.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
 			}
-
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 6 - 2
controllers/data_manage/correlation/correlation_chart_info.go

@@ -1944,7 +1944,7 @@ func (this *CorrelationChartInfoController) SearchByEs() {
 		sourceList = append(sourceList, source)
 	}
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -1997,13 +1997,17 @@ func (this *CorrelationChartInfoController) SearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

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

@@ -105,7 +105,8 @@ func (c *ChartInfoController) List() {
 			for _, v := range keyWordArr {
 				if v != "" {
 					condition += ` chart_name LIKE '%` + v + `%' OR chart_name_en LIKE '%` + v + `%' OR`
-				}			}
+				}
+			}
 		}
 		condition = strings.TrimRight(condition, "OR")
 		condition += " ) "
@@ -1450,7 +1451,7 @@ func (c *ChartInfoController) SearchByEs() {
 
 	sourceList := []int{utils.CHART_SOURCE_CROSS_HEDGING}
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -1503,13 +1504,17 @@ func (c *ChartInfoController) SearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 50 - 3
controllers/data_manage/edb_info.go

@@ -3464,6 +3464,13 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 		}
 	}
 
+	// 只看我的
+	var sysUserId int
+	mine, _ := this.GetBool("IsShowMe")
+	if mine {
+		sysUserId = this.SysUser.AdminId
+	}
+
 	// 是否走ES
 	isEs := false
 	if keyWord != "" {
@@ -3475,10 +3482,14 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 		// 普通的搜索
 		if !isAddPredictEdb {
-			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList)
+			if mine {
+				total, edbInfoList, err = elastic.SearchEdbInfoDataByAdminId(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, sysUserId)
+			} else {
+				total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList)
+			}
 		} else {
 			// 允许添加预测指标的搜索
-			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, startSize, pageSize)
+			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, startSize, pageSize, sysUserId)
 		}
 		isEs = true
 	} else {
@@ -3524,6 +3535,11 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 			condition += ` AND frequency in ("日度","周度","月度") `
 		}
 
+		if mine {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, sysUserId)
+		}
+
 		total, edbInfoList, err = data_manage.GetEdbInfoFilterList(condition, pars, startSize, pageSize)
 	}
 	if err != nil {
@@ -3538,6 +3554,15 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+		// 如果没有关键词,那么搜索结果字段取指标名,前端已统一用该字段显示搜索的列表内容
+		if keyWord == "" {
+			if this.Lang == utils.ZhLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbName
+			}
+			if this.Lang == utils.EnLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbNameEn
+			}
+		}
 	}
 
 	// 当前列表中的分类map
@@ -4897,6 +4922,9 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 		}
 	}
 
+	// 只看我的
+	mine, _ := this.GetBool("IsShowMe")
+
 	// 是否走ES
 	isEs := false
 	if keyWord != "" {
@@ -4907,7 +4935,12 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 		keyWordArr = append(keyWordArr, newKeyWord...)
 
 		// 普通的搜索
-		total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList)
+		if mine {
+			total, edbInfoList, err = elastic.SearchEdbInfoDataByAdminId(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, this.SysUser.AdminId)
+		} else {
+			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList)
+		}
+
 		isEs = true
 	} else {
 		var condition string
@@ -4948,6 +4981,11 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 			condition += ` AND frequency in ("日度","周度","月度") `
 		}
 
+		if mine {
+			condition += ` AND sys_user_id = ? `
+			pars = append(pars, this.SysUser.AdminId)
+		}
+
 		total, edbInfoList, err = data_manage.GetEdbInfoFilterList(condition, pars, startSize, pageSize)
 	}
 	if err != nil {
@@ -4962,6 +5000,15 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+		// 如果没有关键词,那么搜索结果字段取指标名,前端已统一用该字段显示搜索的列表内容
+		if keyWord == "" {
+			if this.Lang == utils.ZhLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbName
+			}
+			if this.Lang == utils.EnLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbNameEn
+			}
+		}
 	}
 
 	// 当前列表中的分类map

+ 10 - 1
controllers/data_manage/edb_info_refresh.go

@@ -262,11 +262,20 @@ func buildTree(items []*edb_refresh.BaseClassifyItems, parentId int) []*edb_refr
 // @router /edb_info/refresh/edb_list [get]
 func (c *EdbInfoController) RefreshEdbList() {
 	br := new(models.BaseResponse).Init()
-
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		c.Data["json"] = br
 		c.ServeJSON()
 	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
 
 	source, _ := c.GetInt("Source")
 	subSource, _ := c.GetInt("SubSource")

+ 1 - 0
controllers/data_manage/eia_steo.go

@@ -47,6 +47,7 @@ func (this *EdbInfoController) EiaSteoClassify() {
 	childClassifyMap := make(map[int][]*data_manage.BaseFromEiaSteoClassifyView)
 	rootList := make([]*data_manage.BaseFromEiaSteoClassifyView, 0)
 	for _, v := range classifyList {
+		v.UniqueCode = strconv.Itoa(v.BaseFromEiaSteoClassifyId)
 		if v.Level == 1 {
 			rootList = append(rootList, v)
 		} else {

+ 5 - 0
controllers/data_manage/excel/balance_table.go

@@ -1147,6 +1147,11 @@ func (c *ExcelInfoController) AddStaticExcel() {
 	resp.ExcelInfoId = excelInfo.ExcelInfoId
 	resp.UniqueCode = excelInfo.UniqueCode
 
+	// 写入ES
+	go func() {
+		excel2.EsAddOrEditExcel(excelInfo.ExcelInfoId)
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"

+ 11 - 0
controllers/data_manage/excel/custom_analysis.go

@@ -13,6 +13,7 @@ import (
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/data/excel"
 	excel2 "eta/eta_api/services/data/excel"
+	excel3 "eta/eta_api/services/excel"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
@@ -224,6 +225,11 @@ func (c *CustomAnalysisController) Add() {
 	// 生成excel文件
 	go excel.UpdateExcelInfoFileUrl(excelInfo)
 
+	// 写入ES
+	go func() {
+		excel3.EsAddOrEditExcel(excelInfo.ExcelInfoId)
+	}()
+
 	//新增操作日志
 	//{
 	//	excelLog := &data_manage.ExcelInfoLog{
@@ -344,6 +350,11 @@ func (c *CustomAnalysisController) Save() {
 	// 生成excel文件
 	go excel.UpdateExcelInfoFileUrl(excelInfo)
 
+	// 写入ES
+	go func() {
+		excel3.EsAddOrEditExcel(excelInfo.ExcelInfoId)
+	}()
+
 	//新增操作日志
 	//{
 	//	excelLog := &data_manage.ExcelInfoLog{

+ 248 - 0
controllers/data_manage/excel/excel_info.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	excelPermissionModel "eta/eta_api/models/data_manage/data_manage_permission"
 	excel3 "eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/data_manage/excel/request"
 	"eta/eta_api/models/data_manage/excel/response"
@@ -13,6 +14,7 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/data_manage_permission"
 	excel2 "eta/eta_api/services/data/excel"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/services/excel"
 	"eta/eta_api/utils"
 	"fmt"
@@ -336,6 +338,15 @@ func (c *ExcelInfoController) Add() {
 	//	go data_manage.AddExcelInfoLog(excelLog)
 	//}
 
+	// 写入ES
+	go func() {
+		excel.EsAddOrEditExcel(excelInfo.ExcelInfoId)
+
+		if childExcel != nil && childExcel.ExcelInfoId > 0 {
+			excel.EsAddOrEditExcel(childExcel.ExcelInfoId)
+		}
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"
@@ -1100,6 +1111,11 @@ func (c *ExcelInfoController) Edit() {
 	//删除公共图库那边的缓存
 	_ = utils.Rc.Delete(utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + excelInfo.UniqueCode)
 
+	// 写入ES
+	go func() {
+		excel.EsAddOrEditExcel(excelInfo.ExcelInfoId)
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "修改成功"
@@ -1421,6 +1437,11 @@ func (c *ExcelInfoController) Delete() {
 	//删除公共图库那边的缓存
 	_ = utils.Rc.Delete(utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL)
 
+	// 写入ES
+	go func() {
+		excel.EsAddOrEditExcel(excelInfo.ExcelInfoId)
+	}()
+
 	br.Ret = 200
 	br.Success = true
 	br.IsAddLog = true
@@ -3370,3 +3391,230 @@ func (c *ExcelInfoController) GetExcelRuleDetail() {
 	br.Ret = 200
 	br.Success = true
 }
+
+// SearchByEs
+// @Title ES搜索
+// @Description ES搜索
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   Source   query   int  true       "格来源,1:excel插件的表格,2:自定义表格,3:混合表格,默认:1"
+// @Param   IsShowMe   query   bool  false       "是否只看我的,true、false"
+// @Param   IsShare   query   bool  false       "是否只看我的,true、false"
+// @Success 200 {object} response.ExcelListResp
+// @router /excel_info/search_by_es [get]
+func (c *ExcelInfoController) SearchByEs() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+	source, _ := c.GetInt("Source")
+	if source <= 0 {
+		source = utils.EXCEL_DEFAULT
+	}
+	isShowMe, _ := c.GetBool("IsShowMe")
+	isShare, _ := c.GetBool("IsShare")
+	keyword := c.GetString("KeyWord")
+	if keyword == `` {
+		keyword = c.GetString("Keyword")
+	}
+
+	var total, startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize15
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	// 平衡表的查询条件
+	var condBalance string
+	var parsBalance []interface{}
+	if source == utils.BALANCE_TABLE {
+		condBalance += ` AND source = ? AND parent_id = 0 AND balance_type = 0` // 只显示动态表的一级表(不显示子表和静态表)
+		parsBalance = append(parsBalance, source)
+	}
+
+	// 可见性过滤
+	var queryIds, exceptIds []int
+	{
+		unauthorized, e := excelPermissionModel.GetExcelInfoDataNoPermissionByUserId(sysUser.AdminId, source)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取无权限表格失败, %v", e)
+			return
+		}
+		if len(unauthorized) > 0 {
+			for _, v := range unauthorized {
+				id, _ := strconv.Atoi(v.DataId)
+				if id == 0 {
+					continue
+				}
+				exceptIds = append(exceptIds, id)
+			}
+		}
+	}
+
+	// 自定义分析表
+	var queryAdminId int
+	if source == utils.CUSTOM_ANALYSIS_TABLE {
+		// 自定义分析共享表格
+		if isShare {
+			var kw string
+			if keyword != "" {
+				kw = fmt.Sprint("%", kw, "%")
+			}
+			// 查询我分享的/分享给我的表格
+			excels, e := excelPermissionModel.GetAdminAuthExcelInfoPermission(source, sysUser.AdminId, kw)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("获取我分享的/分享给我的表格失败, %v", e)
+				return
+			}
+			var excelIds []int
+			for _, v := range excels {
+				id := int(v.ExcelInfoId)
+				if !utils.InArrayByInt(excelIds, id) {
+					excelIds = append(excelIds, id)
+					continue
+				}
+			}
+			if len(excelIds) == 0 {
+				list := make([]*excel3.SearchExcelInfo, 0)
+				resp := response.SearchExcelListResp{
+					Paging: page,
+					List:   list,
+				}
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				br.Data = resp
+				return
+			}
+			queryIds = excelIds
+		} else {
+			// 非共享只看我的
+			isShowMe = true
+		}
+	}
+
+	// 获取所有有权限的指标和分类
+	permissionEdbIdList, permissionClassifyIdList, err := data_manage_permission.GetUserExcelAndClassifyPermissionList(c.SysUser.AdminId, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+		return
+	}
+	hasCheck := make(map[int]bool)
+	if isShowMe {
+		// 平衡表查询有权限的表格IDs
+		if source == utils.BALANCE_TABLE {
+			excelIds, e := services.GetBalanceExcelIdsByAdminId(sysUser.AdminId, condBalance, parsBalance, permissionEdbIdList, permissionClassifyIdList)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("获取平衡表有权限的表格IDs失败, %v", e)
+				return
+			}
+			if len(excelIds) == 0 {
+				list := make([]*excel3.SearchExcelInfo, 0)
+				resp := response.SearchExcelListResp{
+					Paging: page,
+					List:   list,
+				}
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				br.Data = resp
+				return
+			}
+			queryIds = excelIds
+		} else {
+			queryAdminId = sysUser.AdminId
+		}
+	}
+
+	// es搜索表格
+	t, list, e := elastic.SearchExcelInfoData(utils.EsExcelIndexName, keyword, source, queryAdminId, queryIds, exceptIds, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("搜索表格失败, %v", e)
+		return
+	}
+	total = int(t)
+
+	if len(list) > 0 {
+		classifyIdList := make([]int, 0)
+		for _, v := range list {
+			classifyIdList = append(classifyIdList, v.ExcelClassifyId)
+
+		}
+		classifyMap := make(map[int]*excel3.ExcelClassify)
+
+		// 分类信息
+		{
+			classifyList, err := excel3.GetClassifyByIdList(classifyIdList)
+			if err != nil {
+				br.Msg = "获取表格列表信息失败"
+				br.ErrMsg = "获取表格分类列表数据失败,Err:" + err.Error()
+				return
+			}
+			for _, v := range classifyList {
+				classifyMap[v.ExcelClassifyId] = v
+			}
+		}
+
+		for k, v := range list {
+			// 数据权限
+			if authCheck, ok1 := hasCheck[v.ExcelInfoId]; ok1 {
+				v.HaveOperaAuth = authCheck
+			} else {
+				if classifyInfo, ok := classifyMap[v.ExcelClassifyId]; ok {
+					v.HaveOperaAuth = data_manage_permission.CheckExcelPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.ExcelInfoId, v.ExcelClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+			if v.Source == utils.BALANCE_TABLE {
+				// 处理按钮权限和编辑状态
+				markStatus, err := services.UpdateExcelEditMark(v.ExcelInfoId, sysUser.AdminId, 2, sysUser.RealName)
+				if err != nil {
+					br.Msg = "查询标记状态失败"
+					br.ErrMsg = "查询标记状态失败,Err:" + err.Error()
+					return
+				}
+				if markStatus.Status == 0 {
+					list[k].CanEdit = true
+				} else {
+					list[k].Editor = markStatus.Editor
+				}
+
+				// excel表格按钮权限
+				list[k].Button = excel2.GetBalanceExcelInfoOpButton(sysUser.AdminId, v.SysUserId, v.HaveOperaAuth, v.ExcelInfoId)
+			}
+		}
+	}
+
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	resp := response.SearchExcelListResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

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

@@ -104,7 +104,8 @@ func (this *FutureGoodChartInfoController) ChartList() {
 			for _, v := range keyWordArr {
 				if v != "" {
 					condition += ` chart_name LIKE '%` + v + `%' OR chart_name_en LIKE '%` + v + `%' OR`
-				}			}
+				}
+			}
 		}
 		condition = strings.TrimRight(condition, "OR")
 		condition += " ) "
@@ -2390,7 +2391,7 @@ func (this *FutureGoodChartInfoController) ChartInfoSearchByEs() {
 		showSysId = sysUser.AdminId
 	}
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -2443,13 +2444,17 @@ func (this *FutureGoodChartInfoController) ChartInfoSearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 59 - 10
controllers/data_manage/gl_data.go

@@ -1,12 +1,13 @@
 package data_manage
 
 import (
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/tealeg/xlsx"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
 	"time"
@@ -174,30 +175,78 @@ func (this *EdbInfoController) GlData() {
 func (this *EdbInfoController) GlSearchList() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-
 	sysUser := this.SysUser
 	if sysUser == nil {
 		br.Msg = "请重新登录"
 		return
 	}
 
-	//关键字
-	keyword := this.GetString("Keyword")
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyword := this.GetString("KeyWord")
+	if keyword == `` {
+		keyword = this.GetString("Keyword")
+	}
 
-	list, err := data_manage.GetGlItemList(keyword)
-	if err != nil {
-		br.ErrMsg = "获取失败,Err:" + err.Error()
+	var total, startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize15
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	// es搜索
+	t, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_GL, 0, []int{}, []int{}, []string{}, startSize, pageSize)
+	if e != nil {
 		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("ES-搜索数据源列表失败, %v", e)
 		return
 	}
+	total = int(t)
+	resp := new(data_manage.GlDataPageListResp)
+	resp.Paging = paging.GetPaging(currentIndex, pageSize, total)
+	if len(list) == 0 {
+		resp.List = make([]*data_manage.GlSearchIndex, 0)
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	highlightMap := make(map[int]string)
+	for _, v := range list {
+		highlightMap[v.PrimaryId] = v.SearchText
+	}
+
+	var ids []int
+	for _, v := range list {
+		ids = append(ids, v.PrimaryId)
+	}
+	items, e := data_manage.GetGlItemListByIds(ids)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取指标列表失败, %v", e)
+		return
+	}
+	for _, v := range items {
+		v.Source = utils.DATA_SOURCE_GL
+		v.SourceName = "钢联原始指标库"
+		v.SearchText = highlightMap[v.Id]
+	}
+	resp.List = items
 
+	br.Data = resp
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
-	br.Data = list
 }
 
 // GlSingleData

+ 22 - 0
controllers/data_manage/jiayue_edb_source.go

@@ -71,6 +71,15 @@ func (this *JiaYueEdbSourceController) FrequencyList() {
 		return
 	}
 
+	// 测试环境老在报错=_=!
+	if utils.RunMode == "debug" {
+		br.Data = make([]string, 0)
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
 	frequencies, e := data.GetJiaYueFrequencyListFromBridge()
 	if e != nil {
 		br.Msg = "获取失败"
@@ -141,6 +150,19 @@ func (this *JiaYueEdbSourceController) IndexPageList() {
 		currentIndex = 1
 	}
 
+	// 测试环境老在报错=_=!
+	if utils.RunMode == "debug" {
+		page := paging.GetPaging(currentIndex, pageSize, 0)
+		resp := new(data_manage.JiaYueIndexPageListResp)
+		resp.Paging = page
+		resp.List = make([]*data_manage.DictIndexItem, 0)
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
 	var params data_manage.BridgeJiaYuePageIndexReq
 	params.PageIndex = currentIndex
 	params.PageSize = pageSize

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

@@ -1614,7 +1614,7 @@ func (this *LineEquationChartInfoController) SearchByEs() {
 
 	sourceList := []int{utils.CHART_SOURCE_LINE_EQUATION}
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -1667,13 +1667,17 @@ func (this *LineEquationChartInfoController) SearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 6 - 2
controllers/data_manage/line_feature/chart_info.go

@@ -2757,7 +2757,7 @@ func (this *LineFeaturesChartInfoController) SearchByEs() {
 
 	sourceList := []int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY}
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -2810,13 +2810,17 @@ func (this *LineFeaturesChartInfoController) SearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 45 - 11
controllers/data_manage/manual_edb.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/elastic"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -274,19 +275,47 @@ func (c *ManualEdbController) EdbSearch() {
 
 	var startSize int
 	if pageSize <= 0 {
-		pageSize = utils.PageSize20
+		pageSize = utils.PageSize15
 	}
 	if currentIndex <= 0 {
 		currentIndex = 1
 	}
 	startSize = utils.StartIndex(currentIndex, pageSize)
+	resp := new(models.EdbListResp)
 
 	//关键字
 	keyword := c.GetString("Keyword")
+	keyword = strings.TrimSpace(keyword)
 
 	var condition string
 	var pars []interface{}
 
+	// es搜索
+	highlightMap := make(map[string]string)
+	if keyword != "" {
+		_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_MANUAL, 0, []int{}, []int{}, []string{}, startSize, pageSize)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("ES-搜索手工指标列表失败, %v", e)
+			return
+		}
+		if len(list) == 0 {
+			resp.List = make([]*models.EdbInfoListItem, 0)
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			br.Data = resp
+			return
+		}
+		var codes []string
+		for _, v := range list {
+			codes = append(codes, v.IndexCode)
+			highlightMap[v.IndexCode] = v.SearchText
+		}
+		condition += fmt.Sprintf(` AND a.TRADE_CODE IN (%s)`, utils.GetOrmInReplace(len(list)))
+		pars = append(pars, codes)
+	}
+
 	//userId := sysUser.AdminId
 	//超管账号可以查看分类下的所有频度数据
 	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
@@ -304,10 +333,10 @@ func (c *ManualEdbController) EdbSearch() {
 
 	}
 
-	if keyword != "" {
-		condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
-		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-	}
+	//if keyword != "" {
+	//	condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+	//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+	//}
 
 	total, err := models.GetCountEdbInfoList(condition, pars)
 	if err != nil {
@@ -315,22 +344,27 @@ func (c *ManualEdbController) EdbSearch() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
 	list, err := models.GetEdbInfoList(condition, pars, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
 	for _, v := range list {
 		v.UniqueCode = utils.MD5(v.TradeCode)
+		// ES搜索信息
+		v.Source = utils.DATA_SOURCE_MANUAL
+		v.SourceName = "手工指标录入"
+		s := highlightMap[v.TradeCode]
+		if s == "" {
+			s = v.SecName
+		}
+		v.ClassifyUniqueCode = utils.MD5(strconv.Itoa(v.ClassifyId))
+		v.SearchText = s
 	}
 
-	resp := models.EdbListResp{
-		List:   list,
-		Paging: paging.GetPaging(currentIndex, pageSize, total),
-	}
+	resp.List = list
+	resp.Paging = paging.GetPaging(currentIndex, pageSize, total)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 9 - 0
controllers/data_manage/predict_edb_info.go

@@ -1253,6 +1253,15 @@ func (this *PredictEdbInfoController) FilterByEs() {
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+		// 如果没有关键词,那么搜索结果字段取指标名,前端已统一用该字段显示搜索的列表内容
+		if keyWord == "" {
+			if this.Lang == utils.ZhLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbName
+			}
+			if this.Lang == utils.EnLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbNameEn
+			}
+		}
 	}
 
 	// 当前列表中的分类map

+ 6 - 2
controllers/data_manage/range_analysis/chart_info.go

@@ -1818,7 +1818,7 @@ func (this *RangeChartChartInfoController) SearchByEs() {
 	sourceList := make([]int, 0)
 	sourceList = append(sourceList, utils.CHART_SOURCE_RANGE_ANALYSIS)
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -1871,13 +1871,17 @@ func (this *RangeChartChartInfoController) SearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 50 - 25
controllers/data_manage/smm_api.go

@@ -4,10 +4,10 @@ import (
 	"encoding/json"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"strconv"
 	"strings"
 )
 
@@ -66,16 +66,16 @@ func (this *EdbInfoController) SmmApiList() {
 	if len(types) > 0 {
 		condition += " AND ( "
 		for _, v := range types {
-			typeArr := strings.Split(v,",")
+			typeArr := strings.Split(v, ",")
 			for i, v := range typeArr {
 				if i == 0 {
 					condition += " ( "
 				}
 				typeStr := "type_"
 				typeStr += fmt.Sprintf("%d", i+1)
-				condition += typeStr+" =? "
+				condition += typeStr + " =? "
 				pars = append(pars, v)
-				if i == len(typeArr) - 1 {
+				if i == len(typeArr)-1 {
 					condition += " ) "
 				} else {
 					condition += " AND "
@@ -88,13 +88,13 @@ func (this *EdbInfoController) SmmApiList() {
 	}
 
 	if frequency != "" {
-		frequencyArr := strings.Split(frequency,",")
+		frequencyArr := strings.Split(frequency, ",")
 		condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
 		pars = append(pars, frequencyArr)
 	}
 
 	if dataState != "" {
-		stateArr := strings.Split(dataState,",")
+		stateArr := strings.Split(dataState, ",")
 		if strings.Contains(dataState, "normal") {
 			stateArr = append(stateArr, "")
 			condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
@@ -107,25 +107,50 @@ func (this *EdbInfoController) SmmApiList() {
 
 	sortStr := ``
 
+	keyword = strings.TrimSpace(keyword)
 	if keyword != "" {
-		keyWordArr := strings.Split(keyword, " ")
-		if len(keyWordArr) > 0 {
-			condition += " AND ( "
-			keywordStr := strings.Replace(keyword, " ", "", -1)
-			condition += ` CONCAT(index_name,index_code) LIKE '%` + keywordStr + `%' OR `
-			sortStr += ` CASE WHEN CONCAT(index_name,index_code) LIKE '%` + keywordStr + `%' THEN 1 `
-			for i, v := range keyWordArr {
-				condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
-				sortStr += ` WHEN CONCAT(index_name,index_code) LIKE '%` + v + `%' THEN  ` + strconv.Itoa(i+2) + ` `
+		//keyWordArr := strings.Split(keyword, " ")
+		//if len(keyWordArr) > 0 {
+		//	condition += " AND ( "
+		//	keywordStr := strings.Replace(keyword, " ", "", -1)
+		//	condition += ` CONCAT(index_name,index_code) LIKE '%` + keywordStr + `%' OR `
+		//	sortStr += ` CASE WHEN CONCAT(index_name,index_code) LIKE '%` + keywordStr + `%' THEN 1 `
+		//	for i, v := range keyWordArr {
+		//		condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+		//		sortStr += ` WHEN CONCAT(index_name,index_code) LIKE '%` + v + `%' THEN  ` + strconv.Itoa(i+2) + ` `
+		//	}
+		//	sortStr += ` END, `
+		//	condition = strings.TrimRight(condition, "OR")
+		//	condition += " ) "
+		//}
+
+		// ES搜
+		_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_YS, 0, []int{}, []int{}, []string{}, startSize, req.PageSize)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("ES-搜索SMM指标失败, %v", e)
+			return
+		}
+		if len(list) == 0 {
+			br.Data = data_manage.BaseFromSmmIndexListResp{
+				Paging: paging.GetPaging(req.CurrentIndex, req.PageSize, 0),
+				List:   make([]*data_manage.BaseFromSmmIndexItem, 0),
 			}
-			sortStr += ` END, `
-			condition = strings.TrimRight(condition, "OR")
-			condition += " ) "
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			return
 		}
+		var indexIds []int
+		for _, v := range list {
+			indexIds = append(indexIds, v.PrimaryId)
+		}
+		condition += fmt.Sprintf(" AND base_from_smm_index_id IN (%s)", utils.GetOrmInReplace(len(indexIds)))
+		pars = append(pars, indexIds)
 	}
 
 	if indexCodes != "" {
-		indexCodeArr := strings.Split(indexCodes,",")
+		indexCodeArr := strings.Split(indexCodes, ",")
 		indexCodeStr := ""
 		for _, v := range indexCodeArr {
 			indexCodeStr += "'" + v + "',"
@@ -141,7 +166,7 @@ func (this *EdbInfoController) SmmApiList() {
 	}
 
 	total, err := data_manage.GetSmmIndexDataListCount(condition, pars)
-	if err!= nil {
+	if err != nil {
 		br.Msg = "获取指标总数失败"
 		br.ErrMsg = "获取指标总数失败,Err:" + err.Error()
 		return
@@ -203,11 +228,11 @@ func (this *EdbInfoController) SmmApiTypeList() {
 
 	// 初始化
 	for _, v := range typeList {
-		if v.Type1 != ""{
-			if _, ok := typeMap[v.Type1];!ok {
+		if v.Type1 != "" {
+			if _, ok := typeMap[v.Type1]; !ok {
 				typeMap[v.Type1] = make(map[string][]string)
 			} else {
-				if _, ok := typeMap[v.Type1][v.Type2];!ok {
+				if _, ok := typeMap[v.Type1][v.Type2]; !ok {
 					typeMap[v.Type1][v.Type2] = make([]string, 0)
 				}
 			}
@@ -215,7 +240,7 @@ func (this *EdbInfoController) SmmApiTypeList() {
 	}
 
 	for _, v := range typeList {
-		if v.Type1 != ""{
+		if v.Type1 != "" {
 			typeMap[v.Type1][v.Type2] = append(typeMap[v.Type1][v.Type2], v.Type3)
 		}
 	}
@@ -227,7 +252,7 @@ func (this *EdbInfoController) SmmApiTypeList() {
 			var child data_manage.TypeListRespItem
 			child.Type = type2
 			for _, type3 := range type3List {
-				child.Child = append(child.Child, data_manage.TypeListRespItem{type3,nil})
+				child.Child = append(child.Child, data_manage.TypeListRespItem{type3, nil})
 			}
 			item.Child = append(item.Child, child)
 		}

+ 3 - 0
controllers/data_manage/smm_data.go

@@ -13,6 +13,7 @@ import (
 	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -63,6 +64,7 @@ func (this *EdbInfoController) SmmClassify() {
 
 	rootChildMap := make(map[int][]*data_manage.BaseFromSmmClassifyItems)
 	for _, v := range classifyAll {
+		v.UniqueCode = strconv.Itoa(v.ClassifyId)
 		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
 		/*if existItems, ok := baseFromSmmIndexMap[v.ClassifyId]; ok {
 			v.Children = existItems
@@ -93,6 +95,7 @@ func (this *EdbInfoController) SmmClassify() {
 		Level:              1,
 		Sort:               0,
 		Children:           nil,
+		UniqueCode:         "0",
 	}
 	/*initIndexList, err := data_manage.GetBaseFromSmmIndexByClassifyId(initClassify.ClassifyId)
 	if err != nil {

+ 6 - 1
controllers/data_manage/stl/stl.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models"
 	"eta/eta_api/services/data/stl"
 	"eta/eta_api/utils"
+	"strings"
 
 	"eta/eta_api/models/data_manage/stl/request"
 	"eta/eta_api/models/data_manage/stl/response"
@@ -196,6 +197,10 @@ func (this *STLController) EdbInfoFilterByEs() {
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 	keyWord := this.GetString("KeyWord")
+	if keyWord == "" {
+		keyWord = this.GetString("Keyword")
+	}
+	keyWord = strings.TrimSpace(keyWord)
 
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
@@ -203,7 +208,7 @@ func (this *STLController) EdbInfoFilterByEs() {
 	if currentIndex <= 0 {
 		currentIndex = 1
 	}
-	resp, msg, err := stl.SearchEdbInfoWithStl(this.SysUser.AdminId, keyWord, currentIndex, pageSize)
+	resp, msg, err := stl.SearchEdbInfoWithStl(this.SysUser.AdminId, keyWord, currentIndex, pageSize, this.Lang)
 	if err != nil {
 		if msg == "" {
 			msg = "获取异常"

+ 272 - 0
controllers/data_source/data_source.go

@@ -0,0 +1,272 @@
+package data_source
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	dataSourceModel "eta/eta_api/models/data_source"
+	"eta/eta_api/services/elastic"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+)
+
+// SearchByEs
+// @Title ES搜索
+// @Description ES搜索
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   Source   query   int  true       "数据源"
+// @Success 200 {object} response.ExcelListResp
+// @router /common/search_by_es [get]
+func (c *DataSourceController) SearchByEs() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+	keyword := c.GetString("KeyWord")
+	if keyword == `` {
+		keyword = c.GetString("Keyword")
+	}
+	source, _ := c.GetInt("Source")
+	if source <= 0 {
+		br.Msg = "来源有误"
+		br.ErrMsg = fmt.Sprintf("数据来源有误, Source: %d", source)
+		return
+	}
+	subSource, _ := c.GetInt("SubSource")
+
+	// 以下为兼容各旧接口的额外传参,不为空时修改Resp对应的Key
+	primaryIdKey := c.GetString("PrimaryIdKey")
+	indexNameKey := c.GetString("IndexNameKey")
+	classifyIdKey := c.GetString("ClassifyIdKey")
+
+	var total, startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize15
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	// es搜索
+	t, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, source, subSource, []int{}, []int{}, []string{}, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("ES-搜索数据源列表失败, %v", e)
+		return
+	}
+	total = int(t)
+
+	// (短期方案)中国煤炭市场网/煤炭江湖额外补充基础字段
+	indexModifyTime := make(map[string]string)
+	indexBaseInfo := make(map[string]*dataSourceModel.BaseFromCoalmineIndexBase)
+	{
+		if source == utils.DATA_SOURCE_MTJH {
+			var updateCodes []string
+			for _, v := range list {
+				if v.ModifyTime == "" {
+					updateCodes = append(updateCodes, v.IndexCode)
+				}
+			}
+			if len(updateCodes) > 0 {
+				baseIndexes, e := dataSourceModel.GetMtjhBaseInfoFromDataTable(updateCodes)
+				if e != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = fmt.Sprintf("获取煤炭江湖指标基础信息失败, %v", e)
+					return
+				}
+				for _, v := range baseIndexes {
+					indexModifyTime[v.IndexCode] = utils.TimeTransferString(utils.FormatDateTime, v.ModifyTime)
+				}
+			}
+		}
+		if source == utils.DATA_SOURCE_COAL {
+			var updateCodes []string
+			for _, v := range list {
+				if v.Unit == "" || v.Frequency == "" || v.ModifyTime == "" {
+					updateCodes = append(updateCodes, v.IndexCode)
+				}
+			}
+			if len(updateCodes) > 0 {
+				baseIndexes, e := dataSourceModel.GetCoalmineBaseInfoFromDataTable(updateCodes)
+				if e != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = fmt.Sprintf("获取中国煤炭市场网指标基础信息失败, %v", e)
+					return
+				}
+				for _, v := range baseIndexes {
+					indexBaseInfo[v.IndexCode] = v
+				}
+			}
+		}
+	}
+
+	listMap := make([]map[string]interface{}, 0)
+	for _, v := range list {
+		// (短期方案)由于start_date、end_date和latest_value字段不全的历史遗留问题,这里查出来并补充进ES里面去
+		var updateEs bool
+		if v.StartDate == "" || v.EndDate == "" || v.LatestValue == "" || v.LatestValue == "0" {
+			minMax, e := dataSourceModel.GetBaseIndexDataMinMax(v.Source, v.SubSource, v.IndexCode)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("获取指标开始结束时间失败, %v", e)
+				return
+			}
+			if minMax != nil {
+				v.StartDate = minMax.MinDate
+				v.EndDate = minMax.MaxDate
+				v.LatestValue = minMax.LatestValue
+				updateEs = true
+			}
+		}
+
+		// 煤炭江湖缺ModifyTime
+		if source == utils.DATA_SOURCE_MTJH && v.ModifyTime == "" && indexModifyTime[v.IndexCode] != "" {
+			v.ModifyTime = indexModifyTime[v.IndexCode]
+			updateEs = true
+		}
+
+		// 中国煤炭市场网缺Unit, Frequency, ModifyTime
+		if source == utils.DATA_SOURCE_COAL && (v.Unit == "" || v.Frequency == "" || v.ModifyTime == "") {
+			if indexBaseInfo[v.IndexCode] != nil {
+				v.Unit = indexBaseInfo[v.IndexCode].Unit
+				v.Frequency = indexBaseInfo[v.IndexCode].Frequency
+				v.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, indexBaseInfo[v.IndexCode].ModifyTime)
+				updateEs = true
+			}
+		}
+
+		// 写入ES更新队列
+		if updateEs {
+			if e := utils.Rc.LPush(utils.CACHE_DATA_SOURCE_ES_HANDLE, v); e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = fmt.Sprintf("写入ES更新队列失败, Source: %d, IndexCode: %s, err: %v", v.Source, v.IndexCode, e)
+				return
+			}
+		}
+
+		// 转换成map返回
+		listMap = append(listMap, v.ToMap(primaryIdKey, indexNameKey, classifyIdKey))
+	}
+
+	// 美国农业部(多一个ParentClassifyId字段)
+	if source == utils.DATA_SOURCE_USDA_FAS {
+		// 父级分类ID
+		classifyIds := make([]int, 0)
+		for _, v := range list {
+			classifyIds = append(classifyIds, v.ClassifyId)
+		}
+		classifyList, e := data_manage.GetBaseFromUsdaFasClassifyByIds(classifyIds)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取美国农业部分类失败, %v", e)
+			return
+		}
+		classifyMap := make(map[int]int)
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v.ParentId
+		}
+		for _, v := range listMap {
+			id, ok := v["ClassifyId"].(int)
+			if !ok {
+				v["ParentClassifyId"] = 0
+				continue
+			}
+			v["ParentClassifyId"] = classifyMap[id]
+		}
+	}
+
+	// 煤炭江湖(多一个Area字段)
+	if source == utils.DATA_SOURCE_MTJH {
+		cond := ``
+		pars := make([]interface{}, 0)
+		indexes, e := data_manage.GetMtjhItemsByCondition(cond, pars)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取煤炭江湖指标失败, %v", e)
+			return
+		}
+		indexArea := make(map[string]string)
+		for _, v := range indexes {
+			indexArea[v.IndexCode] = v.Area
+		}
+		for _, v := range listMap {
+			code, ok := v["IndexCode"].(string)
+			if !ok {
+				v["Area"] = ""
+				continue
+			}
+			v["Area"] = indexArea[code]
+		}
+	}
+
+	// 分类的唯一编码(前端定位用)
+	if classifyIdKey == "" {
+		classifyIdKey = "ClassifyId"
+	}
+	idUniqueCodeArr := []int{
+		utils.DATA_SOURCE_SCI_HQ, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, utils.DATA_SOURCE_YS, utils.DATA_SOURCE_EIA_STEO,
+	}
+	if utils.InArrayByInt(idUniqueCodeArr, source) {
+		for _, v := range listMap {
+			classifyId, ok := v[classifyIdKey].(int)
+			if !ok {
+				v["ClassifyUniqueCode"] = ""
+				continue
+			}
+			v["ClassifyUniqueCode"] = strconv.Itoa(classifyId)
+		}
+	}
+	//if source == utils.DATA_SOURCE_MANUAL {
+	//	// 手工指标
+	//	var wxUserId int64
+	//	wxUserId = int64(sysUser.AdminId)
+	//	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+	//		wxUserId = 0
+	//	}
+	//	classifies, err := models.GetEdbdataClassify(wxUserId)
+	//	if err != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = fmt.Sprintf("获取手工指标分类失败, %v", e)
+	//		return
+	//	}
+	//	unicodeMap := make(map[int]string)
+	//	for _, v := range classifies {
+	//		unicodeMap[v.ClassifyId] = v.UniqueCode
+	//	}
+	//	for _, v := range listMap {
+	//		classifyId, ok := v["ClassifyId"].(int)
+	//		if !ok {
+	//			continue
+	//		}
+	//		v["ClassifyUniqueCode"] = unicodeMap[classifyId]
+	//	}
+	//}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := dataSourceModel.SearchDataSourceResp{
+		Paging: page,
+		List:   listMap,
+	}
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 6 - 2
controllers/trade_analysis/warehouse.go

@@ -1285,7 +1285,7 @@ func (this *WarehouseController) SearchByEs() {
 	sourceList := make([]int, 0)
 	sourceList = append(sourceList, utils.CHART_SOURCE_TRADE_ANALYSIS_PROCESS)
 
-	var searchList []*data_manage.ChartInfo
+	var searchList []*data_manage.ChartInfoMore
 	var total int64
 	var err error
 
@@ -1338,13 +1338,17 @@ func (this *WarehouseController) SearchByEs() {
 
 		for _, v := range searchList {
 			tmp := new(data_manage.ChartInfoMore)
-			tmp.ChartInfo = *v
+			tmp.ChartInfo = v.ChartInfo
 			// 图表数据权限
 			tmp.HaveOperaAuth = true
 			//判断是否需要展示英文标识
 			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
 				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
 			}
+			tmp.SearchText = v.SearchText
+			if tmp.SearchText == "" {
+				tmp.SearchText = v.ChartName
+			}
 			finalList = append(finalList, tmp)
 		}
 	}

+ 2 - 0
models/ai_predict_model/ai_predict_model_index.go

@@ -203,6 +203,7 @@ type AiPredictModelIndexItem struct {
 	SysUserRealName   string  `description:"创建人姓名"`
 	CreateTime        string  `description:"创建时间"`
 	ModifyTime        string  `description:"修改时间"`
+	SearchText        string  `description:"搜索结果(含高亮)"`
 }
 
 func (m *AiPredictModelIndex) Format2Item() (item *AiPredictModelIndexItem) {
@@ -342,6 +343,7 @@ func (m *AiPredictModelIndex) ImportIndexAndData(createIndexes, updateIndexes []
 				err = fmt.Errorf("insert index err: %v", e)
 				return
 			}
+			v.Index.AiPredictModelIndexId = int(indexId)
 			for _, d := range v.Data {
 				d.AiPredictModelIndexId = int(indexId)
 				d.IndexCode = v.Index.IndexCode

+ 46 - 38
models/business_conf.go

@@ -12,49 +12,50 @@ import (
 var (
 	BusinessConfMap map[string]string
 )
-const (
-	BusinessConfUseXf                     = "UseXf"
-	BusinessConfXfAppid                   = "XfAppid"
-	BusinessConfXfApiKey                  = "XfApiKey"
-	BusinessConfXfApiSecret               = "XfApiSecret"
-	BusinessConfXfVcn                     = "XfVcn"
-	BusinessConfEnPptCoverImgs            = "EnPptCoverImgs"
-	BusinessConfIsReportApprove           = "IsReportApprove"
-	BusinessConfReportApproveType         = "ReportApproveType"
-	BusinessConfCompanyName               = "CompanyName"
-	BusinessConfCompanyWatermark          = "CompanyWatermark"
-	BusinessConfWatermarkChart            = "WatermarkChart"
-	BusinessConfLoginSmsTpId              = "LoginSmsTpId"
-	BusinessConfLoginSmsGjTpId            = "LoginSmsGjTpId"
-	BusinessConfSmsJhgnAppKey             = "SmsJhgnAppKey"
-	BusinessConfSmsJhgjAppKey             = "SmsJhgjAppKey"
-	BusinessConfLdapHost                  = "LdapHost"
-	BusinessConfLdapBase                  = "LdapBase"
-	BusinessConfLdapPort                  = "LdapPort"
-	BusinessConfEmailClient               = "EmailClient"
-	BusinessConfEmailServerHost           = "EmailServerHost"
-	BusinessConfEmailServerPort           = "EmailServerPort"
-	BusinessConfEmailSender               = "EmailSender"
-	BusinessConfEmailSenderUserName       = "EmailSenderUserName"
-	BusinessConfEmailSenderPassword       = "EmailSenderPassword"
-	BusinessConfSmsClient                 = "SmsClient"
-	BusinessConfNanHuaSmsAppKey           = "NanHuaSmsAppKey"
-	BusinessConfNanHuaSmsAppSecret        = "NanHuaSmsAppSecret"
-	BusinessConfNanHuaSmsApiHost          = "NanHuaSmsApiHost"
-	BusinessConfLoginSmsTplContent        = "LoginSmsTplContent"
-	BusinessConfLoginEmailTemplateSubject = "LoginEmailTemplateSubject"
-	BusinessConfLoginEmailTemplateContent = "LoginEmailTemplateContent"
-	BusinessConfLdapBindUserSuffix        = "LdapBindUserSuffix"
-	BusinessConfLdapUserFilter            = "LdapUserFilter"
 
+const (
+	BusinessConfUseXf                        = "UseXf"
+	BusinessConfXfAppid                      = "XfAppid"
+	BusinessConfXfApiKey                     = "XfApiKey"
+	BusinessConfXfApiSecret                  = "XfApiSecret"
+	BusinessConfXfVcn                        = "XfVcn"
+	BusinessConfEnPptCoverImgs               = "EnPptCoverImgs"
+	BusinessConfIsReportApprove              = "IsReportApprove"
+	BusinessConfReportApproveType            = "ReportApproveType"
+	BusinessConfCompanyName                  = "CompanyName"
+	BusinessConfCompanyWatermark             = "CompanyWatermark"
+	BusinessConfWatermarkChart               = "WatermarkChart"
+	BusinessConfLoginSmsTpId                 = "LoginSmsTpId"
+	BusinessConfLoginSmsGjTpId               = "LoginSmsGjTpId"
+	BusinessConfSmsJhgnAppKey                = "SmsJhgnAppKey"
+	BusinessConfSmsJhgjAppKey                = "SmsJhgjAppKey"
+	BusinessConfLdapHost                     = "LdapHost"
+	BusinessConfLdapBase                     = "LdapBase"
+	BusinessConfLdapPort                     = "LdapPort"
+	BusinessConfEmailClient                  = "EmailClient"
+	BusinessConfEmailServerHost              = "EmailServerHost"
+	BusinessConfEmailServerPort              = "EmailServerPort"
+	BusinessConfEmailSender                  = "EmailSender"
+	BusinessConfEmailSenderUserName          = "EmailSenderUserName"
+	BusinessConfEmailSenderPassword          = "EmailSenderPassword"
+	BusinessConfSmsClient                    = "SmsClient"
+	BusinessConfNanHuaSmsAppKey              = "NanHuaSmsAppKey"
+	BusinessConfNanHuaSmsAppSecret           = "NanHuaSmsAppSecret"
+	BusinessConfNanHuaSmsApiHost             = "NanHuaSmsApiHost"
+	BusinessConfLoginSmsTplContent           = "LoginSmsTplContent"
+	BusinessConfLoginEmailTemplateSubject    = "LoginEmailTemplateSubject"
+	BusinessConfLoginEmailTemplateContent    = "LoginEmailTemplateContent"
+	BusinessConfLdapBindUserSuffix           = "LdapBindUserSuffix"
+	BusinessConfLdapUserFilter               = "LdapUserFilter"
 	BusinessConfTencentApiSecretId           = "TencentApiSecretId"           // 腾讯云API-密钥对
 	BusinessConfTencentApiSecretKey          = "TencentApiSecretKey"          // 腾讯云API-密钥对
 	BusinessConfTencentApiRecTaskCallbackUrl = "TencentApiRecTaskCallbackUrl" // 腾讯云API-语音识别回调地址
 	BusinessConfSmsJhgjVariable              = "SmsJhgjVariable"              // 聚合国际短信变量
-
-	BusinessConfEdbStopRefreshRule = "EdbStopRefreshRule" // 是否停止指标刷新规则
-	BusinessConfReport2ImgUrl      = "Report2ImgUrl"      // 报告转长图地址(用于兼容内外网环境的)
-	BusinessConfReportViewUrl      = "ReportViewUrl"      // 报告详情地址
+	BusinessConfEdbStopRefreshRule           = "EdbStopRefreshRule"           // 是否停止指标刷新规则
+	BusinessConfReport2ImgUrl                = "Report2ImgUrl"                // 报告转长图地址(用于兼容内外网环境的)
+	BusinessConfReportViewUrl                = "ReportViewUrl"                // 报告详情地址
+	BusinessConfEsIndexNameExcel             = "EsIndexNameExcel"             // ES索引名称-表格
+	BusinessConfEsIndexNameDataSource        = "EsIndexNameDataSource"        // ES索引名称-数据源
 )
 
 const (
@@ -265,4 +266,11 @@ func InitBusinessConf() {
 	if e != nil {
 		return
 	}
+	// ES索引名称
+	if BusinessConfMap[BusinessConfEsIndexNameExcel] != "" {
+		utils.EsExcelIndexName = BusinessConfMap[BusinessConfEsIndexNameExcel]
+	}
+	if BusinessConfMap[BusinessConfEsIndexNameDataSource] != "" {
+		utils.EsDataSourceIndexName = BusinessConfMap[BusinessConfEsIndexNameDataSource]
+	}
 }

+ 1 - 0
models/data_manage/base_from_eia_stero.go

@@ -58,6 +58,7 @@ type BaseFromEiaSteoClassifyView struct {
 	ClassifyNameOriginal      string                         `description:"分类名称(原始名称)"`
 	ParentId                  int                            `description:"父级id"`
 	Level                     int                            `description:"层级"`
+	UniqueCode                string                         `description:"唯一编码"`
 	Child                     []*BaseFromEiaSteoClassifyView `description:"子级分类列表"`
 }
 

+ 21 - 14
models/data_manage/base_from_mtjh.go

@@ -2,6 +2,7 @@ package data_manage
 
 import (
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -35,16 +36,16 @@ type BaseFromMtjhIndex struct {
 }
 
 type BaseFromMtjhIndexItem struct {
-	BaseFromMtjhIndexId int       `orm:"column(base_from_mtjh_index_id);pk"`
-	IndexName           string    `description:"持买单量指标名称"`
-	IndexCode           string    `description:"持买单量指标编码"`
-	DealValue           string    `description:"成交量"`
-	DataTime            string    `description:"数据日期"`
-	Area                string    `description:"区域"`
-	Port                string    `description:"港口或码头"`
-	Unit                string    `description:"单位"`
-	Frequency           string    `description:"频率"`
-	Variety             string    `description:"品种"`
+	BaseFromMtjhIndexId int    `orm:"column(base_from_mtjh_index_id);pk"`
+	IndexName           string `description:"持买单量指标名称"`
+	IndexCode           string `description:"持买单量指标编码"`
+	DealValue           string `description:"成交量"`
+	DataTime            string `description:"数据日期"`
+	Area                string `description:"区域"`
+	Port                string `description:"港口或码头"`
+	Unit                string `description:"单位"`
+	Frequency           string `description:"频率"`
+	Variety             string `description:"品种"`
 	CreateTime          string `description:"插入时间"`
 	ModifyTime          string `description:"修改时间"`
 }
@@ -143,7 +144,6 @@ type BaseFromMtjhIndexList struct {
 	Paging                *paging.PagingItem `description:"分页数据"`
 }
 
-
 func GetMtjhIndexDataCount(indexCode string) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count  FROM base_from_mtjh_index WHERE index_code=? `
@@ -151,7 +151,6 @@ func GetMtjhIndexDataCount(indexCode string) (count int, err error) {
 	return
 }
 
-
 func GetMtjhIndexData(indexCode string, startSize, pageSize int) (items []*BaseFromMtjhIndexItem, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT *  FROM base_from_mtjh_index WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
@@ -187,7 +186,7 @@ func GetMtjhMappingItemByCode(indexCode string) (item *BaseFromMtjhMappingItem,
 func GetMtjhFrequencyByArea(area string) (items []*string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := "SELECT frequency FROM base_from_mtjh_index WHERE area=?  group by area "
-	_,err = o.Raw(sql, area).QueryRows(&items)
+	_, err = o.Raw(sql, area).QueryRows(&items)
 	return
 }
 
@@ -233,4 +232,12 @@ func GetMtjhIndexLatestDate(indexCode string) (ModifyTime string, err error) {
 	sql := ` SELECT modify_time FROM base_from_mtjh_index WHERE index_code=? ORDER BY modify_time DESC limit 1 `
 	err = o.Raw(sql, indexCode).QueryRow(&ModifyTime)
 	return
-}
+}
+
+// GetMtjhItemsByCondition 获取煤炭江湖指标
+func GetMtjhItemsByCondition(cond string, pars []interface{}) (items []*BaseFromMtjhMappingItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM base_from_mtjh_mapping WHERE 1=1 %s`, cond)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 1 - 1
models/data_manage/base_from_smm_classify.go

@@ -98,7 +98,7 @@ type BaseFromSmmClassifyItems struct {
 	ParentId             int    `description:"父级id"`
 	Level                int    `description:"层级"`
 	Sort                 int    `description:"排序字段,越小越靠前,默认值:10"`
-	//UniqueCode         string                         `description:"唯一编码"`
+	UniqueCode           string `description:"唯一编码"`
 	//ModifyTime         time.Time                      `description:"修改时间"`
 	//CreateTime         time.Time                      `description:"创建时间"`
 	Children []*BaseFromSmmClassifyItems `description:"下级"`

+ 7 - 0
models/data_manage/chart_framework.go

@@ -4,6 +4,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
 )
@@ -356,3 +357,9 @@ type ChartFrameworkPublicMenuItem struct {
 	MenuName   string                `description:"目录名称"`
 	Frameworks []*ChartFrameworkItem `description:"框架列表"`
 }
+
+// ChartFrameworkListResp 图库框架分页列表
+type ChartFrameworkListResp struct {
+	Paging *paging.PagingItem
+	List   []*ChartFrameworkItem
+}

+ 4 - 3
models/data_manage/chart_info.go

@@ -65,8 +65,9 @@ type ChartInfo struct {
 
 type ChartInfoMore struct {
 	ChartInfo
-	IsEnChart     bool `description:"是否展示英文标识"`
-	HaveOperaAuth bool `description:"是否有数据权限,默认:false"`
+	IsEnChart     bool   `description:"是否展示英文标识"`
+	HaveOperaAuth bool   `description:"是否有数据权限,默认:false"`
+	SearchText    string `description:"搜索结果(含高亮)"`
 }
 
 func AddChartInfo(item *ChartInfo) (lastId int64, err error) {
@@ -1723,7 +1724,7 @@ func ChartInfoSearchByKeyWord(keyword string, showSysId int) (searchList []*Char
 }
 
 // ChartInfoSearchByEmptyKeyWord 没有关键字的时候获取默认100条数据
-func ChartInfoSearchByEmptyKeyWord(showSysId int, sourceList []int, noPermissionChartIdList []int, startSize, pageSize int) (total int64, searchList []*ChartInfo, err error) {
+func ChartInfoSearchByEmptyKeyWord(showSysId int, sourceList []int, noPermissionChartIdList []int, startSize, pageSize int) (total int64, searchList []*ChartInfoMore, err error) {
 	num := len(sourceList)
 	o := orm.NewOrmUsingDB("data")
 

+ 9 - 1
models/data_manage/data_manage_permission/excel.go

@@ -1043,4 +1043,12 @@ func GetExcelPermissionByExcelIdAndUserId(excelId, userId int) (items []*ExcelIn
 	sql := `SELECT * FROM excel_info_permission WHERE excel_info_id = ? AND sys_user_id = ?`
 	_, err = o.Raw(sql, excelId, userId).QueryRows(&items)
 	return
-}
+}
+
+// GetExcelInfoDataNoPermissionByUserId 获取用户所有无权限表格
+func GetExcelInfoDataNoPermissionByUserId(userId, source int) (items []*DataPermissionNoAuthRecord, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT excel_info_permission_no_auth_record_id as data_permission_no_auth_record_id,op_unique_code,source as sub_source,excel_info_id as data_id,excel_name as data_name,sys_user_id,create_time FROM excel_info_permission_no_auth_record WHERE sys_user_id = ? AND source = ? ORDER BY excel_info_permission_no_auth_record_id desc`
+	_, err = o.Raw(sql, userId, source).QueryRows(&items)
+	return
+}

+ 1 - 0
models/data_manage/edb_info.go

@@ -473,6 +473,7 @@ type EdbInfoList struct {
 	MoveFrequency    string                  `description:"移动频度"`
 	MinValue         float64                 `description:"最小值"`
 	MaxValue         float64                 `description:"最大值"`
+	SearchText       string                  `description:"搜索结果(含高亮)"`
 }
 
 type EdbDataInsertConfigItem struct {

+ 14 - 3
models/data_manage/excel/excel_info.go

@@ -89,11 +89,12 @@ func AddExcelInfo(excelInfo *ExcelInfo, excelEdbMappingList []*ExcelEdbMapping,
 	if childExcel != nil {
 		// 表格信息入库
 		childExcel.ParentId = excelInfo.ExcelInfoId
-		_, err = o.Insert(childExcel)
-		if err != nil {
-			err = fmt.Errorf("新增子表失败:%v", err)
+		childId, e := o.Insert(childExcel)
+		if e != nil {
+			err = fmt.Errorf("新增子表失败:%v", e)
 			return
 		}
+		childExcel.ExcelInfoId = int(childId)
 	}
 	// excel与指标的关联关系
 	dataNum := len(excelEdbMappingList)
@@ -813,3 +814,13 @@ func UpdateExcelInfoClassifyIdByIds(classifyId int, excelIds []int) (err error)
 	_, err = o.Raw(sql, classifyId, excelIds).Exec()
 	return
 }
+
+// SearchExcelInfo 表格搜索
+type SearchExcelInfo struct {
+	ExcelInfo
+	SearchText    string                `description:"搜索结果(含高亮)"`
+	HaveOperaAuth bool                  `description:"是否有数据权限"`
+	Button        ExcelInfoDetailButton `description:"操作权限"`
+	CanEdit       bool                  `description:"是否可编辑"`
+	Editor        string                `description:"编辑人"`
+}

+ 6 - 0
models/data_manage/excel/response/excel_info.go

@@ -126,3 +126,9 @@ type ShareExcelInfoDetail struct {
 type ExcelRuleListResp struct {
 	List []*excel2.ExcelInfoRuleMappingView
 }
+
+// SearchExcelListResp 搜索表格列表返回数据
+type SearchExcelListResp struct {
+	Paging *paging.PagingItem
+	List   []*excel2.SearchExcelInfo
+}

+ 33 - 7
models/data_manage/gl_data.go

@@ -2,6 +2,7 @@ package data_manage
 
 import (
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
@@ -114,13 +115,21 @@ func GetGlIndexDataCount(indexCode string) (count int, err error) {
 }
 
 type GlSearchIndex struct {
-	Id             int    `orm:"column(ID)"`
-	IndexCode      string `orm:"column(INDEX_CODE)"`
-	IndexName      string `orm:"column(INDEX_NAME)"`
-	UnitName       string `orm:"column(UNIT_NAME)"`
-	FrequencyName  string `orm:"column(FREQUENCY_NAME)"`
-	UpdateTime     string `orm:"column(UPDATE_TIME)"`
-	BreedShortName string `orm:"column(BREED_SHORT_NAME)"`
+	Id             int     `orm:"column(ID)"`
+	IndexCode      string  `orm:"column(INDEX_CODE)"`
+	IndexName      string  `orm:"column(INDEX_NAME)"`
+	UnitName       string  `orm:"column(UNIT_NAME)"`
+	FrequencyName  string  `orm:"column(FREQUENCY_NAME)"`
+	UpdateTime     string  `orm:"column(UPDATE_TIME)"`
+	BreedShortName string  `orm:"column(BREED_SHORT_NAME)"`
+	StartDate      string  `orm:"column(BEGIN_DATE)"`
+	EndDate        string  `orm:"column(END_DATE)"`
+	LatestValue    float64 `orm:"column(DATA_VALUE)"`
+	CreateTime     string  `orm:"column(CREATE_TIME)"`
+	ModifyTime     string  `orm:"column(UPDATE_TIME)"`
+	Source         int
+	SourceName     string
+	SearchText     string `description:"搜索结果(含高亮)"`
 }
 
 // GetGlItemList 模糊查询隆众数据库指标列表
@@ -155,3 +164,20 @@ GROUP BY
 	_, err = o.Raw(sql, indexCode).QueryRows(&items)
 	return
 }
+
+// GlDataPageListResp 钢联原始指标库-分页列表
+type GlDataPageListResp struct {
+	Paging *paging.PagingItem
+	List   []*GlSearchIndex
+}
+
+// GetGlItemListByIds IDs获取钢联原始指标库
+func GetGlItemListByIds(ids []int) (items []*GlSearchIndex, err error) {
+	if len(ids) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("gl")
+	sql := fmt.Sprintf(`SELECT * FROM mb_index_main_info WHERE ID IN (%s)`, utils.GetOrmInReplace(len(ids)))
+	_, err = o.Raw(sql, ids).QueryRows(&items)
+	return
+}

+ 1 - 0
models/data_manage/my_chart.go

@@ -329,6 +329,7 @@ type MyChartList struct {
 	Source              int    `description:"1:ETA图库;2:商品价格曲线"`
 	IsJoinPermission    int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth       bool   `description:"是否有数据权限,默认:false"`
+	SearchText          string `description:"搜索结果(含高亮)"`
 }
 
 type MyChartListResp struct {

+ 18 - 16
models/data_source/base_from_sci99.go

@@ -17,6 +17,9 @@ type BaseFromSci99Index struct {
 	Describe           string    // 指标描述
 	CreateTime         time.Time // 创建时间
 	ModifyTime         time.Time // 修改时间
+	StartDate          time.Time `description:"开始日期"`
+	EndDate            time.Time `description:"结束日期"`
+	LatestValue        float64   `description:"最新值"`
 }
 
 // BaseFromSci99Data 代表卓创资讯-原始指标数据表的结构
@@ -40,23 +43,23 @@ type BaseFromSci99Classify struct {
 }
 
 type BaseFromSci99DataItem struct {
-	BaseFromSciDataId  int       `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
-	BaseFromSciIndexId int       // 指标id
-	IndexCode          string    // 指标编码
-	DataTime           string    // 数据日期
-	Value              float64   // 数据值
-	CreateTime         string // 创建时间
-	ModifyTime         string // 修改时间
+	BaseFromSciDataId  int     `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
+	BaseFromSciIndexId int     // 指标id
+	IndexCode          string  // 指标编码
+	DataTime           string  // 数据日期
+	Value              float64 // 数据值
+	CreateTime         string  // 创建时间
+	ModifyTime         string  // 修改时间
 }
 
 type BaseFromSci99IndexList struct {
-	BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"` // 主键,自动递增
-	IndexCode          string    // 指标编码
-	IndexName          string    // 指标名称
-	ClassifyId         int       // 分类Id
-	Unit               string    // 单位
-	Frequency          string    // 频度
-	Describe           string    // 指标描述
+	BaseFromSciIndexId int    `orm:"column(base_from_sci_index_id);pk"` // 主键,自动递增
+	IndexCode          string // 指标编码
+	IndexName          string // 指标名称
+	ClassifyId         int    // 分类Id
+	Unit               string // 单位
+	Frequency          string // 频度
+	Describe           string // 指标描述
 	CreateTime         string // 创建时间
 	ModifyTime         string // 修改时间
 	DataList           []*BaseFromSci99DataItem
@@ -100,7 +103,6 @@ func GetSci99Index(condition string, pars interface{}) (items []*BaseFromSci99In
 	return
 }
 
-
 func GetSci99IndexDataCount(indexCode string) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count  FROM base_from_sci99_data WHERE index_code=? `
@@ -139,4 +141,4 @@ func GetSci99IndexLatestDate(indexCode string) (ModifyTime string, err error) {
 	sql := ` SELECT modify_time FROM base_from_sci99_data WHERE index_code=? ORDER BY modify_time DESC limit 1 `
 	err = o.Raw(sql, indexCode).QueryRow(&ModifyTime)
 	return
-}
+}

+ 2119 - 0
models/data_source/data_source.go

@@ -0,0 +1,2119 @@
+package data_source
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// SearchDataSource 数据源ES搜索
+type SearchDataSource struct {
+	PrimaryId   int    `description:"主键ID"`
+	IndexCode   string `description:"指标编码"`
+	IndexName   string `description:"指标名称"`
+	ClassifyId  int    `description:"分类ID"`
+	Unit        string `description:"单位"`
+	Frequency   string `description:"频度"`
+	StartDate   string `description:"开始日期"`
+	EndDate     string `description:"结束日期"`
+	LatestValue string `description:"最新值(部分数据源如中国煤炭网存在97%这种数据...)"`
+	Source      int    `description:"来源"`
+	SourceName  string `description:"数据源名称"`
+	SubSource   int    `description:"子来源"`
+	IsDeleted   int    `description:"是否已删除:0-正常;1-已删除"`
+	CreateTime  string `description:"创建时间"`
+	ModifyTime  string `description:"修改时间"`
+}
+
+// SearchDataSourceItem 数据源ES搜索
+type SearchDataSourceItem struct {
+	SearchDataSource
+	SearchText string `description:"搜索结果(含高亮)"`
+}
+
+// ToMap 为了方便前端那边的修改,这里兼容一下部分Key的变动,不然改动量很大
+func (s *SearchDataSourceItem) ToMap(primaryIdKey, indexNameKey, classifyIdKey string) map[string]interface{} {
+	data := make(map[string]interface{})
+	if primaryIdKey != "" {
+		data[primaryIdKey] = s.PrimaryId
+	} else {
+		data["PrimaryId"] = s.PrimaryId
+	}
+	if indexNameKey != "" {
+		data[indexNameKey] = s.IndexName
+	} else {
+		data["IndexName"] = s.IndexName
+	}
+	if classifyIdKey != "" {
+		data[classifyIdKey] = s.ClassifyId
+	} else {
+		data["ClassifyId"] = s.ClassifyId
+	}
+	data["IndexCode"] = s.IndexCode
+	data["Unit"] = s.Unit
+	data["Frequency"] = s.Frequency
+	data["StartDate"] = s.StartDate
+	data["EndDate"] = s.EndDate
+	data["LatestValue"] = s.LatestValue
+	data["Source"] = s.Source
+	data["SourceName"] = s.SourceName
+	data["IsDeleted"] = s.IsDeleted
+	data["CreateTime"] = s.CreateTime
+	data["ModifyTime"] = s.ModifyTime
+	data["SearchText"] = s.SearchText
+	return data
+}
+
+// SearchDataSourceResp 数据源ES-分页搜索响应
+type SearchDataSourceResp struct {
+	Paging *paging.PagingItem
+	List   []map[string]interface{}
+}
+
+// SearchEsCols 数据源ES搜索字段
+type SearchEsCols struct {
+	PrimaryId   string
+	IndexCode   string
+	IndexName   string
+	ClassifyId  string
+	Unit        string
+	Frequency   string
+	StartDate   string
+	EndDate     string
+	LatestValue string
+	CreateTime  string
+	ModifyTime  string
+}
+
+// EsBaseFromIndex 数据源ES统一实现的接口
+type EsBaseFromIndex interface {
+	EsCols() SearchEsCols
+	SourceInfo() (int, int, string)
+}
+
+// GetEsBaseFromIndexByTableName 根据表名获取对应数据源
+func GetEsBaseFromIndexByTableName(tableName string) EsBaseFromIndex {
+	switch tableName {
+	case "base_from_rzd_index":
+		return &BaseFromRzdIndex{}
+	case "base_from_hisugar_index":
+		return &BaseFromHisugarIndex{}
+	case "base_from_ly_index":
+		return &BaseFromLyIndex{}
+	case "base_from_sci_hq_index":
+		return &BaseFromSciHqIndex{}
+	case "base_from_oilchem_index":
+		return &BaseFromOilchemIndex{}
+	case "base_from_ths_hf_index":
+		return &BaseFromThsHfIndex{}
+	case "base_from_ccf_index":
+		return &BaseFromCcfIndex{}
+	case "base_from_usda_fas_index":
+		return &BaseFromUsdaFasIndex{}
+	case "base_from_mysteel_chemical_index":
+		return &BaseFromMysteelChemicalIndex{}
+	case "base_from_smm_index":
+		return &BaseFromSmmIndex{}
+	case "base_from_baiinfo_index":
+		return &BaseFromBaiinfoIndex{}
+	case "base_from_sci_index":
+		return &BaseFromSciIndex{}
+	case "base_from_coalmine_mapping":
+		return &BaseFromCoalmineMapping{}
+	case "base_from_eia_steo_index":
+		return &BaseFromEiaSteoIndex{}
+	case "base_from_icpi_index":
+		return &BaseFromIcpiIndex{}
+	case "base_from_yongyi_index":
+		return &BaseFromYongyiIndex{}
+	case "base_from_fenwei_index":
+		return &BaseFromFenweiIndex{}
+	case "base_from_sci99_index":
+		return &BaseFromSci99Index{}
+	case "mb_index_main_info":
+		return &BaseFromGlIndex{}
+	case "edbinfo":
+		return &BaseFromManualEdb{}
+	case "base_from_business_index":
+		return &BaseFromBusinessIndex{}
+	case "base_from_bloomberg_index":
+		return &BaseFromBloombergIndex{}
+	case "base_from_mtjh_mapping":
+		return &BaseFromMtjhMapping{}
+	}
+
+	return nil
+}
+
+// BaseFromRzdIndex 睿咨得
+type BaseFromRzdIndex struct {
+	BaseFromRzdIndexId    int       `orm:"column(base_from_rzd_index_id);pk"`
+	BaseFromRzdClassifyId int       `description:"分类ID"`
+	IndexCode             string    `description:"指标编码"`
+	IndexName             string    `description:"指标名称"`
+	Unit                  string    `description:"单位"`
+	Frequency             string    `description:"频度"`
+	StartDate             time.Time `description:"开始日期"`
+	EndDate               time.Time `description:"结束日期"`
+	LatestValue           float64   `description:"最新值"`
+	CreateTime            time.Time `description:"创建时间"`
+	ModifyTime            time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromRzdIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_RZD, 0, "睿咨得"
+}
+
+func (m *BaseFromRzdIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_rzd_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "base_from_rzd_classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromRzdIndex) Format2SearchDataSource(origin *BaseFromRzdIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromRzdIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.BaseFromRzdClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromRzdIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromRzdIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_rzd_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromHisugarIndex 泛糖科技
+type BaseFromHisugarIndex struct {
+	BaseFromHisugarIndexId int       `orm:"column(base_from_hisugar_index_id);pk"`
+	ClassifyId             int       `description:"分类ID"`
+	IndexCode              string    `description:"指标编码"`
+	IndexName              string    `description:"指标名称"`
+	Unit                   string    `description:"单位"`
+	Frequency              string    `description:"频度"`
+	Source                 string    `description:"数据来源"`
+	Describe               string    `description:"指标描述"`
+	Sort                   int       `description:"排序"`
+	StartDate              time.Time `description:"开始日期"`
+	EndDate                time.Time `description:"结束日期"`
+	LatestValue            float64   `description:"最新值"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromHisugarIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_HISUGAR, 0, "泛糖科技"
+}
+
+func (m *BaseFromHisugarIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_hisugar_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromHisugarIndex) Format2SearchDataSource(origin *BaseFromHisugarIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromHisugarIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromHisugarIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromHisugarIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_hisugar_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromLyIndex 粮油商务网
+type BaseFromLyIndex struct {
+	BaseFromLyIndexId    int       `orm:"column(base_from_ly_index_id);pk"`
+	BaseFromLyClassifyId int       `description:"分类ID"`
+	IndexCode            string    `description:"指标编码"`
+	IndexName            string    `description:"指标名称"`
+	Unit                 string    `description:"单位"`
+	Frequency            string    `description:"频度"`
+	StartDate            time.Time `description:"开始日期"`
+	EndDate              time.Time `description:"结束日期"`
+	LatestValue          float64   `description:"最新值"`
+	EdbExist             int       `description:"指标库是否已添加:0-否;1-是"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromLyIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_LY, 0, "粮油商务网"
+}
+
+func (m *BaseFromLyIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_ly_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "base_from_ly_classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromLyIndex) Format2SearchDataSource(origin *BaseFromLyIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromLyIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.BaseFromLyClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromLyIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromLyIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_ly_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromSciHqIndex 卓创红期
+type BaseFromSciHqIndex struct {
+	BaseFromSciHqIndexId int       `orm:"column(base_from_sci_hq_index_id);pk"`
+	ClassifyId           int       `description:"分类ID"`
+	IndexCode            string    `description:"指标编码"`
+	IndexName            string    `description:"指标名称"`
+	Unit                 string    `description:"单位"`
+	Frequency            string    `description:"频度"`
+	Sort                 int       `description:"排序"`
+	StartDate            time.Time `description:"开始日期"`
+	EndDate              time.Time `description:"结束日期"`
+	LatestValue          float64   `description:"最新值"`
+	LatestDate           time.Time `description:"最新更新时间"`
+	TerminalCode         string    `description:"指标描述"`
+	FilePath             string    `description:"文件路径"`
+	CreateTime           time.Time `description:"创建时间"`
+	ModifyTime           time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromSciHqIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_SCI_HQ, 0, "卓创红期"
+}
+
+func (m *BaseFromSciHqIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_sci_hq_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromSciHqIndex) Format2SearchDataSource(origin *BaseFromSciHqIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromSciHqIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromSciHqIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromSciHqIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_sci_hq_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromOilchemIndex 隆众资讯
+type BaseFromOilchemIndex struct {
+	BaseFromOilchemIndexId int       `orm:"column(base_from_oilchem_index_id);pk"`
+	ClassifyId             int       `description:"分类ID"`
+	IndexCode              string    `description:"指标编码"`
+	IndexName              string    `description:"指标名称"`
+	Unit                   string    `description:"单位"`
+	Frequency              string    `description:"频度"`
+	StartDate              time.Time `description:"开始日期"`
+	EndDate                time.Time `description:"结束日期"`
+	LatestValue            float64   `description:"最新值"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromOilchemIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_OILCHEM, 0, "隆众资讯"
+}
+
+func (m *BaseFromOilchemIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_oilchem_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromOilchemIndex) Format2SearchDataSource(origin *BaseFromOilchemIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromOilchemIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromOilchemIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromOilchemIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_oilchem_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromThsHfIndex 同花顺高频数据
+type BaseFromThsHfIndex struct {
+	BaseFromThsHfIndexId    int       `orm:"column(base_from_ths_hf_index_id);pk"`
+	BaseFromThsHfClassifyId int       `description:"分类ID"`
+	IndexCode               string    `description:"指标编码"`
+	IndexName               string    `description:"指标名称"`
+	Unit                    string    `description:"单位"`
+	Source                  string    `description:"数据来源"`
+	Frequency               string    `description:"频度"`
+	StartDate               time.Time `description:"开始日期(至时分秒)"`
+	EndDate                 time.Time `description:"结束日期(至时分秒)"`
+	Describe                string    `description:"指标描述"`
+	Sort                    int       `description:"排序"`
+	IsStop                  int       `description:"是否停更:0-否;1-停更"`
+	TerminalCode            string    `description:"所属终端编码"`
+	StockCode               string    `description:"证券代码"`
+	Indicator               string    `description:"同花顺指标代码"`
+	ApiPars                 string    `description:"API请求参数"`
+	LatestValue             float64   `description:"最新值"`
+	SysUserId               int       `description:"创建人ID"`
+	SysUserRealName         string    `description:"创建人姓名"`
+	CreateTime              time.Time `description:"创建时间"`
+	ModifyTime              time.Time `description:"修改时间"`
+}
+
+func (m *BaseFromThsHfIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_HIGH_FREQUENCY, "同花顺高频"
+}
+
+func (m *BaseFromThsHfIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_ths_hf_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "base_from_ths_hf_classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromThsHfIndex) Format2SearchDataSource(origin *BaseFromThsHfIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromThsHfIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.BaseFromThsHfClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDateTime, origin.StartDate) // 高频这里是到时分秒
+	item.EndDate = utils.TimeTransferString(utils.FormatDateTime, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromThsHfIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromThsHfIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_ths_hf_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromCcfIndex CCF化纤信息
+type BaseFromCcfIndex struct {
+	BaseFromCcfIndexId int       `orm:"column(base_from_ccf_index_id);pk"`
+	ClassifyId         int       `description:"分类ID"`
+	IndexCode          string    `description:"指标编码"`
+	IndexName          string    `description:"指标名称"`
+	Unit               string    `description:"单位"`
+	Frequency          string    `description:"频度"`
+	StartDate          time.Time `description:"开始日期"`
+	EndDate            time.Time `description:"结束日期"`
+	LatestValue        float64   `description:"最新值"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromCcfIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_CCF, 0, "CCF化纤信息"
+}
+
+func (m *BaseFromCcfIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_ccf_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromCcfIndex) Format2SearchDataSource(origin *BaseFromCcfIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromCcfIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromCcfIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromCcfIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_ccf_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromUsdaFasIndex 美国农业部
+type BaseFromUsdaFasIndex struct {
+	BaseFromUsdaFasIndexId int       `orm:"column(base_from_usda_fas_index_id);pk"`
+	ClassifyId             int       `description:"分类ID"`
+	IndexCode              string    `description:"指标编码"`
+	IndexName              string    `description:"指标名称"`
+	Unit                   string    `description:"单位"`
+	Frequency              string    `description:"频度"`
+	StartDate              time.Time `description:"开始日期"`
+	EndDate                time.Time `description:"结束日期"`
+	LatestValue            float64   `description:"最新值"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromUsdaFasIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_USDA_FAS, 0, "美国农业部"
+}
+
+func (m *BaseFromUsdaFasIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_usda_fas_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "end_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromUsdaFasIndex) Format2SearchDataSource(origin *BaseFromUsdaFasIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromUsdaFasIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromUsdaFasIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromUsdaFasIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s, end_value AS latest_value FROM base_from_usda_fas_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromMysteelChemicalIndex 上海钢联
+type BaseFromMysteelChemicalIndex struct {
+	BaseFromMysteelChemicalIndexId    int       `orm:"column(base_from_mysteel_chemical_index_id);pk"`
+	BaseFromMysteelChemicalClassifyId int       `description:"分类ID"`
+	IndexCode                         string    `description:"指标编码"`
+	IndexName                         string    `description:"指标名称"`
+	Unit                              string    `description:"单位"`
+	Frequency                         string    `description:"频度"`
+	StartDate                         time.Time `description:"开始日期"`
+	EndDate                           time.Time `description:"结束日期"`
+	LatestValue                       float64   `description:"最新值"`
+	CreateTime                        time.Time `description:"创建时间"`
+	ModifyTime                        time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromMysteelChemicalIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_MYSTEEL_CHEMICAL, 0, "上海钢联"
+}
+
+func (m *BaseFromMysteelChemicalIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_mysteel_chemical_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "base_from_mysteel_chemical_classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "end_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromMysteelChemicalIndex) Format2SearchDataSource(origin *BaseFromMysteelChemicalIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromMysteelChemicalIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.BaseFromMysteelChemicalClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromMysteelChemicalIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s, end_value AS latest_value FROM base_from_mysteel_chemical_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromSmmIndex 有色原始数据库
+type BaseFromSmmIndex struct {
+	BaseFromSmmIndexId int       `orm:"column(base_from_smm_index_id);pk"`
+	ClassifyId         int       `description:"分类ID"`
+	IndexCode          string    `description:"指标编码"`
+	IndexName          string    `description:"指标名称"`
+	Unit               string    `description:"单位"`
+	Frequency          string    `description:"频度"`
+	StartDate          time.Time `description:"开始日期"`
+	EndDate            time.Time `description:"结束日期"`
+	LatestValue        float64   `description:"最新值"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromSmmIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_YS, 0, "SMM原始数据库"
+}
+
+func (m *BaseFromSmmIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_smm_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "end_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromSmmIndex) Format2SearchDataSource(origin *BaseFromSmmIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromSmmIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromSmmIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s, end_value AS latest_value FROM base_from_smm_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromBaiinfoIndex 百川盈孚
+type BaseFromBaiinfoIndex struct {
+	BaseFromBaiinfoIndexId int       `orm:"column(base_from_baiinfo_index_id);pk"`
+	ClassifyId             int       `description:"分类ID"`
+	IndexCode              string    `description:"指标编码"`
+	IndexName              string    `description:"指标名称"`
+	Unit                   string    `description:"单位"`
+	Frequency              string    `description:"频度"`
+	StartDate              time.Time `description:"开始日期"`
+	EndDate                time.Time `description:"结束日期"`
+	LatestValue            float64   `description:"最新值"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromBaiinfoIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_BAIINFO, 0, "百川盈孚"
+}
+
+func (m *BaseFromBaiinfoIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_baiinfo_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromBaiinfoIndex) Format2SearchDataSource(origin *BaseFromBaiinfoIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromBaiinfoIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromBaiinfoIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_baiinfo_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromSciIndex 卓创数据(红桃3)
+type BaseFromSciIndex struct {
+	BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"`
+	ClassifyId         int       `description:"分类ID"`
+	IndexCode          string    `description:"指标编码"`
+	IndexName          string    `description:"指标名称"`
+	Unit               string    `description:"单位"`
+	Frequency          string    `description:"频度"`
+	StartDate          time.Time `description:"开始日期"`
+	EndDate            time.Time `description:"结束日期"`
+	LatestValue        float64   `description:"最新值"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromSciIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_SCI, 0, "卓创数据(红桃3)"
+}
+
+func (m *BaseFromSciIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_sci_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromSciIndex) Format2SearchDataSource(origin *BaseFromSciIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromSciIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromSciIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_sci_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromCoalmineMapping 中国煤炭市场网
+type BaseFromCoalmineMapping struct {
+	BaseFromCoalmineMappingId int       `orm:"column(base_from_coalmine_mapping_id);pk"`
+	ClassifyId                int       `description:"分类ID"`
+	IndexCode                 string    `description:"指标编码"`
+	IndexName                 string    `description:"指标名称"`
+	Unit                      string    `description:"单位"`
+	Frequency                 string    `description:"频度"`
+	StartDate                 time.Time `description:"开始日期"`
+	EndDate                   time.Time `description:"结束日期"`
+	LatestValue               string    `description:"最新值"`
+	CreateTime                time.Time `description:"创建时间"`
+	ModifyTime                time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromCoalmineMapping) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_COAL, 0, "中国煤炭市场网"
+}
+
+func (m *BaseFromCoalmineMapping) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_coalmine_mapping_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromCoalmineMapping) Format2SearchDataSource(origin *BaseFromCoalmineMapping) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromCoalmineMappingId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = origin.LatestValue
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromCoalmineMapping) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromCoalmineMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_coalmine_mapping WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromEiaSteoIndex EIA STEO报告
+type BaseFromEiaSteoIndex struct {
+	BaseFromEiaSteoIndexId    int       `orm:"column(base_from_eia_steo_index_id);pk"`
+	BaseFromEiaSteoClassifyId int       `description:"分类ID"`
+	IndexCode                 string    `description:"指标编码"`
+	IndexName                 string    `description:"指标名称"`
+	Unit                      string    `description:"单位"`
+	Frequency                 string    `description:"频度"`
+	StartDate                 time.Time `description:"开始日期"`
+	EndDate                   time.Time `description:"结束日期"`
+	LatestValue               float64   `description:"最新值"`
+	CreateTime                time.Time `description:"创建时间"`
+	ModifyTime                time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromEiaSteoIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_EIA_STEO, 0, "EIA STEO报告"
+}
+
+func (m *BaseFromEiaSteoIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_eia_steo_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "base_from_eia_steo_classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromEiaSteoIndex) Format2SearchDataSource(origin *BaseFromEiaSteoIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromEiaSteoIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.BaseFromEiaSteoClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromEiaSteoIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromEiaSteoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_eia_steo_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromIcpiIndex ICPI消费价格指数
+//type BaseFromIcpiIndex struct {
+//	BaseFromIcpiIndexId    int       `orm:"column(base_from_icpi_index_id);pk"`
+//	BaseFromIcpiClassifyId int       `description:"分类ID"`
+//	IndexCode              string    `description:"指标编码"`
+//	IndexName              string    `description:"指标名称"`
+//	Unit                   string    `description:"单位"`
+//	Frequency              string    `description:"频度"`
+//	StartDate              time.Time `description:"开始日期"`
+//	EndDate                time.Time `description:"结束日期"`
+//	LatestValue            float64   `description:"最新值"`
+//	CreateTime             time.Time `description:"创建时间"`
+//	ModifyTime             time.Time `description:"更新时间"`
+//}
+
+func (m *BaseFromIcpiIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_ICPI, 0, "ICPI消费价格指数"
+}
+
+func (m *BaseFromIcpiIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_icpi_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "base_from_icpi_classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromIcpiIndex) Format2SearchDataSource(origin *BaseFromIcpiIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromIcpiIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.BaseFromIcpiClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromIcpiIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromIcpiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_icpi_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromYongyiIndex 涌益咨询
+type BaseFromYongyiIndex struct {
+	YongyiIndexId int       `orm:"column(yongyi_index_id);pk"`
+	ClassifyId    int       `description:"分类ID"`
+	IndexCode     string    `description:"指标编码"`
+	IndexName     string    `description:"指标名称"`
+	Unit          string    `description:"单位"`
+	Frequency     string    `description:"频度"`
+	StartDate     time.Time `description:"开始日期"`
+	EndDate       time.Time `description:"结束日期"`
+	LatestValue   float64   `description:"最新值"`
+	CreateTime    time.Time `description:"创建时间"`
+	ModifyTime    time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromYongyiIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_YONYI, 0, "涌益咨询"
+}
+
+func (m *BaseFromYongyiIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "yongyi_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromYongyiIndex) Format2SearchDataSource(origin *BaseFromYongyiIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.YongyiIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromYongyiIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromYongyiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_yongyi_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromFenweiIndex 汾渭数据
+type BaseFromFenweiIndex struct {
+	FenweiIndexId int       `orm:"column(fenwei_index_id);pk"`
+	ClassifyId    int       `description:"分类ID"`
+	IndexCode     string    `description:"指标编码"`
+	IndexName     string    `description:"指标名称"`
+	Unit          string    `description:"单位"`
+	Frequency     string    `description:"频度"`
+	StartDate     time.Time `description:"开始日期"`
+	EndDate       time.Time `description:"结束日期"`
+	LatestValue   float64   `description:"最新值"`
+	CreateTime    time.Time `description:"创建时间"`
+	ModifyTime    time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromFenweiIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_FENWEI, 0, "汾渭数据"
+}
+
+func (m *BaseFromFenweiIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "fenwei_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromFenweiIndex) Format2SearchDataSource(origin *BaseFromFenweiIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.FenweiIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromFenweiIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_fenwei_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromSci99Index 卓创资讯
+//type BaseFromSci99Index struct {
+//	BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"`
+//	ClassifyId         int       `description:"分类ID"`
+//	IndexCode          string    `description:"指标编码"`
+//	IndexName          string    `description:"指标名称"`
+//	Unit               string    `description:"单位"`
+//	Frequency          string    `description:"频度"`
+//	StartDate          time.Time `description:"开始日期"`
+//	EndDate            time.Time `description:"结束日期"`
+//	LatestValue        float64   `description:"最新值"`
+//	CreateTime         time.Time `description:"创建时间"`
+//	ModifyTime         time.Time `description:"更新时间"`
+//}
+
+func (m *BaseFromSci99Index) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_SCI99, 0, "卓创资讯"
+}
+
+func (m *BaseFromSci99Index) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_sci_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "classify_id",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromSci99Index) Format2SearchDataSource(origin *BaseFromSci99Index) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromSciIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromSci99Index) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromSci99Index, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_sci99_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromGlIndex 钢联原始指标库
+type BaseFromGlIndex struct {
+	PrimaryId   int       `orm:"column(ID);pk"`
+	IndexCode   string    `orm:"column(INDEX_CODE)" description:"指标编码"`
+	IndexName   string    `orm:"column(INDEX_NAME)" description:"指标名称"`
+	Unit        string    `orm:"column(UNIT_NAME)" description:"单位"`
+	Frequency   string    `orm:"column(FREQUENCY_NAME)" description:"频度"`
+	StartDate   time.Time `orm:"column(BEGIN_DATE)" description:"开始日期"`
+	EndDate     time.Time `orm:"column(END_DATE)" description:"结束日期"`
+	LatestValue float64   `orm:"column(DATA_VALUE)" description:"最新值"`
+	CreateTime  time.Time `orm:"column(CREATE_TIME)" description:"创建时间"`
+	ModifyTime  time.Time `orm:"column(UPDATE_TIME)" description:"更新时间"`
+}
+
+func (m *BaseFromGlIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_GL, 0, "钢联原始数据库"
+}
+
+func (m *BaseFromGlIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "ID",
+		IndexCode:   "INDEX_CODE",
+		IndexName:   "INDEX_NAME",
+		ClassifyId:  "",
+		Unit:        "UNIT_NAME",
+		Frequency:   "FREQUENCY_NAME",
+		StartDate:   "BEGIN_DATE",
+		EndDate:     "END_DATE",
+		LatestValue: "DATA_VALUE",
+		CreateTime:  "CREATE_TIME",
+		ModifyTime:  "UPDATE_TIME",
+	}
+}
+
+func (m *BaseFromGlIndex) Format2SearchDataSource(origin *BaseFromGlIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.PrimaryId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	//item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromGlIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromGlIndex, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY CREATE_TIME DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM mb_index_main_info WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromManualEdb 手工数据录入
+type BaseFromManualEdb struct {
+	//PrimaryId   int       `orm:"column(TRADE_CODE)"` // 注手工指标没自增ID...
+	IndexCode   string    `orm:"column(TRADE_CODE)" description:"指标编码"`
+	IndexName   string    `orm:"column(SEC_NAME)" description:"指标名称"`
+	ClassifyId  int       `orm:"column(classify_id)" description:"分类ID"`
+	Unit        string    `orm:"column(UNIT)" description:"单位"`
+	Frequency   string    `orm:"column(frequency)" description:"频度"`
+	StartDate   time.Time `orm:"column(start_date)" description:"开始日期"`
+	EndDate     time.Time `orm:"column(end_date)" description:"结束日期"`
+	LatestValue float64   `orm:"column(latest_value)" description:"最新值"`
+	CreateTime  time.Time `orm:"column(create_date)" description:"创建时间"`
+	ModifyTime  time.Time `orm:"column(modify_time)" description:"更新时间"`
+}
+
+func (m *BaseFromManualEdb) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_MANUAL, 0, "手工指标录入"
+}
+
+func (m *BaseFromManualEdb) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "",
+		IndexCode:   "TRADE_CODE",
+		IndexName:   "SEC_NAME",
+		ClassifyId:  "classify_id",
+		Unit:        "UNIT",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_date",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromManualEdb) Format2SearchDataSource(origin *BaseFromManualEdb) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	//item.PrimaryId = origin.PrimaryId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromManualEdb) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromManualEdb, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_date DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM edbinfo WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromBusinessIndex 自有数据
+type BaseFromBusinessIndex struct {
+	BaseFromBusinessIndexId int `orm:"column(base_from_business_index_id);pk"`
+	//ClassifyId              int       `description:"分类ID"`
+	IndexCode   string    `description:"指标编码"`
+	IndexName   string    `description:"指标名称"`
+	Unit        string    `description:"单位"`
+	Frequency   string    `description:"频度"`
+	StartDate   time.Time `description:"开始日期"`
+	EndDate     time.Time `description:"结束日期"`
+	LatestValue float64   `description:"最新值"`
+	CreateTime  time.Time `description:"创建时间"`
+	ModifyTime  time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromBusinessIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_BUSINESS, 0, "自有数据"
+}
+
+func (m *BaseFromBusinessIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_business_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromBusinessIndex) Format2SearchDataSource(origin *BaseFromBusinessIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromBusinessIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	//item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromBusinessIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromBusinessIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_business_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromBloombergIndex Bloomberg
+type BaseFromBloombergIndex struct {
+	BaseFromBloombergIndexId int `orm:"column(base_from_bloomberg_index_id);pk"`
+	//ClassifyId              int       `description:"分类ID"`
+	IndexCode   string    `description:"指标编码"`
+	IndexName   string    `description:"指标名称"`
+	Unit        string    `description:"单位"`
+	Frequency   string    `description:"频度"`
+	StartDate   time.Time `description:"开始日期"`
+	EndDate     time.Time `description:"结束日期"`
+	LatestValue float64   `description:"最新值"`
+	CreateTime  time.Time `description:"创建时间"`
+	ModifyTime  time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromBloombergIndex) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_BLOOMBERG, 0, "Bloomberg"
+}
+
+func (m *BaseFromBloombergIndex) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_bloomberg_index_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromBloombergIndex) Format2SearchDataSource(origin *BaseFromBloombergIndex) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromBloombergIndexId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	//item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromBloombergIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromBloombergIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_bloomberg_index WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseFromMtjhMapping 煤炭江湖
+type BaseFromMtjhMapping struct {
+	BaseFromMtjhMappingId int `orm:"column(base_from_mtjh_mapping_id);pk"`
+	//ClassifyId            int       `description:"分类ID"`
+	IndexCode   string    `description:"指标编码"`
+	IndexName   string    `description:"指标名称"`
+	Unit        string    `description:"单位"`
+	Frequency   string    `description:"频度"`
+	StartDate   time.Time `description:"开始日期"`
+	EndDate     time.Time `description:"结束日期"`
+	LatestValue float64   `description:"最新值"`
+	CreateTime  time.Time `description:"创建时间"`
+	ModifyTime  time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromMtjhMapping) SourceInfo() (int, int, string) {
+	return utils.DATA_SOURCE_MTJH, 0, "煤炭江湖"
+}
+
+func (m *BaseFromMtjhMapping) EsCols() SearchEsCols {
+	return SearchEsCols{
+		PrimaryId:   "base_from_mtjh_mapping_id",
+		IndexCode:   "index_code",
+		IndexName:   "index_name",
+		ClassifyId:  "",
+		Unit:        "unit",
+		Frequency:   "frequency",
+		StartDate:   "start_date",
+		EndDate:     "end_date",
+		LatestValue: "latest_value",
+		CreateTime:  "create_time",
+		ModifyTime:  "modify_time",
+	}
+}
+
+func (m *BaseFromMtjhMapping) Format2SearchDataSource(origin *BaseFromMtjhMapping) (item *SearchDataSource) {
+	if origin == nil {
+		return
+	}
+	source, subSource, sourceName := m.SourceInfo()
+	item = new(SearchDataSource)
+	item.PrimaryId = origin.BaseFromMtjhMappingId
+	item.IndexCode = origin.IndexCode
+	item.IndexName = origin.IndexName
+	//item.ClassifyId = origin.ClassifyId
+	item.Unit = origin.Unit
+	item.Frequency = origin.Frequency
+	item.StartDate = utils.TimeTransferString(utils.FormatDate, origin.StartDate)
+	item.EndDate = utils.TimeTransferString(utils.FormatDate, origin.EndDate)
+	item.LatestValue = fmt.Sprint(origin.LatestValue)
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+func (m *BaseFromMtjhMapping) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromMtjhMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_mtjh_mapping WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// BaseIndexDataMinMax 数据源极值信息
+type BaseIndexDataMinMax struct {
+	MinDate     string `description:"最小日期"`
+	MaxDate     string `description:"最大日期"`
+	LatestValue string `description:"最新值"`
+	//MinValue    float64 `description:"最小值"`
+	//MaxValue    float64 `description:"最大值"`
+}
+
+// GetBaseIndexDataTableName 根据来源获取原始指标表和数据表名(很大一部分来源不存在原始指标)
+func GetBaseIndexDataTableName(source, subSource int) (indexTable, dataTable string) {
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		if subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY {
+			indexTable = "base_from_ths_hf_index"
+			dataTable = "base_from_ths_hf_data"
+		}
+	case utils.DATA_SOURCE_RZD:
+		indexTable = "base_from_rzd_index"
+		dataTable = "base_from_rzd_data"
+	case utils.DATA_SOURCE_HISUGAR:
+		indexTable = "base_from_hisugar_index"
+		dataTable = "base_from_hisugar_data"
+	case utils.DATA_SOURCE_LY:
+		indexTable = "base_from_ly_index"
+		dataTable = "base_from_ly_data"
+	case utils.DATA_SOURCE_SCI_HQ:
+		indexTable = "base_from_sci_hq_index"
+		dataTable = "base_from_sci_hq_data"
+	case utils.DATA_SOURCE_OILCHEM:
+		indexTable = "base_from_oilchem_index"
+		dataTable = "base_from_oilchem_data"
+	case utils.DATA_SOURCE_CCF:
+		indexTable = "base_from_ccf_index"
+		dataTable = "base_from_ccf_data"
+	case utils.DATA_SOURCE_USDA_FAS:
+		indexTable = "base_from_usda_fas_index"
+		dataTable = "base_from_usda_fas_data"
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
+		indexTable = "base_from_mysteel_chemical_index"
+		dataTable = "base_from_mysteel_chemical_data"
+	case utils.DATA_SOURCE_YS:
+		indexTable = "base_from_smm_index"
+		dataTable = "base_from_smm_data"
+	case utils.DATA_SOURCE_BAIINFO:
+		indexTable = "base_from_baiinfo_index"
+		dataTable = "base_from_baiinfo_data"
+	case utils.DATA_SOURCE_SCI:
+		indexTable = "base_from_sci_index"
+		dataTable = "base_from_sci_data"
+	case utils.DATA_SOURCE_EIA_STEO:
+		indexTable = "base_from_eia_steo_index"
+		dataTable = "base_from_eia_steo_data"
+	case utils.DATA_SOURCE_ICPI:
+		indexTable = "base_from_icpi_index"
+		dataTable = "base_from_icpi_data"
+	case utils.DATA_SOURCE_YONYI:
+		indexTable = "base_from_yongyi_index"
+		dataTable = "base_from_yongyi_data"
+	case utils.DATA_SOURCE_FENWEI:
+		indexTable = "base_from_fenwei_index"
+		dataTable = "base_from_fenwei_data"
+	case utils.DATA_SOURCE_SCI99:
+		indexTable = "base_from_sci99_index"
+		dataTable = "base_from_sci99_data"
+	case utils.DATA_SOURCE_BUSINESS:
+		indexTable = "base_from_business_index"
+		dataTable = "base_from_business_data"
+	case utils.DATA_SOURCE_BLOOMBERG:
+		indexTable = "base_from_bloomberg_index"
+		dataTable = "base_from_bloomberg_data"
+	default:
+		utils.FileLog.Info(fmt.Sprintf("数据源无对应表名, source: %d, sub: %d", source, subSource))
+	}
+	return
+}
+
+// getCoalmineDataTableName 获取中国煤炭市场网数据表名
+func getCoalmineDataTableName(indexCode string) string {
+	if strings.Contains(indexCode, "jsm") {
+		return "base_from_coalmine_jsm_index"
+	}
+	if strings.Contains(indexCode, "company") {
+		return "base_from_coalmine_company_index"
+	}
+	if strings.Contains(indexCode, "firm") {
+		return "base_from_coalmine_firm_index"
+	}
+	if strings.Contains(indexCode, "coastal") {
+		return "base_from_coalmine_coastal_index"
+	}
+	if strings.Contains(indexCode, "inland") {
+		return "base_from_coalmine_inland_index"
+	}
+	return ""
+}
+
+// GetBaseIndexDataMinMax 获取数据源极值
+func GetBaseIndexDataMinMax(source, subSource int, indexCode string) (item *BaseIndexDataMinMax, err error) {
+	o := orm.NewOrmUsingDB("data")
+	var sql string
+	var latestVal string
+
+	// 煤炭江湖
+	if source == utils.DATA_SOURCE_MTJH {
+		sql = `SELECT MIN(data_time) AS min_date, MAX(data_time) AS max_date FROM base_from_mtjh_index WHERE index_code = ?`
+		if err = o.Raw(sql, indexCode).QueryRow(&item); err != nil {
+			return
+		}
+
+		sql = `SELECT deal_value AS latest_value FROM base_from_mtjh_index WHERE index_code = ? ORDER BY data_time DESC LIMIT 1`
+		if err = o.Raw(sql, indexCode).QueryRow(&latestVal); err != nil {
+			return
+		}
+		item.LatestValue = latestVal
+		return
+	}
+
+	// 中国煤炭市场网
+	if source == utils.DATA_SOURCE_COAL {
+		dataTable := getCoalmineDataTableName(indexCode)
+		if dataTable == "" {
+			err = fmt.Errorf("中国煤炭市场网-指标无对应表名: %s", indexCode)
+			return
+		}
+		fieldDataTime := "data_time"
+		if dataTable == "base_from_coalmine_firm_index" {
+			fieldDataTime = "data_time_date"
+		}
+		sql = `SELECT MIN(%s) AS min_date, MAX(%s) AS max_date FROM %s WHERE index_code = ?`
+		sql = fmt.Sprintf(sql, fieldDataTime, fieldDataTime, dataTable)
+		if err = o.Raw(sql, indexCode).QueryRow(&item); err != nil {
+			return
+		}
+
+		sql = `SELECT deal_value AS latest_value FROM %s WHERE index_code = ? ORDER BY %s DESC LIMIT 1`
+		sql = fmt.Sprintf(sql, dataTable, fieldDataTime)
+		if err = o.Raw(sql, indexCode).QueryRow(&latestVal); err != nil {
+			return
+		}
+		item.LatestValue = latestVal
+		return
+	}
+
+	// 其他数据源
+	_, dataTable := GetBaseIndexDataTableName(source, subSource)
+	if dataTable == "" {
+		err = fmt.Errorf("数据源无对应数据表, source: %d, sub: %d, code: %s", source, subSource, indexCode)
+		return
+	}
+
+	sql = `SELECT MIN(data_time) AS min_date, MAX(data_time) AS max_date FROM %s WHERE index_code = ?`
+	sql = fmt.Sprintf(sql, dataTable)
+	if err = o.Raw(sql, indexCode).QueryRow(&item); err != nil {
+		return
+	}
+
+	sql = `SELECT value AS latest_value FROM %s WHERE index_code = ? ORDER BY data_time DESC LIMIT 1`
+	sql = fmt.Sprintf(sql, dataTable)
+	if err = o.Raw(sql, indexCode).QueryRow(&latestVal); err != nil {
+		return
+	}
+	item.LatestValue = latestVal
+	return
+}
+
+// BaseFromMtjhIndex 煤炭江湖数据表
+type BaseFromMtjhIndex struct {
+	BaseFromMtjhIndexId int       `orm:"column(base_from_mtjh_index_id);pk"`
+	IndexCode           string    `description:"指标编码"`
+	IndexName           string    `description:"指标名称"`
+	DealValue           float64   `description:"成交量"`
+	DataTime            time.Time `description:"数据日期"`
+	Unit                string    `description:"单位"`
+	Frequency           string    `description:"频度"`
+	StartDate           time.Time `description:"开始日期"`
+	EndDate             time.Time `description:"结束日期"`
+	LatestValue         float64   `description:"最新值"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"更新时间"`
+}
+
+// GetMtjhBaseInfoFromDataTable 煤炭江湖-从数据表获取基础信息
+func GetMtjhBaseInfoFromDataTable(codes []string) (items []*BaseFromMtjhIndex, err error) {
+	codeLens := len(codes)
+	if codeLens == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`SELECT * FROM base_from_mtjh_index WHERE index_code IN (%s) GROUP BY index_code`, utils.GetOrmInReplace(codeLens))
+	_, err = orm.NewOrmUsingDB("data").Raw(sql, codes).QueryRows(&items)
+	return
+}
+
+// BaseFromCoalmineIndexBase 中国煤炭市场网数据表基础信息
+type BaseFromCoalmineIndexBase struct {
+	IndexCode  string    `description:"指标编码"`
+	IndexName  string    `description:"指标名称"`
+	Unit       string    `description:"单位"`
+	Frequency  string    `description:"频度"`
+	CreateTime time.Time `description:"创建时间"`
+	ModifyTime time.Time `description:"更新时间"`
+}
+
+// GetCoalmineBaseInfoFromDataTable 中国煤炭市场网-从数据表获取基础信息
+func GetCoalmineBaseInfoFromDataTable(codes []string) (items []*BaseFromCoalmineIndexBase, err error) {
+	codeLens := len(codes)
+	if codeLens == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	items = make([]*BaseFromCoalmineIndexBase, 0)
+	var jsmCodes, companyCodes, firmCodes, coastalCodes, inlandCodes []string
+	for _, code := range codes {
+		if strings.Contains(code, "jsm") {
+			jsmCodes = append(jsmCodes, code)
+		}
+		if strings.Contains(code, "company") {
+			companyCodes = append(companyCodes, code)
+		}
+		if strings.Contains(code, "firm") {
+			firmCodes = append(firmCodes, code)
+		}
+		if strings.Contains(code, "coastal") {
+			coastalCodes = append(coastalCodes, code)
+		}
+		if strings.Contains(code, "inland") {
+			inlandCodes = append(inlandCodes, code)
+		}
+	}
+	var sql string
+	itemsOnce := make([]*BaseFromCoalmineIndexBase, 0)
+	if len(jsmCodes) > 0 {
+		sql = fmt.Sprintf(`SELECT * FROM base_from_coalmine_jsm_index WHERE index_code IN (%s) GROUP BY index_code`, utils.GetOrmInReplace(len(jsmCodes)))
+		_, err = o.Raw(sql, jsmCodes).QueryRows(&itemsOnce)
+		if err != nil {
+			return
+		}
+		items = append(items, itemsOnce...)
+	}
+	if len(companyCodes) > 0 {
+		sql = fmt.Sprintf(`SELECT * FROM base_from_coalmine_company_index WHERE index_code IN (%s) GROUP BY index_code`, utils.GetOrmInReplace(len(companyCodes)))
+		_, err = o.Raw(sql, companyCodes).QueryRows(&itemsOnce)
+		if err != nil {
+			return
+		}
+		items = append(items, itemsOnce...)
+	}
+	if len(firmCodes) > 0 {
+		sql = fmt.Sprintf(`SELECT * FROM base_from_coalmine_firm_index WHERE index_code IN (%s) GROUP BY index_code`, utils.GetOrmInReplace(len(firmCodes)))
+		_, err = o.Raw(sql, firmCodes).QueryRows(&itemsOnce)
+		if err != nil {
+			return
+		}
+		items = append(items, itemsOnce...)
+	}
+	if len(coastalCodes) > 0 {
+		sql = fmt.Sprintf(`SELECT * FROM base_from_coalmine_coastal_index WHERE index_code IN (%s) GROUP BY index_code`, utils.GetOrmInReplace(len(coastalCodes)))
+		_, err = o.Raw(sql, coastalCodes).QueryRows(&itemsOnce)
+		if err != nil {
+			return
+		}
+		items = append(items, itemsOnce...)
+	}
+	if len(inlandCodes) > 0 {
+		sql = fmt.Sprintf(`SELECT * FROM base_from_coalmine_inland_index WHERE index_code IN (%s) GROUP BY index_code`, utils.GetOrmInReplace(len(inlandCodes)))
+		_, err = o.Raw(sql, inlandCodes).QueryRows(&itemsOnce)
+		if err != nil {
+			return
+		}
+		items = append(items, itemsOnce...)
+	}
+	return
+}

+ 2 - 0
models/data_source/icpi.go

@@ -16,6 +16,8 @@ type BaseFromIcpiIndex struct {
 	EndDate                time.Time `description:"结束日期"`
 	CreateTime             time.Time `description:"创建时间"`
 	ModifyTime             time.Time `description:"修改时间"`
+	Unit                   string    `description:"单位"`
+	LatestValue            float64   `description:"最新值"`
 }
 
 type BaseFromIcpiData struct {

+ 1 - 2
models/db.go

@@ -30,7 +30,6 @@ import (
 	"eta/eta_api/models/speech_recognition"
 	"eta/eta_api/models/system"
 	"eta/eta_api/models/yb"
-	binlogSvr "eta/eta_api/services/binlog"
 	"eta/eta_api/utils"
 	"time"
 
@@ -223,7 +222,7 @@ func init() {
 	// 开启mysql binlog监听
 	if utils.MYSQL_DATA_BINLOG_URL != "" {
 		initBinlog()
-		go binlogSvr.ListenMysql()
+		//go binlogSvr.ListenMysql()
 	}
 
 	// 初始化部分数据表变量(直接init会有顺序问题=_=!)

+ 25 - 21
models/manual_edb.go

@@ -66,27 +66,31 @@ func GetEdbDataListByCode(tradeCode string) (items []*Edbdata, err error) {
 
 // EdbInfoListItem
 type EdbInfoListItem struct {
-	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
-	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
-	Unit         string `orm:"column(UNIT);" description:"单位"`
-	Remark       string `orm:"column(REMARK);" description:"备注"`
-	Frequency    string `description:"频度"`
-	ClassifyId   int    `description:"分类id"`
-	ClassifyName string `description:"分类名称"`
-	CreateDate   string `description:"创建时间"`
-	UserId       int    `description:"录入用户id"`
-	NoticeTime   string `description:"通知时间"`
-	Mobile       string `description:"录入者手机号"`
-	ModifyDate   string `description:"待更新日期"`
-	ModifyTime   string `description:"数据更新时间"`
-	Status       string `description:"状态:未完成/完成"`
-	UniqueCode   string
-	IsJoinEdb    int8    `description:"指标库是否已添加:0-否;1-是"`
-	UserName     string  `description:"录入用户名称"`
-	StartDate    string  `description:"数据开始日期"`
-	EndDate      string  `description:"数据结束日期"`
-	LatestValue  float64 `description:"指标最新值"`
-	NextDateTime string  `description:"下期时间"`
+	TradeCode          string `orm:"column(TRADE_CODE);pk" description:"指标code"`
+	SecName            string `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit               string `orm:"column(UNIT);" description:"单位"`
+	Remark             string `orm:"column(REMARK);" description:"备注"`
+	Frequency          string `description:"频度"`
+	ClassifyId         int    `description:"分类id"`
+	ClassifyName       string `description:"分类名称"`
+	CreateDate         string `description:"创建时间"`
+	UserId             int    `description:"录入用户id"`
+	NoticeTime         string `description:"通知时间"`
+	Mobile             string `description:"录入者手机号"`
+	ModifyDate         string `description:"待更新日期"`
+	ModifyTime         string `description:"数据更新时间"`
+	Status             string `description:"状态:未完成/完成"`
+	UniqueCode         string
+	IsJoinEdb          int8    `description:"指标库是否已添加:0-否;1-是"`
+	UserName           string  `description:"录入用户名称"`
+	StartDate          string  `description:"数据开始日期"`
+	EndDate            string  `description:"数据结束日期"`
+	LatestValue        float64 `description:"指标最新值"`
+	NextDateTime       string  `description:"下期时间"`
+	Source             int     `description:"来源"`
+	SourceName         string  `description:"数据源名称"`
+	SearchText         string  `description:"搜索结果(含高亮)"`
+	ClassifyUniqueCode string  `description:"分类唯一编码(前端定位用)"`
 }
 
 // EdbListResp 指标数据结构体

+ 18 - 0
routers/commentsRouter.go

@@ -1492,6 +1492,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"],
+        beego.ControllerComments{
+            Method: "SearchByEs",
+            Router: `/excel_info/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/excel:ExcelInfoController"],
         beego.ControllerComments{
             Method: "GetBatchEdbData",
@@ -7054,6 +7063,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_source:DataSourceController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_source:DataSourceController"],
+        beego.ControllerComments{
+            Method: "SearchByEs",
+            Router: `/common/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_source:DataSourceController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_source:DataSourceController"],
         beego.ControllerComments{
             Method: "GfexClassifyList",

+ 31 - 0
services/binlog/binlog.go

@@ -40,6 +40,37 @@ func ListenMysql() {
 		// utils.MYSQL_DATA_BINLOG_DB + ".base_from_mysteel_chemical_index$",
 		// utils.MYSQL_DATA_BINLOG_DB + ".base_from_smm_index$",
 		// utils.MYSQL_DATA_BINLOG_DB + ".edb_data*",
+
+		// 数据源
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_rzd_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_hisugar_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_ly_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_sci_hq_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_ths_hf_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_oilchem_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_ccf_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_mysteel_chemical_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_smm_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_baiinfo_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_sci_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_coalmine_mapping$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_eia_steo_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_icpi_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_yongyi_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_fenwei_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_sci99_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_bloomberg_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_mtjh_mapping$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_usda_fas_index$",
+		utils.MYSQL_DATA_BINLOG_DB + ".base_from_business_index$",
+	}
+
+	// 监听手工指标库和钢联库
+	if utils.MYSQL_DATA_BINLOG_DB_EDB != "" {
+		includeTableRegex = append(includeTableRegex, utils.MYSQL_DATA_BINLOG_DB_EDB+".edbinfo$")
+	}
+	if utils.MYSQL_DATA_BINLOG_DB_GL != "" {
+		includeTableRegex = append(includeTableRegex, utils.MYSQL_DATA_BINLOG_DB_GL+".mb_index_main_info$")
 	}
 
 	// 主从复制的身份id配置,必须全局唯一,如果没有配置的话,那么会随机生成一个

+ 35 - 0
services/binlog/data_source.go

@@ -0,0 +1,35 @@
+package binlog
+
+import (
+	"encoding/json"
+	dataSourceModel "eta/eta_api/models/data_source"
+	"eta/eta_api/services/elastic"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+// HandleDataSourceChange2Es 数据源变动写入ES
+func HandleDataSourceChange2Es() {
+	for {
+		utils.Rc.Brpop(utils.CACHE_DATA_SOURCE_ES_HANDLE, func(b []byte) {
+			indexItem := new(dataSourceModel.SearchDataSource)
+			if e := json.Unmarshal(b, &indexItem); e != nil {
+				utils.FileLog.Info(fmt.Sprintf("HandleDataSourceChange2Es, json unmarshal err: %v", e))
+				return
+			}
+			fmt.Printf("ES开始写入, source: %d, sourceName: %s, indexCode: %s\n", indexItem.Source, indexItem.SourceName, indexItem.IndexCode)
+			// 手工指标的文档ID用source和指标编码组合
+			var docId string
+			if indexItem.Source == utils.DATA_SOURCE_MANUAL {
+				docId = fmt.Sprintf("%d-%s", indexItem.Source, indexItem.IndexCode)
+			} else {
+				docId = fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			}
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				utils.FileLog.Info(fmt.Sprintf("HandleDataSourceChange2Es, write2es byte: %s, err: %v", string(b), e))
+				return
+			}
+			fmt.Println("ES写入成功")
+		})
+	}
+}

+ 184 - 47
services/binlog/handler.go

@@ -1,6 +1,7 @@
 package binlog
 
 import (
+	dataSourceModel "eta/eta_api/models/data_source"
 	edbmonitorSvr "eta/eta_api/services/edb_monitor"
 	"eta/eta_api/utils"
 	"fmt"
@@ -69,25 +70,95 @@ func (h *EdbEventHandler) String() string {
 func (h *EdbEventHandler) Insert(e *canal.RowsEvent) error {
 	// 批量插入的时候,e.Rows的长度会大于0
 	fmt.Println(e.Header.ServerID, ";", e.Table.Schema, ".", e.Table.Name)
-	for _, row := range e.Rows { // 遍历当前插入的数据列表(存在批量插入的情况,所以是list)
-		newEdbInfo := h.MapRowToStruct(e.Table.Columns, row)
-		if ok := edbmonitorSvr.EdbLocalSet.IsExist(newEdbInfo.EdbInfoId); ok {
-			err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
-			if err != nil {
-				return err
-			}
-		} else {
-			ok, err := utils.Rc.SIsMember(edbmonitorSvr.EDB_MONITOR_ID_SET_CACHE, newEdbInfo.EdbInfoId)
-			if err != nil {
-				return err
-			}
-			if ok {
+
+	// 指标库
+	tableName := e.Table.Name
+	if tableName == "edb_info" {
+		for _, row := range e.Rows { // 遍历当前插入的数据列表(存在批量插入的情况,所以是list)
+			newEdbInfo := h.MapRowToStruct(e.Table.Columns, row)
+			if ok := edbmonitorSvr.EdbLocalSet.IsExist(newEdbInfo.EdbInfoId); ok {
 				err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
 				if err != nil {
 					return err
 				}
+			} else {
+				ok, err := utils.Rc.SIsMember(edbmonitorSvr.EDB_MONITOR_ID_SET_CACHE, newEdbInfo.EdbInfoId)
+				if err != nil {
+					return err
+				}
+				if ok {
+					err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
+					if err != nil {
+						return err
+					}
+				}
 			}
+			// if monitors, ok := edbMonitorMap[newEdbInfo.EdbInfoId]; ok {
+			// 	for _, monitor := range monitors {
+			// 		err = edbmonitorSvr.ModifyEdbMonitorState(monitor, newEdbInfo.EdbCode, newEdbInfo.Source, newEdbInfo.SubSource)
+			// 		if err != nil {
+			// 			continue
+			// 		}
+			// 	}
+			// }
+		}
+		return nil
+	}
+
+	// 数据源
+	indexOb := dataSourceModel.GetEsBaseFromIndexByTableName(tableName)
+	if indexOb == nil {
+		return fmt.Errorf("数据表无对应数据源: %s", tableName)
+	}
+	for _, row := range e.Rows {
+		indexItem := DataSourceMapRowToStruct(e.Table.Columns, row, indexOb)
+		// 写入队列(此处无需做去重处理)
+		if e := utils.Rc.LPush(utils.CACHE_DATA_SOURCE_ES_HANDLE, indexItem); e != nil {
+			return fmt.Errorf("写入redis队列失败, %v", e)
 		}
+	}
+	return nil
+}
+
+func (h *EdbEventHandler) Update(e *canal.RowsEvent) error {
+	tableName := e.Table.Name
+
+	// 指标库
+	lenRows := len(e.Rows)
+	if tableName == "edb_info" {
+		//if len(e.Rows) != 2 {
+		//	fmt.Println("更新数据异常,没有原始数据和新数据:", e.Rows)
+		//	return nil
+		//}
+
+		// 由于UPDATE语句影响行数超过1时e.Rows长度会大于2,所以此处遍历处理
+		for i := 0; i < lenRows; i += 2 {
+			if i+1 >= lenRows {
+				continue
+			}
+			oldEdbInfo := h.MapRowToStruct(e.Table.Columns, e.Rows[i])
+			newEdbInfo := h.MapRowToStruct(e.Table.Columns, e.Rows[i+1])
+			if oldEdbInfo.EndValue != newEdbInfo.EndValue {
+				if ok := edbmonitorSvr.EdbLocalSet.IsExist(newEdbInfo.EdbInfoId); ok {
+					err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
+					if err != nil {
+						return err
+					}
+				} else {
+					ok, err := utils.Rc.SIsMember(edbmonitorSvr.EDB_MONITOR_ID_SET_CACHE, newEdbInfo.EdbInfoId)
+					if err != nil {
+						return err
+					}
+					if ok {
+						err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+
 		// if monitors, ok := edbMonitorMap[newEdbInfo.EdbInfoId]; ok {
 		// 	for _, monitor := range monitors {
 		// 		err = edbmonitorSvr.ModifyEdbMonitorState(monitor, newEdbInfo.EdbCode, newEdbInfo.Source, newEdbInfo.SubSource)
@@ -96,45 +167,25 @@ func (h *EdbEventHandler) Insert(e *canal.RowsEvent) error {
 		// 		}
 		// 	}
 		// }
+		return nil
 	}
-	return nil
-}
 
-func (h *EdbEventHandler) Update(e *canal.RowsEvent) error {
-	if len(e.Rows) != 2 {
-		fmt.Println("更新数据异常,没有原始数据和新数据:", e.Rows)
-		return nil
+	// 数据源
+	indexOb := dataSourceModel.GetEsBaseFromIndexByTableName(tableName)
+	if indexOb == nil {
+		return fmt.Errorf("数据表无对应数据源: %s", tableName)
 	}
-	oldEdbInfo := h.MapRowToStruct(e.Table.Columns, e.Rows[0])
-	newEdbInfo := h.MapRowToStruct(e.Table.Columns, e.Rows[1])
-	if oldEdbInfo.EndValue != newEdbInfo.EndValue {
-		if ok := edbmonitorSvr.EdbLocalSet.IsExist(newEdbInfo.EdbInfoId); ok {
-			err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
-			if err != nil {
-				return err
-			}
-		} else {
-			ok, err := utils.Rc.SIsMember(edbmonitorSvr.EDB_MONITOR_ID_SET_CACHE, newEdbInfo.EdbInfoId)
-			if err != nil {
-				return err
-			}
-			if ok {
-				err := utils.Rc.LPush(edbmonitorSvr.EDB_MONITOR_HANDLE_LIST_CACHE, newEdbInfo)
-				if err != nil {
-					return err
-				}
-			}
+	for i := 0; i < lenRows; i += 2 {
+		if i+1 >= lenRows {
+			continue
+		}
+		// 这里只取[i+1]即UPDATE后的数据
+		indexItem := DataSourceMapRowToStruct(e.Table.Columns, e.Rows[i+1], indexOb)
+		if e := utils.Rc.LPush(utils.CACHE_DATA_SOURCE_ES_HANDLE, indexItem); e != nil {
+			utils.FileLog.Info(fmt.Sprintf("binlog update data source lpush err: %v", e))
+			continue
 		}
 	}
-
-	// if monitors, ok := edbMonitorMap[newEdbInfo.EdbInfoId]; ok {
-	// 	for _, monitor := range monitors {
-	// 		err = edbmonitorSvr.ModifyEdbMonitorState(monitor, newEdbInfo.EdbCode, newEdbInfo.Source, newEdbInfo.SubSource)
-	// 		if err != nil {
-	// 			continue
-	// 		}
-	// 	}
-	// }
 	return nil
 }
 
@@ -201,3 +252,89 @@ func (h *EdbEventHandler) SetBinlogFileName(fileName string, position uint32) {
 
 	fmt.Println("init fileName:", h.fileName, ";position:", h.position)
 }
+
+// DataSourceMapRowToStruct 数据源-binlog转为es结构体
+func DataSourceMapRowToStruct(columns []schema.TableColumn, row []interface{}, indexOb dataSourceModel.EsBaseFromIndex) dataSourceModel.SearchDataSource {
+	item := dataSourceModel.SearchDataSource{}
+	source, subSource, sourceName := indexOb.SourceInfo()
+	item.Source = source
+	item.SubSource = subSource
+	item.SourceName = sourceName
+
+	// 根据不同数据源匹配对应的字段名
+	indexCols := indexOb.EsCols()
+	for i, column := range columns {
+		value := reflect.ValueOf(row[i])
+
+		switch column.Name {
+		case indexCols.PrimaryId:
+			if !value.IsValid() {
+				continue
+			}
+			if value.Kind() == reflect.Int || value.Kind() == reflect.Int32 || value.Kind() == reflect.Int64 {
+				item.PrimaryId = int(value.Int())
+			}
+			if value.Kind() == reflect.Uint || value.Kind() == reflect.Uint32 || value.Kind() == reflect.Uint64 {
+				item.PrimaryId = int(value.Uint())
+			}
+		case indexCols.IndexCode:
+			if value.IsValid() {
+				item.IndexCode = value.String()
+			}
+		case indexCols.IndexName:
+			if value.IsValid() {
+				item.IndexName = value.String()
+			}
+		case indexCols.ClassifyId:
+			if !value.IsValid() {
+				continue
+			}
+			if value.Kind() == reflect.Int || value.Kind() == reflect.Int32 || value.Kind() == reflect.Int64 {
+				item.ClassifyId = int(value.Int())
+			}
+			if value.Kind() == reflect.Uint || value.Kind() == reflect.Uint32 || value.Kind() == reflect.Uint64 {
+				item.ClassifyId = int(value.Uint())
+			}
+		case indexCols.Unit:
+			if value.IsValid() {
+				item.Unit = value.String()
+			}
+		case indexCols.Frequency:
+			if value.IsValid() {
+				item.Frequency = value.String()
+			}
+		case indexCols.StartDate:
+			if value.IsValid() {
+				item.StartDate = value.String()
+			}
+		case indexCols.EndDate:
+			if value.IsValid() {
+				item.EndDate = value.String()
+			}
+		case indexCols.LatestValue:
+			if !value.IsValid() {
+				continue
+			}
+			if value.Kind() == reflect.String {
+				item.LatestValue = value.String()
+			}
+			if value.Kind() == reflect.Int || value.Kind() == reflect.Int32 || value.Kind() == reflect.Int64 {
+				item.LatestValue = fmt.Sprint(value.Int())
+			}
+			if value.Kind() == reflect.Float64 {
+				item.LatestValue = fmt.Sprint(value.Float())
+			}
+		case indexCols.CreateTime:
+			if value.IsValid() {
+				item.CreateTime = value.String()
+			}
+		case indexCols.ModifyTime:
+			if value.IsValid() {
+				item.ModifyTime = value.String()
+			}
+		default:
+			continue
+		}
+	}
+	return item
+}

+ 1 - 1
services/data/chart_info_elastic.go

@@ -125,7 +125,7 @@ func EsDeleteChartInfo(chartInfoId int) {
 }
 
 // EsSearchChartInfo 搜索图表信息
-func EsSearchChartInfo(keyword string, showSysId int, sourceList []int, noPermissionChartIdList []int, startSize, pageSize int) (list []*data_manage.ChartInfo, total int64, err error) {
+func EsSearchChartInfo(keyword string, showSysId int, sourceList []int, noPermissionChartIdList []int, startSize, pageSize int) (list []*data_manage.ChartInfoMore, total int64, err error) {
 	list, total, err = elastic.SearchChartInfoData(utils.CHART_INDEX_NAME, keyword, showSysId, sourceList, noPermissionChartIdList, startSize, pageSize)
 	return
 }

+ 110 - 54
services/data/edb_info_refresh.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/edb_refresh"
 	"eta/eta_api/models/data_manage/edb_refresh/request"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
 	"fmt"
 	"strings"
@@ -422,6 +423,7 @@ func GetList(source, subSource int, classifyId, terminalCode, sysUserId, frequen
 	} else if status == "启用" {
 		isStop = 0
 	}
+	keyword = strings.TrimSpace(keyword)
 
 	switch source {
 	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL: // 钢联
@@ -445,25 +447,43 @@ func GetList(source, subSource int, classifyId, terminalCode, sysUserId, frequen
 			pars = append(pars, frequencySlice)
 		}
 		if keyword != `` {
-			keywordSlice := strings.Split(keyword, " ")
-			if len(keywordSlice) > 0 {
-				tmpConditionSlice := make([]string, 0)
-				tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
-				pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-
-				for _, v := range keywordSlice {
-					if v == ` ` || v == `` {
-						continue
-					}
-					tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
-					pars = utils.GetLikeKeywordPars(pars, v, 2)
-				}
-				condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
-
-			} else {
-				condition += ` index_name like ? or index_code like ? `
-				pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//keywordSlice := strings.Split(keyword, " ")
+			//if len(keywordSlice) > 0 {
+			//	tmpConditionSlice := make([]string, 0)
+			//	tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
+			//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//
+			//	for _, v := range keywordSlice {
+			//		if v == ` ` || v == `` {
+			//			continue
+			//		}
+			//		tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
+			//		pars = utils.GetLikeKeywordPars(pars, v, 2)
+			//	}
+			//	condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+			//
+			//} else {
+			//	condition += ` index_name like ? or index_code like ? `
+			//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//}
+
+			// 走ES搜
+			_, esList, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, 0, []int{}, []int{}, []string{}, startSize, pageSize)
+			if e != nil {
+				err = fmt.Errorf("ES-搜索钢联原始指标失败, %v", e)
+				return
+			}
+			var codes []string
+			for _, v := range esList {
+				codes = append(codes, v.IndexCode)
+			}
+			if len(codes) == 0 {
+				total = 0
+				list = make([]*data_manage.BaseRefreshEdbInfo, 0)
+				return
 			}
+			condition += fmt.Sprintf(` AND index_code IN (%s)`, utils.GetOrmInReplace(len(codes)))
+			pars = append(pars, codes)
 		}
 
 		if isStop >= 0 {
@@ -491,25 +511,43 @@ func GetList(source, subSource int, classifyId, terminalCode, sysUserId, frequen
 			pars = append(pars, frequencySlice)
 		}
 		if keyword != `` {
-			keywordSlice := strings.Split(keyword, " ")
-			if len(keywordSlice) > 0 {
-				tmpConditionSlice := make([]string, 0)
-				tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
-				pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-
-				for _, v := range keywordSlice {
-					if v == ` ` || v == `` {
-						continue
-					}
-					tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
-					pars = utils.GetLikeKeywordPars(pars, v, 2)
-				}
-				condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
-
-			} else {
-				condition += ` index_name like ? or index_code like ? `
-				pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//keywordSlice := strings.Split(keyword, " ")
+			//if len(keywordSlice) > 0 {
+			//	tmpConditionSlice := make([]string, 0)
+			//	tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
+			//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//
+			//	for _, v := range keywordSlice {
+			//		if v == ` ` || v == `` {
+			//			continue
+			//		}
+			//		tmpConditionSlice = append(tmpConditionSlice, ` index_name like ? or index_code like ? `)
+			//		pars = utils.GetLikeKeywordPars(pars, v, 2)
+			//	}
+			//	condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+			//
+			//} else {
+			//	condition += ` index_name like ? or index_code like ? `
+			//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//}
+
+			// 走ES搜
+			_, esList, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_YS, 0, []int{}, []int{}, []string{}, startSize, pageSize)
+			if e != nil {
+				err = fmt.Errorf("ES-搜索SMM原始指标失败, %v", e)
+				return
+			}
+			var codes []string
+			for _, v := range esList {
+				codes = append(codes, v.IndexCode)
 			}
+			if len(codes) == 0 {
+				total = 0
+				list = make([]*data_manage.BaseRefreshEdbInfo, 0)
+				return
+			}
+			condition += fmt.Sprintf(` AND index_code IN (%s)`, utils.GetOrmInReplace(len(codes)))
+			pars = append(pars, codes)
 		}
 
 		if isStop >= 0 {
@@ -552,25 +590,43 @@ func GetList(source, subSource int, classifyId, terminalCode, sysUserId, frequen
 			pars = append(pars, frequencySlice)
 		}
 		if keyword != `` {
-			keywordSlice := strings.Split(keyword, " ")
-			if len(keywordSlice) > 0 {
-				tmpConditionSlice := make([]string, 0)
-				tmpConditionSlice = append(tmpConditionSlice, ` edb_name like ? or edb_code like ? `)
-				pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-
-				for _, v := range keywordSlice {
-					if v == ` ` || v == `` {
-						continue
-					}
-					tmpConditionSlice = append(tmpConditionSlice, ` edb_name like ? or edb_code like ? `)
-					pars = utils.GetLikeKeywordPars(pars, v, 2)
-				}
-				condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
-
-			} else {
-				condition += ` edb_name like ? or edb_code like ? `
-				pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//keywordSlice := strings.Split(keyword, " ")
+			//if len(keywordSlice) > 0 {
+			//	tmpConditionSlice := make([]string, 0)
+			//	tmpConditionSlice = append(tmpConditionSlice, ` edb_name like ? or edb_code like ? `)
+			//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//
+			//	for _, v := range keywordSlice {
+			//		if v == ` ` || v == `` {
+			//			continue
+			//		}
+			//		tmpConditionSlice = append(tmpConditionSlice, ` edb_name like ? or edb_code like ? `)
+			//		pars = utils.GetLikeKeywordPars(pars, v, 2)
+			//	}
+			//	condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+			//
+			//} else {
+			//	condition += ` edb_name like ? or edb_code like ? `
+			//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+			//}
+
+			// 走ES搜
+			_, esList, e := elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyword, startSize, pageSize, 0, source, 0, frequency, []int{})
+			if e != nil {
+				err = fmt.Errorf("ES-搜索指标失败, %v", e)
+				return
+			}
+			var codes []string
+			for _, v := range esList {
+				codes = append(codes, v.EdbCode)
+			}
+			if len(codes) == 0 {
+				total = 0
+				list = make([]*data_manage.BaseRefreshEdbInfo, 0)
+				return
 			}
+			condition += fmt.Sprintf(` AND edb_code IN (%s)`, utils.GetOrmInReplace(len(codes)))
+			pars = append(pars, codes)
 		}
 
 		sortStr := ``

+ 37 - 18
services/data/edb_info_relation.go

@@ -5,6 +5,7 @@ import (
 	excelModel "eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/fe_calendar"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/elastic"
 	"eta/eta_api/services/sandbox"
 	"eta/eta_api/utils"
 	"fmt"
@@ -424,25 +425,43 @@ func GetEdbRelationList(source, edbType int, classifyId, sysUserId, frequency, k
 		pars = append(pars, frequencySlice)
 	}
 	if keyword != `` {
-		keywordSlice := strings.Split(keyword, " ")
-		if len(keywordSlice) > 0 {
-			tmpConditionSlice := make([]string, 0)
-			tmpConditionSlice = append(tmpConditionSlice, ` e.edb_name like ? or e.edb_code like ? `)
-			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-
-			for _, v := range keywordSlice {
-				if v == ` ` || v == `` {
-					continue
-				}
-				tmpConditionSlice = append(tmpConditionSlice, ` e.edb_name like ? or e.edb_code like ? `)
-				pars = utils.GetLikeKeywordPars(pars, v, 2)
-			}
-			condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
-
-		} else {
-			condition += ` AND (e.edb_name like ? or e.edb_code like ? )`
-			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		//keywordSlice := strings.Split(keyword, " ")
+		//if len(keywordSlice) > 0 {
+		//	tmpConditionSlice := make([]string, 0)
+		//	tmpConditionSlice = append(tmpConditionSlice, ` e.edb_name like ? or e.edb_code like ? `)
+		//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		//
+		//	for _, v := range keywordSlice {
+		//		if v == ` ` || v == `` {
+		//			continue
+		//		}
+		//		tmpConditionSlice = append(tmpConditionSlice, ` e.edb_name like ? or e.edb_code like ? `)
+		//		pars = utils.GetLikeKeywordPars(pars, v, 2)
+		//	}
+		//	condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+		//
+		//} else {
+		//	condition += ` AND (e.edb_name like ? or e.edb_code like ? )`
+		//	pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		//}
+
+		// 走ES搜
+		_, esList, e := elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyword, startSize, pageSize, 0, source, 0, frequency, []int{})
+		if e != nil {
+			err = fmt.Errorf("ES-搜索指标库失败, %v", e)
+			return
+		}
+		var codes []string
+		for _, v := range esList {
+			codes = append(codes, v.EdbCode)
+		}
+		if len(codes) == 0 {
+			total = 0
+			list = make([]*data_manage.BaseRelationEdbInfo, 0)
+			return
 		}
+		condition += fmt.Sprintf(` AND e.edb_code IN (%s)`, utils.GetOrmInReplace(len(codes)))
+		pars = append(pars, codes)
 	}
 
 	sortStr := ``

+ 10 - 1
services/data/stl/stl.go

@@ -631,7 +631,7 @@ func SaveStlConfig(req *request.StlConfigReq, adminId int) (configId int64, msg
 	return
 }
 
-func SearchEdbInfoWithStl(adminId int, keyWord string, currentIndex, pageSize int) (resp data_manage.EdbInfoFilterDataResp, msg string, err error) {
+func SearchEdbInfoWithStl(adminId int, keyWord string, currentIndex, pageSize int, lang string) (resp data_manage.EdbInfoFilterDataResp, msg string, err error) {
 	var edbInfoList []*data_manage.EdbInfoList
 
 	noPermissionEdbInfoIdList := make([]int, 0) //无权限指标
@@ -693,6 +693,15 @@ func SearchEdbInfoWithStl(adminId int, keyWord string, currentIndex, pageSize in
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+		// 如果没有关键词,那么搜索结果字段取指标名,前端已统一用该字段显示搜索的列表内容
+		if keyWord == "" {
+			if lang == utils.ZhLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbName
+			}
+			if lang == utils.EnLangVersion {
+				edbInfoList[i].SearchText = edbInfoList[i].EdbNameEn
+			}
+		}
 	}
 
 	// 当前列表中的分类map

+ 478 - 16
services/elastic/elastic.go

@@ -6,12 +6,13 @@ import (
 	"errors"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel"
+	dataSourceModel "eta/eta_api/models/data_source"
 	"eta/eta_api/utils"
 	"fmt"
+	"github.com/olivere/elastic/v7"
 	"strconv"
 	"strings"
-
-	"github.com/olivere/elastic/v7"
 )
 
 // indexName:索引名称
@@ -72,7 +73,7 @@ func EsAddOrEditEdbInfoData(indexName, docId string, item *data_manage.EdbInfoLi
 	}()
 	client := utils.EsClient
 
-	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background())
+	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Refresh("true").Do(context.Background())
 	if err != nil {
 		fmt.Println("新增失败:", err.Error())
 		return err
@@ -689,7 +690,7 @@ func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource
 }
 
 // SearchAddPredictEdbInfoData 查询允许添加预测指标的数据
-func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList []int, from, size int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList []int, from, size, sysUserId int) (total int64, list []*data_manage.EdbInfoList, err error) {
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
@@ -728,6 +729,15 @@ func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbIn
 		},
 	})
 
+	// 只看我的
+	if sysUserId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"SysUserId": sysUserId,
+			},
+		})
+	}
+
 	//关键字匹配
 	//shouldMap := map[string]interface{}{
 	//	"should": []interface{}{
@@ -835,6 +845,14 @@ func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shou
 
 	queryMap["from"] = from
 	queryMap["size"] = size
+	queryMap["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			"EdbName": map[string]interface{}{},
+		},
+		"pre_tags":  "<span style=\"color:#0052D9\">",
+		"post_tags": "</span>",
+	}
+
 	jsonBytes, _ := json.Marshal(queryMap)
 	fmt.Println(string(jsonBytes))
 
@@ -892,7 +910,11 @@ func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shou
 					edbInfoItem.EdbCode = v.Highlight["EdbCode"][0]
 				}
 				if len(v.Highlight["EdbName"]) > 0 {
-					edbInfoItem.EdbCode = v.Highlight["EdbName"][0]
+					// 搜索结果高亮用新字段,原EdbName直接高亮展示上会有点影响
+					edbInfoItem.SearchText = v.Highlight["EdbName"][0]
+					//edbInfoItem.EdbName = v.Highlight["EdbName"][0]
+				} else {
+					edbInfoItem.SearchText = edbInfoItem.EdbName
 				}
 				list = append(list, edbInfoItem)
 				searchMap[v.Id] = v.Id
@@ -912,7 +934,7 @@ func EsDeleteEdbInfoData(indexName, docId string) (err error) {
 	}()
 	client := utils.EsClient
 
-	resp, err := client.Delete().Index(indexName).Id(docId).Do(context.Background())
+	resp, err := client.Delete().Index(indexName).Id(docId).Refresh(`true`).Do(context.Background())
 	fmt.Println(resp)
 	if err != nil {
 		return
@@ -1041,7 +1063,7 @@ func EsAddOrEditChartInfoData(indexName, docId string, item *data_manage.ChartIn
 	}()
 	client := utils.EsClient
 
-	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background())
+	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Refresh("true").Do(context.Background())
 	if err != nil {
 		fmt.Println("新增失败:", err.Error())
 		return err
@@ -1065,7 +1087,7 @@ func EsDeleteDataV2(indexName, docId string) (err error) {
 	}()
 	client := utils.EsClient
 
-	resp, err := client.Delete().Index(indexName).Id(docId).Do(context.Background())
+	resp, err := client.Delete().Index(indexName).Id(docId).Refresh("true").Do(context.Background())
 	fmt.Println(resp)
 	if err != nil {
 		return
@@ -1079,8 +1101,8 @@ func EsDeleteDataV2(indexName, docId string) (err error) {
 }
 
 // SearchChartInfoData 查询es中的图表数据
-func SearchChartInfoData(indexName, keywordStr string, showSysId int, sourceList []int, noPermissionChartIdList []int, from, size int) (list []*data_manage.ChartInfo, total int64, err error) {
-	list = make([]*data_manage.ChartInfo, 0)
+func SearchChartInfoData(indexName, keywordStr string, showSysId int, sourceList []int, noPermissionChartIdList []int, from, size int) (list []*data_manage.ChartInfoMore, total int64, err error) {
+	list = make([]*data_manage.ChartInfoMore, 0)
 	defer func() {
 		if err != nil {
 			fmt.Println("EsAddOrEditData Err:", err.Error())
@@ -1217,6 +1239,14 @@ func SearchChartInfoData(indexName, keywordStr string, showSysId int, sourceList
 	// 分页查询
 	queryMap["from"] = from
 	queryMap["size"] = size
+	queryMap["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			keywordNameKey: map[string]interface{}{},
+		},
+		"pre_tags":  "<span style=\"color:#0052D9\">",
+		"post_tags": "</span>",
+	}
+
 	jsonBytes, _ := json.Marshal(queryMap)
 	fmt.Println(string(jsonBytes))
 
@@ -1248,15 +1278,18 @@ func SearchChartInfoData(indexName, keywordStr string, showSysId int, sourceList
 					fmt.Println("movieJson err:", err)
 					return
 				}
-				chartInfoItem := new(data_manage.ChartInfo)
+				chartInfoItem := new(data_manage.ChartInfoMore)
 				tmpErr = json.Unmarshal(itemJson, &chartInfoItem)
 				if err != nil {
 					fmt.Println("json.Unmarshal chartInfoJson err:", err)
 					err = tmpErr
 					return
 				}
-				if len(v.Highlight["ChartName"]) > 0 {
-					chartInfoItem.ChartName = v.Highlight["ChartName"][0]
+				if len(v.Highlight[keywordNameKey]) > 0 {
+					//chartInfoItem.ChartName = v.Highlight["ChartName"][0]
+					chartInfoItem.SearchText = v.Highlight[keywordNameKey][0]
+				} else {
+					chartInfoItem.SearchText = chartInfoItem.ChartName
 				}
 				list = append(list, chartInfoItem)
 				searchMap[v.Id] = v.Id
@@ -1279,7 +1312,7 @@ func EsAddOrEditDataInterface(indexName, docId string, item interface{}) (err er
 	}()
 	client := utils.EsClient
 
-	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background())
+	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Refresh("true").Do(context.Background())
 	if err != nil {
 		fmt.Println("新增失败:", err.Error())
 		return err
@@ -1429,6 +1462,14 @@ func SearchMyChartInfoData(indexName, keywordStr string, adminId int, noPermissi
 	// 分页查询
 	queryMap["from"] = from
 	queryMap["size"] = size
+	queryMap["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			keywordNameKey: map[string]interface{}{},
+		},
+		"pre_tags":  "<span style=\"color:#0052D9\">",
+		"post_tags": "</span>",
+	}
+
 	jsonBytes, _ := json.Marshal(queryMap)
 	fmt.Println(string(jsonBytes))
 
@@ -1467,8 +1508,11 @@ func SearchMyChartInfoData(indexName, keywordStr string, adminId int, noPermissi
 					err = tmpErr
 					return
 				}
-				if len(v.Highlight["ChartName"]) > 0 {
-					chartInfoItem.ChartName = v.Highlight["ChartName"][0]
+				if len(v.Highlight[keywordNameKey]) > 0 {
+					//chartInfoItem.ChartName = v.Highlight["ChartName"][0]
+					chartInfoItem.SearchText = v.Highlight[keywordNameKey][0]
+				} else {
+					chartInfoItem.SearchText = chartInfoItem.ChartName
 				}
 				list = append(list, chartInfoItem)
 				searchMap[v.Id] = v.Id
@@ -1705,3 +1749,421 @@ func SearchEdbInfoDataByAdminId(indexName, keywordStr string, from, size, filter
 
 	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
 }
+
+// EsAddOrEditExcelInfoData 新增/修改es中的表格数据
+func EsAddOrEditExcelInfoData(indexName, docId string, item *excel.ExcelInfo) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("EsAddOrEditExcelInfoData err: %v", err)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	client := utils.EsClient
+
+	resp, e := client.Index().Index(indexName).Id(docId).BodyJson(item).Refresh("true").Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("resp err, %v", e)
+		return
+	}
+	if resp.Status != 0 {
+		err = fmt.Errorf("result err, status: %d, result: %s", resp.Status, resp.Result)
+		return
+	}
+	err = nil
+	fmt.Println("excel write to es success", resp.Result)
+	return
+}
+
+// SearchExcelInfoData 查询es中的表格
+func SearchExcelInfoData(indexName, keyword string, source, adminId int, queryIds, exceptIds []int, from, size int) (total int64, list []*excel.SearchExcelInfo, err error) {
+	list = make([]*excel.SearchExcelInfo, 0)
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("SearchExcelInfoData err: %v", err)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	client := utils.EsClient
+
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"IsDelete": 0,
+		},
+	})
+
+	// 表格名称
+	shouldMap := make(map[string]interface{}, 0)
+	if keyword != "" {
+		shouldMap["should"] = []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"ExcelName": keyword,
+				},
+			},
+		}
+
+		//shouldMap := map[string]interface{}{
+		//	"should": []interface{}{
+		//		map[string]interface{}{
+		//			"match": map[string]interface{}{
+		//				"ExcelName": keyword,
+		//			},
+		//		},
+		//	},
+		//}
+	}
+
+	// 表格来源
+	if source > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Source": source,
+			},
+		})
+	}
+
+	// 创建人
+	if adminId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"SysUserId": adminId,
+			},
+		})
+	}
+
+	// 查询和排除的表格IDs
+	if len(queryIds) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ExcelInfoId": queryIds,
+			},
+		})
+	}
+	if len(exceptIds) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ExcelInfoId": exceptIds,
+			},
+		})
+	}
+
+	// 关键字匹配
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":     mustMap,
+				"must_not": mustNotMap,
+				//"should":   shouldMap,
+			},
+		},
+	}
+
+	//jsonBytes, _ := json.Marshal(queryMap)
+	//fmt.Println(string(jsonBytes))
+
+	// 根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	t, e := requestTotalHits.Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("total hits err: %v", e)
+		return
+	}
+	total = t
+
+	// 表格名称高亮,分页
+	highlightKeyName := "ExcelName"
+	queryMap["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			highlightKeyName: map[string]interface{}{},
+		},
+		"pre_tags":  "<span style=\"color:#0052D9\">",
+		"post_tags": "</span>",
+	}
+	queryMap["from"] = from
+	queryMap["size"] = size
+
+	//jsonBytes, _ := json.Marshal(queryMap)
+	//fmt.Println(string(jsonBytes))
+
+	request := client.Search(indexName).Source(queryMap)
+	searchResp, e := request.Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("search do err: %v", e)
+		return
+	}
+	//fmt.Println(searchResp)
+	if searchResp.Status != 0 {
+		return
+	}
+	if searchResp.Hits == nil {
+		return
+	}
+	searchMap := make(map[string]string)
+	for _, v := range searchResp.Hits.Hits {
+		if _, ok := searchMap[v.Id]; ok {
+			continue
+		}
+		j, e := v.Source.MarshalJSON()
+		if e != nil {
+			err = fmt.Errorf("hits json err: %v", e)
+			return
+		}
+		item := new(excel.SearchExcelInfo)
+		if e = json.Unmarshal(j, &item); e != nil {
+			err = fmt.Errorf("hits json unmarshal err: %v", e)
+			return
+		}
+		if len(v.Highlight[highlightKeyName]) > 0 {
+			item.SearchText = v.Highlight[highlightKeyName][0]
+		} else {
+			item.SearchText = item.ExcelName
+		}
+		list = append(list, item)
+		searchMap[v.Id] = v.Id
+	}
+	return
+}
+
+// EsAddOrEditDataSourceIndex 新增/修改es中的数据源指标
+func EsAddOrEditDataSourceIndex(indexName, docId string, item *dataSourceModel.SearchDataSource) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("EsAddOrEditDataSourceIndex err: %v", err)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	client := utils.EsClient
+
+	resp, e := client.Index().Index(indexName).Id(docId).BodyJson(item).Refresh("true").Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("resp err, %v", e)
+		return
+	}
+	if resp.Status != 0 {
+		err = fmt.Errorf("result err, status: %d, result: %s", resp.Status, resp.Result)
+		return
+	}
+	err = nil
+	fmt.Println("data source write to es success", resp.Result)
+	return
+}
+
+// SearchDataSourceIndex 查询es中的数据源
+func SearchDataSourceIndex(indexName, keyword string, source, subSource int, classifyIds, adminIds []int, frequency []string, from, size int) (total int64, list []*dataSourceModel.SearchDataSourceItem, err error) {
+	list = make([]*dataSourceModel.SearchDataSourceItem, 0)
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("SearchDataSourceIndex err: %v", err)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	client := utils.EsClient
+
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"IsDeleted": 0,
+		},
+	})
+
+	// 指标编码/名称
+	shouldMap := make(map[string]interface{}, 0)
+	if keyword != "" {
+		shouldMap["should"] = []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"IndexCode": keyword,
+				},
+			},
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"IndexName": keyword,
+				},
+			},
+		}
+		//queryFields := []string{"IndexName.keyword", "IndexName.ik", "IndexName.ngram", "IndexCode.keyword", "IndexCode.ngram"}
+		//mustMap = append(mustMap, map[string]interface{}{
+		//	"multi_match": map[string]interface{}{
+		//		"query":  keyword,
+		//		"fields": queryFields,
+		//	},
+		//})
+	}
+
+	// 来源/子来源
+	if source > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Source": source,
+			},
+		})
+	}
+	if subSource > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"SubSource": subSource,
+			},
+		})
+	}
+
+	// 分类
+	if len(classifyIds) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"ClassifyId": classifyIds,
+			},
+		})
+	}
+
+	// 创建人
+	if len(adminIds) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"SysUserId": adminIds,
+			},
+		})
+	}
+
+	// 频度
+	if len(frequency) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Frequency": frequency,
+			},
+		})
+	}
+
+	// 关键字匹配
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":     mustMap,
+				"must_not": mustNotMap,
+				//"should":   shouldMap,
+			},
+		},
+	}
+
+	//tj, _ := json.Marshal(queryMap)
+	//utils.FileLog.Info(string(tj))
+
+	// 根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	t, e := requestTotalHits.Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("total hits err: %v", e)
+		return
+	}
+	total = t
+
+	// 表格名称高亮,分页
+	highlightKeyName := "IndexName"
+	//highlightIk := "IndexName.ik"
+	//highlightKeyword := "IndexName.keyword"
+	queryMap["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			highlightKeyName: map[string]interface{}{},
+			//highlightIk:      map[string]interface{}{},
+			//highlightKeyword: map[string]interface{}{},
+		},
+		"pre_tags":  "<span style=\"color:#0052D9\">",
+		"post_tags": "</span>",
+	}
+	queryMap["from"] = from
+	queryMap["size"] = size
+
+	qj, _ := json.Marshal(queryMap)
+	utils.FileLog.Info(string(qj))
+
+	request := client.Search(indexName).Source(queryMap)
+	searchResp, e := request.Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("search do err: %v", e)
+		return
+	}
+
+	rj, _ := json.Marshal(searchResp)
+	utils.FileLog.Info(string(rj))
+
+	if searchResp.Status != 0 {
+		return
+	}
+	if searchResp.Hits == nil {
+		return
+	}
+	searchMap := make(map[string]string)
+	for _, v := range searchResp.Hits.Hits {
+		if _, ok := searchMap[v.Id]; ok {
+			continue
+		}
+		j, e := v.Source.MarshalJSON()
+		if e != nil {
+			err = fmt.Errorf("hits json err: %v", e)
+			return
+		}
+		item := new(dataSourceModel.SearchDataSourceItem)
+		if e = json.Unmarshal(j, &item); e != nil {
+			err = fmt.Errorf("hits json unmarshal err: %v", e)
+			return
+		}
+		if len(v.Highlight[highlightKeyName]) > 0 {
+			item.SearchText = v.Highlight[highlightKeyName][0]
+		}
+
+		// 优先取keyword的高亮,其次是ik分词之后的高亮
+		//if len(v.Highlight) > 0 {
+		//	if len(v.Highlight[highlightKeyword]) > 0 {
+		//		item.SearchText = v.Highlight[highlightKeyword][0]
+		//	}
+		//	if len(v.Highlight[highlightKeyword]) == 0 && len(v.Highlight[highlightIk]) > 0 {
+		//		item.SearchText = v.Highlight[highlightIk][0]
+		//	}
+		//}
+		if item.SearchText == "" {
+			item.SearchText = item.IndexName
+		}
+		list = append(list, item)
+		searchMap[v.Id] = v.Id
+	}
+	return
+}
+
+// CreateEsIndex 创建ES索引
+func CreateEsIndex(indexName, jsonMapping string) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("CreateEsIndex err: %v", err)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	client := utils.EsClient
+
+	// 校验是否存在
+	exists, e := client.IndexExists(indexName).Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("check exists err: %v", e)
+		return
+	}
+	if exists {
+		fmt.Printf("索引已存在: %s, 跳过\n", indexName)
+		return
+	}
+
+	// 创建索引及映射
+	createIndex, e := client.CreateIndex(indexName).BodyJson(jsonMapping).Do(context.Background())
+	if e != nil {
+		err = fmt.Errorf("create index err: %v", e)
+		return
+	}
+	fmt.Printf("create index success: %s\n", createIndex.Index)
+	return
+}

+ 28 - 0
services/excel/excel_elastic.go

@@ -0,0 +1,28 @@
+package excel
+
+import (
+	excel2 "eta/eta_api/models/data_manage/excel"
+	"eta/eta_api/services/elastic"
+	"eta/eta_api/utils"
+	"fmt"
+	"strconv"
+)
+
+// EsAddOrEditExcel 新增和修改ES中的表格
+func EsAddOrEditExcel(excelId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("EsAddOrEditExcel, excelId: %d, err: %v", excelId, err)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	item, e := excel2.GetExcelInfoById(excelId)
+	if e != nil {
+		err = fmt.Errorf("获取表格失败, %v", e)
+		return
+	}
+	item.Content = "" // 内容没必要写进去
+	err = elastic.EsAddOrEditExcelInfoData(utils.EsExcelIndexName, strconv.Itoa(excelId), item)
+	return
+}

+ 65 - 0
services/excel_info.go

@@ -3,7 +3,9 @@ package services
 import (
 	"encoding/json"
 	"eta/eta_api/models"
+	excel3 "eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/system"
+	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/utils"
 	"fmt"
 	"time"
@@ -61,3 +63,66 @@ func UpdateExcelEditMark(excelInfoId, nowUserId, status int, nowUserName string)
 	return
 }
 
+// GetBalanceExcelIdsByAdminId 获取用户有权限的平衡表excelIds
+func GetBalanceExcelIdsByAdminId(adminId int, condition string, pars []interface{}, permissionEdbIdList, permissionClassifyIdList []int) (authIds []int, err error) {
+	//找到当前协作人相关的表格ID
+	obj := new(excel3.ExcelWorker)
+	existList, err := obj.GetBySysUserId(adminId)
+	if err != nil {
+		//br.Msg = "获取表格协作人失败!"
+		//br.ErrMsg = "获取表格协作人失败,Err:" + err.Error()
+		return
+	}
+	var excelIds []int
+	newCondition := condition
+	newPars := pars
+	if len(existList) > 0 {
+		for _, v := range existList {
+			excelIds = append(excelIds, v.ExcelInfoId)
+		}
+		newCondition += fmt.Sprintf(` AND  ( excel_info_id IN (%s)  or sys_user_id = ?)`, utils.GetOrmInReplace(len(excelIds)))
+		newPars = append(newPars, excelIds, adminId)
+	} else {
+		newCondition += ` AND  sys_user_id = ? `
+		newPars = append(newPars, adminId)
+	}
+
+	//获取表格信息
+	tmpList, e := excel3.GetNoContentExcelListByConditionNoPage(newCondition, newPars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		//br.Success = true
+		//br.Msg = "获取表格信息失败"
+		//br.ErrMsg = "获取表格信息失败,Err:" + e.Error()
+		return
+	}
+	classifyIdListTmp := make([]int, 0)
+	for _, v := range tmpList {
+		classifyIdListTmp = append(classifyIdListTmp, v.ExcelClassifyId)
+	}
+	classifyMap := make(map[int]*excel3.ExcelClassify)
+
+	// 分类信息
+	if len(classifyIdListTmp) > 0 {
+		classifyListTmp, e := excel3.GetClassifyByIdList(classifyIdListTmp)
+		if e != nil {
+			//br.Msg = "获取表格分类信息失败"
+			//br.ErrMsg = "获取表格分类列表数据失败,Err:" + e.Error()
+			return
+		}
+		for _, v := range classifyListTmp {
+			classifyMap[v.ExcelClassifyId] = v
+		}
+	}
+	excelIds = make([]int, 0)
+	for _, v := range tmpList {
+		// 数据权限
+		if classifyInfo, ok := classifyMap[v.ExcelClassifyId]; ok {
+			v.HaveOperaAuth = data_manage_permission.CheckExcelPermissionByPermissionIdList(v.IsJoinPermission, classifyInfo.IsJoinPermission, v.ExcelInfoId, v.ExcelClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			if v.HaveOperaAuth {
+				excelIds = append(excelIds, v.ExcelInfoId)
+			}
+		}
+	}
+	authIds = excelIds
+	return
+}

+ 11 - 2
services/task.go

@@ -2,6 +2,7 @@ package services
 
 import (
 	"eta/eta_api/models"
+	"eta/eta_api/services/binlog"
 	"eta/eta_api/services/data"
 	edbmonitor "eta/eta_api/services/edb_monitor"
 	"eta/eta_api/utils"
@@ -49,10 +50,18 @@ func Task() {
 	// 进行指标替换操作
 	go DealReplaceEdbCache()
 
+	// 监听binlog
+	if utils.MYSQL_DATA_BINLOG_URL != "" {
+		go binlog.ListenMysql()
+	}
+
 	go edbmonitor.HandleEdbMonitorEdbInfo()
 
-	// TODO:修复权限
-	//FixEnCompanyPermission()
+	// 监听数据源binlog写入es
+	go binlog.HandleDataSourceChange2Es()
+
+	// TODO:数据修复
+	//FixNewEs()
 	fmt.Println("task end")
 }
 

+ 533 - 0
services/temp_fix.go

@@ -0,0 +1,533 @@
+package services
+
+import (
+	aiPredictModel "eta/eta_api/models/ai_predict_model"
+	"eta/eta_api/models/data_manage/excel"
+	dataSourceModel "eta/eta_api/models/data_source"
+	"eta/eta_api/services/elastic"
+	excel2 "eta/eta_api/services/excel"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+// FixNewEs 修复新的es数据
+func FixNewEs() {
+	fmt.Println("开始修复")
+	var err error
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("修复es历史数据失败, %v", err)
+			fmt.Println(tips)
+			utils.FileLog.Info(tips)
+		}
+	}()
+
+	// 表格
+	if utils.EsExcelIndexName == "" {
+		err = fmt.Errorf("表格索引名为空")
+		return
+	}
+	fmt.Println("开始创建表格索引:", utils.EsExcelIndexName)
+	indexMapping := `{"mappings":{"properties":{"ExcelInfoId":{"type":"long"},"Source":{"type":"long"},"ExcelType":{"type":"long"},"ExcelName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"UniqueCode":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"ExcelClassifyId":{"type":"long"},"SysUserId":{"type":"long"},"SysUserRealName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"Content":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"ExcelImage":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"FileUrl":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"Sort":{"type":"long"},"IsDelete":{"type":"long"},"ModifyTime":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"CreateTime":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"IsJoinPermission":{"type":"long"},"ParentId":{"type":"long"},"BalanceType":{"type":"long"},"UpdateUserId":{"type":"long"},"UpdateUserRealName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"RelExcelInfoId":{"type":"long"},"VersionName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"SourcesFrom":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}}`
+	if e := elastic.CreateEsIndex(utils.EsExcelIndexName, indexMapping); e != nil {
+		err = fmt.Errorf("创建excel索引失败, %v", e)
+		return
+	}
+	fmt.Println("表格索引创建成功")
+
+	fmt.Println("开始修复表格数据")
+	excels, e := excel.GetExcelInfoAll()
+	if e != nil {
+		err = fmt.Errorf("获取所有excel表格失败, %v", e)
+		return
+	}
+	for _, v := range excels {
+		fmt.Printf("ExcelId: %d 修复中\n", v.ExcelInfoId)
+		excel2.EsAddOrEditExcel(v.ExcelInfoId)
+	}
+	fmt.Println("表格数据修复成功")
+
+	// 数据源
+	fmt.Println("数据源索引名:", utils.EsDataSourceIndexName)
+	if utils.EsDataSourceIndexName == "" {
+		err = fmt.Errorf("数据源索引名为空")
+		return
+	}
+	fmt.Println("开始创建数据源索引:", utils.EsDataSourceIndexName)
+	indexMappingB := `{"mappings":{"properties":{"ClassifyId":{"type":"long"},"CreateTime":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"EndDate":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"Frequency":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"IndexCode":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"IndexName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"IsDeleted":{"type":"long"},"LatestValue":{"type":"text"},"ModifyTime":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"PrimaryId":{"type":"long"},"Source":{"type":"long"},"SourceName":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"SubSource":{"type":"long"},"StartDate":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"Unit":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}}`
+	//indexMappingB := `{"settings":{"analysis":{"analyzer":{"ik_analyzer":{"type":"custom","tokenizer":"ik_max_word"},"ngram_analyzer":{"type":"custom","tokenizer":"standard","filter":["lowercase","ngram_filter"]}},"filter":{"ngram_filter":{"type":"ngram","min_gram":1,"max_gram":2,"token_chars":["letter","digit"]}}}},"mappings":{"properties":{"ClassifyId":{"type":"long"},"CreateTime":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"EndDate":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"Frequency":{"type":"text","analyzer":"ik_smart"},"IndexCode":{"type":"text","fields":{"ngram":{"type":"text","analyzer":"ngram_analyzer","search_analyzer":"standard"},"keyword":{"type":"keyword","ignore_above":256}}},"IndexName":{"type":"text","fields":{"ik":{"type":"text","analyzer":"ik_analyzer","search_analyzer":"ik_analyzer"},"ngram":{"type":"text","analyzer":"ngram_analyzer","search_analyzer":"standard"},"keyword":{"type":"keyword","ignore_above":256}}},"IsDeleted":{"type":"long"},"LatestValue":{"type":"double"},"ModifyTime":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"PrimaryId":{"type":"long"},"Source":{"type":"long"},"SourceName":{"type":"text","analyzer":"ik_smart"},"SubSource":{"type":"long"},"StartDate":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"Unit":{"type":"text","analyzer":"ik_smart"}}}}`
+	if e := elastic.CreateEsIndex(utils.EsDataSourceIndexName, indexMappingB); e != nil {
+		err = fmt.Errorf("创建数据源索引失败, %v", e)
+		return
+	}
+	fmt.Println("数据源索引创建成功")
+
+	fmt.Println("开始修复数据源")
+	var cond string
+	var pars []interface{}
+	// 睿咨得
+	rzdOb := new(dataSourceModel.BaseFromRzdIndex)
+	{
+		list, e := rzdOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取睿咨得失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:睿咨得-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("睿咨得-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 泛糖科技
+	hisugarOb := new(dataSourceModel.BaseFromHisugarIndex)
+	{
+		list, e := hisugarOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取泛糖科技失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:泛糖科技-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("泛糖科技-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 粮油商务网
+	lyOb := new(dataSourceModel.BaseFromLyIndex)
+	{
+		list, e := lyOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取粮油商务网失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:粮油商务网-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("粮油商务网-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 卓创红期
+	sciHqOb := new(dataSourceModel.BaseFromSciHqIndex)
+	{
+		list, e := sciHqOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取卓创红期失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:卓创红期-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("卓创红期-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 同花顺高频
+	thsHfOb := new(dataSourceModel.BaseFromThsHfIndex)
+	{
+		list, e := thsHfOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取同花顺高频失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:同花顺高频-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("同花顺高频-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 隆众资讯
+	oilchemOb := new(dataSourceModel.BaseFromOilchemIndex)
+	{
+		list, e := oilchemOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取隆众资讯失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:隆众资讯-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("隆众资讯-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// CCF化纤信息
+	ccfOb := new(dataSourceModel.BaseFromCcfIndex)
+	{
+		list, e := ccfOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取CCF化纤信息失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:CCF化纤信息-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("CCF化纤信息-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 上海钢联
+	mysteelOb := new(dataSourceModel.BaseFromMysteelChemicalIndex)
+	{
+		list, e := mysteelOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取上海钢联失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:上海钢联-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("上海钢联-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// SMM、有色原始数据库
+	smmOb := new(dataSourceModel.BaseFromSmmIndex)
+	{
+		list, e := smmOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取有色原始数据库失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:有色原始数据库-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("有色原始数据库-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 百川盈孚
+	baiinfoOb := new(dataSourceModel.BaseFromBaiinfoIndex)
+	{
+		list, e := baiinfoOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取百川盈孚失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:百川盈孚-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("百川盈孚-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 红桃3
+	sciOb := new(dataSourceModel.BaseFromSciIndex)
+	{
+		list, e := sciOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取红桃3失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:红桃3-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("红桃3-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 中国煤炭市场网
+	coalmineOb := new(dataSourceModel.BaseFromCoalmineMapping)
+	{
+		list, e := coalmineOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取中国煤炭市场网失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:中国煤炭市场网-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("中国煤炭市场网-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// EIA STEO报告
+	eiaOb := new(dataSourceModel.BaseFromEiaSteoIndex)
+	{
+		list, e := eiaOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取EIA STEO报告失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:EIA STEO报告-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("EIA STEO报告-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// ICPI消费价格指数
+	icpiOb := new(dataSourceModel.BaseFromIcpiIndex)
+	{
+		list, e := icpiOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取ICPI消费价格指数失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:ICPI消费价格指数-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("ICPI消费价格指数-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 涌益咨询
+	yongyiOb := new(dataSourceModel.BaseFromYongyiIndex)
+	{
+		list, e := yongyiOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取涌益咨询失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:涌益咨询-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("涌益咨询-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 汾渭数据
+	fenweiOb := new(dataSourceModel.BaseFromFenweiIndex)
+	{
+		list, e := fenweiOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取汾渭数据失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:汾渭数据-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("汾渭数据-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 卓创数据
+	sci99Ob := new(dataSourceModel.BaseFromSci99Index)
+	{
+		list, e := sci99Ob.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取卓创数据失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:卓创数据-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("卓创数据-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 钢联原始指标库
+	glOb := new(dataSourceModel.BaseFromGlIndex)
+	{
+		list, e := glOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取钢联原始指标库失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:钢联原始指标库-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("钢联原始指标库-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 手工指标录入
+	manualOb := new(dataSourceModel.BaseFromManualEdb)
+	{
+		list, e := manualOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取手工指标失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:手工指标-%s\n", indexItem.IndexCode)
+			docId := fmt.Sprintf("%d-%s", indexItem.Source, indexItem.IndexCode)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("手工指标-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// Bloomberg
+	bloombergOb := new(dataSourceModel.BaseFromBloombergIndex)
+	{
+		list, e := bloombergOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取Bloomberg失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:Bloomberg-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("Bloomberg-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 煤炭江湖
+	mtjhOb := new(dataSourceModel.BaseFromMtjhMapping)
+	{
+		list, e := mtjhOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取煤炭江湖失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:煤炭江湖-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("煤炭江湖-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// AI预测模型
+	aiPredictOb := new(aiPredictModel.AiPredictModelIndex)
+	{
+		list, e := aiPredictOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取AI预测模型失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := new(dataSourceModel.SearchDataSource)
+			indexItem.PrimaryId = v.AiPredictModelIndexId
+			indexItem.IndexName = v.IndexName
+			indexItem.IndexCode = v.IndexCode
+			indexItem.ClassifyId = v.ClassifyId
+			indexItem.Source = utils.DATA_SOURCE_AI_PREDICT_MODEL
+			indexItem.SourceName = "AI预测模型"
+			indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, v.CreateTime)
+			indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, v.ModifyTime)
+			fmt.Printf("写入中:AI预测模型-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("AI预测模型-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 美国农业部
+	usdaOb := new(dataSourceModel.BaseFromUsdaFasIndex)
+	{
+		list, e := usdaOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取美国农业部失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:美国农业部-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("美国农业部-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	// 自有数据
+	businessOb := new(dataSourceModel.BaseFromBusinessIndex)
+	{
+		list, e := businessOb.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取自有数据失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			indexItem := v.Format2SearchDataSource(v)
+			fmt.Printf("写入中:自有数据-%d\n", indexItem.PrimaryId)
+			docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
+			if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
+				err = fmt.Errorf("自有数据-写入es失败, %v", e)
+				return
+			}
+		}
+	}
+
+	fmt.Println("修复完成")
+}

+ 6 - 0
utils/config.go

@@ -38,6 +38,8 @@ var (
 	MYSQL_DATA_BINLOG_PWD       string // 数据指标库binlog密码
 	MYSQL_DATA_BINLOG_DB        string // 数据指标库binlog位置
 	MYSQL_DATA_BINLOG_SERVER_ID string // 数据指标库binlog server_id
+	MYSQL_DATA_BINLOG_DB_EDB    string // 数据手工指标binlog位置
+	MYSQL_DATA_BINLOG_DB_GL     string // 数据钢联binlog位置
 )
 
 // 基础配置
@@ -136,6 +138,8 @@ var (
 	MY_CHART_INDEX_NAME            string //研究图库(MY ETA)索引
 	EsSemanticAnalysisDocIndexName string //ES语义分析文档索引名
 	SmartReportIndexName           string //智能研报ES索引
+	EsExcelIndexName               string // 表格ES索引名称
+	EsDataSourceIndexName          string // 数据源ES索引名称
 )
 
 var (
@@ -332,6 +336,8 @@ func init() {
 		MYSQL_DATA_BINLOG_PWD = config["mysql_data_binlog_pwd"]
 		MYSQL_DATA_BINLOG_DB = config["mysql_data_binlog_db"]
 		MYSQL_DATA_BINLOG_SERVER_ID = config["mysql_data_binlog_server_id"]
+		MYSQL_DATA_BINLOG_DB_EDB = config["mysql_data_binlog_db_edb"]
+		MYSQL_DATA_BINLOG_DB_GL = config["mysql_data_binlog_db_gl"]
 	}
 
 	// mongodb数据库连接配置

+ 7 - 3
utils/constants.go

@@ -171,26 +171,28 @@ const (
 	DATA_SOURCE_CALCULATE_ZDYFX                                 // 自定义分析->74
 	DATA_SOURCE_CALCULATE_RJZ                                   // 日均值计算->75
 	DATA_SOURCE_YONYI                                = 76       //涌益咨询
+	DATA_SOURCE_FENWEI                               = 77       // 汾渭数据->77
 	DATA_SOURCE_GFEX                                 = 78       // 广州期货交易所->78
 	DATA_SOURCE_ICPI                                 = 79       // ICPI消费价格指数->79
+	DATA_SOURCE_MTJH                                 = 80       // 煤炭江湖
 	DATA_SOURCE_BLOOMBERG                            = 83       // bloomberg彭博数据
 	DATA_SOURCE_BUSINESS                             = 84       // 来源于自有数据
 	DATA_SOURCE_SCI99                                = 85       // 卓创资讯 -> 85
 	DATA_SOURCE_CCF                                  = 86       // CCF化纤信息
 	DATA_SOURCE_CALCULATE_RANGEANLYSIS               = 87       //区间计算->87
-	DATA_SOURCE_PREDICT_CALCULATE_RANGEANLYSIS       = 90       // 预测指标区间计算->90
 	DATA_SOURCE_SCI_HQ                               = 88       // 卓创红期->88
 	DATA_SOURCE_OILCHEM                              = 89       // 隆众资讯 -> 89
-	DATA_SOURCE_FENWEI                               = 77       // 汾渭数据->92
+	DATA_SOURCE_PREDICT_CALCULATE_RANGEANLYSIS       = 90       // 预测指标区间计算->90
 	DATA_SOURCE_LY                                   = 91       // 粮油商务网
 	DATA_SOURCE_TRADE_ANALYSIS                       = 92       // 持仓分析
 	DATA_SOURCE_HISUGAR                              = 93       // 泛糖科技 -> 93
 	DATA_SOURCE_USDA_FAS                             = 96       //美国农业部
-	DATA_SOURCE_CALCULATE_STL                        = 98       // STL趋势分解 -> 98
 	DATA_SOURCE_RZD                                  = 97       // 睿姿得数据
+	DATA_SOURCE_CALCULATE_STL                        = 98       // STL趋势分解 -> 98
 	DATA_SOURCE_RESIDUAL_ANALYSIS                    = 99       // 残差分析
 	DATA_SOURCE_CLARKSONS                            = 101      // 克拉克森数据
 	DATA_SOURCE_GPR_RISK                             = 102      //GPR地缘风险指数
+	DATA_SOURCE_AI_PREDICT_MODEL                     = 103      // AI预测模型
 )
 
 // 数据刷新频率
@@ -254,6 +256,8 @@ const (
 	CACHE_EDB_TERMINAL_CODE_URL      = "edb:terminal_code:edb_code:"     // 指标与终端关系的缓存
 
 	CACHE_KEY_REPLACE_EDB = "eta:replace_edb" //系统用户操作日志队列
+
+	CACHE_DATA_SOURCE_ES_HANDLE = "eta:data_source_es:handle" // 数据源es处理队列
 )
 
 // 模板消息推送类型