Browse Source

Merge branch 'dm' of http://8.136.199.33:3000/eta_server/eta_index_lib into dm

# Conflicts:
#	models/base_from_manual.go
#	models/base_from_mysteel.go
#	models/edb_data_trade_analysis.go
xyxie 2 weeks ago
parent
commit
2f634f2234
71 changed files with 456 additions and 265 deletions
  1. 1 1
      controllers/base_from_baiinfo.go
  2. 1 1
      controllers/base_from_bloomberg.go
  3. 1 1
      controllers/base_from_business.go
  4. 2 2
      controllers/base_from_calculate.go
  5. 1 1
      controllers/base_from_cffex.go
  6. 2 2
      controllers/base_from_clarksons.go
  7. 1 1
      controllers/base_from_coal.go
  8. 1 1
      controllers/base_from_ths.go
  9. 1 1
      controllers/base_from_usda_fas.go
  10. 1 1
      controllers/edb_info.go
  11. 2 2
      logic/predict_edb.go
  12. 2 2
      models/base_from_adjust.go
  13. 4 2
      models/base_from_bloomberg.go
  14. 6 1
      models/base_from_business.go
  15. 6 3
      models/base_from_business_data.go
  16. 7 3
      models/base_from_ccf.go
  17. 1 1
      models/base_from_clarksons.go
  18. 5 5
      models/base_from_coalmine.go
  19. 2 2
      models/base_from_com_trade.go
  20. 6 0
      models/base_from_dl.go
  21. 2 2
      models/base_from_eia_steo.go
  22. 1 1
      models/base_from_fenwei.go
  23. 7 4
      models/base_from_gpr_risk.go
  24. 6 6
      models/base_from_ly_index_record.go
  25. 2 2
      models/base_from_lz.go
  26. 4 4
      models/base_from_manual.go
  27. 5 5
      models/base_from_mtjh.go
  28. 5 4
      models/base_from_mysteel.go
  29. 7 7
      models/base_from_mysteel_chemical.go
  30. 7 1
      models/base_from_mysteel_chemical_classify.go
  31. 6 6
      models/base_from_rzd_classify.go
  32. 6 6
      models/base_from_rzd_data.go
  33. 5 5
      models/base_from_sci99.go
  34. 3 3
      models/base_from_sci_hq.go
  35. 1 1
      models/base_from_sh.go
  36. 9 9
      models/base_from_smm.go
  37. 3 3
      models/base_from_stock_plant.go
  38. 5 5
      models/base_from_ths_hf_data.go
  39. 7 3
      models/base_from_usda_fas.go
  40. 1 1
      models/business_conf.go
  41. 6 7
      models/calculate_residual_analysis_config.go
  42. 26 15
      models/calculate_residual_analysis_config_mapping.go
  43. 1 1
      models/data_stat/edb_info_delete_log.go
  44. 1 1
      models/data_stat/edb_source_stat.go
  45. 1 1
      models/edb_adjust_conf.go
  46. 6 1
      models/edb_classify.go
  47. 1 1
      models/edb_data_base.go
  48. 1 1
      models/edb_data_calculate_ljztbpj.go
  49. 27 23
      models/edb_data_calculate_zjpj.go
  50. 94 62
      models/edb_data_residual_analysis.go
  51. 2 2
      models/edb_data_trade_analysis.go
  52. 17 9
      models/edb_info.go
  53. 1 1
      models/edb_info_relation.go
  54. 1 1
      models/edb_refresh/edb_refresh_default_config.go
  55. 3 3
      models/excel/excel_info.go
  56. 1 1
      models/factor_edb_series_calculate_data_qjjs.go
  57. 1 1
      models/factor_edb_series_chart_mapping.go
  58. 1 1
      models/factor_edb_series_mapping.go
  59. 1 1
      models/future_good/future_good_edb_data.go
  60. 8 3
      models/future_good/future_good_edb_info.go
  61. 3 3
      models/predict_edb_conf.go
  62. 1 1
      models/predict_edb_data_calculate_ljztbpj.go
  63. 1 1
      models/predict_edb_data_calculate_nhcc.go
  64. 8 0
      models/predict_edb_info_rule.go
  65. 1 1
      models/supply_analysis/variety_edb_info.go
  66. 2 2
      models/trade_analysis/trade_analysis.go
  67. 1 1
      models/trade_analysis/trade_classify.go
  68. 2 2
      models/trade_analysis/trade_futures_company.go
  69. 74 7
      services/edb_data_calculate_stl.go
  70. 10 0
      utils/common.go
  71. 8 0
      utils/constants.go

+ 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

+ 1 - 1
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

+ 1 - 1
controllers/base_from_business.go

@@ -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

+ 2 - 2
controllers/base_from_calculate.go

@@ -898,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
@@ -1055,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

+ 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

+ 2 - 2
controllers/base_from_clarksons.go

