Jelajahi Sumber

Merge branch 'master' into feature/minio_1120

hsun 1 tahun lalu
induk
melakukan
6a189d9820

+ 10 - 3
controllers/data_manage/chart_framework.go

@@ -249,9 +249,12 @@ func (this *ChartFrameworkController) Add() {
 			t.MyChartClassifyId = v.MyChartClassifyId
 			t.CreateTime = now
 			nodes = append(nodes, t)
-
+			num, ok := chartsNumMap[v.MyChartClassifyId]
+			if !ok {
+				num = 0
+			}
 			// 响应节点数据
-			td := data_manage.FormatChartFrameworkNode2Item(t, chartsNumMap[t.MyChartClassifyId])
+			td := data_manage.FormatChartFrameworkNode2Item(t, num)
 			itemNodes = append(itemNodes, td)
 		}
 	}
@@ -791,7 +794,11 @@ func (this *ChartFrameworkController) Detail() {
 		if v.NodeId == "" {
 			continue
 		}
-		itemNodes = append(itemNodes, data_manage.FormatChartFrameworkNode2Item(v, chartsNumMap[v.MyChartClassifyId]))
+		num, ok := chartsNumMap[v.MyChartClassifyId]
+		if !ok {
+			num = 0
+		}
+		itemNodes = append(itemNodes, data_manage.FormatChartFrameworkNode2Item(v, num))
 	}
 	detail := data_manage.FormatChartFramework2Item(item, itemNodes)
 

+ 149 - 118
controllers/data_manage/edb_info.go

@@ -2363,7 +2363,7 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
 
 	// 添加钢联指标更新日志
 	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
