Browse Source

Merge branch 'ETA_1.4.5'

zwxi 1 year ago
parent
commit
e91ae6ee10

+ 538 - 0
controllers/data_manage/edb_info.go

@@ -5362,3 +5362,541 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 	br.Data = resp
 	br.IsAddLog = true
 }
+
+// SmmExistCheck
+// @Title 新增指标-检验指标是否存在接口-smm
+// @Description 新增指标-检验指标是否存在接口-smm
+// @Param   SubSource   query   int  true       "子数据来源:0:经济数据库,1:日期序列"
+// @Param   EdbCode   query   string  false       "指标编码/指标代码"
+// @Param   StockCode   query   string  false       "证券代码"
+// @Success 200 {object} data_manage.EdbInfoExistCheckResp
+// @router /edb_info/smm/exist/check [get]
+func (this *EdbInfoController) SmmExistCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	selectAll, err := this.GetBool("SelectAll", false)
+	if err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	types := this.GetString("Types")
+	frequency := this.GetString("Frequency")
+	dataState := this.GetString("DataState")
+	edbCode := this.GetString("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, ",")
+				for i, v := range typeArr {
+					typeStr := "type_"
+					typeStr += fmt.Sprintf("%d", i+1)
+					condition += " AND " + typeStr + " =? "
+					pars = append(pars, v)
+				}
+			}
+
+			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)
+			}
+
+			indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
+			if err != nil {
+				br.Msg = "获取指标列表失败"
+				br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range indexList {
+				codeArr = append(codeArr, v.IndexCode)
+			}
+
+			noUseCodeArr := strings.Split(edbCode, ",")
+
+			for _, code := range codeArr {
+				// 检查code是否在noUseCodeArr数组中
+				if !utils.ArrContainsStr(noUseCodeArr, code) {
+					// 如果不在,将其添加到结果数组中
+					edbCodeArr = append(edbCodeArr, code)
+				}
+			}
+		} else {
+			// 有勾选,不查询
+			codeArr = strings.Split(selectCode, ",")
+
+			noUseCodeArr := strings.Split(edbCode, ",")
+
+			for _, code := range codeArr {
+				// 检查code是否在noUseCodeArr数组中
+				if !utils.ArrContainsStr(noUseCodeArr, code) {
+					// 如果不在,将其添加到结果数组中
+					edbCodeArr = append(edbCodeArr, code)
+				}
+			}
+		}
+	} else {
+		//未勾选全选EdbCode就是需要的code
+		edbCodeArr = strings.Split(edbCode, ",")
+	}
+
+	if len(edbCodeArr) > 30 {
+		br.Msg = "最多只能选择30个指标"
+		return
+	}
+
+	if len(edbCodeArr) <= 0 {
+		br.Msg = "无符合指标或指标代码错误"
+		return
+	}
+
+	indexList, err := data_manage.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_YS, edbCodeArr)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "校验指标是否存在失败"
+		br.ErrMsg = "校验指标是否存在失败,Err:" + err.Error()
+		return
+	}
+	var existEdbCodeArr []string
+	var existClassifyId []int
+	var existIndexId []int
+
+	for _, indexItem := range indexList {
+		for _, ev := range edbCodeArr {
+			if strings.Contains(indexItem.EdbCode, ev) {
+				existEdbCodeArr = append(existEdbCodeArr, ev)
+				existClassifyId = append(existClassifyId, indexItem.ClassifyId)
+				existIndexId = append(existIndexId, indexItem.EdbInfoId)
+			}
+		}
+	}
+
+	resp := new(data_manage.EdbInfoSmmExistCheckResp)
+	if len(indexList) > 0 {
+		resp.IndexExist = true
+	}
+	if len(existEdbCodeArr) == len(edbCodeArr) {
+		resp.ExistAll = true
+	}
+	resp.ExistEdbCodeArr = existEdbCodeArr
+	resp.ExistClassifyId = existClassifyId
+	resp.ExistIndexId = existIndexId
+	resp.ExistEdbInfo = indexList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbInfoSearch
+// @Title 新增指标-查询指标信息接口-smm
+// @Description 新增指标-查询指标信息接口-smm
+// @Param   Source   query   int  true       "来源:1:同花顺,2:wind,3:彭博"
+// @Param   SubSource   query   int  true       "子数据来源:0:经济数据库,1:日期序列"
+// @Param   EdbCode   query   string  false       "指标编码/指标代码"
+// @Param   StockCode   query   string  false       "证券代码"
+// @Success 200 {object} data_manage.EdbInfoSearchResp
+// @router /edb_info/smm/search [get]
+func (this *EdbInfoController) EdbInfoSmmSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	selectAll, err := this.GetBool("SelectAll", false)
+	if err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	types := this.GetString("Types")
+	frequency := this.GetString("Frequency")
+	dataState := this.GetString("DataState")
+	edbCode := this.GetString("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, ",")
+				for i, v := range typeArr {
+					typeStr := "type_"
+					typeStr += fmt.Sprintf("%d", i+1)
+					condition += " AND " + typeStr + " =? "
+					pars = append(pars, v)
+				}
+			}
+
+			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)
+			}
+
+			indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
+			if err != nil {
+				br.Msg = "获取指标列表失败"
+				br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range indexList {
+				codeArr = append(codeArr, v.IndexCode)
+			}
+
+			noUseCodeArr := strings.Split(edbCode, ",")
+
+			for _, code := range codeArr {
+				// 检查code是否在noUseCodeArr数组中
+				if !utils.ArrContainsStr(noUseCodeArr, code) {
+					// 如果不在,将其添加到结果数组中
+					edbCodeArr = append(edbCodeArr, code)
+				}
+			}
+		} else {
+			// 有勾选,不查询
+			codeArr = strings.Split(selectCode, ",")
+
+			noUseCodeArr := strings.Split(edbCode, ",")
+
+			for _, code := range codeArr {
+				// 检查code是否在noUseCodeArr数组中
+				if !utils.ArrContainsStr(noUseCodeArr, code) {
+					// 如果不在,将其添加到结果数组中
+					edbCodeArr = append(edbCodeArr, code)
+				}
+			}
+		}
+	} else {
+		//未勾选全选EdbCode就是需要的code
+		edbCodeArr = strings.Split(edbCode, ",")
+	}
+
+	if len(edbCodeArr) > 30 {
+		br.Msg = "最多只能选择30个指标"
+		return
+	}
+
+	if len(edbCodeArr) <= 0 {
+		br.Msg = "无符合指标或指标代码错误"
+		return
+	}
+
+	edbCodeStr := ""
+	for i, _ := range edbCodeArr {
+		edbCodeStr += "'" + edbCodeArr[i] + "'" + ","
+	}
+	edbCodeStr = strings.Trim(edbCodeStr, ",")
+	smmInfoList, err := data_manage.GetBaseFromSmmIndexByIndexCodes(edbCodeStr)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取有色指标详情失败,Err:" + err.Error()
+		return
+	}
+
+	smmInfoMap := make(map[string]*data_manage.BaseFromSmmIndex)
+	for _, v := range smmInfoList {
+		smmInfoMap[v.IndexCode] = v
+	}
+
+	searchItemList := make([]*data_manage.EdbInfoSearch, 0)
+
+	resp := new(data_manage.EdbInfoSearchResp)
+	needAddCodeArr := make([]string, 0)
+	noNeedAddCodeMap := make(map[string]string, 0)
+
+	for _, edbCode := range edbCodeArr {
+		dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, utils.DATA_SUB_SOURCE_EDB, utils.EDB_DATA_LIMIT)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取Ys已存在信息失败,Err:" + err.Error()
+			return
+		}
+
+		fmt.Println("dataItems:", len(dataItems))
+		if len(dataItems) > 0 {
+			searchItem := new(data_manage.EdbInfoSearch)
+			searchItem.EdbCode = edbCode
+			minDate, maxDate, err := data_manage.GetEdbDataYsMaxAndMinDate(edbCode)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取YS日期信息失败,Err:" + err.Error()
+				return
+			}
+			searchItem.DataList = dataItems
+			searchItem.StartDate = minDate
+			searchItem.EndDate = maxDate
+			searchItem.Frequency = smmInfoMap[edbCode].Frequency
+			searchItem.Unit = smmInfoMap[edbCode].Unit
+			searchItem.EdbName = smmInfoMap[edbCode].IndexName
+			searchItem.EdbCode = smmInfoMap[edbCode].IndexCode
+
+			searchItemList = append(searchItemList, searchItem)
+
+			noNeedAddCodeMap[edbCode] = edbCode
+		} else {
+			// 把需要新加的code添加到needAddCodeArr数组中,一起批量请求
+			needAddCodeArr = append(needAddCodeArr, edbCode)
+		}
+	}
+	if len(needAddCodeArr) > 0 {
+		edbCode = strings.Join(needAddCodeArr, ",")
+		respItem, err := data.AddEdbData(utils.DATA_SOURCE_YS, edbCode)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if respItem.Ret != 200 {
+			if respItem.Ret == 421 {
+				br.Msg = "该渠道已超过添加上限"
+			} else if respItem.Ret == 4052 {
+				br.Msg = "该指标已下架"
+			} else {
+				br.Msg = "未搜索到该指标"
+			}
+			br.ErrMsg = respItem.ErrMsg + ";EdbCode:" + edbCode
+			return
+		}
+	}
+
+	for _, smmInfo := range smmInfoList {
+		if smmInfo != nil {
+			if _, ok := noNeedAddCodeMap[smmInfo.IndexCode]; !ok {
+				searchItem := new(data_manage.EdbInfoSearch)
+				minDate, maxDate, err := data_manage.GetEdbDataYsMaxAndMinDate(smmInfo.IndexCode)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取YS日期信息失败,Err:" + err.Error()
+					return
+				}
+				searchItem.StartDate = minDate
+				searchItem.EndDate = maxDate
+				searchItem.Frequency = smmInfo.Frequency
+				searchItem.Unit = smmInfo.Unit
+				searchItem.EdbName = smmInfo.IndexName
+				searchItem.EdbCode = smmInfo.IndexCode
+				dataList, err := data_manage.GetEdbDataAllByEdbCode(smmInfo.IndexCode, utils.DATA_SOURCE_YS, utils.DATA_SUB_SOURCE_EDB, utils.EDB_DATA_LIMIT)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取数据失败,GetEdbDataAllByEdbCode Err:" + err.Error()
+					return
+				}
+				searchItem.DataList = dataList
+
+				searchItemList = append(searchItemList, searchItem)
+			}
+		}
+	}
+
+	resp.Status = 2
+	resp.StockSearchList = searchItemList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// SmmEdbInfoBatchAdd
+// @Title 指标批量保存接口-smm
+// @Description 指标批量保存接口-smm
+// @Param	request	body data_manage.BatchAddEdbInfoReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_info/smm/batch/add [post]
+func (this *EdbInfoController) SmmEdbInfoBatchAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	deleteCache := true
+	cacheKey := "CACHE_EDB_INFO_BATCH_ADD_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	var req data_manage.BatchAddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	resp := new(data_manage.AddEdbInfoResp)
+
+	var edbNames string
+	for _, v := range req.BatchList {
+		edbNames += "'" + v.EdbName + "',"
+	}
+	edbNames = strings.Trim(edbNames, ",")
+	infoList, err := data_manage.GetEdbInfoByNames(edbNames)
+	if err != nil {
+		br.Msg = "查询指标名称重复错误!"
+		br.ErrMsg = "GetEdbInfoByNames,Err:" + err.Error()
+		return
+	}
+	if len(infoList) > 0 {
+		for _, v := range infoList {
+			resp.ExistEdbName = append(resp.ExistEdbName, v.EdbName)
+		}
+		br.Data = resp
+		br.Msg = "指标名称重复!"
+		br.ErrMsg = "指标名称重复"
+		return
+	}
+
+	for k, v := range req.BatchList {
+		v.EdbName = strings.Trim(v.EdbName, " ")
+		v.EdbCode = strings.Trim(v.EdbCode, " ")
+
+		if v.Source <= 0 {
+			br.Msg = "无效的数据来源"
+			return
+		}
+
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不能为空"
+			return
+		}
+
+		if v.EdbName == "" {
+			br.Msg = "指标名称不能为空"
+			return
+		}
+
+		if v.Frequency == "" {
+			br.Msg = "频率不能为空"
+			return
+		}
+
+		if v.ClassifyId <= 0 {
+			br.Msg = "请选择分类"
+			return
+		}
+
+		edbInfoItem := new(data_manage.EdbInfo)
+		edbInfoItem.Source = v.Source
+		edbInfoItem.SourceName = "SMM"
+		edbInfoItem.EdbCode = v.EdbCode
+		edbInfoItem.SubSource = 0
+		edbInfoItem.SubSourceName = ""
+		edbInfoItem.EdbName = v.EdbName
+		edbInfoItem.Frequency = v.Frequency
+		edbInfoItem.Unit = v.Unit
+		edbInfoItem.ClassifyId = v.ClassifyId
+		edbInfoItem.SysUserId = sysUser.AdminId
+		edbInfoItem.SysUserRealName = sysUser.RealName
+		edbInfoItem.IndicatorCode = ""
+		edbInfoItem.StockCode = ""
+
+		// 指标入库
+		edbInfo, err, errMsg, isSendEmail := data.EdbInfoWsdAdd(edbInfoItem)
+		if err != nil {
+			br.Msg = "保存失败"
+			if errMsg != `` {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = err.Error()
+			br.IsSendEmail = isSendEmail
+			return
+		}
+		//新增操作日志
+		{
+			edbLog := new(data_manage.EdbInfoLog)
+			edbLog.EdbInfoId = edbInfo.EdbInfoId
+			edbLog.SourceName = edbInfo.SourceName
+			edbLog.Source = edbInfo.Source
+			edbLog.EdbCode = edbInfo.EdbCode
+			edbLog.EdbName = edbInfo.EdbName
+			edbLog.ClassifyId = edbInfo.ClassifyId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(this.Ctx.Input.RequestBody)
+			edbLog.Status = "新增指标"
+			edbLog.Method = this.Ctx.Input.URI()
+			go data_manage.AddEdbInfoLog(edbLog)
+		}
+
+		if k <= 0 {
+			resp.EdbInfoId = edbInfo.EdbInfoId
+			resp.UniqueCode = edbInfo.UniqueCode
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 197 - 0
controllers/data_manage/smm_api.go

@@ -0,0 +1,197 @@
+package data_manage
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+)
+
+// SmmIndexList
+// @Title 有色api数据指标列表
+// @Description 有色api数据指标列表
+// @Success 200 {object} data_manage.SmmClassify
+// @router /smm/api/list [get]
+func (this *EdbInfoController) SmmApiList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	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 startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	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 frequency != "" {
+		condition += " AND frequency = ? "
+		pars = append(pars, frequency)
+	}
+
+	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 keyword != "" {
+		condition += " AND (index_name LIKE ? OR index_code LIKE ?) "
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+	}
+
+	if indexCodes != "" {
+		indexCodeArr := strings.Split(indexCodes,",")
+		indexCodeStr := ""
+		for _, v := range indexCodeArr {
+			indexCodeStr += "'" + v + "',"
+		}
+		indexCodeStr = strings.TrimRight(indexCodeStr, ",")
+		condition += " AND index_code IN (" + indexCodeStr + ") "
+	}
+
+	sortStr := ``
+	if sortParam != `` {
+		sortStr = fmt.Sprintf("%s %s,modify_time desc ", utils.PascalToSnake(sortParam), sortType)
+	} else {
+		sortStr = " modify_time desc "
+	}
+
+	total, err := data_manage.GetSmmIndexDataListCount(condition, pars)
+	if err!= nil {
+		br.Msg = "获取指标总数失败"
+		br.ErrMsg = "获取指标总数失败,Err:" + err.Error()
+		return
+	}
+
+	indexList, err := data_manage.GetSmmIndexDataList(condition, sortStr, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取指标列表失败"
+		br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range indexList {
+		v.TypeAll = v.Type1 + "/" + v.Type2 + "/" + v.Type3
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	var ret data_manage.BaseFromSmmIndexListResp
+	ret.List = indexList
+	ret.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = ret
+}
+
+// SmmApiTypeList
+// @Title 有色api数据分类列表
+// @Description 有色api数据分类列表
+// @Success 200 {object} data_manage.SmmClassify
+// @router /smm/api/type/list [get]
+func (this *EdbInfoController) SmmApiTypeList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	typeList, err := data_manage.GetBaseFromSmmIndexTypeList()
+	if err != nil {
+		br.Msg = "获取指标列表失败"
+		br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+		return
+	}
+
+	resp := make([]data_manage.TypeListRespItem, 0)
+
+	typeMap := make(map[string]map[string][]string)
+	//type2Map := make(map[string][]string)
+
+	//type2Map := make(map[string]data_manage.TypeListRespItem)
+
+	// 初始化
+	for _, v := range typeList {
+		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 {
+					typeMap[v.Type1][v.Type2] = make([]string, 0)
+				}
+			}
+		}
+	}
+
+	for _, v := range typeList {
+		if v.Type1 != ""{
+			typeMap[v.Type1][v.Type2] = append(typeMap[v.Type1][v.Type2], v.Type3)
+		}
+	}
+
+	for type1, type2Map := range typeMap {
+		var item data_manage.TypeListRespItem
+		item.Type = type1
+		for type2, type3List := range type2Map {
+			var child data_manage.TypeListRespItem
+			child.Type = type2
+			for _, type3 := range type3List {
+				child.Child = append(child.Child, data_manage.TypeListRespItem{type3,nil})
+			}
+			item.Child = append(item.Child, child)
+		}
+		resp = append(resp, item)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 98 - 0
models/data_manage/base_from_smm.go

@@ -4,6 +4,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
@@ -72,6 +73,10 @@ type BaseFromSmmIndex struct {
 	Sort               int
 	CreateTime         time.Time
 	ModifyTime         time.Time
+	DataState          string
+	ReleaseTime        string
+	StartDate          string
+	EndDate            string
 }
 
 func AddBaseFromSmmIndex(item *BaseFromSmmIndex) (lastId int64, err error) {
@@ -327,3 +332,96 @@ type SmmSingleDataResp struct {
 	ModifyTime         string
 	Data               []*SmmIndexData
 }
+
+func GetSmmIndexDataList(condition, sortStr string, pars []interface{}, startSize, pageSize int) (items []*BaseFromSmmIndexItem, err error) {
+	sql := `select * FROM base_from_smm_index
+               WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY ` + sortStr
+	sql += `  limit ?,? `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetSmmIndexDataListCount(condition string, pars []interface{}) (total int, err error) {
+	sql := `select count(1) FROM base_from_smm_index
+               WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	o := orm.NewOrmUsingDB("data")
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+type BaseFromSmmIndexListResp struct {
+	List   []*BaseFromSmmIndexItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type BaseFromSmmIndexItem struct {
+	BaseFromSmmIndexId int `orm:"column(base_from_smm_index_id);pk"`
+	ClassifyId         int
+	Interface          string
+	Name               string
+	IndexCode          string
+	IndexName          string
+	Type1              string `orm:"column(type_1)"`
+	Type2              string `orm:"column(type_2)"`
+	Type3              string `orm:"column(type_3)"`
+	Frequency          string
+	Unit               string
+	ApiStartTime       string
+	ApiUpdateTime      string
+	StartTime          string
+	FinishTime         string
+	Sort               int
+	CreateTime         string
+	ModifyTime         string
+	DataState          string
+	ReleaseTime        string
+	StartDate          string
+	EndDate            string
+	TypeAll            string
+}
+
+type BaseFromSmmIndexTypeList struct {
+	Type1 string `orm:"column(type_1)"`
+	Type2 string `orm:"column(type_2)"`
+	Type3 string `orm:"column(type_3)"`
+}
+
+
+// GetBaseFromSmmIndexTypeList
+func GetBaseFromSmmIndexTypeList() (list []BaseFromSmmIndexTypeList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT type_1,type_2, type_3 from base_from_smm_index GROUP BY type_1,type_2,type_3 `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type TypeListRespItem struct {
+	Type string
+	Child []TypeListRespItem
+}
+
+func GetSmmIndexDataListNoPage(condition string, pars []interface{}) (items []*BaseFromSmmIndexItem, err error) {
+	sql := `select * FROM base_from_smm_index
+               WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+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)
+	return
+}

+ 14 - 0
models/data_manage/edb_data_base.go

@@ -299,3 +299,17 @@ func GetEdbDataTableNameAndSubSource(source, subSource int) (tableName string) {
 	}
 	return
 }
+
+func GetEdbDataAllByEdbCodes(edbCodes []string, limit int) (items []*EdbInfoSearchData, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCodes)
+	o := orm.NewOrmUsingDB("data")
+
+	sql := ` SELECT * FROM edb_data_ys WHERE edb_code IN (`+ utils.GetOrmInReplace(len(edbCodes)) +`) ORDER BY data_time DESC`
+	if limit > 0 {
+		sql += `  LIMIT ?  `
+		pars = append(pars, limit)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 22 - 0
models/data_manage/edb_info.go

@@ -1713,3 +1713,25 @@ func GetEdbInfoByNames(edbNames string) (items []*EdbInfoList, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+func GetSmmEdbInfoMaxAndMinInfo(edbCodes []string) (item *EdbInfoMaxAndMinInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ``
+
+	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM edb_data_ys WHERE edb_code IN (` + utils.GetOrmInReplace(len(edbCodes)) + `)`
+	err = o.Raw(sql, edbCodes).QueryRow(&item)
+	if err != nil {
+		return
+	}
+
+	var latest_value float64
+	sql = ` SELECT value AS latest_value FROM edb_data_ys WHERE edb_code IN (` + utils.GetOrmInReplace(len(edbCodes)) + `) ORDER BY data_time DESC LIMIT 1 `
+	err = o.Raw(sql, edbCodes).QueryRow(&latest_value)
+	item.LatestValue = latest_value
+	return
+}
+
+type EdbInfoSmmExistCheckResp struct {
+	EdbInfoExistCheckResp
+	ExistAll bool `description:"是否全部重复"`
+}

+ 45 - 0
routers/commentsRouter.go

@@ -2896,6 +2896,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "SmmEdbInfoBatchAdd",
+            Router: `/edb_info/smm/batch/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "SmmExistCheck",
+            Router: `/edb_info/smm/exist/check`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoSmmSearch",
+            Router: `/edb_info/smm/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "TraceEdbInfo",
@@ -3346,6 +3373,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "SmmApiList",
+            Router: `/smm/api/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "SmmApiTypeList",
+            Router: `/smm/api/type/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "SmmClassify",

+ 26 - 0
utils/common.go

@@ -30,6 +30,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode"
 )
 
 // 随机数种子
@@ -2230,3 +2231,28 @@ func HmacSha256(key string, data string) []byte {
 	_, _ = mac.Write([]byte(data))
 	return mac.Sum(nil)
 }
+
+func PascalToSnake(s string) string {
+	var result []rune
+
+	for i, char := range s {
+		// 在大写字母前插入下划线,除非是第一个字母
+		if i > 0 && unicode.IsUpper(char) {
+			result = append(result, '_')
+		}
+		// 将字母转为小写
+		result = append(result, unicode.ToLower(char))
+	}
+
+	return string(result)
+}
+
+// ArrContainsStr函数检查一个字符串是否在字符串数组中
+func ArrContainsStr(arr []string, str string) bool {
+	for _, v := range arr {
+		if v == str {
+			return true
+		}
+	}
+	return false
+}