Browse Source

Merge branch 'master' into ETA_1.5.8

zwxi 1 year ago
parent
commit
a2793e92ee

+ 511 - 5
controllers/commodity_trade_base_index.go

@@ -1,12 +1,12 @@
 package controllers
 
 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/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
 	"strconv"
@@ -1204,7 +1204,7 @@ func (this *TradeCommonController) CoalMineClassify() {
 	var child data_manage.CoalChild
 
 	list, err := data_manage.GetCoalmineClassifyList()
-	if err!= nil {
+	if err != nil {
 		br.Msg = "获取煤炭分类数据失败"
 		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
 		return
@@ -1303,7 +1303,6 @@ func (this *TradeCommonController) CoalMineClassify() {
 			coalList = append(coalList, coal)
 		}
 
-
 		if v.Suffix == "inland_index" {
 			suffix = "inland_index"
 			groups = []*string{}
@@ -2549,3 +2548,510 @@ func (this *TradeCommonController) EicDataListV2() {
 	br.Msg = "获取成功"
 	br.Data = data
 }
+
+// CoalMineClassify
+// @title	获取煤炭江湖分类列表
+// @Description	获取煤炭江湖分类列表
+// @Success 200 {object} models.
+// @router /data/mtjh/classify [get]
+func (this *TradeCommonController) MtjhClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	list, err := data_manage.GetMtjhClassifyList()
+	if err != nil {
+		br.Msg = "获取煤炭分类数据失败"
+		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// CoalMineData
+// @title	获取煤炭江湖详细数据列表
+// @Description	获取煤炭江湖详细数据接口
+// @Param	ClassifyId query int true	"数据id"
+// @Param	GroupName query string true	"分组名"
+// @Param	Frequency query string true	"频度"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Success 200 {object} []data_manage.CoalmineDataResp
+// @router /data/mtjh/data [get]
+func (this *TradeCommonController) MtjhData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	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)
+
+	area := this.GetString("Area")
+	if area == "" {
+		br.Msg = "请选择分类"
+		br.ErrMsg = "请选择分类"
+		return
+	}
+
+	//获取指标
+	var condition string
+	var pars []interface{}
+
+	if area != "" {
+		condition += ` AND area=? `
+		pars = append(pars, area)
+	}
+
+	mtjhList, err := data_manage.GetMtjhMapping(condition, pars)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resultList := make([]*data_manage.BaseFromMtjhIndexList, 0)
+	for _, v := range mtjhList {
+		product := new(data_manage.BaseFromMtjhIndexList)
+		product.BaseFromMtjhMappingId = v.BaseFromMtjhMappingId
+		product.Unit = v.Unit
+		product.IndexCode = v.IndexCode
+		product.IndexName = v.IndexName
+		product.Port = v.Port
+		product.Area = v.Area
+		product.Variety = v.Variety
+		product.Frequency = v.Frequency
+		product.CreateTime = v.CreateTime
+
+		modifyTime, err := data_manage.GetMtjhIndexLatestDate(v.IndexCode)
+		if err != nil  && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取更新时间失败"
+			br.ErrMsg = "获取更新时间失败,Err:" + err.Error()
+			return
+		}
+		product.ModifyTime = modifyTime
+
+		total, err := data_manage.GetMtjhIndexDataCount(v.IndexCode)
+		if err != nil {
+			br.Msg = "获取总数失败"
+			br.ErrMsg = "获取总数失败,Err:" + err.Error()
+			return
+		}
+		page := paging.GetPaging(currentIndex, pageSize, total)
+		dataList, err := data_manage.GetMtjhIndexData(v.IndexCode, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		if dataList == nil {
+			dataList = make([]*data_manage.BaseFromMtjhIndexItem, 0)
+		}
+		product.DataList = dataList
+		product.Paging = page
+		resultList = append(resultList, product)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resultList
+	return
+}
+
+// CoalSearchList
+// @Title 煤炭江湖模糊搜索
+// @Description 煤炭江湖模糊搜索
+// @Param   Keyword   query   string  ture       "关键字搜索"
+// @Success 200 {object} models.BaseResponse
+// @router /data/mtjh/search [get]
+func (this *TradeCommonController) MtjhSearchList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	//关键字
+	keyword := this.GetString("Keyword")
+
+	list, err := data_manage.GetMtjhItemList(keyword)
+	if err != nil {
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		br.Msg = "获取失败"
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// CoalSingleData
+// @Title 获取煤炭江湖单条数据
+// @Description 获取煤炭江湖单条数据
+// @Param   IndexCode   query   string  true       "指标唯一编码"
+// @Success 200 {object} []data_manage.CoalmineSingalDataResp
+// @router  /data/mtjh/single_data [get]
+func (this *TradeCommonController) MtjhSingleData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	indexCode := this.GetString("IndexCode")
+	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)
+
+	mapping, err := data_manage.GetMtjhMappingItemByCode(indexCode)
+	if err != nil {
+		br.Msg = "获取煤炭数据失败"
+		br.ErrMsg = "获取煤炭度数据失败,Err:" + err.Error()
+		return
+	}
+	items, err := data_manage.GetMtjhIndexData(indexCode, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取煤炭数据失败"
+		br.ErrMsg = "获取煤炭度数据失败,Err:" + err.Error()
+		return
+	}
+
+	modifyTime, err := data_manage.GetMtjhIndexLatestDate(indexCode)
+	if err != nil {
+		br.Msg = "获取更新时间失败"
+		br.ErrMsg = "获取更新时间失败,Err:" + err.Error()
+		return
+	}
+
+	total, err := data_manage.GetMtjhIndexDataCount(indexCode)
+	if err != nil {
+		br.Msg = "获取总数失败"
+		br.ErrMsg = "获取总数失败,Err:" + err.Error()
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := data_manage.BaseFromMtjhIndexList{
+		BaseFromMtjhMappingId: mapping.BaseFromMtjhMappingId,
+		IndexName:             mapping.IndexName,
+		IndexCode:             mapping.IndexCode,
+		Area:                  mapping.Area,
+		Port:                  mapping.Port,
+		Unit:                  mapping.Unit,
+		Frequency:             mapping.Frequency,
+		CreateTime:            mapping.CreateTime,
+		ModifyTime:            modifyTime,
+		Variety:               mapping.Variety,
+		DataList:              items,
+		Paging:                page,
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+	return
+}
+
+// MtjhFrequency
+// @title	获取煤炭江湖频度
+// @Description	获取煤炭江湖频度
+// @Param	ClassifyId query int true	"数据id"
+// @Success 200 {object} models.
+// @router /data/mtjh/frequency [get]
+func (this *TradeCommonController) MtjhFrequency() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	area := this.GetString("Area")
+
+	list, err := data_manage.GetMtjhFrequencyByArea(area)
+	if err != nil {
+		br.Msg = "获取煤炭频度数据失败"
+		br.ErrMsg = "获取煤炭频度数据失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// ExportCoalList
+// @Title 导出煤炭江湖数据
+// @Description 导出煤炭江湖数据
+// @Param	ClassifyId query int true	"数据id"
+// @Param   IndexName   query   string  true       "名称关键词"
+// @Param   IndexCode   query   string  true       "指标唯一编码"
+// @Param   TypeName   query   string  true       "分类"
+// @Param   Frequency   query   string  false       "频度"
+// @Param   UnitName   query   string  false       "单位"
+// @Success 200  导出成功
+// @router /export/mtjh [get]
+func (this *TradeCommonController) ExportMtjhList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	area := this.GetString("Area")
+	indexCode := this.GetString("IndexCode") //指标唯一编码
+
+	secNameList := make([]*models.EdbdataExportList, 0)
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+
+	//不为空就是导出分类表
+	if indexCode == "" {
+		//获取指标
+		var secNameList []*string
+		var err error
+
+		secNameList, err = data_manage.GetClassifyMtjhByArea(area)
+		if err != nil {
+			fmt.Println("获取数据失败,Err:" + err.Error())
+			return
+		}
+
+		if len(secNameList) <= 0 {
+			fmt.Println("secNameList长度为0")
+			return
+		}
+		sheetNew, err := xlsxFile.AddSheet(area)
+
+		if err != nil {
+			fmt.Println("新增Sheet失败", err.Error())
+			return
+		}
+		//sheetNew.SetColWidth()
+		//获取指标数据
+		windRow := sheetNew.AddRow()
+		secNameRow := sheetNew.AddRow()
+		indexCodeRow := sheetNew.AddRow()
+		frequencyRow := sheetNew.AddRow()
+		unitRow := sheetNew.AddRow()
+		lastModifyDateRow := sheetNew.AddRow()
+		//获取分类下指标最大数据量
+		var dataMax int
+
+		dataMax, err = data_manage.GetCoalMtjhMaxCount(area)
+		if err != nil {
+			fmt.Println("获取指标最大数据量失败", err.Error())
+			return
+		}
+
+		setRowIndex := 6
+		for k, sv := range secNameList {
+			//获取数据
+			dataList, err := data_manage.GetBaseFromMtjhIndexByCode(*sv)
+			if err != nil {
+				br.Msg = "获取数据失败"
+				br.ErrMsg = "获取数据失败,Err:" + err.Error()
+				return
+			}
+			windRow.AddCell().SetValue(area)
+			secNameRow.AddCell().SetValue("指标名称")
+			indexCodeRow.AddCell().SetValue("指标ID")
+			frequencyRow.AddCell().SetValue("频率")
+			unitRow.AddCell().SetValue("单位")
+			lastModifyDateRow.AddCell().SetValue("更新时间")
+
+			secNameRow.AddCell().SetValue(dataList[0].IndexName)
+			indexCodeRow.AddCell().SetValue(dataList[0].IndexCode)
+			frequencyRow.AddCell().SetValue(dataList[0].Frequency)
+			unitRow.AddCell().SetValue(dataList[0].Unit)
+			lastModifyDateRow.AddCell().SetValue(dataList[0].ModifyTime)
+
+			windRow.AddCell()
+			windRow.AddCell()
+			secNameRow.AddCell()
+			indexCodeRow.AddCell()
+			frequencyRow.AddCell()
+			unitRow.AddCell()
+			lastModifyDateRow.AddCell()
+			min := k * 3
+			sheetNew.SetColWidth(min, min, 15)
+
+			if len(dataList) <= 0 {
+				for n := 0; n < dataMax; n++ {
+					rowIndex := setRowIndex + n
+					row := sheetNew.Row(rowIndex)
+					row.AddCell()
+					row.AddCell()
+					row.AddCell()
+				}
+			} else {
+				endRowIndex := 0
+				for rk, dv := range dataList {
+					rowIndex := setRowIndex + rk
+					row := sheetNew.Row(rowIndex)
+
+					displayDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
+					displayDateCell := row.AddCell()
+					style := new(xlsx.Style)
+					style.ApplyAlignment = true
+					style.Alignment.WrapText = true
+					displayDateCell.SetStyle(style)
+					displayDateCell.SetDate(displayDate)
+
+					row.AddCell().SetValue(dv.DealValue)
+					row.AddCell()
+					endRowIndex = rowIndex
+				}
+				if len(dataList) < dataMax {
+					dataLen := dataMax - len(dataList)
+					for n := 0; n < dataLen; n++ {
+						rowIndex := (endRowIndex + 1) + n
+						row := sheetNew.Row(rowIndex)
+						row.AddCell()
+						row.AddCell()
+						row.AddCell()
+					}
+				}
+			}
+		}
+	} else {
+		sheet, err := xlsxFile.AddSheet("指标")
+		if err != nil {
+			br.Msg = "新增Sheet失败"
+			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+			return
+		}
+		//获取数据
+		dataList, err := data_manage.GetBaseFromMtjhIndexByCode(indexCode)
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+
+		mapping, err := data_manage.GetMtjhMappingItemByCode(indexCode)
+		if err != nil {
+			br.Msg = "获取煤炭数据失败"
+			br.ErrMsg = "获取煤炭度数据失败,Err:" + err.Error()
+			return
+		}
+		//获取指标数据
+		windRow := sheet.AddRow()
+		windRow.AddCell().SetValue("煤炭江湖")
+		rowSecName := sheet.AddRow()
+		celSecName := rowSecName.AddCell()
+		celSecName.SetValue("指标名称")
+		cellSenName := rowSecName.AddCell()
+		cellSenName.SetValue(mapping.IndexName)
+		indexCodeRow := sheet.AddRow()
+		indexCodeRow.AddCell().SetValue("指标ID")
+		indexCodeRow.AddCell().SetValue(indexCode)
+
+		rowFrequency := sheet.AddRow()
+		celFrequency := rowFrequency.AddCell()
+		celFrequency.SetValue("频率")
+		rowFrequency.AddCell().SetValue(mapping.Frequency)
+
+		rowUnit := sheet.AddRow()
+		celUnit := rowUnit.AddCell()
+		celUnit.SetValue("单位")
+		cellUnit := rowUnit.AddCell()
+		cellUnit.SetValue(mapping.Unit)
+
+		rowModifyDate := sheet.AddRow()
+		rowModifyCell := rowModifyDate.AddCell()
+		rowModifyCell.SetValue("更新时间")
+		rowModifyCell = rowModifyDate.AddCell()
+		rowModifyCell.SetValue(dataList[len(dataList)-1].ModifyTime)
+
+		fmt.Println("len(dataList):", len(dataList))
+		dataMax, err := data_manage.GetMtjhCount(indexCode)
+		if err != nil {
+			fmt.Println("获取指标最大数据量失败", err.Error())
+			return
+		}
+		fmt.Println("dataMax:", dataMax)
+		if len(dataList) <= 0 {
+			for n := 0; n < dataMax; n++ {
+				rowIndex := 6 + n
+				row := sheet.Row(rowIndex)
+				row.AddCell()
+				row.AddCell()
+				row.AddCell()
+			}
+		} else {
+			endRowIndex := 0
+			for rk, dv := range dataList {
+				rowIndex := 6 + rk
+				row := sheet.Row(rowIndex)
+				displayDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
+				displayDateCell := row.AddCell()
+				style := new(xlsx.Style)
+				style.ApplyAlignment = true
+				style.Alignment.WrapText = true
+				displayDateCell.SetStyle(style)
+				displayDateCell.SetDate(displayDate)
+
+				row.AddCell().SetValue(dv.DealValue)
+				row.AddCell()
+				endRowIndex = rowIndex
+			}
+			if len(dataList) < dataMax {
+				dataLen := dataMax - len(dataList)
+				for n := 0; n < dataLen; n++ {
+					rowIndex := (endRowIndex + 1) + n
+					row := sheet.Row(rowIndex)
+					row.AddCell()
+					row.AddCell()
+					row.AddCell()
+				}
+			}
+		}
+	}
+
+	err := xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		br.Msg = "保存文件失败"
+		br.ErrMsg = "保存文件失败"
+		return
+	}
+	fileName := `煤炭江湖数据`
+	if len(secNameList) > 0 {
+		fileName = secNameList[0].ClassifyName
+	}
+	fileName += time.Now().Format(utils.FormatDateUnSpace) + `.xlsx` //文件名称
+	this.Ctx.Output.Download(downLoadnFilePath, fileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "success"
+
+}

+ 69 - 4
controllers/data_manage/edb_info.go

@@ -1670,6 +1670,53 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.Unit = indexInfo.Unit
 				searchItem.EdbName = indexInfo.IndexName
 			}
+		} else if source == utils.DATA_SOURCE_ICPI { //消费者指数
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取上期所已存在信息失败,Err:" + err.Error()
+				return
+			}
+
+			if len(dataItems) > 0 {
+				searchItem.EdbCode = edbCode
+				minDate, maxDate, err := data_manage.GetEdbDataIcpiMaxOrMinDate(edbCode)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取上期所日期信息失败,Err:" + err.Error()
+					return
+				}
+				searchItem.DataList = dataItems
+				searchItem.StartDate = minDate
+				searchItem.EndDate = maxDate
+			} else {
+				respItem, err := data.AddEdbData(source, edbCode)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取失败,Err:" + err.Error()
+					return
+				}
+				if respItem.Ret != 200 {
+					br.Msg = "未搜索到该指标"
+					br.ErrMsg = respItem.ErrMsg + ";EdbCode:" + edbCode
+					return
+				}
+				isAdd = true
+			}
+
+			//获取指标信息
+			indexInfo, err := data_manage.GetBaseInfoFromIcpiByIndexCode(edbCode)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取上期所指标详情失败,Err:" + err.Error()
+				return
+			}
+
+			if indexInfo != nil {
+				searchItem.Frequency = "日度"
+				searchItem.Unit = "%"
+				searchItem.EdbName = indexInfo.IndexName
+			}
 		} else {
 			// 代码中没有的来源那么从edb_source中找是否有对应的
 			sourceItem := data_manage.EdbSourceIdMap[source]
@@ -4276,7 +4323,7 @@ func (this *EdbInfoController) SetEdbDataInsertConfig() {
 // TraceEdbInfo
 // @Title 指标溯源接口
 // @Description 指标溯源接口
-// @Param   EdbInfoId   query   int  true       "指标id"
+// @Param   UniqueCode   query   int  true       "指标唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
 // @Success 200 {object} data_manage.ChartListResp
 // @router /edb_info/trace [get]
 func (this *EdbInfoController) TraceEdbInfo() {
@@ -4292,14 +4339,32 @@ func (this *EdbInfoController) TraceEdbInfo() {
 		br.Ret = 408
 		return
 	}
-	edbInfoId, _ := this.GetInt("EdbInfoId")
-	if edbInfoId <= 0 {
+	//edbInfoId, _ := this.GetInt("EdbInfoId")
+	//if edbInfoId <= 0 {
+	//	br.Msg = "参数错误"
+	//	br.ErrMsg = "参数错误"
+	//	return
+	//}
+
+	uniqueCode := this.GetString("UniqueCode")
+	if uniqueCode == `` {
 		br.Msg = "参数错误"
 		br.ErrMsg = "参数错误"
 		return
 	}
 
-	resp, err := data.TraceEdbInfoByEdbInfoId(edbInfoId)
+	//  根据UniqueCode获取指标信息
+	edbInfo, err := data_manage.GetEdbInfoByUniqueCode(uniqueCode)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.Msg = "获取失败,Err:" + err.Error()
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "指标不存在"
+		}
+		return
+	}
+
+	resp, err := data.TraceEdbInfoByEdbInfoId(edbInfo.EdbInfoId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.Msg = "获取失败,Err:" + err.Error()

+ 634 - 0
controllers/data_manage/edb_info_refresh.go

@@ -0,0 +1,634 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"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/data"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// RefreshSourceList
+// @Title 获取指标刷新配置的来源接口
+// @Description 获取指标刷新配置的来源接口
+// @Success Ret=200 获取成功
+// @router /edb_info/refresh/source_list [get]
+func (c *EdbInfoController) RefreshSourceList() {
+	br := new(models.BaseResponse).Init()
+
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	item := edb_refresh.EdbRefreshSource{}
+	tmpList, err := item.GetAllList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取刷新数据源失败, Err: " + err.Error()
+		return
+	}
+
+	list := make([]edb_refresh.EdbRefreshSourceList, 0)
+	tmpMap := make(map[int]edb_refresh.EdbRefreshSourceList, 0)
+
+	for _, v := range tmpList {
+		tmp, ok := tmpMap[v.Source]
+		if ok {
+			continue
+		}
+		tmp = edb_refresh.EdbRefreshSourceList{
+			Source:     v.Source,
+			SourceName: v.SourceName,
+			//SubSource:     v.SubSource,
+			//SubSourceName: v.SubSourceName,
+			Child:    make([]edb_refresh.EdbRefreshSourceList, 0),
+			HasChild: v.HasChild,
+		}
+
+		if v.HasChild == 1 {
+			for _, v2 := range tmpList {
+				if v2.Source == v.Source {
+					tmp.Child = append(tmp.Child, edb_refresh.EdbRefreshSourceList{
+						Source:        v2.Source,
+						SourceName:    v2.SourceName,
+						SubSource:     v2.SubSource,
+						SubSourceName: v2.SubSourceName,
+						HasChild:      0,
+					})
+				}
+			}
+		}
+
+		tmpMap[v.Source] = tmp
+		list = append(list, tmp)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// RefreshClassifyList
+// @Title 获取指标分类列表接口
+// @Description 获取指标分类列表接口
+// @Param   Source   query   int  true       "来源:1:同花顺,2:wind,3:彭博"
+// @Success Ret=200 获取成功
+// @router /edb_info/refresh/classify_list [get]
+func (c *EdbInfoController) RefreshClassifyList() {
+	br := new(models.BaseResponse).Init()
+
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	source, _ := c.GetInt("Source", utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	list := make([]*edb_refresh.BaseClassifyItems, 0)
+	switch source {
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL: // 钢联
+		rootList, err := data_manage.GetBaseFromMysteelChemicalClassifyByParentId(0)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+
+		classifyAll, err := data_manage.GetAllBaseFromMysteelChemicalClassify()
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+
+		rootChildMap := make(map[int][]*edb_refresh.BaseClassifyItems)
+
+		for _, v := range classifyAll {
+			//tmpList, ok := rootChildMap[v.ParentId]
+			//if !ok {
+			//	tmpList = make([]data_manage.BaseClassifyItems, 0)
+			//}
+			//tmpList = append(tmpList, data_manage.BaseClassifyItems{
+			//	ClassifyId:   v.BaseFromMysteelChemicalClassifyId,
+			//	ClassifyName: v.ClassifyName,
+			//	ParentId:     v.ParentId,
+			//	UniqueCode:   fmt.Sprint(v.BaseFromMysteelChemicalClassifyId),
+			//	Children:     nil,
+			//})
+			//rootChildMap[v.ParentId] = tmpList
+
+			rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], &edb_refresh.BaseClassifyItems{
+				ClassifyId:   v.BaseFromMysteelChemicalClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				UniqueCode:   fmt.Sprint(v.BaseFromMysteelChemicalClassifyId),
+				Children:     nil,
+			})
+		}
+		for _, v := range rootList {
+			tmp := &edb_refresh.BaseClassifyItems{
+				ClassifyId:   v.BaseFromMysteelChemicalClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				UniqueCode:   fmt.Sprint(v.BaseFromMysteelChemicalClassifyId),
+				Children:     nil,
+			}
+			if existItems, ok := rootChildMap[v.BaseFromMysteelChemicalClassifyId]; ok {
+				tmp.Children = existItems
+			} else {
+				items := make([]*edb_refresh.BaseClassifyItems, 0)
+				tmp.Children = items
+			}
+			list = append(list, tmp)
+		}
+
+	case utils.DATA_SOURCE_YS: // 有色
+
+		list = append(list, &edb_refresh.BaseClassifyItems{
+			ClassifyId:   0,
+			ClassifyName: "未分类",
+			ParentId:     0,
+			UniqueCode:   fmt.Sprint(0),
+			Children:     nil,
+		})
+		rootList, err := data_manage.GetBaseFromSmmClassifyByParentId(0)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+
+		classifyAll, err := data_manage.GetAllBaseFromSmmClassify()
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+
+		rootChildMap := make(map[int][]*edb_refresh.BaseClassifyItems)
+		for _, v := range classifyAll {
+			rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], &edb_refresh.BaseClassifyItems{
+				ClassifyId:   v.ClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				UniqueCode:   fmt.Sprint(v.ClassifyId),
+				Children:     nil,
+			})
+		}
+		for _, v := range rootList {
+			tmp := &edb_refresh.BaseClassifyItems{
+				ClassifyId:   v.ClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				UniqueCode:   fmt.Sprint(v.ClassifyId),
+				Children:     nil,
+			}
+			if existItems, ok := rootChildMap[v.ClassifyId]; ok {
+				tmp.Children = existItems
+			} else {
+				items := make([]*edb_refresh.BaseClassifyItems, 0)
+				tmp.Children = items
+			}
+			list = append(list, tmp)
+
+		}
+
+	default:
+		tmpList, err := data_manage.GetAllEdbClassify()
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range tmpList {
+			list = append(list, &edb_refresh.BaseClassifyItems{
+				ClassifyId:   v.ClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				UniqueCode:   fmt.Sprint(v.ClassifyId),
+				Children:     nil,
+			})
+		}
+		list = buildTree(list, 0)
+		//fmt.Println(result)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// 生成多层级列表的递归函数
+func buildTree(items []*edb_refresh.BaseClassifyItems, parentId int) []*edb_refresh.BaseClassifyItems {
+	var result []*edb_refresh.BaseClassifyItems
+
+	// 遍历所有分类项
+	for i := range items {
+		// 找到当前节点的子节点
+		if items[i].ParentId == parentId {
+			// 递归构建子节点的子节点
+			items[i].Children = buildTree(items, items[i].ClassifyId)
+			// 将当前节点添加到结果中
+			result = append(result, items[i])
+		}
+	}
+
+	return result
+}
+
+// RefreshEdbList
+// @Title 获取待配置的指标列表接口
+// @Description 获取待配置的指标列表接口
+// @Param   Source   query   int  true       "来源:1:同花顺,2:wind,3:彭博"
+// @Param   SubSource   query   int  true       "来源:0:经济数据库,1:日期序列"
+// @Param   ClassifyId   query   string  false             "分类ID,支持多选,用英文,隔开"
+// @Param   TerminalCode   query   string  false       "终端编码"
+// @Param   SysUserId   query   string  false       "创建人,支持多选,用英文,隔开"
+// @Param   Frequency   query   string  false       "频度,支持多选,用英文,隔开"
+// @Param   Keyword   query   string  false       "关键词"
+// @Param   SortParam   query   string  false       "排序字段参数,用来排序的字段, 枚举值:'data_time':日期"
+// @Param   SortType   query   string  true       "如何排序,是正序还是倒序,枚举值:`asc 正序`,`desc 倒叙`"
+// @Success 200 {object} data_manage.RefreshBaseEdbInfoResp
+// @router /edb_info/refresh/edb_list [get]
+func (c *EdbInfoController) RefreshEdbList() {
+	br := new(models.BaseResponse).Init()
+
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	source, _ := c.GetInt("Source")
+	subSource, _ := c.GetInt("SubSource")
+	classifyId := c.GetString("ClassifyId")
+	terminalCode := c.GetString("TerminalCode")
+	sysUserId := c.GetString("SysUserId")
+	frequency := c.GetString("Frequency")
+	keyword := c.GetString("Keyword")
+	status := c.GetString("Status")
+
+	sortParam := c.GetString("SortParam")
+	sortType := c.GetString("SortType")
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+	var startSize int
+
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	total, list, err := data.GetList(source, subSource, classifyId, terminalCode, sysUserId, frequency, keyword, status, startSize, pageSize, sortParam, sortType)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	resp := data_manage.RefreshBaseEdbInfoResp{
+		Paging: page,
+		List:   list,
+	}
+
+	// 刷新时间格式化
+	list, err, errMsg, isSendEmail := data.HandleRefreshTime(source, subSource, list)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// GetEdbRefreshDefaultConfig
+// @Title 获取待配置的指标列表接口
+// @Description 获取待配置的指标列表接口
+// @Param   Source   query   int  true       "来源:1:同花顺,2:wind,3:彭博"
+// @Param   SubSource   query   int  true       "来源:0:经济数据库,1:日期序列"
+// @Param   Frequency   query   string  false       "频度"
+// @Success 200 {object} data_manage.RefreshBaseEdbInfoResp
+// @router /edb_info/refresh/default_config [get]
+func (c *EdbInfoController) GetEdbRefreshDefaultConfig() {
+	br := new(models.BaseResponse).Init()
+
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	source, _ := c.GetInt("Source")
+	subSource, _ := c.GetInt("SubSource")
+	frequency := c.GetString("Frequency")
+
+	if source <= 0 {
+		br.Msg = "来源不能为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 非有色的来源,频度不能为空
+	if source != utils.DATA_SOURCE_YS && frequency == `` {
+		br.Msg = "频度不能为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	list, err := edb_refresh.GetListBySourceAndFrequency(source, subSource, frequency)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// SaveEdbRefreshDefaultConfig
+// @Title 设置默认的指标刷新配置接口
+// @Description 设置默认的指标刷新配置接口
+// @Param	request	body data_manage.SaveEdbRefreshDefaultConfigReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_info/refresh/default_config/save [post]
+func (c *EdbInfoController) SaveEdbRefreshDefaultConfig() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	var req request.SaveEdbRefreshDefaultConfigReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 保存
+	err, errMsg, isSendEmail := data.SaveEdbRefreshDefaultConfig(req.Source, req.SubSource, req.Frequency, req.List)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// SaveEdbRefreshConfig
+// @Title 设置指标刷新配置接口
+// @Description 设置指标刷新配置接口
+// @Param	request	body data_manage.SaveEdbRefreshConfigReq true "type json string"
+// @Success 200 {object} data_manage.RefreshBaseEdbInfoResp
+// @router /edb_info/refresh/config/save [post]
+func (c *EdbInfoController) SaveEdbRefreshConfig() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	var req request.SaveEdbRefreshConfigReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 保存
+	err, errMsg, isSendEmail := data.SaveEdbRefreshConfig(req.Source, req.SubSource, req.ClassifyId, req.TerminalCode, req.Frequency, req.Keyword, req.Status, req.SysUserId, req.IsSelectAll, req.List, req.EdbSelectIdList, c.SysUser.AdminId, c.SysUser.RealName)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// SaveEdbRefreshStatus
+// @Title 设置指标刷新状态接口
+// @Description 设置指标刷新状态接口
+// @Param	request	body data_manage.SaveEdbRefreshStatusReq true "type json string"
+// @Success 200 {object} data_manage.RefreshBaseEdbInfoResp
+// @router /edb_info/refresh/status/save [post]
+func (c *EdbInfoController) SaveEdbRefreshStatus() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	var req request.SaveEdbRefreshStatusReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.Source <= 0 {
+		br.Msg = "来源不能为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	edbIdList := make([]int, 0)
+	edbCodeList := make([]string, 0)
+	// 指标id列表
+	if req.IsSelectAll {
+		// 如果是列表全选
+		_, edbList, err := data.GetList(req.Source, req.SubSource, req.ClassifyId, req.TerminalCode, req.SysUserId, req.Frequency, req.Keyword, req.Status, 0, 100000, "", "")
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+
+		// 不配置的指标id
+		notIdMap := make(map[int]int, 0)
+		for _, v := range req.EdbSelectIdList {
+			notIdMap[v] = v
+		}
+
+		for _, v := range edbList {
+			_, ok := notIdMap[v.EdbInfoId]
+			// 在不配置的指标id列表内的话,那就过滤
+			if ok {
+				continue
+			}
+
+			// 加入到待配置的指标列表id
+			edbIdList = append(edbIdList, v.EdbInfoId)
+			edbCodeList = append(edbCodeList, v.IndexCode)
+		}
+	} else {
+		edbIdList = req.EdbSelectIdList
+	}
+
+	if len(edbIdList) <= 0 {
+		br.Msg = "指标不能为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	isStop := 0
+	if req.ModifyStatus == `暂停` {
+		isStop = 1
+	}
+
+	switch req.Source {
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL: // 钢联
+		err = data_manage.ModifyMysteelChemicalUpdateStatus(edbIdList, edbCodeList, isStop)
+	case utils.DATA_SOURCE_YS: // 有色
+		err = data_manage.ModifySmmUpdateStatus(edbIdList, edbCodeList, isStop)
+	default:
+		err = data_manage.ModifyEdbInfoUpdateStatus(edbIdList, isStop)
+	}
+	if err != nil {
+		br.Msg = `保存失败`
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// GetEdbRefreshEdbConfig
+// @Title 获取单个指标的刷新配置列表接口
+// @Description 获取单个指标的刷新配置列表接口
+// @Param   Source   query   int  true       "来源:1:同花顺,2:wind,3:彭博"
+// @Param   SubSource   query   int  true       "来源:0:经济数据库,1:日期序列"
+// @Param   EdbInfoId   query   int  false       "指标id"
+// @Success 200 {object} data_manage.RefreshBaseEdbInfoResp
+// @router /edb_info/refresh/edb_config [get]
+func (c *EdbInfoController) GetEdbRefreshEdbConfig() {
+	br := new(models.BaseResponse).Init()
+
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	source, _ := c.GetInt("Source")
+	subSource, _ := c.GetInt("SubSource")
+	edbInfoId, _ := c.GetInt("EdbInfoId")
+
+	if source <= 0 {
+		br.Msg = "来源不能为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	if edbInfoId <= 0 {
+		br.Msg = "指标不能为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 获取指标的刷新配置列表
+	list, err := edb_refresh.GetEdbRefreshConfigListBySourceAndeEdbInfoId(source, subSource, edbInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	if len(list) > 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = list
+		return
+	}
+
+	// 如果没有找到该指标的配置,那么就查询默认配置
+
+	var frequency string
+
+	// 根据类型查找指标的频度信息
+	switch source {
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL: // 钢联
+		item, err := data_manage.GetBaseFromMysteelChemicalIndexByIndexId(edbInfoId)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = err.Error()
+			return
+		}
+		frequency = item.Frequency
+	case utils.DATA_SOURCE_YS: // 有色
+		item, err := data_manage.GetSmmIndexById(edbInfoId)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = err.Error()
+			return
+		}
+		frequency = item.Frequency
+	default:
+		item, err := data_manage.GetEdbInfoById(edbInfoId)
+		if err != nil {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = err.Error()
+			return
+		}
+		frequency = item.Frequency
+	}
+
+	if frequency == `` {
+		br.Msg = "获取的指标频度信息异常"
+		br.IsSendEmail = false
+		return
+	}
+
+	tmpList, err := edb_refresh.GetListBySourceAndFrequency(source, subSource, frequency)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = err.Error()
+		return
+	}
+	list = make([]*edb_refresh.EdbRefreshConfigItem, 0)
+	for _, v := range tmpList {
+		list = append(list, &edb_refresh.EdbRefreshConfigItem{
+			RefreshFrequency:    v.RefreshFrequency,
+			RefreshFrequencyDay: v.RefreshFrequencyDay,
+			RefreshTime:         v.RefreshTime,
+			RefreshAllData:      v.RefreshAllData,
+			RefreshDataNum:      v.RefreshDataNum,
+		})
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}

+ 329 - 0
controllers/data_source/icpi.go

@@ -0,0 +1,329 @@
+package data_source
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_source"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"os"
+	"path/filepath"
+	"time"
+)
+
+// 消费者价格指数
+
+// ComTradeCountryList
+// @Title 获取居民消费价格指数分类
+// @Description 获取居民消费价格指数分类
+// @Success 200 {object} []data_manage.ComTradeCountryItem
+// @router /icpi/classify/list [get]
+func (this *DataSourceController) IcpiClassifyList() {
+	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
+	}
+
+	icpiObj := new(data_source.BaseFromIcpiIndex)
+	classifyList, err := icpiObj.GetBaseFromIcpiClassifyAll()
+	if err != nil {
+		br.Msg = "获取分类失败"
+		br.ErrMsg = "获取分类失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = classifyList
+}
+
+// @Title 获取消费者价格指数数据
+// @Description 获取消费者价格指数数据接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   BaseFromIcpiClassifyId   query   int  true       "分类id"
+// @Param   KeyWord   query   string  true       "关键词"
+// @Success 200 {object} data_source.BaseFromIcpiIndexView
+// @router /icpi/index/data [get]
+func (this *DataSourceController) IcpiData() {
+	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
+	}
+
+	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)
+
+	baseFromIcpiClassifyId, _ := this.GetInt("BaseFromIcpiClassifyId")
+	if baseFromIcpiClassifyId < 0 {
+		br.Msg = "请选择分类"
+		br.ErrMsg = "请选择分类"
+		return
+	}
+
+	keyword := this.GetString("KeyWord")
+
+	//获取指标
+	var condition string
+	var pars []interface{}
+
+	if baseFromIcpiClassifyId > 0 {
+		condition += ` AND base_from_icpi_classify_id=? `
+		pars = append(pars, baseFromIcpiClassifyId)
+	}
+
+	if keyword != "" {
+		condition += ` AND (index_code =? OR index_name LIKE ?)  `
+		pars = append(pars, keyword)
+		pars = append(pars, "%"+keyword+"%")
+	}
+
+	icpiObj := new(data_source.BaseFromIcpiIndex)
+
+	icpiList, err := icpiObj.GetIcpiIndex(condition, pars)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resultList := make([]*data_source.BaseFromIcpiIndexView, 0)
+	for _, v := range icpiList {
+		product := new(data_source.BaseFromIcpiIndexView)
+		product.BaseFromIcpiIndexId = v.BaseFromIcpiIndexId
+		product.BaseFromIcpiClassifyId = v.BaseFromIcpiClassifyId
+		product.IndexCode = v.IndexCode
+		product.IndexName = v.IndexName
+		product.Frequency = v.Frequency
+		product.Unit = v.Unit
+		product.ModifyTime = v.ModifyTime
+
+		total, err := icpiObj.GetIcpiIndexDataCount(v.IndexCode)
+		page := paging.GetPaging(currentIndex, pageSize, total)
+		dataList, err := icpiObj.GetIcpiIndexData(v.IndexCode, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+		if dataList == nil {
+			dataList = make([]*data_source.BaseFromIcpiDataView, 0)
+		}
+		product.DataList = dataList
+		product.Paging = page
+		resultList = append(resultList, product)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resultList
+}
+
+// ExportBaiinfoList
+// @Title 导出ICPI数据
+// @Description 导出ICPI数据
+// @Param   BaseFromIcpiClassifyId   query   int  true       "分类id"
+// @Param   KeyWord   query   string  true       "关键词"
+// @Success 200  导出成功
+// @router /icpi/export/icpiDataList [get]
+func (this *DataSourceController) ExportIcpiDataList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	baseFromIcpiClassifyId, _ := this.GetInt("BaseFromIcpiClassifyId")
+	if baseFromIcpiClassifyId < 0 {
+		br.Msg = "请选择分类"
+		br.ErrMsg = "请选择分类"
+		return
+	}
+
+	keyword := this.GetString("KeyWord")
+
+	//获取指标
+	var condition string
+	var pars []interface{}
+
+	if baseFromIcpiClassifyId >= 0 {
+		condition += ` AND base_from_icpi_classify_id=? `
+		pars = append(pars, baseFromIcpiClassifyId)
+	}
+
+	if keyword != "" {
+		condition += ` AND (index_code =? OR index_name LIKE ?)  `
+		pars = append(pars, keyword)
+		pars = append(pars, "%"+keyword+"%")
+	}
+
+	icpiObj := new(data_source.BaseFromIcpiIndex)
+
+	icpiList, err := icpiObj.GetIcpiIndex(condition, pars)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+
+	if err != nil {
+		fmt.Println("新增Sheet失败", err.Error())
+		return
+	}
+	//sheetNew.SetColWidth()
+	//获取指标数据
+	sheetNew, _ := xlsxFile.AddSheet("ICPI消费价格指数")
+	windRow := sheetNew.AddRow()
+	secNameRow := sheetNew.AddRow()
+	indexCodeRow := sheetNew.AddRow()
+	frequencyRow := sheetNew.AddRow()
+	unitRow := sheetNew.AddRow()
+	lastModifyDateRow := sheetNew.AddRow()
+	//获取分类下指标最大数据量
+	dataMax, err := icpiObj.GetIcpiDataMaxCount(baseFromIcpiClassifyId)
+	if err != nil {
+		fmt.Println("获取指标最大数据量失败", err.Error())
+		return
+	}
+	fmt.Println("dataMax:", dataMax)
+	setRowIndex := 6
+	for k, sv := range icpiList {
+		//获取数据
+		dataList, err := icpiObj.GetIcpiIndexDataByCode(sv.IndexCode)
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败,Err:" + err.Error()
+			return
+		}
+		if len(dataList) > 0 {
+			windRow.AddCell().SetValue("ICPI消费价格指数")
+			secNameRow.AddCell().SetValue("指标名称")
+			indexCodeRow.AddCell().SetValue("指标ID")
+			frequencyRow.AddCell().SetValue("频率")
+			unitRow.AddCell().SetValue("单位")
+			lastModifyDateRow.AddCell().SetValue("更新时间")
+
+			secNameRow.AddCell().SetValue(sv.IndexName)
+			indexCodeRow.AddCell().SetValue(sv.IndexCode)
+			frequencyRow.AddCell().SetValue(sv.Frequency)
+			unitRow.AddCell().SetValue(sv.Unit)
+			lastModifyDateRow.AddCell().SetValue(sv.ModifyTime)
+
+			windRow.AddCell()
+			windRow.AddCell()
+			secNameRow.AddCell()
+			indexCodeRow.AddCell()
+			frequencyRow.AddCell()
+			unitRow.AddCell()
+			lastModifyDateRow.AddCell()
+			min := k * 3
+			sheetNew.SetColWidth(min, min, 15)
+
+			if len(dataList) <= 0 {
+				for n := 0; n < dataMax; n++ {
+					rowIndex := setRowIndex + n
+					row := sheetNew.Row(rowIndex)
+					row.AddCell()
+					row.AddCell()
+					row.AddCell()
+					row.AddCell()
+				}
+			} else {
+				endRowIndex := 0
+				for rk, dv := range dataList {
+					rowIndex := setRowIndex + rk
+					row := sheetNew.Row(rowIndex)
+					displayDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
+					displayDateCell := row.AddCell()
+					style := new(xlsx.Style)
+					style.ApplyAlignment = true
+					style.Alignment.WrapText = true
+					displayDateCell.SetStyle(style)
+					displayDateCell.SetDate(displayDate)
+
+					row.AddCell().SetValue(dv.Value)
+					row.AddCell()
+					endRowIndex = rowIndex
+				}
+				if len(dataList) < dataMax {
+					dataLen := dataMax - len(dataList)
+					for n := 0; n < dataLen; n++ {
+						rowIndex := (endRowIndex + 1) + n
+						row := sheetNew.Row(rowIndex)
+						row.AddCell()
+						row.AddCell()
+						row.AddCell()
+						row.AddCell()
+					}
+				}
+			}
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		//有指标无数据时先导出一遍空表
+		sheet, err := xlsxFile.AddSheet("无数据")
+		if err != nil {
+			br.Msg = "新增Sheet失败"
+			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+			return
+		}
+		rowSecName := sheet.AddRow()
+		celSecName := rowSecName.AddCell()
+		celSecName.SetValue("")
+		err = xlsxFile.Save(downLoadnFilePath)
+		if err != nil {
+			br.Msg = "保存文件失败"
+			br.ErrMsg = "保存文件失败"
+			return
+		}
+	}
+	fileName := `ICPI消费价格指数`
+	fileName += time.Now().Format(utils.FormatDateUnSpace) + `.xlsx` //文件名称
+	this.Ctx.Output.Download(downLoadnFilePath, fileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "success"
+
+}

+ 2 - 0
go.mod

@@ -62,6 +62,7 @@ require (
 	github.com/fatih/structs v1.1.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.3 // indirect
+	github.com/go-ego/gse v0.80.2 // indirect
 	github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
@@ -103,6 +104,7 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
+	github.com/vcaesar/cedar v0.20.1 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
 	golang.org/x/crypto v0.12.0 // indirect

+ 12 - 0
go.sum

@@ -15,6 +15,7 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo=
 github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
 github.com/alibabacloud-go/alimt-20181012/v2 v2.0.0 h1:RZF3WXYiPB/m1FiZS51udLbpAvg0urYi1wAfB18kiUQ=
@@ -143,10 +144,13 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS
 github.com/garyburd/redigo v1.6.3 h1:HCeeRluvAgMusMomi1+6Y5dmFOdYV/JzoRrrbFlkGIc=
 github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw=
 github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
+github.com/go-ego/gse v0.80.2 h1:3LRfkaBuwlsHsmkOZvnhTcsYPXUAhiP06Sqcid7mO1M=
+github.com/go-ego/gse v0.80.2/go.mod h1:kesekpZfcFQ/kwd9b27VZHUOH5dQUjaaQUZ4OGt4Hj4=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc h1:jZY+lpZB92nvBo2f31oPC/ivGll6NcsnEOORm8Fkr4M=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc/go.mod h1:25mL1NKxbJhB63ihiK8MnNeTRd+xAizd6bOdydrTLUQ=
@@ -244,6 +248,7 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -252,6 +257,7 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53 h1:+8X3HMX8A2QhvNg3dImiQTCiVUt6BQXz1mW+/DrWI+k=
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53/go.mod h1:E61jD6q4yJ6Cu9uDGRAfiENM1G5TVZhOog0Y3+GgTpQ=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -261,6 +267,7 @@ github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
 github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
 github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
@@ -301,6 +308,7 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwd
 github.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0=
 github.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19 h1:LhWT2dBuNkYexwRSsPpYh67e0ikmH1ebBDaVkGHoMts=
@@ -431,6 +439,8 @@ github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso
 github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
 github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/vcaesar/cedar v0.20.1 h1:cDOmYWdprO7ZW8cngJrDi8Zivnscj9dA/y8Y+2SB1P0=
+github.com/vcaesar/cedar v0.20.1/go.mod h1:iMDweyuW76RvSrCkQeZeQk4iCbshiPzcCvcGCtpM7iI=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 h1:6932x8ltq1w4utjmfMPVj09jdMlkY0aiA6+Skbtl3/c=
 github.com/xuri/efp v0.0.0-20220603152613-6918739fd470/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
@@ -438,6 +448,8 @@ github.com/xuri/excelize/v2 v2.7.1 h1:gm8q0UCAyaTt3MEF5wWMjVdmthm2EHAWesGSKS9tdV
 github.com/xuri/excelize/v2 v2.7.1/go.mod h1:qc0+2j4TvAUrBw36ATtcTeC1VCM0fFdAXZOmcF4nTpY=
 github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M=
 github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
+github.com/yanyiwu/gojieba v1.3.0 h1:6VeaPOR+MawnImdeSvWNr7rP4tvUfnGlEKaoBnR33Ds=
+github.com/yanyiwu/gojieba v1.3.0/go.mod h1:54wkP7sMJ6bklf7yPl6F+JG71dzVUU1WigZbR47nGdY=
 github.com/yidane/formula v0.0.0-20210902154546-0782e1736717 h1:9CTJJpdISGxMAELfVlprj5kZEsJEaNAWiobv8ZAd72U=
 github.com/yidane/formula v0.0.0-20210902154546-0782e1736717/go.mod h1:9/dQiKiN04yPMdgsuFmKGuI2Hdp6OmFV9gSWS1col6g=
 github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369/go.mod h1:Nv7wKD2/bCdKUFNKcJRa99a+1+aSLlCRJFriFYdjz/I=

+ 236 - 0
models/data_manage/base_from_mtjh.go

@@ -0,0 +1,236 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type BaseFromMtjhMapping struct {
+	BaseFromMtjhMappingId int       `orm:"column(base_from_mtjh_mapping_id);pk"`
+	IndexName             string    `description:"持买单量指标名称"`
+	IndexCode             string    `description:"持买单量指标编码"`
+	CreateTime            time.Time `description:"时间"`
+	Area                  string    `description:"区域"`
+	Port                  string    `description:"港口或码头"`
+	Variety               string    `description:"品种"`
+	Unit                  string    `description:"单位"`
+	Frequency             string    `description:"频率"`
+}
+
+type BaseFromMtjhIndex 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:"品种"`
+	CreateTime          time.Time `description:"插入时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+}
+
+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:"品种"`
+	CreateTime          string `description:"插入时间"`
+	ModifyTime          string `description:"修改时间"`
+}
+
+// 查询指标
+func GetBaseFromMtjhMapping() (items []*BaseFromMtjhMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_mtjh_mapping`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromMtjhIndex() (items []*BaseFromMtjhIndex, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_mtjh_index`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 添加数据
+func AddBaseFromMtjhIndex(item *BaseFromMtjhIndex) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+func AddBaseFromMtjhIndexMuti(items []*BaseFromMtjhIndex) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.InsertMulti(500, items)
+	return
+}
+
+// 添加指标
+func AddBaseFromMtjhMapping(item *BaseFromMtjhMapping) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+func AddBaseFromMtjhMappingMuti(items []*BaseFromMtjhMapping) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.InsertMulti(500, items)
+	return
+}
+
+func UpdateBaseFromMtjhIndex(item *BaseFromMtjhIndex) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE base_from_mtjh_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
+	_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	return
+}
+
+func GetMtjhClassifyList() (list []*BaseFromMtjhMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_mtjh_mapping group by area"
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromMtjhMappingItem struct {
+	BaseFromMtjhMappingId int    `orm:"column(base_from_mtjh_mapping_id);pk"`
+	IndexName             string `description:"持买单量指标名称"`
+	IndexCode             string `description:"持买单量指标编码"`
+	CreateTime            string `description:"时间"`
+	Area                  string `description:"区域"`
+	Port                  string `description:"港口或码头"`
+	Variety               string `description:"品种"`
+	Unit                  string `description:"单位"`
+	Frequency             string `description:"频率"`
+}
+
+func GetMtjhMapping(condition string, pars interface{}) (items []*BaseFromMtjhMappingItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mtjh_mapping WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY base_from_mtjh_mapping_id asc`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+type BaseFromMtjhIndexList struct {
+	BaseFromMtjhMappingId int    `orm:"column(base_from_mtjh_mapping_id);pk"`
+	IndexName             string `description:"持买单量指标名称"`
+	IndexCode             string `description:"持买单量指标编码"`
+	Area                  string `description:"区域"`
+	Port                  string `description:"港口或码头"`
+	Unit                  string `description:"单位"`
+	Frequency             string `description:"频率"`
+	CreateTime            string `description:"插入时间"`
+	ModifyTime            string `description:"修改时间"`
+	Variety               string `description:"品种"`
+	DataList              []*BaseFromMtjhIndexItem
+	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=? `
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	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 ?,? `
+	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetMtjhItemList 模糊查询煤炭江湖数据库指标列表
+func GetMtjhItemList(keyword string) (items []*BaseFromMtjhMappingItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_mtjh_mapping WHERE CONCAT(index_name,index_code) LIKE ? "
+	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetBaseFromMtjhIndexByCode(indexCode string) (items []*BaseFromMtjhIndexItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_mtjh_index WHERE index_code=? ORDER BY data_time DESC `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+// GetMtjhMappingItemByCode
+func GetMtjhMappingItemByCode(indexCode string) (item *BaseFromMtjhMappingItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_mtjh_mapping WHERE index_code=? "
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+// GetMtjhFrequencyByArea
+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)
+	return
+}
+
+func GetClassifyMtjhByArea(area string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_mtjh_index WHERE area=? `
+	_, err = o.Raw(sql, area).QueryRows(&items)
+	return
+}
+
+func GetCoalMtjhMaxCount(area string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT
+	MAX( t.num ) AS count 
+FROM
+	(
+	SELECT
+		COUNT( 1 ) AS num 
+	FROM
+		base_from_mtjh_index 
+	WHERE
+		area =? 
+GROUP BY
+	index_name ) AS t `
+	err = o.Raw(sql, area).QueryRow(&count)
+	return
+}
+
+func GetMtjhCount(indexCode string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT
+		COUNT( 1 ) AS num 
+	FROM
+		base_from_mtjh_index
+	WHERE
+		index_code =? `
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	return
+}
+
+func GetMtjhIndexLatestDate(indexCode string) (ModifyTime string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	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
+}

+ 8 - 0
models/data_manage/edb_classify.go

@@ -146,6 +146,14 @@ func GetEdbClassifyAll() (items []*EdbClassifyItems, err error) {
 	return
 }
 
+// GetAllEdbClassify 获取所有的普通指标的分类列表(包含第一级)
+func GetAllEdbClassify() (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE  classify_type = 0  order by sort asc,classify_id asc`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetNormalEdbClassifyAll 获取普通指标的分类列表
 func GetNormalEdbClassifyAll() (items []*EdbClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")

+ 3 - 1
models/data_manage/edb_data_base.go

@@ -165,8 +165,10 @@ func GetEdbDataTableName(source, subSource int) (tableName string) {
 		tableName = "edb_data_calculate_zdyfx" // 自定义分析->74
 	case utils.DATA_SOURCE_CALCULATE_RJZ: //日均值->75
 		tableName = "edb_data_calculate_rjz"
-	case utils.DATA_SOURCE_GFEX: //广州期货交易所->76
+	case utils.DATA_SOURCE_GFEX: //广州期货交易所->78
 		tableName = "edb_data_gz"
+	case utils.DATA_SOURCE_ICPI: //ICPI消费价格指数->79
+		tableName = "edb_data_icpi"
 	default:
 		edbSource := EdbSourceIdMap[source]
 		if edbSource != nil {

+ 39 - 0
models/data_manage/edb_data_icpi.go

@@ -0,0 +1,39 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type IcpiData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+func GetEdbDataIcpiMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_icpi WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+type IcpiIndexView struct {
+	BaseFromTradeGuangzhouIndexId    int     `description:"指标id"`
+	BaseFromTradeGuangzhouClassifyId int     `description:"分类id"`
+	IndexCode                        string  `description:"指标编码"`
+	IndexName                        string  `description:"指标名称"`
+	Frequency                        string  `description:"频率"`
+	Unit                             string  `description:"单位"`
+	StartDate                        string  `description:"开始日期"`
+	EndDate                          string  `description:"结束日期"`
+	Value                            float64 `description:"数据"`
+}
+
+// GetBaseInfoFromShByIndexCode 获取指标信息
+func GetBaseInfoFromIcpiByIndexCode(indexCode string) (item *IcpiIndexView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_icpi_index WHERE index_code=? `
+	sql = fmt.Sprintf(sql)
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}

+ 94 - 2
models/data_manage/edb_info.go

@@ -151,6 +151,20 @@ func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
 	return
 }
 
+// GetEdbInfoByUniqueCode
+// @Description: 根据uniqueCode获取指标详情
+// @author: Roc
+// @datetime 2024-01-18 13:40:01
+// @param uniqueCode string
+// @return item *EdbInfo
+// @return err error
+func GetEdbInfoByUniqueCode(uniqueCode string) (item *EdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info WHERE unique_code=? `
+	err = o.Raw(sql, uniqueCode).QueryRow(&item)
+	return
+}
+
 // GetEdbInfoByIdList 根据指标id集合 获取 指标列表
 func GetEdbInfoByIdList(edbInfoIdList []int) (items []*EdbInfo, err error) {
 	num := len(edbInfoIdList)
@@ -327,6 +341,7 @@ type EdbInfoList struct {
 	SubSourceName    string                  `description:"子数据来源名称"`
 	IndicatorCode    string                  `description:"指标代码"`
 	StockCode        string                  `description:"证券代码"`
+	NoUpdate         int8                    `description:"是否停止更新,0:继续更新;1:停止更新"`
 }
 
 type EdbDataInsertConfigItem struct {
@@ -1587,8 +1602,8 @@ type EdbInfoDataSeasonalResp struct {
 
 // SetEdbDataInsertConfigReq 设置插入规则的请求
 type SetEdbDataInsertConfigReq struct {
-	EdbInfoId int     `description:"指标ID"`
-	Date      string  `description:"日期"`
+	EdbInfoId int    `description:"指标ID"`
+	Date      string `description:"日期"`
 	Value     string `description:"值"`
 }
 
@@ -1646,6 +1661,7 @@ type TraceEdbInfoResp struct {
 	UniqueCode  string             `description:"唯一编码"`
 	ClassifyId  int                `description:"分类ID"`
 	Child       []TraceEdbInfoResp `description:"下级来源"`
+	IsStop      int8               `description:"是否终止"`
 	EdbInfo     *EdbInfo           `description:"指标信息" json:"-"`
 }
 
@@ -1735,3 +1751,79 @@ type EdbInfoSmmExistCheckResp struct {
 	EdbInfoExistCheckResp
 	ExistAll bool `description:"是否全部重复"`
 }
+
+// GetEdbBaseInfoList
+// @Description: 获取指标库数据列表
+// @author: Roc
+// @datetime 2024-01-10 14:28:22
+// @param condition string
+// @param pars []interface{}
+// @param orderBy string
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*BaseRefreshEdbInfo
+// @return err error
+func GetEdbBaseInfoList(condition string, pars []interface{}, orderBy string, startSize, pageSize int) (total int, items []*BaseRefreshEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	// 数量汇总
+	totalSql := ` SELECT count(1) FROM edb_info WHERE 1=1 `
+	if condition != "" {
+		totalSql += condition
+	}
+	err = o.Raw(totalSql, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	// 列表数据
+	sql := ` SELECT edb_info_id as edb_info_id, classify_id as classify_id,edb_code as index_code,edb_name as index_name,end_date,end_value,sys_user_id,sys_user_real_name,frequency,no_update as is_stop,terminal_code FROM edb_info WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+
+	if orderBy != "" {
+		sql += ` ORDER BY ` + orderBy
+	} else {
+		sql += ` ORDER BY edb_info_id ASC `
+	}
+	sql += `  LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+
+	return
+}
+
+// ModifyEdbInfoUpdateStatus
+// @Description:  修改指标库停更状态
+// @author: Roc
+// @datetime 2024-01-08 16:23:31
+// @param edbIdList []int
+// @param indexCodeList []string
+// @param isStop int
+// @return err error
+func ModifyEdbInfoUpdateStatus(edbIdList []int, isStop int) (err error) {
+	idNum := len(edbIdList)
+	if idNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+			return
+		}
+		_ = o.Commit()
+	}()
+
+	// 更改指标的更新状态
+	sql := ` UPDATE edb_info SET no_update = ? WHERE  edb_info_id IN (` + utils.GetOrmInReplace(idNum) + `) `
+	_, err = o.Raw(sql, isStop, edbIdList).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}

+ 3 - 1
models/data_manage/edb_info_calculate_mapping.go

@@ -68,6 +68,7 @@ func GetEdbInfoCalculateMappingDetail(edbInfoId int) (item *EdbInfoCalculateMapp
 }
 
 // EdbInfoCalculateMappingInfo
+// @Description: 计算指标与基础指标关系表
 type EdbInfoCalculateMappingInfo struct {
 	EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
 	EdbInfoId                 int       `description:"计算指标id"`
@@ -88,12 +89,13 @@ type EdbInfoCalculateMappingInfo struct {
 	FromEdbInfoType           int       `description:"来源指标类型: 0-基础指标; 1-预测指标"`
 	FromClassifyId            int       `description:"来源指标分类ID"`
 	FromUniqueCode            string    `description:"来源指标唯一编码"`
+	NoUpdate                  int8      `description:"是否停止更新,0:继续更新;1:停止更新"`
 }
 
 // GetEdbInfoCalculateMappingListByEdbInfoId 根据生成的指标id获取来源的指标id列表
 func GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId int) (items []*EdbInfoCalculateMappingInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.edb_type as from_edb_type,b.edb_info_type as from_edb_info_type, b.unique_code AS from_unique_code, b.classify_id AS from_classify_id FROM edb_info_calculate_mapping AS a
+	sql := ` SELECT a.*,b.edb_type as from_edb_type,b.edb_info_type as from_edb_info_type, b.unique_code AS from_unique_code, b.classify_id AS from_classify_id,b.no_update FROM edb_info_calculate_mapping AS a
 			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
 			WHERE a.edb_info_id=? `
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)

+ 239 - 0
models/data_manage/edb_refresh/edb_refresh_config.go

@@ -0,0 +1,239 @@
+package edb_refresh
+
+import (
+	"errors"
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbRefreshConfig
+// @Description: 指标的刷新时间配置表
+type EdbRefreshConfig struct {
+	EdbRefreshConfigId  int       `orm:"column(edb_refresh_config_id);pk"`
+	RefreshFrequency    string    `description:"刷新频率"`
+	RefreshFrequencyDay int       `description:"具体刷新的日期"`
+	RefreshTime         string    `description:"刷新时间"`
+	RefreshAllData      int       `description:"是否刷新所有数据,0:否,1:刷新所有数据"`
+	RefreshDataNum      int       `description:"刷新单元格数"`
+	ModifyTime          time.Time `description:"最晚一次的更新时间"`
+	CreateTime          time.Time `description:"添加时间"`
+}
+
+// Add
+// @Description: 添加
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *EdbRefreshConfig) Add() (err error) {
+	if m.EdbRefreshConfigId > 0 {
+		err = errors.New("该配置已存在")
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	lastId, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.EdbRefreshConfigId = int(lastId)
+
+	return
+}
+
+// Update
+// @Description: 更新
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *EdbRefreshConfig) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+// Delete
+// @Description: 删除
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @return err error
+func (m *EdbRefreshConfig) Delete() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Delete(m)
+	return
+}
+
+// GetEdbRefreshConfigListByCondition
+// @Description: 根据条件获取刷新配置列表
+// @author: Roc
+// @datetime 2024-01-08 14:07:10
+// @param refreshFrequency string
+// @param refreshTime string
+// @param refreshFrequencyDay int
+// @param refreshAllData int
+// @param refreshDataNum int
+// @return item *EdbRefreshConfig
+// @return err error
+func GetEdbRefreshConfigListByCondition(refreshFrequency, refreshTime string, refreshFrequencyDay, refreshAllData, refreshDataNum int) (item *EdbRefreshConfig, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_refresh_config
+         WHERE refresh_frequency = ? AND refresh_frequency_day = ? AND refresh_time = ? AND refresh_all_data = ? AND refresh_data_num = ? ORDER BY edb_refresh_config_id ASC `
+	err = o.Raw(sql, refreshFrequency, refreshFrequencyDay, refreshTime, refreshAllData, refreshDataNum).QueryRow(&item)
+
+	return
+}
+
+// SaveEdbRefreshConfig
+// @Description:  保存刷新配置
+// @author: Roc
+// @datetime 2024-01-08 15:13:23
+// @param source int
+// @param subSource int
+// @param sysUserId int
+// @param sysUserRealName string
+// @param newConfigList []*EdbRefreshConfig
+// @param addMapping []*EdbRefreshMapping
+// @param edbIdList []int
+// @return err error
+func SaveEdbRefreshConfig(source, subSource, sysUserId int, sysUserRealName string, newConfigList []*EdbRefreshConfig, addMapping []*EdbRefreshMapping, edbIdList []int) (err error) {
+	num := len(edbIdList)
+	if num <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+			return
+		}
+		_ = o.Commit()
+	}()
+
+	for _, v := range newConfigList {
+		lastId, tmpErr := o.Insert(v)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		v.EdbRefreshConfigId = int(lastId)
+
+		for _, edbId := range edbIdList {
+			addMapping = append(addMapping, &EdbRefreshMapping{
+				EdbRefreshMappingId: 0,
+				Source:              source,
+				SubSource:           subSource,
+				EdbInfoId:           edbId,
+				EdbRefreshConfigId:  v.EdbRefreshConfigId,
+				SysUserId:           sysUserId,
+				SysUserRealName:     sysUserRealName,
+				ModifyTime:          time.Now(),
+				CreateTime:          time.Now(),
+			})
+		}
+	}
+
+	// 先删除
+	sql := `DELETE FROM edb_refresh_mapping WHERE source =? AND sub_source =? AND edb_info_id in (` + utils.GetOrmInReplace(num) + `)`
+	_, err = o.Raw(sql, source, subSource, edbIdList).Exec()
+
+	// 再写入
+	if len(addMapping) > 0 {
+		tmpAddDataList := make([]*EdbRefreshMapping, 0)
+		i := 0
+		for _, v := range addMapping {
+			tmpAddDataList = append(tmpAddDataList, v)
+			i++
+			if i >= 500 {
+				_, err = o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
+				if err != nil {
+					return
+				}
+				i = 0
+				tmpAddDataList = make([]*EdbRefreshMapping, 0)
+			}
+		}
+
+		if len(tmpAddDataList) > 0 {
+			_, err = o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
+			if err != nil {
+				return
+			}
+		}
+	}
+
+	return
+
+}
+
+// EdbRefreshConfigItem
+// @Description: 指标的刷新时间配置项
+type EdbRefreshConfigItem struct {
+	RefreshFrequency    string `description:"刷新频率"`
+	RefreshFrequencyDay int    `description:"具体刷新的日期"`
+	RefreshTime         string `description:"刷新时间"`
+	RefreshAllData      int    `description:"是否刷新所有数据,0:否,1:刷新所有数据"`
+	RefreshDataNum      int    `description:"刷新单元格数"`
+}
+
+// GetEdbRefreshConfigListBySourceAndeEdbInfoId
+// @Description: 根据来源和指标获取其配置列表
+// @author: Roc
+// @datetime 2024-01-10 14:18:21
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @return list []*EdbRefreshDefaultConfig
+// @return err error
+func GetEdbRefreshConfigListBySourceAndeEdbInfoId(source, subSource, edbInfoId int) (list []*EdbRefreshConfigItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.* FROM edb_refresh_config a 
+         JOIN  edb_refresh_mapping b ON a.edb_refresh_config_id = b.edb_refresh_config_id
+         WHERE b.source = ? AND b.sub_source = ? AND b.edb_info_id = ? ORDER BY a.edb_refresh_config_id ASC `
+	_, err = o.Raw(sql, source, subSource, edbInfoId).QueryRows(&list)
+
+	return
+}
+
+// EdbRefreshConfigAndEdbItem
+// @Description: 指标的刷新时间配置项
+type EdbRefreshConfigAndEdbItem struct {
+	RefreshFrequency    string `description:"刷新频率"`
+	RefreshFrequencyDay int    `description:"具体刷新的日期"`
+	RefreshTime         string `description:"刷新时间"`
+	RefreshAllData      int    `description:"是否刷新所有数据,0:否,1:刷新所有数据"`
+	RefreshDataNum      int    `description:"刷新单元格数"`
+	EdbInfoId           int    `description:"指标id,如果是数据源(钢联、有色金属)的,那么就是数据源里面的id"`
+	Source              int    `description:"来源"`
+	SubSource           int    `description:"子来源"`
+}
+
+// GetEdbRefreshConfigAndEdbListBySourceAndeEdbInfoId
+// @Description: 根据来源和指标获取其配置列表
+// @author: Roc
+// @datetime 2024-01-10 14:18:21
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @return list []*EdbRefreshDefaultConfig
+// @return err error
+func GetEdbRefreshConfigAndEdbListBySourceAndeEdbInfoId(source, subSource int, edbInfoIdList []int) (list []*EdbRefreshConfigAndEdbItem, err error) {
+	num := len(edbInfoIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.*,b.source,b.sub_source,b.edb_info_id FROM edb_refresh_config a 
+         JOIN  edb_refresh_mapping b ON a.edb_refresh_config_id = b.edb_refresh_config_id
+         WHERE b.source = ? AND b.sub_source = ? AND b.edb_info_id in (` + utils.GetOrmInReplace(num) + `)  ORDER BY a.edb_refresh_config_id ASC `
+	_, err = o.Raw(sql, source, subSource, edbInfoIdList).QueryRows(&list)
+
+	return
+}

+ 138 - 0
models/data_manage/edb_refresh/edb_refresh_default_config.go

@@ -0,0 +1,138 @@
+package edb_refresh
+
+import (
+	"errors"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbRefreshDefaultConfig
+// @Description: 指标的默认刷新时间配置表
+type EdbRefreshDefaultConfig struct {
+	Id                  int       `orm:"column(id);pk"`
+	Source              int       `description:"来源"`
+	SubSource           int       `description:"来源名称"`
+	Frequency           string    `description:"频度"`
+	RefreshFrequency    string    `description:"刷新频率"`
+	RefreshFrequencyDay int       `description:"具体刷新的日期"`
+	RefreshTime         string    `description:"刷新时间"`
+	RefreshAllData      int       `description:"是否刷新所有数据,0:否,1:刷新所有数据"`
+	RefreshDataNum      int       `description:"刷新单元格数"`
+	ModifyTime          time.Time `description:"最晚一次的更新时间"`
+	CreateTime          time.Time `description:"添加时间"`
+}
+
+// Add
+// @Description: 添加
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *EdbRefreshDefaultConfig) Add() (err error) {
+	if m.Id > 0 {
+		err = errors.New("该配置已存在")
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	lastId, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.Id = int(lastId)
+
+	return
+}
+
+// Update
+// @Description: 更新
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *EdbRefreshDefaultConfig) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+// Delete
+// @Description: 删除
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @return err error
+func (m *EdbRefreshDefaultConfig) Delete() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Delete(m)
+	return
+}
+
+// GetListBySourceAndFrequency
+// @Description: 根据来源和频度获取列表
+// @author: Roc
+// @datetime 2024-01-04 17:39:47
+// @param source int
+// @param subSource int
+// @param frequency string
+// @return list []*EdbRefreshDefaultConfig
+// @return err error
+func GetListBySourceAndFrequency(source, subSource int, frequency string) (list []*EdbRefreshDefaultConfig, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_refresh_default_config
+         WHERE source = ? AND sub_source = ? AND frequency = ? ORDER BY id ASC `
+	_, err = o.Raw(sql, source, subSource, frequency).QueryRows(&list)
+
+	return
+}
+
+// GetAllListBySourceList
+// @Description: 根据来源列表获取所有默认刷新配置列表
+// @author: Roc
+// @datetime 2024-01-10 14:54:54
+// @param source int
+// @param subSource int
+// @return list []*EdbRefreshDefaultConfig
+// @return err error
+func GetAllListBySourceList(source, subSource int) (list []*EdbRefreshDefaultConfig, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_refresh_default_config
+         WHERE source = ? AND sub_source = ? ORDER BY id ASC `
+	_, err = o.Raw(sql, source, subSource).QueryRows(&list)
+
+	return
+}
+
+// SaveEdbRefreshDefaultConfig
+// @Description: 保存配置项
+// @author: Roc
+// @datetime 2024-01-08 10:20:00
+// @param source int
+// @param subSource int
+// @param frequency string
+// @param newList []*EdbRefreshDefaultConfig
+// @return err error
+func SaveEdbRefreshDefaultConfig(source, subSource int, frequency string, newList []*EdbRefreshDefaultConfig) (err error) {
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+			return
+		}
+		_ = o.Commit()
+	}()
+
+	// 先删除
+	sql := `DELETE FROM edb_refresh_default_config WHERE source =? AND sub_source =? AND frequency =?`
+	_, err = o.Raw(sql, source, subSource, frequency).Exec()
+
+	// 再写入
+	_, err = o.InsertMulti(len(newList), newList)
+
+	return
+
+}

+ 68 - 0
models/data_manage/edb_refresh/edb_refresh_mapping.go

@@ -0,0 +1,68 @@
+package edb_refresh
+
+import (
+	"errors"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbRefreshMapping
+// @Description: 指标刷新时间配置关系表
+type EdbRefreshMapping struct {
+	EdbRefreshMappingId int       `orm:"column(edb_refresh_mapping_id);pk"`
+	Source              int       `description:"来源"`
+	SubSource           int       `description:"来源名称"`
+	EdbInfoId           int       `description:"指标id,如果是数据源(钢联、有色)的,那么就是数据源里面的id"`
+	EdbRefreshConfigId  int       `description:"刷新配置id"`
+	SysUserId           int       `description:"操作人id"`
+	SysUserRealName     string    `description:"操作人真实姓名"`
+	ModifyTime          time.Time `description:"最晚一次的更新时间"`
+	CreateTime          time.Time `description:"添加时间"`
+}
+
+// Add
+// @Description: 添加
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *EdbRefreshMapping) Add() (err error) {
+	if m.EdbRefreshMappingId > 0 {
+		err = errors.New("该配置已存在")
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	lastId, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.EdbRefreshMappingId = int(lastId)
+
+	return
+}
+
+// Update
+// @Description: 更新
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *EdbRefreshMapping) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+// Delete
+// @Description: 删除
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @return err error
+func (m *EdbRefreshMapping) Delete() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Delete(m)
+	return
+}

+ 51 - 0
models/data_manage/edb_refresh/edb_refresh_source.go

@@ -0,0 +1,51 @@
+package edb_refresh
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbRefreshSource
+// @Description: 刷新的数据源表
+type EdbRefreshSource struct {
+	Id            int       `orm:"column(id);pk"`
+	Source        int       `orm:"column(source)" description:"来源"`
+	SourceName    string    `description:"来源名称"`
+	SubSource     int       `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName string    `description:"子来源名称"`
+	HasChild      int       `description:"是否有子来源,0:否,1:是"`
+	ModifyTime    time.Time `description:"修改时间"`
+	CreateTime    time.Time `description:"创建时间"`
+}
+
+// EdbRefreshSourceList
+// @Description: 获取刷新的数据源列表
+type EdbRefreshSourceList struct {
+	Source        int                    `orm:"column(source)" description:"来源"`
+	SourceName    string                 `description:"来源名称"`
+	SubSource     int                    `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName string                 `description:"子来源名称"`
+	Child         []EdbRefreshSourceList `description:"子来源"`
+	HasChild      int                    `description:"是否有子来源,0:否,1:是"`
+}
+
+// GetAllList
+// @Description: 获取刷新数据源列表
+// @author: Roc
+// @datetime 2024-01-03 15:03:24
+// @return items []*EdbRefreshSource
+// @return err error
+func (m EdbRefreshSource) GetAllList() (items []*EdbRefreshSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM edb_refresh_source ORDER BY id ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type BaseClassifyItems struct {
+	ClassifyId   int                  `description:"分类id"`
+	ClassifyName string               `description:"分类名称"`
+	ParentId     int                  `description:"父级id"`
+	UniqueCode   string               `description:"唯一编码"`
+	Children     []*BaseClassifyItems `description:"下级"`
+}

+ 52 - 0
models/data_manage/edb_refresh/request/edb_info_refresh.go

@@ -0,0 +1,52 @@
+package request
+
+// SaveEdbRefreshDefaultConfigReq
+// @Description: 设置默认刷新时间配置
+type SaveEdbRefreshDefaultConfigReq struct {
+	Source    int                `description:"来源"`
+	SubSource int                `description:"子来源"`
+	Frequency string             `description:"频度"`
+	List      []RefreshConfigReq `description:"刷新配置项"`
+}
+
+// RefreshConfigReq
+// @Description: 刷新时间配置项
+type RefreshConfigReq struct {
+	RefreshFrequency    string `description:"刷新频率"`
+	RefreshFrequencyDay int    `description:"具体刷新的日期"`
+	RefreshTime         string `description:"刷新时间"`
+	RefreshAllData      int    `description:"是否刷新所有数据,0:否,1:刷新所有数据"`
+	RefreshDataNum      int    `description:"刷新单元格数"`
+}
+
+// SaveEdbRefreshConfigReq
+// @Description: 设置指标的刷新时间配置
+type SaveEdbRefreshConfigReq struct {
+	Source          int                `description:"来源"`
+	SubSource       int                `description:"子来源"`
+	ClassifyId      string             `description:"分类id,支持多选,用英文,隔开"`
+	TerminalCode    string             `description:"终端编码"`
+	SysUserId       string             `description:"操作人id,支持多选,用英文,隔开"`
+	Frequency       string             `description:"频度,支持多选,用英文,隔开"`
+	Keyword         string             `description:"关键字"`
+	Status          string             `description:"状态,枚举值:启用、暂停"`
+	IsSelectAll     bool               `description:"是否选择所有指标"`
+	EdbSelectIdList []int              `description:"选择的指标id列表"`
+	List            []RefreshConfigReq `description:"刷新配置项"`
+}
+
+// SaveEdbRefreshStatusReq
+// @Description: 设置指标的刷新状态
+type SaveEdbRefreshStatusReq struct {
+	Source          int    `description:"来源"`
+	SubSource       int    `description:"子来源"`
+	ClassifyId      string `description:"分类id,支持多选,用英文,隔开"`
+	TerminalCode    string `description:"终端编码"`
+	SysUserId       string `description:"操作人id,支持多选,用英文,隔开"`
+	Frequency       string `description:"频度,支持多选,用英文,隔开"`
+	Keyword         string `description:"关键字"`
+	Status          string `description:"状态,枚举值:启用、暂停"`
+	IsSelectAll     bool   `description:"是否选择所有指标"`
+	EdbSelectIdList []int  `description:"选择的指标id列表"`
+	ModifyStatus    string `description:"需要更改的状态,枚举值:启用、暂停"`
+}

+ 126 - 0
models/data_manage/mysteel_chemical_index.go

@@ -30,6 +30,8 @@ type BaseFromMysteelChemicalIndex struct {
 	Sort                              int       `description:"排序字段"`
 	MergeFilePath                     string    `description:"合并文件"`
 	TerminalCode                      string    `description:"终端编码"`
+	IsStop                            int       `description:"是否停更:1:停更,0:未停更"`
+	EndValue                          float64   `description:"指标的最新值"`
 }
 
 // Update 更新钢联化工指标基础信息
@@ -337,3 +339,127 @@ func GetMysteelChemicalGroupTerminalNum() (items []*TerminalNum, err error) {
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// BaseRefreshEdbInfo
+// @Description: 刷新配置的基础指标信息结构体
+type BaseRefreshEdbInfo struct {
+	EdbInfoId       int
+	ClassifyId      int    `description:"钢联化工指标分类id"`
+	IndexCode       string `description:"指标编码"`
+	IndexName       string `description:"指标名称"`
+	EndDate         string `description:"最新日期"`
+	EndValue        string `description:"最新值"`
+	SysUserId       int    `description:"创建人id"`
+	SysUserRealName string `description:"创建人姓名"`
+	Frequency       string `description:"频度"`
+	IsStop          int    `description:"是否停更:1:停更,0:未停更"`
+	TerminalCode    string `description:"终端编码"`
+	RefreshTime     string `description:"刷新时间"`
+}
+
+// RefreshBaseEdbInfoResp
+// @Description: 刷新数据源的数据返回
+type RefreshBaseEdbInfoResp struct {
+	Paging *paging.PagingItem
+	List   []*BaseRefreshEdbInfo
+}
+
+// GetMysteelChemicalBaseInfoList
+// @Description: 获取钢联化工数据列表
+// @author: Roc
+// @datetime 2024-01-10 14:28:35
+// @param condition string
+// @param pars []interface{}
+// @param orderBy string
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*BaseRefreshEdbInfo
+// @return err error
+func GetMysteelChemicalBaseInfoList(condition string, pars []interface{}, orderBy string, startSize, pageSize int) (total int, items []*BaseRefreshEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 数量汇总
+	totalSql := ` SELECT count(1) FROM base_from_mysteel_chemical_index WHERE 1=1 `
+	if condition != "" {
+		totalSql += condition
+	}
+	err = o.Raw(totalSql, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	// 列表数据
+	sql := ` SELECT base_from_mysteel_chemical_index_id as edb_info_id, base_from_mysteel_chemical_classify_id as classify_id,index_code,index_name,end_date,end_value,sys_user_id,sys_user_real_name,frequency,is_stop,terminal_code FROM base_from_mysteel_chemical_index WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+
+	if orderBy != "" {
+		sql += ` ORDER BY ` + orderBy
+	} else {
+		sql += ` ORDER BY base_from_mysteel_chemical_index_id ASC `
+	}
+	sql += `  LIMIT ?,? `
+
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// ModifyMysteelChemicalUpdateStatus
+// @Description:  修改钢联化工数据停更状态
+// @author: Roc
+// @datetime 2024-01-08 16:23:31
+// @param edbIdList []int
+// @param indexCodeList []string
+// @param isStop int
+// @return err error
+func ModifyMysteelChemicalUpdateStatus(edbIdList []int, indexCodeList []string, isStop int) (err error) {
+	idNum := len(edbIdList)
+	if idNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+			return
+		}
+		_ = o.Commit()
+	}()
+
+	// 更改数据源的更新状态
+	sql := ` UPDATE base_from_mysteel_chemical_index SET is_stop = ? WHERE base_from_mysteel_chemical_index_id IN (` + utils.GetOrmInReplace(idNum) + `) `
+	_, err = o.Raw(sql, isStop, edbIdList).Exec()
+	if err != nil {
+		return
+	}
+
+	codeNum := len(indexCodeList)
+	if codeNum <= 0 {
+		// 需要通过指标id列表查找code列表
+		sql := ` SELECT index_code FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_index_id IN (` + utils.GetOrmInReplace(idNum) + `) `
+		_, err = o.Raw(sql, edbIdList).QueryRows(&indexCodeList)
+		if err != nil {
+			return
+		}
+	}
+
+	codeNum = len(indexCodeList)
+	// 查出来的编码是空的话,那么就直接返回了
+	if codeNum <= 0 {
+		return
+	}
+
+	// 更改指标的更新状态
+	sql = ` UPDATE edb_info SET no_update = ? WHERE source = ? AND sub_source= ? AND edb_code IN (` + utils.GetOrmInReplace(codeNum) + `) `
+	_, err = o.Raw(sql, isStop, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, 0, indexCodeList).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}

+ 119 - 0
models/data_manage/smm_data.go

@@ -47,6 +47,8 @@ type SmmIndex struct {
 	FinishTime         string
 	CreateTime         string
 	ModifyTime         string
+	IsStop             int     `description:"是否停更:1:停更,0:未停更"`
+	EndValue           float64 `description:"指标的最新值"`
 }
 
 type SmmIndexItem struct {
@@ -68,6 +70,8 @@ type SmmIndexItem struct {
 	FinishTime         string
 	CreateTime         string
 	ModifyTime         string
+	IsStop             int     `description:"是否停更:1:停更,0:未停更"`
+	EndValue           float64 `description:"指标的最新值"`
 }
 
 func GetSmmIndex(condition string, pars interface{}) (items []*SmmIndex, err error) {
@@ -81,6 +85,21 @@ func GetSmmIndex(condition string, pars interface{}) (items []*SmmIndex, err err
 	return
 }
 
+// GetSmmIndexById
+// @Description: 根据id获取指标信息
+// @author: Roc
+// @datetime 2024-01-10 14:25:26
+// @param basFromSmmIndexId int
+// @return item *SmmIndex
+// @return err error
+func GetSmmIndexById(basFromSmmIndexId int) (item *SmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_smm_index WHERE base_from_smm_index_id = ?  `
+	err = o.Raw(sql, basFromSmmIndexId).QueryRow(&item)
+
+	return
+}
+
 type SmmExportIndex struct {
 	TypeName   string
 	IndexCode  string
@@ -230,3 +249,103 @@ func GetExportSmmIndexDataByCodes(indexCodes []string) (items []*ExportSmmIndexD
 	_, err = o.Raw(sql, indexCodes).QueryRows(&items)
 	return
 }
+
+// GetSmmBaseInfoList
+// @Description: 获取有色数据列表
+// @author: Roc
+// @datetime 2024-01-10 14:28:29
+// @param condition string
+// @param pars []interface{}
+// @param orderBy string
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return items []*BaseRefreshEdbInfo
+// @return err error
+func GetSmmBaseInfoList(condition string, pars []interface{}, orderBy string, startSize, pageSize int) (total int, items []*BaseRefreshEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	// 数量汇总
+	totalSql := ` SELECT count(1) FROM base_from_smm_index WHERE 1=1 `
+	if condition != "" {
+		totalSql += condition
+	}
+	err = o.Raw(totalSql, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+
+	// 列表数据
+	sql := ` SELECT base_from_smm_index_id as edb_info_id, classify_id,index_code,index_name,end_date,end_value,frequency,is_stop,terminal_code FROM base_from_smm_index WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+
+	if orderBy != "" {
+		sql += ` ORDER BY ` + orderBy
+	} else {
+		sql += ` ORDER BY base_from_smm_index_id ASC `
+	}
+	sql += `  LIMIT ?,? `
+
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// ModifySmmUpdateStatus
+// @Description:  修改有色数据停更状态
+// @author: Roc
+// @datetime 2024-01-08 16:23:31
+// @param edbIdList []int
+// @param indexCodeList []string
+// @param isStop int
+// @return err error
+func ModifySmmUpdateStatus(edbIdList []int, indexCodeList []string, isStop int) (err error) {
+	idNum := len(edbIdList)
+	if idNum <= 0 {
+		return
+	}
+	o, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = o.Rollback()
+			return
+		}
+		_ = o.Commit()
+	}()
+
+	// 更改数据源的更新状态
+	sql := ` UPDATE base_from_smm_index SET is_stop = ? WHERE base_from_smm_index_id IN (` + utils.GetOrmInReplace(idNum) + `) `
+	_, err = o.Raw(sql, isStop, edbIdList).Exec()
+	if err != nil {
+		return
+	}
+
+	codeNum := len(indexCodeList)
+	if codeNum <= 0 {
+		// 需要通过指标id列表查找code列表
+		sql := ` SELECT index_code FROM base_from_smm_index WHERE base_from_smm_index_id IN (` + utils.GetOrmInReplace(idNum) + `) `
+		_, err = o.Raw(sql, edbIdList).QueryRows(&indexCodeList)
+		if err != nil {
+			return
+		}
+	}
+
+	codeNum = len(indexCodeList)
+	// 查出来的编码是空的话,那么就直接返回了
+	if codeNum <= 0 {
+		return
+	}
+
+	// 更改指标的更新状态
+	sql = ` UPDATE edb_info SET no_update = ? WHERE source = ? AND sub_source= ? AND edb_code IN (` + utils.GetOrmInReplace(codeNum) + `) `
+	_, err = o.Raw(sql, isStop, utils.DATA_SOURCE_YS, 0, indexCodeList).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}

+ 114 - 0
models/data_source/icpi.go

@@ -0,0 +1,114 @@
+package data_source
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type BaseFromIcpiIndex struct {
+	BaseFromIcpiIndexId    int       `orm:"column(base_from_icpi_index_id);pk"`
+	BaseFromIcpiClassifyId int       `description:"分类id"`
+	IndexCode              string    `description:"指标编码"`
+	IndexName              string    `description:"指标名称"`
+	Frequency              string    `description:"频度"`
+	StartDate              time.Time `description:"开始日期"`
+	EndDate                time.Time `description:"结束日期"`
+	CreateTime             time.Time `description:"创建时间"`
+	ModifyTime             time.Time `description:"修改时间"`
+}
+
+type BaseFromIcpiData struct {
+	BaseFromIcpiDataId  int       `orm:"column(base_from_icpi_data_id);pk"`
+	BaseFromIcpiIndexId int       `description:"指标id"`
+	IndexCode           string    `description:"指标编码"`
+	DataTime            string    `description:"日期"`
+	Value               string    `description:"值"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+}
+
+type BaseFromIcpiClassify struct {
+	BaseFromIcpiClassifyId int    `orm:"column(base_from_icpi_classify_id);pk"`
+	ClassifyName           string `description:"分类名称"`
+	ClassifyNameEn         string `description:"英文名称"`
+	ParentId               int    `description:"上级id"`
+	CreateTime             string `description:"创建时间"`
+	ModifyTime             string `description:"修改时间"`
+}
+
+func (obj *BaseFromIcpiIndex) GetBaseFromIcpiClassifyAll() (list []*BaseFromIcpiClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_icpi_classify `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromIcpiDataView struct {
+	BaseFromIcpiDataId  int       `orm:"column(base_from_icpi_data_id);pk"`
+	BaseFromIcpiIndexId int       `description:"指标id"`
+	IndexCode           string    `description:"指标编码"`
+	DataTime            string    `description:"日期"`
+	Value               string    `description:"值"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+}
+
+type BaseFromIcpiIndexView struct {
+	BaseFromIcpiIndexId    int    `description:"指标id"`
+	BaseFromIcpiClassifyId int    `description:"分类id"`
+	IndexCode              string `description:"指标编码"`
+	IndexName              string `description:"指标名称"`
+	Frequency              string `description:"频度"`
+	Unit                   string `description:"单位"`
+	StartDate              string `description:"开始日期"`
+	EndDate                string `description:"结束日期"`
+	CreateTime             string `description:"创建时间"`
+	ModifyTime             string `description:"修改时间"`
+	DataList               []*BaseFromIcpiDataView
+	Paging                 *paging.PagingItem `description:"分页数据"`
+}
+
+func (obj *BaseFromIcpiIndex) GetIcpiIndex(condition string, pars interface{}) (items []*BaseFromIcpiIndexView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_icpi_index WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY base_from_icpi_index_id ASC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (obj *BaseFromIcpiIndex) GetIcpiIndexDataCount(indexCode string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count  FROM base_from_icpi_data WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	return
+}
+
+func (obj *BaseFromIcpiIndex) GetIcpiIndexData(indexCode string, startSize, pageSize int) (items []*BaseFromIcpiDataView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM base_from_icpi_data WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func (obj *BaseFromIcpiIndex) GetIcpiDataMaxCount(classifyId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT MAX(t.num) AS count FROM (
+				SELECT COUNT(1) AS num  FROM base_from_icpi_index AS a
+				INNER JOIN base_from_icpi_data AS b ON a.base_from_icpi_index_id=b.base_from_icpi_index_id
+				WHERE a.base_from_icpi_classify_id=?
+				GROUP BY a.base_from_icpi_index_id
+			)AS t `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+func (obj *BaseFromIcpiIndex) GetIcpiIndexDataByCode(indexCode string) (items []*BaseFromIcpiDataView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM base_from_icpi_data WHERE index_code=? ORDER BY data_time DESC  `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}

+ 14 - 0
models/db.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/data_manage/chart_theme"
 	"eta/eta_api/models/data_manage/cross_variety"
+	"eta/eta_api/models/data_manage/edb_refresh"
 	"eta/eta_api/models/data_manage/excel"
 	future_good2 "eta/eta_api/models/data_manage/future_good"
 	"eta/eta_api/models/data_manage/supply_analysis"
@@ -182,6 +183,9 @@ func init() {
 	// 初始化图表主题
 	initChartTheme()
 
+	// 初始化指标刷新
+	initEdbRefresh()
+
 	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
 	data_manage.InitEdbSourceVar()
 }
@@ -534,3 +538,13 @@ func initChartTheme() {
 		new(chart_theme.ChartThemeDefaultData), //默认数据
 	)
 }
+
+// initEdbRefresh 初始化指标刷新
+func initEdbRefresh() {
+	orm.RegisterModel(
+		new(edb_refresh.EdbRefreshSource),        // 刷新的数据源表
+		new(edb_refresh.EdbRefreshDefaultConfig), // 指标的默认刷新时间配置表
+		new(edb_refresh.EdbRefreshConfig),        // 指标的刷新时间配置表
+		new(edb_refresh.EdbRefreshMapping),       // 指标刷新时间配置关系表
+	)
+}

+ 1 - 1
models/target.go

@@ -244,7 +244,7 @@ type EdbinfoAddReq struct {
 
 // GetMaxTradeCode 获取指标最大trade_code
 func GetMaxTradeCode() (max_trade_code string, err error) {
-	sql := " SELECT MAX(TRADE_CODE) AS max_trade_code FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' AND TRADE_CODE not like '%index%'"
+	sql := " SELECT MAX(TRADE_CODE) AS max_trade_code FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' AND TRADE_CODE not like '%index%' and TRADE_CODE NOT LIKE 'WDC%'"
 	o := orm.NewOrmUsingDB("edb")
 	err = o.Raw(sql).QueryRow(&max_trade_code)
 	if (err != nil && err.Error() == utils.ErrNoRow()) || max_trade_code == `` {

+ 153 - 0
routers/commentsRouter.go

@@ -2959,6 +2959,78 @@ 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: "RefreshClassifyList",
+            Router: `/edb_info/refresh/classify_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: "SaveEdbRefreshConfig",
+            Router: `/edb_info/refresh/config/save`,
+            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: "GetEdbRefreshDefaultConfig",
+            Router: `/edb_info/refresh/default_config`,
+            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: "SaveEdbRefreshDefaultConfig",
+            Router: `/edb_info/refresh/default_config/save`,
+            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: "GetEdbRefreshEdbConfig",
+            Router: `/edb_info/refresh/edb_config`,
+            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: "RefreshEdbList",
+            Router: `/edb_info/refresh/edb_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: "RefreshSourceList",
+            Router: `/edb_info/refresh/source_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: "SaveEdbRefreshStatus",
+            Router: `/edb_info/refresh/status/save`,
+            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: "RelationChartList",
@@ -4318,6 +4390,33 @@ 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: "IcpiClassifyList",
+            Router: `/icpi/classify/list`,
+            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: "ExportIcpiDataList",
+            Router: `/icpi/export/icpiDataList`,
+            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: "IcpiData",
+            Router: `/icpi/index/data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
         beego.ControllerComments{
             Method: "EdbDeleteLog",
@@ -8179,6 +8278,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
+        beego.ControllerComments{
+            Method: "MtjhClassify",
+            Router: `/data/mtjh/classify`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
+        beego.ControllerComments{
+            Method: "MtjhData",
+            Router: `/data/mtjh/data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
+        beego.ControllerComments{
+            Method: "MtjhFrequency",
+            Router: `/data/mtjh/frequency`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
+        beego.ControllerComments{
+            Method: "MtjhSearchList",
+            Router: `/data/mtjh/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
+        beego.ControllerComments{
+            Method: "MtjhSingleData",
+            Router: `/data/mtjh/single_data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
         beego.ControllerComments{
             Method: "ShfeDataList",
@@ -8206,6 +8350,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TradeCommonController"],
+        beego.ControllerComments{
+            Method: "ExportMtjhList",
+            Router: `/export/mtjh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:UserLoginController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:UserLoginController"],
         beego.ControllerComments{
             Method: "AreaCodeList",

+ 2 - 0
services/aws_s3.go

@@ -9,6 +9,7 @@ import (
 	"github.com/aws/aws-sdk-go/aws/session"
 	"github.com/aws/aws-sdk-go/service/s3"
 	"io/ioutil"
+	"os"
 	"time"
 )
 
@@ -58,6 +59,7 @@ func (m *S3Oss) UploadFile(fileName, localFile, savePath string) (resourceUrl st
 		if err != nil {
 			fmt.Println(err.Error())
 		}
+		_ = os.Remove(localFile)
 	}()
 
 	endpoint := utils.S3Endpoint

+ 4 - 0
services/data/base_edb_lib.go

@@ -69,6 +69,8 @@ func AddEdbData(source int, edbCode string) (resp *models.BaseResponse, err erro
 		urlStr = "fubao/add"
 	case utils.DATA_SOURCE_GFEX:
 		urlStr = "gz/add"
+	case utils.DATA_SOURCE_ICPI:
+		urlStr = "icpi/add"
 	default:
 		edbSource := data_manage.EdbSourceIdMap[source]
 		if edbSource != nil {
@@ -250,6 +252,8 @@ func RefreshEdbData(edbInfoId, source, subSource int, edbCode, startDate string)
 		urlStr = "fubao/refresh"
 	case utils.DATA_SOURCE_GFEX:
 		urlStr = "gz/refresh"
+	case utils.DATA_SOURCE_ICPI:
+		urlStr = "icpi/refresh"
 	default:
 		edbSource := data_manage.EdbSourceIdMap[source]
 		if edbSource != nil {

+ 7 - 1
services/data/edb_info.go

@@ -155,6 +155,9 @@ func getEdbInfoIdList(edbInfoIdList []int) (newBaseEdbInfoArr, newBasePredictEdb
 		for _, edbInfo := range tmpBaseEdbInfoArr {
 			if _, ok := newBaseMap[edbInfo.EdbInfoId]; !ok {
 				newBaseMap[edbInfo.EdbInfoId] = edbInfo
+				if edbInfo.NoUpdate == 1 {
+					continue
+				}
 				newBaseEdbInfoArr = append(newBaseEdbInfoArr, edbInfo)
 			}
 		}
@@ -2424,6 +2427,7 @@ func TraceEdbInfoByEdbInfoId(edbInfoId int) (traceEdbInfo data_manage.TraceEdbIn
 		//Source:      edbInfo.Source,
 		UniqueCode: edbInfo.UniqueCode,
 		ClassifyId: edbInfo.ClassifyId,
+		IsStop:     edbInfo.NoUpdate,
 		EdbInfo:    edbInfo,
 	}
 	findIdMap := make(map[int]int)
@@ -2472,6 +2476,7 @@ func TraceEdbInfoByEdbInfoIdList(edbInfoIdList []int) (traceEdbInfoList []data_m
 			//Source:      edbInfo.Source,
 			UniqueCode: edbInfo.UniqueCode,
 			ClassifyId: edbInfo.ClassifyId,
+			IsStop:     edbInfo.NoUpdate,
 			EdbInfo:    edbInfo,
 		}
 		traceEdbInfo.Child, err = traceEdbInfoByEdbInfoId(edbInfo.EdbInfoId, traceEdbInfo, edbInfoRuleMap, findIdMap, existMap, edbMappingMap)
@@ -2537,11 +2542,12 @@ func traceEdbInfoByEdbInfoId(edbInfoId int, traceEdbInfo data_manage.TraceEdbInf
 			EdbType:     v.FromEdbType,
 			UniqueCode:  v.FromUniqueCode,
 			ClassifyId:  v.FromClassifyId,
+			IsStop:      v.NoUpdate,
 			EdbInfo:     edbInfoMap[v.FromEdbInfoId],
 		}
 
 		// 计算指标/预测指标继续溯源
-		if v.FromEdbType == 2 || v.FromEdbInfoType == 1 {
+		if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
 			// 查过了就不查了
 			if _, ok2 := findIdMap[tmpEdbInfoId]; !ok2 {
 				tmpTraceEdbInfo.Child, e = traceEdbInfoByEdbInfoId(tmpEdbInfoId, tmpTraceEdbInfo, edbInfoRuleMap, findIdMap, existMap, edbMappingMap)

+ 638 - 0
services/data/edb_info_refresh.go

@@ -0,0 +1,638 @@
+package data
+
+import (
+	"encoding/json"
+	"errors"
+	"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/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// 所有刷新配置key
+var allDefaultEdbRefreshConfigKey = `edb_refresh_config:default:all:`
+
+// GetAllDefaultEdbRefreshConfigListBySourceList
+// @Description: 获取默认的所有刷新配置列表
+// @author: Roc
+// @datetime 2024-01-10 15:03:36
+// @param source int
+// @param subSource int
+// @return list []*edb_refresh.EdbRefreshDefaultConfig
+// @return err error
+func GetAllDefaultEdbRefreshConfigListBySourceList(source, subSource int) (list []*edb_refresh.EdbRefreshDefaultConfig, err error) {
+	key := getAllDefaultEdbRefreshConfigKey(source, subSource)
+	if utils.Re == nil {
+		if utils.Re == nil && utils.Rc.IsExist(key) {
+			if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
+				err = json.Unmarshal(data, &list)
+				return
+			}
+		}
+	}
+
+	list, err = edb_refresh.GetAllListBySourceList(source, subSource)
+	if err != nil {
+		return
+	}
+
+	// 将数据加入缓存
+	if utils.Re == nil {
+		data, _ := json.Marshal(list)
+		utils.Rc.Put(key, data, 2*time.Hour)
+	}
+
+	return
+}
+
+// SaveEdbRefreshDefaultConfig
+// @Description: 设置默认的指标刷新配置接口
+// @author: Roc
+// @datetime 2024-01-10 15:11:19
+// @param source int
+// @param subSource int
+// @param frequency string
+// @param list []request.RefreshConfigReq
+// @return err error
+// @return errMsg string
+// @return isSendEmail bool
+func SaveEdbRefreshDefaultConfig(source, subSource int, frequency string, list []request.RefreshConfigReq) (err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = `保存失败`
+
+	if source <= 0 {
+		errMsg = "来源不能为空"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	// 非有色的来源,频度不能为空
+	if source != utils.DATA_SOURCE_YS && frequency == `` {
+		errMsg = "频度不能为空"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	lenConf := len(list)
+	if lenConf == 0 {
+		errMsg = "至少需要一个刷新配置"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if lenConf > 5 {
+		errMsg = "刷新时间设置最多不超过5个"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	tmpArr := []string{"每周", "每旬", "每月", "每季", "每半年", "每年"}
+	// 配置的map,避免同一种类型配置同一个时间
+	configMap := make(map[string]string)
+	for _, v := range list {
+		if utils.InArrayByStr(tmpArr, v.RefreshFrequency) && v.RefreshFrequencyDay < 0 {
+			errMsg = "请选择具体日期"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		if v.RefreshTime == "" {
+			errMsg = "请选择具体时间"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		// 配置的map,避免同一种类型配置同一个时间
+		key := fmt.Sprint(v.RefreshFrequency, "_", v.RefreshFrequencyDay, "_", v.RefreshTime)
+		if _, ok := configMap[key]; ok {
+			errMsg = "刷新频率和日期不能重复"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		configMap[key] = key
+	}
+
+	addList := make([]*edb_refresh.EdbRefreshDefaultConfig, 0)
+	for _, v := range list {
+		addList = append(addList, &edb_refresh.EdbRefreshDefaultConfig{
+			Source:              source,
+			SubSource:           subSource,
+			Frequency:           frequency,
+			RefreshFrequency:    v.RefreshFrequency,
+			RefreshFrequencyDay: v.RefreshFrequencyDay,
+			RefreshAllData:      v.RefreshAllData,
+			RefreshTime:         v.RefreshTime,
+			RefreshDataNum:      v.RefreshDataNum,
+			ModifyTime:          time.Now(),
+			CreateTime:          time.Now(),
+		})
+	}
+
+	// 保存
+	err = edb_refresh.SaveEdbRefreshDefaultConfig(source, subSource, frequency, addList)
+
+	// 清除缓存
+	{
+		key := getAllDefaultEdbRefreshConfigKey(source, subSource)
+		if utils.Re == nil {
+			_ = utils.Rc.Delete(key)
+		}
+	}
+
+	return
+}
+
+// SaveEdbRefreshConfig
+// @Description: 设置指标刷新配置接口
+// @author: Roc
+// @datetime 2024-01-10 15:41:45
+// @param source int
+// @param subSource int
+// @param classifyId string
+// @param terminalCode string
+// @param frequency string
+// @param keyword string
+// @param status string
+// @param sysUserIdStr string
+// @param isSelectAll bool
+// @param list []request.RefreshConfigReq
+// @param edbSelectIdList []int
+// @param sysUserId int
+// @param sysUserRealName string
+// @return err error
+// @return errMsg string
+// @return isSendEmail bool
+func SaveEdbRefreshConfig(source, subSource int, classifyId, terminalCode, frequency, keyword, status, sysUserIdStr string, isSelectAll bool, list []request.RefreshConfigReq, edbSelectIdList []int, sysUserId int, sysUserRealName string) (err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = `保存失败`
+
+	if source <= 0 {
+		errMsg = "来源不能为空"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	lenConf := len(list)
+	if lenConf == 0 {
+		errMsg = "至少需要一个刷新配置"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if lenConf > 5 {
+		errMsg = "刷新时间设置最多不超过5个"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	tmpArr := []string{"每周", "每旬", "每月", "每季", "每半年", "每年"}
+
+	// 配置的map,避免同一种类型配置同一个时间
+	configMap := make(map[string]string)
+	for _, v := range list {
+		if utils.InArrayByStr(tmpArr, v.RefreshFrequency) && v.RefreshFrequencyDay < 0 {
+			errMsg = "请选择具体日期"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		if v.RefreshTime == "" {
+			errMsg = "请选择具体时间"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		// 配置的map,避免同一种类型配置同一个时间
+		key := fmt.Sprint(v.RefreshFrequency, "_", v.RefreshFrequencyDay, "_", v.RefreshTime)
+		if _, ok := configMap[key]; ok {
+			errMsg = "刷新频率和日期不能重复"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		configMap[key] = key
+	}
+
+	edbIdList := make([]int, 0)
+	// 指标id列表
+	if isSelectAll {
+		// 如果是列表全选
+		_, edbList, tmpErr := GetList(source, subSource, classifyId, terminalCode, sysUserIdStr, frequency, keyword, status, 0, 100000, "", "")
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			err = tmpErr
+			return
+		}
+
+		// 不配置的指标id
+		notIdMap := make(map[int]int, 0)
+		for _, v := range edbSelectIdList {
+			notIdMap[v] = v
+		}
+
+		for _, v := range edbList {
+			_, ok := notIdMap[v.EdbInfoId]
+			// 在不配置的指标id列表内的话,那就过滤
+			if ok {
+				continue
+			}
+
+			// 加入到待配置的指标列表id
+			edbIdList = append(edbIdList, v.EdbInfoId)
+		}
+	} else {
+		edbIdList = edbSelectIdList
+	}
+
+	if len(edbIdList) <= 0 {
+		errMsg = "指标不能为空"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	// 待添加的配置关系数据
+	addMappingList := make([]*edb_refresh.EdbRefreshMapping, 0)
+
+	// 待添加的日期配置项
+	addConfigList := make([]*edb_refresh.EdbRefreshConfig, 0)
+	for _, v := range list {
+		item, tmpErr := edb_refresh.GetEdbRefreshConfigListByCondition(v.RefreshFrequency, v.RefreshTime, v.RefreshFrequencyDay, v.RefreshAllData, v.RefreshDataNum)
+		if tmpErr != nil {
+			if tmpErr.Error() != utils.ErrNoRow() {
+				err = tmpErr
+				return
+			}
+
+			addConfigList = append(addConfigList, &edb_refresh.EdbRefreshConfig{
+				RefreshFrequency:    v.RefreshFrequency,
+				RefreshFrequencyDay: v.RefreshFrequencyDay,
+				RefreshTime:         v.RefreshTime,
+				RefreshAllData:      v.RefreshAllData,
+				RefreshDataNum:      v.RefreshDataNum,
+				ModifyTime:          time.Now(),
+				CreateTime:          time.Now(),
+			})
+			continue
+		}
+
+		for _, edbId := range edbIdList {
+			addMappingList = append(addMappingList, &edb_refresh.EdbRefreshMapping{
+				EdbRefreshMappingId: 0,
+				Source:              source,
+				SubSource:           subSource,
+				EdbInfoId:           edbId,
+				EdbRefreshConfigId:  item.EdbRefreshConfigId,
+				SysUserId:           sysUserId,
+				SysUserRealName:     sysUserRealName,
+				ModifyTime:          time.Now(),
+				CreateTime:          time.Now(),
+			})
+		}
+	}
+
+	// 保存
+	err = edb_refresh.SaveEdbRefreshConfig(source, subSource, sysUserId, sysUserRealName, addConfigList, addMappingList, edbIdList)
+
+	return
+}
+
+// HandleRefreshTime
+// @Description: 处理刷新时间的显示
+// @author: Roc
+// @datetime 2024-01-10 17:00:03
+// @param source int
+// @param subSource int
+// @param list []*data_manage.BaseRefreshEdbInfo
+// @return newList []*data_manage.BaseRefreshEdbInfo
+// @return err error
+// @return errMsg string
+// @return isSendEmail bool
+func HandleRefreshTime(source, subSource int, list []*data_manage.BaseRefreshEdbInfo) (newList []*data_manage.BaseRefreshEdbInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	errMsg = "获取失败"
+	newList = list
+
+	// 默认刷新配置
+	defaultEdbRefreshConfigMap := make(map[string]string)
+	{
+		// 获取默认配置
+		allDefaultEdbRefreshConfigList, tmpErr := GetAllDefaultEdbRefreshConfigListBySourceList(source, subSource)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		defaultEdbRefreshConfigListMap := make(map[string][]string)
+		for _, v := range allDefaultEdbRefreshConfigList {
+			tmp, ok := defaultEdbRefreshConfigListMap[v.Frequency]
+			if !ok {
+				tmp = make([]string, 0)
+			}
+			defaultEdbRefreshConfigListMap[v.Frequency] = append(tmp, GetRefreshStr(v.RefreshFrequency, v.RefreshFrequencyDay, v.RefreshTime))
+		}
+		for k, v := range defaultEdbRefreshConfigListMap {
+			defaultEdbRefreshConfigMap[k] = strings.Join(v, ",")
+		}
+
+	}
+
+	edbInfoIdList := make([]int, 0)
+	for _, v := range newList {
+		edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+	}
+
+	// 指标的刷新时间配置
+	edbRefreshConfigMap := make(map[int]string)
+	{
+		// 获取指标的单独配置
+		configList, tmpErr := edb_refresh.GetEdbRefreshConfigAndEdbListBySourceAndeEdbInfoId(source, subSource, edbInfoIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		edbRefreshConfigListMap := make(map[int][]string)
+		for _, v := range configList {
+			tmp, ok := edbRefreshConfigListMap[v.EdbInfoId]
+			if !ok {
+				tmp = make([]string, 0)
+			}
+			edbRefreshConfigListMap[v.EdbInfoId] = append(tmp, GetRefreshStr(v.RefreshFrequency, v.RefreshFrequencyDay, v.RefreshTime))
+		}
+		for k, v := range edbRefreshConfigListMap {
+			edbRefreshConfigMap[k] = strings.Join(v, ",")
+		}
+	}
+
+	// 处理刷新时间
+	for _, v := range newList {
+		refreshTime, ok := edbRefreshConfigMap[v.EdbInfoId]
+		if ok {
+			v.RefreshTime = refreshTime
+			continue
+		}
+		if source == utils.DATA_SOURCE_YS {
+			v.RefreshTime = defaultEdbRefreshConfigMap[``]
+		} else {
+			v.RefreshTime = defaultEdbRefreshConfigMap[v.Frequency]
+		}
+	}
+
+	return
+}
+
+// GetList
+// @Description: 获取指标列表
+// @author: Roc
+// @datetime 2024-01-08 15:14:16
+// @param source int
+// @param subSource int
+// @param classifyId string
+// @param terminalCode string
+// @param sysUserId string
+// @param frequency string
+// @param keyword string
+// @param startSize int
+// @param pageSize int
+// @return total int
+// @return list []*data_manage.BaseRefreshEdbInfo
+// @return err error
+func GetList(source, subSource int, classifyId, terminalCode, sysUserId, frequency, keyword, status string, startSize, pageSize int, sortParam, sortType string) (total int, list []*data_manage.BaseRefreshEdbInfo, err error) {
+	var pars []interface{}
+	var condition string
+
+	list = make([]*data_manage.BaseRefreshEdbInfo, 0)
+
+	isStop := -1
+	if status == `暂停` {
+		isStop = 1
+	} else if status == "启用" {
+		isStop = 0
+	}
+
+	switch source {
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL: // 钢联
+		if classifyId != `` {
+			classifyIdSlice := strings.Split(classifyId, ",")
+			condition += ` AND base_from_mysteel_chemical_classify_id IN (` + utils.GetOrmInReplace(len(classifyIdSlice)) + `)`
+			pars = append(pars, classifyIdSlice)
+		}
+		if terminalCode != `` {
+			condition += " AND terminal_code = ? "
+			pars = append(pars, terminalCode)
+		}
+		if sysUserId != `` {
+			sysUserIdSlice := strings.Split(sysUserId, ",")
+			condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
+			pars = append(pars, sysUserIdSlice)
+		}
+		if frequency != `` {
+			frequencySlice := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencySlice)) + `)`
+			pars = append(pars, frequencySlice)
+		}
+		if keyword != `` {
+			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)
+			}
+		}
+
+		if isStop >= 0 {
+			condition += " AND is_stop = ? "
+			pars = append(pars, isStop)
+		}
+		sortStr := ``
+		if sortParam != `` {
+			sortStr = fmt.Sprintf("%s %s,base_from_mysteel_chemical_index_id desc ", sortParam, sortType)
+		}
+		total, list, err = data_manage.GetMysteelChemicalBaseInfoList(condition, pars, sortStr, startSize, pageSize)
+	case utils.DATA_SOURCE_YS: // 有色
+		if classifyId != `` {
+			classifyIdSlice := strings.Split(classifyId, ",")
+			condition += ` AND classify_id IN (` + utils.GetOrmInReplace(len(classifyIdSlice)) + `)`
+			pars = append(pars, classifyIdSlice)
+		}
+		if terminalCode != `` {
+			condition += " AND terminal_code = ? "
+			pars = append(pars, terminalCode)
+		}
+		if frequency != `` {
+			frequencySlice := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencySlice)) + `)`
+			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)
+			}
+		}
+
+		if isStop >= 0 {
+			condition += " AND is_stop = ? "
+			pars = append(pars, isStop)
+		}
+
+		sortStr := ``
+		if sortParam != `` {
+			sortStr = fmt.Sprintf("%s %s,base_from_smm_index_id desc ", sortParam, sortType)
+		}
+
+		total, list, err = data_manage.GetSmmBaseInfoList(condition, pars, sortStr, startSize, pageSize)
+	default:
+		condition += ` AND source = ? AND sub_source = ? `
+		pars = append(pars, source, subSource)
+
+		if isStop >= 0 {
+			condition += " AND no_update = ? "
+			pars = append(pars, isStop)
+		}
+
+		if classifyId != `` {
+			classifyIdSlice := strings.Split(classifyId, ",")
+			condition += ` AND classify_id IN (` + utils.GetOrmInReplace(len(classifyIdSlice)) + `)`
+			pars = append(pars, classifyIdSlice)
+		}
+		if terminalCode != `` {
+			condition += " AND terminal_code = ? "
+			pars = append(pars, terminalCode)
+		}
+		if sysUserId != `` {
+			sysUserIdSlice := strings.Split(sysUserId, ",")
+			condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
+			pars = append(pars, sysUserIdSlice)
+		}
+		if frequency != `` {
+			frequencySlice := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencySlice)) + `)`
+			pars = append(pars, frequencySlice)
+		}
+		if keyword != `` {
+			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)
+			}
+		}
+
+		sortStr := ``
+		if sortParam != `` {
+			sortStr = fmt.Sprintf("%s %s,edb_info_id desc ", sortParam, sortType)
+		}
+
+		total, list, err = data_manage.GetEdbBaseInfoList(condition, pars, sortStr, startSize, pageSize)
+	}
+
+	return
+}
+
+// getAllDefaultEdbRefreshConfigKey
+// @Description: 获取默认的所有刷新配置key
+// @author: Roc
+// @datetime 2024-01-10 15:02:49
+// @param source int
+// @param subSource int
+// @return string
+func getAllDefaultEdbRefreshConfigKey(source, subSource int) string {
+	return allDefaultEdbRefreshConfigKey + fmt.Sprintf("%d_%d", source, subSource)
+}
+
+// GetRefreshStr
+// @Description: 获取刷新配置的中文字符串
+// @author: Roc
+// @datetime 2024-01-10 16:05:10
+// @param refreshFrequency string
+// @param refreshFrequencyDay int
+// @param refreshTime string
+// @return string
+func GetRefreshStr(refreshFrequency string, refreshFrequencyDay int, refreshTime string) string {
+	refreshDayStr := ``
+	//if refreshFrequency != "每自然日" && refreshFrequency != "每交易日"
+	switch refreshFrequency {
+	case "每自然日", "每交易日":
+	case "每周":
+		switch refreshFrequencyDay {
+		case 0:
+			refreshDayStr = "日"
+		case 1:
+			refreshDayStr = "一"
+		case 2:
+			refreshDayStr = "二"
+		case 3:
+			refreshDayStr = "三"
+		case 4:
+			refreshDayStr = "四"
+		case 5:
+			refreshDayStr = "五"
+		case 6:
+			refreshDayStr = "六"
+		case 7:
+			refreshDayStr = "日"
+		}
+	default:
+		if refreshFrequencyDay > 0 {
+			refreshDayStr = fmt.Sprintf("第%d天", refreshFrequencyDay)
+		} else {
+			refreshDayStr = `最后一天`
+		}
+	}
+	return refreshFrequency + refreshDayStr + " " + refreshTime
+}

+ 4 - 0
services/minio.go

@@ -7,6 +7,7 @@ import (
 	"github.com/minio/minio-go/v7"
 	"github.com/minio/minio-go/v7/pkg/credentials"
 	"log"
+	"os"
 	"time"
 )
 
@@ -403,6 +404,9 @@ type MinioOss struct{}
 
 // UploadFile 上传文件
 func (m *MinioOss) UploadFile(fileName, filePath, savePath string) (string, error) {
+	defer func() {
+		_ = os.Remove(filePath)
+	}()
 	if utils.MinIoAccessKeyId == `` || utils.MinIoAccessKeySecret == `` {
 		return "0", errors.New("MinIo信息未配置")
 	}

+ 4 - 0
services/oss.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/services/alarm_msg"
 	"fmt"
 	"github.com/aliyun/aliyun-oss-go-sdk/oss"
+	"os"
 	"time"
 
 	"eta/eta_api/utils"
@@ -255,6 +256,9 @@ type AliOss struct{}
 
 // UploadFile 上传文件
 func (m *AliOss) UploadFile(fileName, filePath, savePath string) (string, error) {
+	defer func() {
+		_ = os.Remove(filePath)
+	}()
 	if utils.AccessKeyId == `` {
 		return "0", errors.New("阿里云信息未配置")
 	}

+ 1 - 0
utils/constants.go

@@ -169,6 +169,7 @@ const (
 	DATA_SOURCE_CALCULATE_ZDYFX                                 // 自定义分析->74
 	DATA_SOURCE_CALCULATE_RJZ                                   // 日均值计算->75
 	DATA_SOURCE_GFEX                                 = 78       // 广州期货交易所->78
+	DATA_SOURCE_ICPI                                 = 79       // ICPI消费价格指数->79
 )
 
 // 数据刷新频率