浏览代码

Merge remote-tracking branch 'origin/master' into pool/94

# Conflicts:
#	utils/config.go
#	utils/constants.go
Roc 1 月之前
父节点
当前提交
4e2376717f
共有 100 个文件被更改,包括 8941 次插入1580 次删除
  1. 11 2
      controllers/base_auth.go
  2. 1 1
      controllers/base_from_baiinfo.go
  3. 23 2
      controllers/base_from_bloomberg.go
  4. 2 2
      controllers/base_from_business.go
  5. 66 20
      controllers/base_from_calculate.go
  6. 1 1
      controllers/base_from_cffex.go
  7. 307 0
      controllers/base_from_clarksons.go
  8. 1 1
      controllers/base_from_coal.go
  9. 35 0
      controllers/base_from_fenwei.go
  10. 174 0
      controllers/base_from_gpr_risk.go
  11. 168 0
      controllers/base_from_hisugar.go
  12. 1 1
      controllers/base_from_icpi.go
  13. 765 0
      controllers/base_from_ly.go
  14. 19 2
      controllers/base_from_mtjh.go
  15. 14 2
      controllers/base_from_pb.go
  16. 14 2
      controllers/base_from_pb_finance.go
  17. 62 2
      controllers/base_from_predict.go
  18. 12 3
      controllers/base_from_predict_calculate.go
  19. 175 0
      controllers/base_from_purang.go
  20. 187 0
      controllers/base_from_radish_research.go
  21. 723 0
      controllers/base_from_rzd.go
  22. 1 1
      controllers/base_from_sci99.go
  23. 1 1
      controllers/base_from_ths.go
  24. 283 0
      controllers/base_from_trade_analysis.go
  25. 174 0
      controllers/base_from_usda_fas.go
  26. 163 1
      controllers/commodity_coal.go
  27. 3 5
      controllers/edb_info.go
  28. 10 10
      controllers/exchange_crawler.go
  29. 22 8
      controllers/factor_edb_series/factor_edb_series.go
  30. 10 40
      controllers/future_good/future_good_edb_info.go
  31. 21 1
      controllers/sci99_crawler.go
  32. 73 1
      controllers/shanghai_smm.go
  33. 16 0
      global/global.go
  34. 139 0
      global/initDb.go
  35. 5 0
      go.mod
  36. 12 0
      go.sum
  37. 4 1
      logic/base_edb_info.go
  38. 229 33
      logic/predict_edb.go
  39. 189 111
      logic/profit_chart_info.go
  40. 5 0
      main.go
  41. 46 7
      models/base_calculate.go
  42. 72 36
      models/base_from_adjust.go
  43. 77 42
      models/base_from_baiinfo.go
  44. 98 61
      models/base_from_bloomberg.go
  45. 72 55
      models/base_from_business.go
  46. 44 34
      models/base_from_business_data.go
  47. 50 28
      models/base_from_calculate.go
  48. 126 59
      models/base_from_ccf.go
  49. 39 14
      models/base_from_cffex.go
  50. 287 0
      models/base_from_clarksons.go
  51. 27 11
      models/base_from_coal.go
  52. 26 10
      models/base_from_coal_coastal.go
  53. 34 18
      models/base_from_coal_firm.go
  54. 36 20
      models/base_from_coal_inland.go
  55. 147 74
      models/base_from_coalmine.go
  56. 34 18
      models/base_from_com_trade.go
  57. 35 13
      models/base_from_dl.go
  58. 43 30
      models/base_from_edb_mapping.go
  59. 23 11
      models/base_from_eia_steo.go
  60. 204 59
      models/base_from_fenwei.go
  61. 9 6
      models/base_from_fubao.go
  62. 33 16
      models/base_from_gie.go
  63. 26 12
      models/base_from_google_travel.go
  64. 401 0
      models/base_from_gpr_risk.go
  65. 28 13
      models/base_from_gz.go
  66. 298 0
      models/base_from_hisugar.go
  67. 35 19
      models/base_from_icpi.go
  68. 9 5
      models/base_from_jiayue.go
  69. 10 6
      models/base_from_lt.go
  70. 30 0
      models/base_from_ly_classify.go
  71. 82 0
      models/base_from_ly_data.go
  72. 58 0
      models/base_from_ly_index.go
  73. 45 0
      models/base_from_ly_index_record.go
  74. 23 10
      models/base_from_lz.go
  75. 37 19
      models/base_from_manual.go
  76. 121 47
      models/base_from_mtjh.go
  77. 23 11
      models/base_from_mysteel.go
  78. 130 82
      models/base_from_mysteel_chemical.go
  79. 30 16
      models/base_from_mysteel_chemical_classify.go
  80. 23 10
      models/base_from_national_statistics.go
  81. 51 30
      models/base_from_oilchem.go
  82. 10 6
      models/base_from_pb.go
  83. 8 6
      models/base_from_pb_finance.go
  84. 346 0
      models/base_from_purang_index.go
  85. 39 19
      models/base_from_python.go
  86. 435 0
      models/base_from_radish_research.go
  87. 42 0
      models/base_from_rzd_classify.go
  88. 147 0
      models/base_from_rzd_data.go
  89. 56 0
      models/base_from_rzd_index.go
  90. 55 40
      models/base_from_sci.go
  91. 118 45
      models/base_from_sci99.go
  92. 62 33
      models/base_from_sci_hq.go
  93. 76 42
      models/base_from_sh.go
  94. 107 72
      models/base_from_shfe.go
  95. 194 101
      models/base_from_smm.go
  96. 13 6
      models/base_from_smm_classify.go
  97. 20 9
      models/base_from_stock_plant.go
  98. 10 6
      models/base_from_ths.go
  99. 16 10
      models/base_from_ths_ds.go
  100. 44 29
      models/base_from_ths_hf.go

+ 11 - 2
controllers/base_auth.go

@@ -19,6 +19,10 @@ var AfterHandlerUrlMap = map[string][]AfterHandle{
 	"/edbapi/wind/refresh": {models.DeleteChartInfoDataRedis}, //指标刷新接口
 }
 
+var FilterLogsUrlMap = map[string]struct{}{
+	"/edbapi/calculate/base": {}, //指标计算接口
+}
+
 func init() {
 	/*if utils.RunMode == "release" {
 		logDir := `/data/rdlucklog/` + utils.APP_NAME_EN
@@ -142,8 +146,13 @@ func (c *BaseAuthController) JSON(data interface{}, hasIndent bool, coding bool)
 	if authorization == "" {
 		authorization = c.Ctx.Input.Header("Authorization")
 	}
-
-	utils.ApiLog.Info("uri:%s, authorization:%s, requestBody:%s, responseBody:%s, ip:%s", c.Ctx.Input.URI(), authorization, requestBody, content, ip)
+	urlPath := c.Ctx.Input.URI()
+	//是否需要过滤日志中的请求入参和返回值
+	if _, ok := FilterLogsUrlMap[urlPath]; ok {
+		utils.ApiLog.Info("uri:%s, authorization:%s, ip:%s", urlPath, authorization, ip)
+	} else {
+		utils.ApiLog.Info("uri:%s, authorization:%s, requestBody:%s, responseBody:%s, ip:%s", urlPath, authorization, requestBody, content, ip)
+	}
 	if coding {
 		content = []byte(utils.StringsToJSON(string(content)))
 	}

+ 1 - 1
controllers/base_from_baiinfo.go

@@ -111,7 +111,7 @@ func (this *BaiinfoController) Refresh() {
 		req.EdbInfoId = edbInfo.EdbInfoId
 	}
 	err = models.RefreshEdbDataFromBaiinfo(req.EdbInfoId, req.EdbCode, req.StartDate)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromBaiinfo,Err:" + err.Error()
 		return

+ 23 - 2
controllers/base_from_bloomberg.go

@@ -121,7 +121,7 @@ func (this *BloombergController) Refresh() {
 	dataUpdateTime := time.Now().Format(utils.FormatDateTime)
 	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
 	err = models.RefreshEdbDataFromBloomberg(req.EdbInfoId, req.EdbCode, req.StartDate)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromBloomberg,Err:" + err.Error()
 		return
@@ -169,6 +169,27 @@ func (this *BloombergController) PCSGImportHistoryData() {
 		br.ErrMsg = "参数解析失败,Err:" + e.Error()
 		return
 	}
+	if req.TaskKey == "" {
+		br.Msg = "TaskKey不可为空"
+		return
+	}
+	tasks, e := services.LoadPCSGBloombergTask()
+	if e != nil {
+		br.Msg = "加载配置失败"
+		br.ErrMsg = fmt.Sprintf("加载配置失败, Err: %v", e)
+		return
+	}
+	conf := new(services.PCSGBloombergTask)
+	for _, v := range tasks {
+		if v.TaskKey == req.TaskKey {
+			conf = v
+			break
+		}
+	}
+	if conf.TaskKey == "" {
+		br.Msg = "TaskKey配置不存在"
+		return
+	}
 
 	var indexes []models.BaseFromBloombergApiIndexAndData
 	var index models.BaseFromBloombergApiIndexAndData
@@ -184,7 +205,7 @@ func (this *BloombergController) PCSGImportHistoryData() {
 	indexes = append(indexes, index)
 
 	// 写入数据
-	if e := services.PCSGWrite2BaseBloomberg(indexes, req.IsVCode, req.ExtraLetter, "", ""); e != nil {
+	if e := services.PCSGWrite2BaseBloomberg(indexes, conf.VCode, conf.ExtraLetter, conf.IndexNamePrefix, conf.IndexCodeSuffix); e != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "PCSG-写入Bloomberg数据源失败, Err: " + e.Error()
 		return

+ 2 - 2
controllers/base_from_business.go

@@ -313,7 +313,7 @@ func (c *BusinessIndexController) Edit() {
 	}
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(0, req.EdbInfoId, req.EdbName, c.Lang)
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.EDB_INFO_TYPE, req.EdbInfoId, req.EdbName, c.Lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
@@ -470,7 +470,7 @@ func (c *BusinessIndexController) Refresh() {
 		br.ErrMsg = "刷新指标失败,err:" + errMsg
 		return
 	}
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 BusinessIndexController,Err:" + err.Error()
 		return

+ 66 - 20
controllers/base_from_calculate.go

@@ -226,7 +226,7 @@ func (this *CalculateController) Edit() {
 	}
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(0, req.EdbInfoId, req.EdbName, this.Lang)
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.EDB_INFO_TYPE, req.EdbInfoId, req.EdbName, this.Lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
@@ -514,7 +514,7 @@ func (this *CalculateController) BatchSave() {
 	//加入缓存机制,避免创建同一个名称的指标 end
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(0, req.EdbInfoId, req.EdbName, this.Lang)
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.EDB_INFO_TYPE, req.EdbInfoId, req.EdbName, this.Lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
@@ -749,6 +749,9 @@ func (this *CalculateController) BatchSave() {
 		}
 		sourName = "日均值"
 		edbInfo, err = models.AddCalculateRjz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
+	case utils.DATA_SOURCE_CALCULATE_PHASE_SHIFT:
+		sourName = "期数移位"
+		edbInfo, err = models.AddCalculatePhaseShift(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
 	default:
 		// 获取通用的数据源处理服务
 		baseEdbInfoModel = models.GetBaseEdbInfoModel(req.Source)
@@ -879,7 +882,7 @@ func (this *CalculateController) BatchEdit() {
 	}
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(0, req.EdbInfoId, req.EdbName, this.Lang)
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.EDB_INFO_TYPE, req.EdbInfoId, req.EdbName, this.Lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
@@ -895,7 +898,7 @@ func (this *CalculateController) BatchEdit() {
 
 	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			br.Msg = "指标已被删除,请刷新页面"
 			br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
 			return
@@ -1052,7 +1055,7 @@ func (this *CalculateController) BatchEdit() {
 		err = models.EditCalculateNszydpjjs(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
 	case utils.DATA_SOURCE_CALCULATE_HBZ:
 		checkCount, tmpErr := models.GetLteZeroEdbDataCount(fromEdbInfo.Source, fromEdbInfo.SubSource, req.FromEdbInfoId)
-		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+		if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
 			br.Msg = "判断环比值是否可计算失败"
 			br.ErrMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
 			return
@@ -1073,6 +1076,9 @@ func (this *CalculateController) BatchEdit() {
 	case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
 		sourName = "时间移位"
 		err = models.EditCalculateTimeShift(edbInfo, &req, fromEdbInfo)
+	case utils.DATA_SOURCE_CALCULATE_PHASE_SHIFT:
+		sourName = "期数移位"
+		err = models.EditCalculatePhaseShift(edbInfo, &req, fromEdbInfo)
 	case utils.DATA_SOURCE_CALCULATE_ZJPJ:
 		sourName = "直接拼接"
 
@@ -1531,6 +1537,44 @@ func (this *CalculateController) Refresh() {
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
 		}
+	case utils.DATA_SOURCE_CALCULATE_PHASE_SHIFT: // 期数位移
+		calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoCalculateMappingDetail Err:" + err.Error()
+			break
+		}
+		fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoById Err:" + err.Error()
+			break
+		}
+		//startDate = edbInfo.StartDate
+		startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
+		endDate = time.Now().Format(utils.FormatDate)
+		formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
+		err = models.RefreshAllCalculatePhaseShift(edbInfoId, source, subSource, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			errMsg = "RefreshAllCalculatePhaseShift Err:" + err.Error()
+		}
+	case utils.DATA_SOURCE_RESIDUAL_ANALYSIS: // 残差分析
+		calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoCalculateMappingDetail Err:" + err.Error()
+			break
+		}
+		fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoById Err:" + err.Error()
+			break
+		}
+		//startDate = edbInfo.StartDate
+		startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
+		endDate = time.Now().Format(utils.FormatDate)
+		formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
+		err = models.RefreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			errMsg = "RefreshAllCalculateResidualAnalysis Err:" + err.Error()
+		}
 	case utils.DATA_SOURCE_CALCULATE_ZJPJ: //刷新直接拼接
 		err = models.RefreshAllCalculateZjpj(edbInfo)
 		if err != nil && err.Error() != utils.ErrNoRow() {
@@ -1680,6 +1724,17 @@ func (this *CalculateController) Refresh() {
 			errMsg = "RefreshAllCalculateRjz Err:" + err.Error()
 			break
 		}
+	case utils.DATA_SOURCE_CALCULATE_STL: // STL趋势分解
+		msg, err := services.RefreshStlData(edbInfoId)
+		if err != nil {
+			if msg == "" {
+				errMsg = "RefreshStlData Err:" + err.Error()
+			} else {
+				errMsg = msg + " Err:" + err.Error()
+			}
+			break
+		}
+
 	default:
 		// 获取通用的数据源处理服务
 		baseEdbInfoModel = models.GetBaseEdbInfoModel(source)
@@ -1772,30 +1827,21 @@ func (this *CalculateController) SaveAdjust() {
 		}()
 	}
 
-	//获取指标数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_name=? "
-	pars = append(pars, req.EdbName)
-
-	if req.EdbInfoId > 0 {
-		condition += " AND edb_info_id != ? "
-		pars = append(pars, req.EdbInfoId)
-	}
-
-	count, err := models.GetEdbInfoCountByCondition(condition, pars)
+	// 校验指标名称是否存在
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(0, req.EdbInfoId, req.EdbName, this.Lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
 		return
 	}
-	if count > 0 {
+
+	if existEdbName {
 		br.Msg = "指标名称已存在,请重新填写"
 		br.ErrMsg = "指标名称已存在,请重新填写"
 		return
 	}
 
-	edbInfo, err, errMsg := models.SaveAdjustEdb(req)
+	edbInfo, err, errMsg := models.SaveAdjustEdb(req, this.Lang)
 	if err != nil {
 		br.Msg = errMsg
 		br.Msg = "添加指标失败,Err:" + err.Error()
@@ -1939,7 +1985,7 @@ func (this *CalculateController) CalculateComputeCorrelation() {
 	if bVal >= 0 {
 		connStr = `+`
 	}
-	valStr := fmt.Sprintf("y = %sx %s %s   =%f", utils.SubFloatToString(aVal, 4), connStr, utils.SubFloatToString(bVal, 4), rVal)
+	valStr := fmt.Sprintf("y = %sx %s %s   r=%f", utils.SubFloatToString(aVal, 4), connStr, utils.SubFloatToString(bVal, 4), rVal)
 
 	br.Ret = 200
 	br.Success = true

+ 1 - 1
controllers/base_from_cffex.go

@@ -108,7 +108,7 @@ func (this *CffexController) Refresh() {
 	}
 
 	err = models.RefreshEdbDataFromCffex(req.EdbInfoId, req.EdbCode, req.StartDate)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromCffex,Err:" + err.Error()
 		return

+ 307 - 0
controllers/base_from_clarksons.go

@@ -0,0 +1,307 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ClarksonsDataController struct {
+	BaseAuthController
+}
+
+// @Title 克拉克森
+// @Description 刷新克拉克森数据接口
+// @Param	request	body models.CoalMineDataReq true "type json string"
+// @Success 200 {object} models.EdbClassify
+// @router /data [post]
+func (this *ClarksonsDataController) ClarksonsData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.CoalMineDataReq
+
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	var dateMap = make(map[int]string)
+	var indexMap = make(map[string]*models.BaseFromClarksonsIndex)
+	//var indexMap = make(map[string]string)
+	var itemsIndex []*models.BaseFromClarksonsData
+	codeList, err := models.GetBaseFromClarksonsIndex()
+	if err != nil && !utils.IsErrNoRow(err) {
+		utils.FileLog.Info("获取克拉克森指标失败:", err)
+		return
+	}
+
+	if len(codeList) > 0 {
+		for _, v := range codeList {
+			indexMap[v.IndexCode] = v
+		}
+	}
+
+	for _, sheet := range req.SheetData {
+		//遍历行读取
+		maxRow := sheet.MaxRow
+		maxCol := sheet.MaxCol
+
+		for j := 1; j < maxCol; j++ {
+			var indexId int64
+			index := new(models.BaseFromClarksonsIndex)
+			indexCode := ""
+			for i := 3; i < maxRow; i++ {
+
+				//获取样本情况
+				row := sheet.Rows[i]
+				cells := row.Cells
+				if j == 0 {
+					continue
+				}
+				// indexCode
+				if i == 3 {
+					indexCode = cells[j].Value
+					continue
+				}
+
+				if indexItem, ok := indexMap[indexCode]; !ok {
+					// indexName
+					if i == 4 {
+						index.IndexName = cells[j].Value
+						continue
+					}
+
+					// unit
+					if i == 5 {
+						index.Unit = cells[j].Value
+						continue
+					}
+
+					index.IndexCode = indexCode
+					index.CreateTime = time.Now()
+					index.ModifyTime = time.Now()
+
+					indexId, err = models.AddBaseFromClarksonsIndex(index)
+					if err != nil {
+						utils.FileLog.Info("添加指标名称错误", err.Error())
+						fmt.Println("添加指标名称错误", err.Error())
+						return
+					}
+					index.BaseFromClarksonsIndexId = int(indexId)
+					indexMap[indexCode] = index
+				} else {
+					index = indexItem
+				}
+
+				// 数据及日期
+				if i > 5 {
+					var date string
+					if len(cells) == 0 {
+						break
+					}
+					for k, cell := range cells {
+						text := cell.Value
+						text = strings.Replace(text, "\\", "", -1)
+						if text != "" {
+							// 时间
+							if k == 0 {
+								if text != "" {
+									dataTime, err := utils.ParseDateTime(text)
+									if err != nil {
+										utils.FileLog.Info("解析时间字符串出错:", err)
+										fmt.Println("解析时间字符串出错:", err)
+										return
+									}
+									date = dataTime.Format(utils.FormatDate)
+								}
+								dateMap[k] = date
+							}
+
+							// 数据
+							if k == j {
+								item := new(models.BaseFromClarksonsData)
+								item.IndexCode = indexCode
+								item.Value = text
+								item.DataTime = date
+								item.BaseFromClarksonsIndexId = index.BaseFromClarksonsIndexId
+								item.ModifyTime = time.Now()
+								item.CreateTime = time.Now()
+								itemsIndex = append(itemsIndex, item)
+
+								continue
+							}
+						}
+					}
+				}
+			}
+			if len(itemsIndex) > 2 {
+				time1, _ := time.Parse(utils.FormatDate, itemsIndex[0].DataTime)
+				time2, _ := time.Parse(utils.FormatDate, itemsIndex[1].DataTime)
+				diff := time2.Sub(time1).Hours() / 24
+
+				if diff < 5 {
+					index.Frequency = "日度"
+				} else if diff > 5 && diff < 10 {
+					index.Frequency = "周度"
+				} else if diff > 20 && diff < 50 {
+					index.Frequency = "月度"
+				} else if diff > 50 && diff < 100 {
+					index.Frequency = "季度"
+				} else if diff > 100 {
+					index.Frequency = "年度"
+				}
+			}
+			err = models.UpdateBaseFromClarksonsIndex(index)
+			if err != nil {
+				fmt.Println("修改指标频度错误", err)
+				utils.FileLog.Info("修改指标频度错误", err)
+				return
+			} else {
+				fmt.Println("修改指标频度成功 ", index.IndexCode, index.Frequency)
+				utils.FileLog.Info("修改指标频度成功 ", index.IndexCode, index.Frequency)
+			}
+		}
+
+	}
+
+	count, err := models.AddBaseFromClarksonsDataMuti(itemsIndex)
+	if err != nil {
+		fmt.Println("添加数据错误", err.Error())
+		utils.FileLog.Info("添加数据错误", err)
+	} else {
+		fmt.Println("添加数据成功", count)
+		utils.FileLog.Info("添加数据成功", count)
+	}
+
+	fmt.Println("数据操作完成")
+	utils.FileLog.Info("数据操作完成")
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	return
+}
+
+// @Title 新增克拉克森指标接口
+// @Description 新增克拉克森指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *ClarksonsDataController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_CLARKSONS
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if !utils.Rc.IsExist(cacheKey) {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		err = models.AddEdbDataFromClarksons(req.EdbCode)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromClarksons,Err:" + err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}
+
+// @Title 刷新克拉克森指标接口
+// @Description 刷新克拉克森指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *ClarksonsDataController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_CLARKSONS
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+
+	err = models.RefreshEdbDataFromClarksons(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && !utils.IsErrNoRow(err) {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromCoal,Err:" + err.Error()
+		return
+	}
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 1 - 1
controllers/base_from_coal.go

@@ -107,7 +107,7 @@ func (this *CoalController) Refresh() {
 	}
 
 	err = models.RefreshEdbDataFromCoal(req.EdbInfoId, req.EdbCode, req.StartDate)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromCoal,Err:" + err.Error()
 		return

+ 35 - 0
controllers/base_from_fenwei.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_index_lib/models"
 	"eta/eta_index_lib/services"
 	"eta/eta_index_lib/utils"
+	"github.com/beego/beego/v2/core/logs"
 	"strconv"
 	"time"
 )
@@ -253,3 +254,37 @@ func (this *FenweiController) BaseIndexList() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// NetDataHandle
+// @Title 汾渭网页数据落库
+// @Description 汾渭网页数据落库
+// @Success 200 string "操作成功"
+// @router /net/data/handle [post]
+func (this *FenweiController) NetDataHandle() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req models.HandleFenWeiNetDataReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	logs.Info("汾渭网页数据落库请求参数 List size:", len(req.List))
+	err = services.NetDataHandle(req)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 174 - 0
controllers/base_from_gpr_risk.go

@@ -0,0 +1,174 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"time"
+)
+
+// GprRiskController GPR地缘风险指数
+type GprRiskController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增GPR地缘风险指数指标接口
+// @Description 新增GPR地缘风险指数指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *GprRiskController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	gprRisk := new(models.BaseFromGprRisk)
+	source := gprRisk.GetSource()
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+	err = gprRisk.Add(req.EdbCode)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取指标信息失败 AddEdbDataFromGprRisk,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	return
+}
+
+// Refresh
+// @Title 刷新GPR地缘风险指数指标接口
+// @Description 刷新GPR地缘风险指数指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *GprRiskController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	GprRisk := new(models.BaseFromGprRisk)
+	source := GprRisk.GetSource()
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId < 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+	if req.EdbInfoId <= 0 {
+		req.EdbInfoId = edbInfo.EdbInfoId
+	}
+	err = GprRisk.Refresh(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromGprRisk,Err:" + err.Error()
+		return
+	}
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// HandleExcelData
+// @Title 处理GPR地缘风险指数指标的接口
+// @Description 处理GPR地缘风险指数指标的接口
+// @Success 200 {object} models.HandleGprRiskExcelDataReq
+// @router /handle/excel_data [post]
+func (this *GprRiskController) HandleExcelData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.HandleGprRiskExcelDataReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 处理excel表数据
+	err = services.HandleGprRiskIndex(&req)
+	if err != nil {
+		fmt.Println("HandleMysteelIndex Err:" + err.Error())
+		br.Msg = "处理失败"
+		br.ErrMsg = "处理失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}

+ 168 - 0
controllers/base_from_hisugar.go

@@ -0,0 +1,168 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"strconv"
+	"time"
+)
+
+// HisugarController 泛糖科技
+type HisugarController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增泛糖科技指标接口
+// @Description 新增泛糖科技指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *HisugarController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+
+	source := utils.DATA_SOURCE_HISUGAR
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if !utils.Rc.IsExist(cacheKey) {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		err = models.AddEdbDataFromHisugar(req.EdbCode)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromHisugar,Err:" + err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success =  true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}
+
+// Refresh
+// @Title 刷新泛糖科技指标接口
+// @Description 刷新泛糖科技指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *HisugarController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_HISUGAR
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+
+	err = models.RefreshEdbDataFromHisugar(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromHisugar,Err:" + err.Error()
+		return
+	}
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// HandleEdbData
+// @Title 处理泛糖科技指标的接口
+// @Description 处理泛糖科技指标的接口
+// @Success 200 string "操作成功"
+// @router /handle/edb_data [post]
+func (this *HisugarController) HandleEdbData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.HandleHisugarEdbDataReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if err = services.HandleHisugarIndex(req.List); err != nil {
+		br.Msg = "处理失败"
+		br.ErrMsg = "处理失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}

+ 1 - 1
controllers/base_from_icpi.go

@@ -45,7 +45,7 @@ func (this *IcpiController) Add() {
 		err = models.AddEdbDataFromIcpi(req.EdbCode)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
-			br.ErrMsg = "获取指标信息失败 AddEdbDataFromSh,Err:" + err.Error()
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromIcpi,Err:" + err.Error()
 			return
 		}
 		br.Ret = 200

+ 765 - 0
controllers/base_from_ly.go

@@ -0,0 +1,765 @@
+// @Author gmy 2024/8/13 16:01:00
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"time"
+)
+
+type BaseFromLyController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增粮油商务网指标
+// @Description 新增粮油商务网指标
+// @router /add [post]
+func (this *BaseFromLyController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_LY
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if !utils.Rc.IsExist(cacheKey) {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		err = models.AddEdbDataFromLy(req.EdbCode)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromSci99,Err:" + err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}
+
+// Refresh
+// @Title 刷新粮油商务网指标接口
+// @Description 刷新粮油商务网指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *BaseFromLyController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_LY
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	dataUpdateTime := time.Now().Format(utils.FormatDateTime)
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	err = models.RefreshEdbDataFromBloomberg(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromBloomberg,Err:" + err.Error()
+		return
+	}
+
+	// 更新指标最大最小值
+	erDataUpdateDate, err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfoDataUpdate(edbInfo, dataUpdateTime)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+	// 添加指标刷新成功日志
+	if erDataUpdateDate != "" {
+		_ = services.AddEdbInfoUpdateLog(edbInfo.EdbInfoId, 1, "", 1, "", 0, 0)
+	} else {
+		_ = services.AddEdbInfoUpdateLog(edbInfo.EdbInfoId, 1, "", 2, "未刷新到数据", 0, 0)
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// GetLyClassifyByName
+// @Title 获取分类
+// @Description 获取分类
+// @Success 200 {object} models.BaseFromLyClassify
+// @router /get/ly/classify/by/name [post]
+func (this *BaseFromLyController) GetLyClassifyByName() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		CategoryName string `json:"CategoryName"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+	categoryName := reqData.CategoryName
+	if categoryName == "" {
+		br.Msg = "请输入分类!"
+		br.ErrMsg = "请输入分类"
+		return
+	}
+
+	lyClassify, err := models.GetLyClassifyByName(categoryName)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyClassify
+	br.Msg = "获取成功"
+}
+
+// GetLyIndexRecordByUrl
+// @Title 根据url获取指标已读取记录
+// @Description 根据url获取指标已读取记录
+// @Success 200 {object} models.BaseFromLyIndexRecord
+// @router /get/ly/index/record/by/url [post]
+func (this *BaseFromLyController) GetLyIndexRecordByUrl() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		Url string `json:"Url"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+	url := reqData.Url
+	if url == "" {
+		br.Msg = "请输入地址链接!"
+		br.ErrMsg = "请输入地址链接"
+		return
+	}
+
+	lyIndexRecord, err := models.GetLyIndexRecordByUrl(url)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyIndexRecord
+	br.Msg = "获取成功"
+}
+
+// AddLyIndexRecord
+// @Title 维护指标数据读取进度到数据库
+// @Description 维护指标数据读取进度到数据库
+// @Success 200 string "处理成功"
+// @router /add/ly/index/record [post]
+func (this *BaseFromLyController) AddLyIndexRecord() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.BaseFromLyIndexRecord
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	id, err := models.AddLyIndexRecord(&req)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = id
+	br.Msg = "处理成功"
+}
+
+// AddLyDataList
+// @Title 新增指标数据
+// @Description 新增指标数据列表
+// @Success 200 string "处理成功"
+// @router /add/ly/data/list [post]
+func (this *BaseFromLyController) AddLyDataList() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req []models.BaseFromLyData
+	fmt.Println(string(this.Ctx.Input.RequestBody))
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	err = models.AddLyDataList(req)
+	if err != nil {
+		br.Msg = "新增指标数据失败!"
+		br.ErrMsg = "新增指标数据失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// AddLyIndex
+// @Title 新增指标
+// @Description 新增指标
+// @Success 200 string "处理成功"
+// @router /add/ly/index [post]
+func (this *BaseFromLyController) AddLyIndex() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.BaseFromLyIndex
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	indexId, err := models.AddLyIndex(&req)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = indexId
+	br.Msg = "处理成功"
+}
+
+// GetLyDataByIndexIdAndDataTime
+// @Title 根据指标id和时间获取指标数据
+// @Description 根据指标id和时间获取指标数据
+// @Success 200 {object} models.BaseFromLyData
+// @router /get/ly/data/by/index/id/and/data/time [post]
+func (this *BaseFromLyController) GetLyDataByIndexIdAndDataTime() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexId  int    `json:"IndexId"`
+		DataTime string `json:"DataTime"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexId := reqData.IndexId
+	if indexId == 0 {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	dataTime := reqData.DataTime
+	if dataTime == "" {
+		br.Msg = "请输入时间!"
+		br.ErrMsg = "请输入时间"
+		return
+	}
+
+	lyData, err := models.GetLyDataByIndexIdAndDataTime(indexId, dataTime)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyData
+	br.Msg = "获取成功"
+}
+
+// GetLyDataByIndexIdAndDataTimeYM
+// @Title 根据指标id和年月时间获取指标数据
+// @Description 根据指标id和年月时间获取指标数据
+// @Success 200 {object} models.BaseFromLyData
+// @router /get/ly/data/by/index/id/and/data/time/ym [post]
+func (this *BaseFromLyController) GetLyDataByIndexIdAndDataTimeYM() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexId   int    `json:"IndexId"`
+		YearMonth string `json:"YearMonth"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexId := reqData.IndexId
+	if indexId == 0 {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	yearMonth := reqData.YearMonth
+
+	if yearMonth == "" {
+		br.Msg = "请输入时间!"
+		br.ErrMsg = "请输入时间"
+		return
+	}
+
+	lyData, err := models.GetLyDataByIndexIdAndDataTimeYM(indexId, yearMonth)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyData
+	br.Msg = "获取成功"
+}
+
+// UpdateLyDataById
+// @Title 更新数据源指标数据
+// @Description 更新数据源指标数据
+// @Success 200 string "处理成功"
+// @router /update/ly/data/by/id [post]
+func (this *BaseFromLyController) UpdateLyDataById() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		Id    int     `json:"Id"`
+		Value float64 `json:"Value"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	id := reqData.Id
+	if id == 0 {
+		br.Msg = "请输入id!"
+		br.ErrMsg = "请输入id"
+		return
+	}
+
+	value := reqData.Value
+	if value == 0 {
+		br.Msg = "请输入值!"
+		br.ErrMsg = "请输入值"
+		return
+	}
+
+	err = models.UpdateLyDataById(id, value)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// GetLyEdbDataByIndexCodeAndDataTime
+// @Title 根据指标编码和模糊日期获取指标库数据
+// @Description 根据指标编码和模糊日期获取指标库数据
+// @Success 200 {object} []models.EdbDataLy
+// @router /get/ly/edb/data/by/index/code/and/data/time [post]
+func (this *BaseFromLyController) GetLyEdbDataByIndexCodeAndDataTime() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+		DataTime  string `json:"DataTime"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	dataTime := reqData.DataTime
+	if dataTime == "" {
+		br.Msg = "请输入时间!"
+		br.ErrMsg = "请输入时间"
+		return
+	}
+
+	lyEdbData, err := models.GetLyEdbDataByIndexCodeAndDataTime(indexCode, dataTime)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyEdbData
+	br.Msg = "获取成功"
+}
+
+// GetLyEdbDataByIndexCodeAndExactDataTime
+// @Title 根据指标编码和精确日期获取指标库数据
+// @Description 根据指标编码和精确日期获取指标库数据
+// @Success 200 {object} []models.EdbDataLy
+// @router /get/ly/edb/data/by/index/code/and/exact/data/time [post]
+func (this *BaseFromLyController) GetLyEdbDataByIndexCodeAndExactDataTime() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+		DataTime  string `json:"DataTime"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	dataTime := reqData.DataTime
+	if dataTime == "" {
+		br.Msg = "请输入时间!"
+		br.ErrMsg = "请输入时间"
+		return
+	}
+
+	lyEdbData, err := models.GetLyEdbDataByIndexCodeAndExactDataTime(indexCode, dataTime)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyEdbData
+	br.Msg = "获取成功"
+}
+
+// UpdateLyEdbDataById
+// @Title 更新指标库数据 须根据指标编码和日期更新 仅适合月度数据
+// @Description 更新指标库数据 须根据指标编码和日期更新 仅适合月度数据
+// @Success 200 string "处理成功"
+// @router /update/ly/edb/data/by/id [post]
+func (this *BaseFromLyController) UpdateLyEdbDataById() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		Id    int     `json:"Id"`
+		Value float64 `json:"Value"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	id := reqData.Id
+	if id == 0 {
+		br.Msg = "请输入id!"
+		br.ErrMsg = "请输入id"
+		return
+	}
+
+	value := reqData.Value
+	if value == 0 {
+		br.Msg = "请输入值!"
+		br.ErrMsg = "请输入值"
+		return
+	}
+
+	err = models.UpdateLyEdbDataById(id, value)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// GetLyIndexByCode
+// @Title 查询指标编码是否存在
+// @Description 查询指标编码是否存在
+// @Success 200 {object} models.BaseFromLyIndex
+// @router /get/ly/index/by/code [post]
+func (this *BaseFromLyController) GetLyIndexByCode() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	lyIndex, err := models.GetLyIndexByCode(indexCode)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyIndex
+	br.Msg = "获取成功"
+}
+
+// GetEdbInfoByIndexCode
+// @Title 根据指标code获取指标信息
+// @Description 根据指标code获取指标信息
+// @Success 200 {object} models.EdbInfo
+// @router /get/edb/info/by/index/code [post]
+func (this *BaseFromLyController) GetEdbInfoByIndexCode() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+		Source    int    `json:"Source"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+	source := reqData.Source
+	if source == 0 {
+		br.Msg = "请输入来源!"
+		br.ErrMsg = "请输入来源"
+		return
+	}
+
+	lyEdbData, err := models.GetEdbInfoByEdbCode(source, indexCode)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyEdbData
+	br.Msg = "获取成功"
+}
+
+// AddBatchLyEdbData
+// @Title 批量增加粮油指标库数据
+// @Description 批量增加粮油指标库数据
+// @Success 200 string "处理成功"
+// @router /add/batch/ly/edb/data [post]
+func (this *BaseFromLyController) AddBatchLyEdbData() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req []models.EdbDataLy
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	err = models.AddLyEdbDataList(req)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}

+ 19 - 2
controllers/base_from_mtjh.go

@@ -247,13 +247,30 @@ func (this *MtjhDataController) Mtjh() {
 		}
 	}
 	if len(indexAddList) > 0 {
-		newId, err := models.AddBaseFromMtjhIndexMuti(indexAddList)
+		err = models.AddBaseFromMtjhIndexMuti(indexAddList)
 		if err != nil {
 			fmt.Println("添加指标名称错误", err.Error())
 		} else {
-			fmt.Println("添加指标名称成功", newId)
+			fmt.Println("添加指标名称成功")
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromMtjhMapping)
+			for _, indexCode := range codeMap {
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	fmt.Println("数据操作完成")
 
 	br.Ret = 200

+ 14 - 2
controllers/base_from_pb.go

@@ -43,7 +43,13 @@ func (this *PbController) Add() {
 	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
-		dataItem, err := services.GetEdbDataFromPb(req.EdbCode, utils.BASE_START_DATE_UnSpace, utils.BASE_END_DATE_UnSpace, "")
+		dataItem, err := services.GetEdbDataFromPb(req.EdbCode, utils.BASE_START_DATE_UnSpace, utils.PB_BASE_END_DATE_UnSpace, "")
+		// 日志记录
+		num := 0
+		if dataItem != nil {
+			num = len(dataItem.Date)
+		}
+		models.AddEdbRefreshApiRecordByRefresh(&models.EdbInfo{EdbCode: req.EdbCode, Source: source}, utils.BASE_START_DATE_UnSpace, num, err)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromPb,Err:" + err.Error()
@@ -115,7 +121,13 @@ func (this *PbController) Refresh() {
 
 	//开始日期格式化
 	startDateTime, _ := time.ParseInLocation(utils.FormatDate, req.StartDate, time.Local)
-	dataItem, err := services.GetEdbDataFromPb(req.EdbCode, startDateTime.Format(utils.FormatDateUnSpace), utils.BASE_END_DATE_UnSpace, edbInfo.TerminalCode)
+	dataItem, err := services.GetEdbDataFromPb(req.EdbCode, startDateTime.Format(utils.FormatDateUnSpace), utils.PB_BASE_END_DATE_UnSpace, edbInfo.TerminalCode)
+	// 日志记录
+	num := 0
+	if dataItem != nil {
+		num = len(dataItem.Date)
+	}
+	models.AddEdbRefreshApiRecordByRefresh(edbInfo, startDateTime.Format(utils.FormatDateUnSpace), num, err)
 	if err != nil {
 		br.Msg = "获取指标信息失败!"
 		br.ErrMsg = "获取指标信息失败 GetEdbDataFromPb,Err:" + err.Error()

+ 14 - 2
controllers/base_from_pb_finance.go

@@ -54,7 +54,13 @@ func (this *PbFinanceController) Add() {
 			br.ErrMsg = "指标编码异常,请传入客户编码"
 			return
 		}
-		dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], utils.BASE_START_DATE_UnSpace, utils.BASE_END_DATE_UnSpace, "")
+		dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], utils.BASE_START_DATE_UnSpace, utils.PB_BASE_END_DATE_UnSpace, "")
+		// 日志记录
+		num := 0
+		if dataItem != nil {
+			num = len(dataItem.Date)
+		}
+		models.AddEdbRefreshApiRecordByRefresh(&models.EdbInfo{EdbCode: edbCode, Source: source}, utils.BASE_START_DATE_UnSpace, num, err)
 		if err != nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromPb,Err:" + err.Error()
@@ -136,7 +142,13 @@ func (this *PbFinanceController) Refresh() {
 		br.ErrMsg = "指标编码异常,请传入客户编码"
 		return
 	}
-	dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], startDateTime.Format(utils.FormatDateUnSpace), utils.BASE_END_DATE_UnSpace, edbInfo.TerminalCode)
+	dataItem, err := services.GetEdbDataFromPbFinance(edbCodeArr[0], edbCodeArr[1], startDateTime.Format(utils.FormatDateUnSpace), utils.PB_BASE_END_DATE_UnSpace, edbInfo.TerminalCode)
+	// 日志记录
+	num := 0
+	if dataItem != nil {
+		num = len(dataItem.Date)
+	}
+	models.AddEdbRefreshApiRecordByRefresh(edbInfo, startDateTime.Format(utils.FormatDateUnSpace), num, err)
 	if err != nil {
 		br.Msg = "获取指标信息失败!"
 		br.ErrMsg = "获取指标信息失败 GetEdbDataFromPb,Err:" + err.Error()

+ 62 - 2
controllers/base_from_predict.go

@@ -59,7 +59,7 @@ func addPredict(br *models.BaseResponse, req models.AddPredictEdbInfoReq, lang s
 	}
 
 	// 添加指标
-	edbInfo, err, errMsg := logic.AddPredictEdbInfo(req.SourceEdbInfoId, req.ClassifyId, req.EdbName, req.DataDateType, req.RuleList, req.MinValue, req.MaxValue, req.AdminId, req.AdminName, lang)
+	edbInfo, err, errMsg := logic.AddPredictEdbInfo(req.SourceEdbInfoId, req.ClassifyId, req.EdbName, req.DataDateType, req.EndDateType, req.RuleList, req.MinValue, req.MaxValue, req.AdminId, req.AdminName, lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -97,7 +97,7 @@ func editPredict(br *models.BaseResponse, req models.AddPredictEdbInfoReq, lang
 	}
 
 	// 编辑指标
-	edbInfo, err, errMsg := logic.EditPredictEdbInfo(req.EdbInfoId, req.ClassifyId, req.EdbName, req.DataDateType, req.RuleList, req.MinValue, req.MaxValue, lang)
+	edbInfo, err, errMsg := logic.EditPredictEdbInfo(req.EdbInfoId, req.ClassifyId, req.EdbName, req.DataDateType, req.EndDateType, req.RuleList, req.MinValue, req.MaxValue, lang)
 	if err != nil {
 		br.Msg = "保存失败"
 		if errMsg != `` {
@@ -153,6 +153,13 @@ func (this *PredictController) Refresh() {
 		return
 	}
 
+	if edbInfo.IsStaticData == 1 {
+		//静态数据直接返回
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
 	if utils.Rc.IsExist(cacheKey) {
 		br.Ret = 501
@@ -275,3 +282,56 @@ func (this *PredictController) CalculateByNinePreview() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// AddStaticEdb
+// @Title 新增/编辑预测指标运算接口
+// @Description 新增预测指标运算接口
+// @Success 200 {object} models.AddStaticPredictEdbInfoReq
+// @router /static_edb/add [post]
+func (this *PredictController) AddStaticEdb() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddStaticPredictEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	//加入缓存机制,避免创建同一个名称的指标 start
+	redisKey := fmt.Sprintf("predict_edb_info:AddStaticEdb:%s", req.EdbName)
+	isExist := utils.Rc.IsExist(redisKey)
+	if isExist {
+		br.Msg = "指标正在处理,请勿重复提交"
+		return
+	} else {
+		//设置3分钟缓存
+		utils.Rc.SetNX(redisKey, 1, time.Second*300)
+		defer func() {
+			_ = utils.Rc.Delete(redisKey)
+		}()
+	}
+
+	// 添加指标
+	edbInfo, err, errMsg := logic.AddStaticPredictEdbInfo(req.SourceEdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.AdminId, req.AdminName, this.Lang)
+	if err != nil {
+		br.Msg = "保存失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = err.Error()
+		return
+	}
+	resp := models.AddEdbInfoResp{
+		EdbInfoId:  edbInfo.EdbInfoId,
+		UniqueCode: edbInfo.UniqueCode,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+	br.IsAddLog = true
+}

+ 12 - 3
controllers/base_from_predict_calculate.go

@@ -127,7 +127,7 @@ func addPredictCalculate(br *models.BaseResponse, req models.EdbInfoCalculateSav
 	}
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(1, 0, req.EdbName, lang)
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, 0, req.EdbName, lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
@@ -610,7 +610,7 @@ func (this *PredictCalculateController) CalculateBatchSave() {
 	//加入缓存机制,避免创建同一个名称的指标 end
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(1, req.EdbInfoId, req.EdbName, this.Lang)
+	existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, req.EdbInfoId, req.EdbName, this.Lang)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
 		br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
@@ -802,6 +802,9 @@ func (this *PredictCalculateController) CalculateBatchSave() {
 	} else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT {
 		sourName = "预测时间移位"
 		edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, this.Lang)
+	} else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_PHASE_SHIFT {
+		sourName = "预测期数移位"
+		edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculatePhaseShift(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, this.Lang)
 	} else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX {
 		sourName = "预测超季节性"
 		edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateCjjx(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt, this.Lang)
@@ -970,7 +973,13 @@ func (this *PredictCalculateController) Refresh() {
 		br.ErrMsg = "指标不存在"
 		return
 	}
-
+	if edbInfo.IsStaticData == 1 {
+		//静态数据直接返回
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
 	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
 	if utils.Rc.IsExist(cacheKey) {
 		br.Ret = 501

+ 175 - 0
controllers/base_from_purang.go

@@ -0,0 +1,175 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"time"
+)
+
+// PurangController 普兰金融
+type BaseFromPurangController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增普兰金融指标接口
+// @Description 新增普兰金融指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *BaseFromPurangController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	purang := new(models.BaseFromPurang)
+	source := purang.GetSource()
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+	err = purang.Add(req.EdbCode)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取指标信息失败 AddEdbDataFromPurang,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	return
+}
+
+// Refresh
+// @Title 刷新普兰金融指标接口
+// @Description 刷新普兰金融指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *BaseFromPurangController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	purang := new(models.BaseFromPurang)
+	source := purang.GetSource()
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId < 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+	if req.EdbInfoId <= 0 {
+		req.EdbInfoId = edbInfo.EdbInfoId
+	}
+	err = purang.Refresh(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromPurang,Err:" + err.Error()
+		return
+	}
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// HandleExcelData
+// @Title 处理普兰金融指标的接口
+// @Description 处理普兰金融指标的接口
+// @Success 200 {object} models.HandlePurangExcelDataReq
+// @router /handle/excel_data [post]
+func (this *BaseFromPurangController) HandleExcelData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.HandlePurangExcelDataReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 处理excel表数据
+	err = services.HandlePurangIndex(&req)
+	if err != nil {
+		fmt.Println("HandlePurangIndex Err:" + err.Error())
+		br.Msg = "处理失败"
+		br.ErrMsg = "处理失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+} 

+ 187 - 0
controllers/base_from_radish_research.go

@@ -0,0 +1,187 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"time"
+)
+
+// RadishResearchController 萝卜投研
+type RadishResearchController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增萝卜投研接口
+// @Description 新增萝卜投研接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *RadishResearchController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+
+	ob := new(models.BaseFromRadishResearch)
+	cacheKey = fmt.Sprintf("%s_%d_%s", utils.CACHE_EDB_DATA_ADD, ob.GetSource(), req.EdbCode)
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+	}()
+
+	if err = ob.Add(req.EdbCode); err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增萝卜投研指标数据失败, %v", err)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作失败"
+}
+
+// Refresh
+// @Title 刷新萝卜投研接口
+// @Description 刷新萝卜投研接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *RadishResearchController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId < 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	ob := new(models.BaseFromRadishResearch)
+	source := ob.GetSource()
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	if edbInfo != nil && edbInfo.EdbInfoId <= 0 {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+	}()
+	if req.EdbInfoId <= 0 {
+		req.EdbInfoId = edbInfo.EdbInfoId
+	}
+
+	if err = ob.Refresh(req.EdbInfoId, req.EdbCode, req.StartDate); err != nil {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = fmt.Sprintf("刷新萝卜投研指标失败, %v", err)
+		return
+	}
+
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// HandleIndex
+// @Title 处理萝卜投研的指标数据
+// @Description 处理萝卜投研的指标数据接口
+// @Success 200 string "操作成功"
+// @router /handle/index [post]
+func (this *RadishResearchController) HandleIndex() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.HandleRadishResearchEdbDataReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 处理excel表数据
+	if err = services.HandleRadishResearchIndex(&req); err != nil {
+		br.Msg = "处理失败"
+		br.ErrMsg = "处理失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}

+ 723 - 0
controllers/base_from_rzd.go

@@ -0,0 +1,723 @@
+// @Author gmy 2024/8/13 16:01:00
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"time"
+)
+
+type BaseFromRzdController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增睿姿得指标
+// @Description 新增粮油商务网指标
+// @router /add [post]
+func (this *BaseFromRzdController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_RZD
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if !utils.Rc.IsExist(cacheKey) {
+		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+		err = models.AddEdbDataFromRzd(req.EdbCode)
+		if err != nil {
+			br.Msg = "获取指标信息失败!"
+			br.ErrMsg = "获取指标信息失败 AddEdbDataFromSci99,Err:" + err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+	} else {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+	}
+}
+
+// Refresh
+// @Title 刷新粮油商务网指标接口
+// @Description 刷新粮油商务网指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *BaseFromRzdController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	source := utils.DATA_SOURCE_RZD
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	dataUpdateTime := time.Now().Format(utils.FormatDateTime)
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	err = models.RefreshEdbDataFromRzd(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromBloomberg,Err:" + err.Error()
+		return
+	}
+
+	// 更新指标最大最小值
+	erDataUpdateDate, err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfoDataUpdate(edbInfo, dataUpdateTime)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+	// 添加指标刷新成功日志
+	if erDataUpdateDate != "" {
+		_ = services.AddEdbInfoUpdateLog(edbInfo.EdbInfoId, 1, "", 1, "", 0, 0)
+	} else {
+		_ = services.AddEdbInfoUpdateLog(edbInfo.EdbInfoId, 1, "", 2, "未刷新到数据", 0, 0)
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// AddRzdClassify
+// @Title 新增分类
+// @Description 获取分类
+// @Success 200 {object} models.BaseFromRzdClassify
+// @router /add/rzd/classify [post]
+func (this *BaseFromRzdController) AddRzdClassify() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		ClassifyName string `json:"ClassifyName"`
+		ParentId     int    `json:"parentId"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+	categoryName := reqData.ClassifyName
+	if categoryName == "" {
+		br.Msg = "请输入分类!"
+		br.ErrMsg = "请输入分类"
+		return
+	}
+	rzdClassify := models.BaseFromRzdClassify{
+		ClassifyName: categoryName,
+		ParentId:     reqData.ParentId,
+		CreateTime:   utils.GetCurrentTime(),
+		ModifyTime:   utils.GetCurrentTime(),
+	}
+
+	lyClassify, err := models.AddRzdClassify(&rzdClassify)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyClassify
+	br.Msg = "获取成功"
+}
+
+// GetRzdClassifyByName
+// @Title 获取分类
+// @Description 获取分类
+// @Success 200 {object} models.BaseFromRzdClassify
+// @router /get/rzd/classify/by/name [post]
+func (this *BaseFromRzdController) GetRzdClassifyByName() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		ClassifyName string `json:"ClassifyName"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+	categoryName := reqData.ClassifyName
+	if categoryName == "" {
+		br.Msg = "请输入分类!"
+		br.ErrMsg = "请输入分类"
+		return
+	}
+
+	lyClassify, err := models.GetRzdClassifyByName(categoryName)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyClassify
+	br.Msg = "获取成功"
+}
+
+// AddBatchRzdData
+// @Title 新增数据源指标数据
+// @Description 新增数据源指标数据
+// @Success 200 string "处理成功"
+// @router /add/batch/rzd/data [post]
+func (this *BaseFromRzdController) AddBatchRzdData() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req []models.BaseFromRzdData
+	fmt.Println(string(this.Ctx.Input.RequestBody))
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	err = models.AddRzdDataList(req)
+	if err != nil {
+		br.Msg = "新增指标数据失败!"
+		br.ErrMsg = "新增指标数据失败,Err:" + err.Error()
+		return
+	}
+
+	// 维护start_date,end_date,latest_value字段
+	var indexCodes []string
+	for _, data := range req {
+		indexCodes = append(indexCodes, data.IndexCode)
+	}
+	mapInfo, err := models.GetRzdDataMaxAndMinDateByIndexCodes(indexCodes)
+	if err != nil {
+		return
+	}
+	for indexCode, info := range mapInfo {
+		_ = models.UpdateRzdEdbDataByIndexCodes(indexCode, info)
+	}
+
+	// 同步新增指标库数据
+	// 判断是否存在于指标库
+	// 获取指标详情
+	/* 调用方对 指标库数据做了维护处理
+	var dataList []models.EdbDataRzd
+	for _, data := range req {
+		edbInfo, err := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_RZD, data.IndexCode)
+		if err != nil {
+			br.Msg = "指标不存在!"
+			br.ErrMsg = "指标不存在"
+			return
+		}
+		if edbInfo.EdbInfoId == 0 {
+			continue
+		}
+		dataRzd := models.EdbDataRzd{
+			EdbInfoId:     data.BaseFromRzdIndexId,
+			DataTime:      data.DataTime,
+			Value:         data.Value,
+			EdbCode:       data.IndexCode,
+			CreateTime:    utils.GetCurrentTime(),
+			ModifyTime:    utils.GetCurrentTime(),
+			DataTimestamp: uint64(time.Now().UnixNano() / int64(time.Millisecond)),
+		}
+		dataList = append(dataList, dataRzd)
+	}
+	_ = models.AddRzdEdbDataList(dataList)*/
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// AddRzdIndex
+// @Title 新增指标
+// @Description 新增指标
+// @Success 200 string "处理成功"
+// @router /add/rzd/index [post]
+func (this *BaseFromRzdController) AddRzdIndex() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.BaseFromRzdIndex
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	indexId, err := models.AddRzdIndex(&req)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = indexId
+	br.Msg = "处理成功"
+}
+
+// GetRzdIndexDataByIndexIdAndDataTime
+// @Title 根据指标code和时间获取指标数据
+// @Description 根据指标code和时间获取指标数据
+// @Success 200 {object} models.BaseFromLyData
+// @router /get/rzd/index/data/by/code/and/time [post]
+func (this *BaseFromRzdController) GetRzdIndexDataByIndexIdAndDataTime() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+		DataTime  string `json:"DataTime"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标code!"
+		br.ErrMsg = "请输入指标code"
+		return
+	}
+
+	dataTime := reqData.DataTime
+	if dataTime == "" {
+		br.Msg = "请输入时间!"
+		br.ErrMsg = "请输入时间"
+		return
+	}
+
+	rzdData, err := models.GetRzdDataByIndexCodeAndDataTime(indexCode, dataTime)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = rzdData
+	br.Msg = "获取成功"
+}
+
+// UpdateRzdDataById
+// @Title 更新数据源指标数据
+// @Description 更新数据源指标数据
+// @Success 200 string "处理成功"
+// @router /update/rzd/data/by/id [post]
+func (this *BaseFromRzdController) UpdateRzdDataById() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		Id    int     `json:"Id"`
+		Value float64 `json:"Value"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	id := reqData.Id
+	if id == 0 {
+		br.Msg = "请输入id!"
+		br.ErrMsg = "请输入id"
+		return
+	}
+
+	value := reqData.Value
+	if value == 0 {
+		br.Msg = "请输入值!"
+		br.ErrMsg = "请输入值"
+		return
+	}
+
+	err = models.UpdateRzdDataById(id, value)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// GetRzdEdbDataByIndexCodeAndDataTime
+// @Title 根据指标编码和精确日期获取指标库数据
+// @Description 根据指标编码和精确日期获取指标库数据
+// @Success 200 {object} []models.EdbDataRzd
+// @router /get/edb/rzd/data/by/code/and/time [post]
+func (this *BaseFromRzdController) GetRzdEdbDataByIndexCodeAndDataTime() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+		DataTime  string `json:"DataTime"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	dataTime := reqData.DataTime
+	if dataTime == "" {
+		br.Msg = "请输入时间!"
+		br.ErrMsg = "请输入时间"
+		return
+	}
+
+	lyEdbData, err := models.GetLyEdbDataByIndexCodeAndExactDataTime(indexCode, dataTime)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyEdbData
+	br.Msg = "获取成功"
+}
+
+// GetRzdEdbInfoByIndexCode
+// @Title 根据指标编码获取指标库指标
+// @Description 根据指标编码获取指标库指标
+// @Success 200 {object} []models.EdbDataRzd
+// @router /get/rzd/edb/info/by/code [post]
+func (this *BaseFromRzdController) GetRzdEdbInfoByIndexCode() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+		Source    int    `json:"Source"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+	source := reqData.Source
+	if source == 0 {
+		br.Msg = "请输入来源!"
+		br.ErrMsg = "请输入来源"
+		return
+	}
+
+	lyEdbData, err := models.GetEdbInfoByEdbCode(source, indexCode)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = lyEdbData
+	br.Msg = "获取成功"
+}
+
+// UpdateRzdEdbDataById
+// @Title 更新指标库数据 须根据指标编码和日期更新 仅适合月度数据
+// @Description 更新指标库数据 须根据指标编码和日期更新 仅适合月度数据
+// @Success 200 string "处理成功"
+// @router /update/rzd/edb/data/by/id [post]
+func (this *BaseFromRzdController) UpdateRzdEdbDataById() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		Id    int     `json:"Id"`
+		Value float64 `json:"Value"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	id := reqData.Id
+	if id == 0 {
+		br.Msg = "请输入id!"
+		br.ErrMsg = "请输入id"
+		return
+	}
+
+	value := reqData.Value
+	if value == 0 {
+		br.Msg = "请输入值!"
+		br.ErrMsg = "请输入值"
+		return
+	}
+
+	err = models.UpdateRzdEdbDataById(id, value)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// GetRzdIndexByCode
+// @Title 查询指标编码是否存在
+// @Description 查询指标编码是否存在
+// @Success 200 {object} models.BaseFromLyIndex
+// @router /get/rzd/index/by/code [post]
+func (this *BaseFromRzdController) GetRzdIndexByCode() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var reqData struct {
+		IndexCode string `json:"IndexCode"`
+	}
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &reqData)
+	if err != nil {
+		br.ErrMsg = "无法解析请求体"
+		return
+	}
+
+	indexCode := reqData.IndexCode
+	if indexCode == "" {
+		br.Msg = "请输入指标id!"
+		br.ErrMsg = "请输入指标id"
+		return
+	}
+
+	rzdIndex, err := models.GetRzdIndexByCode(indexCode)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Data = rzdIndex
+	br.Msg = "获取成功"
+}
+
+// AddBatchRzdEdbData
+// @Title 批量增加睿咨得指标库数据
+// @Description 批量增加睿咨得指标库数据
+// @Success 200 string "处理成功"
+// @router /add/batch/rzd/edb/data [post]
+func (this *BaseFromRzdController) AddBatchRzdEdbData() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req []models.EdbDataRzd
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	err = models.AddRzdEdbDataList(req)
+	if err != nil {
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}
+
+// UpdateRzdEdbData
+// @Title 修改指标数据
+// @Description 修改指标数据
+// @Success 200 string "处理成功"
+// @router /update/rzd/edb/data [post]
+func (this *BaseFromRzdController) UpdateRzdEdbData() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		_ = utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.BaseFromRzdData
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	err = models.UpdateRzdData(&req)
+	if err != nil {
+		return
+	}
+
+	// 同步更新指标库数据
+	edbInfo, err := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_RZD, req.IndexCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	if edbInfo.EdbInfoId > 0 {
+		err = models.UpdateRzdEdbDataByIndexCodeAndDataTime(req.BaseFromRzdIndexId, req.DataTime, req.Value)
+		if err != nil {
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}

+ 1 - 1
controllers/base_from_sci99.go

@@ -108,7 +108,7 @@ func (this *Sci99Controller) Refresh() {
 	err = models.RefreshEdbDataFromSci99(req.EdbInfoId, req.EdbCode, req.StartDate)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "刷新指标信息失败!"
-		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromIcpi,Err:" + err.Error()
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromSci99,Err:" + err.Error()
 		return
 	}
 	// 更新指标最大最小值

+ 1 - 1
controllers/base_from_ths.go

@@ -121,7 +121,7 @@ func (this *ThsController) Refresh() {
 		return
 	}
 	err = models.RefreshEdbDataFromThs(req.EdbInfoId, req.EdbCode, utils.GetEdbRefreshStartDate(req.StartDate), dataItem)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "刷新指标信息失败!"
 		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromThs,Err:" + err.Error()
 		return

+ 283 - 0
controllers/base_from_trade_analysis.go

@@ -0,0 +1,283 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	excelModel "eta/eta_index_lib/models/excel"
+	tradeAnalysisModel "eta/eta_index_lib/models/trade_analysis"
+	tradeAnalysisService "eta/eta_index_lib/services/trade_analysis"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"time"
+)
+
+// BaseFromTradeAnalysisController 持仓分析指标
+type BaseFromTradeAnalysisController struct {
+	BaseAuthController
+}
+
+// EdbRefresh
+// @Title 指标库刷新
+// @Description 指标库刷新
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /edb/refresh [post]
+func (this *BaseFromTradeAnalysisController) EdbRefresh() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId < 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+	edbOb := new(models.EdbTradeAnalysis)
+	source := edbOb.GetSource()
+
+	cacheKey := fmt.Sprintf("%s_%d_%s", utils.CACHE_EDB_DATA_REFRESH, source, req.EdbCode)
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+	}()
+
+	// 获取指标详情
+	edbInfo, e := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if e != nil {
+		br.Msg = "指标不存在"
+		br.ErrMsg = fmt.Sprintf("指标不存在, %v", e)
+		return
+	}
+	formula := edbInfo.CalculateFormula
+
+	// 校验计算公式
+	var extraConfig tradeAnalysisModel.WarehouseExtraConfig
+	if formula == `` {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式有误, conf: %s", formula)
+		return
+	}
+	if e := json.Unmarshal([]byte(formula), &extraConfig); e != nil {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式解析失败, err: %v; conf: %s", e, formula)
+		return
+	}
+	if extraConfig.Exchange == "" {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式交易所异常, conf: %s", formula)
+		return
+	}
+	if extraConfig.ClassifyName == "" {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式品种异常, conf: %s", formula)
+		return
+	}
+	if len(extraConfig.Contracts) == 0 {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式合约异常, conf: %s", formula)
+		return
+	}
+	if len(extraConfig.Companies) != 1 {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式期货公司异常, conf: %s", formula)
+		return
+	}
+	if extraConfig.PredictRatio < 0 || extraConfig.PredictRatio > 1 {
+		br.Msg = "指标计算公式有误"
+		br.ErrMsg = fmt.Sprintf("指标计算公式估计参数异常, conf: %s", formula)
+		return
+	}
+
+	// 获取持仓数据
+	companyTradeData, e := tradeAnalysisService.GetWarehouseTradeData(extraConfig.Exchange, extraConfig.ClassifyName, extraConfig.Contracts, extraConfig.Companies, extraConfig.PredictRatio)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取期货公司持仓加总数据失败, %v", e)
+		return
+	}
+	if len(companyTradeData) == 0 {
+		br.Msg = "期货数据为空"
+		return
+	}
+
+	// 转换持仓数据为指标数据
+	convertData, e := tradeAnalysisService.FormatCompanyTradeData2EdbData(companyTradeData[0], extraConfig.WarehouseChartType)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("持仓数据转为指标数据失败, %v", e)
+		return
+	}
+
+	// 刷新指标
+	if e = edbOb.Refresh(edbInfo, convertData); e != nil {
+		br.Msg = "刷新指标失败"
+		br.ErrMsg = fmt.Sprintf("刷新指标失败, %v", e)
+		return
+	}
+
+	// 更新指标最值
+	if e = edbOb.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo); e != nil {
+		br.Msg = "刷新指标失败"
+		br.ErrMsg = fmt.Sprintf("更新指标最值失败, %v", e)
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// TableRefresh
+// @Title 表格刷新
+// @Description 表格刷新
+// @Success 200 {object} tradeAnalysisModel.RefreshTableReq
+// @router /table/refresh [post]
+func (this *BaseFromTradeAnalysisController) TableRefresh() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req tradeAnalysisModel.RefreshTableReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = fmt.Sprintf("参数解析失败, %v", e)
+		return
+	}
+	if req.ExcelInfoId <= 0 {
+		br.Msg = "请输入表格ID"
+		br.ErrMsg = "请输入表格ID"
+		return
+	}
+
+	cacheKey := fmt.Sprintf("%s_%d", utils.CACHE_EXCEL_REFRESH, req.ExcelInfoId)
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 2*time.Minute)
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+	}()
+
+	// 获取表格信息
+	excelOb := new(excelModel.ExcelInfo)
+	item, e := excelOb.GetItemById(req.ExcelInfoId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "表格不存在"
+			br.ErrMsg = fmt.Sprintf("表格不存在, ExcelId: %d", req.ExcelInfoId)
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
+		return
+	}
+	if item.IsDelete == 1 {
+		br.Msg = "表格已被删除"
+		br.ErrMsg = fmt.Sprintf("表格已被删除, ExcelId: %d", req.ExcelInfoId)
+		return
+	}
+
+	// 获取表格数据
+	switch item.Source {
+	case utils.TRADE_ANALYSIS_TABLE:
+		// 多空分析
+		var tableConfig tradeAnalysisModel.TableExtraConfig
+		if item.ExtraConfig == "" {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("表格配置为空, ExcelId: %d", item.ExcelInfoId)
+			return
+		}
+		if e = json.Unmarshal([]byte(item.ExtraConfig), &tableConfig); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("表格配置解析失败, ExcelId: %d, Err: %v", item.ExcelInfoId, e)
+			return
+		}
+		tableData, e := tradeAnalysisService.GetTableRowsDataByConfig(tableConfig)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
+			return
+		}
+		content, e := json.Marshal(tableData)
+		if e != nil {
+			br.Msg = "表格数据JSON格式化失败"
+			br.ErrMsg = fmt.Sprintf("表格数据JSON格式化失败, %v", e)
+			return
+		}
+		item.Content = string(content)
+	case utils.TRADE_ANALYSIS_CORRELATION_TABLE:
+		// 相关性表格
+		var tableConfig tradeAnalysisModel.CorrelationTableExtraConfig
+		if item.ExtraConfig == "" {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("表格配置为空, ExcelId: %d", item.ExcelInfoId)
+			return
+		}
+		if e = json.Unmarshal([]byte(item.ExtraConfig), &tableConfig); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("表格配置解析失败, ExcelId: %d, Err: %v", item.ExcelInfoId, e)
+			return
+		}
+		tableData, e := tradeAnalysisService.GetCorrelationTableRowsDataByConfig(tableConfig)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取表格数据失败, %v", e)
+			return
+		}
+		content, e := json.Marshal(tableData)
+		if e != nil {
+			br.Msg = "表格数据JSON格式化失败"
+			br.ErrMsg = fmt.Sprintf("表格数据JSON格式化失败, %v", e)
+			return
+		}
+		item.Content = string(content)
+	default:
+		br.Msg = "表格来源有误"
+		br.ErrMsg = fmt.Sprintf("表格来源有误, ExcelId: %d, Source: %d", item.ExcelInfoId, item.Source)
+		return
+	}
+
+	// 更新内容
+	updateCols := []string{"Content", "ModifyTime"}
+	if e = item.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("更新表格数据失败, %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 174 - 0
controllers/base_from_usda_fas.go

@@ -0,0 +1,174 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/logic"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"time"
+)
+
+// UsdaFasController 涌益咨询
+type UsdaFasController struct {
+	BaseAuthController
+}
+
+// Add
+// @Title 新增涌益咨询指标接口
+// @Description 新增涌益咨询指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /add [post]
+func (this *UsdaFasController) Add() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	usdaFas := new(models.BaseFromUsdaFas)
+	source := usdaFas.GetSource()
+	var req models.AddEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+	err = usdaFas.Add(req.EdbCode)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取指标信息失败 AddEdbDataFromUsdaFas,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	return
+}
+
+// Refresh
+// @Title 刷新涌益咨询指标接口
+// @Description 刷新涌益咨询指标接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /refresh [post]
+func (this *UsdaFasController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	usdaFas := new(models.BaseFromUsdaFas)
+	source := usdaFas.GetSource()
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId < 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+
+	// 获取指标详情
+	edbInfo, err := models.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+	if req.EdbInfoId <= 0 {
+		req.EdbInfoId = edbInfo.EdbInfoId
+	}
+	err = usdaFas.Refresh(req.EdbInfoId, req.EdbCode, req.StartDate)
+	if err != nil && !utils.IsErrNoRow(err) {
+		br.Msg = "刷新指标信息失败!"
+		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromusdaFas,Err:" + err.Error()
+		return
+	}
+	// 更新指标最大最小值
+	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	// 更新ES
+	go logic.UpdateEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// HandleExcelData
+// @Title 处理涌益咨询指标的接口
+// @Description 处理涌益咨询指标的接口
+// @Success 200 {object} models.HandleUsdaFasExcelDataReq
+// @router /handle/excel_data [post]
+func (this *UsdaFasController) HandleExcelData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.HandleUsdaFasExcelDataReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 处理excel表数据
+	err = services.HandleUsdaFasIndex(&req)
+	if err != nil {
+		fmt.Println("HandleMysteelIndex Err:" + err.Error())
+		br.Msg = "处理失败"
+		br.ErrMsg = "处理失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "处理成功"
+}

+ 163 - 1
controllers/commodity_coal.go

@@ -224,6 +224,23 @@ func (this *CoalMineDataController) JsmHistory() {
 		}
 	}
 
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+			for _, v := range indexItems {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineJsmIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -449,6 +466,24 @@ func (this *CoalMineDataController) CoastalHistory() {
 			}
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+			for _, v := range indexItems {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineCoastalIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -653,6 +688,24 @@ func (this *CoalMineDataController) InlandHistory() {
 			}
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+			for _, v := range indexItems {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineInlandIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1001,6 +1054,56 @@ func (this *CoalMineDataController) Jsm() {
 
 	}
 
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+
+			for _, v := range items {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineJsmIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+
+			for _, v := range itemsIndex {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineJsmIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+
+			for _, v := range itemsCompany {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineCompanyIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+			for _, v := range itemsCompanyIndex {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineCompanyIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1210,6 +1313,24 @@ func (this *CoalMineDataController) Coastal() {
 			}
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+			for _, v := range indexItems {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineCoastalIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1421,6 +1542,24 @@ func (this *CoalMineDataController) Inland() {
 			}
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+			for _, v := range indexItems {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineInlandIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1447,7 +1586,6 @@ func (this *CoalMineDataController) Firm() {
 		return
 	}
 
-
 	var year, month, day string
 	var yearMap = make(map[int]string)
 	var monthMap = make(map[int]string)
@@ -1655,6 +1793,30 @@ func (this *CoalMineDataController) Firm() {
 			}
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			obj := new(models.BaseFromCoalmineMapping)
+			for _, v := range indexItems {
+				indexCode := v.IndexCode
+				var dateItem *models.EdbInfoMaxAndMinInfo
+				dateItem, err = obj.GetMaxAndMinDateByIndexCode(indexCode, models.CoalmineFirmIndexName)
+				if err != nil {
+					err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+					return
+				}
+				dateItem.LatestDate, _ = utils.FormatZhDate(dateItem.LatestDate)
+				dateItem.MinDate, _ = utils.FormatZhDate(dateItem.MinDate)
+				dateItem.MaxDate, _ = utils.FormatZhDate(dateItem.MaxDate)
+				obj.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+			}
+		}()
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
 	return
 }
 

+ 3 - 5
controllers/edb_info.go

@@ -85,7 +85,7 @@ func (this *EdbInfoController) Add() {
 	var isAdd bool
 	item, err := models.GetEdbInfoByEdbCode(req.Source, req.EdbCode)
 	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
+		if utils.IsErrNoRow(err) {
 			isAdd = true
 		} else {
 			br.Msg = "判断指标是否存在失败!"
@@ -306,10 +306,8 @@ func (this *EdbInfoController) RefreshCheck() {
 
 	if req.FrequencyBatch != "" {
 		frequency := strings.Split(req.FrequencyBatch, ",")
-		condition += ` and frequency in (` + utils.GetOrmInReplace(len(frequency)) + `)`
-		for _, v := range frequency {
-			pars = append(pars, v)
-		}
+		condition += ` and frequency in (?)`
+		pars = append(pars, frequency)
 	}
 	updateCondition := condition + ` and latest_date = ?`
 	pars = append(pars, req.LatestDate)

+ 10 - 10
controllers/exchange_crawler.go

@@ -62,12 +62,12 @@ func (this *ExchangeCrawler) RefreshIne() {
 		if p.Rank > 0 && p.Rank < 40 && p.Participantabbr1 != "" {
 			//成交量
 			item.Rank = p.Rank
-			item.DealShortName = p.Participantabbr1
-			item.BuyShortName = p.Participantabbr2
-			item.SoldShortName = p.Participantabbr3
-			item.DealName = strings.Replace(fmt.Sprintf("%s", p.Participantabbr1+"_"+p.Instrumentid+"_成交量(手)"), " ", "", -1)
-			item.BuyName = strings.Replace(fmt.Sprintf("%s", p.Participantabbr2+"_"+p.Instrumentid+"_持买单量(手)"), " ", "", -1)
-			item.SoldName = strings.Replace(fmt.Sprintf("%s", p.Participantabbr3+"_"+p.Instrumentid+"_持卖单量(手)"), " ", "", -1)
+			item.DealShortName = strings.Trim(p.Participantabbr1, " ")
+			item.BuyShortName = strings.Trim(p.Participantabbr2, " ")
+			item.SoldShortName = strings.Trim(p.Participantabbr3, " ")
+			item.DealName = strings.Replace(fmt.Sprintf("%s", item.DealShortName+"_"+p.Instrumentid+"_成交量(手)"), " ", "", -1)
+			item.BuyName = strings.Replace(fmt.Sprintf("%s", item.BuyShortName+"_"+p.Instrumentid+"_持买单量(手)"), " ", "", -1)
+			item.SoldName = strings.Replace(fmt.Sprintf("%s", item.SoldShortName+"_"+p.Instrumentid+"_持卖单量(手)"), " ", "", -1)
 			item.DealCode = IneIndexCodeGenerator(item.DealShortName, item.DealName, p.Instrumentid, "deal")
 			item.BuyCode = IneIndexCodeGenerator(item.BuyShortName, item.BuyName, p.Instrumentid, "buy")
 			item.SoldCode = IneIndexCodeGenerator(item.SoldShortName, item.SoldName, p.Instrumentid, "sold")
@@ -114,9 +114,9 @@ func (this *ExchangeCrawler) RefreshIne() {
 		} else if p.Rank == 999 {
 			//Top 20
 			item.Rank = p.Rank
-			item.DealShortName = p.Participantabbr1
-			item.BuyShortName = p.Participantabbr2
-			item.SoldShortName = p.Participantabbr3
+			item.DealShortName = strings.Trim(p.Participantabbr1, " ")
+			item.BuyShortName = strings.Trim(p.Participantabbr2, " ")
+			item.SoldShortName = strings.Trim(p.Participantabbr3, " ")
 			item.DealName = strings.Replace(fmt.Sprintf("%s", "top20_"+p.Instrumentid+"_成交量(手)"), " ", "", -1)
 			item.BuyName = strings.Replace(fmt.Sprintf("%s", "top20_"+p.Instrumentid+"_持买单量(手)"), " ", "", -1)
 			item.SoldName = strings.Replace(fmt.Sprintf("%s", "top20_"+p.Instrumentid+"_持卖单量(手)"), " ", "", -1)
@@ -392,4 +392,4 @@ func IneIndexCodeGenerator(shortName, indexName, Instrumentid, suffix string) st
 		}
 	}
 	return strings.Replace(ineIndexCode, " ", "", -1)
-}
+}

+ 22 - 8
controllers/factor_edb_series/factor_edb_series.go

@@ -198,7 +198,7 @@ func (this *FactorEdbSeriesController) ChartRecalculate() {
 	if utils.Rc.IsExist(cacheKey) {
 		br.Ret = 501
 		br.Success = true
-		br.Msg = fmt.Sprintf("系统处理中, 请稍后重试, 图表ID: %s", req.ChartInfoId)
+		br.Msg = fmt.Sprintf("系统处理中, 请稍后重试, 图表ID: %d", req.ChartInfoId)
 		return
 	}
 	utils.Rc.SetNX(cacheKey, 1, 10*time.Minute)
@@ -232,7 +232,9 @@ func (this *FactorEdbSeriesController) ChartRecalculate() {
 	edbInfoIds := make([]int, 0)
 	for _, v := range mappings {
 		seriesIds = append(seriesIds, v.FactorEdbSeriesId)
-		edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+		if v.EdbInfoId > 0 {
+			edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+		}
 	}
 
 	// 获取因子指标及系列信息
@@ -253,12 +255,17 @@ func (this *FactorEdbSeriesController) ChartRecalculate() {
 		}
 	}
 	edbIdItem := make(map[int]*models.EdbInfo)
-	edbItems, e := models.GetEdbInfoByIdList(edbInfoIds)
-	if e != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取因子指标失败, Err: " + e.Error()
-		return
+	edbItems := make([]*models.EdbInfo, 0)
+	var err error
+	if len(edbInfoIds) > 0 {
+		edbItems, err = models.GetEdbInfoByIdList(edbInfoIds)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取因子指标失败, Err: " + err.Error()
+			return
+		}
 	}
+
 	for _, v := range edbItems {
 		edbIdItem[v.EdbInfoId] = v
 	}
@@ -269,9 +276,10 @@ func (this *FactorEdbSeriesController) ChartRecalculate() {
 	calculateDataOb := new(models.FactorEdbSeriesCalculateData)
 	for _, v := range mappings {
 		edbItem := edbIdItem[v.EdbInfoId]
-		if edbItem == nil {
+		if edbItem == nil && v.CalculateType == models.FactorEdbSeriesChartCalculateTypeCorrelation {
 			continue
 		}
+
 		seriesItem := seriesIdItem[v.FactorEdbSeriesId]
 		if seriesItem == nil {
 			continue
@@ -405,6 +413,12 @@ func (this *FactorEdbSeriesController) ChartRecalculate() {
 					utils.FileLog.Info(fmt.Sprintf("相关性-更新矩阵数据失败, err: %v", e))
 					return
 				}
+			} else if chartMapping.CalculateType == models.FactorEdbSeriesChartCalculateTypeRange {
+				err, errMsg := services.RangeAnalysisChartCalculate(seriesItem.FactorEdbSeriesId, req.ChartInfoId, chartMapping)
+				if err != nil {
+					utils.FileLog.Info(fmt.Sprintf("区间分析图表数据更新失败, err: %v,errMsg %s", err, errMsg))
+					return
+				}
 			}
 		}(v, edbItem, seriesItem)
 	}

+ 10 - 40
controllers/future_good/future_good_edb_info.go

@@ -8,7 +8,7 @@ import (
 	"eta/eta_index_lib/models/future_good"
 	"eta/eta_index_lib/services"
 	"eta/eta_index_lib/utils"
-	"fmt"
+	"strconv"
 	"time"
 )
 
@@ -206,19 +206,19 @@ func (this *FutureGoodEdbInfoController) RefreshRelation() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	var req future_good.RefreshFutureEdbEdbInfoReq
+	var req future_good.RefreshFutureChartInfoReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	if req.FutureGoodEdbInfoId <= 0 {
-		br.Msg = "请输入指标ID!"
-		br.ErrMsg = "请输入指标ID"
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请输入图表ID!"
+		br.ErrMsg = "请输入图表ID"
 		return
 	}
-	cacheKey = utils.CACHE_EDB_DATA_REFRESH + "_futuregood_relation_" + req.FutureGoodEdbCode
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + "_futuregood_relation_chart" + strconv.Itoa(req.ChartInfoId)
 
 	if utils.Rc.IsExist(cacheKey) {
 		br.Ret = 501
@@ -227,47 +227,17 @@ func (this *FutureGoodEdbInfoController) RefreshRelation() {
 		return
 	}
 
-	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	utils.Rc.SetNX(cacheKey, 1, 10*time.Minute)
 	defer func() {
 		utils.Rc.Delete(cacheKey)
 	}()
-
-	//获取指标信息
-	futureGoodEdbInfo, err := future_good.GetFutureGoodEdbInfo(req.FutureGoodEdbInfoId)
+	err, errMsg := logic.RefreshByChartId(req.ChartInfoId)
 	if err != nil {
-		if err.Error() != utils.ErrNoRow() {
-			br.Msg = "系统内找不到该指标"
-		} else {
-			br.Msg = "刷新失败"
-			br.ErrMsg = "添加失败,ERR:" + err.Error()
-		}
+		br.Msg = "利润曲线图表刷新失败"
+		br.ErrMsg = "利润曲线图表刷新失败,Err:" + errMsg
 		return
 	}
 
-	// 获取相关图表
-	list, err := models.GetGroupChartEdbMappingListByEdbInfoId(futureGoodEdbInfo.FutureGoodEdbInfoId, 2)
-	if err != nil {
-		br.Msg = "查找相关图表id失败"
-		br.ErrMsg = "添加失败,ERR:" + err.Error()
-		return
-	}
-
-	go func() {
-		errMsgList := make([]string, 0)
-		for _, v := range list {
-			err, errMsg := logic.RefreshByChartId(v.ChartInfoId)
-			if err != nil {
-				errMsgList = append(errMsgList, fmt.Sprint(v.ChartInfoId, "更新失败,"+errMsg))
-			}
-		}
-
-		if len(errMsgList) > 0 {
-			//br.Msg = "部分刷新失败"
-			//br.ErrMsg = "部分刷新失败,Err:" + strings.Join(errMsgList, ";")
-			return
-		}
-	}()
-
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"

+ 21 - 1
controllers/sci99_crawler.go

@@ -113,6 +113,12 @@ func (this *Sci99Crawler) RefreshSci99Classify() {
 
 	existDataMap := make(map[string]*models.BaseFromSci99Data)
 
+	sic99Info, ok := IndexMap[indexName]
+	if !ok {
+		utils.FileLog.Info("指标异常,通过名称找不到指标")
+		return
+	}
+
 	//获取所有指标信息
 	allData, e := models.GetBaseFromTradeSci99DataAll(indexCode)
 	if e != nil {
@@ -143,7 +149,7 @@ func (this *Sci99Crawler) RefreshSci99Classify() {
 		} else {
 			// 新增
 			dataItem := models.BaseFromSci99Data{
-				BaseFromSciIndexId: IndexMap[indexName].BaseFromSciIndexId,
+				BaseFromSciIndexId: sic99Info.BaseFromSciIndexId,
 				IndexCode:          indexCode,
 				DataTime:           v.RealDate,
 				Value:              v.MDataValue,
@@ -163,6 +169,20 @@ func (this *Sci99Crawler) RefreshSci99Classify() {
 			return
 		}
 	}
+
+	// 更新指标最新日期
+	{
+		go func() {
+			var dateItem *models.EdbInfoMaxAndMinInfo
+			dateItem, err = sic99Info.GetMaxAndMinDateByIndexCode(indexCode)
+			if err != nil {
+				err = fmt.Errorf("查询指标最新日期失败 Err:%s", err)
+				return
+			}
+			sic99Info.ModifyIndexMaxAndMinDate(indexCode, dateItem)
+		}()
+	}
+
 	time.Sleep(1 * time.Second)
 
 	br.Ret = 200

+ 73 - 1
controllers/shanghai_smm.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"encoding/json"
+	"eta/eta_index_lib/logic"
 	"eta/eta_index_lib/models"
 	shanghaismm "eta/eta_index_lib/services/shanghai_smm"
 	"eta/eta_index_lib/utils"
@@ -28,13 +29,17 @@ var ShanghaiSmmNameToCodeMap = make(map[string]string)
 // @router /refresh/list [post]
 func (this *ShanghaiSmmController) RefreshData() {
 	br := new(models.BaseResponse).Init()
+	var err error
 	defer func() {
+		if err != nil {
+			utils.FileLog.Error("SMM-RefreshData err:", err)
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
 
 	var req []*shanghaismm.EdbInfoData
-	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+	if err = json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
 		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
@@ -56,6 +61,7 @@ func (this *ShanghaiSmmController) RefreshData() {
 	updateIndexList := make([]*models.BaseFromSmmIndex, 0)
 	addDateList := make([]*models.BaseFromSmmData, 0)
 	readyDateList := make([]*models.BaseFromSmmData, 0)
+	updateIndexCode := make([]string, 0)
 	for _, v := range req {
 		indexInfo := ShanghaiSmmNameToIndexMap[v.IndexName]
 		if indexInfo == nil {
@@ -121,6 +127,7 @@ func (this *ShanghaiSmmController) RefreshData() {
 				item.ModifyTime = time.Now()
 				item.DataTimestamp = time.Now().UnixMilli()
 				addDateList = append(addDateList, item)
+				updateIndexCode = append(updateIndexCode, indexInfo.IndexCode)
 			} else {
 				smmData, err := models.GetBaseFromSmmDataByCodeAndDate(indexInfo.IndexCode, v.RenewDate)
 				if err != nil {
@@ -143,6 +150,7 @@ func (this *ShanghaiSmmController) RefreshData() {
 					if err != nil {
 						utils.FileLog.Info("indexCode: %s,更新指标数据失败,Err:%s", v.IndexCode, err.Error())
 					}
+					updateIndexCode = append(updateIndexCode, indexInfo.IndexCode)
 				}
 
 			}
@@ -201,6 +209,38 @@ func (this *ShanghaiSmmController) RefreshData() {
 			return
 		}
 	}
+	var messages []string
+	defer func() {
+		if len(messages) > 0 {
+			errMsg := strings.Join(messages, ",")
+			utils.FileLog.Info("SMM RefreshData errMsg: %s", errMsg)
+		}
+	}()
+	for _, v := range updateIndexCode {
+		itemInfo, err := models.GetSmmIndexInfoMaxAndMinInfo(v)
+		if err == nil && itemInfo != nil {
+			e := models.ModifySmmIndexMaxAndMinInfo(v, itemInfo)
+			if e != nil {
+				messages = append(messages, fmt.Sprintf("更新指标最大最小值失败, indexCode: %s, err: %s", v, e.Error()))
+				return
+			}
+		}
+
+		// 同步刷新ETA图库有色的指标
+		{
+			// 获取指标详情
+			edbInfo, e := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_YS, v)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				messages = append(messages, fmt.Sprintf("刷新ETA指标异常, indexCode: %s, err: %s", v, e.Error()))
+			}
+
+			// 已经加入到指标库的话,那么就去更新ETA指标库吧
+			if edbInfo != nil {
+				go logic.RefreshBaseEdbInfo(edbInfo, ``)
+			}
+		}
+	}
+
 	br.Msg = "数据刷新成功"
 	br.Success = true
 	br.Ret = 200
@@ -345,6 +385,38 @@ func (this *ShanghaiSmmController) RefreshExcel() {
 	}
 	// 不修改
 	fmt.Println(len(updateDataList))
+	var messages []string
+	defer func() {
+		if len(messages) > 0 {
+			errMsg := strings.Join(messages, ",")
+			utils.FileLog.Info("SMM RefreshExcel errMsg: %s", errMsg)
+		}
+	}()
+	for _, v := range updateDataList {
+		itemInfo, err := models.GetSmmIndexInfoMaxAndMinInfo(v.IndexCode)
+		if err == nil && itemInfo != nil {
+			e := models.ModifySmmIndexMaxAndMinInfo(v.IndexCode, itemInfo)
+			if e != nil {
+				messages = append(messages, fmt.Sprintf("更新指标最大最小值失败, indexCode: %s, err: %s", v.IndexCode, e.Error()))
+				return
+			}
+		}
+
+		// 同步刷新ETA图库有色的指标
+		{
+			// 获取指标详情
+			edbInfo, e := models.GetEdbInfoByEdbCode(utils.DATA_SOURCE_YS, v.IndexCode)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				messages = append(messages, fmt.Sprintf("刷新ETA指标异常, indexCode: %s, err: %s", v.IndexCode, e.Error()))
+			}
+
+			// 已经加入到指标库的话,那么就去更新ETA指标库吧
+			if edbInfo != nil {
+				go logic.RefreshBaseEdbInfo(edbInfo, ``)
+			}
+		}
+
+	}
 	// if len(updateDataList) > 0 {
 	// 	err = models.UpdateBaseFromSmmDataListByIndexCode(updateDataList)
 	// 	if err != nil {

+ 16 - 0
global/global.go

@@ -0,0 +1,16 @@
+package global
+
+import (
+	_ "github.com/go-sql-driver/mysql"
+	"gorm.io/gorm"
+)
+
+var (
+	DbMap      map[string]*gorm.DB //数据库连接配置
+	DEFAULT_DB *gorm.DB            //默认数据库连接配置
+)
+
+func init() {
+	// 初始化数据库连接
+	InitDb()
+}

+ 139 - 0
global/initDb.go

@@ -0,0 +1,139 @@
+package global
+
+import (
+	"database/sql/driver"
+	_ "dm"
+	dm "dmgorm2"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+	"gorm.io/gorm/schema"
+	"io"
+	"log"
+	"os"
+	"strings"
+	"time"
+)
+
+type LocalTime time.Time
+
+// InitDb
+// @Description: 数据库初始化
+func InitDb() {
+	dbMap := make(map[string]*gorm.DB)
+
+	//开启日志
+	logWriter := io.MultiWriter(utils.Binlog) //binlog日志,记录到文件中去
+	if utils.RunMode == `dev` {               // 测试环境,默认输出在控制台,不需要的话,可以注释if里面下面的这行
+		logWriter = io.MultiWriter(utils.Binlog, os.Stdout)
+	}
+	newLogger := logger.New(log.New(logWriter, "\r\n", log.LstdFlags), logger.Config{
+		SlowThreshold:             200 * time.Millisecond, //慢sql :200ms
+		LogLevel:                  logger.Info,            //记录的日志类型,info代表所有信息都记录
+		IgnoreRecordNotFoundError: true,                   //是否忽略找不到数据错误信息(只是日志记录记录成err还是普通的输出的区别,并不影响业务代码中的:找不到数据行error)
+		Colorful:                  false,                  //是否颜色输出
+	})
+
+	// 默认库
+	// 指标库
+	connectDb(utils.MYSQL_URL, utils.DbNameIndex, newLogger, dbMap, true)
+
+	// 手工数据库
+	connectDb(utils.MYSQL_URL_EDB, utils.DbNameManualIndex, newLogger, dbMap, false)
+	// 钢联库
+	connectDb(utils.MYSQL_URL_GL, utils.DbNameGL, newLogger, dbMap, false)
+	// master库
+	connectDb(utils.MYSQL_URL_MASTER, utils.DbNameMaster, newLogger, dbMap, false)
+
+	//全局赋值数据库链接
+	DbMap = dbMap
+
+}
+
+// connectDb
+// @Description: 达梦数据库连接
+// @param dsn
+// @param aliasName
+// @param newLogger
+// @param dbMap
+// @param isDefault
+func connectDb(dsn, aliasName string, newLogger logger.Interface, dbMap map[string]*gorm.DB, isDefault bool) {
+	//fmt.Println("dsn:", dsn, "  ==  ;aliasName:", aliasName)
+	if dsn == `` {
+		return
+	}
+
+	var dialector gorm.Dialector
+	switch utils.DbDriverName {
+	case utils.DbDriverByMysql:
+		if !strings.Contains(dsn, `parseTime`) {
+			dsn += `&parseTime=true`
+		}
+		dialector = mysql.Open(dsn)
+	case utils.DbDriverByDm:
+		dialector = dm.Open(dsn)
+	default:
+		panic(fmt.Errorf("数据库 链接异常,错误的数据库类型,数据库:%s", utils.DbDriverName))
+	}
+	db, err := gorm.Open(dialector, &gorm.Config{
+		Logger: newLogger,
+		NamingStrategy: schema.NamingStrategy{
+			SingularTable: true, // 表示使用单数表名,启用该选项后,GORM 将不会对表名进行复数化处理
+		},
+	})
+	if err != nil {
+		//global.LOG.Errorf("mysql 启动异常,数据库:default;Err:", err)
+		panic(fmt.Errorf("数据库 链接异常,数据库:%s;Err:%s", aliasName, err))
+	}
+	//创建连接池
+	sqlDB, err := db.DB()
+	if err != nil {
+		//global.LOG.Errorf("达梦 创建连接池失败,数据库:default;Err:", err)
+		panic(fmt.Errorf("数据库 创建连接池失败,数据库:%s;Err:%s", aliasName, err))
+	}
+
+	dbMap[aliasName] = db
+
+	//默认数据库连接
+	if isDefault {
+		DEFAULT_DB = db
+	}
+
+	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
+	sqlDB.SetMaxIdleConns(50)
+
+	// SetMaxOpenConns 设置打开数据库连接的最大数量。
+	sqlDB.SetMaxOpenConns(100)
+
+	// SetConnMaxLifetime 设置了连接可复用的最大时间。
+	sqlDB.SetConnMaxLifetime(10 * time.Minute)
+
+}
+
+func (t *LocalTime) MarshalJSON() ([]byte, error) {
+	tTime := time.Time(*t)
+	if tTime.IsZero() {
+		return []byte("\"\""), nil
+	}
+	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
+}
+
+func (t LocalTime) Value() (driver.Value, error) {
+	var zeroTime time.Time
+	tlt := time.Time(t)
+	//判断给定时间是否和默认零时间的时间戳相同
+	if tlt.UnixNano() == zeroTime.UnixNano() {
+		return nil, nil
+	}
+	return tlt, nil
+}
+
+func (t *LocalTime) Scan(v interface{}) error {
+	if value, ok := v.(time.Time); ok {
+		*t = LocalTime(value)
+		return nil
+	}
+	return fmt.Errorf("can not convert %v to timestamp", v)
+}

+ 5 - 0
go.mod

@@ -16,8 +16,11 @@ require (
 	github.com/qiniu/qmgo v1.1.8
 	github.com/rdlucklib/rdluck_tools v1.0.3
 	github.com/shopspring/decimal v1.4.0
+	github.com/tealeg/xlsx v1.0.5
 	go.mongodb.org/mongo-driver v1.16.0
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
+	gorm.io/driver/mysql v1.5.7
+	gorm.io/gorm v1.25.12
 )
 
 require (
@@ -36,6 +39,8 @@ require (
 	github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 // indirect
 	github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/leodido/go-urn v1.2.0 // indirect

+ 12 - 0
go.sum

@@ -67,6 +67,7 @@ github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
 github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -110,6 +111,10 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 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/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -219,6 +224,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
+github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
@@ -332,3 +339,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
+gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
+gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
+gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=

+ 4 - 1
logic/base_edb_info.go

@@ -36,10 +36,13 @@ func RefreshBaseEdbInfo(edbInfo *models.EdbInfo, startDate string) (isHandling b
 		err = ccfOb.Refresh(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
 	case utils.DATA_SOURCE_SCI_HQ:
 		err = models.RefreshEdbDataFromSciHq(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+	case utils.DATA_SOURCE_RADISH_RESEARCH:
+		ob := new(models.BaseFromRadishResearch)
+		err = ob.Refresh(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
 	default:
 		return
 	}
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		errMsg = "刷新指标信息失败!"
 		err = errors.New("刷新指标信息失败 RefreshEdbDataFromSci,Err:" + err.Error())
 		return

+ 229 - 33
logic/predict_edb.go

@@ -11,12 +11,12 @@ import (
 )
 
 // AddPredictEdbInfo 新增预测指标
-func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType string, ruleList []models.RuleConfig, minValue, maxValue float64, sysUserId int, sysUserName, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
+func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType string, endDateType int, ruleList []models.RuleConfig, minValue, maxValue float64, sysUserId int, sysUserName, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
 	var sourceEdbInfo *models.EdbInfo
 	// 来源指标信息校验
 	{
 		sourceEdbInfo, err = models.GetEdbInfoById(sourceEdbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			errMsg = "新增失败"
 			err = errors.New("获取来源指标失败,Err:" + err.Error())
 			return
@@ -43,7 +43,7 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 	// 来源分类信息校验
 	{
 		classifyInfo, err = models.GetEdbClassifyById(classifyId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			errMsg = "新增失败"
 			err = errors.New("获取预测指标分类失败,Err:" + err.Error())
 			return
@@ -66,7 +66,7 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 	edbCode := sourceEdbInfo.EdbCode + "_" + time.Now().Format(utils.FormatShortDateTimeUnSpace)
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := CheckExistByEdbNameAndEdbInfoId(0, 0, edbName, lang)
+	existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, 0, edbName, lang)
 	if err != nil {
 		errMsg = "判断指标名称是否存在失败"
 		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
@@ -82,6 +82,7 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 	if dataDateType == `` {
 		dataDateType = `自然日`
 	}
+
 	edbInfo = &models.EdbInfo{
 		//EdbInfoId:   0,
 		EdbInfoType:      1,
@@ -114,6 +115,7 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 		UnitEn:        sourceEdbInfo.UnitEn,
 		DataDateType:  dataDateType,
 		Sort:          models.GetAddEdbMaxSortByClassifyId(classifyId, utils.PREDICT_EDB_INFO_TYPE),
+		EndDateType:   endDateType,
 	}
 
 	// 关联关系表
@@ -145,13 +147,22 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 
 	// 预测指标配置
 	predictEdbConfList := make([]*models.PredictEdbConf, 0)
+	var ruleEndDate time.Time
 	for ruleIndex, v := range ruleList {
-		// 预测指标配置
-		ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
-		if tmpErr != nil {
-			errMsg = "规则配置的截止日期异常,请重新填写"
-			err = errors.New(errMsg)
-			return
+		if endDateType == 0 {
+			// 预测指标配置
+			ruleEndDate, err = time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
+			if err != nil {
+				errMsg = "规则配置的截止日期异常,请重新填写"
+				err = errors.New(errMsg)
+				return
+			}
+		} else {
+			if v.EndNum <= 0 {
+				errMsg = "截止期数不正确,请输入大于等于1的整数"
+				err = errors.New(errMsg)
+				return
+			}
 		}
 		//1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差,10:根据 给定终值后插值 规则获取预测数据,11:根据 季节性 规则获取预测数据,12:根据 移动平均同比 规则获取预测数据
 		// 环比、环差、动态环差、季节性、移动平均同比不支持年度
@@ -161,6 +172,11 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 			return
 		}
 
+		if v.RuleType == 16 && endDateType == 1 {
+			errMsg = "年度值倒推不支持截止期数"
+			err = errors.New(errMsg)
+			return
+		}
 		switch v.RuleType {
 		case 8: //N期段线性外推值
 			valInt, tmpErr := strconv.Atoi(v.Value)
@@ -244,8 +260,8 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 						calculateMappingItem := &models.EdbInfoCalculateMapping{
 							EdbInfoCalculateMappingId: 0,
 							EdbInfoId:                 0,
-							Source:                    utils.DATA_SOURCE_CALCULATE,
-							SourceName:                "指标运算",
+							Source:                    edbInfo.Source,
+							SourceName:                edbInfo.SourceName,
 							EdbCode:                   "",
 							FromEdbInfoId:             fromEdbInfo.EdbInfoId,
 							FromEdbCode:               fromEdbInfo.EdbCode,
@@ -336,8 +352,8 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 						tmpCalculateMappingItem := &models.EdbInfoCalculateMapping{
 							EdbInfoCalculateMappingId: 0,
 							EdbInfoId:                 0,
-							Source:                    utils.DATA_SOURCE_CALCULATE,
-							SourceName:                "指标运算",
+							Source:                    edbInfo.Source,
+							SourceName:                edbInfo.SourceName,
 							EdbCode:                   "",
 							FromEdbInfoId:             fromEdbInfo.EdbInfoId,
 							FromEdbCode:               fromEdbInfo.EdbCode,
@@ -386,12 +402,16 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 			SourceEdbInfoId:  sourceEdbInfoId,
 			RuleType:         v.RuleType,
 			//FixedValue:       v.Value,
-			Value:      v.Value,
-			EndDate:    ruleEndDate,
+			Value: v.Value,
+			//EndDate:    ruleEndDate,
 			ModifyTime: time.Now(),
 			CreateTime: time.Now(),
+			EndNum:     v.EndNum,
 		}
-
+		if endDateType == 0 {
+			tmpPredictEdbConf.EndDate = ruleEndDate
+		}
+		//todo 指标最终的截止日期的更新
 		edbInfo.EndDate = v.EndDate
 
 		predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
@@ -402,11 +422,11 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 }
 
 // EditPredictEdbInfo 编辑预测指标
-func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string, ruleList []models.RuleConfig, minValue, maxValue float64, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
+func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string, endDateType int, ruleList []models.RuleConfig, minValue, maxValue float64, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
 	// 指标信息校验
 	{
 		edbInfo, err = models.GetEdbInfoById(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			errMsg = "修改失败"
 			err = errors.New("获取预测指标失败,Err:" + err.Error())
 			return
@@ -429,7 +449,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 	{
 		// 查找该预测指标配置
 		predictEdbConfList, tmpErr := models.GetPredictEdbConfListById(edbInfo.EdbInfoId)
-		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+		if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
 			errMsg = "修改失败"
 			err = errors.New("获取预测指标配置信息失败,Err:" + tmpErr.Error())
 			return
@@ -443,7 +463,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 	}
 
 	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
-	existEdbName, err := CheckExistByEdbNameAndEdbInfoId(1, edbInfoId, edbName, lang)
+	existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, edbInfoId, edbName, lang)
 	if err != nil {
 		errMsg = "判断指标名称是否存在失败"
 		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
@@ -458,6 +478,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 	if dataDateType == `` {
 		dataDateType = `自然日`
 	}
+
 	switch lang {
 	case utils.EnLangVersion:
 		edbInfo.EdbNameEn = edbName
@@ -471,13 +492,14 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 	edbInfo.MaxValue = maxValue
 	edbInfo.DataDateType = dataDateType
 	edbInfo.ModifyTime = time.Now()
-	updateEdbInfoCol := []string{"EdbName", "EdbNameEn", "EdbNameSource", "ClassifyId", "EndDate", "MinValue", "MaxValue", "DataDateType", "ModifyTime"}
+	edbInfo.EndDateType = endDateType
+	updateEdbInfoCol := []string{"EdbName", "EdbNameEn", "EdbNameSource", "ClassifyId", "EndDate", "MinValue", "MaxValue", "DataDateType", "ModifyTime", "EndDateType"}
 
 	var sourceEdbInfo *models.EdbInfo
 	// 来源指标信息校验
 	{
 		sourceEdbInfo, err = models.GetEdbInfoById(predictEdbConf.SourceEdbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			errMsg = "新增失败"
 			err = errors.New("获取来源指标失败,Err:" + err.Error())
 			return
@@ -531,13 +553,23 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 	// 预测指标配置
 	predictEdbConfList := make([]*models.PredictEdbConf, 0)
 	for ruleIndex, v := range ruleList {
-		// 预测指标配置
-		ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
-		if tmpErr != nil {
-			errMsg = "规则配置的截止日期异常,请重新填写"
-			err = errors.New(errMsg)
-			return
+		var ruleEndDate time.Time
+		if endDateType == 0 {
+			// 预测指标配置
+			ruleEndDate, err = time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
+			if err != nil {
+				errMsg = "规则配置的截止日期异常,请重新填写"
+				err = errors.New(errMsg)
+				return
+			}
+		} else {
+			if v.EndNum <= 0 {
+				errMsg = "截止期数不正确,请输入大于等于1的整数"
+				err = errors.New(errMsg)
+				return
+			}
 		}
+
 		//1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差,10:根据 给定终值后插值 规则获取预测数据,11:根据 季节性 规则获取预测数据,12:根据 移动平均同比 规则获取预测数据
 		// 环比、环差、动态环差、季节性、移动平均同比不支持年度
 		if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) {
@@ -545,6 +577,11 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 			err = errors.New(errMsg)
 			return
 		}
+		if v.RuleType == 16 && endDateType == 1 {
+			errMsg = "年度值倒推不支持截止期数"
+			err = errors.New(errMsg)
+			return
+		}
 		switch v.RuleType {
 		case 8: //N期段线性外推值
 			valInt, tmpErr := strconv.Atoi(v.Value)
@@ -754,7 +791,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 				}
 				trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
 			}
-
+			// todo
 			calculateRuleMap[ruleIndex] = models.CalculateRule{
 				TrendsCalculateMappingList: trendsMappingList,
 				EdbInfoList:                edbInfoList,
@@ -764,6 +801,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 				EndDate:      v.EndDate,
 				EdbInfoIdArr: v.EdbInfoIdArr,
 			}
+
 		}
 
 		tmpPredictEdbConf := &models.PredictEdbConf{
@@ -773,10 +811,14 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 			//FixedValue:       v.Value,
 			Value:      v.Value,
 			EndDate:    ruleEndDate,
+			EndNum:     v.EndNum,
 			ModifyTime: time.Now(),
 			CreateTime: time.Now(),
 		}
-
+		if endDateType == 0 {
+			tmpPredictEdbConf.EndDate = ruleEndDate
+		}
+		// todo
 		edbInfo.EndDate = v.EndDate
 
 		predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
@@ -792,7 +834,7 @@ func RefreshPredictEdbInfo(edbInfoId int) (edbInfo *models.EdbInfo, err error, e
 	// 指标信息校验
 	{
 		edbInfo, err = models.GetEdbInfoById(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			errMsg = "刷新失败"
 			err = errors.New("获取预测指标失败,Err:" + err.Error())
 			return
@@ -993,7 +1035,7 @@ func checkExistByEdbName(edbInfoType int, edbName, lang string) (has bool, err e
 	var pars []interface{}
 
 	condition += " AND edb_info_type=? "
-	pars = append(pars, 0)
+	pars = append(pars, edbInfoType)
 
 	switch lang {
 	case utils.EnLangVersion:
@@ -1077,3 +1119,157 @@ func CheckExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId int, edbName, lang s
 	//指标已经入库的情况
 	return checkExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId, edbName, lang)
 }
+
+// AddStaticPredictEdbInfo 新增静态指标数据
+func AddStaticPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, frequency, unit string, sysUserId int, sysUserName, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
+	var sourceEdbInfo *models.EdbInfo
+	// 来源指标信息校验
+	{
+		sourceEdbInfo, err = models.GetEdbInfoById(sourceEdbInfoId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			errMsg = "新增失败"
+			err = errors.New("获取来源指标失败,Err:" + err.Error())
+			return
+		}
+		if sourceEdbInfo == nil {
+			errMsg = "找不到该来源指标"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+
+	var classifyInfo *models.EdbClassify
+	// 来源分类信息校验
+	{
+		classifyInfo, err = models.GetEdbClassifyById(classifyId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			errMsg = "新增失败"
+			err = errors.New("获取预测指标分类失败,Err:" + err.Error())
+			return
+		}
+		if classifyInfo == nil {
+			errMsg = "找不到该预测指标分类"
+			err = errors.New(errMsg)
+			return
+		}
+		//必须是预测指标分类
+		if classifyInfo.ClassifyType != 1 {
+			errMsg = "预测指标分类异常,不是预测指标分类"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+
+	edbName = strings.Trim(edbName, " ")
+
+	edbCode := sourceEdbInfo.EdbCode + "_" + time.Now().Format(utils.FormatShortDateTimeUnSpace)
+
+	// 根据指标名称和指标ID校验库中是否还存在其他同名指标
+	existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, 0, edbName, lang)
+	if err != nil {
+		errMsg = "判断指标名称是否存在失败"
+		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+		return
+	}
+	if existEdbName {
+		errMsg = "指标名称已存在,请重新填写"
+		err = errors.New(errMsg)
+		return
+	}
+
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	edbInfo = &models.EdbInfo{
+		//EdbInfoId:   0,
+		EdbInfoType:      sourceEdbInfo.EdbInfoType,
+		SourceName:       sourceEdbInfo.SourceName,
+		Source:           sourceEdbInfo.Source,
+		EdbCode:          edbCode,
+		EdbName:          edbName,
+		EdbNameSource:    edbName,
+		Frequency:        frequency,
+		Unit:             unit,
+		StartDate:        sourceEdbInfo.StartDate,
+		EndDate:          sourceEdbInfo.EndDate,
+		ClassifyId:       classifyId,
+		SysUserId:        sysUserId,
+		SysUserRealName:  sysUserName,
+		UniqueCode:       utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+		CreateTime:       time.Now(),
+		ModifyTime:       time.Now(),
+		MinValue:         sourceEdbInfo.MinValue,
+		MaxValue:         sourceEdbInfo.MaxValue,
+		EndValue:         sourceEdbInfo.EndValue,
+		CalculateFormula: sourceEdbInfo.CalculateFormula,
+		EdbType:          sourceEdbInfo.EdbType,
+		//Sort:             sourceEdbInfo.,
+		LatestDate:    sourceEdbInfo.LatestDate,
+		LatestValue:   sourceEdbInfo.LatestValue,
+		MoveType:      sourceEdbInfo.MoveType,
+		MoveFrequency: sourceEdbInfo.MoveFrequency,
+		NoUpdate:      sourceEdbInfo.NoUpdate,
+		IsUpdate:      sourceEdbInfo.IsUpdate,
+		ServerUrl:     "",
+		EdbNameEn:     edbName,
+		UnitEn:        sourceEdbInfo.UnitEn,
+		DataDateType:  sourceEdbInfo.DataDateType,
+		Sort:          models.GetAddEdbMaxSortByClassifyId(classifyId, utils.PREDICT_EDB_INFO_TYPE),
+		IsStaticData:  1,
+	}
+
+	// 关联关系表
+	calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
+	fromEdbMap := make(map[int]int)
+
+	// 源指标关联关系表
+	calculateMappingItem := &models.EdbInfoCalculateMapping{
+		//EdbInfoCalculateMappingId: 0,
+		//EdbInfoId:                 0,
+		Source:         edbInfo.Source,
+		SourceName:     edbInfo.SourceName,
+		EdbCode:        edbInfo.EdbCode,
+		FromEdbInfoId:  sourceEdbInfo.EdbInfoId,
+		FromEdbCode:    sourceEdbInfo.EdbCode,
+		FromEdbName:    sourceEdbInfo.EdbName,
+		FromSource:     sourceEdbInfo.Source,
+		FromSourceName: sourceEdbInfo.SourceName,
+		//FromTag:        "",
+		Sort:       1,
+		CreateTime: time.Now(),
+		ModifyTime: time.Now(),
+	}
+	fromEdbMap[sourceEdbInfoId] = sourceEdbInfoId
+	calculateMappingList = append(calculateMappingList, calculateMappingItem)
+	newPredictEdbConfList := make([]*models.PredictEdbConf, 0)
+	//查询原先的预测指标配置项
+	if sourceEdbInfo.EdbType == 1 {
+		// 查找该预测指标配置
+		predictEdbConfList, tmpErr := models.GetPredictEdbConfListById(sourceEdbInfo.EdbInfoId)
+		if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+			errMsg = "获取预测指标配置信息失败"
+			err = errors.New("获取预测指标配置信息失败,Err:" + tmpErr.Error())
+			return
+		}
+		if len(predictEdbConfList) > 0 {
+			// 遍历
+			for _, v := range predictEdbConfList {
+				tmpPredictEdbConf := &models.PredictEdbConf{
+					PredictEdbInfoId: 0,
+					SourceEdbInfoId:  sourceEdbInfoId,
+					RuleType:         v.RuleType,
+					FixedValue:       v.FixedValue,
+					Value:            v.Value,
+					EmptyType:        v.EmptyType,
+					MaxEmptyType:     v.MaxEmptyType,
+					EndDate:          v.EndDate,
+					ModifyTime:       time.Now(),
+					CreateTime:       time.Now(),
+				}
+				newPredictEdbConfList = append(newPredictEdbConfList, tmpPredictEdbConf)
+			}
+		}
+	}
+
+	err, errMsg = models.AddPredictStaticEdb(edbInfo, sourceEdbInfo, calculateMappingList, newPredictEdbConfList)
+
+	return
+}

+ 189 - 111
logic/profit_chart_info.go

@@ -105,6 +105,8 @@ type ChartInfoReq struct {
 	BaseEdbInfoId           int                     `description:"基础的指标id"`
 	DateList                []ChartInfoDateReq      `description:"日期配置"`
 	ProfitNameEn            string                  `description:"利润英文名称"`
+	EdbInfoIdList           []int                   `description:"现货指标ID列表"`
+	XDataList               []XData                 `description:"横轴配置"`
 }
 
 // RefreshByChartId 根据图表id刷新图表
@@ -136,12 +138,34 @@ func RefreshByChartId(chartInfoId int) (err error, errMsg string) {
 		}
 		return
 	}
+	if len(extraConf.EdbInfoIdList) == 0 {
+		extraConf.EdbInfoIdList = append(extraConf.EdbInfoIdList, extraConf.BaseEdbInfoId)
+	}
 
-	baseEdbInfo, err := models.GetEdbInfoById(extraConf.BaseEdbInfoId)
+	baseEdbInfo := new(models.EdbInfo)
+	// ETA指标
+	edbInfoListTmp, err := models.GetEdbInfoByIdList(extraConf.EdbInfoIdList)
 	if err != nil {
 		errMsg = "获取失败"
 		return
 	}
+	//按照请求顺序排序
+	edbInfoMap := make(map[int]*models.EdbInfo)
+	for _, v := range edbInfoListTmp {
+		edbInfoMap[v.EdbInfoId] = v
+	}
+	edbInfoList := make([]*models.EdbInfo, 0)
+	for _, v := range extraConf.EdbInfoIdList {
+		edbInfoList = append(edbInfoList, edbInfoMap[v])
+	}
+	edbInfoListMap := make(map[int]*models.EdbInfo)
+	for k, v := range edbInfoList {
+		edbInfoList[k].EdbNameSource = v.EdbName
+		edbInfoListMap[v.EdbInfoId] = v
+		if v.EdbInfoId == extraConf.BaseEdbInfoId {
+			baseEdbInfo = v
+		}
+	}
 	// 商品数据库指标
 	futureGoodEdbInfoMap := make(map[int]*future_good.FutureGoodEdbInfo)
 	zlFutureGoodEdbInfoList := make([]*future_good.FutureGoodEdbInfo, 0)
@@ -160,9 +184,7 @@ func RefreshByChartId(chartInfoId int) (err error, errMsg string) {
 		futureGoodEdbInfoMap[v.EdbInfoId] = zlFutureGoodEdbInfo
 		zlFutureGoodEdbInfoList = append(zlFutureGoodEdbInfoList, zlFutureGoodEdbInfo)
 	}
-
-	xDataList, yDataList, err := GetProfitChartEdbData(baseEdbInfo, zlFutureGoodEdbInfoList, extraConf.DateList, extraConf.CalculateFormula, extraConf.FutureGoodEdbInfoIdList)
-
+	xDataList, yDataList, err := GetProfitChartEdbData(baseEdbInfo, edbInfoList, zlFutureGoodEdbInfoList, extraConf.DateList, extraConf.CalculateFormula, extraConf.FutureGoodEdbInfoIdList, extraConf.XDataList)
 	xDataListByte, err := json.Marshal(xDataList)
 	if err != nil {
 		errMsg = "保存失败"
@@ -179,7 +201,7 @@ func RefreshByChartId(chartInfoId int) (err error, errMsg string) {
 	extraUpdateCol := make([]string, 0)
 	chartInfoFutureGoodProfit.XValue = string(xDataListByte)
 	chartInfoFutureGoodProfit.YValue = string(yDataListByte)
-	chartInfoFutureGoodProfit.ProfitName = zlFutureGoodEdbInfoList[0].FutureGoodEdbName + "盘面利润"
+	//chartInfoFutureGoodProfit.ProfitName = zlFutureGoodEdbInfoList[0].FutureGoodEdbName + "盘面利润"
 	chartInfoFutureGoodProfit.ModifyTime = time.Now()
 	extraUpdateCol = []string{"XValue", "YValue", "ProfitName", "ModifyTime"}
 	err = chartInfoFutureGoodProfit.Update(extraUpdateCol)
@@ -188,11 +210,15 @@ func RefreshByChartId(chartInfoId int) (err error, errMsg string) {
 }
 
 // GetProfitChartEdbData 获取利润图表的指标数据
-func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, chartInfoDateList []ChartInfoDateReq, formulaStr string, edbInfoFromTagList []models.EdbInfoFromTag) (xDataList []XData, yDataList []YData, err error) {
+func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, edbInfoList []*models.EdbInfo, zlFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, chartInfoDateList []ChartInfoDateReq, formulaStr string, edbInfoFromTagList []models.EdbInfoFromTag, reqXDataList []XData) (xDataList []XData, yDataList []YData, err error) {
+
 	if baseEdbInfo == nil {
 		err = errors.New("ETA指标未选取")
 		return
 	}
+	if len(edbInfoList) == 0 {
+		edbInfoList = append(edbInfoList, baseEdbInfo)
+	}
 	if len(zlFutureGoodEdbInfoList) <= 0 {
 		err = errors.New("商品指标未选取")
 		return
@@ -213,12 +239,17 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 			futureGoodEdbInfoIdMap[tmpTagEdbIdMap[tag]] = tmpTagEdbIdMap[tag]
 		}
 	}
-
+	// 指标对应的所有数据
+	//edbDataListMap := make(map[int][]*models.EdbDataList)
 	// 普通的指标数据
-	baseDataList := make([]*models.EdbDataList, 0)
-	baseDataList, err = models.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.SubSource, baseEdbInfo.EdbInfoId, "", "")
-	if err != nil {
-		return
+	baseDataListMap := make(map[int][]*models.EdbDataList)
+	for _, v := range edbInfoList {
+		baseDataList := make([]*models.EdbDataList, 0)
+		baseDataList, err = models.GetEdbDataList(v.Source, v.SubSource, v.EdbInfoId, "", "")
+		if err != nil {
+			return
+		}
+		baseDataListMap[v.EdbInfoId] = baseDataList
 	}
 
 	latestDate := zlFutureGoodEdbInfoList[0].EndDate
@@ -330,36 +361,47 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 	sort.Slice(dateList, func(i, j int) bool {
 		return dateList[i] < dateList[j]
 	})
-
-	_, yDataList, err = ProfitChartChartData(baseDataList, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList, maxN)
-	if err != nil {
-		return
+	var reqEdbInfoIds []int
+	for _, v := range edbInfoList {
+		reqEdbInfoIds = append(reqEdbInfoIds, v.EdbInfoId)
+		tmp := XData{
+			Name:   v.EdbName,
+			NameEn: v.EdbNameEn,
+		}
+		xDataList = append(xDataList, tmp)
 	}
+	var edbIdList []int
+	futureGoodNameMap := make(map[int]map[int]string)
+	edbIdList, yDataList, futureGoodNameMap, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList, maxN, reqEdbInfoIds)
 
-	tmpXDataList, newYDataList, err := handleProfitResultData(baseEdbInfo, yDataList, earliestDateTime)
+	// todo 最后处理数据
+	tmpXDataList, newYDataList, err := handleProfitResultData(xDataList, futureGoodNameMap, yDataList, earliestDateTime, edbIdList)
 	if err != nil {
 		return
 	}
-	xDataList = []XData{
-		{
-			Name:   "现货利润",
-			NameEn: "Spot Price",
-		},
+	if len(reqXDataList) == 0 {
+		xDataList = tmpXDataList
+	} else {
+		xDataList = reqXDataList
 	}
-	xDataList = append(xDataList, tmpXDataList...)
+
 	yDataList = newYDataList
 
 	return
 }
 
 // ProfitChartChartData 获取数据
-func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoMap map[int]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateList []string, maxN int) (edbIdList []int, yDataList []YData, err error) {
+func ProfitChartChartData(baseEdbInfo *models.EdbInfo, baseDataListMap map[int][]*models.EdbDataList, futureGoodEdbInfoMap map[int]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateList []string, maxN int, reqEdbInfoIds []int) (edbIdList []int, yDataList []YData, futureGoodNameMap map[int]map[int]string, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
 	//earliestDateTime time.Time
 	// ETA指标数据
-	baseEdbDateData := make(map[string]float64)
-	for _, edbData := range baseDataList {
-		baseEdbDateData[edbData.DataTime] = edbData.Value
+	allBaseEdbDateDataMap := make(map[int]map[string]float64)
+	for edbInfoId, baseDataList := range baseDataListMap {
+		baseEdbDateData := make(map[string]float64)
+		for _, edbData := range baseDataList {
+			baseEdbDateData[edbData.DataTime] = edbData.Value
+		}
+		allBaseEdbDateDataMap[edbInfoId] = baseEdbDateData
 	}
 
 	// 商品指标数据
@@ -378,8 +420,8 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 
 	// 将计算公式中的字母转大写
 	formulaStr = strings.ToUpper(formulaStr)
-
-	for _, barChartInfoDate := range chartInfoDateList {
+	futureGoodNameMap = make(map[int]map[int]string)
+	for tmpk, barChartInfoDate := range chartInfoDateList {
 		yDataMap := make(map[int]float64)
 		var maxDate time.Time
 
@@ -406,26 +448,59 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			return
 		}
 
-		findDataList := make([]float64, 0) // 当前日期的数据值
-		noDataIdList := make([]int, 0)     // 没有数据的指标id
-		xEdbInfoIdList := make([]int, 0)   // 当前数据的指标id列表
+		findDataList := make([]float64, 0)  // 当前日期的数据值
+		noDataIdList := make([]int, 0)      // 没有数据的指标id
+		noDataIdMap := make(map[int]int, 0) // 没有数据的指标map
+		xEdbInfoIdList := make([]int, 0)    // 当前数据的指标id列表
 
 		// 现货指标
-		realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, baseDataList, baseEdbDateData, edbDataMap)
+		index := 0
+		var realDateTime time.Time
+		// 现货指标
+		baseEdbDateData, ok := allBaseEdbDateDataMap[baseEdbInfo.EdbInfoId]
+		if !ok {
+			err = fmt.Errorf("指标id: %d 没有数据", baseEdbInfo.EdbInfoId)
+			return
+		}
+		realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, baseDataListMap[baseEdbInfo.EdbInfoId], baseEdbDateData, edbDataMap)
 		if tmpErr != nil {
 			err = tmpErr
 			return
 		}
-		findDataList = append(findDataList, findDataValue)
-		yDataMap[0] = findDataValue
 		if isFind {
 			maxDate = realDateTime
 		}
+		edbIdList = make([]int, 0) //普通指标ID
+		for _, edbInfoId := range reqEdbInfoIds {
+			if edbInfoId == baseEdbInfo.EdbInfoId {
+				findDataList = append(findDataList, findDataValue)
+				yDataMap[index] = findDataValue
+				xEdbInfoIdList = append(xEdbInfoIdList, edbInfoId)
+				edbIdList = append(edbIdList, edbInfoId)
+				index += 1
+				continue
+			}
+			baseEdbDateDataTmp, ok := allBaseEdbDateDataMap[edbInfoId]
+			if !ok {
+				err = fmt.Errorf("指标id: %d 没有数据", edbInfoId)
+				return
+			}
+			findDataValueTmp, isFindTmp := baseEdbDateDataTmp[realDateTime.Format(utils.FormatDate)]
+			if !isFindTmp {
+				noDataIdList = append(noDataIdList, edbInfoId)
+				noDataIdMap[edbInfoId] = edbInfoId
+			}
+			findDataList = append(findDataList, findDataValueTmp)
+			yDataMap[index] = findDataValueTmp
 
-		xEdbInfoIdList = append(xEdbInfoIdList, 0)
+			xEdbInfoIdList = append(xEdbInfoIdList, edbInfoId)
+			edbIdList = append(edbIdList, edbInfoId)
+			index += 1
+		}
 
 		mList := make([]int, 0) // 间隔月份
 
+		tmpNameMap := make(map[int]string)
 		// 最小开始的n值
 		//minN := (findDateTime.Year()-earliestDateTime.Year())*12 + int(findDateTime.Month()-earliestDateTime.Month())
 		for _, date := range dateList {
@@ -437,8 +512,6 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			//findDateTime
 
 			// 获取当前日期相对开始日期的期数
-			//tmpN := (currDate.Year()-findDateTime.Year())*12 + int(currDate.Month()-findDateTime.Month())
-			// 用实际日期的月份作为基准,往前推12个月(2024-5-13 16:26:43修改)
 			tmpN := (currDate.Year()-realDateTime.Year())*12 + int(currDate.Month()-realDateTime.Month())
 			if tmpN <= 0 {
 				continue
@@ -486,7 +559,17 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			//}
 
 			newTagEdbIdMap := make(map[string]int)
+
 			for tag, zlEdbId := range tagEdbIdMap {
+				if tag == "A" {
+					nameTmp := strings.Split(futureGoodEdbInfoMap[zlEdbId][date].FutureGoodEdbName, "(")
+					nameTmpEn := strings.Split(futureGoodEdbInfoMap[zlEdbId][date].FutureGoodEdbNameEn, "(")
+					if len(nameTmp) > 1 && len(nameTmpEn) > 1 {
+						nameTmp[1] = strings.Trim(nameTmp[1], ")")
+						nameTmpEn[1] = strings.Trim(nameTmpEn[1], ")")
+						tmpNameMap[tmpN+1] = nameTmp[1] + "-" + nameTmpEn[1]
+					}
+				}
 				newTagEdbIdMap[tag] = zlAndChildEdbId[zlEdbId]
 			}
 			//, formulaStr string, tagEdbIdMap map[string]int
@@ -494,52 +577,19 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			//计算公式异常,那么就移除该指标
 			if formulaFormStr == `` {
 				//removeDateList = append(removeDateList, sk)
-				//fmt.Println("异常了")
+				fmt.Println("异常了")
 				continue
 			}
 
-			//expression := formula.NewExpression(formulaFormStr)
-			//calResult, evaluateErr := expression.Evaluate()
-			//if evaluateErr != nil {
-			//	// 分母为0的报错
-			//	if strings.Contains(evaluateErr.Error(), "divide by zero") {
-			//		//removeDateList = append(removeDateList, sk)
-			//		continue
-			//	}
-			//	err = errors.New("计算失败:Err:" + evaluateErr.Error() + ";formulaStr:" + formulaFormStr)
-			//	fmt.Println(err)
-			//	continue
-			//}
-			//// 如果计算结果是NAN,那么就退出当前循环
-			//if calResult.IsNan() {
-			//	continue
-			//}
-			//calVal, tmpErr := calResult.Float64()
-			//if tmpErr != nil {
-			//	err = errors.New("计算失败:获取计算值失败 Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
-			//	fmt.Println(err)
-			//	continue
-			//}
-			calVal, err := engine.ParseAndExec(formulaFormStr)
+			calVal, e := engine.ParseAndExec(formulaFormStr)
 			//calVal, err := calResult.Float64()
-			if err != nil {
-				// 分母为0的报错,忽略该循环
-				if utils.IsDivideZero(err) {
-					//removeDateList = append(removeDateList, sk)
-					continue
-				}
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+			if e != nil {
+				err = errors.New("计算失败:获取计算值失败 Err:" + e.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
-				return nil, nil, err
+				return
 			}
-			//nanCheck := fmt.Sprintf("%0.f", calVal)
 			//yDataMap[n] = calVal
 			//xEdbInfoIdList = append(xEdbInfoIdList, n)
-			nanCheck := fmt.Sprintf("%0.f", calVal)
-			// 分母为0.0的报错
-			if nanCheck == "NaN" || nanCheck == "+Inf" || nanCheck == "-Inf" {
-				continue
-			}
 			calVal, _ = decimal.NewFromFloat(calVal).Round(4).Float64()
 			yDataMap[tmpN] = calVal
 			xEdbInfoIdList = append(xEdbInfoIdList, tmpN)
@@ -565,6 +615,33 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			yDate = maxDate.Format(utils.FormatDate)
 		}
 
+		{
+			hasDataIndexList := make([]int, 0)
+			for dataK, edbInfoId := range xEdbInfoIdList {
+				if _, ok := noDataIdMap[edbInfoId]; !ok { // 如果是没有数据的指标id
+					hasDataIndexList = append(hasDataIndexList, dataK)
+				}
+			}
+			lenHasDataIndex := len(hasDataIndexList)
+			if lenHasDataIndex > 0 {
+				for lenHasDataI := 1; lenHasDataI < lenHasDataIndex; lenHasDataI++ {
+					perK := hasDataIndexList[lenHasDataI-1] //上一个有数据的指标下标
+					currK := hasDataIndexList[lenHasDataI]  //当前有数据的指标下标
+					preVal := findDataList[perK]            //上一个有数据的坐标的值
+					currVal := findDataList[currK]          //当前有数据的指标的值
+
+					// 环差值
+					hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(currK - perK)))
+					var tmpI int64
+					// 将两个中间的数据做平均值补全
+					for hcI := perK + 1; hcI < currK; hcI++ {
+						tmpI++
+						findDataList[hcI], _ = decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(tmpI))).RoundCeil(4).Float64()
+					}
+				}
+			}
+		}
+		futureGoodNameMap[tmpk] = tmpNameMap
 		yDataList = append(yDataList, YData{
 			Date:           yDate,
 			ConfigDate:     realDateTime,
@@ -603,8 +680,6 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 		lenFutureGoodEdbInfoList := len(futureGoodEdbInfoList)
 		//futureGoodEdbInfoList
 		//if isAllChina {
-		//	// 如果全是国内指标,那么只需要拼上多出的几期合约即可
-		//	maxN = lenFutureGoodEdbInfoList + monthNum
 		//}
 		// 如果全是国内指标,那么只需要拼上多出的几期合约即可
 		maxN = lenFutureGoodEdbInfoList + monthNum
@@ -612,9 +687,6 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 		for i := 1; i < maxN; i++ {
 			k := i % lenFutureGoodEdbInfoList
 			futureGoodEdbInfoDateMap[earliestDateTime.AddDate(0, i, 0).Format(utils.FormatYearMonthDate)] = futureGoodEdbInfoList[k]
-			if i > newMaxN {
-				newMaxN = i
-			}
 		}
 
 		//需求池604,只要是国内合约,最大必须是12期
@@ -626,7 +698,7 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 	for _, v := range tmpFutureGoodEdbInfoList {
 		//海外的连续日期,目前
 		if v.FutureGoodEdbType == 2 {
-			if v.Month <= newMaxN {
+			if v.Month <= maxN {
 				futureGoodEdbInfoDateMap[earliestDateTime.AddDate(0, v.Month, 0).Format(utils.FormatYearMonthDate)] = v
 				if v.Month > newMaxN {
 					newMaxN = v.Month
@@ -647,7 +719,7 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 		subMonth := v.Month - int(earliestDateTime.Month())
 		// 如果(当前年-最新日期的年份) * 12个月 + (当前月-最新日期的月份) 小于总月份
 		tmpN := subYear*12 + subMonth
-		if tmpN < newMaxN {
+		if tmpN < maxN {
 			tmpDateTime := time.Date(v.Year, time.Month(v.Month), 0, 0, 0, 0, 0, time.Local)
 			futureGoodEdbInfoDateMap[tmpDateTime.Format(utils.FormatYearMonthDate)] = v
 			if tmpN > newMaxN {
@@ -661,29 +733,37 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 }
 
 // handleProfitResultData 处理成最终的结果数据
-func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earliestDateTime time.Time) (xDataList []XData, newYDataList []YData, err error) {
-	xDataList = make([]XData, 0)
+func handleProfitResultData(xDataListInit []XData, futureNameMap map[int]map[int]string, yDataList []YData, earliestDateTime time.Time, allEdbInfoIds []int) (xDataList []XData, newYDataList []YData, err error) {
 	newYDataList = yDataList
+	xDataList = xDataListInit
 
 	nMap := make(map[int]int)
-
+	nList := make([]int, 0)
+	nListEdbMap := make(map[int]struct{})
 	for _, v := range yDataList {
 		for _, n := range v.XEdbInfoIdList {
-			nMap[n] = n
+			if utils.InArrayByInt(allEdbInfoIds, n) {
+				if _, ok := nListEdbMap[n]; !ok {
+					nList = append(nList, n)
+					nListEdbMap[n] = struct{}{}
+				}
+			} else {
+				nMap[n] = n
+			}
 		}
 	}
 
 	// 找出所有的N值,并进行正序排列
-	nList := make([]int, 0)
+	nListTmp := make([]int, 0)
 	for _, n := range nMap {
-		nList = append(nList, n)
+		nListTmp = append(nListTmp, n)
 	}
-	sort.Slice(nList, func(i, j int) bool {
-		return nList[i] < nList[j]
+	sort.Slice(nListTmp, func(i, j int) bool {
+		return nListTmp[i] < nListTmp[j]
 	})
-
+	nList = append(nList, nListTmp...)
 	for _, n := range nList {
-		if n == 0 {
+		if utils.InArrayByInt(allEdbInfoIds, n) {
 			continue
 		}
 		xDataList = append(xDataList, XData{
@@ -704,7 +784,7 @@ func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earl
 			if len(xEdbInfoIdList) > 0 {
 				currN := xEdbInfoIdList[0]
 				// 当前距离最早的日期相差的N数
-				if n == currN {
+				if n == currN { // todo 改成所有的基础现货指标
 					if needNum > 0 {
 						currVal := yData.Value[valIndex]
 						preVal := yData.Value[valIndex-1]
@@ -718,8 +798,12 @@ func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earl
 							newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, tmpVal)
 						}
 					}
+					if utils.InArrayByInt(allEdbInfoIds, currN) {
+						newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, currN)
+					} else {
+						newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, currN+1)
+					}
 
-					newYDataList[yIndex].XEdbInfoIdList = append(newYDataList[yIndex].XEdbInfoIdList, currN+1)
 					newYDataList[yIndex].Value = append(newYDataList[yIndex].Value, yData.Value[valIndex])
 					valIndex++
 					needNum = 0
@@ -746,7 +830,7 @@ func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earl
 	}
 
 	earliestDateTime = time.Date(earliestDateTime.Year(), earliestDateTime.Month(), 1, 0, 0, 0, 0, time.Local)
-	xDataList = xDataList[0:maxI]
+	xDataList = xDataList[0 : maxI+1]
 	for yIndex, yData := range newYDataList {
 		if len(yData.XEdbInfoIdList) > maxI+1 {
 			newYDataList[yIndex].XEdbInfoIdList = yData.XEdbInfoIdList[0 : maxI+1]
@@ -755,30 +839,23 @@ func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earl
 			newYDataList[yIndex].Value = yData.Value[0 : maxI+1]
 		}
 
-		currDate, _ := time.ParseInLocation(utils.FormatDate, yData.Date, time.Local)
-
 		nameList := make([]string, 0)
 		enNameList := make([]string, 0)
-		for _, n := range newYDataList[yIndex].XEdbInfoIdList {
-			if n == 1 { // 现货价不处理
-				nameList = append(nameList, baseEdbInfo.EdbName)
-				enNameList = append(enNameList, baseEdbInfo.EdbNameEn)
+		for k1, n := range newYDataList[yIndex].XEdbInfoIdList {
+			if utils.InArrayByInt(allEdbInfoIds, n) { // 现货价不处理
+				tmpItem := xDataListInit[k1]
+				nameList = append(nameList, tmpItem.Name)
+				enNameList = append(enNameList, tmpItem.NameEn)
 				continue
 			}
 			if n <= 0 {
 				nameList = append(nameList, `无合约`)
 				enNameList = append(enNameList, `no contract`)
 			} else {
-				var date string
-
-				currDateTime := currDate.AddDate(0, n-1, 0)
-				month := int(currDateTime.Month())
-				date = fmt.Sprintf("%d%d", currDateTime.Year(), month)
-				if month < 10 {
-					date = fmt.Sprintf("%d0%d", currDateTime.Year(), month)
-				}
-				nameList = append(nameList, date)
-				enNameList = append(enNameList, date)
+				nameTmp := futureNameMap[yIndex][n]
+				nameTmpSlice := strings.Split(nameTmp, "-")
+				nameList = append(nameList, nameTmpSlice[0])
+				enNameList = append(enNameList, nameTmpSlice[1])
 			}
 		}
 		newYDataList[yIndex].NameList = nameList
@@ -827,6 +904,7 @@ func ReplaceFormula(tagEdbIdMap map[string]int, valArr map[int]float64, formulaS
 	for k, v := range funMap {
 		formulaStr = strings.Replace(formulaStr, v, k, -1)
 	}
+	fmt.Println(formulaStr)
 	if replaceCount == len(tagEdbIdMap) {
 		return formulaStr
 	} else {

+ 5 - 0
main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"eta/eta_index_lib/controllers"
+	"eta/eta_index_lib/models"
 	_ "eta/eta_index_lib/routers"
 	"eta/eta_index_lib/services/alarm_msg"
 	"eta/eta_index_lib/utils"
@@ -18,6 +19,10 @@ func main() {
 		web.BConfig.WebConfig.DirectoryIndex = true
 		web.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
 	}
+
+	// 初始化表数据入库
+	models.AfterInitTable()
+
 	// 异常处理
 	web.ErrorController(&controllers.ErrorController{})
 

+ 46 - 7
models/base_calculate.go

@@ -303,14 +303,28 @@ func (obj BaseCalculate) Tbz() (dateDataMap map[time.Time]float64, err error, er
 
 	var dateArr []time.Time
 	dataMap := make(map[string]*EdbInfoData) // 避免因为时间戳导致的日期不对,还是用string来表示比较合适
+	var firstDataTime time.Time              // 第一条数据的日期
 	for _, v := range dataList {
 		v.DataTime = time.Date(v.DataTime.Year(), v.DataTime.Month(), v.DataTime.Day(), 0, 0, 0, 0, v.DataTime.Location())
 		dateArr = append(dateArr, v.DataTime)
 		dataMap[v.DataTime.Format(utils.FormatDate)] = v
+		firstDataTime = v.DataTime
 	}
 
+	if firstDataTime.IsZero() {
+		errMsg = "无数据"
+		err = errors.New(errMsg)
+		return
+	}
+	firstDataTime = firstDataTime.AddDate(1, 0, 0)
+
 	// 开始计算
 	for _, currentDate := range dateArr {
+		// 如果当前日期的日期早于数据最早的日期,那么就不往下执行了
+		if currentDate.Before(firstDataTime) {
+			break
+		}
+
 		//当前日期
 		currentDateStr := currentDate.Format(utils.FormatDate)
 		currentItem, ok := dataMap[currentDateStr]
@@ -394,7 +408,7 @@ func tbzDiv(a, b float64) float64 {
 	if b != 0 {
 		af := decimal.NewFromFloat(a)
 		bf := decimal.NewFromFloat(b)
-		val, _ = af.Div(bf).Sub(decimal.NewFromFloat(1)).RoundCeil(4).Float64()
+		val, _ = af.Div(bf).Sub(decimal.NewFromFloat(1)).Round(4).Float64()
 	}
 	return val
 }
@@ -494,7 +508,7 @@ func (obj BaseCalculate) Tcz() (dateDataMap map[time.Time]float64, err error, er
 func tczSub(a, b float64) float64 {
 	af := decimal.NewFromFloat(a)
 	bf := decimal.NewFromFloat(b)
-	val, _ := af.Sub(bf).RoundCeil(4).Float64()
+	val, _ := af.Sub(bf).Round(4).Float64()
 	return val
 }
 
@@ -559,7 +573,7 @@ func (obj BaseCalculate) Nszydpjjs() (dateDataMap map[time.Time]float64, err err
 		}
 		af := totalVal //decimal.NewFromFloat(totalVal)
 		bf := decimal.NewFromFloat(float64(valArrLen))
-		val, _ := af.Div(bf).RoundCeil(4).Float64()
+		val, _ := af.Div(bf).Round(4).Float64()
 
 		dateDataMap[currentDate] = val
 	}
@@ -636,7 +650,7 @@ func hbzDiv(current, pre float64) (val float64, ok bool) {
 	}
 	currentVal := decimal.NewFromFloat(current)
 	preVal := decimal.NewFromFloat(pre)
-	val, _ = currentVal.Sub(preVal).Div(preVal).RoundCeil(4).Float64()
+	val, _ = currentVal.Sub(preVal).Div(preVal).Round(4).Float64()
 	//valStr := decimal.NewFromFloat(val).RoundCeil(4).String() //utils.SubFloatToString(val, 4)
 	ok = true
 
@@ -703,7 +717,7 @@ func (obj BaseCalculate) Hcz() (dateDataMap map[time.Time]float64, err error, er
 func hczDiv(current, pre float64) float64 {
 	currentVal := decimal.NewFromFloat(current)
 	preVal := decimal.NewFromFloat(pre)
-	val, _ := currentVal.Sub(preVal).RoundCeil(4).Float64()
+	val, _ := currentVal.Sub(preVal).Round(4).Float64()
 	//valStr := decimal.NewFromFloat(val).RoundCeil(4).String() //utils.SubFloatToString(val, 4)
 
 	return val
@@ -1014,7 +1028,7 @@ func (obj BaseCalculate) TimeShift() (dateDataMap map[time.Time]float64, err err
 
 		newDate := currentDate.AddDate(0, 0, shiftDay)
 
-		val, _ := decimal.NewFromFloat(currentItem.Value).RoundCeil(4).Float64()
+		val, _ := decimal.NewFromFloat(currentItem.Value).Round(4).Float64()
 
 		dateDataMap[newDate] = val
 	}
@@ -1142,7 +1156,7 @@ func cjjxSub(currValue float64, pastValue []float64) (value float64, ok bool) {
 		tmpVal := decimal.NewFromFloat(pastValue[k])
 		bf = bf.Add(tmpVal)
 	}
-	value, _ = af.Sub(bf.Div(numDecimal)).RoundCeil(4).Float64()
+	value, _ = af.Sub(bf.Div(numDecimal)).Round(4).Float64()
 	ok = true
 
 	return
@@ -1883,3 +1897,28 @@ func TransDateData2EdbData(dateData map[time.Time]float64) (edbData []*EdbInfoDa
 	})
 	return
 }
+
+// EdbInfoSearchDataToEdbInfoData
+// @Description: 数据格式转换
+// @author: Roc
+// @datetime 2024-08-22 16:30:34
+// @param list []*EdbInfoSearchData
+// @return result []*EdbInfoData
+// @return err error
+func EdbInfoSearchDataToEdbInfoData(list []*EdbInfoSearchData) (result []*EdbInfoData, err error) {
+	result = make([]*EdbInfoData, 0)
+	for _, v := range list {
+		dataTime, tmpErr := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		result = append(result, &EdbInfoData{
+			EdbDataId: v.EdbDataId,
+			DataTime:  dataTime,
+			Value:     v.Value,
+		})
+	}
+
+	return
+}

+ 72 - 36
models/base_from_adjust.go

@@ -2,9 +2,9 @@ package models
 
 import (
 	"errors"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -12,7 +12,7 @@ import (
 
 // EdbDataAdjust 数据调整指标数据结构体
 type EdbDataAdjust struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbDataId     int `gorm:"column:edb_data_id;primaryKey"`
 	EdbInfoId     int
 	EdbCode       string
 	DataTime      string
@@ -30,10 +30,11 @@ type AddAdjustEdbData struct {
 }
 
 // SaveAdjustEdb 保存数据调整指标
-func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg string) {
+func SaveAdjustEdb(req SaveAdjustEdbReq, lang string) (edbInfo *EdbInfo, err error, errMsg string) {
 	errMsg = `添加指标失败`
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -62,10 +63,12 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 			Source:          utils.DATA_SOURCE_CALCULATE_ADJUST,
 			SourceName:      "数据调整",
 			EdbCode:         edbCode,
-			EdbName:         utils.TrimStr(req.EdbName),
-			EdbNameSource:   utils.TrimStr(req.EdbName),
-			Frequency:       utils.TrimStr(req.Frequency),
-			Unit:            utils.TrimStr(req.Unit),
+			EdbName:         strings.TrimSpace(req.EdbName),
+			EdbNameSource:   strings.TrimSpace(req.EdbName),
+			Frequency:       strings.TrimSpace(req.Frequency),
+			Unit:            strings.TrimSpace(req.Unit),
+			EdbNameEn:       strings.TrimSpace(req.EdbName),
+			UnitEn:          strings.TrimSpace(req.Unit),
 			ClassifyId:      req.ClassifyId,
 			SysUserId:       req.AdminId,
 			SysUserRealName: req.AdminName,
@@ -75,13 +78,13 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 			EdbType:         2,
 			Sort:            GetAddEdbMaxSortByClassifyId(req.ClassifyId, utils.EDB_INFO_TYPE),
 		}
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		edbInfo.EdbInfoId = int(newEdbInfoId)
-
+		//newEdbInfoId, tmpErr := to.Insert(edbInfo)
+		//if tmpErr != nil {
+		//	err = tmpErr
+		//	return
+		//}
+		//edbInfo.EdbInfoId = int(newEdbInfoId)
+		tmpErr := to.Create(&edbInfo).Error
 		// 获取来源指标
 		fromEdbInfo, tmpErr := GetEdbInfoById(req.FromEdbInfoId)
 		if tmpErr != nil {
@@ -105,7 +108,8 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 			calculateMappingItem.FromTag = ""
 			calculateMappingItem.Source = edbInfo.Source
 			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
+			//_, err = to.Insert(calculateMappingItem)
+			err = to.Create(&calculateMappingItem).Error
 			if err != nil {
 				return
 			}
@@ -122,7 +126,8 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 				ModifyTime:    time.Now(),
 				CreateTime:    time.Now(),
 			}
-			_, err = to.Insert(edbAdjustConf)
+			//_, err = to.Insert(edbAdjustConf)
+			err = to.Create(&edbAdjustConf).Error
 			if err != nil {
 				return
 			}
@@ -133,14 +138,30 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 			return
 		}
 
+		// 额外赋值
+		switch lang {
+		case utils.EnLangVersion:
+			req.EdbNameEn = req.EdbName
+			req.UnitEn = req.Unit
+
+			req.EdbName = edbInfo.EdbName
+			req.Unit = edbInfo.Unit
+		default:
+			req.EdbNameEn = edbInfo.EdbNameEn
+			req.UnitEn = edbInfo.UnitEn
+		}
+
 		// 更新指标信息
-		edbInfo.EdbName = utils.TrimStr(req.EdbName)
-		edbInfo.EdbNameSource = utils.TrimStr(req.EdbName)
-		edbInfo.Frequency = utils.TrimStr(req.Frequency)
-		edbInfo.Unit = utils.TrimStr(req.Unit)
+		edbInfo.EdbName = strings.TrimSpace(req.EdbName)
+		edbInfo.EdbNameSource = strings.TrimSpace(req.EdbName)
+		edbInfo.Frequency = strings.TrimSpace(req.Frequency)
+		edbInfo.Unit = strings.TrimSpace(req.Unit)
+		edbInfo.EdbNameEn = strings.TrimSpace(req.EdbNameEn)
+		edbInfo.UnitEn = strings.TrimSpace(req.UnitEn)
 		edbInfo.ClassifyId = req.ClassifyId
 		edbInfo.ModifyTime = time.Now()
-		_, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "ModifyTime")
+		//_, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "ModifyTime")
+		err = to.Model(&edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "ModifyTime"}).Updates(&edbInfo).Error
 		if err != nil {
 			return
 		}
@@ -152,7 +173,8 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_ADJUST, edbInfo.SubSource)
 		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
 		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
+		//_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
+		err = to.Exec(deleteSql, req.EdbInfoId).Error
 		if err != nil {
 			return
 		}
@@ -180,7 +202,8 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 			// 获取之前的配置
 			var edbAdjustConf *EdbAdjustConf
 			sql := ` SELECT * FROM edb_adjust_conf WHERE edb_info_id=? `
-			err = o.Raw(sql, edbInfo.EdbInfoId).QueryRow(&edbAdjustConf)
+			//err = o.Raw(sql, edbInfo.EdbInfoId).QueryRow(&edbAdjustConf)
+			err = global.DEFAULT_DB.Raw(sql, edbInfo.EdbInfoId).First(&edbAdjustConf).Error
 			if err != nil {
 				errMsg = "获取指标配置失败"
 				return
@@ -189,7 +212,8 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 			// 修改配置的最晚日期
 			edbAdjustConf.SourceEndDate = fromEdbEndDate
 			edbAdjustConf.ModifyTime = time.Now()
-			_, err = to.Update(edbAdjustConf, "SourceEndDate", "ModifyTime")
+			//_, err = to.Update(edbAdjustConf, "SourceEndDate", "ModifyTime")
+			err = to.Model(&edbAdjustConf).Select([]string{"SourceEndDate", "ModifyTime"}).Updates(&edbAdjustConf).Error
 			if err != nil {
 				errMsg = "更新指标配置失败"
 				return
@@ -225,6 +249,7 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 	var isAdd bool
 	dataTableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
 	addSql := ` INSERT INTO ` + dataTableName + `(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	for _, item := range dataObj {
 		//值
 		val := item.Value
@@ -235,7 +260,8 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
+		//_, err = to.Raw(addSql).Exec()
+		err = to.Exec(addSql).Error
 		if err != nil {
 			return
 		}
@@ -245,8 +271,9 @@ func SaveAdjustEdb(req SaveAdjustEdbReq) (edbInfo *EdbInfo, err error, errMsg st
 
 // RefreshAllAdjustEdb 刷新所有 数据调整指标
 func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -265,7 +292,8 @@ func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
 	// 获取之前的配置
 	var edbAdjustConf *EdbAdjustConf
 	sql := ` SELECT * FROM edb_adjust_conf WHERE edb_info_id=? `
-	err = o.Raw(sql, edbInfo.EdbInfoId).QueryRow(&edbAdjustConf)
+	//err = o.Raw(sql, edbInfo.EdbInfoId).QueryRow(&edbAdjustConf)
+	err = global.DEFAULT_DB.Raw(sql, edbInfo.EdbInfoId).First(&edbAdjustConf).Error
 	if err != nil {
 		err = errors.New("获取指标配置失败")
 		return
@@ -300,6 +328,7 @@ func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
 
 	var isAdd bool
 	addSql := ` INSERT INTO ` + dataTableName + `(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	for _, item := range dataList {
 		currDay := item.DataTime
 		//值
@@ -322,7 +351,8 @@ func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
 			if existVal != item.Value {
 				sql = ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
 				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, saveVal, edbInfo.EdbInfoId, currDay).Exec()
+				//_, err = to.Raw(sql, saveVal, edbInfo.EdbInfoId, currDay).Exec()
+				err = to.Exec(sql, saveVal, edbInfo.EdbInfoId, currDay).Error
 				if err != nil {
 					return err
 				}
@@ -332,7 +362,8 @@ func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
 	}
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
+		//_, err = to.Raw(addSql).Exec()
+		err = to.Exec(addSql).Error
 		if err != nil {
 			return
 		}
@@ -345,7 +376,8 @@ func RefreshAllAdjustEdb(edbInfo *EdbInfo, fromEdbInfo *EdbInfo) (err error) {
 			}
 			edbAdjustConf.SourceEndDate = fromEdbEndDate
 			edbAdjustConf.ModifyTime = time.Now()
-			_, err = to.Update(edbAdjustConf, "SourceEndDate", "ModifyTime")
+			//_, err = to.Update(edbAdjustConf, "SourceEndDate", "ModifyTime")
+			err = to.Model(&edbAdjustConf).Select([]string{"SourceEndDate", "ModifyTime"}).Updates(&edbAdjustConf).Error
 		}
 	}
 
@@ -363,6 +395,8 @@ type SaveAdjustEdbReq struct {
 	Unit          string                 `description:"单位"`
 	ClassifyId    int                    `description:"分类id"`
 	DataList      []SaveAdjustEdbDataReq `description:"指标对应的数据值"`
+	EdbNameEn     string                 `description:"英文指标名称"`
+	UnitEn        string                 `description:"英文单位"`
 }
 
 // SaveAdjustEdbDataReq 保存数据调整请求的数据的参数
@@ -374,9 +408,10 @@ type SaveAdjustEdbDataReq struct {
 // FixData 修复数据
 func FixData() {
 	var list []*EdbInfo
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM edb_info WHERE source=? `
-	_, err := o.Raw(sql, 40).QueryRows(&list)
+	//_, err := o.Raw(sql, 40).QueryRows(&list)
+	err := global.DEFAULT_DB.Raw(sql, 40).Find(&list).Error
 	for _, edbInfo := range list {
 		// 获取来源指标
 		calculateMapping, tmpErr := GetEdbInfoCalculateMappingDetail(edbInfo.EdbInfoId)
@@ -401,7 +436,8 @@ func FixData() {
 			ModifyTime:    time.Now(),
 			CreateTime:    time.Now(),
 		}
-		_, err = o.Insert(edbAdjustConf)
+		//_, err = o.Insert(edbAdjustConf)
+		err = global.DEFAULT_DB.Create(&edbAdjustConf).Error
 		if err != nil {
 			fmt.Println(edbInfo.EdbInfoId, "添加失败;err:", tmpErr)
 			continue

+ 77 - 42
models/base_from_baiinfo.go

@@ -1,17 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 type BaseFromBaiinfoData struct {
-	BaiinfoDataId          int `orm:"column(baiinfo_data_id);pk"`
+	BaiinfoDataId int `gorm:"column:baiinfo_data_id;primaryKey"`
+	//BaiinfoDataId          int `orm:"column(baiinfo_data_id);pk"`
 	BaseFromBaiinfoIndexId int
 	IndexCode              string
 	DataTime               string
@@ -21,19 +22,26 @@ type BaseFromBaiinfoData struct {
 	DataTimestamp          int64
 }
 
+func (e *BaseFromBaiinfoData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 func GetBaseFromBaiinfoDataByCondition(condition string, pars []interface{}) (list []*BaseFromBaiinfoData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_baiinfo_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 // AddEdbDataFromBaiinfo 新增百川盈弗指标数据
 func AddEdbDataFromBaiinfo(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -42,7 +50,7 @@ func AddEdbDataFromBaiinfo(edbCode string) (err error) {
 		pars = append(pars, edbCode)
 	}
 	baiinfoBaseDataAll, err := GetBaseFromBaiinfoDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	var isAdd bool
@@ -65,7 +73,8 @@ func AddEdbDataFromBaiinfo(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		//_, err = o.Raw(addSql).Exec()
 		if err != nil {
 			return err
 		}
@@ -77,7 +86,7 @@ func AddEdbDataFromBaiinfo(edbCode string) (err error) {
 func RefreshEdbDataFromBaiinfo(edbInfoId int, edbCode, startDate string) (err error) {
 	source := utils.DATA_SOURCE_BAIINFO
 	subSource := utils.DATA_SUB_SOURCE_EDB
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -107,7 +116,7 @@ func RefreshEdbDataFromBaiinfo(edbInfoId int, edbCode, startDate string) (err er
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -175,7 +184,8 @@ func RefreshEdbDataFromBaiinfo(edbInfoId int, edbCode, startDate string) (err er
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
 			return
@@ -195,72 +205,97 @@ type HandleBaiinfoExcelDataReq struct {
 }
 
 type BaseFromBaiinfoIndex struct {
-	BaseFromBaiinfoIndexId int64 `orm:"column(base_from_baiinfo_index_id);pk"`
-	IndexCode              string
-	IndexName              string
-	Frequency              string
-	Unit                   string
-	StartDate              string
-	EndDate                string
-	Sort                   int
-	BaseFileName           string
-	RenameFileName         string
-	TerminalCode           string
-	CreateTime             time.Time
-	ModifyTime             time.Time
+	BaseFromBaiinfoIndexId int64 `gorm:"column:base_from_baiinfo_index_id;primaryKey"`
+	//BaseFromBaiinfoIndexId int64 `orm:"column(base_from_baiinfo_index_id);pk"`
+	IndexCode      string
+	IndexName      string
+	Frequency      string
+	Unit           string
+	StartDate      string
+	EndDate        string
+	Sort           int
+	BaseFileName   string
+	RenameFileName string
+	TerminalCode   string
+	CreateTime     time.Time
+	ModifyTime     time.Time
+}
+
+func (e *BaseFromBaiinfoIndex) AfterFind(db *gorm.DB) (err error) {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+
+	return
 }
 
 func (d *BaseFromBaiinfoIndex) AddBaseFromBaiinfoIndex() (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(d)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(d)
+	err = global.DEFAULT_DB.Create(&d).Error
+	if err != nil {
+		return
+	}
+	lastId = d.BaseFromBaiinfoIndexId
 	return
 }
 
 func AddBaseFromBaiinfoData(item []*BaseFromBaiinfoData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(1, item)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(1, item)
+	err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
 	return
 }
 
 func (d *BaseFromBaiinfoIndex) GetSmmIndexItem(indexCode string) (item *BaseFromBaiinfoIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_baiinfo_index WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
 func GetBaseFromBaiinfoDataByCode(indexCode string) (list []*BaseFromBaiinfoData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_baiinfo_data WHERE index_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 func ModifyBaiinfoIndexSort(baseFromBaiinfoIndexId int64) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_baiinfo_index SET sort=? WHERE base_from_baiinfo_index_id=? `
-	_, err = o.Raw(sql, baseFromBaiinfoIndexId, baseFromBaiinfoIndexId).Exec()
+	//_, err = o.Raw(sql, baseFromBaiinfoIndexId, baseFromBaiinfoIndexId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, baseFromBaiinfoIndexId, baseFromBaiinfoIndexId).Error
 	return
 }
 
 func GetBaiinfoIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_baiinfo_data WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	var latest_value float64
+	sql = ` SELECT value AS latest_value FROM base_from_baiinfo_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&latest_value).Error
+	item.LatestValue = latest_value
+
 	return
 }
 
 func ModifyBaiinfoIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
-	sql := ` UPDATE base_from_baiinfo_index SET start_date=?,end_date=?,modify_time=NOW() WHERE index_code=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_baiinfo_index SET start_date=?,end_date=?,latest_value = ?,modify_time=NOW() WHERE index_code=? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }
 
 // Update 修改
 func (r *BaseFromBaiinfoIndex) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(r, updateCols...)
-
+	//o := orm.NewOrm()
+	//_, err = o.Update(r, updateCols...)
+	err = global.DEFAULT_DB.Model(&r).Select(updateCols).Updates(&r).Error
 	return
 }

+ 98 - 61
models/base_from_bloomberg.go

@@ -1,32 +1,35 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
+
+	"gorm.io/gorm"
 )
 
 // BaseFromBloombergIndex Bloomberg原始指标
 type BaseFromBloombergIndex struct {
-	BaseFromBloombergIndexId int       `orm:"column(base_from_bloomberg_index_id);pk"`
-	IndexCode                string    `description:"指标编码"`
-	IndexName                string    `description:"指标名称"`
-	Unit                     string    `description:"单位"`
-	Source                   int       `description:"来源"`
-	Frequency                string    `description:"频度"`
-	StartDate                time.Time `description:"开始时间"`
-	EndDate                  time.Time `description:"结束时间"`
-	Describe                 string    `description:"描述"`
-	Sort                     int       `description:"排序"`
-	IsStop                   int       `description:"是否停更:0-否;1-停更"`
-	EdbExist                 int       `description:"指标库是否已添加:0-否;1-是"`
-	TerminalCode             string    `description:"所属终端编码"`
-	FilePath                 string    `description:"文件存储路径"`
-	CreateTime               time.Time `description:"创建时间"`
-	ModifyTime               time.Time `description:"修改时间"`
+	BaseFromBloombergIndexId int `gorm:"column:base_from_bloomberg_index_id;primaryKey"`
+	//BaseFromBloombergIndexId int       `orm:"column(base_from_bloomberg_index_id);pk"`
+	IndexCode    string    `description:"指标编码"`
+	IndexName    string    `description:"指标名称"`
+	Unit         string    `description:"单位"`
+	Source       int       `description:"来源"`
+	Frequency    string    `description:"频度"`
+	StartDate    time.Time `description:"开始时间"`
+	EndDate      time.Time `description:"结束时间"`
+	Describe     string    `description:"描述"`
+	Sort         int       `description:"排序"`
+	IsStop       int       `description:"是否停更:0-否;1-停更"`
+	EdbExist     int       `description:"指标库是否已添加:0-否;1-是"`
+	TerminalCode string    `description:"所属终端编码"`
+	FilePath     string    `description:"文件存储路径"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"修改时间"`
 }
 
 func (m *BaseFromBloombergIndex) TableName() string {
@@ -34,31 +37,35 @@ func (m *BaseFromBloombergIndex) TableName() string {
 }
 
 func (m *BaseFromBloombergIndex) Create() (err error) {
-	o := orm.NewOrm()
-	id, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.BaseFromBloombergIndexId = int(id)
+	//o := orm.NewOrm()
+	//id, err := o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
+	//m.BaseFromBloombergIndexId = int(id)
+	err = global.DEFAULT_DB.Create(&m).Error
 	return
 }
 
 func (m *BaseFromBloombergIndex) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, cols...)
+	err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func GetBaseFromBloombergIndexByCode(indexCode string) (item *BaseFromBloombergIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_bloomberg_index WHERE index_code = ? LIMIT 1`
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
 // BaseFromBloombergData Bloomberg原始数据
 type BaseFromBloombergData struct {
-	BaseFromBloombergDataId  int       `orm:"column(base_from_bloomberg_data_id);pk"`
+	//BaseFromBloombergDataId  int       `orm:"column(base_from_bloomberg_data_id);pk"`
+	BaseFromBloombergDataId  int       `gorm:"column:base_from_bloomberg_data_id;primaryKey"`
 	BaseFromBloombergIndexId int       `description:"指标ID"`
 	IndexCode                string    `description:"指标编码"`
 	DataTime                 time.Time `description:"数据日期"`
@@ -74,48 +81,67 @@ func (m *BaseFromBloombergData) TableName() string {
 
 func GetBaseFromBloombergDataByCondition(condition string, pars []interface{}) (items []*BaseFromBloombergData, err error) {
 	sub := `SELECT * FROM base_from_bloomberg_data WHERE 1=1  `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sub += condition
 	}
 	sql := `SELECT * FROM (` + sub + ` HAVING 1 ORDER BY modify_time DESC) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 func MultiInsertOrUpdateBaseFromBloombergData(inserts, updates []*BaseFromBloombergData) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if len(inserts) > 0 {
-		_, e := o.InsertMulti(1000, inserts)
+		//_, e := o.InsertMulti(1000, inserts)
+		e := global.DEFAULT_DB.CreateInBatches(&inserts, 1000).Error
 		if e != nil {
 			err = fmt.Errorf("insert multi err: %s", e.Error())
 			return
 		}
 	}
 	if len(updates) > 0 {
-		p, e := o.Raw("UPDATE base_from_bloomberg_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ?").Prepare()
-		if e != nil {
-			err = fmt.Errorf("prepare err: %s", e.Error())
-			return
-		}
+		to := global.DEFAULT_DB.Begin()
 		defer func() {
-			_ = p.Close()
+			if err != nil {
+				_ = to.Rollback()
+			} else {
+				_ = to.Commit()
+			}
 		}()
+		sql := `UPDATE base_from_bloomberg_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ?`
 		for _, v := range updates {
-			_, e = p.Exec(v.Value, v.IndexCode, v.DataTime.Format(utils.FormatDate))
-			if e != nil {
-				err = fmt.Errorf("update err: %s", e.Error())
+			err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime.Format(utils.FormatDate)).Error
+			if err != nil {
+				err = fmt.Errorf("update err: %s", err.Error())
 				return
 			}
 		}
+		//p, e := o.Raw("UPDATE base_from_bloomberg_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ?").Prepare()
+		//if e != nil {
+		//	err = fmt.Errorf("prepare err: %s", e.Error())
+		//	return
+		//}
+		//defer func() {
+		//	_ = p.Close()
+		//}()
+		//for _, v := range updates {
+		//	_, e = p.Exec(v.Value, v.IndexCode, v.DataTime.Format(utils.FormatDate))
+		//	if e != nil {
+		//		err = fmt.Errorf("update err: %s", e.Error())
+		//		return
+		//	}
+		//}
 	}
 	return
 }
 
 func GetBaseFromBloombergIndexMinMax(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_bloomberg_data WHERE index_code = ? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	if err != nil {
 		return
 	}
@@ -123,7 +149,8 @@ func GetBaseFromBloombergIndexMinMax(indexCode string) (item *EdbInfoMaxAndMinIn
 	// 获取最新值
 	var lastVal float64
 	sql = ` SELECT value AS latest_value FROM base_from_bloomberg_data WHERE index_code = ? ORDER BY data_time DESC LIMIT 1 `
-	err = o.Raw(sql, indexCode).QueryRow(&lastVal)
+	//err = o.Raw(sql, indexCode).QueryRow(&lastVal)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&lastVal).Error
 	if err != nil {
 		return
 	}
@@ -132,31 +159,39 @@ func GetBaseFromBloombergIndexMinMax(indexCode string) (item *EdbInfoMaxAndMinIn
 }
 
 func ModifyBaseFromBloombergIndexMinMax(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
-	sql := ` UPDATE base_from_bloomberg_index SET start_date = ?, end_date = ?, modify_time = NOW() WHERE index_code = ? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_bloomberg_index SET start_date = ?, end_date = ?,latest_value = ?, modify_time = NOW() WHERE index_code = ? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }
 
 type BloombergData struct {
-	InputValue float64 `orm:"column(value)" description:"值"`
-	DataTime   string  `orm:"column(data_time)" description:"日期"`
+	InputValue float64 `gorm:"column:value" description:"值"`
+	DataTime   string  `gorm:"column:data_time" description:"日期"`
+}
+
+func (m *BloombergData) AfterFind(c *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+	return
 }
 
 func GetBloombergDataByCondition(condition string, pars []interface{}) (item []*BloombergData, err error) {
 	sql1 := ` SELECT * FROM base_from_bloomberg_data WHERE 1=1  `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql1 += condition
 	}
 	sql := `select * from (` + sql1 + ` having 1 order by modify_time DESC ) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	sql = utils.ReplaceDriverKeywords("", sql)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // AddEdbDataFromBloomberg 新增Bloomberg指标数据
 func AddEdbDataFromBloomberg(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -177,6 +212,7 @@ func AddEdbDataFromBloomberg(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_bloomberg (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := bloombergDataList[i]
 			eDate := item.DataTime
@@ -198,7 +234,8 @@ func AddEdbDataFromBloomberg(edbCode string) (err error) {
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
 			utils.FileLog.Info("addSql:" + addSql)
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}
@@ -212,7 +249,7 @@ func RefreshEdbDataFromBloomberg(edbInfoId int, edbCode, startDate string) (err
 	source := utils.DATA_SOURCE_BLOOMBERG
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -242,7 +279,7 @@ func RefreshEdbDataFromBloomberg(edbInfoId int, edbCode, startDate string) (err
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -270,6 +307,7 @@ func RefreshEdbDataFromBloomberg(edbInfoId int, edbCode, startDate string) (err
 	}
 
 	addSql := ` INSERT INTO edb_data_bloomberg(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	addMap := make(map[string]string)
 	for _, v := range bloombergDataList {
@@ -318,7 +356,8 @@ func RefreshEdbDataFromBloomberg(edbInfoId int, edbCode, startDate string) (err
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -354,9 +393,7 @@ type BaseFromBloombergApiIndexData struct {
 
 // PCSGImportHistoryDataReq 导入历史数据
 type PCSGImportHistoryDataReq struct {
-	IndexCode       string                `description:"指标编码"`
-	DataMap         map[time.Time]float64 `description:"数据日期/值"`
-	IsVCode         bool                  `description:"是否指标编码中间加V"`
-	ExtraLetter     string                `description:"指标编码中间额外加的字母...比如V"`
-	IndexNamePrefix string                `description:"指标名称前缀"`
+	IndexCode string                `description:"指标编码"`
+	DataMap   map[time.Time]float64 `description:"数据日期/值"`
+	TaskKey   string                `description:"导入数据对应的任务Key"`
 }

+ 72 - 55
models/base_from_business.go

@@ -1,32 +1,33 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/models/mgo"
 	"eta/eta_index_lib/utils"
 	"fmt"
 	"go.mongodb.org/mongo-driver/bson"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 // BaseFromBusinessIndex
 // @Description: 外部指标(商家系统)表
 type BaseFromBusinessIndex struct {
-	BaseFromBusinessIndexId int64     `orm:"column(base_from_business_index_id);pk"`
-	IndexCode               string    `description:"指标编码"`
-	IndexName               string    `description:"指标名称"`
-	Unit                    string    `description:"单位"`
-	Frequency               string    `description:"频度"`
-	Source                  int       `description:"数据来源"`
-	SourceName              string    `description:"数据来源名称"`
-	StartDate               time.Time `description:"开始日期"`
-	EndDate                 time.Time `description:"结束日期"`
-	Remark                  string    `description:"备注字段"`
-	BaseModifyTime          time.Time `description:"基础信息(名称,单位,频度)变更时间"`
-	DataUpdateTime          time.Time `description:"最近一次数据发生变化的时间"`
-	CreateTime              time.Time `description:"创建时间"`
-	ModifyTime              time.Time `description:"修改时间"`
+	BaseFromBusinessIndexId int64 `gorm:"column:base_from_business_index_id;primaryKey"`
+	//BaseFromBusinessIndexId int64     `orm:"column(base_from_business_index_id);pk"`
+	IndexCode      string    `description:"指标编码"`
+	IndexName      string    `description:"指标名称"`
+	Unit           string    `description:"单位"`
+	Frequency      string    `description:"频度"`
+	Source         int       `description:"数据来源"`
+	SourceName     string    `description:"数据来源名称"`
+	StartDate      time.Time `description:"开始日期"`
+	EndDate        time.Time `description:"结束日期"`
+	Remark         string    `description:"备注字段"`
+	BaseModifyTime time.Time `description:"基础信息(名称,单位,频度)变更时间"`
+	DataUpdateTime time.Time `description:"最近一次数据发生变化的时间"`
+	CreateTime     time.Time `description:"创建时间"`
+	ModifyTime     time.Time `description:"修改时间"`
 }
 
 // BaseFromBusinessIndexResp
@@ -42,9 +43,10 @@ type BaseFromBusinessIndexResp struct {
 // EdbBusinessSource
 // @Description: 自有数据(商家)指标来源
 type EdbBusinessSource struct {
-	EdbBusinessSourceId int64     `orm:"column(edb_business_source_id);pk"`
-	SourceName          string    `description:"来源名称"` // 来源名称
-	CreateTime          time.Time `description:"创建时间"` // 创建时间
+	EdbBusinessSourceId int64 `gorm:"column:edb_business_source_id;primaryKey"`
+	//EdbBusinessSourceId int64     `orm:"column(edb_business_source_id);pk"`
+	SourceName string    `description:"来源名称"` // 来源名称
+	CreateTime time.Time `description:"创建时间"` // 创建时间
 }
 
 // AddBusinessIndexReq
@@ -89,9 +91,10 @@ type DelBusinessIndexDataReq struct {
 // @return item *BaseFromBusinessIndex
 // @return err error
 func (m *BaseFromBusinessIndex) GetIndexItem(indexCode string) (item *BaseFromBusinessIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_business_index WHERE index_code = ? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
@@ -108,9 +111,11 @@ func (m *BaseFromBusinessIndex) GetIndexItemList(indexCodeList []string) (items
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrm()
-	sql := `SELECT * FROM base_from_business_index WHERE index_code in (` + utils.GetOrmInReplace(num) + `) `
-	_, err = o.Raw(sql, indexCodeList).QueryRows(&items)
+	//o := orm.NewOrm()
+	//sql := `SELECT * FROM base_from_business_index WHERE index_code in (` + utils.GetOrmInReplace(num) + `) `
+	sql := `SELECT * FROM base_from_business_index WHERE index_code in ? `
+	err = global.DEFAULT_DB.Raw(sql, indexCodeList).Find(&items).Error
+	//_, err = o.Raw(sql, indexCodeList).QueryRows(&items)
 
 	return
 }
@@ -127,9 +132,11 @@ func (m *BaseFromBusinessIndex) DelIndexItemList(indexCodeList []string) (err er
 	if num <= 0 {
 		return
 	}
-	o := orm.NewOrm()
-	sql := `DELETE FROM base_from_business_index WHERE index_code in (` + utils.GetOrmInReplace(num) + `) `
-	_, err = o.Raw(sql, indexCodeList).Exec()
+	//o := orm.NewOrm()
+	//sql := `DELETE FROM base_from_business_index WHERE index_code in (` + utils.GetOrmInReplace(num) + `) `
+	sql := `DELETE FROM base_from_business_index WHERE index_code in ? `
+	err = global.DEFAULT_DB.Exec(sql, indexCodeList).Error
+	//_, err = o.Raw(sql, indexCodeList).Exec()
 
 	return
 }
@@ -142,33 +149,40 @@ func (m *BaseFromBusinessIndex) DelIndexItemList(indexCodeList []string) (err er
 // @return maxId int
 // @return err error
 func (m *BaseFromBusinessIndex) GetMaxId() (maxId int, err error) {
-	o := orm.NewOrm()
-	sql := `SELECT max(base_from_business_index_id) id FROM base_from_business_index limit 1`
-	err = o.Raw(sql).QueryRow(&maxId)
+	//o := orm.NewOrm()
+	var intNull sql2.NullInt64
+	sql := `SELECT COALESCE(MAX(base_from_business_index_id), 0) as id FROM base_from_business_index limit 1`
+	err = global.DEFAULT_DB.Raw(sql).Scan(&intNull).Error
+	if err == nil && intNull.Valid {
+		maxId = int(intNull.Int64)
+	}
+	//err = o.Raw(sql).QueryRow(&maxId)
 	return
 }
 
 // Add 新增
 func (m *BaseFromBusinessIndex) Add() (err error) {
-	o := orm.NewOrm()
-	lastId, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.BaseFromBusinessIndexId = lastId
-
+	//o := orm.NewOrm()
+	//lastId, err := o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
+	//m.BaseFromBusinessIndexId = lastId
+	err = global.DEFAULT_DB.Create(&m).Error
 	return
 }
 
 func (m *BaseFromBusinessIndex) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, cols...)
+	err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *BaseFromBusinessIndex) Del() (err error) {
-	o := orm.NewOrm()
-	_, err = o.Delete(m)
+	//o := orm.NewOrm()
+	//_, err = o.Delete(m)
+	err = global.DEFAULT_DB.Delete(&m).Error
 	return
 }
 
@@ -179,8 +193,9 @@ func (m *BaseFromBusinessIndex) UpdateIndex(item *BaseFromBusinessIndex, updateC
 	if len(updateCols) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	_, err = o.Update(item, updateCols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(item, updateCols...)
+	err = global.DEFAULT_DB.Model(&item).Select(updateCols).Updates(&item).Error
 	return
 }
 
@@ -193,21 +208,22 @@ func (m *BaseFromBusinessIndex) UpdateIndex(item *BaseFromBusinessIndex, updateC
 // @return item *EdbBusinessSource
 // @return err error
 func (m *EdbBusinessSource) GetEdbBusinessSourceItem(sourceName string) (item *EdbBusinessSource, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM edb_business_source WHERE source_name = ? `
-	err = o.Raw(sql, sourceName).QueryRow(&item)
+	//err = o.Raw(sql, sourceName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, sourceName).First(&item).Error
 	return
 }
 
 // Add 新增
 func (m *EdbBusinessSource) Add() (err error) {
-	o := orm.NewOrm()
-	lastId, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.EdbBusinessSourceId = lastId
-
+	////o := orm.NewOrm()
+	//lastId, err := o.Insert(m)
+	//if err != nil {
+	//	return
+	//}
+	//m.EdbBusinessSourceId = lastId
+	err = global.DEFAULT_DB.Create(&m).Error
 	return
 }
 
@@ -319,12 +335,13 @@ func (m BaseFromBusinessIndex) getEdbInfoMaxAndMinInfoByMysql(edbCode string) (i
 // @param isIndexUpdateOrAdd bool
 // @return err error
 func (m *BaseFromBusinessIndex) ModifyIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo, isIndexUpdateOrAdd bool) (err error) {
-	o := orm.NewOrm()
-	sql := ` UPDATE base_from_business_index SET start_date=?,end_date=?,modify_time=NOW() `
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_business_index SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() `
 	if isIndexUpdateOrAdd {
 		sql += `,data_update_time=NOW() `
 	}
 	sql += ` WHERE index_code=?`
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }

+ 44 - 34
models/base_from_business_data.go

@@ -1,10 +1,11 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"errors"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
@@ -12,7 +13,8 @@ import (
 // BaseFromBusinessData
 // @Description: 外部指标(商家系统)原始数据表
 type BaseFromBusinessData struct {
-	BusinessDataId          int       `orm:"column(business_data_id);pk" json:"business_data_id"`
+	//BusinessDataId          int       `orm:"column(business_data_id);pk" json:"business_data_id"`
+	BusinessDataId          int       `gorm:"column:business_data_id;primaryKey" json:"business_data_id"`
 	BaseFromBusinessIndexId int       `json:"base_from_business_index_id"` // 指标id
 	IndexCode               string    `json:"index_code"`                  // 指标编码
 	DataTime                time.Time `json:"data_time"`                   // 数据日期
@@ -68,7 +70,7 @@ type WhereParams struct {
 // @return result []*BaseFromBusinessData
 // @return err error
 func (m *BaseFromBusinessData) GetAllDataList(condition []string, pars []interface{}, order string) (result []*BaseFromBusinessData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	sql := `SELECT * FROM base_from_business_data `
 	if len(condition) > 0 {
@@ -79,8 +81,8 @@ func (m *BaseFromBusinessData) GetAllDataList(condition []string, pars []interfa
 		sql += ` ORDER BY ` + order
 	}
 
-	_, err = o.Raw(sql, pars).QueryRows(&result)
-
+	//_, err = o.Raw(sql, pars).QueryRows(&result)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&result).Error
 	return
 }
 
@@ -96,7 +98,7 @@ func (m *BaseFromBusinessData) GetAllDataList(condition []string, pars []interfa
 // @return result []*BaseFromBusinessData
 // @return err error
 func (m *BaseFromBusinessData) GetLimitDataList(condition []string, pars []interface{}, order string, size int64) (result []*BaseFromBusinessData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_business_data `
 	if len(condition) > 0 {
 		sql += ` WHERE ` + strings.Join(condition, " AND ")
@@ -108,8 +110,8 @@ func (m *BaseFromBusinessData) GetLimitDataList(condition []string, pars []inter
 
 	sql += fmt.Sprintf(` LIMIT %d`, size)
 
-	_, err = o.Raw(sql, pars).QueryRows(&result)
-
+	//_, err = o.Raw(sql, pars).QueryRows(&result)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&result).Error
 	return
 }
 
@@ -126,7 +128,7 @@ func (m *BaseFromBusinessData) GetLimitDataList(condition []string, pars []inter
 // @return result []*BaseFromBusinessData
 // @return err error
 func (m *BaseFromBusinessData) GetPageDataList(condition []string, pars []interface{}, order string, startSize, size int64) (result []*BaseFromBusinessData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_business_data `
 	if len(condition) > 0 {
 		sql += ` WHERE ` + strings.Join(condition, " AND ")
@@ -138,8 +140,8 @@ func (m *BaseFromBusinessData) GetPageDataList(condition []string, pars []interf
 
 	sql += fmt.Sprintf(` LIMIT %d,%d`, startSize, size)
 
-	_, err = o.Raw(sql, pars).QueryRows(&result)
-
+	//_, err = o.Raw(sql, pars).QueryRows(&result)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&result).Error
 	return
 }
 
@@ -153,13 +155,13 @@ func (m *BaseFromBusinessData) GetPageDataList(condition []string, pars []interf
 // @return count int64
 // @return err error
 func (m *BaseFromBusinessData) GetCountDataList(condition []string, pars []interface{}) (count int64, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT COUNT(1) FROM base_from_business_data `
 	if len(condition) > 0 {
 		sql += ` WHERE ` + strings.Join(condition, " AND ")
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
-
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
@@ -171,9 +173,9 @@ func (m *BaseFromBusinessData) GetCountDataList(condition []string, pars []inter
 // @param addData interface{}
 // @return err error
 func (m *BaseFromBusinessData) InsertDataByColl(addData interface{}) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Insert(addData)
-
+	//o := orm.NewOrm()
+	//_, err = o.Insert(addData)
+	err = global.DEFAULT_DB.Create(&addData).Error
 	return
 }
 
@@ -186,9 +188,9 @@ func (m *BaseFromBusinessData) InsertDataByColl(addData interface{}) (err error)
 // @param dataList []*BaseFromBusinessData
 // @return err error
 func (m *BaseFromBusinessData) BatchInsertData(bulk int, dataList []*BaseFromBusinessData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(bulk, dataList)
-
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(bulk, dataList)
+	err = global.DEFAULT_DB.CreateInBatches(&dataList, bulk).Error
 	return
 }
 
@@ -201,8 +203,9 @@ func (m *BaseFromBusinessData) BatchInsertData(bulk int, dataList []*BaseFromBus
 // @param updateParams interface{}
 // @return err error
 func (m *BaseFromBusinessData) UpdateData(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, updateCols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, updateCols...)
+	err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
 	if err != nil {
 		fmt.Println("UpdateDataByColl:Err:" + err.Error())
 		return
@@ -220,8 +223,9 @@ func (m *BaseFromBusinessData) UpdateData(updateCols []string) (err error) {
 // @param updateDataList []*BaseFromBusinessData
 // @return err error
 func (m *BaseFromBusinessData) HandleData(addDataList, updateDataList []*BaseFromBusinessData) (err error) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -236,7 +240,8 @@ func (m *BaseFromBusinessData) HandleData(addDataList, updateDataList []*BaseFro
 
 	// 插入数据
 	if len(addDataList) > 0 {
-		_, err = to.InsertMulti(500, addDataList)
+		//_, err = to.InsertMulti(500, addDataList)
+		err = to.CreateInBatches(&addDataList, utils.MultiAddNum).Error
 		if err != nil {
 			return
 		}
@@ -246,7 +251,8 @@ func (m *BaseFromBusinessData) HandleData(addDataList, updateDataList []*BaseFro
 
 	if len(updateDataList) > 0 {
 		for _, v := range updateDataList {
-			_, err = to.Update(v, "Value", "ModifyTime")
+			//_, err = to.Update(v, "Value", "ModifyTime")
+			err = to.Model(&v).Select([]string{"Value", "ModifyTime"}).Updates(&v).Error
 			if err != nil {
 				fmt.Println("BaseFromBusinessData HandleData Update:Err:" + err.Error())
 				return
@@ -266,18 +272,22 @@ func (m *BaseFromBusinessData) HandleData(addDataList, updateDataList []*BaseFro
 // @return result EdbInfoMaxAndMinInfo
 // @return err error
 func (m *BaseFromBusinessData) GetEdbInfoMaxAndMinInfo(indexCode string) (result EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ``
 	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_business_data WHERE index_code = ? `
-	err = o.Raw(sql, indexCode).QueryRow(&result)
+	//err = o.Raw(sql, indexCode).QueryRow(&result)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&result).Error
 	if err != nil {
 		return
 	}
 
-	var latestValue float64
 	sql = ` SELECT value AS latest_value FROM base_from_business_data WHERE index_code = ? ORDER BY data_time DESC LIMIT 1 `
-	err = o.Raw(sql, indexCode).QueryRow(&latestValue)
-	result.LatestValue = latestValue
+	//err = o.Raw(sql, indexCode).QueryRow(&latestValue)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		result.LatestValue = latestValueNull.Float64
+	}
 
 	return
 }
@@ -295,12 +305,12 @@ func (m *BaseFromBusinessData) DelDataByCond(condition []string, pars []interfac
 		err = errors.New("条件不能为空")
 		return
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `DELETE FROM base_from_business_data `
 
 	sql += ` WHERE ` + strings.Join(condition, " AND ")
 
-	_, err = o.Raw(sql, pars).Exec()
-
+	//_, err = o.Raw(sql, pars).Exec()
+	err = global.DEFAULT_DB.Exec(sql, pars...).Error
 	return
 }

+ 50 - 28
models/base_from_calculate.go

@@ -3,15 +3,16 @@ package models
 import (
 	"encoding/json"
 	"errors"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 
 	"github.com/dengsgo/math-engine/engine"
 
-	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
 )
 
@@ -48,8 +49,9 @@ type CalculateItems struct {
 // AddCalculateInfo 新增计算(运算)指标
 func AddCalculateInfo(req EdbInfoCalculateSaveReq, calculateMappingList []*EdbInfoCalculateMapping, edbInfoList []*EdbInfo, edbCode, uniqueCode string, edbInfoIdBytes []string) (edbInfo *EdbInfo, err error) {
 
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -98,11 +100,12 @@ func AddCalculateInfo(req EdbInfoCalculateSaveReq, calculateMappingList []*EdbIn
 		MaxEmptyType:     req.MaxEmptyType,
 		Extra:            req.Extra,
 	}
-	lastId, err := to.Insert(edbInfo)
+	//lastId, err := to.Insert(edbInfo)
+	err = to.Create(&edbInfo).Error
 	if err != nil {
 		return
 	}
-	edbInfo.EdbInfoId = int(lastId)
+	//edbInfo.EdbInfoId = int(lastId)
 	edbInfoTag := make(map[string]int)
 	//关联关系表
 	{
@@ -113,7 +116,8 @@ func AddCalculateInfo(req EdbInfoCalculateSaveReq, calculateMappingList []*EdbIn
 			v.EdbInfoId = edbInfo.EdbInfoId
 		}
 		if len(calculateMappingList) > 0 {
-			_, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
+			//_, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
+			err = to.CreateInBatches(&calculateMappingList, len(calculateMappingList)).Error
 			if err != nil {
 				return
 			}
@@ -127,8 +131,9 @@ func AddCalculateInfo(req EdbInfoCalculateSaveReq, calculateMappingList []*EdbIn
 
 // EditCalculateInfo 编辑计算(运算)指标
 func EditCalculateInfo(edbInfo *EdbInfo, req EdbInfoCalculateSaveReq, formulaSlice []string, edbInfoIdBytes []string, needCalculate bool) (err error, errMsg string) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -154,7 +159,8 @@ func EditCalculateInfo(edbInfo *EdbInfo, req EdbInfoCalculateSaveReq, formulaSli
 	edbInfo.EmptyType = req.EmptyType
 	edbInfo.MaxEmptyType = req.MaxEmptyType
 	edbInfo.Extra = req.Extra
-	_, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "EdbNameEn", "UnitEn", "ClassifyId", "CalculateFormula", "ModifyTime", "EmptyType", "MaxEmptyType", "Extra")
+	//_, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "EdbNameEn", "UnitEn", "ClassifyId", "CalculateFormula", "ModifyTime", "EmptyType", "MaxEmptyType", "Extra")
+	err = to.Model(&edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "EdbNameEn", "UnitEn", "ClassifyId", "CalculateFormula", "ModifyTime", "EmptyType", "MaxEmptyType", "Extra"}).Updates(&edbInfo).Error
 	if err != nil {
 		return
 	}
@@ -162,13 +168,15 @@ func EditCalculateInfo(edbInfo *EdbInfo, req EdbInfoCalculateSaveReq, formulaSli
 	if needCalculate {
 		// 清除计算数据
 		sql := `DELETE FROM edb_data_calculate WHERE edb_info_id=?`
-		_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+		//_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+		err = to.Exec(sql, edbInfo.EdbInfoId).Error
 		if err != nil {
 			return
 		}
 		// 清除关联关系表
 		sql = `DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=?`
-		_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+		//_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+		err = to.Exec(sql, edbInfo.EdbInfoId).Error
 		if err != nil {
 			return
 		}
@@ -225,7 +233,8 @@ func EditCalculateInfo(edbInfo *EdbInfo, req EdbInfoCalculateSaveReq, formulaSli
 		//关联关系表
 		{
 			if len(calculateMappingList) > 0 {
-				_, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
+				//_, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
+				err = to.CreateInBatches(&calculateMappingList, len(calculateMappingList)).Error
 				if err != nil {
 					return
 				}
@@ -241,20 +250,22 @@ func EditCalculateInfo(edbInfo *EdbInfo, req EdbInfoCalculateSaveReq, formulaSli
 
 // GetCalculateEdbInfo 获取计算指标的关联指标id
 func GetCalculateEdbInfo(edbInfoId int) (from_edb_info_id string, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT GROUP_CONCAT(from_edb_info_id ORDER BY sort ASC SEPARATOR ',') AS from_edb_info_id 
 			FROM edb_info_calculate_mapping
 			WHERE edb_info_id=?
 			GROUP BY edb_info_id
 			 `
-	err = o.Raw(sql, edbInfoId).QueryRow(&from_edb_info_id)
+	//err = o.Raw(sql, edbInfoId).QueryRow(&from_edb_info_id)
+	err = global.DEFAULT_DB.Raw(sql, edbInfoId).Scan(&from_edb_info_id).Error
 	return
 }
 
 // DeleteCalculateEdbInfo 删除指标信息
 func DeleteCalculateEdbInfo(edbInfoId int) (err error) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -266,19 +277,22 @@ func DeleteCalculateEdbInfo(edbInfoId int) (err error) {
 		}
 	}()
 	sql := `DELETE FROM edb_data_calculate WHERE edb_info_id=?`
-	_, err = to.Raw(sql, edbInfoId).Exec()
+	//_, err = to.Raw(sql, edbInfoId).Exec()
+	err = to.Exec(sql, edbInfoId).Error
 	if err != nil {
 		return
 	}
 	sql = `DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=?`
-	_, err = to.Raw(sql, edbInfoId).Exec()
+	//_, err = to.Raw(sql, edbInfoId).Exec()
+	err = to.Exec(sql, edbInfoId).Error
 	return
 }
 
 // RefreshAllCalculate 刷新全部数据
 func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoTag map[string]int, edbInfoId, source, subSource int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string, emptyType, maxEmptyType int, extra string) (err error) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -298,7 +312,9 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoTag map[string]int, edb
 }
 
 // refreshAllCalculate 刷新全部数据
-func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map[string]int, edbInfoId, source, subSource int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string, emptyType, maxEmptyType int, extra string) (err error) {
+func refreshAllCalculate(to *gorm.DB, edbInfoIdArr []*EdbInfo, edbInfoTag map[string]int, edbInfoId, source, subSource int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string, emptyType, maxEmptyType int, extra string) (err error) {
+	//func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map[string]int, edbInfoId, source, subSource int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string, emptyType, maxEmptyType int, extra string) (err error) {
+
 	realSaveDataMap := make(map[string]map[int]float64)
 	saveDataMap := make(map[string]map[int]float64)
 
@@ -393,6 +409,7 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map
 		return
 	}
 	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 
 	//获取指标所有数据
@@ -400,7 +417,8 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map
 	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	//_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	err = to.Raw(sql, edbInfoId).Find(&dataList).Error
 	if err != nil {
 		return err
 	}
@@ -515,7 +533,8 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map
 			if existStr != saveValue {
 				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
 				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
+				//_, err = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
+				err = to.Exec(sql, saveValue, edbInfoId, sk).Error
 				if err != nil {
 					return err
 				}
@@ -525,7 +544,8 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
+		//_, err = to.Raw(addSql).Exec()
+		err = to.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshAllCalculate add Err", err.Error())
 			return
@@ -537,13 +557,14 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoTag map
 		for k := range removeDateMap {
 			removeDateList = append(removeDateList, k)
 		}
-		removeDateStr := strings.Join(removeDateList, `","`)
-		removeDateStr = `"` + removeDateStr + `"`
+		removeDateStr := strings.Join(removeDateList, `','`)
+		removeDateStr = `'` + removeDateStr + `'`
 		//如果拼接指标变更了,那么需要删除所有的指标数据
 		tableName := GetEdbDataTableName(source, subSource)
 		sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
 
-		_, err = to.Raw(sql, edbInfoId).Exec()
+		//_, err = to.Raw(sql, edbInfoId).Exec()
+		err = to.Exec(sql, edbInfoId).Error
 		if err != nil {
 			err = fmt.Errorf("删除计算失败的计算指标数据失败,Err:" + err.Error())
 			return
@@ -598,6 +619,7 @@ func ReplaceFormula(edbInfoIdArr []*EdbInfo, valArr, valArrMax map[int]float64,
 	formulaStr = strings.Replace(formulaStr, "CBRT", "cbrt", -1)
 	formulaStr = strings.Replace(formulaStr, "NOERR", "noerr", -1)
 	formulaStr = strings.Replace(formulaStr, "DOUBLE", "double", -1)
+	formulaStr = strings.Replace(formulaStr, "POW", "pow", -1)
 	if replaceCount == len(formulaMap) {
 		return formulaStr
 	} else {
@@ -687,7 +709,7 @@ type EdbInfoCalculateBatchSaveReq struct {
 	CalculateFormula string                         `description:"计算公式"`
 	EdbInfoIdArr     []EdbInfoCalculateEdbInfoIdReq `description:"关联指标列表"`
 	MoveType         int                            `description:"移动方式:1:领先(默认),2:滞后"`
-	MoveFrequency    string                         `description:"移动频度:天/周/月/季/年"`
+	MoveFrequency    string                         `description:"移动频度:天/周/月/季/年/交易日/自然日"`
 	Calendar         string                         `description:"公历/农历"`
 	Data             interface{}                    `description:"数据"`
 	EmptyType        int                            `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`

+ 126 - 59
models/base_from_ccf.go

@@ -1,9 +1,11 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -13,7 +15,8 @@ import (
 type BaseFromCCF struct{}
 
 type BaseFromCCFData struct {
-	BaseFromCcfDataId  int `orm:"column(base_from_ccf_data_id);pk"`
+	//BaseFromCcfDataId  int `orm:"column(base_from_ccf_data_id);pk"`
+	BaseFromCcfDataId  int `gorm:"column:base_from_ccf_data_id;primaryKey"`
 	BaseFromCcfIndexId int
 	IndexCode          string
 	DataTime           string
@@ -27,19 +30,26 @@ func (m *BaseFromCCFData) TableName() string {
 	return "base_from_ccf_data"
 }
 
+func (e *BaseFromCCFData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 func GetBaseFromCCFDataByCondition(condition string, pars []interface{}) (list []*BaseFromCCFData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_ccf_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 // Add 添加
 func (obj BaseFromCCF) Add(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -48,11 +58,12 @@ func (obj BaseFromCCF) Add(edbCode string) (err error) {
 		pars = append(pars, edbCode)
 	}
 	ccfBaseDataAll, err := GetBaseFromCCFDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_ccf(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 	for _, sv := range ccfBaseDataAll {
 		eDate := sv.DataTime
@@ -71,7 +82,8 @@ func (obj BaseFromCCF) Add(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -82,7 +94,7 @@ func (obj BaseFromCCF) Add(edbCode string) (err error) {
 // Refresh 刷新CCF化纤指标数据
 func (obj BaseFromCCF) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
 	source := obj.GetSource()
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -112,7 +124,7 @@ func (obj BaseFromCCF) Refresh(edbInfoId int, edbCode, startDate string) (err er
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -139,6 +151,7 @@ func (obj BaseFromCCF) Refresh(edbInfoId int, edbCode, startDate string) (err er
 		existMap[v.DataTime] = v
 	}
 	addSql := ` INSERT INTO edb_data_ccf(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range ccfDataList {
 		item := v
@@ -180,7 +193,8 @@ func (obj BaseFromCCF) Refresh(edbInfoId int, edbCode, startDate string) (err er
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
 			return
@@ -200,18 +214,26 @@ func (obj BaseFromCCF) GetSourceName() string {
 }
 
 type BaseFromCCFIndex struct {
-	BaseFromCcfIndexId int64 `orm:"column(base_from_ccf_index_id);pk"`
-	IndexCode          string
-	IndexName          string
-	Frequency          string
-	Unit               string
-	ClassifyId         int
-	StartDate          string
-	EndDate            string
-	Sort               int
-	TerminalCode       string
-	CreateTime         time.Time
-	ModifyTime         time.Time
+	BaseFromCcfIndexId int64 `gorm:"column:base_from_ccf_index_id;primaryKey"`
+	//BaseFromCcfIndexId int64 `orm:"column(base_from_ccf_index_id);pk"`
+	IndexCode    string
+	IndexName    string
+	Frequency    string
+	Unit         string
+	ClassifyId   int
+	StartDate    string
+	EndDate      string
+	Sort         int
+	TerminalCode string
+	CreateTime   time.Time
+	ModifyTime   time.Time
+}
+
+func (e *BaseFromCCFIndex) AfterFind(db *gorm.DB) (err error) {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+
+	return
 }
 
 func (m *BaseFromCCFIndex) TableName() string {
@@ -219,34 +241,41 @@ func (m *BaseFromCCFIndex) TableName() string {
 }
 
 func (m *BaseFromCCFIndex) Add() (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(m)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
+	if err != nil {
+		return
+	}
+	lastId = m.BaseFromCcfIndexId
 	return
 }
 
 func (m *BaseFromCCFIndex) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, updateCols...)
-
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, updateCols...)
+	err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
 	return
 }
 
 func (m *BaseFromCCFIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
-	sql := ` UPDATE base_from_ccf_index SET start_date=?,end_date=?,modify_time=NOW() WHERE index_code=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_ccf_index SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }
 
 func (m *BaseFromCCFIndex) GetByIndexCode(indexCode string) (item *BaseFromCCFIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_ccf_index WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
 	return
 }
 
 func (m *BaseFromCCFIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromCCFIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -256,12 +285,14 @@ func (m *BaseFromCCFIndex) GetItemsByCondition(condition string, pars []interfac
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM base_from_ccf_index WHERE 1=1 %s %s`, fields, condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 type BaseFromCCFIndexList struct {
-	CcfIndexId   int64 `orm:"column(ccf_index_id);pk"`
+	CcfIndexId int64 `gorm:"column:ccf_index_id;primaryKey"`
+	//CcfIndexId   int64 `orm:"column(ccf_index_id);pk"`
 	IndexCode    string
 	IndexName    string
 	Frequency    string
@@ -275,15 +306,17 @@ type BaseFromCCFIndexList struct {
 }
 
 func (m *BaseFromCCFData) GetByIndexCode(indexCode string) (list []*BaseFromCCFData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_ccf_data WHERE index_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 func (m *BaseFromCCFData) AddMulti(item []*BaseFromCCFData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(100, item)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(100, item)
+	err = global.DEFAULT_DB.CreateInBatches(&item, 100).Error
 	return
 }
 
@@ -317,15 +350,25 @@ type HandleCCFStockTableReq struct {
 }
 
 func (m *BaseFromCCFData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_ccf_data WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	sql = ` SELECT value AS latest_value FROM base_from_ccf_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+
 	return
 }
 
 // BaseFromCCFClassify CCF化纤数据分类表
 type BaseFromCCFClassify struct {
-	ClassifyId      int       `orm:"column(classify_id);pk"`
+	ClassifyId int `gorm:"column:classify_id;primaryKey"`
+	//ClassifyId      int       `orm:"column(classify_id);pk"`
 	ClassifyName    string    `description:"分类名称"`
 	ParentId        int       `description:"父级id"`
 	SysUserId       int       `description:"创建人id"`
@@ -337,27 +380,33 @@ type BaseFromCCFClassify struct {
 }
 
 func (m *BaseFromCCFClassify) Add() (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(m)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(m.ClassifyId)
 	return
 }
 
 func (m *BaseFromCCFClassify) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, updateCols...)
-
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, updateCols...)
+	err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
 	return
 }
 
 func (m *BaseFromCCFClassify) GetByClassifyName(classifyName string) (item *BaseFromCCFClassify, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_ccf_classify WHERE classify_name=? `
-	err = o.Raw(sql, classifyName).QueryRow(&item)
+	//err = o.Raw(sql, classifyName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
 	return
 }
 
 func (m *BaseFromCCFClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromCCFClassify, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -367,7 +416,8 @@ func (m *BaseFromCCFClassify) GetItemsByCondition(condition string, pars []inter
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM base_from_ccf_classify WHERE 1=1 %s %s`, fields, condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -404,23 +454,40 @@ func MultiUpdateBaseFromCCFDataValue(items []*BaseFromCCFData) (err error) {
 		return
 	}
 
-	o := orm.NewOrm()
-	sql := `UPDATE base_from_ccf_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
-	p, err := o.Raw(sql).Prepare()
-	if err != nil {
-		return
-	}
+	//o := orm.NewOrm()
+	to := global.DEFAULT_DB.Begin()
 	defer func() {
-		_ = p.Close()
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
 	}()
+	sql := `UPDATE base_from_ccf_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
 	for _, v := range items {
 		if v.IndexCode == "" || v.DataTime == "" {
 			continue
 		}
-		_, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
+		err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
 		if err != nil {
 			return
 		}
 	}
+	//p, err := o.Raw(sql).Prepare()
+	//if err != nil {
+	//	return
+	//}
+	//defer func() {
+	//	_ = p.Close()
+	//}()
+	//for _, v := range items {
+	//	if v.IndexCode == "" || v.DataTime == "" {
+	//		continue
+	//	}
+	//	_, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
+	//	if err != nil {
+	//		return
+	//	}
+	//}
 	return
 }

+ 39 - 14
models/base_from_cffex.go

@@ -1,16 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromTradeCFFEXIndex struct {
-	BaseFromTradeCffexIndexId int `orm:"column(base_from_trade_cffex_index_id);pk"`
+	//BaseFromTradeCffexIndexId int `orm:"column(base_from_trade_cffex_index_id);pk"`
+	BaseFromTradeCffexIndexId int `gorm:"column:base_from_trade_cffex_index_id;primaryKey"`
 	Rank                      int
 	DealShortName             string
 	DealName                  string
@@ -35,16 +37,25 @@ type BaseFromTradeCFFEXIndex struct {
 	DataTime                  string
 }
 
+func (m *BaseFromTradeCFFEXIndex) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 func GetBaseFromCffexDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeCFFEXIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_cffex_index WHERE %s_code=? `
 	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
+
 	return
 }
 
 type BaseFromCffexDataSimple struct {
-	Id        int `orm:"column(base_from_trade_cffex_index_id);pk"`
+	Id int `gorm:"column:base_from_trade_cffex_index_id;primaryKey"`
+	//Id        int `orm:"column(base_from_trade_cffex_index_id);pk"`
 	DealCode  string
 	BuyCode   string
 	SoldCode  string
@@ -54,14 +65,22 @@ type BaseFromCffexDataSimple struct {
 	SoldValue string
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromCffexDataSimple) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 func GetCffexDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromCffexDataSimple, err error) {
 	sql := ` SELECT * FROM base_from_trade_cffex_index WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
@@ -76,14 +95,17 @@ func AddEdbDataFromCffex(edbCode string) (err error) {
 		suffix = "sold"
 	}
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	cffexBaseDataAll, err := GetBaseFromCffexDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	//if err != nil && !utils.IsErrNoRow(err) {
+	//	return
+	//}
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
-
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 
 	for _, sv := range cffexBaseDataAll {
@@ -116,7 +138,8 @@ func AddEdbDataFromCffex(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -137,7 +160,7 @@ func RefreshEdbDataFromCffex(edbInfoId int, edbCode, startDate string) (err erro
 		suffix = "sold"
 	}
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -174,7 +197,7 @@ func RefreshEdbDataFromCffex(edbInfoId int, edbCode, startDate string) (err erro
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -203,6 +226,7 @@ func RefreshEdbDataFromCffex(edbInfoId int, edbCode, startDate string) (err erro
 	}
 
 	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range glDataList {
 		var value string
@@ -258,7 +282,8 @@ func RefreshEdbDataFromCffex(edbInfoId int, edbCode, startDate string) (err erro
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 287 - 0
models/base_from_clarksons.go

@@ -0,0 +1,287 @@
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"gorm.io/gorm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type BaseFromClarksonsIndex struct {
+	BaseFromClarksonsIndexId int `gorm:"primaryKey"`
+	//BaseFromClarksonsIndexId int       `orm:"pk"`
+	ClassifyId int    `description:"指标分类id"`
+	IndexCode  string `description:"指标编码"`
+	IndexName  string `description:"指标名称"`
+	Unit       string `description:"单位"`
+	Frequency  string `description:"频度"`
+	Sort       int    `description:"排序"`
+	CreateTime time.Time
+	ModifyTime time.Time
+}
+
+type BaseFromClarksonsData struct {
+	BaseFromClarksonsDataId  int       `gorm:"column:base_from_clarksons_data_id;primaryKey"`
+	BaseFromClarksonsIndexId int       `description:"指标id"`
+	IndexCode                string    `description:"指标编码"`
+	DataTime                 string    `description:"数据日期"`
+	Value                    string    `description:"数据值"`
+	CreateTime               time.Time `description:"创建时间"`
+	ModifyTime               time.Time `description:"修改时间"`
+}
+
+func (e *BaseFromClarksonsData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
+// 查询指标
+func GetBaseFromClarksonsIndex() (items []*BaseFromClarksonsIndex, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_clarksons_index`
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
+	return
+}
+
+// 查询指标
+func GetBaseFromClarksonsData() (items []*BaseFromClarksonsData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_clarksons_data`
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
+	return
+}
+
+// 添加数据
+func AddBaseFromClarksonsIndex(item *BaseFromClarksonsIndex) (lastId int64, err error) {
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromClarksonsIndexId)
+	return
+}
+
+func AddBaseFromClarksonsDataMuti(items []*BaseFromClarksonsData) (count int64, err error) {
+	dbResult := global.DEFAULT_DB.CreateInBatches(&items, utils.MultiAddNum)
+	err = dbResult.Error
+	count = dbResult.RowsAffected
+	return
+}
+
+func UpdateBaseFromClarksonsIndex(item *BaseFromClarksonsIndex) (err error) {
+	//o := orm.NewOrm()
+	sql := `UPDATE base_from_clarksons_index SET frequency=?  WHERE index_code=? `
+	//_, err = o.Raw(sql, item.Frequency, item.IndexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.Frequency, item.IndexCode).Error
+	return
+}
+
+func AddEdbDataFromClarksons(edbCode string) (err error) {
+	//o := orm.NewOrm()
+	coalBaseDataAll, err := GetClarksonsindexByCode(edbCode)
+	if err != nil && !utils.IsErrNoRow(err) {
+		return
+	}
+	//if err != nil && !utils.IsErrNoRow(err) {
+	//	return
+	//}
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_clarksons(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	existMap := make(map[string]string)
+	for _, sv := range coalBaseDataAll {
+		eDate := sv.DataTime
+		var timeStr string
+		var dataTime time.Time
+		var sDataTime string
+		var timestamp int64
+
+		sDataTime = eDate
+		dataTime, err = time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return err
+		}
+		timestamp = dataTime.UnixNano() / 1e6
+		timeStr = fmt.Sprintf("%d", timestamp)
+
+		value := strings.Replace(sv.Value, "%", "", -1)
+		if _, ok := existMap[sDataTime]; !ok {
+			addSql += GetAddSql("0", edbCode, sDataTime, timeStr, value)
+			fmt.Println("edbCode:", edbCode)
+			fmt.Println("sDataTime:", sDataTime)
+			fmt.Println("timeStr:", timeStr)
+			fmt.Println("value:", value)
+			isAdd = true
+		}
+		existMap[eDate] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+func RefreshEdbDataFromClarksons(edbInfoId int, edbCode, startDate string) (err error) {
+	source := utils.DATA_SOURCE_CLARKSONS
+	subSource := utils.DATA_SUB_SOURCE_EDB
+	//o := orm.NewOrm()
+	if err != nil {
+		return
+	}
+
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	glDataList, err := GetClarksonsDataByTradeCode(condition, pars)
+	if err != nil {
+		return
+	}
+
+	// 真实数据的最大日期  , 插入规则配置的日期
+	var realDataMaxDate, edbDataInsertConfigDate time.Time
+	var edbDataInsertConfig *EdbDataInsertConfig
+	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
+	{
+		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			return
+		}
+		if edbDataInsertConfig != nil {
+			edbDataInsertConfigDate = edbDataInsertConfig.Date
+		}
+	}
+
+	//获取指标所有数据
+	var existCondition string
+	var existPars []interface{}
+
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	if startDate != "" {
+		existCondition += " AND data_time>=? "
+		existPars = append(existPars, startDate)
+	}
+
+	existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+
+	addSql := ` INSERT INTO edb_data_clarksons(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	for _, v := range glDataList {
+		var value string
+		value = strings.Replace(v.Value, "%", "", -1)
+		item := v
+		itemValue := value
+		if _, ok := existMap[v.DataTime]; !ok {
+			eDate := item.DataTime
+			var timeStr string
+			var dataTime time.Time
+			var sDataTime string
+			var timestamp int64
+
+			sDataTime = eDate
+			dataTime, err = time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+			if err != nil {
+				fmt.Println("time.Parse Err:" + eDate)
+				return err
+			}
+			timestamp = dataTime.UnixNano() / 1e6
+			timeStr = fmt.Sprintf("%d", timestamp)
+
+			sValue := itemValue
+			if sValue != "" {
+				saveValue := sValue
+
+				if findItem, ok := existMap[eDate]; !ok {
+					addSql += GetAddSql(edbInfoIdStr, edbCode, sDataTime, timeStr, saveValue)
+					isAdd = true
+				} else {
+					if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != sValue {
+						err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, sValue)
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+
+			// 下面代码主要目的是处理掉手动插入的数据判断
+			{
+				if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
+					realDataMaxDate = dataTime
+				}
+				if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
+					isFindConfigDateRealData = true
+				}
+			}
+
+		}
+	}
+
+	// 处理手工数据补充的配置
+	HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			return err
+		}
+	}
+
+	return
+}
+
+// GetClarksonsindexByCode
+func GetClarksonsindexByCode(indexCode string) (items []*BaseFromClarksonsData, err error) {
+	//o := orm.NewOrm()
+	sql := "SELECT * FROM base_from_clarksons_data WHERE index_code=? "
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
+	return
+}
+
+func GetClarksonsDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromClarksonsData, err error) {
+	sql := ` SELECT * FROM base_from_clarksons_data WHERE 1=1 `
+	//o := orm.NewOrm()
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
+	return
+}

+ 27 - 11
models/base_from_coal.go

@@ -1,9 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -25,23 +26,34 @@ type BaseFromCoalmineIndex struct {
 	ModifyTime                     string `description:"修改时间"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromCoalmineIndex) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+	m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+
+	return
+}
+
 func GetBaseFromCoalIndexByCode(suffix, indexCode string) (items []*BaseFromCoalmineIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_%s WHERE index_code=? `
 	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
 	return
 }
 
 func GetCoalDataByTradeCode(suffix, condition string, pars []interface{}) (item []*BaseFromCoalmineIndex, err error) {
 	sql := ` SELECT * FROM base_from_coalmine_%s WHERE 1=1 `
 	sql = fmt.Sprintf(sql, suffix)
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
 
@@ -59,15 +71,16 @@ func AddEdbDataFromCoal(edbCode string) (err error) {
 		suffix = "inland_index"
 	}
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	coalBaseDataAll, err := GetBaseFromCoalIndexByCode(suffix, edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_coal(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 	for _, sv := range coalBaseDataAll {
 		eDate := sv.DataTime
@@ -129,7 +142,8 @@ func AddEdbDataFromCoal(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -140,7 +154,7 @@ func AddEdbDataFromCoal(edbCode string) (err error) {
 func RefreshEdbDataFromCoal(edbInfoId int, edbCode, startDate string) (err error) {
 	source := utils.DATA_SOURCE_COAL
 	subSource := utils.DATA_SUB_SOURCE_EDB
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -182,7 +196,7 @@ func RefreshEdbDataFromCoal(edbInfoId int, edbCode, startDate string) (err error
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -211,6 +225,7 @@ func RefreshEdbDataFromCoal(edbInfoId int, edbCode, startDate string) (err error
 	}
 
 	addSql := ` INSERT INTO edb_data_coal(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range glDataList {
 		var value string
@@ -297,7 +312,8 @@ func RefreshEdbDataFromCoal(edbInfoId int, edbCode, startDate string) (err error
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 26 - 10
models/base_from_coal_coastal.go

@@ -1,13 +1,16 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"gorm.io/gorm"
 	"time"
 )
 
 // BaseFromCoalmineCoastalIndex 沿海八省动力煤用户供耗存数据指标表
 type BaseFromCoalmineCoastalIndex struct {
-	BaseFromCoalmineCoastalIndexID int       `orm:"column(base_from_coalmine_coastal_index_id);pk"`
+	//BaseFromCoalmineCoastalIndexID int       `orm:"column(base_from_coalmine_coastal_index_id);pk"`
+	BaseFromCoalmineCoastalIndexID int       `gorm:"column:base_from_coalmine_coastal_index_id;primaryKey"`
 	IndexName                      string    // 省份/企业名称
 	IndexCode                      string    // 持买单量指标编码
 	DataTime                       string    // 指标时间
@@ -20,24 +23,37 @@ type BaseFromCoalmineCoastalIndex struct {
 	ModifyTime                     time.Time `description:"修改时间"`
 }
 
-//查询指标
+func (e *BaseFromCoalmineCoastalIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
+// 查询指标
 func GetBaseFromCoalmineCoastalIndex() (items []*BaseFromCoalmineCoastalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_coastal_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
-//添加数据
+// 添加数据
 func AddBaseFromCoalCoastalIndex(item *BaseFromCoalmineCoastalIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromCoalmineCoastalIndexID)
 	return
 }
 
 func UpdateBaseFromCoalCoastalIndex(item *BaseFromCoalmineCoastalIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_coalmine_coastal_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
-	_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	//_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
 	return
 }

+ 34 - 18
models/base_from_coal_firm.go

@@ -1,43 +1,59 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"gorm.io/gorm"
 	"time"
 )
 
 // BaseFromCoalmineFirmIndex 煤矿产量周度公司数据表
 type BaseFromCoalmineFirmIndex struct {
-	BaseFromCoalmineFirmIndexID int       `orm:"column(base_from_coalmine_firm_index_id);pk"`
-	IndexName                   string    // 省份/企业名称
-	IndexCode                   string    // 持买单量指标编码
-	DataTime                    string    // 指标时间
-	DealValue                   string    // 数据量
-	GroupName                   string    // 集团名
-	Source                      string    // 来源
-	Unit                        string    // 来源
-	Frequency                   string    `description:"频率"`
-	CreateTime                  time.Time `description:"插入时间"`
-	ModifyTime                  time.Time `description:"修改时间"`
+	BaseFromCoalmineFirmIndexID int `gorm:"column:base_from_coalmine_firm_index_id;primaryKey"`
+	//BaseFromCoalmineFirmIndexID int       `orm:"column(base_from_coalmine_firm_index_id);pk"`
+	IndexName  string    // 省份/企业名称
+	IndexCode  string    // 持买单量指标编码
+	DataTime   string    // 指标时间
+	DealValue  string    // 数据量
+	GroupName  string    // 集团名
+	Source     string    // 来源
+	Unit       string    // 来源
+	Frequency  string    `description:"频率"`
+	CreateTime time.Time `description:"插入时间"`
+	ModifyTime time.Time `description:"修改时间"`
+}
+
+func (e *BaseFromCoalmineFirmIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
 }
 
 // 查询指标
 func GetBaseFromCoalmineFirmIndex() (items []*BaseFromCoalmineFirmIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_firm_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 // 添加数据
 func AddBaseFromCoalFirmIndex(item *BaseFromCoalmineFirmIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromCoalmineFirmIndexID)
 	return
 }
 
 func UpdateBaseFromCoalFirmIndex(item *BaseFromCoalmineFirmIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_coalmine_firm_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
-	_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	//_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
 	return
 }

+ 36 - 20
models/base_from_coal_inland.go

@@ -1,43 +1,59 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"gorm.io/gorm"
 	"time"
 )
 
 // BaseFromCoalmineInlandIndex 沿海八省动力煤用户供耗存数据指标表
 type BaseFromCoalmineInlandIndex struct {
-	BaseFromCoalmineInlandIndexID int       `orm:"column(base_from_coalmine_inland_index_id);pk"`
-	IndexName                     string    // 省份/企业名称
-	IndexCode                     string    // 持买单量指标编码
-	DataTime                      string    // 指标时间
-	DealValue                     string    // 数据量
-	GroupName                     string    // 地区
-	Source                        string    // 来源
-	Unit                          string    // 来源
-	Frequency                     string    `description:"频率"`
-	CreateTime                    time.Time `description:"插入时间"`
-	ModifyTime                    time.Time `description:"修改时间"`
+	BaseFromCoalmineInlandIndexID int `gorm:"column:base_from_coalmine_inland_index_id;primaryKey"`
+	//BaseFromCoalmineInlandIndexID int       `orm:"column(base_from_coalmine_inland_index_id);pk"`
+	IndexName  string    // 省份/企业名称
+	IndexCode  string    // 持买单量指标编码
+	DataTime   string    // 指标时间
+	DealValue  string    // 数据量
+	GroupName  string    // 地区
+	Source     string    // 来源
+	Unit       string    // 来源
+	Frequency  string    `description:"频率"`
+	CreateTime time.Time `description:"插入时间"`
+	ModifyTime time.Time `description:"修改时间"`
 }
 
-//查询指标
+func (e *BaseFromCoalmineInlandIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
+// 查询指标
 func GetBaseFromCoalmineInlandIndex() (items []*BaseFromCoalmineInlandIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_inland_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
-//添加数据
+// 添加数据
 func AddBaseFromCoalInlandIndex(item *BaseFromCoalmineInlandIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromCoalmineInlandIndexID)
 	return
 }
 
 func UpdateBaseFromCoalInlandIndex(item *BaseFromCoalmineInlandIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_coalmine_inland_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
-	_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	//_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
 	return
 }

+ 147 - 74
models/base_from_coalmine.go

@@ -1,106 +1,182 @@
 package models
 
 import (
-	"github.com/beego/beego/v2/client/orm"
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"gorm.io/gorm"
 	"time"
 )
 
+const (
+	CoalmineJsmIndexName     = `base_from_coalmine_jsm_index`
+	CoalmineCompanyIndexName = `base_from_coalmine_company_index`
+	CoalmineInlandIndexName  = `base_from_coalmine_inland_index`
+	CoalmineFirmIndexName    = `base_from_coalmine_firm_index`
+	CoalmineCoastalIndexName = `base_from_coalmine_coastal_index`
+)
+
 type BaseFromCoalmineMapping struct {
-	BaseFromCoalmineMappingId int       `orm:"column(base_from_coalmine_mapping_id);pk"`
-	IndexName                 string    `description:"持买单量指标名称"`
-	IndexCode                 string    `description:"持买单量指标编码"`
-	CreateTime                time.Time `description:"时间"`
+	BaseFromCoalmineMappingId int `gorm:"column:base_from_coalmine_mapping_id;primaryKey"`
+	//BaseFromCoalmineMappingId int       `orm:"column(base_from_coalmine_mapping_id);pk"`
+	IndexName  string    `description:"持买单量指标名称"`
+	IndexCode  string    `description:"持买单量指标编码"`
+	CreateTime time.Time `description:"时间"`
 }
 
 type BaseFromCoalmineJsmIndex struct {
-	BaseFromCoalmineJsmIndexId int       `orm:"column(base_from_coalmine_jsm_index_id);pk"`
-	IndexName                  string    `description:"持买单量指标名称"`
-	IndexCode                  string    `description:"持买单量指标编码"`
-	Exchange                   string    `description:"样本统计类别"`
-	DealValue                  string    `description:"成交量"`
-	DataTime                   string    `description:"数据日期"`
-	Source                     string    `description:"来源"`
-	Province                   string    `description:"省份"`
-	Description                string    `description:"描述"`
-	Unit                       string    `description:"单位"`
-	Frequency                  string    `description:"频率"`
-	CreateTime                 time.Time `description:"插入时间"`
-	ModifyTime                 time.Time `description:"修改时间"`
+	BaseFromCoalmineJsmIndexId int `gorm:"column:base_from_coalmine_jsm_index_id;primaryKey"`
+	//BaseFromCoalmineJsmIndexId int       `orm:"column(base_from_coalmine_jsm_index_id);pk"`
+	IndexName   string    `description:"持买单量指标名称"`
+	IndexCode   string    `description:"持买单量指标编码"`
+	Exchange    string    `description:"样本统计类别"`
+	DealValue   string    `description:"成交量"`
+	DataTime    string    `description:"数据日期"`
+	Source      string    `description:"来源"`
+	Province    string    `description:"省份"`
+	Description string    `description:"描述"`
+	Unit        string    `description:"单位"`
+	Frequency   string    `description:"频率"`
+	CreateTime  time.Time `description:"插入时间"`
+	ModifyTime  time.Time `description:"修改时间"`
+}
+
+func (e *BaseFromCoalmineJsmIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
 }
 
 type BaseFromCoalmineCompanyIndex struct {
-	BaseFromCoalmineCompanyIndexId int       `orm:"column(base_from_coalmine_company_index_id);pk"`
-	IndexName                      string    `description:"持买单量指标名称"`
-	IndexCode                      string    `description:"持买单量指标编码"`
-	DealValue                      string    `description:"成交量"`
-	DataTime                       string    `description:"数据日期"`
-	Source                         string    `description:"来源"`
-	Province                       string    `description:"省份"`
-	City                           string    `description:"城市"`
-	GroupName                      string    `description:"集团名称"`
-	Unit                           string    `description:"单位"`
-	Frequency                      string    `description:"频率"`
-	CreateTime                     time.Time `description:"插入时间"`
-	ModifyTime                     time.Time `description:"修改时间"`
-}
-
-
-//添加指标
+	BaseFromCoalmineCompanyIndexId int `gorm:"column:base_from_coalmine_company_index_id;primaryKey"`
+	//BaseFromCoalmineCompanyIndexId int       `orm:"column(base_from_coalmine_company_index_id);pk"`
+	IndexName  string    `description:"持买单量指标名称"`
+	IndexCode  string    `description:"持买单量指标编码"`
+	DealValue  string    `description:"成交量"`
+	DataTime   string    `description:"数据日期"`
+	Source     string    `description:"来源"`
+	Province   string    `description:"省份"`
+	City       string    `description:"城市"`
+	GroupName  string    `description:"集团名称"`
+	Unit       string    `description:"单位"`
+	Frequency  string    `description:"频率"`
+	CreateTime time.Time `description:"插入时间"`
+	ModifyTime time.Time `description:"修改时间"`
+}
+
+func (e *BaseFromCoalmineCompanyIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
+// 添加指标
 func AddBaseFromCoalmineMapping(item *BaseFromCoalmineMapping) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineMapping() (items []*BaseFromCoalmineMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_mapping`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
-//查询数据
+// 查询数据
 func GetBaseFromCoalmineIndex() (items []*BaseFromCoalmineJsmIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_jsm_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
+	//_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
 
 func UpdateBaseFromCoalmineIndex(item *BaseFromCoalmineJsmIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_coalmine_jsm_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
-	_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	//_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
 	return
 }
 
-//添加数据
+// 添加数据
 func AddBaseFromCoalmineIndex(item *BaseFromCoalmineJsmIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromCoalmineJsmIndexId)
 	return
 }
 
-//添加公司指标
+// 添加公司指标
 func AddBaseFromCoalmineCompanyIndex(item *BaseFromCoalmineCompanyIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromCoalmineCompanyIndexId)
 	return
 }
 
-//查询公司指标
+// 查询公司指标
 func GetBaseFromCoalmineCompanyIndex() (items []*BaseFromCoalmineCompanyIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_coalmine_company_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 func UpdateBaseFromCoalmineCompanyIndex(item *BaseFromCoalmineCompanyIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_coalmine_company_index SET deal_value=?  WHERE index_name=?  AND  data_time = ?`
-	_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
+	//_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	return
+}
+
+func (m *BaseFromCoalmineMapping) GetMaxAndMinDateByIndexCode(indexCode, tableName string) (item *EdbInfoMaxAndMinInfo, err error) {
+	if tableName == `` {
+		return
+	}
+	//o := orm.NewOrm()
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(deal_value) AS min_value,MAX(deal_value) AS max_value FROM %s WHERE index_code=? `
+	sql = fmt.Sprintf(sql, tableName)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	if err != nil {
+		return
+	}
+
+	// 获取最新值
+	sql = ` SELECT deal_value AS latest_value FROM %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	sql = fmt.Sprintf(sql, tableName)
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+
+	return
+}
+
+func (m *BaseFromCoalmineMapping) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_coalmine_mapping SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
 	return
 }
 
@@ -108,18 +184,16 @@ type CoalMineDataReq struct {
 	SheetData []SheetData
 }
 
-
 type SheetData struct {
-	Name        string
-	Rows        []Row
-	Cols        []*Col
-	MaxRow      int
-	MaxCol      int
-	Hidden      bool
-	Selected    bool
+	Name     string
+	Rows     []Row
+	Cols     []*Col
+	MaxRow   int
+	MaxCol   int
+	Hidden   bool
+	Selected bool
 }
 
-
 type Row struct {
 	Cells        []Cell
 	Hidden       bool
@@ -129,16 +203,15 @@ type Row struct {
 }
 
 type Col struct {
-	Min             int
-	Max             int
-	Hidden          bool
-	Width           float64
-	Collapsed       bool
-	OutlineLevel    uint8
-	numFmt          string
+	Min          int
+	Max          int
+	Hidden       bool
+	Width        float64
+	Collapsed    bool
+	OutlineLevel uint8
+	numFmt       string
 }
 
-
 type Cell struct {
-	Value          string
+	Value string
 }

+ 34 - 18
models/base_from_com_trade.go

@@ -1,20 +1,21 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 // UN 联合国商品贸易数据指标
 
 // ComTradeCodeMapping 联合国商品贸易数据指标编码与分类编码的关系表
 type ComTradeCodeMapping struct {
-	Code       int       `orm:"column(code);pk"`
+	//Code       int       `orm:"column(code);pk"`
+	Code       int       `gorm:"column:code;primaryKey"`
 	IndexCode  string    `description:"联合国商品贸易编码"`
 	Type       int       `description:"1:价格;2:重量"`
 	Name       string    `description:"指标名称"`
@@ -23,19 +24,27 @@ type ComTradeCodeMapping struct {
 
 // GetComTradeIndex 根据指标code获取指标信息
 func GetComTradeIndex(indexCode string) (item *ComTradeCodeMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM com_trade_code_mapping WHERE code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
 type ComTradeData struct {
-	Value    float64 `orm:"column(value)" description:"值"`
-	DataTime string  `orm:"column(data_time)" description:"日期"`
+	Value    float64 `gorm:"column:value" description:"值"`
+	DataTime string  `gorm:"column:data_time" description:"日期"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *ComTradeData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetComTradeDataByTradeCode(tradeCode, startDate string) (items []*ComTradeData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	pars := []interface{}{tradeCode}
 	sql1 := ` SELECT * FROM com_trade_data WHERE 1=1 AND index_trade_code = ? `
 	if startDate != `` {
@@ -43,12 +52,13 @@ func GetComTradeDataByTradeCode(tradeCode, startDate string) (items []*ComTradeD
 		pars = append(pars, startDate)
 	}
 	sql := `select trade_value AS value,data_time from (` + sql1 + ` having 1 order by modify_time DESC ) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
 func GetComTradeDataByWeightCode(weightCode, startDate string) (items []*ComTradeData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	pars := []interface{}{weightCode}
 	sql1 := ` SELECT * FROM com_trade_data WHERE 1=1  AND index_net_weight_code = ? `
 	if startDate != `` {
@@ -56,24 +66,26 @@ func GetComTradeDataByWeightCode(weightCode, startDate string) (items []*ComTrad
 		pars = append(pars, startDate)
 	}
 	sql := `select net_weight_value AS value,data_time from (` + sql1 + ` having 1 order by modify_time DESC ) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
 
 func GetComTradeDataByCondition(condition string, pars []interface{}) (item []*ComTradeData, err error) {
 	sql1 := ` SELECT * FROM com_trade_data WHERE 1=1  `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql1 += condition
 	}
 	sql := `select trade_value AS value,data_time from (` + sql1 + ` having 1 order by modify_time DESC ) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
 	return
 }
 
 // AddEdbDataFromComTrade 新增钢联指标数据
 func AddEdbDataFromComTrade(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	// 获取指标关系
 	codeMapping, err := GetComTradeIndex(edbCode)
@@ -94,6 +106,7 @@ func AddEdbDataFromComTrade(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_com_trade (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := ComTradeDataList[i]
 			eDate := item.DataTime
@@ -115,7 +128,8 @@ func AddEdbDataFromComTrade(edbCode string) (err error) {
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
 			utils.FileLog.Info("addSql:" + addSql)
-			_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
+			//_, err = o.Raw(addSql).Exec()
 			if err != nil {
 				return err
 			}
@@ -129,7 +143,7 @@ func RefreshEdbDataFromComTrade(edbInfoId int, edbCode, startDate string) (err e
 	source := utils.DATA_SOURCE_COM_TRADE
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -157,7 +171,7 @@ func RefreshEdbDataFromComTrade(edbInfoId int, edbCode, startDate string) (err e
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -185,6 +199,7 @@ func RefreshEdbDataFromComTrade(edbInfoId int, edbCode, startDate string) (err e
 	}
 
 	addSql := ` INSERT INTO edb_data_com_trade(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	addMap := make(map[string]string)
 	for _, v := range ComTradeDataList {
@@ -233,7 +248,8 @@ func RefreshEdbDataFromComTrade(edbInfoId int, edbCode, startDate string) (err e
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 35 - 13
models/base_from_dl.go

@@ -1,16 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromTradeDalianIndex struct {
-	BaseFromTradeDalianIndexId int `orm:"column(base_from_trade_dalian_index_id);pk"`
+	//BaseFromTradeDalianIndexId int `orm:"column(base_from_trade_dalian_index_id);pk"`
+	BaseFromTradeDalianIndexId int `gorm:"column:base_from_trade_dalian_index_id;primaryKey"`
 	Rank                       int
 	DealShortName              string
 	DealName                   string
@@ -35,16 +37,24 @@ type BaseFromTradeDalianIndex struct {
 	DataTime                   string
 }
 
+func (m *BaseFromTradeDalianIndex) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 func GetBaseFromDalianDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeDalianIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `
 	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 type BaseFromDlDataSimple struct {
-	Id        int `orm:"column(base_from_trade_dalian_index_id);pk"`
+	Id int `gorm:"column:base_from_trade_dalian_index_id;primaryKey"`
+	//Id        int `orm:"column(base_from_trade_dalian_index_id);pk"`
 	DealCode  string
 	BuyCode   string
 	SoldCode  string
@@ -54,14 +64,22 @@ type BaseFromDlDataSimple struct {
 	SoldValue string
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromDlDataSimple) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 func GetDlDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromDlDataSimple, err error) {
 	sql := ` SELECT * FROM base_from_trade_dalian_index WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
@@ -76,14 +94,15 @@ func AddEdbDataFromDl(edbCode string) (err error) {
 		suffix = "sold"
 	}
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	dlBaseDataAll, err := GetBaseFromDalianDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 
 	for _, sv := range dlBaseDataAll {
@@ -116,7 +135,8 @@ func AddEdbDataFromDl(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -129,7 +149,7 @@ func RefreshEdbDataFromDl(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_DL
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -173,7 +193,7 @@ func RefreshEdbDataFromDl(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -202,6 +222,7 @@ func RefreshEdbDataFromDl(edbInfoId int, edbCode, startDate string) (err error)
 	}
 
 	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range glDataList {
 		var value string
@@ -256,7 +277,8 @@ func RefreshEdbDataFromDl(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 43 - 30
models/base_from_edb_mapping.go

@@ -1,16 +1,16 @@
 package models
 
 import (
-	"eta/eta_index_lib/utils"
+	"eta/eta_index_lib/global"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strings"
 	"time"
 )
 
 // BaseFromEdbMapping 同花顺高频数据
 type BaseFromEdbMapping struct {
-	Id              int       `orm:"column(id);pk"`
+	Id int `gorm:"column:id;primaryKey"`
+	//Id              int       `orm:"column(id);pk"`
 	BaseFromIndexId int       `description:"源指标ID"`
 	BaseIndexCode   string    `description:"源指标编码"`
 	EdbInfoId       int       `description:"指标ID"`
@@ -55,12 +55,13 @@ func (m *BaseFromEdbMapping) Cols() BaseFromEdbMappingCols {
 }
 
 func (m *BaseFromEdbMapping) Create() (err error) {
-	o := orm.NewOrm()
-	id, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.Id = int(id)
+	//o := orm.NewOrm()
+	//id, err := o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
+	//if err != nil {
+	//	return
+	//}
+	//m.Id = int(id)
 	return
 }
 
@@ -68,21 +69,24 @@ func (m *BaseFromEdbMapping) CreateMulti(items []*BaseFromEdbMapping) (err error
 	if len(items) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(items), items)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, cols...)
+	err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) Remove() (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	_, err = o.Raw(sql, m.Id).Exec()
+	//_, err = o.Raw(sql, m.Id).Exec()
+	err = global.DEFAULT_DB.Exec(sql, m.Id).Error
 	return
 }
 
@@ -90,9 +94,11 @@ func (m *BaseFromEdbMapping) MultiRemove(ids []int) (err error) {
 	if len(ids) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
-	_, err = o.Raw(sql, ids).Exec()
+	//o := orm.NewOrm()
+	//sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
+	//_, err = o.Raw(sql, ids).Exec()
+	err = global.DEFAULT_DB.Exec(sql, ids).Error
 	return
 }
 
@@ -100,39 +106,43 @@ func (m *BaseFromEdbMapping) RemoveByCondition(condition string, pars []interfac
 	if condition == "" {
 		return
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
-	_, err = o.Raw(sql, pars).Exec()
+	//_, err = o.Raw(sql, pars).Exec()
+	err = global.DEFAULT_DB.Exec(sql, pars...).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) GetItemById(id int) (item *BaseFromEdbMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, id).First(&item).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromEdbMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	order := ``
 	if orderRule != "" {
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).First(&item).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromEdbMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -142,12 +152,13 @@ func (m *BaseFromEdbMapping) GetItemsByCondition(condition string, pars []interf
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 func (m *BaseFromEdbMapping) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromEdbMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -157,6 +168,8 @@ func (m *BaseFromEdbMapping) GetPageItemsByCondition(condition string, pars []in
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }

+ 23 - 11
models/base_from_eia_steo.go

@@ -1,36 +1,44 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 //钢联
 
 type EiaSteoData struct {
-	InputValue float64 `orm:"column(value)" description:"值"`
-	DataTime   string  `orm:"column(data_time)" description:"日期"`
+	InputValue float64 `gorm:"column:value" description:"值"`
+	DataTime   string  `gorm:"column:data_time" description:"日期"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *EiaSteoData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetEiaSteoDataByCondition(condition string, pars []interface{}) (item []*EiaSteoData, err error) {
 	sql1 := ` SELECT * FROM base_from_eia_steo_data WHERE 1=1  `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql1 += condition
 	}
 	sql := `select * from (` + sql1 + ` having 1 order by modify_time DESC ) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // AddEdbDataFromEiaSteo 新增钢联指标数据
 func AddEdbDataFromEiaSteo(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -51,6 +59,7 @@ func AddEdbDataFromEiaSteo(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_eia_steo (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := EiaSteoDataList[i]
 			eDate := item.DataTime
@@ -72,7 +81,8 @@ func AddEdbDataFromEiaSteo(edbCode string) (err error) {
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
 			utils.FileLog.Info("addSql:" + addSql)
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}
@@ -86,7 +96,7 @@ func RefreshEdbDataFromEiaSteo(edbInfoId int, edbCode, startDate string) (err er
 	source := utils.DATA_SOURCE_EIA_STEO
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -116,7 +126,7 @@ func RefreshEdbDataFromEiaSteo(edbInfoId int, edbCode, startDate string) (err er
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -144,6 +154,7 @@ func RefreshEdbDataFromEiaSteo(edbInfoId int, edbCode, startDate string) (err er
 	}
 
 	addSql := ` INSERT INTO edb_data_eia_steo(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	addMap := make(map[string]string)
 	for _, v := range EiaSteoDataList {
@@ -192,7 +203,8 @@ func RefreshEdbDataFromEiaSteo(edbInfoId int, edbCode, startDate string) (err er
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 204 - 59
models/base_from_fenwei.go

@@ -1,9 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -13,7 +14,8 @@ import (
 type BaseFromFenwei struct{}
 
 type BaseFromFenweiData struct {
-	FenweiDataId  int `orm:"column(fenwei_data_id);pk"`
+	FenweiDataId int `gorm:"column:fenwei_data_id;primaryKey"`
+	//enweiDataId  int `orm:"column(fenwei_data_id);pk"`
 	FenweiIndexId int
 	IndexCode     string
 	DataTime      string
@@ -27,19 +29,26 @@ func (m *BaseFromFenweiData) TableName() string {
 	return "base_from_fenwei_data"
 }
 
+func (e *BaseFromFenweiData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 func GetBaseFromFenweiDataByCondition(condition string, pars []interface{}) (list []*BaseFromFenweiData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_fenwei_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 // Add 添加
 func (obj BaseFromFenwei) Add(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -48,11 +57,12 @@ func (obj BaseFromFenwei) Add(edbCode string) (err error) {
 		pars = append(pars, edbCode)
 	}
 	fenweiBaseDataAll, err := GetBaseFromFenweiDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_fenwei(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 	for _, sv := range fenweiBaseDataAll {
 		eDate := sv.DataTime
@@ -71,7 +81,8 @@ func (obj BaseFromFenwei) Add(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -82,7 +93,7 @@ func (obj BaseFromFenwei) Add(edbCode string) (err error) {
 // Refresh 刷新汾渭数据指标数据
 func (obj BaseFromFenwei) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
 	source := obj.GetSource()
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -112,7 +123,7 @@ func (obj BaseFromFenwei) Refresh(edbInfoId int, edbCode, startDate string) (err
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -139,6 +150,7 @@ func (obj BaseFromFenwei) Refresh(edbInfoId int, edbCode, startDate string) (err
 		existMap[v.DataTime] = v
 	}
 	addSql := ` INSERT INTO edb_data_fenwei(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range fenweiDataList {
 		item := v
@@ -180,7 +192,8 @@ func (obj BaseFromFenwei) Refresh(edbInfoId int, edbCode, startDate string) (err
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
 			return
@@ -200,18 +213,26 @@ func (obj BaseFromFenwei) GetSourceName() string {
 }
 
 type BaseFromFenweiIndex struct {
-	FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
-	IndexCode     string
-	IndexName     string
-	Frequency     string
-	Unit          string
-	ClassifyId    int
-	StartDate     string
-	EndDate       string
-	Sort          int
-	TerminalCode  string
-	CreateTime    time.Time
-	ModifyTime    time.Time
+	FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
+	//FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
+	IndexCode    string
+	IndexName    string
+	Frequency    string
+	Unit         string
+	ClassifyId   int
+	StartDate    string
+	EndDate      string
+	Sort         int
+	TerminalCode string
+	CreateTime   time.Time
+	ModifyTime   time.Time
+}
+
+func (e *BaseFromFenweiIndex) AfterFind(db *gorm.DB) (err error) {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+
+	return
 }
 
 func (m *BaseFromFenweiIndex) TableName() string {
@@ -219,34 +240,42 @@ func (m *BaseFromFenweiIndex) TableName() string {
 }
 
 func (m *BaseFromFenweiIndex) Add() (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(m)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(m.FenweiIndexId)
 	return
 }
 
 func (m *BaseFromFenweiIndex) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, updateCols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, updateCols...)
+	err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
 
 	return
 }
 
 func (m *BaseFromFenweiIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
-	sql := ` UPDATE base_from_fenwei_index SET start_date=?,end_date=?,modify_time=NOW() WHERE index_code=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_fenwei_index SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }
 
 func (m *BaseFromFenweiIndex) GetByIndexCode(indexCode string) (item *BaseFromFenweiIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
 func (m *BaseFromFenweiIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -256,12 +285,14 @@ func (m *BaseFromFenweiIndex) GetItemsByCondition(condition string, pars []inter
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM base_from_fenwei_index WHERE 1=1 %s %s`, fields, condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 type BaseFromFenweiIndexList struct {
-	FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
+	//FenweiIndexId int64 `orm:"column(fenwei_index_id);pk"`
+	FenweiIndexId int64 `gorm:"column:fenwei_index_id;primaryKey"`
 	IndexCode     string
 	IndexName     string
 	Frequency     string
@@ -275,15 +306,17 @@ type BaseFromFenweiIndexList struct {
 }
 
 func (y *BaseFromFenweiData) GetByIndexCode(indexCode string) (list []*BaseFromFenweiData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_fenwei_data WHERE index_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 func (y *BaseFromFenweiData) AddMulti(item []*BaseFromFenweiData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(1, item)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(1, item)
+	err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
 	return
 }
 
@@ -305,16 +338,44 @@ type HandleFenweiExcelDataReq struct {
 	TerminalCode string `description:"编码"`
 }
 
+type FenWeiNetIndexInfo struct {
+	FenweiIndexId int64  `gorm:"column:fenwei_index_id;primaryKey"`
+	IndexName     string `description:"指标名称"`
+	//IndexCode    string  `description:"指标编码"`
+	Unit         string      `description:"单位"`
+	Frequency    string      `description:"频度"`
+	TerminalCode string      `description:"编码"`
+	ClassifyName string      `description:"分类名称"`
+	DataTime     string      `description:"数据时间"`
+	Value        interface{} `description:"数据值"`
+}
+
+type HandleFenWeiNetDataReq struct {
+	List         []*FenWeiNetIndexInfo
+	TerminalCode string `description:"编码"`
+}
+
 func (y *BaseFromFenweiData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_fenwei_data WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	// 获取最新值
+	var lastVal float64
+	sql = ` SELECT value AS latest_value FROM base_from_fenwei_data WHERE index_code = ? ORDER BY data_time DESC LIMIT 1 `
+	//err = o.Raw(sql, indexCode).QueryRow(&lastVal)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&lastVal).Error
+	if err != nil {
+		return
+	}
+	item.LatestValue = lastVal
 	return
 }
 
 // BaseFromFenweiClassify 汾渭数据分类表
 type BaseFromFenweiClassify struct {
-	ClassifyId      int       `orm:"column(classify_id);pk"`
+	//ClassifyId      int       `orm:"column(classify_id);pk"`
+	ClassifyId      int       `gorm:"column:classify_id;primaryKey"`
 	ClassifyName    string    `description:"分类名称"`
 	ParentId        int       `description:"父级id"`
 	SysUserId       int       `description:"创建人id"`
@@ -326,27 +387,37 @@ type BaseFromFenweiClassify struct {
 }
 
 func (y *BaseFromFenweiClassify) Add() (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(y)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(y)
+	err = global.DEFAULT_DB.Create(&y).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(y.ClassifyId)
 	return
 }
 
 func (y *BaseFromFenweiClassify) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(y, updateCols...)
-
+	//o := orm.NewOrm()
+	//_, err = o.Update(y, updateCols...)
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
 	return
 }
 
-func (y *BaseFromFenweiClassify) GetByClassifyName(classifyName string) (item *BaseFromFenweiClassify, err error) {
-	o := orm.NewOrm()
+func (y *BaseFromFenweiClassify) GetByClassifyName(classifyName string) (item []*BaseFromFenweiClassify, err error) {
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_fenwei_classify WHERE classify_name=? `
-	err = o.Raw(sql, classifyName).QueryRow(&item)
+	//_, err = o.Raw(sql, classifyName).QueryRows(&item)
+
+	err = global.DEFAULT_DB.Raw(sql, classifyName).Find(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
 	return
 }
 
 func (y *BaseFromFenweiClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromFenweiClassify, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -356,7 +427,8 @@ func (y *BaseFromFenweiClassify) GetItemsByCondition(condition string, pars []in
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM base_from_fenwei_classify WHERE 1=1 %s %s`, fields, condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -393,23 +465,96 @@ func MultiUpdateBaseFromFenweiDataValue(items []*BaseFromFenweiData) (err error)
 		return
 	}
 
-	o := orm.NewOrm()
-	sql := `UPDATE base_from_fenwei_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
-	p, err := o.Raw(sql).Prepare()
-	if err != nil {
-		return
-	}
+	//o := orm.NewOrm()
+	to := global.DEFAULT_DB.Begin()
+
 	defer func() {
-		_ = p.Close()
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
 	}()
+	sql := `UPDATE base_from_fenwei_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
 	for _, v := range items {
 		if v.IndexCode == "" || v.DataTime == "" {
 			continue
 		}
-		_, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
+		err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
 		if err != nil {
 			return
 		}
 	}
+
 	return
 }
+
+// GetBaseFromFenWeiIndexByIndexName 根据指标名称查询指标
+func GetBaseFromFenWeiIndexByIndexName(indexName string) (item *BaseFromFenweiIndex, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_fenwei_index WHERE index_name=? `
+	//err = o.Raw(sql, indexName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexName).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}
+
+// GetBaseFromFenweiDataByIndexCodeAndDataTime 根据指标编码和dataTime查询指标数据
+func GetBaseFromFenweiDataByIndexCodeAndDataTime(indexCode, dataTime string) (item *BaseFromFenweiData, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_fenwei_data WHERE index_code=? AND data_time=? `
+	//err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+
+	return
+}
+
+// BatchAddBaseFromFenWeiData 批量插入指标数据
+func BatchAddBaseFromFenWeiData(items []*BaseFromFenweiData) (err error) {
+	if len(items) == 0 {
+		return
+	}
+
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(1, items)
+	err = global.DEFAULT_DB.CreateInBatches(items, 1).Error
+	return
+}
+
+// AddBaseFromFenWeiClassify 新增汾渭分类
+func AddBaseFromFenWeiClassify(item *BaseFromFenweiClassify) (classifyId int64, err error) {
+	//o := orm.NewOrm()
+	//classifyId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	classifyId = int64(item.ClassifyId)
+	return
+}
+
+// GetBaseFromFenWeiIndexByIndexCode 跟据指标编码查询指标信息
+func GetBaseFromFenWeiIndexByIndexCode(indexCode string) (item *BaseFromFenweiIndex, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+
+	return
+}
+
+// UpdateBaseFromFenweiData 更新汾渭数据
+func UpdateBaseFromFenweiData(data *BaseFromFenweiData) error {
+	//o := orm.NewOrm()
+	//_, err := o.Update(data)
+	err := global.DEFAULT_DB.Save(&data).Error
+	return err
+}

+ 9 - 6
models/base_from_fubao.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -28,9 +28,10 @@ type FuBaoData struct {
 
 // 新增富宝指标数据
 func AddEdbDataFromFubao(edbCode string, fubaoData *FuBaoData) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_fubao(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	for _, dataItem := range fubaoData.ReturnValue.Data {
 		dataTime, err := time.ParseInLocation(utils.FormatDate, dataItem.Datadate, time.Local)
 		if err != nil {
@@ -47,7 +48,8 @@ func AddEdbDataFromFubao(edbCode string, fubaoData *FuBaoData) (err error) {
 	}
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshAllEdbDataByFubao add Err", err.Error())
 			return
@@ -61,7 +63,7 @@ func RefreshEdbDataFromFubao(edbInfoId int, edbCode, startDate string, fubaoData
 	source := utils.DATA_SOURCE_FUBAO
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	// 真实数据的最大日期  , 插入规则配置的日期
 	var realDataMaxDate, edbDataInsertConfigDate time.Time
@@ -69,7 +71,7 @@ func RefreshEdbDataFromFubao(edbInfoId int, edbCode, startDate string, fubaoData
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -149,7 +151,8 @@ func RefreshEdbDataFromFubao(edbInfoId int, edbCode, startDate string, fubaoData
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromFubao Err", err.Error())
 			return

+ 33 - 16
models/base_from_gie.go

@@ -1,16 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromTradeEicIndex struct {
-	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	//BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	BaseFromEicIndexId     int `gorm:"column:base_from_eic_index_id;primaryKey"`
 	Country                string
 	Type                   string
 	EicCode                string
@@ -40,7 +42,8 @@ type BaseFromTradeEicIndex struct {
 }
 
 type BaseFromTradeEicIndexV2 struct {
-	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	//BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	BaseFromEicIndexId     int `gorm:"column:base_from_eic_index_id;primaryKey"`
 	Type                   string
 	EicCode                string
 	Name                   string
@@ -72,8 +75,15 @@ type BaseFromTradeEicIndexV2 struct {
 	ModifyTime             time.Time
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromTradeEicIndexV2) AfterFind(db *gorm.DB) (err error) {
+	m.GasDayStart = utils.GormDateStrToDateStr(m.GasDayStart)
+
+	return
+}
+
 func GetBaseFromEicDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeEicIndexV2, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	var name string
 	if suffix == "" {
 		name = "eic_code"
@@ -100,31 +110,34 @@ func GetBaseFromEicDataAllByIndexCode(indexCode, suffix string) (list []*BaseFro
 	}
 	sql := `SELECT * FROM base_from_trade_eic_index_v2 WHERE %s=? `
 	sql = fmt.Sprintf(sql, name)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 func GetGieDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromTradeEicIndex, err error) {
 	sql := ` SELECT * FROM base_from_trade_eic_index WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY gas_day_started_on DESC `
 	fmt.Println(sql, pars)
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 func GetGieDataByTradeCodeV2(condition string, pars []interface{}) (item []*BaseFromTradeEicIndexV2, err error) {
 	sql := ` SELECT * FROM base_from_trade_eic_index_v2 WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY gas_day_start DESC `
 	fmt.Println(sql, pars)
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
@@ -155,16 +168,17 @@ func AddEdbDataFromGie(edbCode string) (err error) {
 	} else {
 		suffix = ""
 	}
-
-	o := orm.NewOrm()
+	//
+	//o := orm.NewOrm()
 	eicBaseDataAll, err := GetBaseFromEicDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		fmt.Println("GetBaseFromEicDataAllByIndexCode err:", err)
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 
 	for _, sv := range eicBaseDataAll {
@@ -225,7 +239,8 @@ func AddEdbDataFromGie(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("addSql err:", err)
 			return err
@@ -239,7 +254,7 @@ func RefreshEdbDataFromGie(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_GIE
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -294,7 +309,7 @@ func RefreshEdbDataFromGie(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -323,6 +338,7 @@ func RefreshEdbDataFromGie(edbInfoId int, edbCode, startDate string) (err error)
 	}
 
 	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	dataMap := make(map[string]interface{})
 	for _, v := range eicDataList {
@@ -393,7 +409,8 @@ func RefreshEdbDataFromGie(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 26 - 12
models/base_from_google_travel.go

@@ -1,16 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromChangesVisitorsCovid struct {
-	Id                  int    `orm:"column(id);pk"`
+	//Id                  int    `orm:"column(id);pk"`
+	Id                  int    `gorm:"column:id;primaryKey"`
 	Entity              string `description:"国家"`
 	Code                string `description:"国家编码"`
 	EdbCode             string `description:"指标ID"`
@@ -26,35 +28,45 @@ type BaseFromChangesVisitorsCovid struct {
 	ModifyTime          string `description:"修改时间"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromChangesVisitorsCovid) AfterFind(db *gorm.DB) (err error) {
+	m.Day = utils.GormDateStrToDateStr(m.Day)
+
+	return
+}
+
 func GetBaseFromChangesVisitorsCovidDataAllByIndexCode(indexCode string) (list []*BaseFromChangesVisitorsCovid, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_changes_visitors_covid WHERE edb_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 func GetBaseFromChangesVisitorsCovidDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromChangesVisitorsCovid, err error) {
 	sql := ` SELECT * FROM base_from_changes_visitors_covid WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY day DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // 新增谷歌出行指标数据
 func AddEdbDataGoogleTravel(edbCode string) (err error) {
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	dataAll, err := GetBaseFromChangesVisitorsCovidDataAllByIndexCode(edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_google_travel(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 
 	for _, sv := range dataAll {
 		eDate := sv.Day
@@ -71,7 +83,8 @@ func AddEdbDataGoogleTravel(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -84,7 +97,7 @@ func RefreshEdbDataGoogleTravel(edbInfoId int, edbCode, startDate string) (err e
 	source := utils.DATA_SOURCE_GOOGLE_TRAVEL
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -114,7 +127,7 @@ func RefreshEdbDataGoogleTravel(edbInfoId int, edbCode, startDate string) (err e
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -190,7 +203,8 @@ func RefreshEdbDataGoogleTravel(edbInfoId int, edbCode, startDate string) (err e
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 401 - 0
models/base_from_gpr_risk.go

@@ -0,0 +1,401 @@
+package models
+
+import (
+	"bytes"
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"gorm.io/gorm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// BaseFromGprRisk 美国农业部
+type BaseFromGprRisk struct{}
+
+type BaseFromGprRiskData struct {
+	//BaseFromGprRiskDataId  int `orm:"column(base_from_gpr_risk_data_id);pk"`
+	BaseFromGprRiskDataId  int `gorm:"column:base_from_gpr_risk_data_id;primaryKey"`
+	BaseFromGprRiskIndexId int
+	IndexCode              string
+	DataTime               string
+	Value                  string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	DataTimestamp          int64
+}
+
+func (e *BaseFromGprRiskData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
+func GetBaseFromGprRiskDataByCondition(condition string, pars []interface{}) (list []*BaseFromGprRiskData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_gpr_risk_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
+	return
+}
+
+// Add 添加
+func (obj BaseFromGprRisk) Add(edbCode string) (err error) {
+	//o := orm.NewOrm()
+
+	var condition string
+	var pars []interface{}
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+	gprRiskBaseDataAll, err := GetBaseFromGprRiskDataByCondition(condition, pars)
+	if err != nil && !utils.IsErrNoRow(err) {
+		return
+	}
+	var isAdd bool
+	//fmt.Println("开始时间", time.Now())
+	addSql := ` INSERT INTO edb_data_gpr_risk(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	length := len(gprRiskBaseDataAll)
+	existMap := make(map[string]struct{}, length)
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	var buffer bytes.Buffer
+	buffer.WriteString(addSql)
+	for i := 0; i < length; i++ {
+		sv := gprRiskBaseDataAll[i]
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			return err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			sqlTmp := GetAddSqlV2("0", edbCode, eDate, timeStr, sv.Value, nowStr)
+			buffer.WriteString(sqlTmp)
+			isAdd = true
+		}
+		existMap[eDate] = struct{}{}
+	}
+	//fmt.Println("结束时间", time.Now())
+	if isAdd {
+		addSql = buffer.String()
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// Refresh 刷新涌益咨询指标数据
+func (obj BaseFromGprRisk) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
+	source := obj.GetSource()
+	//o := orm.NewOrm()
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	GprRiskDataList, err := GetBaseFromGprRiskDataByCondition(condition, pars)
+	if err != nil {
+		return
+	}
+
+	// 真实数据的最大日期  , 插入规则配置的日期
+	var realDataMaxDate, edbDataInsertConfigDate time.Time
+	var edbDataInsertConfig *EdbDataInsertConfig
+	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
+	{
+		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			return
+		}
+		if edbDataInsertConfig != nil {
+			edbDataInsertConfigDate = edbDataInsertConfig.Date
+		}
+	}
+
+	var existCondition string
+	var existPars []interface{}
+
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	if startDate != "" {
+		existCondition += " AND data_time>=? "
+		existPars = append(existPars, startDate)
+	}
+
+	existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+	addSql := ` INSERT INTO edb_data_gpr_risk(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	for _, v := range GprRiskDataList {
+		item := v
+		eDate := item.DataTime
+		dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+		if err != nil {
+			return err
+		}
+		if findItem, ok := existMap[v.DataTime]; !ok {
+			sValue := item.Value
+
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+
+			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+			isAdd = true
+		} else {
+			if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
+				err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+
+		// 下面代码主要目的是处理掉手动插入的数据判断
+		{
+			if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
+				realDataMaxDate = dataTime
+			}
+			if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
+				isFindConfigDateRealData = true
+			}
+		}
+	}
+
+	// 处理手工数据补充的配置
+	HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
+			return
+		}
+	}
+	return
+}
+
+// GetSource 获取来源编码id
+func (obj BaseFromGprRisk) GetSource() int {
+	return utils.DATA_SOURCE_GPR_RISK
+}
+
+// GetSourceName 获取来源名称
+func (obj BaseFromGprRisk) GetSourceName() string {
+	return utils.DATA_SOURCE_NAME_GPR_RISK
+}
+
+type BaseFromGprRiskIndex struct {
+	//BaseFromGprRiskIndexId int64 `orm:"column(base_from_gpr_risk_index_id);pk"`
+	BaseFromGprRiskIndexId int64 `gorm:"column:base_from_gpr_risk_index_id;primaryKey"`
+	IndexCode              string
+	IndexName              string
+	Frequency              string
+	Unit                   string
+	StartDate              string
+	EndDate                string
+	ClassifyId             int64
+	Sort                   int
+	BaseFileName           string
+	RenameFileName         string
+	TerminalCode           string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+}
+
+func (e *BaseFromGprRiskIndex) AfterFind(db *gorm.DB) (err error) {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+
+	return
+}
+
+type BaseFromGprRiskIndexList struct {
+	//BaseFromGprRiskIndexId int64 `orm:"column(base_from_gpr_risk_index_id);pk"`
+	BaseFromGprRiskIndexId int64 `gorm:"column:base_from_gpr_risk_index_id;primaryKey"`
+	IndexCode              string
+	IndexName              string
+	Frequency              string
+	Unit                   string
+	Sort                   int
+	ClassifyId             int64
+	StartDate              string
+	EndDate                string
+	TerminalCode           string
+	CreateTime             string
+	ModifyTime             string
+}
+
+func (y *BaseFromGprRiskData) GetByIndexCode(indexCode string) (list []*BaseFromGprRiskData, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_gpr_risk_data WHERE index_code=? `
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
+	return
+}
+
+func (y *BaseFromGprRiskData) AddMulti(item []*BaseFromGprRiskData) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(1, item)
+	err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
+	return
+}
+
+// Update 修改
+func (y *BaseFromGprRiskData) Update(updateCols []string) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.Update(y, updateCols...)
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
+	return
+}
+
+// HandleGprRiskExcelData 涌益咨询的excel数据
+type HandleGprRiskExcelData struct {
+	ClassifyName       string `description:"指标目录"`
+	ParentClassifyName string `description:"父级指标目录"`
+	ClassifySort       int    `description:"指标目录排序号"`
+	IndexName          string `description:"指标名称"`
+	IndexCode          string `description:"指标编码"`
+	Unit               string `description:"单位"`
+	Sort               int    `description:"排序号"`
+	Frequency          string `description:"频度"`
+	ExcelDataMap       map[string]string
+}
+
+type HandleGprRiskExcelDataReq struct {
+	List         []*HandleGprRiskExcelData
+	TerminalCode string `description:"编码"`
+}
+
+func (y *BaseFromGprRiskData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_gpr_risk_data WHERE index_code=? `
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	sql = ` SELECT value AS latest_value FROM %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	sql = fmt.Sprintf(sql, "base_from_gpr_risk_data")
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	return
+}
+
+func (y *BaseFromGprRiskIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_gpr_risk_index SET start_date=?,end_date=?, end_value=?, modify_time=NOW() WHERE index_code=? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
+	return
+}
+
+func (y *BaseFromGprRiskIndex) GetByIndexCode(indexCode string) (item *BaseFromGprRiskIndex, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_gpr_risk_index WHERE index_code=? `
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	return
+}
+
+func (y *BaseFromGprRiskIndex) Add() (lastId int64, err error) {
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(y)
+	err = global.DEFAULT_DB.Create(&y).Error
+	if err != nil {
+		return
+	}
+	lastId = y.BaseFromGprRiskIndexId
+	return
+}
+
+// Update 修改
+func (y *BaseFromGprRiskIndex) Update(updateCols []string) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.Update(y, updateCols...)
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
+	return
+}
+
+// BaseFromGprRiskClassify GprRisk原始数据分类表
+type BaseFromGprRiskClassify struct {
+	//ClassifyId      int64     `orm:"column(classify_id);pk"`
+	ClassifyId      int64     `gorm:"column:classify_id;primaryKey"`
+	ClassifyName    string    `description:"分类名称"`
+	ClassifyNameEn  string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
+}
+
+func (y *BaseFromGprRiskClassify) Add() (lastId int64, err error) {
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(y)
+	err = global.DEFAULT_DB.Create(&y).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(y.ClassifyId)
+	return
+}
+
+// Update 修改
+func (y *BaseFromGprRiskClassify) Update(updateCols []string) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.Update(y, updateCols...)
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
+	return
+}
+
+func (y *BaseFromGprRiskClassify) GetByClassifyName(classifyName string) (item *BaseFromGprRiskClassify, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_gpr_risk_classify WHERE classify_name=? `
+	//err = o.Raw(sql, classifyName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
+	return
+}
+
+func (y *BaseFromGprRiskClassify) GetParentClassify() (items []*BaseFromGprRiskClassify, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_gpr_risk_classify WHERE parent_id=0 `
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
+	return
+}

+ 28 - 13
models/base_from_gz.go

@@ -1,16 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromTradeGuangzhouIndex struct {
-	BaseFromTradeGuangzhouIndexId    int       `orm:"column(base_from_trade_guangzhou_index_id);pk"`
+	BaseFromTradeGuangzhouIndexId int `gorm:"column:base_from_trade_guangzhou_index_id;primaryKey"`
+	//BaseFromTradeGuangzhouIndexId    int       `orm:"column(base_from_trade_guangzhou_index_id);pk"`
 	BaseFromTradeGuangzhouClassifyId int       `description:"分类id"`
 	IndexCode                        string    `description:"指标编码"`
 	IndexName                        string    `description:"指标名称"`
@@ -23,7 +25,8 @@ type BaseFromTradeGuangzhouIndex struct {
 }
 
 type BaseFromTradeGuangzhouData struct {
-	BaseFromTradeGuangzhouDataId  int       `orm:"column(base_from_trade_guangzhou_data_id);pk"`
+	BaseFromTradeGuangzhouDataId int `gorm:"column:base_from_trade_guangzhou_data_id;primaryKey"`
+	//BaseFromTradeGuangzhouDataId  int       `orm:"column(base_from_trade_guangzhou_data_id);pk"`
 	BaseFromTradeGuangzhouIndexId int       `description:"指标id"`
 	IndexCode                     string    `description:"指标编码"`
 	DataTime                      string    `description:"数据日期"`
@@ -33,35 +36,45 @@ type BaseFromTradeGuangzhouData struct {
 	ModifyTime                    time.Time `description:"修改日期"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromTradeGuangzhouData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 func GetBaseFromGuangzhouDataByIndexCode(indexCode string) (items []*BaseFromTradeGuangzhouData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_guangzhou_data WHERE index_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
 	return
 }
 
 func GetBaseFromGuangzhouDataDataByCondition(condition string, pars []interface{}) (item []*BaseFromTradeGuangzhouData, err error) {
 	sql := ` SELECT * FROM base_from_trade_guangzhou_data WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // 新增广期所指标数据
 func AddEdbDataFromGz(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	dataAll, err := GetBaseFromGuangzhouDataByIndexCode(edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_gz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 
 	for _, sv := range dataAll {
@@ -81,7 +94,8 @@ func AddEdbDataFromGz(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -94,7 +108,7 @@ func RefreshEdbDataFromGz(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_GFEX
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -124,7 +138,7 @@ func RefreshEdbDataFromGz(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -199,7 +213,8 @@ func RefreshEdbDataFromGz(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 298 - 0
models/base_from_hisugar.go

@@ -0,0 +1,298 @@
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"gorm.io/gorm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type BaseFromHisugarIndex struct {
+	BaseFromHisugarIndexId int       // 主键ID
+	IndexCode              string    // 指标编码
+	IndexName              string    // 指标名称
+	ClassifyId             uint      // 分类ID
+	Unit                   string    // 单位
+	Frequency              string    // 频度
+	Describe               string    // 指标描述
+	Sort                   int       // 排序
+	CreateTime             time.Time // 创建时间
+	ModifyTime             time.Time // 修改时间
+}
+
+type BaseFromHisugarData struct {
+	BaseFromHisugarDataId  int    // 数据表ID
+	BaseFromHisugarIndexId int    // 指标ID
+	IndexCode              string // 指标编码
+	DataTime               string
+	Value                  string
+	CreateTime             time.Time // 创建时间
+	ModifyTime             time.Time // 修改时间
+}
+
+func (e *BaseFromHisugarData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
+// 添加数据
+func AddBaseFromHisugarIndexMuti(items []*BaseFromHisugarIndex) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(500, items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
+	return
+}
+func AddBaseFromHisugarIndex(item *BaseFromHisugarIndex) (lastId int64, err error) {
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromHisugarIndexId)
+	return
+}
+
+func AddBaseFromHisugarData(item *BaseFromHisugarData) (lastId int64, err error) {
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromHisugarDataId)
+	return
+}
+
+func AddEdbDataFromHisugar(edbCode string) (err error) {
+	//o := orm.NewOrm()
+
+	hisugarBaseDataAll, err := GetHisugarDataByCode(edbCode)
+	if err != nil && !utils.IsErrNoRow(err) {
+		return
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_hisugar(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	existMap := make(map[string]string)
+	for _, sv := range hisugarBaseDataAll {
+		eDate := sv.DataTime
+		var timeStr string
+		var dataTime time.Time
+		var sDataTime string
+		var timestamp int64
+
+		sDataTime = eDate
+		dataTime, err = time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return err
+		}
+		timestamp = dataTime.UnixNano() / 1e6
+		timeStr = fmt.Sprintf("%d", timestamp)
+
+		value := strings.Replace(sv.Value, "%", "", -1)
+		if _, ok := existMap[sDataTime]; !ok {
+			addSql += GetAddSql("0", edbCode, sDataTime, timeStr, value)
+			fmt.Println("edbCode:", edbCode)
+			fmt.Println("sDataTime:", sDataTime)
+			fmt.Println("timeStr:", timeStr)
+			fmt.Println("value:", value)
+			isAdd = true
+		}
+		existMap[eDate] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetHisugarDataByCode
+func GetHisugarDataByCode(indexCode string) (items []*BaseFromHisugarData, err error) {
+	//o := orm.NewOrm()
+	sql := "SELECT * FROM base_from_hisugar_data WHERE index_code=? "
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
+	return
+}
+
+// RefreshEdbDataFromHisugar 刷新隆众资讯
+func RefreshEdbDataFromHisugar(edbInfoId int, edbCode, startDate string) (err error) {
+	source := utils.DATA_SOURCE_OILCHEM
+	subSource := utils.DATA_SUB_SOURCE_EDB
+
+	//o := orm.NewOrm()
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	hisugarDataList, err := GetBaseFromHisugarDataByCondition(condition, pars)
+	if err != nil {
+		return
+	}
+
+	// 真实数据的最大日期  , 插入规则配置的日期
+	var realDataMaxDate, edbDataInsertConfigDate time.Time
+	var edbDataInsertConfig *EdbDataInsertConfig
+	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
+	{
+		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			return
+		}
+		if edbDataInsertConfig != nil {
+			edbDataInsertConfigDate = edbDataInsertConfig.Date
+		}
+	}
+
+	var existCondition string
+	var existPars []interface{}
+
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	if startDate != "" {
+		existCondition += " AND data_time>=? "
+		existPars = append(existPars, startDate)
+	}
+
+	existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+	addSql := ` INSERT INTO edb_data_hisugar(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	for _, v := range hisugarDataList {
+		item := v
+
+		eDate := item.DataTime
+		dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+		if err != nil {
+			return err
+		}
+		if findItem, ok := existMap[v.DataTime]; !ok {
+			sValue := item.Value
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+
+			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+			isAdd = true
+		} else {
+			if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
+				err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, item.Value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+
+		// 下面代码主要目的是处理掉手动插入的数据判断
+		{
+			if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
+				realDataMaxDate = dataTime
+			}
+			if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
+				isFindConfigDateRealData = true
+			}
+		}
+	}
+
+	// 处理手工数据补充的配置
+	HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			fmt.Println("RefreshEdbDataFromSci add Err", err.Error())
+			return
+		}
+	}
+	return
+}
+
+func GetBaseFromHisugarDataByCondition(condition string, pars []interface{}) (list []*BaseFromHisugarData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_hisugar_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
+	return
+}
+
+type HandleHisugarEdbDataReq struct {
+	List []*BaseFromHisugarIndexReq
+}
+
+func GetBaseFromHisugarIndex() (list []*BaseFromHisugarIndex, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_hisugar_index group by index_name `
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql).Find(&list).Error
+	return
+}
+
+func GetBaseFromHisugarData(indexCode, dataTime string) (item *BaseFromHisugarData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_hisugar_data where index_code=? And data_time = ? `
+	//err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
+	return
+}
+
+// UpdateBaseFromSci99Data
+func UpdateBaseFromHisugarData(value, indexCode, dataTime string) (err error) {
+	//o := orm.NewOrm()
+	sql := `UPDATE base_from_sci99_data SET value=?,modify_time=NOW() WHERE index_code = ? AND data_time = ? `
+	//_, err = o.Raw(sql, value, indexCode, dataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, value, indexCode, dataTime).Error
+	return
+}
+
+type BaseFromHisugarIndexReq struct {
+	BaseFromHisugarIndexId int       // 主键ID
+	IndexCode              string    // 指标编码
+	IndexName              string    // 指标名称
+	ClassifyId             uint      // 分类ID
+	Unit                   string    // 单位
+	Frequency              string    // 频度
+	Describe               string    // 指标描述
+	DataTime               string    // 数据日期
+	Sort                   int       // 排序
+	CreateTime             time.Time // 创建时间
+	ModifyTime             time.Time // 修改时间
+	IndexNameStr           string    // 指标名称字符串
+	MarketName             string    // 市场名称
+	Value                  string    // 值
+}

+ 35 - 19
models/base_from_icpi.go

@@ -1,28 +1,32 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromIcpiIndex struct {
-	BaseFromIcpiIndexId    int       `orm:"column(base_from_icpi_index_id);pk"`
+	BaseFromIcpiIndexId int `gorm:"column:base_from_icpi_index_id;primaryKey"`
+	//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:"结束日期"`
+	LatestValue            float64   `description:"最新值"`
 	CreateTime             time.Time `description:"创建时间"`
 	ModifyTime             time.Time `description:"修改时间"`
 }
 
 type BaseFromIcpiData struct {
-	BaseFromIcpiDataId  int       `orm:"column(base_from_icpi_data_id);pk"`
+	BaseFromIcpiDataId int `gorm:"column:base_from_icpi_data_id;primaryKey"`
+	//BaseFromIcpiDataId  int       `orm:"column(base_from_icpi_data_id);pk"`
 	BaseFromIcpiIndexId int       `description:"指标id"`
 	IndexCode           string    `description:"指标编码"`
 	DataTime            string    `description:"日期"`
@@ -31,38 +35,48 @@ type BaseFromIcpiData struct {
 	ModifyTime          time.Time `description:"修改时间"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromIcpiData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 type BaseFromIcpiClassify struct {
-	BaseFromIcpiClassifyId int       `orm:"column(base_from_icpi_classify_id);pk"`
-	ClassifyName           string    `description:"分类名称"`
-	ClassifyNameEn         string    `description:"英文名称"`
-	ParentId               int       `description:"上级id"`
-	CreateTime             time.Time `description:"创建时间"`
-	ModifyTime             time.Time `description:"修改时间"`
+	BaseFromIcpiClassifyId int `gorm:"column:base_from_icpi_classify_id;primaryKey"`
+	//BaseFromIcpiClassifyId int       `orm:"column(base_from_icpi_classify_id);pk"`
+	ClassifyName   string    `description:"分类名称"`
+	ClassifyNameEn string    `description:"英文名称"`
+	ParentId       int       `description:"上级id"`
+	CreateTime     time.Time `description:"创建时间"`
+	ModifyTime     time.Time `description:"修改时间"`
 }
 
 func GetBaseFromIcpiDataByIndexCode(indexCode string) (items []*BaseFromIcpiData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_icpi_data WHERE index_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
 	return
 }
 
 func GetBaseFromIcpiDataDataByCondition(condition string, pars []interface{}) (item []*BaseFromIcpiData, err error) {
 	sql := ` SELECT * FROM base_from_icpi_data WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // 新增广期所指标数据
 func AddEdbDataFromIcpi(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	dataAll, err := GetBaseFromIcpiDataByIndexCode(edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
@@ -87,7 +101,8 @@ func AddEdbDataFromIcpi(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -100,7 +115,7 @@ func RefreshEdbDataFromIcpi(edbInfoId int, edbCode, startDate string) (err error
 	source := utils.DATA_SOURCE_ICPI
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -130,7 +145,7 @@ func RefreshEdbDataFromIcpi(edbInfoId int, edbCode, startDate string) (err error
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -205,7 +220,8 @@ func RefreshEdbDataFromIcpi(edbInfoId int, edbCode, startDate string) (err error
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 9 - 5
models/base_from_jiayue.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -95,6 +95,7 @@ func AddEdbDataFromJiaYue(tableName, edbCode string, dataList []BridgeJiaYueInde
 	}
 
 	sql := fmt.Sprintf(`INSERT INTO %s(edb_info_id, edb_code, data_time, value, create_time, modify_time, data_timestamp) VALUES `, tableName)
+	sql = utils.ReplaceDriverKeywords("", sql)
 	for _, v := range dataList {
 		val := utils.SubFloatToString(v.Val, 20)
 		stamp := fmt.Sprint(v.DataTime.UnixMilli())
@@ -103,8 +104,9 @@ func AddEdbDataFromJiaYue(tableName, edbCode string, dataList []BridgeJiaYueInde
 	sql = strings.TrimRight(sql, ",")
 
 	// 新增入库
-	o := orm.NewOrm()
-	_, e := o.Raw(sql).Exec()
+	//o := orm.NewOrm()
+	//_, e := o.Raw(sql).Exec()
+	e := global.DEFAULT_DB.Exec(sql).Error
 	if e != nil {
 		err = fmt.Errorf("insert data err: %s", e.Error())
 	}
@@ -166,6 +168,7 @@ func RefreshEdbDataFromJiaYue(source, subSource, edbInfoId int, tableName, edbCo
 	strEdbInfoId := strconv.Itoa(edbInfoId)
 	addExists := make(map[string]bool)
 	sqlInsert := fmt.Sprintf(`INSERT INTO %s(edb_info_id, edb_code, data_time, value, create_time, modify_time, data_timestamp) VALUES `, tableName)
+	sqlInsert = utils.ReplaceDriverKeywords("", sqlInsert)
 	for _, v := range dataList {
 		val := utils.SubFloatToString(v.Val, 30)
 		stamp := fmt.Sprint(v.DataTime.UnixMilli())
@@ -217,9 +220,10 @@ func RefreshEdbDataFromJiaYue(source, subSource, edbInfoId int, tableName, edbCo
 	if !hasNew {
 		return
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sqlInsert = strings.TrimRight(sqlInsert, ",")
-	_, e = o.Raw(sqlInsert).Exec()
+	//_, e = o.Raw(sqlInsert).Exec()
+	e = global.DEFAULT_DB.Exec(sqlInsert).Error
 	if e != nil {
 		err = fmt.Errorf("insert edb data err: %s", e.Error())
 		return

+ 10 - 6
models/base_from_lt.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"reflect"
 	"strconv"
 	"strings"
@@ -14,10 +14,11 @@ import (
 
 // 新增路透指标数据
 func AddEdbDataFromLt(edbCode string, ltDataList map[int64]interface{}) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if len(ltDataList) > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_lt(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for timestampInt, edbValue := range ltDataList {
 			dataTime := time.Unix(timestampInt/1000, 0)
 
@@ -42,7 +43,8 @@ func AddEdbDataFromLt(edbCode string, ltDataList map[int64]interface{}) (err err
 		}
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				fmt.Println("RefreshAllEdbDataByPb add Err", err.Error())
 				return
@@ -57,7 +59,7 @@ func RefreshEdbDataFromLt(edbInfoId int, edbCode, startDate string, ltDataList m
 	source := utils.DATA_SOURCE_LT
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	// 真实数据的最大日期  , 插入规则配置的日期
 	var realDataMaxDate, edbDataInsertConfigDate time.Time
@@ -65,7 +67,7 @@ func RefreshEdbDataFromLt(edbInfoId int, edbCode, startDate string, ltDataList m
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -95,6 +97,7 @@ func RefreshEdbDataFromLt(edbInfoId int, edbCode, startDate string, ltDataList m
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
 
 	addSql := ` INSERT INTO edb_data_lt(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 
 	for timestampInt, edbValue := range ltDataList {
@@ -148,7 +151,8 @@ func RefreshEdbDataFromLt(edbInfoId int, edbCode, startDate string, ltDataList m
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshAllEdbDataByLt add Err", err.Error())
 			return

+ 30 - 0
models/base_from_ly_classify.go

@@ -0,0 +1,30 @@
+// @Author gmy 2024/8/7 9:26:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"time"
+)
+
+type BaseFromLyClassify struct {
+	BaseFromLyClassifyId int       `gorm:"column:base_from_ly_classify_id;type:int(11) UNSIGNED;comment:分类ID;primaryKey;not null;"` // 分类ID
+	CreateTime           time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;not null;default:CURRENT_TIMESTAMP;"`       // 创建时间
+	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;not null;default:CURRENT_TIMESTAMP;"`       // 修改时间
+	ClassifyName         string    `gorm:"column:classify_name;type:varchar(255);comment:分类名称;not null;"`                           // 分类名称
+	ParentId             int32     `gorm:"column:parent_id;type:int(11) UNSIGNED;comment:上级id;default:0;"`                          // 上级id
+	Sort                 int32     `gorm:"column:sort;type:int(9) UNSIGNED;comment:排序字段,越小越靠前;default:0;"`                          // 排序字段,越小越靠前
+	ClassifyNameEn       string    `gorm:"column:classify_name_en;type:varchar(255);comment:英文分类名称;"`                               // 英文分类名称
+}
+
+// GetLyClassifyByName 根据分类名称查询
+func GetLyClassifyByName(classifyName string) (item *BaseFromLyClassify, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_ly_classify WHERE classify_name=?`
+	//err = o.Raw(sql, classifyName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}

+ 82 - 0
models/base_from_ly_data.go

@@ -0,0 +1,82 @@
+// @Author gmy 2024/8/7 9:50:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"gorm.io/gorm"
+	"time"
+)
+
+type BaseFromLyData struct {
+	BaseFromLyDataId  int       `gorm:"column:base_from_ly_data_id;type:int(10) UNSIGNED;primaryKey;not null;"`
+	CreateTime        time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;not null;default:CURRENT_TIMESTAMP;"` // 创建时间
+	ModifyTime        time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;not null;default:CURRENT_TIMESTAMP;"` // 修改时间
+	BaseFromLyIndexId int       `gorm:"column:base_from_ly_index_id;type:int(10) UNSIGNED;comment:指标id;not null;"`         // 指标id
+	IndexCode         string    `gorm:"column:index_code;type:varchar(128);comment:指标编码;not null;"`                        // 指标编码
+	DataTime          string    `gorm:"column:data_time;type:date;comment:数据日期;default:NULL;"`                             // 数据日期
+	Value             float64   `gorm:"column:value;type:double;comment:数据值;default:NULL;"`                                // 数据值
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromLyData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
+// AddLyDataList 批量插入数据记录列表
+func AddLyDataList(items []BaseFromLyData) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
+	return
+}
+
+// GetLyDataByIndexIdAndDataTime 根据指标id和数据日期查询数据
+func GetLyDataByIndexIdAndDataTime(indexId int, dataTime string) (items []BaseFromLyData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_ly_data WHERE base_from_ly_index_id=? AND data_time=?`
+	//_, err = o.Raw(sql, indexId, dataTime).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexId, dataTime).Find(&items).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}
+
+// GetLyDataByIndexIdAndDataTimeYM 根据指标id和数据日期的年月查询数据
+func GetLyDataByIndexIdAndDataTimeYM(indexId int, dataTime string) (items []BaseFromLyData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_ly_data WHERE base_from_ly_index_id=? AND data_time like ?`
+	//_, err = o.Raw(sql, indexId, dataTime+"%").QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexId, dataTime+"%").Find(&items).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}
+
+// UpdateLyDataById 根据主键id更新数据
+func UpdateLyDataById(dataId int, value float64) (err error) {
+	//o := orm.NewOrm()
+	sql := `UPDATE base_from_ly_data SET value=? WHERE base_from_ly_data_id=?`
+	//_, err = o.Raw(sql, value, dataId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, value, dataId).Error
+	return
+}
+
+// GetBaseFromLyDataByIndexCode 根据指标编码查询
+func GetBaseFromLyDataByIndexCode(condition string, pars []interface{}) (items []BaseFromLyData, err error) {
+	sql := `SELECT * FROM base_from_ly_data WHERE 1=1 `
+	//o := orm.NewOrm()
+	if condition != "" {
+		sql += condition
+	}
+	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}

+ 58 - 0
models/base_from_ly_index.go

@@ -0,0 +1,58 @@
+// Package models
+// @Author gmy 2024/8/7 9:38:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"time"
+)
+
+type BaseFromLyIndex struct {
+	BaseFromLyIndexId    int       `gorm:"column:base_from_ly_index_id;type:int(11);primaryKey;not null;"`
+	CreateTime           time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;not null;default:CURRENT_TIMESTAMP;"`            // 创建时间
+	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;not null;default:CURRENT_TIMESTAMP;"`            // 修改时间
+	BaseFromLyClassifyId int       `gorm:"column:base_from_ly_classify_id;type:int(11) UNSIGNED;comment:原始数据指标分类id;not null;default:0;"` // 原始数据指标分类id
+	IndexCode            string    `gorm:"column:index_code;type:varchar(255);comment:指标编码;"`                                            // 指标编码
+	IndexName            string    `gorm:"column:index_name;type:varchar(255);comment:指标名称;"`                                            // 指标名称
+	Frequency            string    `gorm:"column:frequency;type:varchar(20);comment:频度;"`                                                // 频度
+	Unit                 string    `gorm:"column:unit;type:varchar(30);comment:单位;"`                                                     // 单位
+	EdbExist             int       `gorm:"column:edb_exist;type:tinyint(4) UNSIGNED;comment:指标库是否已添加:0-否;1-是;not null;default:0;"`       // 指标库是否已添加:0-否;1-是
+	StartDate            time.Time `gorm:"column:start_date;type:date;comment:数据开始日期;default:NULL;"`                                     // 数据开始日期
+	EndDate              time.Time `gorm:"column:end_date;type:date;comment:数据结束日期;default:NULL;"`                                       // 数据结束日期
+	LatestValue          float64   `gorm:"column:latest_value;type:double;comment:数据最新值;default:NULL;"`                                  // 数据最新值
+}
+
+// AddLyIndexList 批量插入指标记录列表
+func AddLyIndexList(items []*BaseFromLyIndex) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
+	return
+}
+
+// AddLyIndex 添加指标
+func AddLyIndex(item *BaseFromLyIndex) (int64, error) {
+	item.CreateTime = time.Now()
+	//o := orm.NewOrm()
+	//id, err := o.Insert(item)
+	err := global.DEFAULT_DB.Create(item).Error
+	if err != nil {
+		return 0, err
+	}
+	id := int64(item.BaseFromLyIndexId)
+	return id, nil
+}
+
+// GetLyIndexByCode 查询指标编码是否存在
+func GetLyIndexByCode(indexCode string) (item *BaseFromLyIndex, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_ly_index WHERE index_code=?`
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+
+	return
+}

+ 45 - 0
models/base_from_ly_index_record.go

@@ -0,0 +1,45 @@
+// Package models
+// @Author gmy 2024/8/7 9:38:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+)
+
+type BaseFromLyIndexRecord struct {
+	BaseFromLyIndexRecordId int `gorm:"column:base_from_ly_index_record_id;primaryKey"` // 指标记录ID
+	//BaseFromLyIndexRecordId int    `orm:"column(base_from_ly_index_record_id);pk"` // 指标记录ID
+	CreateTime string `gorm:"column:create_time"` // 创建时间
+	ModifyTime string `gorm:"column:modify_time"` // 修改时间
+	Product    string `gorm:"column:product"`     // 产品
+	Category   string `gorm:"column:category"`    // 分类
+	Url        string `gorm:"column:url"`         // 指标页面地址
+	DataTime   string `gorm:"column:data_time"`   // 数据日期
+}
+
+// AddLyIndexRecord 添加指标记录
+func AddLyIndexRecord(item *BaseFromLyIndexRecord) (int64, error) {
+	//o := orm.NewOrm()
+	//id, err := o.Insert(item)
+	err := global.DEFAULT_DB.Create(item).Error
+	if err != nil {
+		return 0, err
+	}
+	id := int64(item.BaseFromLyIndexRecordId)
+	return id, nil
+}
+
+// GetLyIndexRecordByUrl 查询指标记录是否存在
+func GetLyIndexRecordByUrl(url string) (item *BaseFromLyIndexRecord, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_ly_index_record WHERE url=?`
+	//err = o.Raw(sql, url).QueryRow(&item)
+
+	err = global.DEFAULT_DB.Raw(sql, url).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+
+	return
+}

+ 23 - 10
models/base_from_lz.go

@@ -1,9 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -12,26 +13,34 @@ import (
 //隆众
 
 type lzSurveyData struct {
-	DataTime   string `orm:"column(data_time)" description:"日期"`
-	InputValue string `orm:"column(input_value)" description:"值"`
+	DataTime   string `gorm:"column:data_time" description:"日期"`
+	InputValue string `gorm:"column:input_value" description:"值"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *lzSurveyData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetLzSurveyDataFromLz(condition string, pars []interface{}) (item []*lzSurveyData, err error) {
 	sql := ` SELECT  a.* FROM longzhong_survey_data AS a
 				INNER JOIN longzhong_survey_product AS b ON a.survey_product_id=b.survey_product_id
 				WHERE 1=1 `
-	o := orm.NewOrmUsingDB("edb")
+	//o := orm.NewOrmUsingDB("edb")
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` GROUP BY data_time ORDER BY a.data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DbMap[utils.DbNameManualIndex].Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // 新增钢联指标数据
 func AddEdbDataFromLz(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -50,6 +59,7 @@ func AddEdbDataFromLz(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := lzDataList[i]
 			eDate := item.DataTime
@@ -66,7 +76,8 @@ func AddEdbDataFromLz(edbCode string) (err error) {
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
 			utils.FileLog.Info("addSql:" + addSql)
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}
@@ -80,7 +91,7 @@ func RefreshEdbDataFromLz(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_LZ
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	// 真实数据的最大日期  , 插入规则配置的日期
 	var realDataMaxDate, edbDataInsertConfigDate time.Time
@@ -88,7 +99,7 @@ func RefreshEdbDataFromLz(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -132,6 +143,7 @@ func RefreshEdbDataFromLz(edbInfoId int, edbCode, startDate string) (err error)
 		existMap[v.DataTime] = v
 	}
 	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range lzDataList {
 		item := v
@@ -174,7 +186,8 @@ func RefreshEdbDataFromLz(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 37 - 19
models/base_from_manual.go

@@ -1,12 +1,13 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/models/mgo"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
 	"go.mongodb.org/mongo-driver/bson"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -15,10 +16,18 @@ import (
 //弘则手工数据
 
 type ManualEdbdata struct {
-	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
-	Dt         string    `orm:"column(DT)" description:"日期"`
-	Close      string    `orm:"column(CLOSE)" description:"值"`
-	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
+	TradeCode string `gorm:"column:TRADE_CODE;autoIncrement:false;primaryKey" description:"指标编码"`
+	//TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
+	Dt         string    `gorm:"column:DT" description:"日期"`
+	Close      string    `gorm:"column:CLOSE" description:"值"`
+	ModifyTime time.Time `gorm:"column:modify_time" description:"修改时间"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *ManualEdbdata) AfterFind(db *gorm.DB) (err error) {
+	m.Dt = utils.GormDateStrToDateStr(m.Dt)
+
+	return
 }
 
 func GetEdbdataManualByCondition(condition string, pars []interface{}) (item []*ManualEdbdata, err error) {
@@ -27,14 +36,15 @@ func GetEdbdataManualByCondition(condition string, pars []interface{}) (item []*
 		sql += condition
 	}
 	sql += ` ORDER BY DT DESC `
-	o := orm.NewOrmUsingDB("edb")
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//o := orm.NewOrmUsingDB("edb")
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DbMap[utils.DbNameManualIndex].Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // AddEdbDataFromManual 新增弘则手工指标数据
 func AddEdbDataFromManual(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -53,6 +63,7 @@ func AddEdbDataFromManual(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := manualDataList[i]
 			eDate := item.Dt
@@ -74,7 +85,8 @@ func AddEdbDataFromManual(edbCode string) (err error) {
 		}
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return
 			}
@@ -88,7 +100,7 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	source := utils.DATA_SOURCE_MANUAL
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -105,10 +117,11 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	if startDate != "" {
 		condition += " AND DT>=? "
 		pars = append(pars, startDate)
-	} else {
-		condition += " AND DT != ? "
-		pars = append(pars, `0000-00-00`)
 	}
+	//else {
+	//	condition += " AND DT != ? "
+	//	pars = append(pars, `0000-00-00`)
+	//}
 
 	manualDataList, err := GetEdbdataManualByCondition(condition, pars)
 	if err != nil {
@@ -122,7 +135,7 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	edbDataInsertConfigDateStr := ``
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -151,10 +164,14 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	}
 
 	addSql := ` INSERT INTO edb_data_manual (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	manualMap := make(map[string]*ManualEdbdata)
 	//fmt.Println("manualDataList:", len(manualDataList))
 	for _, v := range manualDataList {
+		if v.Dt == `` || v.Dt == `0000-00-00` {
+			continue
+		}
 		item := v
 		eDate := item.Dt
 		sValue := item.Close
@@ -208,7 +225,8 @@ func RefreshEdbDataFromManual(edbInfoId int, edbCode, startDate string) (err err
 	}
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshAllEdbDataByManual add Err", err.Error())
 			return
@@ -254,9 +272,8 @@ func HandleConfigInsertEdbData(realDataMaxDate time.Time, edbDataInsertConfig *E
 			DeleteEdbDataById(source, subSource, item.EdbDataId)
 		}
 	} else {
-		o := orm.NewOrm()
 		edbDataInsertConfig.RealDate = realDataMaxDate
-		_, err = o.Update(edbDataInsertConfig, "RealDate")
+		err = global.DEFAULT_DB.Model(edbDataInsertConfig).Select([]string{"RealDate"}).Updates(edbDataInsertConfig).Error
 	}
 
 	return
@@ -298,9 +315,10 @@ func HandleConfigInsertEdbDataByMongo(realDataMaxDate time.Time, edbDataInsertCo
 			mogDataObj.RemoveManyByColl(coll, bson.M{"_id": item.ID})
 		}
 	} else {
-		o := orm.NewOrm()
+		//o := orm.NewOrm()
 		edbDataInsertConfig.RealDate = realDataMaxDate
-		_, err = o.Update(edbDataInsertConfig, "RealDate")
+		//_, err = o.Update(edbDataInsertConfig, "RealDate")
+		err = global.DEFAULT_DB.Model(&edbDataInsertConfig).Select("RealDate").Updates(&edbDataInsertConfig).Error
 	}
 
 	return

+ 121 - 47
models/base_from_mtjh.go

@@ -1,100 +1,125 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"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:"频率"`
+	BaseFromMtjhMappingId int `gorm:"column:base_from_Mtjh_mapping_id;primaryKey"`
+	//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:"港口或码头"`
-	Variety             string    `description:"品种"`
-	Unit                string    `description:"单位"`
-	Frequency           string    `description:"频率"`
-	CreateTime          time.Time `description:"插入时间"`
-	ModifyTime          time.Time `description:"修改时间"`
+	BaseFromMtjhIndexId int `gorm:"column:base_from_mtjh_index_id;primaryKey"`
+	//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:"港口或码头"`
+	Variety    string    `description:"品种"`
+	Unit       string    `description:"单位"`
+	Frequency  string    `description:"频率"`
+	CreateTime time.Time `description:"插入时间"`
+	ModifyTime time.Time `description:"修改时间"`
+}
+
+func (e *BaseFromMtjhIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
 }
 
 // 查询指标
 func GetBaseFromMtjhMapping() (items []*BaseFromMtjhMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mtjh_mapping`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 // 查询指标
 func GetBaseFromMtjhIndex() (items []*BaseFromMtjhIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mtjh_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 // 添加数据
 func AddBaseFromMtjhIndex(item *BaseFromMtjhIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromMtjhIndexId)
 	return
 }
 
-func AddBaseFromMtjhIndexMuti(items []*BaseFromMtjhIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.InsertMulti(500, items)
+func AddBaseFromMtjhIndexMuti(items []*BaseFromMtjhIndex) (err error) {
+	err = global.DEFAULT_DB.CreateInBatches(items, utils.MultiAddNum).Error
+
 	return
 }
 
 // 添加指标
 func AddBaseFromMtjhMapping(item *BaseFromMtjhMapping) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromMtjhMappingId)
 	return
 }
 
 func AddBaseFromMtjhMappingMuti(items []*BaseFromMtjhMapping) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.InsertMulti(500, items)
+	//o := orm.NewOrm()
+	//lastId, err = o.InsertMulti(500, items)
+	err = global.DEFAULT_DB.CreateInBatches(items, utils.MultiAddNum).Error
 	return
 }
 
 func UpdateBaseFromMtjhIndex(item *BaseFromMtjhIndex) (err error) {
-	o := orm.NewOrm()
+	//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()
+	//_, err = o.Raw(sql, item.DealValue, item.IndexName, item.DataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.DealValue, item.IndexName, item.DataTime).Error
 	return
 }
 
 func AddEdbDataFromMtjh(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	coalBaseDataAll, err := GetMtjhindexByCode(edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_mtjh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 	for _, sv := range coalBaseDataAll {
 		eDate := sv.DataTime
@@ -126,7 +151,8 @@ func AddEdbDataFromMtjh(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -137,7 +163,7 @@ func AddEdbDataFromMtjh(edbCode string) (err error) {
 func RefreshEdbDataFromMtjh(edbInfoId int, edbCode, startDate string) (err error) {
 	source := utils.DATA_SOURCE_MTJH
 	subSource := utils.DATA_SUB_SOURCE_EDB
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -168,7 +194,7 @@ func RefreshEdbDataFromMtjh(edbInfoId int, edbCode, startDate string) (err error
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -197,6 +223,7 @@ func RefreshEdbDataFromMtjh(edbInfoId int, edbCode, startDate string) (err error
 	}
 
 	addSql := ` INSERT INTO edb_data_mtjh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range glDataList {
 		var value string
@@ -254,7 +281,8 @@ func RefreshEdbDataFromMtjh(edbInfoId int, edbCode, startDate string) (err error
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -265,19 +293,65 @@ func RefreshEdbDataFromMtjh(edbInfoId int, edbCode, startDate string) (err error
 
 // GetMtjhindexByCode
 func GetMtjhindexByCode(indexCode string) (items []*BaseFromMtjhIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := "SELECT * FROM base_from_mtjh_index WHERE index_code=? "
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
 	return
 }
 
 func GetMtjhDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromMtjhIndex, err error) {
 	sql := ` SELECT * FROM base_from_mtjh_index WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
+	return
+}
+
+func (m *BaseFromMtjhMapping) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	var suffix string
+	if strings.Contains(indexCode, "jsm") {
+		suffix = "jsm_index"
+	} else if strings.Contains(indexCode, "company") {
+		suffix = "company_index"
+	} else if strings.Contains(indexCode, "firm") {
+		suffix = "firm_index"
+	} else if strings.Contains(indexCode, "coastal") {
+		suffix = "coastal_index"
+	} else if strings.Contains(indexCode, "inland") {
+		suffix = "inland_index"
+	}
+
+	tableName := fmt.Sprintf("base_from_coalmine_%s", suffix)
+
+	//o := orm.NewOrm()
+	sql := fmt.Sprintf(` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(deal_value) AS min_value,MAX(deal_value) AS max_value FROM %s WHERE index_code=? `, tableName)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 获取最新值
+	sql = fmt.Sprintf(` SELECT value AS deal_value FROM %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `, tableName)
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+
+	return
+}
+
+func (m *BaseFromMtjhMapping) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_mtjh_mapping SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }

+ 23 - 11
models/base_from_mysteel.go

@@ -1,26 +1,33 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
 	"strconv"
 	"strings"
 	"time"
 
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 )
 
 //钢联
-
 type GlData struct {
-	InputValue float64 `orm:"column(DATA_VALUE)" description:"日期"`
-	DataTime   string  `orm:"column(DATA_DATE)" description:"值"`
+	InputValue float64 `gorm:"column:DATA_VALUE" description:"日期"`
+	DataTime   string  `gorm:"column:DATA_DATE" description:"值"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *GlData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetGlDataByCondition(condition string, pars []interface{}) (item []*GlData, err error) {
 	condition += " AND IS_DELETE=0 "
 	sql1 := ` SELECT * FROM mb_index_main_data WHERE 1=1 AND DATA_VALUE is not null `
-	o := orm.NewOrmUsingDB("gl")
+	//o := orm.NewOrmUsingDB("gl")
 	if condition != "" {
 		sql1 += condition
 	}
@@ -38,13 +45,14 @@ func GetGlDataByCondition(condition string, pars []interface{}) (item []*GlData,
 	//		) tmp group by DATA_DATE
 	//
 	//		order by PUBLISH_TIME DESC
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DbMap[utils.DbNameGL].Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // 新增钢联指标数据
 func AddEdbDataFromMysteel(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -65,6 +73,7 @@ func AddEdbDataFromMysteel(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := glDataList[i]
 			eDate := item.DataTime
@@ -86,7 +95,8 @@ func AddEdbDataFromMysteel(edbCode string) (err error) {
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
 			utils.FileLog.Info("addSql:" + addSql)
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}
@@ -100,7 +110,7 @@ func RefreshEdbDataFromMysteel(edbInfoId int, edbCode, startDate string) (err er
 	source := utils.DATA_SOURCE_GL
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -130,7 +140,7 @@ func RefreshEdbDataFromMysteel(edbInfoId int, edbCode, startDate string) (err er
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -158,6 +168,7 @@ func RefreshEdbDataFromMysteel(edbInfoId int, edbCode, startDate string) (err er
 	}
 
 	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	addMap := make(map[string]string)
 	for _, v := range glDataList {
@@ -206,7 +217,8 @@ func RefreshEdbDataFromMysteel(edbInfoId int, edbCode, startDate string) (err er
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}

+ 130 - 82
models/base_from_mysteel_chemical.go

@@ -1,36 +1,45 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 //钢联
 
 type MysteelChemicalData struct {
-	InputValue float64 `orm:"column(value)" description:"值"`
-	DataTime   string  `orm:"column(data_time)" description:"日期"`
+	InputValue float64 `gorm:"column:value" description:"值"`
+	DataTime   string  `gorm:"column:data_time" description:"日期"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *MysteelChemicalData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetMysteelChemicalDataByCondition(condition string, pars []interface{}) (item []*MysteelChemicalData, err error) {
 	sql1 := ` SELECT * FROM base_from_mysteel_chemical_data WHERE 1=1  `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql1 += condition
 	}
 	sql := `select * from (` + sql1 + ` having 1 order by modify_time DESC ) tmp GROUP BY data_time ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
 // AddEdbDataFromMysteelChemical 新增钢联指标数据
 func AddEdbDataFromMysteelChemical(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -51,6 +60,7 @@ func AddEdbDataFromMysteelChemical(edbCode string) (err error) {
 	if dataLen > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_mysteel_chemical (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for i := 0; i < dataLen; i++ {
 			item := mysteelChemicalDataList[i]
 			eDate := item.DataTime
@@ -72,7 +82,8 @@ func AddEdbDataFromMysteelChemical(edbCode string) (err error) {
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
 			utils.FileLog.Info("addSql:" + addSql)
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}
@@ -86,7 +97,7 @@ func RefreshEdbDataFromMysteelChemical(edbInfoId int, edbCode, startDate string)
 	source := utils.DATA_SOURCE_MYSTEEL_CHEMICAL
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -116,7 +127,7 @@ func RefreshEdbDataFromMysteelChemical(edbInfoId int, edbCode, startDate string)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -144,6 +155,7 @@ func RefreshEdbDataFromMysteelChemical(edbInfoId int, edbCode, startDate string)
 	}
 
 	addSql := ` INSERT INTO edb_data_mysteel_chemical(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	addMap := make(map[string]string)
 	for _, v := range mysteelChemicalDataList {
@@ -192,7 +204,8 @@ func RefreshEdbDataFromMysteelChemical(edbInfoId int, edbCode, startDate string)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -202,7 +215,8 @@ func RefreshEdbDataFromMysteelChemical(edbInfoId int, edbCode, startDate string)
 
 // 上海钢联指标数据
 type BaseFromMysteelChemicalIndex struct {
-	BaseFromMysteelChemicalIndexId    int64     `orm:"column(base_from_mysteel_chemical_index_id);pk"`
+	BaseFromMysteelChemicalIndexId int64 `gorm:"column:base_from_mysteel_chemical_index_id;primaryKey"`
+	//BaseFromMysteelChemicalIndexId    int64     `orm:"column(base_from_mysteel_chemical_index_id);pk"`
 	BaseFromMysteelChemicalClassifyId int       `description:"分类id"`
 	IndexCode                         string    `description:"指标编码"`
 	IndexName                         string    `description:"指标名称"`
@@ -226,6 +240,14 @@ type BaseFromMysteelChemicalIndex struct {
 	ModifyTime                        time.Time `description:"修改时间"`
 	IsStop                            int       `description:"是否停更:1:停更,0:未停更"`
 	TerminalCode                      string    `description:"终端编码"`
+	IsSupplierStop                    int       `description:"是否供应商停更:1:停更,0:未停更"`
+}
+
+func (e *BaseFromMysteelChemicalIndex) AfterFind(db *gorm.DB) (err error) {
+	e.UpdateTime = utils.GormDateStrToDateStr(e.UpdateTime)
+	e.UpdateTime2 = utils.GormDateStrToDateStr(e.UpdateTime2)
+
+	return
 }
 
 type MysteelChemicalAPiCheck struct {
@@ -235,16 +257,18 @@ type MysteelChemicalAPiCheck struct {
 
 // GetIndexRefreshAllByMergeFile 根据合并文件去分组查询需要刷新的文件
 func (m *BaseFromMysteelChemicalIndex) GetIndexRefreshAllByMergeFile() (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE merge_file_path <>'' AND base_from_mysteel_chemical_classify_id NOT IN(54,55,56,57) GROUP BY merge_file_path`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 func (m *BaseFromMysteelChemicalIndex) GetIndexItem(indexCode string) (item *BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE index_code = ? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
@@ -252,43 +276,47 @@ func (m *BaseFromMysteelChemicalIndex) GetBatchIndexItem(indexCodes []string) (i
 	if len(indexCodes) <= 0 {
 		return
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE index_code IN (%s) `
 	holder := make([]string, 0, len(indexCodes))
 	for range indexCodes {
 		holder = append(holder, "?")
 	}
 	sql = fmt.Sprintf(sql, strings.Join(holder, ","))
-	_, err = o.Raw(sql, indexCodes).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCodes).Find(&items).Error
+	//_, err = o.Raw(sql, indexCodes).QueryRows(&items)
 	return
 }
 
 func (m *BaseFromMysteelChemicalIndex) GetIndexCreate(terminalCode string) (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE index_name = '' AND terminal_code = ? `
-	_, err = o.Raw(sql, terminalCode).QueryRows(&items)
+	//_, err = o.Raw(sql, terminalCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, terminalCode).Find(&items).Error
 	return
 }
 
 // Add 新增
 func (m *BaseFromMysteelChemicalIndex) Add() (err error) {
-	o := orm.NewOrm()
-	_, err = o.Insert(m)
+	//o := orm.NewOrm()
+	//_, err = o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
 	return
 }
 
 func (m *BaseFromMysteelChemicalIndex) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, cols...)
+	err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 // GetNoMergeIndexByFrequencyCount 获取未合并的指标总数量
 func (m *BaseFromMysteelChemicalIndex) GetNoMergeIndexByFrequencyCount(frequency string) (total int64, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT count(1) AS total FROM base_from_mysteel_chemical_index WHERE frequency = ? AND merge_file_path = '' AND index_name NOT LIKE "%停%"  `
-	err = o.Raw(sql, frequency).QueryRow(&total)
-
+	//err = o.Raw(sql, frequency).QueryRow(&total)
+	err = global.DEFAULT_DB.Raw(sql, frequency).Scan(&total).Error
 	return
 }
 
@@ -301,10 +329,10 @@ type GetMaxFileIndexReq struct {
 
 // GetMaxFileIndex 获取最大文件的
 func (m *BaseFromMysteelChemicalIndex) GetMaxFileIndex(frequency string) (item *BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE frequency=? AND index_name NOT LIKE "%停%" ORDER BY file_index DESC `
-	err = o.Raw(sql, frequency).QueryRow(&item)
-
+	///err = o.Raw(sql, frequency).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, frequency).First(&item).Error
 	return
 }
 
@@ -316,9 +344,10 @@ type GetNoMergeIndexByFrequencyPageReq struct {
 
 // GetNoMergeIndexByFrequencyPage 获取未合并的指标列表
 func (m *BaseFromMysteelChemicalIndex) GetNoMergeIndexByFrequencyPage(frequency string, limit int) (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE frequency=? AND merge_file_path = '' limit ? `
-	_, err = o.Raw(sql, frequency, limit).QueryRows(&items)
+	//_, err = o.Raw(sql, frequency, limit).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, frequency, limit).Find(&items).Error
 	return
 }
 
@@ -327,25 +356,28 @@ type GetIndexCountByMergeFilePathReq struct {
 }
 
 func (m *BaseFromMysteelChemicalIndex) GetIndexCountByMergeFilePath(mergeFilePath string) (total int64, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT count(1) AS total FROM base_from_mysteel_chemical_index WHERE merge_file_path = ?`
-	err = o.Raw(sql, mergeFilePath).QueryRow(&total)
+	//err = o.Raw(sql, mergeFilePath).QueryRow(&total)
+	err = global.DEFAULT_DB.Raw(sql, mergeFilePath).Scan(&total).Error
 	return
 }
 
 // GetIndexRefreshMethanolByMergeFile 根据合并文件去分组查询需要刷新的甲醇文件
 func (m *BaseFromMysteelChemicalIndex) GetIndexRefreshMethanolByMergeFile() (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE merge_file_path <> '' AND base_from_mysteel_chemical_classify_id IN(54,55,56,57) GROUP BY merge_file_path`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 // GetIndexRefreshMethanolByTimely 获取需要及时刷新的文件
 func (m *BaseFromMysteelChemicalIndex) GetIndexRefreshMethanolByTimely() (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE merge_file_path <> '' AND is_refresh = 1 GROUP BY merge_file_path`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
@@ -355,9 +387,10 @@ type GetIndexByFrequencyReq struct {
 
 // GetIndexByFrequency 根据频率获取指标
 func (m *BaseFromMysteelChemicalIndex) GetIndexByFrequency(frequency string) (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE frequency = ? AND merge_file_path = '' `
-	_, err = o.Raw(sql, frequency).QueryRows(&items)
+	//_, err = o.Raw(sql, frequency).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, frequency).Find(&items).Error
 	return
 }
 
@@ -369,9 +402,10 @@ type GetIndexRefreshWeekReq struct {
 
 func (m *BaseFromMysteelChemicalIndex) GetIndexRefreshWeek(nowWeekZn, startTime, endTime string) (items []*BaseFromMysteelChemicalIndex, err error) {
 	where := `update_week = ? AND ((update_time >= ? AND update_time <= ?) OR (update_time2 >= ? AND update_time2 <= ?)) `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT * FROM base_from_mysteel_chemical_index WHERE %s `, where)
-	_, err = o.Raw(sql, nowWeekZn, startTime, endTime, startTime, endTime).QueryRows(&items)
+	//_, err = o.Raw(sql, nowWeekZn, startTime, endTime, startTime, endTime).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, nowWeekZn, startTime, endTime, startTime, endTime).Find(&items).Error
 	return
 }
 
@@ -388,8 +422,9 @@ func (m *BaseFromMysteelChemicalIndex) UpdateIndex(item *BaseFromMysteelChemical
 	if len(updateCols) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	_, err = o.Update(item, updateCols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(item, updateCols...)
+	err = global.DEFAULT_DB.Model(&item).Select(updateCols).Updates(&item).Error
 	return
 }
 
@@ -398,7 +433,7 @@ func (m *BaseFromMysteelChemicalIndex) MultiUpdateIndex(items []UpdateIndexReq)
 	if len(items) == 0 {
 		return
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	for _, v := range items {
 		if len(v.UpdateCols) == 0 {
 			continue
@@ -406,7 +441,8 @@ func (m *BaseFromMysteelChemicalIndex) MultiUpdateIndex(items []UpdateIndexReq)
 		if v.Item == nil {
 			continue
 		}
-		if _, e := o.Update(v.Item, v.UpdateCols...); e != nil {
+		//if _, e := o.Update(v.Item, v.UpdateCols...); e != nil {
+		if e := global.DEFAULT_DB.Model(&v.Item).Select(v.UpdateCols).Updates(&v.Item).Error; e != nil {
 			err = fmt.Errorf("update err: %s", e.Error())
 			return
 		}
@@ -433,7 +469,8 @@ type HandleMysteelIndexResp struct {
 
 // 上海钢联指标数据
 type BaseFromMysteelChemicalData struct {
-	BaseFromMysteelChemicalDataId  int64 `orm:"column(base_from_mysteel_chemical_data_id);pk"`
+	BaseFromMysteelChemicalDataId int64 `gorm:"column:base_from_mysteel_chemical_data_id;primaryKey"`
+	//BaseFromMysteelChemicalDataId  int64 `orm:"column(base_from_mysteel_chemical_data_id);pk"`
 	BaseFromMysteelChemicalIndexId int64
 	IndexCode                      string
 	DataTime                       time.Time
@@ -445,23 +482,26 @@ type BaseFromMysteelChemicalData struct {
 
 // GetIndexDataList 根据指标编码获取数据
 func (d *BaseFromMysteelChemicalData) GetIndexDataList(indexCode string) (item []*BaseFromMysteelChemicalData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_data WHERE index_code = ? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&item)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&item).Error
 	return
 }
 
 // Update 修改
 func (r *BaseFromMysteelChemicalData) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(r, updateCols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(r, updateCols...)
+	err = global.DEFAULT_DB.Model(&r).Select(updateCols).Updates(&r).Error
 	return
 }
 
 // Add 新增
 func (r *BaseFromMysteelChemicalData) Add(list []BaseFromMysteelChemicalData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(list), list)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(500, list)
+	err = global.DEFAULT_DB.CreateInBatches(list, utils.MultiAddNum).Error
 	return
 }
 
@@ -470,8 +510,9 @@ func (r *BaseFromMysteelChemicalData) AddV2(list []*BaseFromMysteelChemicalData)
 	if len(list) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(500, list)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(500, list)
+	err = global.DEFAULT_DB.CreateInBatches(list, utils.MultiAddNum).Error
 	return
 }
 
@@ -489,22 +530,23 @@ type GetIndexDetailReq struct {
 
 // GetIndexCountByFrequency 获取未合并的指标总数量
 func (m *BaseFromMysteelChemicalIndex) GetIndexCountByFrequency(condition string, pars []interface{}) (total int64, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	sql := `SELECT count(1) AS total FROM base_from_mysteel_chemical_index WHERE 1=1  `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&total)
-
+	//err = o.Raw(sql, pars).QueryRow(&total)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&total).Error
 	return
 }
 
 // GetNoMergeIndexByFrequencyPage 获取未合并的指标列表
 func (m *BaseFromMysteelChemicalIndex) GetIndexLimitByFrequency(frequency string, limit int) (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE frequency=? limit ? `
-	_, err = o.Raw(sql, frequency, limit).QueryRows(&items)
+	//_, err = o.Raw(sql, frequency, limit).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, frequency, limit).Find(&items).Error
 	return
 }
 
@@ -518,67 +560,73 @@ type GetIndexPageByFrequencyPageReq struct {
 
 // GetNoMergeIndexByFrequencyPage 获取未合并的指标列表
 func (m *BaseFromMysteelChemicalIndex) GetIndexPageByFrequency(condition string, pars []interface{}, startSize, pageSize int) (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` LIMIT ?,?  `
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 func (d *BaseFromMysteelChemicalData) GetMysteelIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_mysteel_chemical_data WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
-
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	if err != nil {
 		return
 	}
 
 	// 获取最新值
-	var latest_value float64
 	sql = ` SELECT value AS latest_value FROM base_from_mysteel_chemical_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
-	err = o.Raw(sql, indexCode).QueryRow(&latest_value)
-	if err != nil {
-		return
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
 	}
-	item.LatestValue = latest_value
 
 	return
 }
 
 func (d *BaseFromMysteelChemicalData) ModifyMysteelIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_mysteel_chemical_index SET start_date=?,end_date=?,end_value=?,modify_time=NOW() WHERE index_code=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }
 
 // GetIndexByCondition 获取指标
 func (m *BaseFromMysteelChemicalIndex) GetIndexByCondition(condition string, pars []interface{}) (items []*BaseFromMysteelChemicalIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
 type BaseFromMysteelChemicalRecord struct {
-	BaseFromMysteelChemicalRecordId int64 `orm:"column(base_from_mysteel_chemical_record_id);pk"`
-	BaseFromMysteelChemicalIndexId  int64
-	OldIndexName                    string    `description:"原始名称"`
-	NewIndexName                    string    `description:"新的名称"`
-	CreateTime                      time.Time `description:"记录创建时间"`
-	Timestamp                       int64     `description:"记录创建时间戳"`
+	BaseFromMysteelChemicalRecordId int64 `gorm:"column:base_from_mysteel_chemical_record_id;primaryKey"`
+	//BaseFromMysteelChemicalRecordId int64 `orm:"column(base_from_mysteel_chemical_record_id);pk"`
+	BaseFromMysteelChemicalIndexId int64
+	OldIndexName                   string    `description:"原始名称"`
+	NewIndexName                   string    `description:"新的名称"`
+	CreateTime                     time.Time `description:"记录创建时间"`
+	Timestamp                      int64     `description:"记录创建时间戳"`
 }
 
 func (m *BaseFromMysteelChemicalRecord) AddBaseFromMysteelChemicalRecord() (err error) {
-	o := orm.NewOrm()
-	_, err = o.Insert(m)
+	//o := orm.NewOrm()
+	//_, err = o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
 	return
 }
 

+ 30 - 16
models/base_from_mysteel_chemical_classify.go

@@ -1,43 +1,57 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"time"
 )
 
 type BaseFromMysteelChemicalClassify struct {
-	BaseFromMysteelChemicalClassifyId int       `orm:"column(base_from_mysteel_chemical_classify_id);pk"`
-	ClassifyName                      string    `description:"分类名称"`
-	ParentId                          int       `description:"父级id"`
-	SysUserId                         int       `description:"创建人id"`
-	SysUserRealName                   string    `description:"创建人姓名"`
-	Level                             int       `description:"层级"`
-	Sort                              int       `description:"排序字段,越小越靠前,默认值:10"`
-	ModifyTime                        time.Time `description:"修改时间"`
-	CreateTime                        time.Time `description:"创建时间"`
+	BaseFromMysteelChemicalClassifyId int `gorm:"column:base_from_mysteel_chemical_classify_id;primaryKey"`
+	//BaseFromMysteelChemicalClassifyId int       `orm:"column(base_from_mysteel_chemical_classify_id);pk"`
+	ClassifyName    string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
 }
 
 // 判断分类名称是否存在
 func GetMysteelClassify(classifyName string, parentId int) (item *BaseFromMysteelChemicalClassify, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_mysteel_chemical_classify WHERE parent_id=? AND classify_name=? `
-	err = o.Raw(sql, parentId, classifyName).QueryRow(&item)
+	//err = o.Raw(sql, parentId, classifyName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, parentId, classifyName).First(&item).Error
 	return
 }
 
 // GetEdbClassifyMaxSort 获取分类下最大的排序数
 func GetMysteelClassifyMaxSort(parentId int) (sort int, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT Max(sort) AS sort FROM base_from_mysteel_chemical_classify WHERE parent_id=? `
-	err = o.Raw(sql, parentId).QueryRow(&sort)
+	//err = o.Raw(sql, parentId).QueryRow(&sort)
+	var intNull sql2.NullInt64
+	err = global.DEFAULT_DB.Raw(sql, parentId).Scan(&intNull).Error
+	if err == nil && intNull.Valid {
+		sort = int(intNull.Int64)
+	}
+
 	return
 }
 
 func AddMysteelClassify(item *BaseFromMysteelChemicalClassify) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromMysteelChemicalClassifyId)
 	return
 }
 

+ 23 - 10
models/base_from_national_statistics.go

@@ -1,9 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -11,7 +12,8 @@ import (
 
 // BaseFromNationalStatisticsData 国家统计局-指标数据表
 type BaseFromNationalStatisticsData struct {
-	BaseFromNationalStatisticsDataId  int `orm:"column(base_from_national_statistics_data_id);pk"`
+	BaseFromNationalStatisticsDataId int `gorm:"column:base_from_national_statistics_data_id;primaryKey"`
+	//BaseFromNationalStatisticsDataId  int `orm:"column(base_from_national_statistics_data_id);pk"`
 	BaseFromNationalStatisticsIndexId int
 	IndexCode                         string
 	DataTime                          string
@@ -20,20 +22,28 @@ type BaseFromNationalStatisticsData struct {
 	ModifyTime                        time.Time
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromNationalStatisticsData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 // GetBaseFromNationalStatisticsDataByCondition 获取指标值
 func GetBaseFromNationalStatisticsDataByCondition(condition string, pars []interface{}) (list []*BaseFromNationalStatisticsData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_national_statistics_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 // AddEdbDataFromNationalStatistics 新增国家统计局指标数据
 func AddEdbDataFromNationalStatistics(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -43,11 +53,12 @@ func AddEdbDataFromNationalStatistics(edbCode string) (err error) {
 	}
 
 	dataList, err := GetBaseFromNationalStatisticsDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	var isAdd bool
 	addSql := `INSERT INTO edb_data_national_statistics(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 	for _, sv := range dataList {
 		eDate := sv.DataTime
@@ -66,7 +77,8 @@ func AddEdbDataFromNationalStatistics(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -79,7 +91,7 @@ func RefreshEdbDataFromNationalStatistics(edbInfoId int, edbCode, startDate stri
 	source := utils.DATA_SOURCE_NATIONAL_STATISTICS
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -107,7 +119,7 @@ func RefreshEdbDataFromNationalStatistics(edbInfoId int, edbCode, startDate stri
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -175,7 +187,8 @@ func RefreshEdbDataFromNationalStatistics(edbInfoId int, edbCode, startDate stri
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromNationalStatistics add Err", err.Error())
 			return

+ 51 - 30
models/base_from_oilchem.go

@@ -1,9 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -32,30 +33,46 @@ type BaseFromOilchemData struct {
 	ModifyTime             time.Time // 修改时间
 }
 
+func (e *BaseFromOilchemData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
 
-//添加数据
+	return
+}
+
+// 添加数据
 func AddBaseFromOilchemIndexMuti(items []*BaseFromOilchemIndex) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(500, items)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(500, items)
+	err = global.DEFAULT_DB.CreateInBatches(items, utils.MultiAddNum).Error
 	return
 }
 func AddBaseFromOilchemIndex(item *BaseFromOilchemIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromOilchemIndexId)
 	return
 }
 
 func AddBaseFromOilchemData(item *BaseFromOilchemData) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromOilchemDataId)
 	return
 }
 
 func AddEdbDataFromOilchem(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	oilchemBaseDataAll, err := GetOilchemDataByCode(edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
@@ -92,7 +109,8 @@ func AddEdbDataFromOilchem(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -102,19 +120,19 @@ func AddEdbDataFromOilchem(edbCode string) (err error) {
 
 // GetOilchemDataByCode
 func GetOilchemDataByCode(indexCode string) (items []*BaseFromOilchemData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := "SELECT * FROM base_from_oilchem_data WHERE index_code=? "
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
 	return
 }
 
-
 // RefreshEdbDataFromOilchem 刷新隆众资讯
 func RefreshEdbDataFromOilchem(edbInfoId int, edbCode, startDate string) (err error) {
 	source := utils.DATA_SOURCE_OILCHEM
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -144,7 +162,7 @@ func RefreshEdbDataFromOilchem(edbInfoId int, edbCode, startDate string) (err er
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -212,7 +230,8 @@ func RefreshEdbDataFromOilchem(edbInfoId int, edbCode, startDate string) (err er
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromSci add Err", err.Error())
 			return
@@ -222,16 +241,16 @@ func RefreshEdbDataFromOilchem(edbInfoId int, edbCode, startDate string) (err er
 }
 
 func GetBaseFromOilchemDataByCondition(condition string, pars []interface{}) (list []*BaseFromOilchemData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_oilchem_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
-
 type BaseFromOilchemIndexReq struct {
 	BaseFromOilchemIndexId int       // 主键ID
 	IndexCode              string    // 指标编码
@@ -242,7 +261,7 @@ type BaseFromOilchemIndexReq struct {
 	Frequency              string    // 频度
 	Describe               string    // 指标描述
 	DataTime               string    // 数据日期
-	Value                  string   // 数据值
+	Value                  string    // 数据值
 	Sort                   int       // 排序
 	CreateTime             time.Time // 创建时间
 	ModifyTime             time.Time // 修改时间
@@ -250,29 +269,31 @@ type BaseFromOilchemIndexReq struct {
 	MarketName             string    // 市场名称
 }
 
-
 type HandleOielchemEdbDataReq struct {
 	List []*BaseFromOilchemIndexReq
 }
 
 func GetBaseFromOilchemIndex() (list []*BaseFromOilchemIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_oilchem_index group by index_name `
-	_, err = o.Raw(sql).QueryRows(&list)
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql).Find(&list).Error
 	return
 }
 
 func GetBaseFromOilchemData(indexCode, dataTime string) (item *BaseFromOilchemData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_oilchem_data where index_code=? And data_time = ? `
-	err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
+	//err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
 	return
 }
 
 // UpdateBaseFromSci99Data
-func UpdateBaseFromOilchemData(value , indexCode, dataTime string) (err error) {
-	o := orm.NewOrm()
+func UpdateBaseFromOilchemData(value, indexCode, dataTime string) (err error) {
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_sci99_data SET value=?,modify_time=NOW() WHERE index_code = ? AND data_time = ? `
-	_, err = o.Raw(sql, value, indexCode, dataTime).Exec()
+	//_, err = o.Raw(sql, value, indexCode, dataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, value, indexCode, dataTime).Error
 	return
-}
+}

+ 10 - 6
models/base_from_pb.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -17,11 +17,12 @@ type EdbDataFromPb struct {
 }
 
 func AddEdbDataFromPb(edbCode string, item *EdbDataFromPb) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if len(item.Date) > 0 {
 		var isAdd bool
 		dateMap := item.Date
 		addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,ticker,field,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		nowStr := time.Now().Format(utils.FormatDateTime)
 		for k, v := range dateMap {
 			timeStr := fmt.Sprintf("%d", v)
@@ -52,7 +53,8 @@ func AddEdbDataFromPb(edbCode string, item *EdbDataFromPb) (err error) {
 		}
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return
 			}
@@ -63,7 +65,7 @@ func AddEdbDataFromPb(edbCode string, item *EdbDataFromPb) (err error) {
 
 // 刷新彭博指标数据
 func RefreshEdbDataFromPb(edbInfoId int, edbCode, startDate string, item *EdbDataFromPb) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	source := utils.DATA_SOURCE_PB
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
@@ -73,7 +75,7 @@ func RefreshEdbDataFromPb(edbInfoId int, edbCode, startDate string, item *EdbDat
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -101,6 +103,7 @@ func RefreshEdbDataFromPb(edbInfoId int, edbCode, startDate string, item *EdbDat
 		dateMap := item.Date
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,ticker,field,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		nowStr := time.Now().Format(utils.FormatDateTime)
 		for k, v := range dateMap {
 			timeStr := fmt.Sprintf("%d", v)
@@ -158,7 +161,8 @@ func RefreshEdbDataFromPb(edbInfoId int, edbCode, startDate string, item *EdbDat
 
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				fmt.Println("RefreshAllEdbDataByPb add Err", err.Error())
 				return

+ 8 - 6
models/base_from_pb_finance.go

@@ -1,16 +1,16 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 func AddEdbDataFromPbFinance(edbCode string, item *EdbDataFromPb) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if len(item.Date) > 0 {
 		var isAdd bool
 		dateMap := item.Date
@@ -34,7 +34,8 @@ func AddEdbDataFromPbFinance(edbCode string, item *EdbDataFromPb) (err error) {
 		}
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return
 			}
@@ -45,7 +46,7 @@ func AddEdbDataFromPbFinance(edbCode string, item *EdbDataFromPb) (err error) {
 
 // 刷新彭博指标数据
 func RefreshEdbDataFromPbFinance(edbInfoId int, edbCode, startDate string, item *EdbDataFromPb) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	source := utils.DATA_SOURCE_PB_FINANCE
 	subSource := utils.DATA_SUB_SOURCE_DATE
 
@@ -55,7 +56,7 @@ func RefreshEdbDataFromPbFinance(edbInfoId int, edbCode, startDate string, item
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -135,7 +136,8 @@ func RefreshEdbDataFromPbFinance(edbInfoId int, edbCode, startDate string, item
 
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				fmt.Println("RefreshAllEdbDataByPbFinance add Err", err.Error())
 				return

+ 346 - 0
models/base_from_purang_index.go

@@ -0,0 +1,346 @@
+package models
+
+import (
+	"bytes"
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// BaseFromPurang 普兰金融
+type BaseFromPurang struct{}
+
+type BaseFromPurangData struct {
+	BaseFromPurangDataId  int `gorm:"column:base_from_purang_data_id;primaryKey"`
+	BaseFromPurangIndexId int
+	IndexCode              string
+	DataTime               time.Time
+	Value                  string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	DataTimestamp          int64
+}
+
+func GetBaseFromPurangDataByCondition(condition string, pars []interface{}) (list []*BaseFromPurangData, err error) {
+	sql := `SELECT * FROM base_from_purang_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
+	return
+}
+
+// Add 添加
+func (obj BaseFromPurang) Add(edbCode string) (err error) {
+	var condition string
+	var pars []interface{}
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+	purangBaseDataAll, err := GetBaseFromPurangDataByCondition(condition, pars)
+	if err != nil && !utils.IsErrNoRow(err) {
+		return
+	}
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_purang(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	length := len(purangBaseDataAll)
+	existMap := make(map[string]struct{}, length)
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	var buffer bytes.Buffer
+	buffer.WriteString(addSql)
+	for i := 0; i < length; i++ {
+		sv := purangBaseDataAll[i]
+		eDate := sv.DataTime.Format(utils.FormatDate)
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			return err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			sqlTmp := GetAddSqlV2("0", edbCode, eDate, timeStr, sv.Value, nowStr)
+			buffer.WriteString(sqlTmp)
+			isAdd = true
+		}
+		existMap[eDate] = struct{}{}
+	}
+	if isAdd {
+		addSql = buffer.String()
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// Refresh 刷新普兰金融指标数据
+func (obj BaseFromPurang) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
+	source := obj.GetSource()
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	PurangDataList, err := GetBaseFromPurangDataByCondition(condition, pars)
+	if err != nil {
+		return
+	}
+
+	// 真实数据的最大日期  , 插入规则配置的日期
+	var realDataMaxDate, edbDataInsertConfigDate time.Time
+	var edbDataInsertConfig *EdbDataInsertConfig
+	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
+	{
+		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			return
+		}
+		if edbDataInsertConfig != nil {
+			edbDataInsertConfigDate = edbDataInsertConfig.Date
+		}
+	}
+
+	var existCondition string
+	var existPars []interface{}
+
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	if startDate != "" {
+		existCondition += " AND data_time>=? "
+		existPars = append(existPars, startDate)
+	}
+
+	existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+	addSql := ` INSERT INTO edb_data_purang(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	for _, v := range PurangDataList {
+		item := v
+		eDate := item.DataTime.Format(utils.FormatDate)
+		dataTime := item.DataTime
+		if findItem, ok := existMap[eDate]; !ok {
+			sValue := item.Value
+
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+
+			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+			isAdd = true
+		} else {
+			if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
+				err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+
+		// 下面代码主要目的是处理掉手动插入的数据判断
+		{
+			if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
+				realDataMaxDate = dataTime
+			}
+			if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
+				isFindConfigDateRealData = true
+			}
+		}
+	}
+
+	// 处理手工数据补充的配置
+	HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
+			return
+		}
+	}
+	return
+}
+
+// GetSource 获取来源编码id
+func (obj BaseFromPurang) GetSource() int {
+	return utils.DATA_SOURCE_PuRang
+}
+
+// GetSourceName 获取来源名称
+func (obj BaseFromPurang) GetSourceName() string {
+	return utils.DATA_SOURCE_NAME_PuRang
+}
+
+type BaseFromPurangIndex struct {
+	BaseFromPurangIndexId int64 `gorm:"column:base_from_purang_index_id;primaryKey"`
+	IndexCode              string
+	IndexName              string
+	Frequency              string
+	Unit                   string
+	StartDate              time.Time
+	EndDate                time.Time
+	ClassifyId             int64
+	Sort                   int
+	BaseFileName           string
+	RenameFileName         string
+	TerminalCode           string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+}
+
+type BaseFromPurangIndexList struct {
+	BaseFromPurangIndexId int64 `gorm:"column:base_from_purang_index_id;primaryKey"`
+	IndexCode              string
+	IndexName              string
+	Frequency              string
+	Unit                   string
+	Sort                   int
+	ClassifyId             int64
+	StartDate              time.Time
+	EndDate                time.Time
+	TerminalCode           string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+}
+
+func (y *BaseFromPurangData) GetByIndexCode(indexCode string) (list []*BaseFromPurangData, err error) {
+	sql := ` SELECT * FROM base_from_purang_data WHERE index_code=? `
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
+	return
+}
+
+func (y *BaseFromPurangData) AddMulti(item []*BaseFromPurangData) (err error) {
+	err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
+	return
+}
+
+// Update 修改
+func (y *BaseFromPurangData) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
+	return
+}
+
+// HandlePurangExcelData 涌益咨询的excel数据
+type HandlePurangExcelData struct {
+	ClassifyName       string `description:"指标目录"`
+	ParentClassifyName string `description:"父级指标目录"`
+	ClassifySort       int    `description:"指标目录排序号"`
+	IndexName          string `description:"指标名称"`
+	IndexCode          string `description:"指标编码"`
+	Unit               string `description:"单位"`
+	Sort               int    `description:"排序号"`
+	Frequency          string `description:"频度"`
+	ExcelDataMap       map[string]string
+}
+
+type HandlePurangExcelDataReq struct {
+	List         []*HandlePurangExcelData
+	TerminalCode string `description:"编码"`
+}
+
+func (y *BaseFromPurangData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_purang_data WHERE index_code=? `
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	sql = ` SELECT value AS latest_value FROM %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	sql = fmt.Sprintf(sql, "base_from_purang_data")
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+	return
+}
+
+func (y *BaseFromPurangIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	sql := ` UPDATE base_from_purang_index SET start_date=?,end_date=?, end_value=?, modify_time=NOW() WHERE index_code=? `
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
+	return
+}
+
+func (y *BaseFromPurangIndex) GetByIndexCode(indexCode string) (item *BaseFromPurangIndex, err error) {
+	sql := ` SELECT * FROM base_from_purang_index WHERE index_code=? `
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	return
+}
+
+func (y *BaseFromPurangIndex) Add() (lastId int64, err error) {
+	err = global.DEFAULT_DB.Create(&y).Error
+	if err != nil {
+		return
+	}
+	lastId = y.BaseFromPurangIndexId
+	return
+}
+
+// Update 修改
+func (y *BaseFromPurangIndex) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
+	return
+}
+
+// BaseFromPurangClassify Purang原始数据分类表
+type BaseFromPurangClassify struct {
+	ClassifyId      int64     `gorm:"column:classify_id;primaryKey"`
+	ClassifyName    string    `description:"分类名称"`
+	ClassifyNameEn  string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
+}
+
+func (y *BaseFromPurangClassify) Add() (lastId int64, err error) {
+	err = global.DEFAULT_DB.Create(&y).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(y.ClassifyId)
+	return
+}
+
+// Update 修改
+func (y *BaseFromPurangClassify) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
+	return
+}
+
+func (y *BaseFromPurangClassify) GetByClassifyName(classifyName string) (item *BaseFromPurangClassify, err error) {
+	sql := ` SELECT * FROM base_from_purang_classify WHERE classify_name=? `
+	err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
+	return
+}
+
+func (y *BaseFromPurangClassify) GetParentClassify() (items []*BaseFromPurangClassify, err error) {
+	sql := ` SELECT * FROM base_from_purang_classify WHERE parent_id=0 `
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
+	return
+} 

+ 39 - 19
models/base_from_python.go

@@ -2,18 +2,20 @@ package models
 
 import (
 	"errors"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/services/alarm_msg"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
 	"strings"
 	"time"
 )
 
 // EdbDataPython python指标数据结构体
 type EdbDataPython struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbDataId int `gorm:"column:edb_data_id;primaryKey"`
+	//EdbDataId     int `orm:"column(edb_data_id);pk"`
 	EdbInfoId     int
 	EdbCode       string
 	DataTime      string
@@ -23,6 +25,12 @@ type EdbDataPython struct {
 	DataTimestamp int64
 }
 
+func (e *EdbDataPython) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 // EdbDataFromPython 通过python代码获取到的指标数据
 type EdbDataFromPython struct {
 	Date  map[int]string  `json:"date"`
@@ -31,7 +39,7 @@ type EdbDataFromPython struct {
 
 // AddPythonEdb 新增python运算指标
 func AddPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython, edbInfoList []*EdbInfo) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	//添加指标关系
 	for _, tmpEdbInfo := range edbInfoList {
@@ -48,7 +56,8 @@ func AddPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython, edbInfoList []*EdbIn
 		calculateMappingItem.FromSourceName = tmpEdbInfo.SourceName
 		calculateMappingItem.Source = edbInfo.Source
 		calculateMappingItem.SourceName = edbInfo.SourceName
-		_, err = o.Insert(calculateMappingItem)
+		//_, err = o.Insert(calculateMappingItem)
+		err = global.DEFAULT_DB.Create(&calculateMappingItem).Error
 		if err != nil {
 			return
 		}
@@ -56,6 +65,7 @@ func AddPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython, edbInfoList []*EdbIn
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_python (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	for k, dateTimeStr := range item.Date {
 		//格式化时间
 		currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, dateTimeStr, time.Local)
@@ -76,7 +86,8 @@ func AddPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython, edbInfoList []*EdbIn
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return
 		}
@@ -86,9 +97,10 @@ func AddPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython, edbInfoList []*EdbIn
 
 // EditPythonEdb 编辑python运算指标
 func EditPythonEdb(edbInfoId int, edbCode string, item EdbDataFromPython) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_python (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	for k, dateTimeStr := range item.Date {
 		//格式化时间
 		currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, dateTimeStr, time.Local)
@@ -109,7 +121,8 @@ func EditPythonEdb(edbInfoId int, edbCode string, item EdbDataFromPython) (err e
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return
 		}
@@ -119,8 +132,9 @@ func EditPythonEdb(edbInfoId int, edbCode string, item EdbDataFromPython) (err e
 
 // RefreshAllPythonEdb 刷新所有 python运算指标
 func RefreshAllPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython) (err error) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
+	//o := orm.NewOrm()
+	//to, err := o.Begin()
+	to := global.DEFAULT_DB.Begin()
 	if err != nil {
 		return
 	}
@@ -196,7 +210,8 @@ func RefreshAllPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython) (err error) {
 		}
 		//最后如果还有需要新增的数据,那么就统一入库
 		if len(addDataList) > 0 {
-			_, tmpErr := o.InsertMulti(len(addDataList), addDataList)
+			//_, tmpErr := o.InsertMulti(len(addDataList), addDataList)
+			tmpErr := to.CreateInBatches(addDataList, len(addDataList)).Error
 			if tmpErr != nil {
 				err = tmpErr
 				return
@@ -207,13 +222,14 @@ func RefreshAllPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython) (err error) {
 	//删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
 	{
 		if len(removeDateList) > 0 {
-			removeDateStr := strings.Join(removeDateList, `","`)
-			removeDateStr = `"` + removeDateStr + `"`
+			removeDateStr := strings.Join(removeDateList, `','`)
+			removeDateStr = `'` + removeDateStr + `'`
 			//如果拼接指标变更了,那么需要删除所有的指标数据
 			tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
 			sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
 
-			_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
+			//_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
+			err = to.Exec(sql, edbInfo.EdbInfoId).Error
 			if err != nil {
 				err = errors.New("删除不存在的Python运算指标数据失败,Err:" + err.Error())
 				return
@@ -227,7 +243,8 @@ func RefreshAllPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython) (err error) {
 		for edbDate, edbDataValue := range updateEdbDataMap {
 			sql := fmt.Sprintf(` UPDATE  %s set value = ?,modify_time=now() WHERE edb_info_id = ? and data_time = ? `, tableName)
 
-			_, err = o.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
+			//_, err = o.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
+			err = to.Exec(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Error
 			if err != nil {
 				err = errors.New("更新现有的Python运算指标数据失败,Err:" + err.Error())
 				return
@@ -239,7 +256,7 @@ func RefreshAllPythonEdb(edbInfo *EdbInfo, item EdbDataFromPython) (err error) {
 
 // EditEdbInfoCalculateMapping 更新关联关系表
 func EditEdbInfoCalculateMapping(edbInfo *EdbInfo, edbInfoList []*EdbInfo) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var existCondition string
 	var existPars []interface{}
@@ -281,7 +298,8 @@ func EditEdbInfoCalculateMapping(edbInfo *EdbInfo, edbInfoList []*EdbInfo) (err
 			calculateMappingItem.FromSourceName = tmpEdbInfo.SourceName
 			calculateMappingItem.Source = edbInfo.Source
 			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = o.Insert(calculateMappingItem)
+			//_, err = o.Insert(calculateMappingItem)
+			err = global.DEFAULT_DB.Create(&calculateMappingItem).Error
 			if err != nil {
 				return
 			}
@@ -291,7 +309,8 @@ func EditEdbInfoCalculateMapping(edbInfo *EdbInfo, edbInfoList []*EdbInfo) (err
 	for _, v := range existEdbInfoIdMap {
 		//删除,计算指标关联的,基础指标的关联关系
 		sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id=?`
-		_, err = o.Raw(sql, edbInfo.EdbInfoId, v).Exec()
+		//_, err = o.Raw(sql, edbInfo.EdbInfoId, v).Exec()
+		err = global.DEFAULT_DB.Exec(sql, edbInfo.EdbInfoId, v).Error
 		if err != nil {
 			err = errors.New("删除计算指标关联关系失败,Err:" + err.Error())
 			return
@@ -302,9 +321,10 @@ func EditEdbInfoCalculateMapping(edbInfo *EdbInfo, edbInfoList []*EdbInfo) (err
 
 // GetAllEdbDataPythonByEdbInfoId 根据指标id获取全部的数据
 func GetAllEdbDataPythonByEdbInfoId(edbInfoId int) (items []*EdbDataPython, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM edb_data_python WHERE edb_info_id=? ORDER BY data_time DESC `
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	//_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, edbInfoId).Find(&items).Error
 	return
 }
 

+ 435 - 0
models/base_from_radish_research.go

@@ -0,0 +1,435 @@
+package models
+
+import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"gorm.io/gorm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// BaseFromRadishResearch 萝卜投研
+type BaseFromRadishResearch struct{}
+
+type BaseFromRadishResearchData struct {
+	BaseFromRadishResearchDataId  int `gorm:"column:base_from_radish_research_data_id;primaryKey"`
+	BaseFromRadishResearchIndexId int
+	IndexCode                     string
+	DataTime                      string
+	Value                         string
+	CreateTime                    time.Time
+	ModifyTime                    time.Time
+	DataTimestamp                 int64
+}
+
+func (m *BaseFromRadishResearchData) TableName() string {
+	return "base_from_radish_research_data"
+}
+
+func (e *BaseFromRadishResearchData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+	return
+}
+
+func GetBaseFromRadishResearchDataByCondition(condition string, pars []interface{}) (list []*BaseFromRadishResearchData, err error) {
+	sql := `SELECT * FROM base_from_radish_research_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
+	return
+}
+
+// Add 添加
+func (obj BaseFromRadishResearch) Add(edbCode string) (err error) {
+	var condition string
+	var pars []interface{}
+	if edbCode != "" {
+		condition += " AND index_code = ? "
+		pars = append(pars, edbCode)
+	}
+	dataList, err := GetBaseFromRadishResearchDataByCondition(condition, pars)
+	if err != nil {
+		return
+	}
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_radish_research(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
+	existMap := make(map[string]string)
+	for _, sv := range dataList {
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			return err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
+			isAdd = true
+		}
+		existMap[eDate] = sv.Value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// Refresh 刷新萝卜投研指标数据
+func (obj BaseFromRadishResearch) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
+	source := obj.GetSource()
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	var condition string
+	var pars []interface{}
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+	dataList, e := GetBaseFromRadishResearchDataByCondition(condition, pars)
+	if e != nil {
+		err = fmt.Errorf("GetBaseFromRadishResearchDataByCondition err: %v", e)
+		return
+	}
+
+	// 真实数据的最大日期  , 插入规则配置的日期
+	var realDataMaxDate, edbDataInsertConfigDate time.Time
+	var edbDataInsertConfig *EdbDataInsertConfig
+	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
+	{
+		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
+		if err != nil && !utils.IsErrNoRow(err) {
+			return
+		}
+		if edbDataInsertConfig != nil {
+			edbDataInsertConfigDate = edbDataInsertConfig.Date
+		}
+	}
+
+	var existCondition string
+	var existPars []interface{}
+
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	if startDate != "" {
+		existCondition += " AND data_time>=? "
+		existPars = append(existPars, startDate)
+	}
+
+	existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+	addSql := ` INSERT INTO edb_data_radish_research(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
+	var isAdd bool
+	for _, v := range dataList {
+		item := v
+		eDate := item.DataTime
+		dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+		if err != nil {
+			return err
+		}
+		if findItem, ok := existMap[v.DataTime]; !ok {
+			sValue := item.Value
+
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+
+			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+			isAdd = true
+		} else {
+			if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
+				err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+
+		// 下面代码主要目的是处理掉手动插入的数据判断
+		{
+			if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
+				realDataMaxDate = dataTime
+			}
+			if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
+				isFindConfigDateRealData = true
+			}
+		}
+	}
+
+	// 处理手工数据补充的配置
+	HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		if err != nil {
+			fmt.Println("BaseFromRadishResearch add Err", err.Error())
+			return
+		}
+	}
+	return
+}
+
+// GetSource 获取来源编码id
+func (obj BaseFromRadishResearch) GetSource() int {
+	return utils.DATA_SOURCE_RADISH_RESEARCH
+}
+
+// GetSourceName 获取来源名称
+func (obj BaseFromRadishResearch) GetSourceName() string {
+	return utils.DATA_SOURCE_NAME_RADISH_RESEARCH
+}
+
+type BaseFromRadishResearchIndex struct {
+	BaseFromRadishResearchIndexId int `gorm:"column:base_from_radish_research_index_id;primaryKey"`
+	IndexCode                     string
+	IndexName                     string
+	Frequency                     string
+	Unit                          string
+	Source                        string `description:"数据来源"`
+	ClassifyId                    int
+	StartDate                     string
+	EndDate                       string
+	Sort                          int
+	TerminalCode                  string
+	FilePath                      string
+	LatestValue                   float64
+	CreateTime                    time.Time
+	ModifyTime                    time.Time
+}
+
+func (e *BaseFromRadishResearchIndex) AfterFind(db *gorm.DB) (err error) {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+	return
+}
+
+func (m *BaseFromRadishResearchIndex) TableName() string {
+	return "base_from_radish_research_index"
+}
+
+func (m *BaseFromRadishResearchIndex) Add() (lastId int64, err error) {
+	err = global.DEFAULT_DB.Create(&m).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(m.BaseFromRadishResearchIndexId)
+	return
+}
+
+func (m *BaseFromRadishResearchIndex) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
+	return
+}
+
+func (m *BaseFromRadishResearchIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	sql := ` UPDATE base_from_radish_research_index SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
+	return
+}
+
+func (m *BaseFromRadishResearchIndex) GetByIndexCode(indexCode string) (item *BaseFromRadishResearchIndex, err error) {
+	sql := ` SELECT * FROM base_from_radish_research_index WHERE index_code = ? `
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	return
+}
+
+func (m *BaseFromRadishResearchIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromRadishResearchIndex, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_radish_research_index WHERE 1=1 %s %s`, fields, condition, order)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+type BaseFromRadishResearchIndexList struct {
+	RadishResearchIndexId int64 `gorm:"column:ccf_index_id;primaryKey"`
+	IndexCode             string
+	IndexName             string
+	Frequency             string
+	Unit                  string
+	ClassifyId            int
+	StartDate             string
+	EndDate               string
+	TerminalCode          string
+	CreateTime            string
+	ModifyTime            string
+}
+
+func (m *BaseFromRadishResearchData) GetByIndexCode(indexCode string) (list []*BaseFromRadishResearchData, err error) {
+	sql := ` SELECT * FROM base_from_radish_research_data WHERE index_code=? `
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
+	return
+}
+
+func (m *BaseFromRadishResearchData) AddMulti(item []*BaseFromRadishResearchData) (err error) {
+	err = global.DEFAULT_DB.CreateInBatches(&item, utils.MultiAddNum).Error
+	return
+}
+
+// HandleRadishResearchEdbData 萝卜投研的指标数据
+type HandleRadishResearchEdbData struct {
+	IndexName    string            `description:"指标名称"`
+	IndexCode    string            `description:"指标编码"`
+	ClassifyId   int               `description:"分类ID"`
+	Unit         string            `description:"单位"`
+	Source       string            `description:"数据来源"`
+	Sort         int               `description:"排序"`
+	Frequency    string            `description:"频度"`
+	ExcelDataMap map[string]string `description:"指标数据"`
+}
+
+type HandleRadishResearchEdbDataReq struct {
+	List         []*HandleRadishResearchEdbData
+	TerminalCode string `description:"终端编码"`
+	FilePath     string `description:"文件存储路径"`
+}
+
+type HandleRadishResearchTableData struct {
+	ClassifyId   int       `description:"分类ID"`
+	FromPage     string    `description:"表格来源"`
+	TableDate    time.Time `description:"表格日期"`
+	TableContent string    `description:"表格HTML"`
+}
+
+type HandleRadishResearchStockTableReq struct {
+	Table        *HandleRadishResearchTableData
+	TerminalCode string `description:"编码"`
+}
+
+func (m *BaseFromRadishResearchData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_radish_research_data WHERE index_code=? `
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	sql = ` SELECT value AS latest_value FROM base_from_radish_research_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+	return
+}
+
+// BaseFromRadishResearchClassify 萝卜投研数据分类表
+type BaseFromRadishResearchClassify struct {
+	ClassifyId      int       `gorm:"column:classify_id;primaryKey"`
+	ClassifyName    string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
+}
+
+func (m *BaseFromRadishResearchClassify) Add() (lastId int64, err error) {
+	err = global.DEFAULT_DB.Create(&m).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(m.ClassifyId)
+	return
+}
+
+func (m *BaseFromRadishResearchClassify) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_DB.Model(&m).Select(updateCols).Updates(&m).Error
+	return
+}
+
+func (m *BaseFromRadishResearchClassify) GetByClassifyName(classifyName string) (item *BaseFromRadishResearchClassify, err error) {
+	sql := ` SELECT * FROM base_from_ccf_classify WHERE classify_name=? `
+	err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
+	return
+}
+
+func (m *BaseFromRadishResearchClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromRadishResearchClassify, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM base_from_ccf_classify WHERE 1=1 %s %s`, fields, condition, order)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// BaseFromRadishResearchClassifyItem 萝卜投研数据分类信息
+type BaseFromRadishResearchClassifyItem struct {
+	ClassifyId   int                        `description:"分类ID"`
+	ClassifyName string                     `description:"分类名称"`
+	ParentId     int                        `description:"父级id"`
+	Level        int                        `description:"层级"`
+	Sort         int                        `description:"排序字段"`
+	CreateTime   string                     `description:"创建时间"`
+	ModifyTime   string                     `description:"修改时间"`
+	Child        []*BaseFromCCFClassifyItem `description:"子分类"`
+}
+
+func (m *BaseFromRadishResearchClassify) Format2Item(origin *BaseFromRadishResearchClassify) (item *BaseFromCCFClassifyItem) {
+	if origin == nil {
+		return
+	}
+	item = new(BaseFromCCFClassifyItem)
+	item.ClassifyId = origin.ClassifyId
+	item.ClassifyName = origin.ClassifyName
+	item.ParentId = origin.ParentId
+	item.Level = origin.Level
+	item.Sort = origin.Sort
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}
+
+// MultiUpdateBaseFromRadishResearchDataValue 批量更新萝卜投研指标数据
+func MultiUpdateBaseFromRadishResearchDataValue(items []*BaseFromRadishResearchData) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	to := global.DEFAULT_DB.Begin()
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := `UPDATE base_from_radish_research_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
+	for _, v := range items {
+		if v.IndexCode == "" || v.DataTime == "" {
+			continue
+		}
+		err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 42 - 0
models/base_from_rzd_classify.go

@@ -0,0 +1,42 @@
+// @Author gmy 2024/8/7 9:26:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+)
+
+type BaseFromRzdClassify struct {
+	BaseFromRzdClassifyId int `gorm:"column:base_from_rzd_classify_id;primaryKey"`
+	//BaseFromRzdClassifyId int    `orm:"column(base_from_rzd_classify_id);pk"`
+	CreateTime     string `gorm:"column:create_time"`
+	ModifyTime     string `gorm:"column:modify_time"`
+	ClassifyName   string `gorm:"column:classify_name"`
+	ParentId       int    `gorm:"column:parent_id"`
+	Sort           int    `gorm:"column:sort"`
+	ClassifyNameEn string `gorm:"column:classify_name_en"`
+}
+
+// GetRzdClassifyByName 根据分类名称查询
+func GetRzdClassifyByName(classifyName string) (item *BaseFromRzdClassify, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_rzd_classify WHERE classify_name=?`
+	//err = o.Raw(sql, classifyName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}
+
+// AddRzdClassify 新增分类
+func AddRzdClassify(classify *BaseFromRzdClassify) (int64, error) {
+	//o := orm.NewOrm()
+	//id, err := o.Insert(classify)
+	err := global.DEFAULT_DB.Create(&classify).Error
+	if err != nil {
+		return 0, err
+	}
+	id := int64(classify.BaseFromRzdClassifyId)
+	return id, nil
+}

+ 147 - 0
models/base_from_rzd_data.go

@@ -0,0 +1,147 @@
+// @Author gmy 2024/10/21 9:50:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"gorm.io/gorm"
+)
+
+type BaseFromRzdData struct {
+	BaseFromRzdDataId int `gorm:"column:base_from_rzd_data_id;primaryKey"`
+	//BaseFromRzdDataId  int     `orm:"column(base_from_rzd_data_id);pk"`
+	BaseFromRzdIndexId int     `gorm:"column:base_from_rzd_index_id"`
+	CreateTime         string  `gorm:"column:create_time"`
+	DataTime           string  `gorm:"column:data_time"`
+	IndexCode          string  `gorm:"column:index_code"`
+	ModifyTime         string  `gorm:"column:modify_time"`
+	Value              float64 `gorm:"column:value"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromRzdData) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+	m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+
+	return
+}
+
+func (m *BaseFromRzdData) ConvDateTimeStr() {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+	m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+
+	return
+}
+
+// AddRzdDataList 批量插入数据记录列表
+func AddRzdDataList(items []BaseFromRzdData) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
+
+	return
+}
+
+// GetRzdDataByIndexCodeAndDataTime 根据指标id和数据日期查询数据
+func GetRzdDataByIndexCodeAndDataTime(indexCode string, dataTime string) (item BaseFromRzdData, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_rzd_data WHERE index_code=? AND data_time=?`
+	//err = o.Raw(sql, indexCode, dataTime).QueryRow(&items) // 使用 QueryRow
+	err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return item, nil
+	}
+	if err != nil {
+		return item, err
+	}
+	item.ConvDateTimeStr()
+
+	return
+}
+
+// UpdateRzdDataById 根据主键id更新数据
+func UpdateRzdDataById(dataId int, value float64) (err error) {
+	//o := orm.NewOrm()
+	sql := `UPDATE base_from_rzd_data SET value=? WHERE base_from_rzd_data_id=?`
+	//_, err = o.Raw(sql, value, dataId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, value, dataId).Error
+	return
+}
+
+// GetBaseFromRzdDataByCondition 添加查询
+func GetBaseFromRzdDataByCondition(condition string, pars []interface{}) (items []BaseFromRzdData, err error) {
+	sql := `SELECT * FROM base_from_rzd_data WHERE 1=1 `
+	//o := orm.NewOrm()
+	if condition != "" {
+		sql += condition
+	}
+	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+	return
+}
+
+// UpdateRzdData 修改睿姿得数据
+func UpdateRzdData(item *BaseFromRzdData) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.Update(item)
+	err = global.DEFAULT_DB.Save(&item).Error
+	return
+}
+
+// GetRzdDataMaxAndMinDateByIndexCodes 查询数据时间最新值,数据时间最小值和最新值对应的value值
+func GetRzdDataMaxAndMinDateByIndexCodes(indexCodes []string) (resultMap map[string]*EdbInfoMaxAndMinInfo, err error) {
+	resultMap = make(map[string]*EdbInfoMaxAndMinInfo)
+
+	//o := orm.NewOrm()
+	sql := ` SELECT index_code, MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_rzd_data WHERE index_code in (` + utils.GetOrmInReplace(len(indexCodes)) + `) GROUP BY index_code`
+	var items []EdbInfoMaxAndMinInfo
+	//_, err = o.Raw(sql, indexCodes).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCodes).Find(&items).Error
+	if err != nil {
+		return nil, err
+	}
+
+	for _, row := range items {
+		resultMap[row.IndexCode] = &EdbInfoMaxAndMinInfo{
+			MinDate:  row.MinDate,
+			MaxDate:  row.MaxDate,
+			MinValue: row.MinValue,
+			MaxValue: row.MaxValue,
+		}
+	}
+
+	// 查询最新的值(最新数据时间对应的 value)
+	sql = `SELECT a.index_code, a.value AS latest_value
+        FROM base_from_rzd_data a
+        JOIN (
+            SELECT index_code, MAX(data_time) AS latest_time
+            FROM base_from_rzd_data
+            WHERE index_code IN (` + utils.GetOrmInReplace(len(indexCodes)) + `)
+            GROUP BY index_code
+        ) b ON a.index_code = b.index_code AND a.data_time = b.latest_time`
+	//_, err = o.Raw(sql, indexCodes).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCodes).Find(&items).Error
+	if err != nil {
+		return nil, err
+	}
+	for _, row := range items {
+		if _, ok := resultMap[row.IndexCode]; ok {
+			resultMap[row.IndexCode].LatestValue = row.LatestValue
+		}
+	}
+
+	return resultMap, nil
+}
+
+func UpdateRzdEdbDataByIndexCodes(indexCode string, info *EdbInfoMaxAndMinInfo) error {
+	//o := orm.NewOrm()
+	sql := `UPDATE base_from_rzd_index SET start_date=?, end_date=?, latest_value=? WHERE index_code=?`
+	//_, err := o.Raw(sql, info.MinDate, info.MaxDate, info.LatestValue, indexCode).Exec()
+	err := global.DEFAULT_DB.Exec(sql, info.MinDate, info.MaxDate, info.LatestValue, indexCode).Error
+	return err
+}

+ 56 - 0
models/base_from_rzd_index.go

@@ -0,0 +1,56 @@
+// Package models
+// @Author gmy 2024/8/7 9:38:00
+package models
+
+import (
+	"eta/eta_index_lib/global"
+	"eta/eta_index_lib/utils"
+	"time"
+)
+
+type BaseFromRzdIndex struct {
+	BaseFromRzdIndexId    int       `gorm:"column:base_from_rzd_index_id;type:int(11);primaryKey;not null;"`
+	CreateTime            time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;not null;default:CURRENT_TIMESTAMP;"`             // 创建时间
+	ModifyTime            time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;not null;default:CURRENT_TIMESTAMP;"`             // 修改时间
+	BaseFromRzdClassifyId int       `gorm:"column:base_from_rzd_classify_id;type:int(11) UNSIGNED;comment:原始数据指标分类id;not null;default:0;"` // 原始数据指标分类id
+	IndexCode             string    `gorm:"column:index_code;type:varchar(255);comment:指标编码;"`                                             // 指标编码
+	IndexName             string    `gorm:"column:index_name;type:varchar(255);comment:指标名称;"`                                             // 指标名称
+	Frequency             string    `gorm:"column:frequency;type:varchar(20);comment:频度;"`                                                 // 频度
+	Unit                  string    `gorm:"column:unit;type:varchar(30);comment:单位;"`                                                      // 单位
+	StartDate             time.Time `gorm:"column:start_date;type:date;comment:数据开始日期;default:NULL;"`                                      // 数据开始日期
+	EndDate               time.Time `gorm:"column:end_date;type:date;comment:数据结束日期;default:NULL;"`                                        // 数据结束日期
+	LatestValue           float64   `gorm:"column:latest_value;type:double;comment:数据最新值;default:NULL;"`                                   // 数据最新值
+}
+
+// AddRzdIndexList 批量插入指标记录列表
+func AddRzdIndexList(items []*BaseFromRzdIndex) (err error) {
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
+	return
+}
+
+// AddRzdIndex 添加指标
+func AddRzdIndex(item *BaseFromRzdIndex) (int64, error) {
+	//o := orm.NewOrm()
+	//id, err := o.Insert(item)
+	err := global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return 0, err
+	}
+	id := int64(item.BaseFromRzdIndexId)
+	return id, nil
+}
+
+// GetRzdIndexByCode 查询指标编码是否存在
+func GetRzdIndexByCode(indexCode string) (item *BaseFromRzdIndex, err error) {
+	//o := orm.NewOrm()
+	sql := `SELECT * FROM base_from_rzd_index WHERE index_code=?`
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	if utils.IsErrNoRow(err) {
+		return nil, nil
+	}
+
+	return
+}

+ 55 - 40
models/base_from_sci.go

@@ -1,17 +1,18 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 type BaseFromSciData struct {
-	SciDataId          int `orm:"column(sci_data_id);pk"`
+	SciDataId int `gorm:"column:sci_data_id;primaryKey"`
+	//SciDataId          int `orm:"column(sci_data_id);pk"`
 	BaseFromSciIndexId int
 	IndexCode          string
 	DataTime           string
@@ -21,44 +22,51 @@ type BaseFromSciData struct {
 	DataTimestamp      int64
 }
 
+func (e *BaseFromSciData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 // Update 修改
 func (r *BaseFromSciData) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(r, updateCols...)
-
+	//o := orm.NewOrm()
+	//_, err = o.Update(r, updateCols...)
+	err = global.DEFAULT_DB.Model(&r).Select(updateCols).Updates(&r).Error
 	return
 }
 
 // GetIndexDataList 获取所有的指标数据
 func (r *BaseFromSciData) GetIndexDataList(indexCode string) (items []*BaseFromSciData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci_data WHERE 1=1 AND index_code = ? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
-
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
 	return
 }
 
 // BatchAdd 批量添加指标
 func (r *BaseFromSciData) BatchAdd(list []*BaseFromSciData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(list), list)
-
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(list), list)
+	err = global.DEFAULT_DB.CreateInBatches(list, len(list)).Error
 	return
 }
 
 func GetBaseFromSciDataByCondition(condition string, pars []interface{}) (list []*BaseFromSciData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 // AddEdbDataFromSci 新增卓创(红桃3)指标数据
 func AddEdbDataFromSci(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -67,11 +75,12 @@ func AddEdbDataFromSci(edbCode string) (err error) {
 		pars = append(pars, edbCode)
 	}
 	sciBaseDataAll, err := GetBaseFromSciDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_sci(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 	for _, sv := range sciBaseDataAll {
 		eDate := sv.DataTime
@@ -90,7 +99,8 @@ func AddEdbDataFromSci(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -103,7 +113,7 @@ func RefreshEdbDataFromSci(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_SCI
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -133,7 +143,7 @@ func RefreshEdbDataFromSci(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -160,6 +170,7 @@ func RefreshEdbDataFromSci(edbInfoId int, edbCode, startDate string) (err error)
 		existMap[v.DataTime] = v
 	}
 	addSql := ` INSERT INTO edb_data_sci(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range sciDataList {
 		item := v
@@ -201,7 +212,8 @@ func RefreshEdbDataFromSci(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromSci add Err", err.Error())
 			return
@@ -223,18 +235,20 @@ type HandleSciExcelDataReq struct {
 
 // BaseFromSciIndex 红桃3指标表格
 type BaseFromSciIndex struct {
-	BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"  json:"base_from_sci_index_id"` //序号
-	ClassifyId         int       `gorm:"column:classify_id" json:"classify_id"`
-	IndexCode          string    `gorm:"column:index_code" json:"index_code" description:"指标编码"`
-	IndexName          string    `gorm:"column:index_name" json:"index_name" description:"指标名称"`
-	Frequency          string    `gorm:"column:frequency" json:"frequency"`
-	Unit               string    `gorm:"column:unit" json:"unit"`
-	StartDate          time.Time `gorm:"column:start_date" json:"start_date"`
-	EndDate            time.Time `gorm:"column:end_date" json:"end_date"`
-	CreateTime         time.Time `gorm:"autoCreateTime;column:create_time" json:"create_time"`       //创建时间
-	ModifyTime         time.Time `gorm:"autoUpdateTime:milli;column:modify_time" json:"modify_time"` //最后更新时间
-	FilePath           string    `gorm:"column:file_path" json:"file_path"`                          // 文件路径
-	TerminalCode       string    `gorm:"column:terminal_code" json:"terminal_code"`                  // 指标编码
+	BaseFromSciIndexId int `gorm:"column:base_from_sci_index_id;primaryKey"  json:"base_from_sci_index_id"` //序号
+	//BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"  json:"base_from_sci_index_id"` //序号
+	ClassifyId   int       `gorm:"column:classify_id" json:"classify_id"`
+	IndexCode    string    `gorm:"column:index_code" json:"index_code" description:"指标编码"`
+	IndexName    string    `gorm:"column:index_name" json:"index_name" description:"指标名称"`
+	Frequency    string    `gorm:"column:frequency" json:"frequency"`
+	Unit         string    `gorm:"column:unit" json:"unit"`
+	StartDate    time.Time `gorm:"column:start_date" json:"start_date"`
+	EndDate      time.Time `gorm:"column:end_date" json:"end_date"`
+	CreateTime   time.Time `gorm:"autoCreateTime;column:create_time" json:"create_time"`       //创建时间
+	ModifyTime   time.Time `gorm:"autoUpdateTime:milli;column:modify_time" json:"modify_time"` //最后更新时间
+	FilePath     string    `gorm:"column:file_path" json:"file_path"`                          // 文件路径
+	TerminalCode string    `gorm:"column:terminal_code" json:"terminal_code"`                  // 指标编码
+	LatestValue  float64   `gorm:"column:latest_value" json:"latest_value"`                    // 数据最新值
 }
 
 // TableName get sql table name.获取数据库表名
@@ -244,24 +258,25 @@ func (r *BaseFromSciIndex) TableName() string {
 
 // Update 修改
 func (r *BaseFromSciIndex) Update(updateCols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(r, updateCols...)
-
+	//o := orm.NewOrm()
+	//_, err = o.Update(r, updateCols...)
+	err = global.DEFAULT_DB.Model(&r).Select(updateCols).Updates(&r).Error
 	return
 }
 
 // GetAllIndex 获取所有的指标
 func (r *BaseFromSciIndex) GetAllIndex() (items []*BaseFromSciIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci_index WHERE 1=1 `
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 // BatchAdd 批量添加指标
 func (r *BaseFromSciIndex) BatchAdd(list []*BaseFromSciIndex) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(list), list)
-
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(list), list)
+	err = global.DEFAULT_DB.CreateInBatches(list, len(list)).Error
 	return
 }

+ 118 - 45
models/base_from_sci99.go

@@ -1,9 +1,11 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -11,20 +13,25 @@ import (
 
 // BaseFromSci99Index 代表卓创资讯-原始指标表的结构
 type BaseFromSci99Index struct {
-	BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"` // 主键,自动递增
-	IndexCode          string    // 指标编码
-	IndexName          string    // 指标名称
-	ClassifyId         int       // 分类Id
-	Unit               string    // 单位
-	Frequency          string    // 频度
-	Describe           string    // 指标描述
-	CreateTime         time.Time // 创建时间
-	ModifyTime         time.Time // 修改时间
+	BaseFromSciIndexId int `gorm:"column:base_from_sci_index_id;primaryKey"` // 主键,自动递增
+	//BaseFromSciIndexId int       `orm:"column(base_from_sci_index_id);pk"` // 主键,自动递增
+	IndexCode   string    // 指标编码
+	IndexName   string    // 指标名称
+	ClassifyId  int       // 分类Id
+	Unit        string    // 单位
+	Frequency   string    // 频度
+	Describe    string    // 指标描述
+	CreateTime  time.Time // 创建时间
+	ModifyTime  time.Time // 修改时间
+	StartDate   time.Time `gorm:"column:start_date"`
+	EndDate     time.Time `gorm:"column:end_date"`
+	LatestValue float64   `gorm:"column:latest_value"` // 数据最新值
 }
 
 // BaseFromSci99Data 代表卓创资讯-原始指标数据表的结构
 type BaseFromSci99DataItem struct {
-	BaseFromSciDataId  int       `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
+	BaseFromSciDataId int `gorm:"column:base_from_sci_data_id;primaryKey"` // 主键,自动递增
+	//BaseFromSciDataId  int       `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
 	BaseFromSciIndexId int       // 指标id
 	IndexCode          string    // 指标编码
 	DataTime           string    // 数据日期
@@ -33,80 +40,110 @@ type BaseFromSci99DataItem struct {
 	ModifyTime         time.Time // 修改时间
 }
 
+func (e *BaseFromSci99DataItem) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 // BaseFromSci99Data 代表卓创资讯-原始指标数据表的结构
 type BaseFromSci99Data struct {
-	BaseFromSciDataId  int       `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
+	BaseFromSciDataId int `gorm:"column:base_from_sci_data_id;primaryKey"` // 主键,自动递增
+	//BaseFromSciDataId  int       `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
 	BaseFromSciIndexId int       // 指标id
 	IndexCode          string    // 指标编码
 	DataTime           string    // 数据日期
-	Value              float64    // 数据值
+	Value              float64   // 数据值
 	CreateTime         time.Time // 创建时间
 	ModifyTime         time.Time // 修改时间
 }
 
+func (e *BaseFromSci99Data) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 // BaseFromSci99Classify 代表卓创资讯-原始指标分类表的结构
 type BaseFromSci99Classify struct {
-	BaseFromSciClassifyId int       `orm:"column(base_from_sci_classify_id);pk"` // 主键,自动递增
-	ClassifyName          string    // 分类名称
-	Sort                  int       // 排序
-	CreateTime            time.Time // 创建时间
-	ModifyTime            time.Time // 修改时间
+	BaseFromSciClassifyId int `gorm:"column:base_from_sci_classify_id;primaryKey"` // 主键,自动递增
+	//BaseFromSciClassifyId int       `orm:"column(base_from_sci_classify_id);pk"` // 主键,自动递增
+	ClassifyName string    // 分类名称
+	Sort         int       // 排序
+	CreateTime   time.Time // 创建时间
+	ModifyTime   time.Time // 修改时间
 }
 
 func GetBaseFromSci99DataDataByCondition(condition string, pars []interface{}) (item []*BaseFromIcpiData, err error) {
 	sql := ` SELECT * FROM base_from_sci99_data WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
+
 	return
 }
 
 // 添加数据
 func AddBaseFromSci99Index(item *BaseFromSci99Index) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromSciIndexId)
 	return
 }
 
 func AddBaseFromSci99Classify(item *BaseFromSci99Classify) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromSciClassifyId)
 	return
 }
 
 func AddBaseFromSci99DataMulti(item []*BaseFromSci99Data) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(1000, item)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(1000, item)
+	err = global.DEFAULT_DB.CreateInBatches(&item, 1000).Error
 	return
 }
 
 func GetBaseFromSci99Index() (list []*BaseFromSci99Index, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci99_index `
-	_, err = o.Raw(sql).QueryRows(&list)
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql).Find(&list).Error
 	return
 }
 
 func GetBaseFromSci99DataByIndexCode(indexCode string) (items []*BaseFromSci99DataItem, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci99_data WHERE index_code=? `
-	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&items).Error
 	return
 }
 
 // 新增卓创资讯指标数据
 func AddEdbDataFromSci99(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	dataAll, err := GetBaseFromSci99DataByIndexCode(edbCode)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_sci99(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 
 	for _, sv := range dataAll {
@@ -126,7 +163,8 @@ func AddEdbDataFromSci99(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -139,7 +177,7 @@ func RefreshEdbDataFromSci99(edbInfoId int, edbCode, startDate string) (err erro
 	source := utils.DATA_SOURCE_SCI99
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -169,7 +207,7 @@ func RefreshEdbDataFromSci99(edbInfoId int, edbCode, startDate string) (err erro
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -198,6 +236,7 @@ func RefreshEdbDataFromSci99(edbInfoId int, edbCode, startDate string) (err erro
 	}
 
 	addSql := ` INSERT INTO edb_data_sci99(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	var isAdd bool
 	for _, v := range dataList {
 		item := v
@@ -244,7 +283,8 @@ func RefreshEdbDataFromSci99(edbInfoId int, edbCode, startDate string) (err erro
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -253,29 +293,62 @@ func RefreshEdbDataFromSci99(edbInfoId int, edbCode, startDate string) (err erro
 }
 
 func GetBaseFromSci99Classify() (list []*BaseFromSci99Classify, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci99_classify `
-	_, err = o.Raw(sql).QueryRows(&list)
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql).Find(&list).Error
 	return
 }
 
 func GetBaseFromTradeSci99DataAll(indexCode string) (list []*BaseFromSci99Data, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci99_data where index_code=?`
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	///_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 func GetBaseFromTradeSci99LatestData(indexCode string) (date time.Time, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT data_time FROM base_from_sci99_data where index_code=? ORDER BY data_time DESC limit 1 `
-	err = o.Raw(sql, indexCode).QueryRow(&date)
+	//err = o.Raw(sql, indexCode).QueryRow(&date)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&date).Error
 	return
 }
 
 // UpdateBaseFromSci99Data
 func UpdateBaseFromSci99Data(value float64, indexCode, dataTime string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_sci99_data SET value=?,modify_time=NOW() WHERE index_code = ? AND data_time = ? `
-	_, err = o.Raw(sql, value, indexCode, dataTime).Exec()
+	//_, err = o.Raw(sql, value, indexCode, dataTime).Exec()
+	err = global.DEFAULT_DB.Exec(sql, value, indexCode, dataTime).Error
 	return
-}
+}
+
+func (m *BaseFromSci99Index) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	//o := orm.NewOrm()
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_sci99_data WHERE index_code=? `
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 获取最新值
+	sql = ` SELECT value AS latest_value FROM base_from_sci99_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+
+	return
+}
+
+func (m *BaseFromSci99Index) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
+	//o := orm.NewOrm()
+	sql := ` UPDATE base_from_sci99_index SET start_date=?,end_date=?,latest_value=?,modify_time=NOW() WHERE index_code=? `
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
+	return
+}

+ 62 - 33
models/base_from_sci_hq.go

@@ -1,35 +1,37 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 func GetBaseFromSciHqDataByCondition(condition string, pars []interface{}) (list []*BaseFromSciHqData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci_hq_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 func GetBaseFromSciHqDataByIndexCode(indexCode string) (list []*BaseFromSciHqData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci_hq_data WHERE 1=1 AND index_code=?`
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 // AddEdbDataFromSciHq 新增卓创红期指标数据
 func AddEdbDataFromSciHq(edbCode string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	var condition string
 	var pars []interface{}
@@ -38,7 +40,7 @@ func AddEdbDataFromSciHq(edbCode string) (err error) {
 		pars = append(pars, edbCode)
 	}
 	sciBaseDataAll, err := GetBaseFromSciHqDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 	var isAdd bool
@@ -61,7 +63,8 @@ func AddEdbDataFromSciHq(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -74,7 +77,7 @@ func RefreshEdbDataFromSciHq(edbInfoId int, edbCode, startDate string) (err erro
 	source := utils.DATA_SOURCE_SCI_HQ
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
 	//计算数据
 	var condition string
@@ -101,7 +104,7 @@ func RefreshEdbDataFromSciHq(edbInfoId int, edbCode, startDate string) (err erro
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -169,7 +172,8 @@ func RefreshEdbDataFromSciHq(edbInfoId int, edbCode, startDate string) (err erro
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromSci add Err", err.Error())
 			return
@@ -190,7 +194,7 @@ type HandleSciHqExcelDataReq struct {
 }
 
 type BaseFromSciHqIndex struct {
-	BaseFromSciHqIndexId int       `orm:"column(base_from_sci_hq_index_id);pk"` //序号
+	BaseFromSciHqIndexId int       `gorm:"column:base_from_sci_hq_index_id;primaryKey"` //序号
 	IndexCode            string    `description:"指标编码"`
 	IndexName            string    `description:"指标名称"`
 	ClassifyId           int       `description:"分类id"`
@@ -205,22 +209,31 @@ type BaseFromSciHqIndex struct {
 	ModifyTime           time.Time `description:"更新时间"`
 }
 
+func (e *BaseFromSciHqIndex) AfterFind(db *gorm.DB) (err error) {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+
+	return
+}
+
 func GetAllBaseFromSciHqIndex() (items []*BaseFromSciHqIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_sci_hq_index`
-	_, err = o.Raw(sql).QueryRows(&items)
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
 func BatchAddBaseFromSciHqIndex(list []*BaseFromSciHqIndex) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(list), list)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(list), list)
+	err = global.DEFAULT_DB.CreateInBatches(list, len(list)).Error
 	return
 }
 
 type BaseFromSciHqData struct {
-	SciHqDataId          int       `orm:"column(sci_hq_data_id);pk"`         //序号
-	BaseFromSciHqIndexId int       `orm:"column(base_from_sci_hq_index_id)"` //指标id
+	SciHqDataId          int       `gorm:"column:sci_hq_data_id;primaryKey"` //序号
+	BaseFromSciHqIndexId int       `gorm:"column:base_from_sci_hq_index_id"` //指标id
 	IndexCode            string    `description:"指标编码"`
 	DataTime             string    `description:"数据时间"`
 	Value                string    `description:"数据值"`
@@ -229,45 +242,61 @@ type BaseFromSciHqData struct {
 	DataTimestamp        int64     `description:"数据时间戳"`
 }
 
+func (e *BaseFromSciHqData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 func (r *BaseFromSciHqData) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(r, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(r, cols...)
+	err = global.DEFAULT_DB.Model(&r).Select(cols).Updates(&r).Error
 	return
 }
 
 func BatchAddBaseFromSciHqData(list []*BaseFromSciHqData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(500, list)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(500, list)
+	err = global.DEFAULT_DB.CreateInBatches(list, utils.MultiAddNum).Error
 	return
 }
 
+type LatestStruct struct {
+	LatestValue float64   `gorm:"column:latest_value"`
+	LatestDate  time.Time `gorm:"column:latest_date"`
+}
+
 func GetSciHqIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_sci_hq_data WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
-
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	if err != nil {
 		return
 	}
 
 	// 获取最新值
-	var latest_value float64
-	var latestDate string
+	//var latest_value float64
+	//var latestDate string
 
 	sql = ` SELECT value AS latest_value, data_time AS latest_date FROM base_from_sci_hq_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
-	err = o.Raw(sql, indexCode).QueryRow(&latest_value, &latestDate)
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value, &latestDate)
+	var latestStruct LatestStruct
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&latestStruct).Error
 	if err != nil {
 		return
 	}
-	item.LatestValue = latest_value
-	item.LatestDate = latestDate
+	item.LatestValue = latestStruct.LatestValue
+	item.LatestDate = latestStruct.LatestDate.Format(utils.FormatDate)
 
 	return
 }
 
 func ModifySciHqIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_sci_hq_index SET start_date=?,end_date=?,latest_value=?,latest_date=?,modify_time=NOW() WHERE index_code=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, item.LatestDate, indexCode).Exec()
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, item.LatestDate, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, item.LatestDate, indexCode).Error
 	return
 }

+ 76 - 42
models/base_from_sh.go

@@ -1,42 +1,52 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromTradeShIndex struct {
-	BaseFromTradeShIndexId int `orm:"column(base_from_trade_shanghai_index_id);pk"`
-	Rank                   int
-	DealShortName          string
-	DealName               string
-	DealCode               string
-	DealValue              string
-	DealChange             int
-	BuyShortName           string
-	BuyName                string
-	BuyCode                string
-	BuyValue               string
-	BuyChange              int
-	SoldShortName          string
-	SoldName               string
-	SoldCode               string
-	SoldValue              string
-	SoldChange             int
-	Frequency              string
-	ClassifyName           string
-	ClassifyType           string
-	CreateTime             time.Time
-	ModifyTime             time.Time
-	DataTime               string
+	BaseFromTradeShIndexId int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
+	//BaseFromTradeShIndexId int `orm:"column(base_from_trade_shanghai_index_id);pk"`
+	Rank          int
+	DealShortName string
+	DealName      string
+	DealCode      string
+	DealValue     string
+	DealChange    int
+	BuyShortName  string
+	BuyName       string
+	BuyCode       string
+	BuyValue      string
+	BuyChange     int
+	SoldShortName string
+	SoldName      string
+	SoldCode      string
+	SoldValue     string
+	SoldChange    int
+	Frequency     string
+	ClassifyName  string
+	ClassifyType  string
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTime      string
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromTradeShIndex) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 type BaseFromShDataSimple struct {
-	Id        int `orm:"column(base_from_trade_shanghai_index_id);pk"`
+	Id int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
+	//Id        int `orm:"column(base_from_trade_shanghai_index_id);pk"`
 	DealCode  string
 	BuyCode   string
 	SoldCode  string
@@ -46,22 +56,31 @@ type BaseFromShDataSimple struct {
 	SoldValue string
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromShDataSimple) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 func GetBaseFromShDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_shanghai_index WHERE %s_code=? `
 	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 func GetShDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShDataSimple, err error) {
 	sql := ` SELECT * FROM base_from_trade_shanghai_index WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
@@ -76,10 +95,10 @@ func AddEdbDataFromSh(edbCode string) (err error) {
 		suffix = "sold"
 	}
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	shBaseDataAll, err := GetBaseFromShDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
@@ -117,7 +136,8 @@ func AddEdbDataFromSh(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -130,7 +150,7 @@ func RefreshEdbDataFromSh(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_SH
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -174,7 +194,7 @@ func RefreshEdbDataFromSh(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -257,7 +277,8 @@ func RefreshEdbDataFromSh(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -302,7 +323,7 @@ type SHMessage struct {
 }
 
 type BaseFromTradeShanghaiIndex struct {
-	BaseFromTradeShangHaiIndexId int `orm:"column(base_from_trade_shanghai_index_id);pk"`
+	BaseFromTradeShangHaiIndexId int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
 	Rank                         int
 	DealShortName                string
 	DealName                     string
@@ -327,22 +348,35 @@ type BaseFromTradeShanghaiIndex struct {
 	DataTime                     string
 }
 
+func (e *BaseFromTradeShanghaiIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 func AddBaseFromTradeShangHaiIndex(item *BaseFromTradeShanghaiIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromTradeShangHaiIndexId)
 	return
 }
 
 func GetBaseFromTradeShangHaiIndexAll(dateStr string) (list []*BaseFromTradeShanghaiIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_shanghai_index WHERE data_time=?`
-	_, err = o.Raw(sql, dateStr).QueryRows(&list)
+	//_, err = o.Raw(sql, dateStr).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, dateStr).Find(&list).Error
 	return
 }
 
 func ModifyBaseFromTradeShangHaiIndex(dealValue, buyValue, soldValue int, dataId int) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_trade_shanghai_index SET deal_value=?,buy_value=?,sold_value=?,modify_time=NOW() WHERE base_from_trade_shanghai_index_id=? `
-	_, err = o.Raw(sql, dealValue, buyValue, soldValue, dataId).Exec()
+	//_, err = o.Raw(sql, dealValue, buyValue, soldValue, dataId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, dealValue, buyValue, soldValue, dataId).Error
 	return
 }

+ 107 - 72
models/base_from_shfe.go

@@ -1,50 +1,61 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
 )
 
 type BaseFromTradeShfeIndex struct {
-	BaseFromTradeShfeIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
-	Rank                     int
-	DealShortName            string
-	DealName                 string
-	DealCode                 string
-	DealValue                string
-	DealChange               int
-	BuyShortName             string
-	BuyName                  string
-	BuyCode                  string
-	BuyValue                 string
-	BuyChange                int
-	SoldShortName            string
-	SoldName                 string
-	SoldCode                 string
-	SoldValue                string
-	SoldChange               int
-	Frequency                string
-	ClassifyName             string
-	ClassifyType             string
-	CreateTime               time.Time
-	ModifyTime               time.Time
-	DataTime                 string
+	BaseFromTradeShfeIndexId int `gorm:"column:base_from_trade_ine_index_id;primaryKey"`
+	//BaseFromTradeShfeIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
+	Rank          int
+	DealShortName string
+	DealName      string
+	DealCode      string
+	DealValue     string
+	DealChange    int
+	BuyShortName  string
+	BuyName       string
+	BuyCode       string
+	BuyValue      string
+	BuyChange     int
+	SoldShortName string
+	SoldName      string
+	SoldCode      string
+	SoldValue     string
+	SoldChange    int
+	Frequency     string
+	ClassifyName  string
+	ClassifyType  string
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTime      string
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *BaseFromTradeShfeIndex) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetBaseFromShfeDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShfeIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
 	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	//_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
 	return
 }
 
 type BaseFromShfeDataSimple struct {
-	Id        int `orm:"column(base_from_trade_ine_index_id);pk"`
+	Id int `gorm:"column(base_from_trade_ine_index_id);primaryKey"`
+	//Id        int `orm:"column(base_from_trade_ine_index_id);pk"`
 	DealCode  string
 	BuyCode   string
 	SoldCode  string
@@ -56,12 +67,13 @@ type BaseFromShfeDataSimple struct {
 
 func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) {
 	sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 `
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if condition != "" {
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
@@ -75,14 +87,15 @@ func AddEdbDataFromShfe(edbCode string) (err error) {
 	} else if strings.Contains(edbCode, "sold") {
 		suffix = "sold"
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	ineBaseDataAll, err := GetBaseFromShfeDataAllByIndexCode(edbCode, suffix)
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		return
 	}
 
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql = utils.ReplaceDriverKeywords("", addSql)
 	existMap := make(map[string]string)
 
 	for _, sv := range ineBaseDataAll {
@@ -115,7 +128,8 @@ func AddEdbDataFromShfe(edbCode string) (err error) {
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -128,7 +142,7 @@ func RefreshEdbDataFromShfe(edbInfoId int, edbCode, startDate string) (err error
 	source := utils.DATA_SOURCE_SHFE
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -172,7 +186,7 @@ func RefreshEdbDataFromShfe(edbInfoId int, edbCode, startDate string) (err error
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -255,7 +269,8 @@ func RefreshEdbDataFromShfe(edbInfoId int, edbCode, startDate string) (err error
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -264,69 +279,89 @@ func RefreshEdbDataFromShfe(edbInfoId int, edbCode, startDate string) (err error
 }
 
 type BaseFromTradeIneIndex struct {
-	BaseFromTradeIneIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
-	Rank                    int
-	DealShortName           string
-	DealName                string
-	DealCode                string
-	DealValue               int
-	DealChange              int
-	BuyShortName            string
-	BuyName                 string
-	BuyCode                 string
-	BuyValue                int
-	BuyChange               int
-	SoldShortName           string
-	SoldName                string
-	SoldCode                string
-	SoldValue               int
-	SoldChange              int
-	Frequency               string
-	ClassifyName            string
-	ClassifyType            string
-	CreateTime              time.Time
-	ModifyTime              time.Time
-	DataTime                string
+	BaseFromTradeIneIndexId int `gorm:"column:base_from_trade_ine_index_id;primaryKey"`
+	//BaseFromTradeIneIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
+	Rank          int
+	DealShortName string
+	DealName      string
+	DealCode      string
+	DealValue     int
+	DealChange    int
+	BuyShortName  string
+	BuyName       string
+	BuyCode       string
+	BuyValue      int
+	BuyChange     int
+	SoldShortName string
+	SoldName      string
+	SoldCode      string
+	SoldValue     int
+	SoldChange    int
+	Frequency     string
+	ClassifyName  string
+	ClassifyType  string
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTime      string
+}
+
+func (e *BaseFromTradeIneIndex) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
 }
 
 type BaseFromTradeMapping struct {
-	BaseFromTradeMappingId int `orm:"column(base_from_trade_mapping_id);pk"`
-	IndexName              string
-	IndexCode              string
-	Exchange               string
+	BaseFromTradeMappingId int `gorm:"column:base_from_trade_mapping_id;primaryKey"`
+	//BaseFromTradeMappingId int `orm:"column(base_from_trade_mapping_id);pk"`
+	IndexName string
+	IndexCode string
+	Exchange  string
 }
 
 func AddBaseFromTradeIneIndex(item *BaseFromTradeIneIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.BaseFromTradeIneIndexId)
 	return
 }
 
 func GetBaseFromTradeIneIndexAll(dateStr string) (list []*BaseFromTradeIneIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_ine_index where data_time=?`
-	_, err = o.Raw(sql, dateStr).QueryRows(&list)
+	//_, err = o.Raw(sql, dateStr).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, dateStr).Find(&list).Error
 	return
 }
 
 func ModifyBaseFromTradeIneIndex(dealValue, buyValue, soldValue int, dataId int) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `UPDATE base_from_trade_ine_index SET deal_value=?,buy_value=?,sold_value=?,modify_time=NOW() WHERE base_from_trade_ine_index_id=? `
-	_, err = o.Raw(sql, dealValue, buyValue, soldValue, dataId).Exec()
+	//_, err = o.Raw(sql, dealValue, buyValue, soldValue, dataId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, dealValue, buyValue, soldValue, dataId).Error
 	return
 }
 
 func GetIndexCodeFromMapping(exchange string) (list []*BaseFromTradeMapping, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_trade_mapping where exchange=?`
-	_, err = o.Raw(sql, exchange).QueryRows(&list)
+	sql = utils.ReplaceDriverKeywords("", sql)
+
+	//_, err = o.Raw(sql, exchange).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, exchange).Find(&list).Error
 	return
 }
 
 func AddBaseFromTradeMapping(indexName, indexCode, exchange string) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := "Insert Into base_from_trade_mapping(index_name,index_code,exchange) Values('" + indexName + "','" + indexCode + "','" + exchange + "')"
-	_, err = o.Raw(sql).Exec()
+	sql = utils.ReplaceDriverKeywords("", sql)
+	//_, err = o.Raw(sql).Exec()
+	err = global.DEFAULT_DB.Exec(sql).Error
 	return
 }
 

+ 194 - 101
models/base_from_smm.go

@@ -1,17 +1,19 @@
 package models
 
 import (
+	sql2 "database/sql"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
-
-	"github.com/beego/beego/v2/client/orm"
 )
 
 type BaseFromSmmData struct {
-	SmmDataId          int `orm:"column(smm_data_id);pk"`
+	SmmDataId int `gorm:"column:smm_data_id;primaryKey"`
+	//SmmDataId          int `orm:"column(smm_data_id);pk"`
 	BaseFromSmmIndexId int
 	IndexCode          string
 	DataTime           string
@@ -21,42 +23,68 @@ type BaseFromSmmData struct {
 	DataTimestamp      int64
 }
 
+func (e *BaseFromSmmData) AfterFind(db *gorm.DB) (err error) {
+	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+
+	return
+}
+
 func (s *BaseFromSmmData) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(s, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(s, cols...)
+	err = global.DEFAULT_DB.Model(&s).Select(cols).Updates(&s).Error
+
 	return
 }
 
 func AddBaseFromSmmData(item []*BaseFromSmmData) (err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(500, item)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(500, item)
+	err = global.DEFAULT_DB.CreateInBatches(item, utils.MultiAddNum).Error
 	return
 }
 
 func GetBaseFromSmmDataByCondition(condition string, pars []interface{}) (list []*BaseFromSmmData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_smm_data WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&list)
+	//_, err = o.Raw(sql, pars).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 	return
 }
 
 func UpdateBaseFromSmmDataListByIndexCode(items []*BaseFromSmmData) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
+	to := global.DEFAULT_DB.Begin()
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
 	sql := `UPDATE base_from_smm_data SET value=? WHERE index_code=? AND data_time=? `
-	stmt, err := o.Raw(sql).Prepare()
-	if err != nil {
-		return
-	}
-	defer stmt.Close()
 	for _, item := range items {
-		_, err = stmt.Exec(item.Value, item.IndexCode, item.DataTime)
+		err = to.Exec(sql, item.Value, item.IndexCode, item.DataTime).Error
 		if err != nil {
 			return
 		}
 	}
+	//stmt, err := o.Raw(sql).Prepare()
+	//if err != nil {
+	//	return
+	//}
+	//defer stmt.Close()
+	//for _, item := range items {
+	//	_, err = stmt.Exec(item.Value, item.IndexCode, item.DataTime)
+	//	if err != nil {
+	//		return
+	//	}
+	//}
+
 	return
 }
 
@@ -64,22 +92,25 @@ func GetBaseFromSmmDataByIds(smmDataIds []int) (list []*BaseFromSmmData, err err
 	if len(smmDataIds) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND base_from_smm_index_id in (` + utils.GetOrmInReplace(len(smmDataIds)) + `)`
-	_, err = o.Raw(sql, smmDataIds).QueryRows(&list)
+	//o := orm.NewOrm()
+	//sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND base_from_smm_index_id in (` + utils.GetOrmInReplace(len(smmDataIds)) + `)`
+	sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND base_from_smm_index_id in ?`
+	//_, err = o.Raw(sql, smmDataIds).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, smmDataIds).Find(&list).Error
 	return
 }
 
 func GetBaseFromSmmDataByCodeAndDate(indexCode string, dataTime string) (item *BaseFromSmmData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND index_code=? AND data_time=? `
-	err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
+	//err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
 	return
 }
 
 // 新增有色指标数据
 func AddEdbDataFromSmm(edbCode string, smmBaseDataAll []*BaseFromSmmData) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
 	existMap := make(map[string]string)
@@ -100,7 +131,8 @@ func AddEdbDataFromSmm(edbCode string, smmBaseDataAll []*BaseFromSmmData) (err e
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
 		utils.FileLog.Info("addSql:" + addSql)
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			return err
 		}
@@ -113,7 +145,7 @@ func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error)
 	source := utils.DATA_SOURCE_YS
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -143,7 +175,7 @@ func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error)
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -211,7 +243,8 @@ func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error)
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
+		//_, err = o.Raw(addSql).Exec()
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromSmm add Err", err.Error())
 			return
@@ -221,92 +254,114 @@ func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error)
 }
 
 type BaseFromSmmIndex struct {
-	BaseFromSmmIndexId int64 `orm:"column(base_from_smm_index_id);pk"`
-	ClassifyId         int
-	Interface          string
-	Name               string
-	IndexCode          string
-	IndexName          string
-	Type1              string `orm:"column(type_1)"`
-	Type2              string `orm:"column(type_2)"`
-	Type3              string `orm:"column(type_3)"`
-	Frequency          string
-	Unit               string
-	ApiStartTime       string
-	ApiUpdateTime      string
-	StartTime          string
-	FinishTime         string
-	BaseFileName       string
-	RenameFileName     string
-	StartDate          string
-	EndDate            string
-	TerminalCode       string `description:"编码"`
-	CreateTime         time.Time
-	ModifyTime         time.Time
-	DataState          string
-	ReleaseTime        string
+	BaseFromSmmIndexId int64 `gorm:"column:base_from_smm_index_id;primaryKey"`
+	//BaseFromSmmIndexId int64 `orm:"column(base_from_smm_index_id);pk"`
+	ClassifyId     int
+	Interface      string
+	Name           string
+	IndexCode      string
+	IndexName      string
+	Type1          string `gorm:"column:type_1"`
+	Type2          string `gorm:"column:type_2"`
+	Type3          string `gorm:"column:type_3"`
+	Frequency      string
+	Unit           string
+	ApiStartTime   string
+	ApiUpdateTime  string
+	StartTime      string
+	FinishTime     string
+	BaseFileName   string
+	RenameFileName string
+	StartDate      string
+	EndDate        string
+	TerminalCode   string `description:"编码"`
+	CreateTime     time.Time
+	ModifyTime     time.Time
+	DataState      string
+	ReleaseTime    string
+}
+
+func (e *BaseFromSmmIndex) AfterFind(db *gorm.DB) (err error) {
+	e.ApiStartTime = utils.GormDateStrToDateTimeStr(e.ApiStartTime)
+	e.ApiUpdateTime = utils.GormDateStrToDateTimeStr(e.ApiUpdateTime)
+	e.StartTime = utils.GormDateStrToDateTimeStr(e.StartTime)
+	e.FinishTime = utils.GormDateStrToDateTimeStr(e.FinishTime)
+
+	return
 }
 
 func (d *BaseFromSmmIndex) AddBaseFromSmmIndex() (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(d)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(d)
+	err = global.DEFAULT_DB.Create(&d).Error
+	if err != nil {
+		return
+	}
+	lastId = d.BaseFromSmmIndexId
 	return
 }
 
 func (d *BaseFromSmmIndex) GetSmmIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_smm_index WHERE index_code=? `
 
-	fmt.Println(sql, indexCode)
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//fmt.Println(sql, indexCode)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
 // Add 新增
 func (m *BaseFromSmmIndex) Add() (err error) {
-	o := orm.NewOrm()
-	_, err = o.Insert(m)
+	//o := orm.NewOrm()
+	//_, err = o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
+
 	return
 }
 
 func GetBaseFromSmmDataBySmmCode(smmCode string) (list []*BaseFromSmmData, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_smm_data WHERE index_code=? `
-	_, err = o.Raw(sql, smmCode).QueryRows(&list)
+	//_, err = o.Raw(sql, smmCode).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql, smmCode).Find(&list).Error
 	return
 }
 
 func ModifySmmIndexSort(baseFromSmmIndexId int64) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_smm_index SET sort=? WHERE base_from_smm_index_id=? `
-	_, err = o.Raw(sql, baseFromSmmIndexId, baseFromSmmIndexId).Exec()
+	//_, err = o.Raw(sql, baseFromSmmIndexId, baseFromSmmIndexId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, baseFromSmmIndexId, baseFromSmmIndexId).Error
 	return
 }
 
 func GetSmmIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_smm_data WHERE index_code=? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	if err != nil {
 		return
 	}
 
 	// 获取最新值
-	var latest_value float64
 	sql = ` SELECT value AS latest_value FROM base_from_smm_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
-	err = o.Raw(sql, indexCode).QueryRow(&latest_value)
-	if err != nil {
-		return
+	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
 	}
-	item.LatestValue = latest_value
 
 	return
 }
 
 func ModifySmmIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_smm_index SET start_date=?,end_date=?,end_value=?,modify_time=NOW() WHERE index_code=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
 	return
 }
 
@@ -329,24 +384,42 @@ func MultiUpdateBaseFromSmmDataValue(items []*BaseFromSmmData) (err error) {
 		return
 	}
 
-	o := orm.NewOrm()
-	sql := `UPDATE base_from_smm_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
-	p, err := o.Raw(sql).Prepare()
-	if err != nil {
-		return
-	}
+	//o := orm.NewOrm()
+	to := global.DEFAULT_DB.Begin()
 	defer func() {
-		_ = p.Close()
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
 	}()
+	sql := `UPDATE base_from_smm_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
 	for _, v := range items {
 		if v.IndexCode == "" || v.DataTime == "" {
 			continue
 		}
-		_, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
+		//_, err = o.Raw(sql, v.Value, v.IndexCode, v.DataTime).Exec()
+		err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
 		if err != nil {
 			return
 		}
 	}
+	//p, err := o.Raw(sql).Prepare()
+	//if err != nil {
+	//	return
+	//}
+	//defer func() {
+	//	_ = p.Close()
+	//}()
+	//for _, v := range items {
+	//	if v.IndexCode == "" || v.DataTime == "" {
+	//		continue
+	//	}
+	//	_, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
+	//	if err != nil {
+	//		return
+	//	}
+	//}
 	return
 }
 
@@ -358,22 +431,35 @@ type AddSmmIndexToDataSourceResp struct {
 }
 
 func (m *BaseFromSmmIndex) GetIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_smm_index WHERE index_code = ? `
-	err = o.Raw(sql, indexCode).QueryRow(&item)
+	//err = o.Raw(sql, indexCode).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
 	return
 }
 
 // 修改
 func (m *BaseFromSmmIndex) Update(updateParams, whereParam map[string]interface{}) (err error) {
-	to := orm.NewOrm()
-	ptrStructOrTableName := "base_from_smm_index"
+	//to := orm.NewOrm()
+	tx := global.DEFAULT_DB.Model(&BaseFromSmmIndex{})
+
+	//ptrStructOrTableName := "base_from_smm_index"
 
-	qs := to.QueryTable(ptrStructOrTableName)
+	//qs := to.QueryTable(ptrStructOrTableName)
+	//for expr, exprV := range whereParam {
+	//	qs = qs.Filter(expr, exprV)
+	//}
 	for expr, exprV := range whereParam {
-		qs = qs.Filter(expr, exprV)
+		tx = tx.Where(expr, exprV)
 	}
-	_, err = qs.Update(updateParams)
+	//_, err = qs.Update(updateParams)
+	// 执行更新操作
+	result := tx.Updates(updateParams)
+	if result.Error != nil {
+		err = fmt.Errorf("update err: %s", result.Error.Error())
+		return
+	}
+
 	return
 }
 
@@ -455,8 +541,9 @@ type SmmListResp struct {
 }
 
 func AddBaseFromSmmIndex(list []*BaseFromSmmIndex) (lastId int64, err error) {
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(list), list)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(list), list)
+	err = global.DEFAULT_DB.CreateInBatches(list, len(list)).Error
 	return
 }
 
@@ -467,29 +554,33 @@ type BridgeZhongJiIndexLatestDataParams struct {
 }
 
 func GetBaseFromSmmIndex() (list []*BaseFromSmmIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` SELECT * FROM base_from_smm_index`
-	_, err = o.Raw(sql).QueryRows(&list)
+	//_, err = o.Raw(sql).QueryRows(&list)
+	err = global.DEFAULT_DB.Raw(sql).Find(&list).Error
 	return
 }
 
 func ModifyBaseFromSmmIndex(item *BaseFromSmmIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_smm_index SET end_date = ?, modify_time=NOW(), data_state= ? `
-	_, err = o.Raw(sql, item.EndDate, item.DataState).Exec()
+	//_, err = o.Raw(sql, item.EndDate, item.DataState).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.EndDate, item.DataState).Error
 	return
 }
 
 func (m *BaseFromSmmIndex) UpdateCols(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, cols...)
+	err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func ModifyBaseFromSmmIndexDate(item *BaseFromSmmIndex) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := ` UPDATE base_from_smm_index SET end_date = ?, modify_time=NOW(), data_state= ? WHERE base_from_smm_index_id=?`
-	_, err = o.Raw(sql, item.EndDate, item.DataState, item.BaseFromSmmIndexId).Exec()
+	//_, err = o.Raw(sql, item.EndDate, item.DataState, item.BaseFromSmmIndexId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, item.EndDate, item.DataState, item.BaseFromSmmIndexId).Error
 	return
 }
 
@@ -524,7 +615,7 @@ func RefreshEdbDataFromSmmToEdb(edbInfoId int, edbCode, startDate string, smmDat
 	source := utils.DATA_SOURCE_YS
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -549,7 +640,7 @@ func RefreshEdbDataFromSmmToEdb(edbInfoId int, edbCode, startDate string, smmDat
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -617,7 +708,8 @@ func RefreshEdbDataFromSmmToEdb(edbInfoId int, edbCode, startDate string, smmDat
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshEdbDataFromSmm add Err", err.Error())
 			return
@@ -627,7 +719,7 @@ func RefreshEdbDataFromSmmToEdb(edbInfoId int, edbCode, startDate string, smmDat
 }
 
 type BaseFromSmmRecord struct {
-	BaseFromSmmRecordId int64 `orm:"column(base_from_smm_record_id);pk"`
+	BaseFromSmmRecordId int64 `gorm:"column:base_from_smm_record_id;primaryKey"`
 	BaseFromSmmIndexId  int64
 	OldIndexName        string    `description:"原始名称"`
 	NewIndexName        string    `description:"新的名称"`
@@ -636,7 +728,8 @@ type BaseFromSmmRecord struct {
 }
 
 func AddBaseFromSmmRecord(item *BaseFromSmmRecord) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//_, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
 	return
 }

+ 13 - 6
models/base_from_smm_classify.go

@@ -1,14 +1,15 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"time"
 )
 
 type BaseFromSmmClassify struct {
-	ClassifyId      int       `orm:"column(classify_id);pk"`
+	ClassifyId int `gorm:"column:classify_id;primaryKey"`
+	//ClassifyId      int       `orm:"column(classify_id);pk"`
 	ClassifyName    string    `description:"分类名称"`
 	ParentId        int       `description:"父级id"`
 	SysUserId       int       `description:"创建人id"`
@@ -20,8 +21,13 @@ type BaseFromSmmClassify struct {
 }
 
 func AddSmmClassify(item *BaseFromSmmClassify) (lastId int64, err error) {
-	o := orm.NewOrm()
-	lastId, err = o.Insert(item)
+	//o := orm.NewOrm()
+	//lastId, err = o.Insert(item)
+	err = global.DEFAULT_DB.Create(&item).Error
+	if err != nil {
+		return
+	}
+	lastId = int64(item.ClassifyId)
 	return
 }
 
@@ -35,9 +41,10 @@ type AddSmmClassifyReq struct {
 
 // 判断分类名称是否存在
 func GetSmmClassify(classifyName string, parentId int) (item *BaseFromSmmClassify, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := `SELECT * FROM base_from_smm_classify WHERE parent_id=? AND classify_name=? `
-	err = o.Raw(sql, parentId, classifyName).QueryRow(&item)
+	//err = o.Raw(sql, parentId, classifyName).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, parentId, classifyName).First(&item).Error
 	return
 }
 

+ 20 - 9
models/base_from_stock_plant.go

@@ -1,10 +1,11 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/models/supply_analysis"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -12,10 +13,18 @@ import (
 
 // StockPlantEdbdata 存量装置数据
 type StockPlantEdbdata struct {
-	VarietyEdbId string    `orm:"column(variety_edb_id);pk" description:"指标编码"`
-	DataTime     string    `orm:"column(data_time)" description:"日期"`
-	Value        string    `orm:"column(value)" description:"值"`
-	ModifyTime   time.Time `orm:"column(modify_time)" description:"修改时间"`
+	VarietyEdbId string `gorm:"column:variety_edb_id;primaryKey" description:"指标编码"`
+	//VarietyEdbId string    `orm:"column(variety_edb_id);pk" description:"指标编码"`
+	DataTime   string    `gorm:"column:data_time" description:"日期"`
+	Value      string    `gorm:"column:value" description:"值"`
+	ModifyTime time.Time `gorm:"column:modify_time" description:"修改时间"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *StockPlantEdbdata) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
 }
 
 func GetStockPlantEdbDataByCondition(condition string, pars []interface{}) (item []*StockPlantEdbdata, err error) {
@@ -24,8 +33,9 @@ func GetStockPlantEdbDataByCondition(condition string, pars []interface{}) (item
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	o := orm.NewOrm()
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+	//o := orm.NewOrm()
+	//_, err = o.Raw(sql, pars).QueryRows(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 
@@ -34,7 +44,7 @@ func RefreshEdbDataFromStockPlant(edbInfoId int, edbCode, startDate string) (err
 	source := utils.DATA_SOURCE_STOCK_PLANT
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	if err != nil {
 		return
 	}
@@ -121,7 +131,8 @@ func RefreshEdbDataFromStockPlant(edbInfoId int, edbCode, startDate string) (err
 	// 将数据入库
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
+		//_, err = o.Raw(addSql).Exec()
+		err = global.DEFAULT_DB.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshAllEdbDataByStockPlant add Err", err.Error())
 			return

+ 10 - 6
models/base_from_ths.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -26,7 +26,7 @@ type Tables struct {
 
 // 新增同花顺指标数据
 func AddEdbDataFromThs(edbCode string, item EdbDataFromThs) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 
 	if len(item.Tables) > 0 {
 		table := item.Tables[0]
@@ -34,6 +34,7 @@ func AddEdbDataFromThs(edbCode string, item EdbDataFromThs) (err error) {
 
 		var isAdd bool
 		addSql := ` INSERT INTO %s(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		tableName := GetEdbDataTableName(utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_EDB)
 		addSql = fmt.Sprintf(addSql, tableName)
 
@@ -51,7 +52,8 @@ func AddEdbDataFromThs(edbCode string, item EdbDataFromThs) (err error) {
 		}
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return
 			}
@@ -62,7 +64,7 @@ func AddEdbDataFromThs(edbCode string, item EdbDataFromThs) (err error) {
 
 // 刷新同花顺指标数据
 func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDataFromThs) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	source := utils.DATA_SOURCE_THS
 	subSource := utils.DATA_SUB_SOURCE_EDB
 
@@ -72,7 +74,7 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -104,6 +106,7 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 		table := item.Tables[0]
 		dataLen := len(table.Time)
 		addSql := ` INSERT INTO edb_data_ths(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		var isAdd bool
 		addMap := make(map[string]string)
 		edbInfoIdStr := strconv.Itoa(edbInfoId)
@@ -149,7 +152,8 @@ func RefreshEdbDataFromThs(edbInfoId int, edbCode, startDate string, item EdbDat
 
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}

+ 16 - 10
models/base_from_ths_ds.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"strconv"
 	"strings"
 	"time"
@@ -12,14 +12,15 @@ import (
 var thsds = "thsds"
 
 // 新增同花顺指标数据
-func AddEdbDataFromThsDs(stockCode,edbCode string, item EdbDataFromThs) (err error) {
-	o := orm.NewOrm()
+func AddEdbDataFromThsDs(stockCode, edbCode string, item EdbDataFromThs) (err error) {
+	//o := orm.NewOrm()
 
 	edbCodeList := strings.Split(edbCode, ",")
 	indexCodeMap := make(map[string]string)
 	if len(item.Tables) > 0 {
 		var isAdd bool
 		addSql := ` INSERT INTO edb_data_ths_ds(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		for k, table := range item.Tables {
 			dataLen := len(table.Value)
 			for i := 0; i < dataLen; i++ {
@@ -35,7 +36,7 @@ func AddEdbDataFromThsDs(stockCode,edbCode string, item EdbDataFromThs) (err err
 				}
 				timestamp := dataTime.UnixNano() / 1e6
 				timeStr := fmt.Sprintf("%d", timestamp)
-				indexCode := thsds+stockCode+code
+				indexCode := thsds + stockCode + code
 				indexCodeMap[indexCode] = indexCode
 				addSql += GetAddSql("0", indexCode, eDate, timeStr, utils.SubFloatToString(sValue, 20))
 				isAdd = true
@@ -45,13 +46,15 @@ func AddEdbDataFromThsDs(stockCode,edbCode string, item EdbDataFromThs) (err err
 			for _, v := range indexCodeMap {
 				var count int
 				sql := ` SELECT COUNT(1) FROM edb_data_ths_ds WHERE edb_code=? `
-				err = o.Raw(sql, v).QueryRow(&count)
+				//err = o.Raw(sql, v).QueryRow(&count)
+				err = global.DEFAULT_DB.Raw(sql, v).Scan(&count).Error
 				if err != nil {
 					return err
 				}
 				if count > 0 {
 					sql = ` DELETE FROM edb_data_ths_ds WHERE edb_code=? `
-					_, err = o.Raw(sql, v).Exec()
+					//_, err = o.Raw(sql, v).Exec()
+					err = global.DEFAULT_DB.Exec(sql, v).Error
 					if err != nil {
 						return err
 					}
@@ -59,7 +62,8 @@ func AddEdbDataFromThsDs(stockCode,edbCode string, item EdbDataFromThs) (err err
 			}
 
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return
 			}
@@ -70,7 +74,7 @@ func AddEdbDataFromThsDs(stockCode,edbCode string, item EdbDataFromThs) (err err
 
 // 刷新同花顺指标数据
 func RefreshEdbDataFromThsDs(edbInfoId int, edbCode, startDate string, item EdbDataFromThs) (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	source := utils.DATA_SOURCE_THS
 	subSource := utils.DATA_SUB_SOURCE_DATE
 
@@ -80,7 +84,7 @@ func RefreshEdbDataFromThsDs(edbInfoId int, edbCode, startDate string, item EdbD
 	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
 	{
 		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
+		if err != nil && !utils.IsErrNoRow(err) {
 			return
 		}
 		if edbDataInsertConfig != nil {
@@ -112,6 +116,7 @@ func RefreshEdbDataFromThsDs(edbInfoId int, edbCode, startDate string, item EdbD
 		table := item.Tables[0]
 		dataLen := len(table.Time)
 		addSql := ` INSERT INTO edb_data_ths_ds(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+		addSql = utils.ReplaceDriverKeywords("", addSql)
 		var isAdd bool
 		addMap := make(map[string]string)
 		edbInfoIdStr := strconv.Itoa(edbInfoId)
@@ -157,7 +162,8 @@ func RefreshEdbDataFromThsDs(edbInfoId int, edbCode, startDate string, item EdbD
 
 		if isAdd {
 			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
+			//_, err = o.Raw(addSql).Exec()
+			err = global.DEFAULT_DB.Exec(addSql).Error
 			if err != nil {
 				return err
 			}

+ 44 - 29
models/base_from_ths_hf.go

@@ -1,10 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/models/mgo"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"go.mongodb.org/mongo-driver/bson"
 	"strings"
 	"time"
@@ -18,7 +18,8 @@ var (
 
 // BaseFromThsHfIndex 同花顺高频数据
 type BaseFromThsHfIndex struct {
-	BaseFromThsHfIndexId    int       `orm:"column(base_from_ths_hf_index_id);pk"`
+	BaseFromThsHfIndexId int `gorm:"column:base_from_ths_hf_index_id;primaryKey"`
+	//BaseFromThsHfIndexId    int       `orm:"column(base_from_ths_hf_index_id);pk"`
 	BaseFromThsHfClassifyId int       `description:"分类ID"`
 	IndexCode               string    `description:"指标编码"`
 	IndexName               string    `description:"指标名称"`
@@ -96,12 +97,13 @@ func (m *BaseFromThsHfIndex) Cols() BaseFromThsHfIndexCols {
 }
 
 func (m *BaseFromThsHfIndex) Create() (err error) {
-	o := orm.NewOrm()
-	id, err := o.Insert(m)
-	if err != nil {
-		return
-	}
-	m.BaseFromThsHfIndexId = int(id)
+	//o := orm.NewOrm()
+	//id, err := o.Insert(m)
+	err = global.DEFAULT_DB.Create(&m).Error
+	//if err != nil {
+	//	return
+	//}
+	//m.BaseFromThsHfIndexId = int(id)
 	return
 }
 
@@ -109,21 +111,24 @@ func (m *BaseFromThsHfIndex) CreateMulti(items []*BaseFromThsHfIndex) (err error
 	if len(items) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	_, err = o.InsertMulti(len(items), items)
+	//o := orm.NewOrm()
+	//_, err = o.InsertMulti(len(items), items)
+	err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
 	return
 }
 
 func (m *BaseFromThsHfIndex) Update(cols []string) (err error) {
-	o := orm.NewOrm()
-	_, err = o.Update(m, cols...)
+	//o := orm.NewOrm()
+	//_, err = o.Update(m, cols...)
+	err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
 	return
 }
 
 func (m *BaseFromThsHfIndex) Remove() (err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	_, err = o.Raw(sql, m.BaseFromThsHfIndexId).Exec()
+	//_, err = o.Raw(sql, m.BaseFromThsHfIndexId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, m.BaseFromThsHfIndexId).Error
 	return
 }
 
@@ -131,9 +136,11 @@ func (m *BaseFromThsHfIndex) MultiRemove(ids []int) (err error) {
 	if len(ids) == 0 {
 		return
 	}
-	o := orm.NewOrm()
-	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
-	_, err = o.Raw(sql, ids).Exec()
+	//o := orm.NewOrm()
+	//sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	//_, err = o.Raw(sql, ids).Exec()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DEFAULT_DB.Exec(sql, ids).Error
 	return
 }
 
@@ -141,39 +148,43 @@ func (m *BaseFromThsHfIndex) RemoveByCondition(condition string, pars []interfac
 	if condition == "" {
 		return
 	}
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
-	_, err = o.Raw(sql, pars).Exec()
+	//_, err = o.Raw(sql, pars).Exec()
+	err = global.DEFAULT_DB.Exec(sql, pars...).Error
 	return
 }
 
 func (m *BaseFromThsHfIndex) GetItemById(id int) (item *BaseFromThsHfIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
-	err = o.Raw(sql, id).QueryRow(&item)
+	//err = o.Raw(sql, id).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, id).First(&item).Error
 	return
 }
 
 func (m *BaseFromThsHfIndex) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromThsHfIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	order := ``
 	if orderRule != "" {
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
-	err = o.Raw(sql, pars).QueryRow(&item)
+	//err = o.Raw(sql, pars).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, pars...).First(&item).Error
 	return
 }
 
 func (m *BaseFromThsHfIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
-	err = o.Raw(sql, pars).QueryRow(&count)
+	//err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
 func (m *BaseFromThsHfIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromThsHfIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -183,12 +194,14 @@ func (m *BaseFromThsHfIndex) GetItemsByCondition(condition string, pars []interf
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
+
 }
 
 func (m *BaseFromThsHfIndex) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromThsHfIndex, err error) {
-	o := orm.NewOrm()
+	//o := orm.NewOrm()
 	fields := strings.Join(fieldArr, ",")
 	if len(fieldArr) == 0 {
 		fields = `*`
@@ -198,7 +211,9 @@ func (m *BaseFromThsHfIndex) GetPageItemsByCondition(condition string, pars []in
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	//_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 

部分文件因为文件数量过多而无法显示