@@ -40,7 +40,7 @@ func (this *ClarksonsDataController) ClarksonsData() {
 	//var indexMap = make(map[string]string)
 	var itemsIndex []*models.BaseFromClarksonsData
 	codeList, err := models.GetBaseFromClarksonsIndex()
-	if err != nil && err.Error() != utils.ErrNoRow() {
+	if err != nil && !utils.IsErrNoRow(err) {
 		utils.FileLog.Info("获取克拉克森指标失败:", err)
 		return
 	}
@@ -285,7 +285,7 @@ func (this *ClarksonsDataController) Refresh() {
 	}
 
 	err = models.RefreshEdbDataFromClarksons(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

+ 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

+ 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

+ 1 - 1
controllers/base_from_usda_fas.go

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

+ 1 - 1
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 = "判断指标是否存在失败!"

+ 2 - 2
logic/predict_edb.go

@@ -172,7 +172,7 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType st
 			return
 		}
 
-		if v.RuleType == 16 && endDateType != 1 {
+		if v.RuleType == 16 && endDateType == 1 {
 			errMsg = "年度值倒推不支持截止期数"
 			err = errors.New(errMsg)
 			return
@@ -577,7 +577,7 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string,
 			err = errors.New(errMsg)
 			return
 		}
-		if v.RuleType == 16 && endDateType != 1 {
+		if v.RuleType == 16 && endDateType == 1 {
 			errMsg = "年度值倒推不支持截止期数"
 			err = errors.New(errMsg)
 			return

+ 2 - 2
models/base_from_adjust.go

@@ -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
@@ -186,7 +186,7 @@ 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 = global.DEFAULT_DB.Where(sql, edbInfo.EdbInfoId).First(&edbAdjustConf).Error
+			err = global.DEFAULT_DB.Raw(sql, edbInfo.EdbInfoId).First(&edbAdjustConf).Error
 			if err != nil {
 				errMsg = "获取指标配置失败"
 				return

+ 4 - 2
models/base_from_bloomberg.go

@@ -167,9 +167,10 @@ func ModifyBaseFromBloombergIndexMinMax(indexCode string, item *EdbInfoMaxAndMin
 }
 
 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
@@ -183,6 +184,7 @@ func GetBloombergDataByCondition(condition string, pars []interface{}) (item []*
 	}
 	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)
+	sql = utils.ReplaceDriverKeywords("", sql)
 	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }

+ 6 - 1
models/base_from_business.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/models/mgo"
 	"eta/eta_index_lib/utils"
@@ -149,8 +150,12 @@ func (m *BaseFromBusinessIndex) DelIndexItemList(indexCodeList []string) (err er
 // @return err error
 func (m *BaseFromBusinessIndex) GetMaxId() (maxId int, err error) {
 	//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(&maxId).Error
+	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
 }

+ 6 - 3
models/base_from_business_data.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"errors"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
@@ -280,11 +281,13 @@ func (m *BaseFromBusinessData) GetEdbInfoMaxAndMinInfo(indexCode string) (result
 		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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValue).Error
-	result.LatestValue = 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
 }

+ 7 - 3
models/base_from_ccf.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -353,11 +354,14 @@ func (m *BaseFromCCFData) GetMaxAndMinDateByIndexCode(indexCode string) (item *E
 	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 = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
-	var latest_value float64
 	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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	item.LatestValue = 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
 }
 

+ 1 - 1
models/base_from_clarksons.go

@@ -24,7 +24,7 @@ type BaseFromClarksonsIndex struct {
 }
 
 type BaseFromClarksonsData struct {
-	BaseFromClarksonsDataId  int       `orm:"column(base_from_clarksons_data_id);pk"`
+	BaseFromClarksonsDataId  int       `gorm:"column:base_from_clarksons_data_id;primaryKey"`
 	BaseFromClarksonsIndexId int       `description:"指标id"`
 	IndexCode                string    `description:"指标编码"`
 	DataTime                 string    `description:"数据日期"`

+ 5 - 5
models/base_from_coalmine.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"gorm.io/gorm"
@@ -146,14 +147,13 @@ func (m *BaseFromCoalmineMapping) GetMaxAndMinDateByIndexCode(indexCode string)
 	}
 
 	// 获取最新值
-	var latest_value float64
 	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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	if err != nil {
-		return
+	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
 }

+ 2 - 2
models/base_from_com_trade.go

@@ -32,8 +32,8 @@ func GetComTradeIndex(indexCode string) (item *ComTradeCodeMapping, err error) {
 }
 
 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是不会触发该函数的来获取数据

+ 6 - 0
models/base_from_dl.go

@@ -37,6 +37,12 @@ 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()
 	sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `

+ 2 - 2
models/base_from_eia_steo.go

@@ -13,8 +13,8 @@ import (
 //钢联
 
 type EiaSteoData struct {
-	InputValue float64 `gorm:"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是不会触发该函数的来获取数据

+ 1 - 1
models/base_from_fenwei.go

@@ -339,7 +339,7 @@ type HandleFenweiExcelDataReq struct {
 }
 
 type FenWeiNetIndexInfo struct {
-	FenweiIndexId int64  `orm:"column(fenwei_index_id);pk"`
+	FenweiIndexId int64  `gorm:"column:fenwei_index_id;primaryKey"`
 	IndexName     string `description:"指标名称"`
 	//IndexCode    string  `description:"指标编码"`
 	Unit         string      `description:"单位"`

+ 7 - 4
models/base_from_gpr_risk.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"bytes"
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -16,7 +17,7 @@ type BaseFromGprRisk struct{}
 
 type BaseFromGprRiskData struct {
 	//BaseFromGprRiskDataId  int `orm:"column(base_from_gpr_risk_data_id);pk"`
-	BaseFromGprRiskDataId  int `orm:"column(base_from_gpr_risk_data_id);primaryKey"`
+	BaseFromGprRiskDataId  int `gorm:"column:base_from_gpr_risk_data_id;primaryKey"`
 	BaseFromGprRiskIndexId int
 	IndexCode              string
 	DataTime               string
@@ -303,12 +304,14 @@ func (y *BaseFromGprRiskData) GetMaxAndMinDateByIndexCode(indexCode string) (ite
 	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
-	var latest_value float64
 	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")
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
+	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)
-	item.LatestValue = latest_value
 	return
 }
 

+ 6 - 6
models/base_from_ly_index_record.go

@@ -10,12 +10,12 @@ import (
 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 `orm:"column(create_time)"` // 创建时间
-	ModifyTime string `orm:"column(modify_time)"` // 修改时间
-	Product    string `orm:"column(product)"`     // 产品
-	Category   string `orm:"column(category)"`    // 分类
-	Url        string `orm:"column(url)"`         // 指标页面地址
-	DataTime   string `orm:"column(data_time)"`   // 数据日期
+	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 添加指标记录

+ 2 - 2
models/base_from_lz.go

@@ -13,8 +13,8 @@ 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是不会触发该函数的来获取数据

+ 4 - 4
models/base_from_manual.go

@@ -16,11 +16,11 @@ import (
 //弘则手工数据
 
 type ManualEdbdata struct {
-	TradeCode string `gorm:"column:TRADE_CODE;primaryKey" description:"指标编码"`
+	TradeCode string `gorm:"column:TRADE_CODE;autoIncrement:false;primaryKey" description:"指标编码"`
 	//TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
-	Dt         string    `orm:"column(DT)" description:"日期" gorm:"column:DT"`
-	Close      string    `orm:"column(CLOSE)" description:"值" gorm:"column:CLOSE"`
-	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间" gorm:"column:modify_time"`
+	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是不会触发该函数的来获取数据

+ 5 - 5
models/base_from_mtjh.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -336,14 +337,13 @@ func (m *BaseFromMtjhMapping) GetMaxAndMinDateByIndexCode(indexCode string) (ite
 	}
 
 	// 获取最新值
-	var latest_value float64
 	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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	if err != nil {
-		return
+	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
 }

+ 5 - 4
models/base_from_mysteel.go

@@ -4,16 +4,17 @@ import (
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
+
+	"gorm.io/gorm"
 )
 
 //钢联
 type GlData struct {
-	InputValue float64 `orm:"column(DATA_VALUE)" description:"日期" gorm:"column:DATA_VALUE"`
-	DataTime   string  `orm:"column(DATA_DATE)" description:"值" gorm:"column:DATA_DATE"`
+	InputValue float64 `gorm:"column:DATA_VALUE" description:"日期"`
+	DataTime   string  `gorm:"column:DATA_DATE" description:"值"`
 }
 
 // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
@@ -45,7 +46,7 @@ func GetGlDataByCondition(condition string, pars []interface{}) (item []*GlData,
 	//
 	//		order by PUBLISH_TIME DESC
 	//_, err = o.Raw(sql, pars).QueryRows(&item)
-	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
+	err = global.DbMap[utils.DbNameGL].Raw(sql, pars...).Find(&item).Error
 	return
 }
 

+ 7 - 7
models/base_from_mysteel_chemical.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -13,8 +14,8 @@ import (
 //钢联
 
 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是不会触发该函数的来获取数据
@@ -581,14 +582,13 @@ func (d *BaseFromMysteelChemicalData) GetMysteelIndexInfoMaxAndMinInfo(indexCode
 	}
 
 	// 获取最新值
-	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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	if err != nil {
-		return
+	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
 }

+ 7 - 1
models/base_from_mysteel_chemical_classify.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"strconv"
@@ -34,7 +35,12 @@ func GetMysteelClassifyMaxSort(parentId int) (sort int, err error) {
 	//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 = global.DEFAULT_DB.Raw(sql, parentId).Scan(&sort).Error
+	var intNull sql2.NullInt64
+	err = global.DEFAULT_DB.Raw(sql, parentId).Scan(&intNull).Error
+	if err == nil && intNull.Valid {
+		sort = int(intNull.Int64)
+	}
+
 	return
 }
 

+ 6 - 6
models/base_from_rzd_classify.go

@@ -9,12 +9,12 @@ import (
 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 `orm:"column(create_time)"`
-	ModifyTime     string `orm:"column(modify_time)"`
-	ClassifyName   string `orm:"column(classify_name)"`
-	ParentId       int    `orm:"column(parent_id)"`
-	Sort           int    `orm:"column(sort)"`
-	ClassifyNameEn string `orm:"column(classify_name_en)"`
+	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 根据分类名称查询

+ 6 - 6
models/base_from_rzd_data.go

@@ -10,12 +10,12 @@ import (
 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     `orm:"column(base_from_rzd_index_id)"`
-	CreateTime         string  `orm:"column(create_time)"`
-	DataTime           string  `orm:"column(data_time)"`
-	IndexCode          string  `orm:"column(index_code)"`
-	ModifyTime         string  `orm:"column(modify_time)"`
-	Value              float64 `orm:"column(value)"`
+	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是不会触发该函数的来获取数据

+ 5 - 5
models/base_from_sci99.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -333,14 +334,13 @@ func (m *BaseFromSci99Index) GetMaxAndMinDateByIndexCode(indexCode string) (item
 	}
 
 	// 获取最新值
-	var latest_value float64
 	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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	if err != nil {
-		return
+	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
 }

+ 3 - 3
models/base_from_sci_hq.go

@@ -194,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"`
@@ -232,8 +232,8 @@ func BatchAddBaseFromSciHqIndex(list []*BaseFromSciHqIndex) (err error) {
 }
 
 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:"数据值"`

+ 1 - 1
models/base_from_sh.go

@@ -316,7 +316,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

+ 9 - 9
models/base_from_smm.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -260,9 +261,9 @@ type BaseFromSmmIndex struct {
 	Name           string
 	IndexCode      string
 	IndexName      string
-	Type1          string `orm:"column(type_1)"`
-	Type2          string `orm:"column(type_2)"`
-	Type3          string `orm:"column(type_3)"`
+	Type1          string `gorm:"column:type_1"`
+	Type2          string `gorm:"column:type_2"`
+	Type3          string `gorm:"column:type_3"`
 	Frequency      string
 	Unit           string
 	ApiStartTime   string
@@ -345,14 +346,13 @@ func GetSmmIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo,
 	}
 
 	// 获取最新值
-	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)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	if err != nil {
-		return
+	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
 }
@@ -719,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:"新的名称"`

+ 3 - 3
models/base_from_stock_plant.go

@@ -15,9 +15,9 @@ import (
 type StockPlantEdbdata struct {
 	VarietyEdbId string `gorm:"column:variety_edb_id;primaryKey" description:"指标编码"`
 	//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:"修改时间"`
+	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是不会触发该函数的来获取数据

+ 5 - 5
models/base_from_ths_hf_data.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -214,13 +215,12 @@ func (m *BaseFromThsHfData) GetIndexMinMax(indexCode string) (item *EdbInfoMaxAn
 	}
 
 	// 获取最新值
-	var lastVal float64
+	var latestValueNull sql2.NullFloat64
 	sql = fmt.Sprintf(`SELECT %s AS latest_value FROM %s WHERE %s = ? ORDER BY %s DESC LIMIT 1`, m.Cols().Value, m.TableName(), m.Cols().IndexCode, m.Cols().DataTime)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&lastVal).Error
-	if err != nil {
-		return
+	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
 	}
-	item.LatestValue = lastVal
 
 	return
 }

+ 7 - 3
models/base_from_usda_fas.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
@@ -305,12 +306,15 @@ func (y *BaseFromUsdaFasData) GetMaxAndMinDateByIndexCode(indexCode string) (ite
 	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_usda_fas_data WHERE index_code=? `
 	//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 %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
 	sql = fmt.Sprintf(sql, "base_from_usda_fas_data")
 	//err = o.Raw(sql, indexCode).QueryRow(&latest_value)
-	err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
-	item.LatestValue = 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
 }
 

+ 1 - 1
models/business_conf.go

@@ -68,7 +68,7 @@ var FromSceneMap = map[int]string{
 
 // BusinessConf 商户配置表
 type BusinessConf struct {
-	Id         int    `orm:"column(id);pk"`
+	Id         int    `gorm:"column:id;primaryKey"`
 	ConfKey    string `description:"配置Key"`
 	ConfVal    string `description:"配置值"`
 	ValType    int    `description:"1-字符串;2-数值;3-字符串数组;4-富文本;"`

+ 6 - 7
models/calculate_residual_analysis_config.go

@@ -8,11 +8,11 @@ import (
 )
 
 type CalculateResidualAnalysisConfig struct {
-	CalculateResidualAnalysisConfigId int       `orm:"column(calculate_residual_analysis_config_id);pk;auto" description:"自增id"`
-	Config                            string    `orm:"column(config)" description:"计算参数配置"`
-	SysUserId                         int       `orm:"column(sys_user_id)" description:"操作人id"`
-	CreateTime                        time.Time `orm:"column(create_time)" description:"创建时间"`
-	ModifyTime                        time.Time `orm:"column(modify_time)" description:"修改时间"`
+	CalculateResidualAnalysisConfigId int       `gorm:"column:calculate_residual_analysis_config_id;primaryKey" description:"自增id"`
+	Config                            string    `gorm:"column:config" description:"计算参数配置"`
+	SysUserId                         int       `gorm:"column:sys_user_id" description:"操作人id"`
+	CreateTime                        time.Time `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime                        time.Time `gorm:"column:modify_time" description:"修改时间"`
 }
 
 type ResidualAnalysisConfig struct {
@@ -46,8 +46,7 @@ func (m *ResidualAnalysisConfig) AfterFind(db *gorm.DB) (err error) {
 func GetResidualAnalysisConfigById(edbInfoId int) (residualAnalysisConfig CalculateResidualAnalysisConfig, err error) {
 	sql := `SELECT t2.* FROM calculate_residual_analysis_config_mapping t1 
 			join calculate_residual_analysis_config t2 on t1.calculate_residual_analysis_config_id = t2.calculate_residual_analysis_config_id
-			WHERE t1.edb_info_id = ?`
+			WHERE t1.edb_info_id = ? and index_type!=3 and index_type !=4`
 	err = global.DEFAULT_DB.Raw(sql, edbInfoId).First(&residualAnalysisConfig).Error
-
 	return
 }

+ 26 - 15
models/calculate_residual_analysis_config_mapping.go

@@ -7,26 +7,37 @@ import (
 )
 
 type CalculateResidualAnalysisConfigMapping struct {
-	CalculateResidualAnalysisConfigMappingId int       `orm:"column(calculate_residual_analysis_config_mapping_id);pk;auto" description:"自增id"`
-	CalculateResidualAnalysisConfigId        int       `orm:"column(calculate_residual_analysis_config_id)" description:"残差分析配置id"`
-	EdbInfoId                                int64     `orm:"column(edb_info_id)" description:"指标id"`
-	ResidualType                             int       `orm:"column(residual_type)" description:"残差类型: 1-映射残差 2-拟合残差"`
-	IndexType                                int       `orm:"column(index_type)" description:"指标类型:1-映射指标 2-残差指标 3-因变量指标 4-自变量指标"`
-	CreateTime                               time.Time `orm:"column(create_time)" description:"创建时间"`
-	ModifyTime                               time.Time `orm:"column(modify_time)" description:"修改时间"`
+	CalculateResidualAnalysisConfigMappingId int       `gorm:"column:calculate_residual_analysis_config_mapping_id;primaryKey" description:"自增id"`
+	CalculateResidualAnalysisConfigId        int       `gorm:"column:calculate_residual_analysis_config_id" description:"残差分析配置id"`
+	EdbInfoId                                int64     `gorm:"column:edb_info_id" description:"指标id"`
+	ResidualType                             int       `gorm:"column:residual_type" description:"残差类型: 1-映射残差 2-拟合残差"`
+	IndexType                                int       `gorm:"column:index_type)" description:"指标类型:1-映射指标 2-残差指标 3-因变量指标 4-自变量指标"`
+	CreateTime                               time.Time `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime                               time.Time `gorm:"column:modify_time" description:"修改时间"`
 }
 
 // GetConfigMappingListByConditionNotBase 查询非基础指标的配置映射
 func GetConfigMappingListByConditionNotBase(edbInfoId int) (configMapping []CalculateResidualAnalysisConfigMapping, err error) {
+	//sql := `
+	//SELECT
+	//	*
+	//FROM
+	//	calculate_residual_analysis_config_mapping
+	//WHERE
+	//	calculate_residual_analysis_config_id IN ( SELECT calculate_residual_analysis_config_id FROM calculate_residual_analysis_config_mapping WHERE edb_info_id = ? )
+	//	// AND index_type != 3
+	//	// AND index_type != 4`
 	sql := `
-	SELECT
-  		* 
-	FROM
-  		calculate_residual_analysis_config_mapping 
-	WHERE
-  		calculate_residual_analysis_config_id IN ( SELECT calculate_residual_analysis_config_id FROM calculate_residual_analysis_config_mapping WHERE edb_info_id = ? ) 
-  		AND index_type != 3 
-  		AND index_type != 4`
+	SELECT *
+		FROM calculate_residual_analysis_config_mapping m
+		WHERE EXISTS (
+			SELECT 1
+			FROM calculate_residual_analysis_config_mapping subq
+			WHERE subq.calculate_residual_analysis_config_id = m.calculate_residual_analysis_config_id
+			  AND subq.edb_info_id = ? AND subq.index_type != 3
+ 			AND subq.index_type != 4
+		)`
+
 	err = global.DEFAULT_DB.Raw(sql, edbInfoId).Find(&configMapping).Error
 	if err != nil {
 		return nil, fmt.Errorf("查询数据时出错: %v", err)

+ 1 - 1
models/data_stat/edb_info_delete_log.go

@@ -54,6 +54,6 @@ type EdbInfoDeleteLogNum struct {
 
 func GetEdbDeleteLogNumByCreateTime(startDate, endDate string) (item []*EdbInfoDeleteLogNum, err error) {
 	sql := ` SELECT source, terminal_code, count(*) as num FROM edb_info_delete_log WHERE create_time >= ? and create_time < ? group by source, terminal_code `
-	err = global.DEFAULT_DB.Raw(sql, startDate, endDate).Scan(&item).Error
+	err = global.DEFAULT_DB.Raw(sql, startDate, endDate).Find(&item).Error
 	return
 }

+ 1 - 1
models/data_stat/edb_source_stat.go

@@ -30,7 +30,7 @@ func GetEdbSourceStatByCondition(condition string, pars []interface{}) (item []*
 	if condition != "" {
 		sql += condition
 	}
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&item).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
 	return
 }
 

+ 1 - 1
models/edb_adjust_conf.go

@@ -6,7 +6,7 @@ import (
 
 // EdbAdjustConf 计算指标于基础指标,关系表
 type EdbAdjustConf struct {
-	EdbInfoId     int       `orm:"column(edb_info_id);pk" description:"计算指标id"`
+	EdbInfoId     int       `gorm:"column:edb_info_id;primaryKey" description:"计算指标id"`
 	SourceEndDate time.Time `description:"来源指标的实际数据日期"`
 	ModifyTime    time.Time `description:"修改时间"`
 	CreateTime    time.Time `description:"创建时间"`

+ 6 - 1
models/edb_classify.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"errors"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
@@ -83,8 +84,12 @@ func GetEdbClassifyCount(classifyName string, parentId int, classifyType uint8)
 
 // GetEdbClassifyMaxSort 获取分类下最大的排序数
 func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (sort int, err error) {
+	var sortNull sql2.NullInt64
 	sql := `SELECT Max(sort) AS sort FROM edb_classify WHERE parent_id=? AND classify_type=? `
-	err = global.DEFAULT_DB.Raw(sql, parentId, classifyType).Scan(&sort).Error
+	err = global.DEFAULT_DB.Raw(sql, parentId, classifyType).Scan(&sortNull).Error
+	if err == nil && sortNull.Valid {
+		sort = int(sortNull.Int64)
+	}
 
 	return
 }

+ 1 - 1
models/edb_data_base.go

@@ -88,7 +88,7 @@ func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items
 		pars = append(pars, limit)
 	}
 	sql = fmt.Sprintf(sql, tableName)
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 

+ 1 - 1
models/edb_data_calculate_ljztbpj.go

@@ -23,7 +23,7 @@ type EdbDataCalculateLjztbpj struct {
 	Status        int       `gorm:"column:status" description:"状态"`
 	CreateTime    time.Time `gorm:"column:status" description:"创建时间"`
 	ModifyTime    time.Time `gorm:"column:create_time" description:"修改时间"`
-	DataTimestamp int64     `gorm:"column:modify_time" description:"数据日期时间戳"`
+	DataTimestamp int64     `gorm:"column:data_timestamp" description:"数据日期时间戳"`
 }
 
 func (e *EdbDataCalculateLjztbpj) AfterFind(db *gorm.DB) (err error) {

+ 27 - 23
models/edb_data_calculate_zjpj.go

@@ -20,11 +20,11 @@ type EdbDataCalculateZjpj struct {
 	Status        int       `gorm:"column:status" description:"状态"`
 	CreateTime    time.Time `gorm:"column:status" description:"创建时间"`
 	ModifyTime    time.Time `gorm:"column:create_time" description:"修改时间"`
-	DataTimestamp int64     `gorm:"column:modify_time" description:"数据日期时间戳"`
+	DataTimestamp int64     `gorm:"column:data_timestamp" description:"数据日期时间戳"`
 }
 
-func (e *EdbDataCalculateZjpj) AfterFind(db *gorm.DB) (err error) {
-	e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
+func (m *EdbDataCalculateZjpj) AfterFind(db *gorm.DB) (err error) {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
 
 	return
 }
@@ -492,26 +492,30 @@ func refreshAllCalculateZjpj(to *gorm.DB, edbInfo *EdbInfo, existItemA, existIte
 
 	//数据入库
 	if len(addDataList) > 0 {
-		tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
-		i := 0
-		for _, v := range addDataList {
-			tmpAddDataList = append(tmpAddDataList, v)
-			i++
-			if i >= 500 {
-				err = to.CreateInBatches(tmpAddDataList, utils.MultiAddNum).Error
-				if err != nil {
-					return
-				}
-				i = 0
-				tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
-			}
-		}
-
-		if len(tmpAddDataList) > 0 {
-			err = to.CreateInBatches(tmpAddDataList, utils.MultiAddNum).Error
-			if err != nil {
-				return
-			}
+		//tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
+		//i := 0
+		//for _, v := range addDataList {
+		//	tmpAddDataList = append(tmpAddDataList, v)
+		//	i++
+		//	if i >= 500 {
+		//		err = to.CreateInBatches(tmpAddDataList, utils.MultiAddNum).Error
+		//		if err != nil {
+		//			return
+		//		}
+		//		i = 0
+		//		tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
+		//	}
+		//}
+		//
+		//if len(tmpAddDataList) > 0 {
+		//	err = to.CreateInBatches(tmpAddDataList, utils.MultiAddNum).Error
+		//	if err != nil {
+		//		return
+		//	}
+		//}
+		err = to.CreateInBatches(addDataList, utils.MultiAddNum).Error
+		if err != nil {
+			return
 		}
 	}
 

+ 94 - 62
models/edb_data_residual_analysis.go

@@ -20,7 +20,7 @@ type edbDataResidualAnalysis struct {
 	Value         float64   `gorm:"column:value;type:double;comment:数据值;default:NULL;"`               // 数据值
 	CreateTime    time.Time `gorm:"column:create_time;type:datetime;comment:创建时间;default:NULL;" `     // 创建时间
 	ModifyTime    time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;default:NULL;"`      // 修改时间
-	DataTimestamp int64     `gorm:"column:data_timestamp;type:bigint(20);comment:数据日期时间戳;default:0;"` // 数据日期时间戳
+	DataTimeStamp int64     `gorm:"column:data_timestamp;type:bigint(20);comment:数据日期时间戳;default:0;"` // 数据日期时间戳
 }
 
 // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
@@ -64,19 +64,31 @@ func RefreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
 			_ = to.Commit()
 		}
 	}()*/
+	//只清空残差分析数据自身指标的数据
 	configMapping, err := GetConfigMappingListByConditionNotBase(edbInfoId)
-	if err != nil {
-		return err
-	}
-
-	var edbInfoIdList []int64
-	for _, v := range configMapping {
-		edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
-	}
+	//if err != nil {
+	//	return err
+	//}
+	//
+	//var edbInfoIdList []int64
+	//for _, v := range configMapping {
+	//	edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
+	//}
 
 	//清空原有数据
-	sql := ` DELETE FROM edb_data_residual_analysis WHERE edb_info_id in (` + utils.GetOrmInReplace(len(edbInfoIdList)) + `) `
-	err = to.Exec(sql, edbInfoIdList).Error
+	//sql := ` DELETE FROM edb_data_residual_analysis WHERE edb_info_id in (` + utils.GetOrmInReplace(len(edbInfoIdList)) + `) `
+	//var params []interface{}
+	//for _, i := range edbInfoIdList {
+	//	params = append(params, i)
+	//}
+	var params []interface{}
+	sql := ` DELETE FROM edb_data_residual_analysis WHERE edb_info_id = ?`
+	params = append(params, edbInfoId)
+	//var params []interface{}
+	//for _, i := range edbInfoIdList {
+	//	params = append(params, i)
+	//}
+	err = to.Exec(sql, params...).Error
 	if err != nil {
 		return
 	}
@@ -90,13 +102,23 @@ func RefreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
 // refreshAllCalculateResidualAnalysis 刷新所有残差分析
 func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaInt, moveType int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate, moveFrequency string, configMapping []CalculateResidualAnalysisConfigMapping) (err error) {
 	fmt.Println("refreshAllCalculateResidualAnalysis startDate:", startDate)
-
+	configMap := make(map[int64]CalculateResidualAnalysisConfigMapping, len(configMapping))
+	for _, v := range configMapping {
+		configMap[v.EdbInfoId] = v
+	}
 	calculateMappingList, err := GetCalculateMappingListByEdbInfoId(edbInfoId)
 	if err != nil {
 		return err
 	}
-	edbInfoIdA := calculateMappingList[0].FromEdbInfoId
-	edbInfoIdB := calculateMappingList[1].FromEdbInfoId
+	//这里顺序和之前的不一致导致的计算错误
+	var edbInfoIdA, edbInfoIdB int
+	if configMap[int64(calculateMappingList[0].FromEdbInfoId)].IndexType == 3 {
+		edbInfoIdA = calculateMappingList[0].FromEdbInfoId
+		edbInfoIdB = calculateMappingList[1].FromEdbInfoId
+	} else {
+		edbInfoIdA = calculateMappingList[1].FromEdbInfoId
+		edbInfoIdB = calculateMappingList[0].FromEdbInfoId
+	}
 
 	mappingList, err := GetEdbInfoListByIds([]int{edbInfoIdA, edbInfoIdB})
 	if err != nil {
@@ -134,10 +156,10 @@ func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
 
 	// 时间处理
 	switch config.DateType {
-	case 0:
+	case -1:
 		startDate = config.StartDate
 		endDate = config.EndDate
-	case 1:
+	case 0:
 		startDate = config.StartDate
 		endDate = ""
 	default:
@@ -168,54 +190,54 @@ func refreshAllCalculateResidualAnalysis(edbInfoId, source, subSource, formulaIn
 	residualEdbList, _, err := fillResidualChartInfo(config, fromEdbInfo, edbInfoMappingA, edbInfoMappingB, mappingEdbList)
 
 	// 映射指标 与 残差指标 同步刷新
-	for _, mapping := range configMapping {
-		var edbDataResidualAnalysisList []edbDataResidualAnalysis
-		if mapping.IndexType == 1 {
-			edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
-			if err != nil {
-				return err
-			}
+	//for _, mapping := range configMapping {
+	mapping := configMap[int64(edbInfoId)]
+	var edbDataResidualAnalysisList []edbDataResidualAnalysis
+	if mapping.IndexType == 1 {
+		edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
+		if err != nil {
+			return err
+		}
 
-			for _, edbData := range mappingEdbList[1].DataList {
-				value, _ := strconv.ParseFloat(edbData.Value, 64)
-				edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
-					EdbInfoId:     int(mapping.EdbInfoId),
-					EdbCode:       edbInfo.EdbCode,
-					DataTime:      edbData.DataTime,
-					Value:         value,
-					CreateTime:    time.Now(),
-					ModifyTime:    time.Now(),
-					DataTimestamp: edbData.DataTimestamp,
-				})
-			}
+		for _, edbData := range mappingEdbList[0].DataList {
+			value, _ := strconv.ParseFloat(edbData.Value, 64)
+			edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
+				EdbInfoId:     int(mapping.EdbInfoId),
+				EdbCode:       edbInfo.EdbCode,
+				DataTime:      edbData.DataTime,
+				Value:         value,
+				CreateTime:    time.Now(),
+				ModifyTime:    time.Now(),
+				DataTimeStamp: edbData.DataTimestamp,
+			})
+		}
 
-			err = AddResidualAnalysisData(edbDataResidualAnalysisList)
-			if err != nil {
-				return err
-			}
-		} else if mapping.IndexType == 2 {
-			edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
-			if err != nil {
-				return err
-			}
+		err = AddResidualAnalysisData(edbDataResidualAnalysisList)
+		if err != nil {
+			return err
+		}
+	} else if mapping.IndexType == 2 {
+		edbInfo, err := GetEdbInfoById(int(mapping.EdbInfoId))
+		if err != nil {
+			return err
+		}
 
-			for _, edbData := range residualEdbList[1].DataList {
-				value, _ := strconv.ParseFloat(edbData.Value, 64)
-				edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
-					EdbInfoId:     int(mapping.EdbInfoId),
-					EdbCode:       edbInfo.EdbCode,
-					DataTime:      edbData.DataTime,
-					Value:         value,
-					CreateTime:    time.Now(),
-					ModifyTime:    time.Now(),
-					DataTimestamp: edbData.DataTimestamp,
-				})
-			}
+		for _, edbData := range residualEdbList[0].DataList {
+			value, _ := strconv.ParseFloat(edbData.Value, 64)
+			edbDataResidualAnalysisList = append(edbDataResidualAnalysisList, edbDataResidualAnalysis{
+				EdbInfoId:     int(mapping.EdbInfoId),
+				EdbCode:       edbInfo.EdbCode,
+				DataTime:      edbData.DataTime,
+				Value:         value,
+				CreateTime:    time.Now(),
+				ModifyTime:    time.Now(),
+				DataTimeStamp: edbData.DataTimestamp,
+			})
+		}
 
-			err = AddResidualAnalysisData(edbDataResidualAnalysisList)
-			if err != nil {
-				return err
-			}
+		err = AddResidualAnalysisData(edbDataResidualAnalysisList)
+		if err != nil {
+			return err
 		}
 	}
 
@@ -325,10 +347,20 @@ func fillResidualChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoM
 			}
 		}
 	}
-
+	//reverse(mappingEdb)
 	return mappingEdb, R2, nil
 }
 
+// 双指针法
+func reverse(slice []EdbInfoList) {
+	left, right := 0, len(slice)-1
+	for left < right {
+		// 交换元素
+		slice[left], slice[right] = slice[right], slice[left]
+		left++
+		right--
+	}
+}
 func fillMappingChartInfo(config ResidualAnalysisConfig, req *EdbInfo, edbInfoMappingA *EdbInfoList, edbInfoMappingB *EdbInfoList, originalEdbList []EdbInfoList, indexADataMap map[string]*EdbData, startDate string, endDate string, fullADataList []*EdbDataList, fullBDataList []*EdbDataList) ([]EdbInfoList, float64, float64, float64, error) {
 	// 计算公式:Y=aX+b,Y为映射后的指标,X为自变量指标
 	// 正序:a=(L2-L1)/(R2-R1)	b=L2-R2*a
@@ -587,7 +619,7 @@ func fillOriginalChart(config ResidualAnalysisConfig, req *EdbInfo, mappingList
 
 		if v.EdbInfoId == edbInfoMappingB.EdbInfoId {
 			// 领先指标 dataList进行数据处理
-			if config.IndexType == 1 {
+			if config.IndexType == 2 {
 				if config.LeadValue < 0 {
 					return nil, nil, nil, fmt.Errorf("领先值不能小于0")
 				} else if config.LeadValue > 0 {

+ 2 - 2
models/edb_data_trade_analysis.go

@@ -16,8 +16,8 @@ type EdbDataTradeAnalysis struct {
 	EdbCode       string    `gorm:"column:edb_code" description:"指标编码"`
 	DataTime      time.Time `gorm:"column:data_time" description:"数据日期"`
 	Value         float64   `gorm:"column:value" description:"数据值"`
-	CreateTime    time.Time `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime    time.Time `gorm:"column:modify_time" description:"修改时间"`
+	CreateTime    time.Time `gorm:"column:status" description:"创建时间"`
+	ModifyTime    time.Time `gorm:"column:create_time" description:"修改时间"`
 	DataTimestamp int64     `gorm:"column:data_timestamp" description:"数据日期时间戳"`
 }
 

+ 17 - 9
models/edb_info.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	sql2 "database/sql"
 	"encoding/json"
 	"errors"
 	"eta/eta_index_lib/global"
@@ -205,7 +206,7 @@ type EdbClassifyItemsButton struct {
 // GetEdbInfoByName 根据指标名称获取所有的指标数据列表
 func GetEdbInfoByName(edbName string) (items []*EdbInfoList, err error) {
 	sql := ` SELECT * FROM edb_info WHERE edb_name=? `
-	err = global.DEFAULT_DB.Raw(sql, edbName).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, edbName).Find(&items).Error
 
 	if err != nil {
 		return
@@ -567,12 +568,15 @@ func GetEdbInfoMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbIn
 	sql = fmt.Sprintf(sql, tableName)
 	err = global.DEFAULT_DB.Raw(sql, edbCode).First(&item).Error
 
-	var latest_value float64
 	sql = ` SELECT value AS latest_value FROM %s WHERE edb_code=? ORDER BY data_time DESC LIMIT 1 `
 	sql = fmt.Sprintf(sql, tableName)
-	// todo 测试查询单个字段
-	err = global.DEFAULT_DB.Raw(sql, edbCode).Scan(&latest_value).Error
-	item.LatestValue = latest_value
+
+	var latestValueNull sql2.NullFloat64
+	err = global.DEFAULT_DB.Raw(sql, edbCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+
 	return
 }
 
@@ -734,7 +738,7 @@ func GetEdbInfoCalculateListByCondition(condition string, pars []interface{}) (i
 	if condition != "" {
 		sql += condition
 	}
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 
 	return
 }
@@ -779,7 +783,7 @@ func GetEdbDataListAllV1ByTo(to *gorm.DB, condition string, pars []interface{},
 	} else {
 		sql += ` ORDER BY data_time DESC `
 	}
-	err = to.Raw(sql, pars...).Scan(&items).Error
+	err = to.Raw(sql, pars...).Find(&items).Error
 	if err != nil {
 		return
 	}
@@ -1706,10 +1710,14 @@ type ResetEdbClassifyReq struct {
 
 // GetEdbInfoMaxSortByClassifyId 获取分类下指标的最大的排序数
 func GetEdbInfoMaxSortByClassifyId(classifyId int) (sort int, err error) {
-	//o := orm.NewOrm()
+	var intNull sql2.NullInt64
 	sql := `SELECT Max(sort) AS sort FROM edb_info WHERE classify_id=? `
 	//err = o.Raw(sql, classifyId).QueryRow(&sort)
-	err = global.DEFAULT_DB.Raw(sql, classifyId).Scan(&sort).Error
+	err = global.DEFAULT_DB.Raw(sql, classifyId).Scan(&intNull).Error
+	if err == nil && intNull.Valid {
+		sort = int(intNull.Int64)
+	}
+
 	return
 }
 

+ 1 - 1
models/edb_info_relation.go

@@ -39,7 +39,7 @@ func GetEdbInfoRelationByChildEdbInfoId(edbInfoId int) (item *EdbInfoRelation, e
 // GetEdbInfoRelationListByChildEdbInfoId 根据间接引用中的的计算指标ID查询引用列表
 func GetEdbInfoRelationListByChildEdbInfoId(edbInfoId int) (items []*EdbInfoRelation, err error) {
 	msql := ` SELECT * FROM edb_info_relation WHERE relation_type=1 AND child_edb_info_id=?`
-	err = global.DEFAULT_DB.Raw(msql, edbInfoId).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(msql, edbInfoId).Find(&items).Error
 	return
 }
 

+ 1 - 1
models/edb_refresh/edb_refresh_default_config.go

@@ -119,7 +119,7 @@ func GetDefaultRefreshEdbInfoListBySourceAndSubSource(source, subSource int, fre
 	sql := `SELECT a.* FROM edb_info a 
 LEFT JOIN edb_refresh_mapping b ON a.edb_info_id = b.edb_info_id
 WHERE a.source = ? AND a.sub_source = ? AND a.frequency IN (?)  AND b.edb_info_id is null`
-	err = global.DEFAULT_DB.Raw(sql, source, subSource, frequencyList).Scan(&list).Error
+	err = global.DEFAULT_DB.Raw(sql, source, subSource, frequencyList).Find(&list).Error
 
 	return
 }

+ 3 - 3
models/excel/excel_info.go

@@ -7,7 +7,7 @@ import (
 
 // ExcelInfo excel表格详情表
 type ExcelInfo struct {
-	ExcelInfoId        int       `orm:"column(excel_info_id);pk"`
+	ExcelInfoId        int       `gorm:"column:excel_info_id;primaryKey"`
 	Source             int       `description:"表格来源,1:excel插件的表格,2:自定义表格,3:混合表格,4:自定义分析,默认:1"`
 	ExcelType          int       `description:"表格类型,1:指标列,2:日期列,默认:1"`
 	ExcelName          string    `description:"表格名称"`
@@ -46,7 +46,7 @@ func GetNoContentExcelInfoAll(source, userId int) (items []*ExcelClassifyItems,
 		pars = append(pars, userId)
 	}
 	sql += `  ORDER BY sort asc,create_time desc `
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 
 	return
 }
@@ -128,6 +128,6 @@ func (m *ExcelInfo) Update(cols []string) (err error) {
 func (m *ExcelInfo) GetItemById(id int) (item *ExcelInfo, err error) {
 	sql := `SELECT * FROM excel_info WHERE excel_info_id = ? LIMIT 1`
 	err = global.DEFAULT_DB.Raw(sql, id).First(&item).Error
-	
+
 	return
 }

+ 1 - 1
models/factor_edb_series_calculate_data_qjjs.go

@@ -193,7 +193,7 @@ func (m *FactorEdbSeriesCalculateDataQjjs) GetEdbDataList(seriesId int, edbInfoI
 	sql += ` ORDER BY data_time ASC `
 	sql = fmt.Sprintf(sql, m.TableName())
 
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&list).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
 
 	return
 }

+ 1 - 1
models/factor_edb_series_chart_mapping.go

@@ -157,9 +157,9 @@ func (m *FactorEdbSeriesChartMapping) GetPageItemsByCondition(condition string,
 
 // GetDistinctSeriesIdByChartId 获取图表关联的系列ID
 func (m *FactorEdbSeriesChartMapping) GetDistinctSeriesIdByChartId(chartId int) (seriesIds []int, err error) {
-
 	sql := fmt.Sprintf(`SELECT DISTINCT %s FROM %s WHERE %s = ?`, m.Cols().FactorEdbSeriesId, m.TableName(), m.Cols().ChartInfoId)
 	err = global.DEFAULT_DB.Raw(sql, chartId).Scan(&seriesIds).Error
+
 	return
 }
 

+ 1 - 1
models/factor_edb_series_mapping.go

@@ -164,6 +164,6 @@ func (m *FactorEdbSeriesMapping) Format2Item() (item *FactorEdbSeriesMappingItem
 
 func (m *FactorEdbSeriesMapping) GetItemBySeriesId(seriesId int) (items []*FactorEdbSeriesMapping, err error) {
 	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? `, m.TableName(), m.Cols().FactorEdbSeriesId)
-	err = global.DEFAULT_DB.Raw(sql, seriesId).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, seriesId).Find(&items).Error
 	return
 }

+ 1 - 1
models/future_good/future_good_edb_data.go

@@ -31,7 +31,7 @@ type FutureGoodEdbData struct {
 
 // FutureGoodEdbDataItem 期货指标数据的表
 type FutureGoodEdbDataItem struct {
-	FutureGoodEdbDataId int     `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbDataId int     `gorm:"column:future_good_edb_data_id;primaryKey"`
 	FutureGoodEdbInfoId int     `description:"期货指标id"`
 	FutureGoodEdbCode   string  `description:"期货指标code"`
 	DataTime            string  `description:"数据日期"`

+ 8 - 3
models/future_good/future_good_edb_info.go

@@ -1,6 +1,7 @@
 package future_good
 
 import (
+	sql2 "database/sql"
 	"errors"
 	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
@@ -149,6 +150,7 @@ type FutureGoodEdbInfoMaxAndMinInfo struct {
 	LatestValue float64 `description:"最新值"`
 	LatestDate  string  `description:"实际数据最新日期"`
 }
+
 func (e *FutureGoodEdbInfoMaxAndMinInfo) ConvertDateTimeStr() {
 	e.MinDate = utils.GormDateStrToDateStr(e.MinDate)
 	e.MaxDate = utils.GormDateStrToDateStr(e.MaxDate)
@@ -165,10 +167,13 @@ func GetEdbInfoMaxAndMinInfo(futureGoodEdbCode string) (item *FutureGoodEdbInfoM
 		return
 	}
 
-	var latest_value float64
+	var latestValueNull sql2.NullFloat64
 	sql = ` SELECT close AS latest_value FROM future_good_edb_data WHERE future_good_edb_code=? ORDER BY data_time DESC LIMIT 1 `
-	err = global.DEFAULT_DB.Raw(sql, futureGoodEdbCode).Scan(&latest_value).Error
-	item.LatestValue = latest_value
+	err = global.DEFAULT_DB.Raw(sql, futureGoodEdbCode).Scan(&latestValueNull).Error
+	if err == nil && latestValueNull.Valid {
+		item.LatestValue = latestValueNull.Float64
+	}
+
 	item.ConvertDateTimeStr()
 	return
 }

+ 3 - 3
models/predict_edb_conf.go

@@ -50,7 +50,7 @@ type EditPredictEdbInfoReq struct {
 
 type PredictEdbConf struct {
 	ConfigId         int       `gorm:"primaryKey;autoIncrement;column:config_id" description:"规则id"`
-	PredictEdbInfoId int       `orm:"column(predict_edb_info_id)" description:"预测指标id"`
+	PredictEdbInfoId int       `gorm:"column:predict_edb_info_id" description:"预测指标id"`
 	SourceEdbInfoId  int       `description:"来源指标id"`
 	RuleType         int       `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值"`
 	FixedValue       float64   `description:"固定值"`
@@ -65,8 +65,8 @@ type PredictEdbConf struct {
 
 // PredictEdbConfAndData 预测规则和其对应的动态数据
 type PredictEdbConfAndData struct {
-	ConfigId         int                  `orm:"column(config_id);pk" description:"规则id"`
-	PredictEdbInfoId int                  `orm:"column(predict_edb_info_id)" description:"预测指标id"`
+	ConfigId         int                  `gorm:"column:config_id;primaryKey" description:"规则id"`
+	PredictEdbInfoId int                  `gorm:"column:predict_edb_info_id" description:"预测指标id"`
 	SourceEdbInfoId  int                  `description:"来源指标id"`
 	RuleType         int                  `description:"预测规则,1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差"`
 	FixedValue       float64              `description:"固定值"`

+ 1 - 1
models/predict_edb_data_calculate_ljztbpj.go

@@ -22,7 +22,7 @@ type EdbDataPredictCalculateLjztbpj struct {
 	Status        int       `gorm:"column:status" description:"状态"`
 	CreateTime    time.Time `gorm:"column:status" description:"创建时间"`
 	ModifyTime    time.Time `gorm:"column:create_time" description:"修改时间"`
-	DataTimestamp int64     `gorm:"column:modify_time" description:"数据日期时间戳"`
+	DataTimestamp int64     `gorm:"column:data_timestamp" description:"数据日期时间戳"`
 }
 
 func (e *EdbDataPredictCalculateLjztbpj) AfterFind(db *gorm.DB) (err error) {

+ 1 - 1
models/predict_edb_data_calculate_nhcc.go

@@ -22,7 +22,7 @@ type EdbDataPredictCalculateNhcc struct {
 	Status        int       `gorm:"column:status" description:"状态"`
 	CreateTime    time.Time `gorm:"column:status" description:"创建时间"`
 	ModifyTime    time.Time `gorm:"column:create_time" description:"修改时间"`
-	DataTimestamp int64     `gorm:"column:modify_time" description:"数据日期时间戳"`
+	DataTimestamp int64     `gorm:"column:data_timestamp" description:"数据日期时间戳"`
 }
 
 func (e *EdbDataPredictCalculateNhcc) AfterFind(db *gorm.DB) (err error) {

+ 8 - 0
models/predict_edb_info_rule.go

@@ -1656,6 +1656,10 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
 		//兼容历史数据
 		yearList = append(yearList, annualValueInversionConf.Year)
 	}
+	if len(yearList) == 0 {
+		err = errors.New("同比年份不能为空")
+		return
+	}
 	// 每年截止到当前日期的累计值
 	dateTotalMap := make(map[time.Time]float64)
 
@@ -1753,6 +1757,10 @@ func GetChartPredictEdbInfoDataListByRuleAnnualValueInversion(edbInfoId int, con
 			}
 		}
 	}
+	if sum == 0 {
+		err = errors.New("同比年份的累计值为0")
+		return
+	}
 	//fmt.Printf("同比年份的余额%.4f\n", sum)
 	avg = sum / float64(len(yearList))
 	//fmt.Printf("同比年份的余额%.4f\n", avg)

+ 1 - 1
models/supply_analysis/variety_edb_info.go

@@ -24,7 +24,7 @@ type VarietyEdbInfo struct {
 // GetAllVarietyEdbInfoByVarietyId 根据品种id获取所有的指标
 func GetAllVarietyEdbInfoByVarietyId(varietyId int) (items []*VarietyEdbInfo, err error) {
 	sql := `SELECT * FROM variety_edb_info AS a WHERE a.variety_id = ? ORDER BY a.variety_edb_id ASC `
-	err = global.DEFAULT_DB.Raw(sql, varietyId).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, varietyId).Find(&items).Error
 
 	return
 }

+ 2 - 2
models/trade_analysis/trade_analysis.go

@@ -332,7 +332,7 @@ type ContractCompanyTradeDataList struct {
 }
 
 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"`
 	BaseFromTradeGuangzhouClassifyId int       `description:"分类id"`
 	IndexCode                        string    `description:"指标编码"`
 	IndexName                        string    `description:"指标名称"`
@@ -369,7 +369,7 @@ func GetBaseFromTradeGuangzhouIndex(classifyIds []int, contracts []string, index
 }
 
 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"`
 	BaseFromTradeGuangzhouIndexId int       `description:"指标id"`
 	IndexCode                     string    `description:"指标编码"`
 	DataTime                      time.Time `description:"数据日期"`

+ 1 - 1
models/trade_analysis/trade_classify.go

@@ -9,7 +9,7 @@ import (
 
 // BaseFromTradeClassify 交易所分类表
 type BaseFromTradeClassify struct {
-	Id           uint64    `orm:"column(id);pk"`
+	Id           uint64    `gorm:"column:id;primaryKey"`
 	ClassifyName string    //分类名称
 	ClassifyType string    //分类名称下的类型
 	Exchange     string    //交易所

+ 2 - 2
models/trade_analysis/trade_futures_company.go

@@ -94,7 +94,7 @@ func (m *TradeFuturesCompany) GetItemsByCondition(condition string, pars []inter
 		order = ` ORDER BY ` + orderRule
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 
@@ -110,7 +110,7 @@ func (m *TradeFuturesCompany) GetPageItemsByCondition(condition string, pars []i
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
 	pars = append(pars, startSize, pageSize)
-	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
 	return
 }
 

+ 74 - 7
services/edb_data_calculate_stl.go

@@ -1,10 +1,12 @@
 package services
 
 import (
+	"database/sql"
 	"encoding/json"
 	"eta/eta_index_lib/models"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"github.com/shopspring/decimal"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -166,7 +168,7 @@ func RefreshStlData(edbInfoId int) (msg string, err error) {
 		return
 	}
 
-	trendChart, seasonalChart, residualChart, err := ParseStlExcel(saveFilePath)
+	trendChart, seasonalChart, residualChart, nonTrendChartInfo, err := ParseStlExcel(saveFilePath)
 	if err != nil {
 		msg = "解析Excel失败"
 		return
@@ -177,7 +179,7 @@ func RefreshStlData(edbInfoId int) (msg string, err error) {
 		msg = "获取指标信息失败"
 		return
 	}
-	err = SyncUpdateRelationEdbInfo(edbInfo, stlConfig, trendChart, seasonalChart, residualChart)
+	err = SyncUpdateRelationEdbInfo(edbInfo, stlConfig, trendChart, seasonalChart, residualChart, nonTrendChartInfo)
 	if err != nil {
 		msg = "更新关联指标失败"
 		return
@@ -186,7 +188,7 @@ func RefreshStlData(edbInfoId int) (msg string, err error) {
 	return
 }
 
-func SyncUpdateRelationEdbInfo(edbInfo *models.EdbInfo, config EdbStlConfig, trendData, seasonalData, residualData ChartEdbInfo) (err error) {
+func SyncUpdateRelationEdbInfo(edbInfo *models.EdbInfo, config EdbStlConfig, trendData, seasonalData, residualData, nonTrendChartInfo ChartEdbInfo) (err error) {
 	configId, err := models.GetCalculateStlConfigMappingIdByEdbInfoId(edbInfo.EdbInfoId)
 	if err != nil {
 		return
@@ -201,15 +203,18 @@ func SyncUpdateRelationEdbInfo(edbInfo *models.EdbInfo, config EdbStlConfig, tre
 			continue
 		}
 		switch v.StlEdbType {
-		case 1:
+		case utils.StlTypeTrend:
 			// 趋势指标
 			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, trendData)
-		case 2:
+		case utils.StlTypeSeasonal:
 			// 季节性指标
 			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, seasonalData)
-		case 3:
+		case utils.StlTypeResidual:
 			// 残差指标
 			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, residualData)
+		case utils.StlTypeNonTrend:
+			// 季节+残差指标
+			er = UpdateStlEdbData(edbInfo, config, edbInfo.EdbCode, nonTrendChartInfo)
 		default:
 			utils.FileLog.Info("未知的stlEdbType类型, mapping:%v", v)
 			continue
@@ -298,7 +303,7 @@ func SaveToExcel(data []*models.EdbInfoSearchData, filePath string) (err error)
 	return
 }
 
-func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart ChartEdbInfo, err error) {
+func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart, nonTrendChartInfo ChartEdbInfo, err error) {
 	file, err := xlsx.OpenFile(excelPath)
 	if err != nil {
 		return
@@ -394,6 +399,68 @@ func ParseStlExcel(excelPath string) (TrendChart, SeasonalChart, ResidualChart C
 			ResidualChart.MinData = MinData
 		}
 	}
+
+	// 数据处理
+	dateList := make([]string, 0)
+	residualDateMap := make(map[string]*EdbData)
+	for _, item := range ResidualChart.DataList {
+		if _, ok := residualDateMap[item.DataTime]; ok {
+			continue
+		}
+		residualDateMap[item.DataTime] = item
+		dateList = append(dateList, item.DataTime)
+	}
+	seasonalDateMap := make(map[string]*EdbData)
+	for _, item := range SeasonalChart.DataList {
+		if _, ok := seasonalDateMap[item.DataTime]; ok {
+			continue
+		}
+		seasonalDateMap[item.DataTime] = item
+	}
+
+	// 季节性项+残差项
+	{
+		dataList := make([]*EdbData, 0)
+		var minValue, maxValue sql.NullFloat64
+		for _, date := range dateList {
+			tmpResidual, ok := residualDateMap[date]
+			if !ok {
+				continue
+			}
+			tmpSeasonal, ok := seasonalDateMap[date]
+			if !ok {
+				continue
+			}
+
+			tmpValue := tmpResidual.Value + tmpSeasonal.Value
+			tmpValue, _ = decimal.NewFromFloat(tmpValue).Round(4).Float64()
+
+			dataList = append(dataList, &EdbData{
+				DataTime:      date,
+				DataTimestamp: 0,
+				Value:         tmpValue,
+			})
+			// 如果没有设置最小值,或者设置的最小值比当前值还大,则需要更新最小值
+			if !minValue.Valid || minValue.Float64 > tmpValue {
+				err = minValue.Scan(tmpValue)
+				if err != nil {
+					return
+				}
+			}
+			// 如果没有设置最大值,或者设置的最大值比当前值还小,则需要更新最大值
+			if !maxValue.Valid || maxValue.Float64 < tmpValue {
+				err = maxValue.Scan(tmpValue)
+				if err != nil {
+					return
+				}
+			}
+		}
+
+		nonTrendChartInfo.DataList = dataList
+		nonTrendChartInfo.MinData = minValue.Float64
+		nonTrendChartInfo.MaxData = maxValue.Float64
+	}
+
 	return
 }
 

+ 10 - 0
utils/common.go

@@ -1130,6 +1130,10 @@ func TimeTransferString(format string, t time.Time) string {
 	if t.IsZero() {
 		return ""
 	}
+	if strings.Contains(str, "0001-01-01") {
+		return ""
+	}
+
 	return str
 }
 
@@ -1755,6 +1759,9 @@ func GormDateStrToDateTimeStr(originalString string) (formatStr string) {
 	if originalString == `` {
 		return
 	}
+	if strings.Contains(originalString, "0001-01-01") {
+		return
+	}
 
 	formatStr = originalString
 	if !strings.Contains(originalString, "T") {
@@ -1782,6 +1789,9 @@ func GormDateStrToDateStr(originalString string) (formatStr string) {
 	if originalString == `` {
 		return
 	}
+	if strings.Contains(originalString, "0001-01-01") {
+		return
+	}
 
 	formatStr = originalString
 	if !strings.Contains(originalString, "T") {

+ 8 - 0
utils/constants.go

@@ -374,3 +374,11 @@ const (
 	DbNameAI          = "eta_ai"
 	DbNameWeekly      = "weekly_report"
 )
+
+// STL模型类型
+const (
+	StlTypeTrend    = 1 // 趋势
+	StlTypeSeasonal = 2 // 季节性指标
+	StlTypeResidual = 3 // 残差性指标
+	StlTypeNonTrend = 4 // 非趋势性指标
+)