123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- package models
- import (
- "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"
- )
- var (
- ThsHfPeriodArr = []int{1, 3, 5, 10, 15, 30, 60} // 时间周期
- ThsHfCPSArr = []string{"no", "forward1", "forward2", "forward3", "forward4", "backward1", "backward2", "backward3", "backward4"} // 复权方式
- ThsHfFillArr = []string{"Original", "Previous", "Blank"} // 非交易间隔处理
- )
- // BaseFromThsHfIndex 同花顺高频数据
- type BaseFromThsHfIndex struct {
- BaseFromThsHfIndexId int `orm:"column(base_from_ths_hf_index_id);pk"`
- BaseFromThsHfClassifyId int `description:"分类ID"`
- IndexCode string `description:"指标编码"`
- IndexName string `description:"指标名称"`
- Unit string `description:"单位"`
- Source string `description:"数据来源"`
- Frequency string `description:"频度"`
- StartDate time.Time `description:"开始日期(至时分秒)"`
- EndDate time.Time `description:"结束日期(至时分秒)"`
- Describe string `description:"指标描述"`
- Sort int `description:"排序"`
- IsStop int `description:"是否停更:0-否;1-停更"`
- TerminalCode string `description:"所属终端编码"`
- StockCode string `description:"证券代码"`
- Indicator string `description:"同花顺指标代码"`
- ApiPars string `description:"API请求参数"`
- LatestValue float64 `description:"最新值"`
- SysUserId int `description:"创建人ID"`
- SysUserRealName string `description:"创建人姓名"`
- CreateTime time.Time `description:"创建时间"`
- ModifyTime time.Time `description:"修改时间"`
- }
- func (m *BaseFromThsHfIndex) TableName() string {
- return "base_from_ths_hf_index"
- }
- type BaseFromThsHfIndexCols struct {
- PrimaryId string
- BaseFromThsHfClassifyId string
- IndexCode string
- IndexName string
- Unit string
- Source string
- Frequency string
- StartDate string
- EndDate string
- Describe string
- Sort string
- IsStop string
- TerminalCode string
- StockCode string
- Indicator string
- ApiPars string
- LatestValue string
- SysUserId string
- SysUserRealName string
- CreateTime string
- ModifyTime string
- }
- func (m *BaseFromThsHfIndex) Cols() BaseFromThsHfIndexCols {
- return BaseFromThsHfIndexCols{
- PrimaryId: "base_from_ths_hf_index_id",
- BaseFromThsHfClassifyId: "base_from_ths_hf_classify_id",
- IndexCode: "index_code",
- IndexName: "index_name",
- Unit: "unit",
- Source: "source",
- Frequency: "frequency",
- StartDate: "start_date",
- EndDate: "end_date",
- Describe: "describe",
- Sort: "sort",
- IsStop: "is_stop",
- TerminalCode: "terminal_code",
- StockCode: "stock_code",
- Indicator: "indicator",
- ApiPars: "api_pars",
- LatestValue: "latest_value",
- SysUserId: "sys_user_id",
- SysUserRealName: "sys_user_real_name",
- CreateTime: "create_time",
- ModifyTime: "modify_time",
- }
- }
- func (m *BaseFromThsHfIndex) Create() (err error) {
- o := orm.NewOrm()
- id, err := o.Insert(m)
- if err != nil {
- return
- }
- m.BaseFromThsHfIndexId = int(id)
- return
- }
- func (m *BaseFromThsHfIndex) CreateMulti(items []*BaseFromThsHfIndex) (err error) {
- if len(items) == 0 {
- return
- }
- o := orm.NewOrm()
- _, err = o.InsertMulti(len(items), items)
- return
- }
- func (m *BaseFromThsHfIndex) Update(cols []string) (err error) {
- o := orm.NewOrm()
- _, err = o.Update(m, cols...)
- return
- }
- func (m *BaseFromThsHfIndex) Remove() (err error) {
- 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()
- return
- }
- 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()
- return
- }
- func (m *BaseFromThsHfIndex) RemoveByCondition(condition string, pars []interface{}) (err error) {
- if condition == "" {
- return
- }
- o := orm.NewOrm()
- sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
- _, err = o.Raw(sql, pars).Exec()
- return
- }
- func (m *BaseFromThsHfIndex) GetItemById(id int) (item *BaseFromThsHfIndex, err error) {
- 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)
- return
- }
- func (m *BaseFromThsHfIndex) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromThsHfIndex, err error) {
- 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)
- return
- }
- func (m *BaseFromThsHfIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
- 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)
- return
- }
- func (m *BaseFromThsHfIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromThsHfIndex, err error) {
- o := orm.NewOrm()
- fields := strings.Join(fieldArr, ",")
- if len(fieldArr) == 0 {
- fields = `*`
- }
- order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
- if orderRule != "" {
- 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)
- return
- }
- func (m *BaseFromThsHfIndex) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromThsHfIndex, err error) {
- o := orm.NewOrm()
- fields := strings.Join(fieldArr, ",")
- if len(fieldArr) == 0 {
- fields = `*`
- }
- order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
- if orderRule != "" {
- 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)
- return
- }
- // BaseFromThsHfIndexItem 同花顺高频数据信息
- type BaseFromThsHfIndexItem struct {
- IndexId int `description:"同花顺高频数据ID"`
- IndexCode string `description:"指标编码"`
- IndexName string `description:"指标名称"`
- Unit string `description:"单位"`
- Source string `description:"数据来源"`
- Frequency string `description:"频度"`
- StartDate string `description:"开始日期(至时分秒)"`
- EndDate string `description:"结束日期(至时分秒)"`
- Describe string `description:"指标描述"`
- Sort int `description:"排序"`
- CreateTime string `description:"创建时间"`
- ModifyTime string `description:"修改时间"`
- }
- func (m *BaseFromThsHfIndex) Format2Item() (item *BaseFromThsHfIndexItem) {
- item = new(BaseFromThsHfIndexItem)
- item.IndexId = m.BaseFromThsHfIndexId
- item.IndexCode = m.IndexCode
- item.IndexName = m.IndexName
- item.Unit = m.Unit
- item.Source = m.Source
- item.Frequency = m.Frequency
- item.StartDate = utils.TimeTransferString(utils.FormatDateTime, m.StartDate)
- item.EndDate = utils.TimeTransferString(utils.FormatDateTime, m.EndDate)
- item.Describe = m.Describe
- item.Sort = m.Sort
- item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, m.CreateTime)
- item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, m.ModifyTime)
- return
- }
- // ThsHfSearchEdbReq 搜索指标请求体
- type ThsHfSearchEdbReq struct {
- StockCode string `form:"StockCode" description:"证券代码" `
- EdbCode string `form:"EdbCode" description:"指标代码"`
- StartTime string `form:"StartTime" description:"每日数据开始时间"`
- EndTime string `form:"EndTime" description:"每日数据结束时间"`
- Interval int `form:"Interval" description:"时间周期"`
- Fill string `form:"Fill" description:"非交易间隔处理"`
- CPS string `form:"CPS" description:"复权方式"`
- BaseDate string `form:"BaseDate" description:"复权基点"`
- }
- // ThsHfApiResp 同花顺接口响应
- type ThsHfApiResp struct {
- ErrorCode int `json:"errorcode"`
- ErrMsg string `json:"errmsg"`
- Tables []struct {
- ThsCode string `json:"thscode"`
- Time []string `json:"time"`
- Table map[string][]float64 `json:"table"`
- } `json:"tables"`
- }
- // ThsHfAppResp 同花顺公用机响应
- type ThsHfAppResp struct {
- ErrorCode int `json:"errorcode"`
- ErrMsg string `json:"errmsg"`
- //Data []interface{} `json:"data"`
- Data []struct {
- Time string `json:"time"`
- ThsCode string `json:"thscode"`
- Open float64 `json:"open"`
- Close float64 `json:"close"`
- } `json:"data"`
- }
- // ThsHfIndexWithData 同花顺高频指标
- type ThsHfIndexWithData struct {
- StockCode string `description:"证券代码"`
- EdbCode string `description:"指标代码"`
- IndexData []*ThsHfIndexData `description:"指标数据"`
- }
- // ThsHfIndexData 同花顺高频指标数据
- type ThsHfIndexData struct {
- DataTime time.Time `description:"数据时间(2006-01-02 15:04)"`
- Value float64 `description:"数据值"`
- }
- type ThsHfBaseAddIndexItem struct {
- ClassifyId int `description:"分类ID"`
- Unit string `description:"单位"`
- IndexName string `description:"指标名称"`
- Frequency string `description:"频度"`
- StockCode string `description:"证券代码"`
- EdbCode string `description:"指标代码"`
- }
- // ThsHfBaseAddReq 新增至数据源请求
- type ThsHfBaseAddReq struct {
- StartTime string `description:"每日数据开始时间"`
- EndTime string `description:"每日数据结束时间"`
- Interval int `description:"时间周期"`
- Fill string `description:"非交易间隔处理"`
- CPS string `description:"复权方式"`
- BaseDate string `description:"复权基点"`
- SysAdminId int `description:"创建人ID"`
- SysAdminName string `description:"创建人姓名"`
- ThsHfBaseAddIndexItem `description:"指标信息"`
- }
- // CreateIndexAndData 新增指标和数据
- //func (m *BaseFromThsHfIndex) CreateIndexAndData(indexItem *BaseFromThsHfIndex, indexData []*BaseFromThsHfData) (err error) {
- // o := orm.NewOrm()
- // tx, e := o.Begin()
- // if e != nil {
- // err = fmt.Errorf("tx begin err: %v", e)
- // return
- // }
- // defer func() {
- // if err != nil {
- // _ = tx.Rollback()
- // return
- // }
- // _ = tx.Commit()
- // }()
- //
- // lastId, e := tx.Insert(indexItem)
- // if e != nil {
- // err = fmt.Errorf("insert index err: %v", e)
- // return
- // }
- // indexId := int(lastId)
- // indexItem.BaseFromThsHfIndexId = indexId
- //
- // if len(indexData) == 0 {
- // return
- // }
- // for _, v := range indexData {
- // v.BaseFromThsHfIndexId = indexId
- // }
- // if _, e = tx.InsertMulti(200, indexData); e != nil {
- // err = fmt.Errorf("insert index data err: %v", e)
- // return
- // }
- // return
- //}
- // ThsHfBaseRefreshReq 数据源刷新请求
- type ThsHfBaseRefreshReq struct {
- BaseIndexCode string `description:"源指标编码"`
- RefreshType int `description:"刷新类型: 1-最近6小时; 2-全部刷新"`
- }
- // ThsHfEdbAddReq 新增至指标库
- type ThsHfEdbAddReq struct {
- ConvertRule ThsHfIndexConvert2EdbRule
- NewIndex *ThsHfIndexMultiSave2EdbPreItem `description:"新增指标"`
- }
- type ThsHfIndexConvert2EdbRule struct {
- ConvertType int `description:"转换类型: 1-指定时间值; 2-区间计算值"`
- ConvertFixed struct {
- FixedDay int `description:"指定时间值日期: 1-当日; 2-前一日"`
- FixedTime string `description:"指定时间值时点(HH:mm:ss)"`
- } `description:"指定时间值"`
- ConvertArea struct {
- StartDay int `description:"起始时间日期: 1-当日; 2-前一日"`
- StartTime string `description:"起始时间时点(HH:mm:ss)"`
- EndDay int `description:"截止时间日期: 1-当日; 2-前一日"`
- EndTime string `description:"截止时间时点(HH:mm:ss)"`
- CalculateType int `description:"计算类型: 1-区间均值; 2-最大值; 3-最小值"`
- } `description:"区间计算值"`
- }
- // ThsHfIndexMultiSave2EdbPreItem 批量新增指标库信息
- type ThsHfIndexMultiSave2EdbPreItem struct {
- IndexId int `description:"指标ID"`
- IndexCode string `description:"指标编码"`
- IndexName string `description:"原指标名称"`
- NewIndexName string `description:"新指标名称"`
- StockCode string `description:"证券代码"`
- EdbCode string `description:"指标代码"`
- Unit string `description:"单位"`
- Frequency string `description:"原频度"`
- NewFrequency string `description:"新频度(固定日度)"`
- ClassifyId int `description:"指标库分类ID"`
- SysAdminId int `description:"创建人ID"`
- SysAdminName string `description:"创建人姓名"`
- Tips string `description:"提示信息"`
- ErrMsg string `description:"错误信息"`
- }
- // GetEdbInfoMaxAndMinInfo
- // @Description: 获取指标的最新数据记录信息
- // @author: Roc
- // @receiver m
- // @datetime 2024-07-02 14:50:50
- // @param edbCode string
- // @return item *EdbInfoMaxAndMinInfo
- // @return err error
- func (m BaseFromThsHfIndex) GetEdbInfoMaxAndMinInfo(edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
- if utils.UseMongo {
- return m.getEdbInfoMaxAndMinInfoByMongo(edbCode)
- }
- return m.getEdbInfoMaxAndMinInfoByMysql(edbCode)
- }
- // getEdbInfoMaxAndMinInfoByMongo
- // @Description: 获取指标的最新数据记录信息(从mongo中获取)
- // @author: Roc
- // @receiver m
- // @datetime 2024-07-02 14:41:20
- // @param edbCode string
- // @return item *EdbInfoMaxAndMinInfo
- // @return err error
- func (m BaseFromThsHfIndex) getEdbInfoMaxAndMinInfoByMongo(edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
- mogDataObj := new(mgo.BaseFromThsHfData)
- pipeline := []bson.M{
- {"$match": bson.M{"index_code": edbCode}},
- {"$group": bson.M{
- "_id": nil,
- "min_date": bson.M{"$min": "$data_time"},
- "max_date": bson.M{"$max": "$data_time"},
- "min_value": bson.M{"$min": "$value"},
- "max_value": bson.M{"$max": "$value"},
- }},
- {"$project": bson.M{"_id": 0}}, // 可选,如果不需要_id字段
- }
- result, err := mogDataObj.GetEdbInfoMaxAndMinInfo(pipeline)
- if err != nil {
- fmt.Println("BaseFromThsHfIndex GetEdbInfoMaxAndMinInfo Err:" + err.Error())
- return
- }
- if !result.MaxDate.IsZero() {
- whereQuery := bson.M{"index_code": edbCode, "data_time": result.MaxDate}
- selectParam := bson.D{{"value", 1}, {"_id", 0}}
- latestValue, tmpErr := mogDataObj.GetLatestValue(whereQuery, selectParam)
- if tmpErr != nil {
- err = tmpErr
- return
- }
- result.LatestValue = latestValue.Value
- result.EndValue = latestValue.Value
- }
- item = &EdbInfoMaxAndMinInfo{
- MinDate: result.MinDate.Format(utils.FormatDateTime),
- MaxDate: result.MaxDate.Format(utils.FormatDateTime),
- MinValue: result.MinValue,
- MaxValue: result.MaxValue,
- LatestValue: result.LatestValue,
- LatestDate: result.LatestDate.Format(utils.FormatDateTime),
- EndValue: result.EndValue,
- }
- return
- }
- // getEdbInfoMaxAndMinInfoByMysql
- // @Description: 获取指标的最新数据记录信息(从mysql中获取)
- func (m BaseFromThsHfIndex) getEdbInfoMaxAndMinInfoByMysql(edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
- dataObj := BaseFromThsHfData{}
- result, err := dataObj.GetIndexMinMax(edbCode)
- if err != nil {
- return
- }
- item = &EdbInfoMaxAndMinInfo{
- MinDate: result.MinDate,
- MaxDate: result.MaxDate,
- MinValue: result.MinValue,
- MaxValue: result.MaxValue,
- LatestValue: result.LatestValue,
- LatestDate: result.LatestDate,
- EndValue: result.EndValue,
- }
- return
- }
|