package future_good import ( sql2 "database/sql" "errors" "eta/eta_index_lib/global" "eta/eta_index_lib/utils" "gorm.io/gorm" "time" ) type FutureGoodEdbInfo struct { FutureGoodEdbInfoId int `gorm:"column:future_good_edb_info_id;type:bigint(9) UNSIGNED;comment:期货指标id;primaryKey;not null;"` // 期货指标id FutureGoodEdbCode string `description:"期货指标code"` FutureGoodEdbName string `description:"期货指标名称"` FutureGoodEdbNameEn string `description:"期货指标英文名称"` ParentId int `description:"上级期货id"` RegionType string `description:"交易所来源,海外还是国内"` Exchange string `description:"所属交易所"` FutureGoodEdbType int `description:"指标类型,1:年月是固定的合约;2:只有M+N期的合约,未固定年月"` DateSourceId int `description:"画图时,日期来源的指标id"` Year int `description:"所属年份"` Month int `description:"所属月份"` StartDate string `description:"起始日期"` EndDate string `description:"终止日期"` MinValue float64 `description:"最小值"` MaxValue float64 `description:"最大值"` LatestValue float64 `description:"数据最新的值"` LatestDate time.Time `description:"数据最新的日期"` ServerUrl string `description:"服务器地址"` TerminalCode string `description:"终端编码,用于配置在机器上"` CreateTime time.Time ModifyTime time.Time } func (e *FutureGoodEdbInfo) AfterFind(db *gorm.DB) (err error) { e.StartDate = utils.GormDateStrToDateStr(e.StartDate) e.EndDate = utils.GormDateStrToDateStr(e.EndDate) return } func (e *FutureGoodEdbInfo) ConvDateTimeStr() { e.StartDate = utils.GormDateStrToDateStr(e.StartDate) e.EndDate = utils.GormDateStrToDateStr(e.EndDate) return } // GetFutureGoodEdbInfo 期货指标 func GetFutureGoodEdbInfo(edbInfoId int) (item *FutureGoodEdbInfo, err error) { sql := `SELECT * FROM future_good_edb_info WHERE future_good_edb_info_id = ? ` sql += ` ORDER BY future_good_edb_info_id DESC ` err = global.DEFAULT_DB.Raw(sql, edbInfoId).First(&item).Error if err != nil { return } item.ConvDateTimeStr() return } // GetFutureGoodEdbInfoByCode 根据指标code获取指标信息 func GetFutureGoodEdbInfoByCode(edbCode string) (item *FutureGoodEdbInfo, err error) { sql := `SELECT * FROM future_good_edb_info WHERE future_good_edb_code = ? limit 1 ` err = global.DEFAULT_DB.Raw(sql, edbCode).First(&item).Error if err != nil { return } item.ConvDateTimeStr() return } // GetFutureGoodEdbInfoList 获取指标数据列表 func GetFutureGoodEdbInfoList(condition string, pars []interface{}) (list []*FutureGoodEdbInfo, err error) { sql := `SELECT * FROM future_good_edb_info WHERE 1=1 ` if condition != "" { sql += condition } sql += `ORDER BY future_good_edb_info_id DESC ` err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error return } // GetAllFutureGoodEdbInfoList 获取指标数据列表 func GetAllFutureGoodEdbInfoList() (list []*FutureGoodEdbInfo, err error) { sql := `SELECT * FROM future_good_edb_info ORDER BY future_good_edb_info_id DESC ` err = global.DEFAULT_DB.Raw(sql).Find(&list).Error return } // AddFutureGoodEdbInfo 添加期货数据库指标 func AddFutureGoodEdbInfo(item *FutureGoodEdbInfo) (err error) { err = global.DEFAULT_DB.Create(item).Error return } // GetChildFutureGoodEdbInfoListByParentId 根据父级ID获取下面所有的指标数据列表 func GetChildFutureGoodEdbInfoListByParentId(parentId int) (list []*FutureGoodEdbInfo, err error) { sql := `SELECT * FROM future_good_edb_info WHERE parent_id = ? ORDER BY future_good_edb_info_id ASC ` err = global.DEFAULT_DB.Raw(sql, parentId).Find(&list).Error return } // Update 更新指标基础信息 func (FutureGoodEdbInfo *FutureGoodEdbInfo) Update(cols []string) (err error) { err = global.DEFAULT_DB.Model(FutureGoodEdbInfo).Select(cols).Updates(FutureGoodEdbInfo).Error return } // UnifiedModifyEdbInfoMaxAndMinInfo 统一修改指标的最大最小值 func UnifiedModifyEdbInfoMaxAndMinInfo(futureGoodEdbInfo *FutureGoodEdbInfo) (err error, errMsg string) { // 修改最大最小值 maxAndMinItem, err := GetEdbInfoMaxAndMinInfo(futureGoodEdbInfo.FutureGoodEdbCode) if err != nil { if err.Error() == utils.ErrNoRow() { err = nil return } errMsg = "刷新期货指标失败!" err = errors.New("获取期货指标最大最小值失败,err:" + err.Error()) return } if maxAndMinItem != nil { sql := ` UPDATE future_good_edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,latest_date=?,latest_value=?,modify_time=NOW() WHERE future_good_edb_info_id=? ` err = global.DEFAULT_DB.Exec(sql, maxAndMinItem.MinDate, maxAndMinItem.MaxDate, maxAndMinItem.MinValue, maxAndMinItem.MaxValue, maxAndMinItem.MaxDate, maxAndMinItem.LatestValue, futureGoodEdbInfo.FutureGoodEdbInfoId).Error if err != nil { errMsg = "刷新指标失败!" err = errors.New("修改指标最大最小值失败,err:" + err.Error()) return } } return } // FutureGoodEdbInfoMaxAndMinInfo 指标最新数据记录结构体 type FutureGoodEdbInfoMaxAndMinInfo struct { MinDate string `description:"最小日期"` MaxDate string `description:"最大日期"` MinValue float64 `description:"最小值"` MaxValue float64 `description:"最大值"` LatestValue float64 `description:"最新值"` LatestDate string `description:"实际数据最新日期"` } func (e *FutureGoodEdbInfoMaxAndMinInfo) ConvertDateTimeStr() { e.MinDate = utils.GormDateStrToDateStr(e.MinDate) e.MaxDate = utils.GormDateStrToDateStr(e.MaxDate) e.LatestDate = utils.GormDateStrToDateStr(e.LatestDate) return } // GetEdbInfoMaxAndMinInfo 获取指标的最新数据记录信息 func GetEdbInfoMaxAndMinInfo(futureGoodEdbCode string) (item *FutureGoodEdbInfoMaxAndMinInfo, err error) { sql := `` sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(close) AS min_value,MAX(close) AS max_value FROM future_good_edb_data WHERE future_good_edb_code=? ` err = global.DEFAULT_DB.Raw(sql, futureGoodEdbCode).First(&item).Error if err != nil { return } 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(&latestValueNull).Error if err == nil && latestValueNull.Valid { item.LatestValue = latestValueNull.Float64 } item.ConvertDateTimeStr() return }