@@ -2480,7 +2480,7 @@ func (this *EdbInfoController) EdbEnInfoEdit() {
 
 	// 修改关联的预测指标基础信息
 	if edbInfo.EdbInfoType == 0 {
-		go data.ModifyPredictEdbEnBaseInfoBySourceEdb(edbInfo)
+		go data.ModifyPredictEdbEnBaseInfoBySourceEdb(edbInfo, req.UnitEn)
 	}
 
 	br.Ret = 200
@@ -5377,101 +5377,117 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 // @Param   EdbCode   query   string  false       "指标编码/指标代码"
 // @Param   StockCode   query   string  false       "证券代码"
 // @Success 200 {object} data_manage.EdbInfoExistCheckResp
-// @router /edb_info/smm/exist/check [get]
+// @router /edb_info/smm/exist/check [post]
 func (this *EdbInfoController) SmmExistCheck() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	selectAll, err := this.GetBool("SelectAll", false)
+
+	var req data_manage.SmmIndexExistCheckReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
-		br.Msg = "参数解析失败"
+		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	types := this.GetString("Types")
-	frequency := this.GetString("Frequency")
-	dataState := this.GetString("DataState")
-	edbCode := this.GetString("EdbCode")
+
+	types := req.Types
+	frequency := req.Frequency
+	dataState := req.DataState
+	selectAll := req.SelectAll
+	keyword := req.Keyword
+
+	edbCode := req.EdbCode
 	edbCode = strings.Trim(edbCode, "\t")
 	edbCode = strings.Trim(edbCode, " ")
 	edbCode = strings.Replace(edbCode, "\t", "", -1)
 
-	selectCode := this.GetString("SelectCode")
-	selectCode = strings.Trim(selectCode, "\t")
-	selectCode = strings.Trim(selectCode, " ")
-	selectCode = strings.Replace(selectCode, "\t", "", -1)
-
 	var edbCodeArr []string
 	var codeArr []string
 
 	if selectAll {
 		// 如果勾了列表全选,那么EdbCode传的就是排除的code
-		if selectCode == "" {
-			// 无勾选code,走查询
-			var condition string
-			var pars []interface{}
 
-			if types != "" {
-				typeArr := strings.Split(types, ",")
+		var condition string
+		var pars []interface{}
+
+		if len(types) > 0 {
+			condition += " AND ( "
+			for _, v := range types {
+				typeArr := strings.Split(v, ",")
 				for i, v := range typeArr {
+					if i == 0 {
+						condition += " ( "
+					}
 					typeStr := "type_"
 					typeStr += fmt.Sprintf("%d", i+1)
-					condition += " AND " + typeStr + " =? "
+					condition += typeStr + " =? "
 					pars = append(pars, v)
+					if i == len(typeArr)-1 {
+						condition += " ) "
+					} else {
+						condition += " AND "
+					}
 				}
+				condition += " OR "
 			}
+			condition = strings.Trim(condition, "OR ")
+			condition += " ) "
+		}
 
-			if dataState != "" {
-				if dataState == "normal" {
-					condition += " AND (data_state = 'normal' OR data_state = '') "
-					pars = append(pars)
-				} else {
-					condition += " AND data_state = ? "
-					pars = append(pars, dataState)
-				}
-			}
-
-			if frequency != "" {
-				condition += " AND frequency = ? "
-				pars = append(pars, frequency)
-			}
+		if frequency != "" {
+			frequencyArr := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+			pars = append(pars, frequencyArr)
+		}
 
-			indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
-			if err != nil {
-				br.Msg = "获取指标列表失败"
-				br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
-				return
+		if dataState != "" {
+			stateArr := strings.Split(dataState, ",")
+			if strings.Contains(dataState, "normal") {
+				stateArr = append(stateArr, "")
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
+			} else {
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
 			}
+		}
 
-			for _, v := range indexList {
-				codeArr = append(codeArr, v.IndexCode)
+		if keyword != "" {
+			keyWordArr := strings.Split(keyword, " ")
+			if len(keyWordArr) > 0 {
+				condition += " AND ( "
+				for _, v := range keyWordArr {
+					condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+				}
+				condition = strings.TrimRight(condition, "OR")
+				condition += " ) "
 			}
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
+		if err != nil {
+			br.Msg = "获取指标列表失败"
+			br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+			return
+		}
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
-			}
-		} else {
-			// 有勾选,不查询
-			codeArr = strings.Split(selectCode, ",")
+		for _, v := range indexList {
+			codeArr = append(codeArr, v.IndexCode)
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		noUseCodeArr := strings.Split(edbCode, ",")
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
+		for _, code := range codeArr {
+			// 检查code是否在noUseCodeArr数组中
+			if !utils.ArrContainsStr(noUseCodeArr, code) {
+				// 如果不在,将其添加到结果数组中
+				edbCodeArr = append(edbCodeArr, code)
 			}
 		}
+
 	} else {
 		//未勾选全选EdbCode就是需要的code
 		edbCodeArr = strings.Split(edbCode, ",")
@@ -5532,101 +5548,116 @@ func (this *EdbInfoController) SmmExistCheck() {
 // @Param   EdbCode   query   string  false       "指标编码/指标代码"
 // @Param   StockCode   query   string  false       "证券代码"
 // @Success 200 {object} data_manage.EdbInfoSearchResp
-// @router /edb_info/smm/search [get]
+// @router /edb_info/smm/search [post]
 func (this *EdbInfoController) EdbInfoSmmSearch() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	selectAll, err := this.GetBool("SelectAll", false)
+
+	var req data_manage.SmmIndexExistCheckReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
-		br.Msg = "参数解析失败"
+		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	types := this.GetString("Types")
-	frequency := this.GetString("Frequency")
-	dataState := this.GetString("DataState")
-	edbCode := this.GetString("EdbCode")
+
+	types := req.Types
+	frequency := req.Frequency
+	dataState := req.DataState
+	selectAll := req.SelectAll
+	keyword := req.Keyword
+	edbCode := req.EdbCode
 	edbCode = strings.Trim(edbCode, "\t")
 	edbCode = strings.Trim(edbCode, " ")
 	edbCode = strings.Replace(edbCode, "\t", "", -1)
 
-	selectCode := this.GetString("SelectCode")
-	selectCode = strings.Trim(selectCode, "\t")
-	selectCode = strings.Trim(selectCode, " ")
-	selectCode = strings.Replace(selectCode, "\t", "", -1)
-
 	var edbCodeArr []string
 	var codeArr []string
 
 	if selectAll {
 		// 如果勾了列表全选,那么EdbCode传的就是排除的code
-		if selectCode == "" {
-			// 无勾选code,走查询
-			var condition string
-			var pars []interface{}
 
-			if types != "" {
-				typeArr := strings.Split(types, ",")
+		var condition string
+		var pars []interface{}
+
+		if len(types) > 0 {
+			condition += " AND ( "
+			for _, v := range types {
+				typeArr := strings.Split(v, ",")
 				for i, v := range typeArr {
+					if i == 0 {
+						condition += " ( "
+					}
 					typeStr := "type_"
 					typeStr += fmt.Sprintf("%d", i+1)
-					condition += " AND " + typeStr + " =? "
+					condition += typeStr + " =? "
 					pars = append(pars, v)
+					if i == len(typeArr)-1 {
+						condition += " ) "
+					} else {
+						condition += " AND "
+					}
 				}
+				condition += " OR "
 			}
+			condition = strings.Trim(condition, "OR ")
+			condition += " ) "
+		}
 
-			if dataState != "" {
-				if dataState == "normal" {
-					condition += " AND (data_state = 'normal' OR data_state = '') "
-					pars = append(pars)
-				} else {
-					condition += " AND data_state = ? "
-					pars = append(pars, dataState)
-				}
-			}
-
-			if frequency != "" {
-				condition += " AND frequency = ? "
-				pars = append(pars, frequency)
-			}
+		if frequency != "" {
+			frequencyArr := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+			pars = append(pars, frequencyArr)
+		}
 
-			indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
-			if err != nil {
-				br.Msg = "获取指标列表失败"
-				br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
-				return
+		if dataState != "" {
+			stateArr := strings.Split(dataState, ",")
+			if strings.Contains(dataState, "normal") {
+				stateArr = append(stateArr, "")
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
+			} else {
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
 			}
+		}
 
-			for _, v := range indexList {
-				codeArr = append(codeArr, v.IndexCode)
+		if keyword != "" {
+			keyWordArr := strings.Split(keyword, " ")
+			if len(keyWordArr) > 0 {
+				condition += " AND ( "
+				for _, v := range keyWordArr {
+					condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+				}
+				condition = strings.TrimRight(condition, "OR")
+				condition += " ) "
 			}
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
+		if err != nil {
+			br.Msg = "获取指标列表失败"
+			br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+			return
+		}
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
-			}
-		} else {
-			// 有勾选,不查询
-			codeArr = strings.Split(selectCode, ",")
+		for _, v := range indexList {
+			codeArr = append(codeArr, v.IndexCode)
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		noUseCodeArr := strings.Split(edbCode, ",")
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
+		for _, code := range codeArr {
+			// 检查code是否在noUseCodeArr数组中
+			if !utils.ArrContainsStr(noUseCodeArr, code) {
+				// 如果不在,将其添加到结果数组中
+				edbCodeArr = append(edbCodeArr, code)
 			}
 		}
+
 	} else {
 		//未勾选全选EdbCode就是需要的code
 		edbCodeArr = strings.Split(edbCode, ",")

+ 2 - 2
controllers/data_manage/edb_info_calculate.go

@@ -459,7 +459,7 @@ func (this *ChartInfoController) CalculateEdit() {
 	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfoDetail)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfoDetail, req.Frequency, req.Unit)
 
 	br.Ret = 200
 	br.Success = true
@@ -859,7 +859,7 @@ func (this *ChartInfoController) CalculateBatchEdit() {
 	data.AddOrEditEdbInfoToEs(resp.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
 
 	br.Ret = 200
 	br.Success = true

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

@@ -389,7 +389,7 @@ func (c *CustomAnalysisController) EditEdb() {
 	data.AddOrEditEdbInfoToEs(resp.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
 
 	br.Ret = 200
 	br.Success = true

+ 63 - 26
controllers/data_manage/smm_api.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"encoding/json"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/utils"
@@ -13,7 +14,7 @@ import (
 // @Title 有色api数据指标列表
 // @Description 有色api数据指标列表
 // @Success 200 {object} data_manage.SmmClassify
-// @router /smm/api/list [get]
+// @router /smm/api/list [post]
 func (this *EdbInfoController) SmmApiList() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
@@ -27,15 +28,27 @@ func (this *EdbInfoController) SmmApiList() {
 		br.Ret = 408
 		return
 	}
-	types := this.GetString("Types")
-	frequency := this.GetString("Frequency")
-	dataState := this.GetString("DataState")
-	keyword := this.GetString("Keyword")
-	indexCodes := this.GetString("IndexCodes")
-	sortType := this.GetString("SortType", "desc")
-	sortParam := this.GetString("SortParam")
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
+	var req data_manage.SmmIndexListReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	types := req.Types
+	frequency := req.Frequency
+	dataState := req.DataState
+	keyword := req.Keyword
+	indexCodes := req.IndexCodes
+	sortType := req.SortType
+	sortParam := req.SortParam
+	pageSize := req.PageSize
+	currentIndex := req.CurrentIndex
+
+	if sortType == "" {
+		sortType = "desc"
+	}
 
 	var startSize int
 	if pageSize <= 0 {
@@ -49,34 +62,58 @@ func (this *EdbInfoController) SmmApiList() {
 	var condition string
 	var pars []interface{}
 
-	if types != "" {
-		typeArr := strings.Split(types,",")
-		for i, v := range typeArr {
-			typeStr := "type_"
-			typeStr += fmt.Sprintf("%d", i+1)
-			condition += " AND "+typeStr+" =? "
-			pars = append(pars, v)
+	if len(types) > 0 {
+		condition += " AND ( "
+		for _, v := range types {
+			typeArr := strings.Split(v,",")
+			for i, v := range typeArr {
+				if i == 0 {
+					condition += " ( "
+				}
+				typeStr := "type_"
+				typeStr += fmt.Sprintf("%d", i+1)
+				condition += typeStr+" =? "
+				pars = append(pars, v)
+				if i == len(typeArr) - 1 {
+					condition += " ) "
+				} else {
+					condition += " AND "
+				}
+			}
+			condition += " OR "
 		}
+		condition = strings.Trim(condition, "OR ")
+		condition += " ) "
 	}
 
 	if frequency != "" {
-		condition += " AND frequency = ? "
-		pars = append(pars, frequency)
+		frequencyArr := strings.Split(frequency,",")
+		condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+		pars = append(pars, frequencyArr)
 	}
 
 	if dataState != "" {
-		if dataState == "normal" {
-			condition += " AND (data_state = 'normal' OR data_state = '') "
-			pars = append(pars)
+		stateArr := strings.Split(dataState,",")
+		if strings.Contains(dataState, "normal") {
+			stateArr = append(stateArr, "")
+			condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+			pars = append(pars, stateArr)
 		} else {
-			condition += " AND data_state = ? "
-			pars = append(pars, dataState)
+			condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+			pars = append(pars, stateArr)
 		}
 	}
 
 	if keyword != "" {
-		condition += " AND (index_name LIKE ? OR index_code LIKE ?) "
-		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		keyWordArr := strings.Split(keyword, " ")
+		if len(keyWordArr) > 0 {
+			condition += " AND ( "
+			for _, v := range keyWordArr {
+				condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+			}
+			condition = strings.TrimRight(condition, "OR")
+			condition += " ) "
+		}
 	}
 
 	if indexCodes != "" {

+ 26 - 4
models/data_manage/base_from_smm.go

@@ -394,7 +394,6 @@ type BaseFromSmmIndexTypeList struct {
 	Type3 string `orm:"column(type_3)"`
 }
 
-
 // GetBaseFromSmmIndexTypeList
 func GetBaseFromSmmIndexTypeList() (list []BaseFromSmmIndexTypeList, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -404,7 +403,7 @@ func GetBaseFromSmmIndexTypeList() (list []BaseFromSmmIndexTypeList, err error)
 }
 
 type TypeListRespItem struct {
-	Type string
+	Type  string
 	Child []TypeListRespItem
 }
 
@@ -422,6 +421,29 @@ func GetSmmIndexDataListNoPage(condition string, pars []interface{}) (items []*B
 func GetBaseFromSmmIndexByIndexCodes(indexCodes string) (list []*BaseFromSmmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM base_from_smm_index WHERE index_code IN (` + indexCodes + `)`
-	_,err = o.Raw(sql).QueryRows(&list)
+	_, err = o.Raw(sql).QueryRows(&list)
 	return
-}
+}
+
+// SmmIndexListReq
+type SmmIndexListReq struct {
+	Types        []string `description:"分类"`
+	Frequency    string   `description:"频度"`
+	DataState    string   `description:"数据状态"`
+	Keyword      string   `description:"关键字"`
+	IndexCodes   string   `description:"指标代码"`
+	SortType     string   `description:"排序类型"`
+	SortParam    string   `description:"排序参数"`
+	PageSize     int
+	CurrentIndex int
+}
+
+// SmmIndexExistCheckReq
+type SmmIndexExistCheckReq struct {
+	Types      []string `description:"分类"`
+	Frequency  string   `description:"频度"`
+	DataState  string   `description:"数据状态"`
+	EdbCode    string   `description:"指标代码"`
+	SelectAll  bool     `description:"是否全选"`
+	Keyword    string   `description:"关键字"`
+}

+ 1 - 1
models/data_manage/chart_edb_mapping.go

@@ -186,7 +186,7 @@ func GetChartEdbMappingListV2(chartInfoId int) (list []*ChartEdbInfoMapping, err
 // GetChartEdbMappingByEdbInfoId 根据指标id获取edb_mapping
 func GetChartEdbMappingByEdbInfoId(edbInfoId int) (item *ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,classify_id,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value
+	sql := ` SELECT edb_info_id,source_name,classify_id,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,edb_type,max_value,min_value
              FROM edb_info
 			 WHERE edb_info_id = ? limit 1`
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)

+ 2 - 0
models/data_manage/edb_data_base.go

@@ -291,6 +291,8 @@ func GetEdbDataTableNameAndSubSource(source, subSource int) (tableName string) {
 		} else {
 			tableName = "edb_data_ths_ds"
 		}
+	case utils.DATA_SOURCE_YS:
+		tableName = "edb_data_ys"
 	default:
 		edbSource := EdbSourceIdMap[source]
 		if edbSource != nil {

+ 29 - 3
models/data_manage/edb_data_insert_config.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"time"
 )
 
@@ -40,7 +41,7 @@ func GetEdbDataInsertConfigByEdbIdList(edbInfoIdList []int) (items []*EdbDataIns
 }
 
 // CreateEdbDataInsertConfigAndData 创建数据插入配置规则,及插入数据
-func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value float64) (err error, errMsg string, isSendEmail bool) {
+func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value string) (err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
@@ -52,7 +53,18 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 	dateStr := date.Format(utils.FormatDate)
 	timestamp := date.UnixNano() / 1e6
 	timeStr := fmt.Sprintf("%d", timestamp)
-	saveValue := utils.SubFloatToString(value, 30)
+
+	var saveValue string
+	if value != "" {
+		floatValue, e := strconv.ParseFloat(value, 64)
+		if e != nil {
+			err = e
+			fmt.Println("转换失败:", e.Error())
+			return
+		}
+		saveValue = utils.SubFloatToString(floatValue, 30)
+	}
+
 
 	to, err := orm.NewOrmUsingDB("data").Begin()
 	if err != nil {
@@ -120,6 +132,7 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 		}
 	}
 
+	var offsetDate string
 	// 更改数据
 	{
 		var edbDateData *EdbDataList
@@ -138,6 +151,20 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 			addSql := ` INSERT INTO %s (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) VALUES ( %d, "%s", "%s", "%s", now(), now(), %s) `
 			addSql = fmt.Sprintf(addSql, tableName, edbInfo.EdbInfoId, edbInfo.EdbCode, dateStr, saveValue, timeStr)
 			_, err = to.Raw(addSql).Exec()
+		} else if value == "" {
+			// 传空值时删除
+			sql := `SELECT data_time FROM %s WHERE edb_info_id=? ORDER BY data_time DESC LIMIT 1 OFFSET 1`
+			sql = fmt.Sprintf(sql, tableName)
+			err = to.Raw(sql, edbInfo.EdbInfoId).QueryRow(&offsetDate)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return
+			}
+
+			dateStr = offsetDate
+
+			deleteSql := `DELETE FROM %s WHERE edb_data_id = %d;`
+			deleteSql = fmt.Sprintf(deleteSql, tableName, edbDateData.EdbDataId)
+			_, err = to.Raw(deleteSql).Exec()
 		} else {
 			updateSql := `UPDATE %s SET data_time = "%s", value = "%s", modify_time= now(), data_timestamp= %s WHERE edb_data_id = %d;`
 			updateSql = fmt.Sprintf(updateSql, tableName, dateStr, saveValue, timeStr, edbDateData.EdbDataId)
@@ -148,7 +175,6 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 		}
 	}
 
-	// 更改指标的数据结束日期
 	edbInfo.EndDate = dateStr
 	_, err = to.Update(edbInfo, "EndDate")
 

+ 1 - 1
models/data_manage/edb_info.go

@@ -1589,7 +1589,7 @@ type EdbInfoDataSeasonalResp struct {
 type SetEdbDataInsertConfigReq struct {
 	EdbInfoId int     `description:"指标ID"`
 	Date      string  `description:"日期"`
-	Value     float64 `description:"值"`
+	Value     string `description:"值"`
 }
 
 // GetEdbInfoByClassifyId 用于分类展示

+ 3 - 3
routers/commentsRouter.go

@@ -2990,7 +2990,7 @@ func init() {
         beego.ControllerComments{
             Method: "SmmExistCheck",
             Router: `/edb_info/smm/exist/check`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -2999,7 +2999,7 @@ func init() {
         beego.ControllerComments{
             Method: "EdbInfoSmmSearch",
             Router: `/edb_info/smm/search`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -3458,7 +3458,7 @@ func init() {
         beego.ControllerComments{
             Method: "SmmApiList",
             Router: `/smm/api/list`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})

+ 7 - 0
services/data/cross_variety/chart.go

@@ -352,6 +352,13 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*da
 		})
 	}
 
+	// 处理颜色
+	colorMap := utils.GetColorMap()
+	for k, _ := range dataList {
+		if c, ok1 := colorMap[k]; ok1 {
+			dataList[k].Color = c
+		}
+	}
 	dataResp = ChartInfoResp{
 		XName:       xTagInfo.ChartTagName + "百分位",
 		XNameEn:     xTagInfo.ChartTagNameEn,

+ 138 - 2
services/data/edb_info.go

@@ -2299,7 +2299,7 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 		utils.DATA_SOURCE_LT:                  "路透",
 		utils.DATA_SOURCE_COAL:                "中国煤炭网",
 		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
-		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联",
 		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
 		utils.DATA_SOURCE_COM_TRADE:           "UN",
 		utils.DATA_SOURCE_SCI:                 "SCI",
@@ -2968,7 +2968,7 @@ func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err
 		utils.DATA_SOURCE_LT:                  "路透",
 		utils.DATA_SOURCE_COAL:                "中国煤炭网",
 		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
-		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联",
 		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
 		utils.DATA_SOURCE_COM_TRADE:           "UN",
 		utils.DATA_SOURCE_SCI:                 "SCI",
@@ -3114,3 +3114,139 @@ func BatchRefreshEdbByEdbIds(edbIdList []int, redisKey string, refreshKeys []str
 	}
 	return
 }
+
+// EdbInfoSmmApiAdd 添加指标到指标库
+func EdbInfoSmmApiAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	//判断指标名称是否存在
+	var condition string
+	var pars []interface{}
+
+	condition += " AND edb_name=? "
+	pars = append(pars, item.EdbName)
+
+	count, err := data_manage.GetEdbInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断指标名称是否存在失败"
+		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "指标名称已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	source := item.Source
+
+	edbInfo = new(data_manage.EdbInfo)
+	edbInfo.Source = source
+	sourceNameMap := map[int]string{
+		utils.DATA_SOURCE_THS:                 "同花顺",
+		utils.DATA_SOURCE_WIND:                "wind",
+		utils.DATA_SOURCE_PB:                  "彭博",
+		utils.DATA_SOURCE_PB_FINANCE:          "彭博财务",
+		utils.DATA_SOURCE_MANUAL:              "手工数据",
+		utils.DATA_SOURCE_LZ:                  "隆众",
+		utils.DATA_SOURCE_YS:                  "SMM",
+		utils.DATA_SOURCE_GL:                  "钢联",
+		utils.DATA_SOURCE_ZZ:                  "郑商所",
+		utils.DATA_SOURCE_DL:                  "大商所",
+		utils.DATA_SOURCE_SH:                  "上期所",
+		utils.DATA_SOURCE_CFFEX:               "中金所",
+		utils.DATA_SOURCE_SHFE:                "上期能源",
+		utils.DATA_SOURCE_GIE:                 "欧洲天然气",
+		utils.DATA_SOURCE_LT:                  "路透",
+		utils.DATA_SOURCE_COAL:                "中国煤炭网",
+		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联",
+		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
+		utils.DATA_SOURCE_COM_TRADE:           "UN",
+		utils.DATA_SOURCE_SCI:                 "SCI",
+		utils.DATA_SOURCE_BAIINFO:             "BAIINFO",
+		utils.DATA_SOURCE_STOCK_PLANT:         "存量装置",
+		utils.DATA_SOURCE_NATIONAL_STATISTICS: "国家统计局",
+		utils.DATA_SOURCE_FUBAO:               "富宝数据",
+	}
+
+	sourceName, ok := sourceNameMap[source]
+	if !ok {
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			sourceName = edbSource.SourceName
+		}
+		if sourceName == "" {
+			errMsg = "指标来源异常"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+	edbInfo.SourceName = sourceName
+
+	edbType := 1 //基础指标
+	if source == utils.DATA_SOURCE_STOCK_PLANT {
+		edbType = 2 //计算指标
+	}
+	//从缓存中获取
+	serverUrl := ``
+	if edbInfo.Source == utils.DATA_SOURCE_WIND {
+		windCacheKey := utils.CACHE_WIND_URL + ":" + item.EdbCode
+		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
+		if serverUrl == `` {
+			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
+				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
+			}
+		}
+	}
+	//获取该层级下最大的排序数
+	maxSort, err := GetEdbClassifyMaxSort(item.ClassifyId, 0)
+	if err != nil {
+		errMsg = "获取失败"
+		err = errors.New("查询排序信息失败,Err:" + err.Error())
+		return
+	}
+
+	edbInfo.EdbCode = item.EdbCode
+	edbInfo.EdbName = item.EdbName
+	edbInfo.EdbNameSource = item.EdbName
+	edbInfo.Frequency = item.Frequency
+	edbInfo.Unit = item.Unit
+	edbInfo.ClassifyId = item.ClassifyId
+	edbInfo.SysUserId = item.SysUserId
+	edbInfo.SysUserRealName = item.SysUserRealName
+	edbInfo.CreateTime = time.Now()
+	edbInfo.ModifyTime = time.Now()
+	edbInfo.ServerUrl = serverUrl
+	edbInfo.Sort = maxSort + 1
+	edbInfo.DataDateType = `交易日`
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	edbInfo.EdbType = edbType
+	edbInfo.SubSource = item.SubSource
+	edbInfo.SubSourceName = ""
+	edbInfo.IndicatorCode = item.IndicatorCode
+	edbInfo.StockCode = item.StockCode
+	edbInfoId, err := data_manage.AddEdbInfo(edbInfo)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+	edbInfo.EdbInfoId = int(edbInfoId)
+	//保存数据
+	err = data_manage.ModifyEdbInfoWindWsdDataStatus(source, item.SubSource, edbInfoId, item.EdbCode)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("修改数据对应指标ID失败,Err:" + err.Error())
+		return
+	}
+	maxAndMinItem, _ := data_manage.GetEdbInfoWsdMaxAndMinInfo(source, item.SubSource, item.EdbCode)
+	if maxAndMinItem != nil {
+		err = data_manage.ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
+	}
+	//添加es
+	AddOrEditEdbInfoToEs(int(edbInfoId))
+	return
+}

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

@@ -147,8 +147,12 @@ func GetMixedTableCellData(mixedTableReq request.MixedTableReq) (newMixedTableCe
 		for i, cell := range row {
 			switch cell.DataType {
 			case request.EdbDT: // 指标类型
-				if edbInfo, ok := edbInfoMap[cell.EdbInfoId]; ok {
-					cell.ShowValue = edbInfo.EdbName
+				if cell.Value == `` {
+					if edbInfo, ok := edbInfoMap[cell.EdbInfoId]; ok {
+						cell.ShowValue = edbInfo.EdbName
+					}
+				} else {
+					cell.ShowValue = cell.Value
 				}
 			case request.InsertDataDT, request.PopInsertDataDT: // 数据类型
 				// 数值先清空

+ 29 - 7
services/data/predict_edb_info.go

@@ -1127,29 +1127,51 @@ func GetPredictCalculateDataListByPredictEdbInfo(edbInfo *data_manage.EdbInfo, s
 }
 
 // ModifyPredictEdbBaseInfoBySourceEdb  根据来源ETA指标修改预测指标的基础信息
-func ModifyPredictEdbBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo) {
+func ModifyPredictEdbBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo, frequency, unit string) {
 	list, err := data_manage.GetGroupPredictEdbBySourceEdbInfoId(sourceEDdbInfo.EdbInfoId)
 	if err != nil {
 		return
 	}
 	for _, v := range list {
-		v.Frequency = sourceEDdbInfo.Frequency
-		v.Unit = sourceEDdbInfo.Unit
+		v.Frequency = frequency
+		v.Unit = unit
 		v.Update([]string{"Frequency", "Unit"})
 		AddOrEditEdbInfoToEs(v.EdbInfoId)
 	}
 }
 
 // ModifyPredictEdbEnBaseInfoBySourceEdb  根据来源ETA指标修改预测指标的英文基础信息
-func ModifyPredictEdbEnBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo) {
+func ModifyPredictEdbEnBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo, unitEn string) {
 	list, err := data_manage.GetGroupPredictEdbBySourceEdbInfoId(sourceEDdbInfo.EdbInfoId)
 	if err != nil {
 		return
 	}
 	for _, v := range list {
-		v.Frequency = sourceEDdbInfo.Frequency
-		v.UnitEn = sourceEDdbInfo.UnitEn
-		v.Update([]string{"Frequency", "UnitEn"})
+		v.UnitEn = unitEn
+		v.Update([]string{"UnitEn"})
 		AddOrEditEdbInfoToEs(v.EdbInfoId)
 	}
 }
+
+// ModifyPredictEdbUnitBySourceEdbInfoId
+// @Description: 根据来源ETA指标修改预测指标的频度和单位基础信息
+// @author: Roc
+// @datetime 2024-01-05 11:07:39
+// @param sourceEdbInfoId int
+// @param frequency string
+// @param unit string
+// @return err error
+func ModifyPredictEdbUnitBySourceEdbInfoId(sourceEdbInfoId int, frequency, unit string) (err error) {
+	list, err := data_manage.GetGroupPredictEdbBySourceEdbInfoId(sourceEdbInfoId)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		v.Frequency = frequency
+		v.Unit = unit
+		v.Update([]string{"Frequency", "Unit"})
+		AddOrEditEdbInfoToEs(v.EdbInfoId)
+	}
+	return
+}

+ 4 - 3
services/english_report.go

@@ -787,7 +787,8 @@ func MultiEnglishPolicyReportSync() (err error, errMsg string) {
 	//查询发布时间是当天的所有未同步的报告,并更新到英文研报
 	condition := ""
 	var pars []interface{}
-	startDate := time.Now().Format(utils.FormatDate)
+	//startDate := time.Now().Format(utils.FormatDate)
+	startDate := time.Now().AddDate(0, -1, 0).Format(utils.FormatDate)
 	condition += ` AND publish_time >= ? AND state = 1 AND (content !="" AND content is not null)`
 	pars = append(pars, startDate)
 	policyReports, err := models.GetEnglishPolicyReportByCondition(condition, pars)
@@ -799,8 +800,8 @@ func MultiEnglishPolicyReportSync() (err error, errMsg string) {
 		return
 	}
 	//新增英文研报
-	classifyNameFirst := "Macro"
-	classifySecondName := "China A-share Daily Check-in"
+	classifyNameFirst := "Equity"
+	classifySecondName := "A-share Daily"
 
 	// 根据分类名称查询分类ID
 	classifyInfo, err := models.GetEnglishClassifyByClassifyNameAndParentName(classifyNameFirst, classifySecondName)

+ 15 - 1
utils/common.go

@@ -2255,4 +2255,18 @@ func ArrContainsStr(arr []string, str string) bool {
 		}
 	}
 	return false
-}
+}
+
+func GetColorMap() map[int]string {
+	colorMap := make(map[int]string)
+	colors := []string{"#0000FF", "#FF0000", "#999999", "#000000", "#7CB5EC", "#90ED7D", "#F7A35C", "#8085E9",
+		"#F15C80", "#E4D354", "#2B908F", "#F45B5B", "#91E8E1", "#FDA8C7", "#8A4294",
+		"#578B5A", "#0033FF", "#849EC1", "#FFDF0C", "#005496", "#00F0FF", "#4D535B",
+		"#4F4C34", "#804141", "#86BABD", "#8AA3FF", "#960000", "#A173DB", "#A39340",
+		"#CE814A", "#D1D2E6", "#EAB7B7", "#FF2E7A", "#FF4AF8", "#FF785B", "#FF9696", "#FFA800", "#FFBC97", "#FFDFDF"}
+	for k, v := range colors {
+		colorMap[k] = v
+	}
+
+	return colorMap
+}