base_from_ths_hf.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. package models
  2. import (
  3. "eta/eta_index_lib/global"
  4. "eta/eta_index_lib/models/mgo"
  5. "eta/eta_index_lib/utils"
  6. "fmt"
  7. "go.mongodb.org/mongo-driver/bson"
  8. "strings"
  9. "time"
  10. )
  11. var (
  12. ThsHfPeriodArr = []int{1, 3, 5, 10, 15, 30, 60} // 时间周期
  13. ThsHfCPSArr = []string{"no", "forward1", "forward2", "forward3", "forward4", "backward1", "backward2", "backward3", "backward4"} // 复权方式
  14. ThsHfFillArr = []string{"Original", "Previous", "Blank"} // 非交易间隔处理
  15. )
  16. // BaseFromThsHfIndex 同花顺高频数据
  17. type BaseFromThsHfIndex struct {
  18. BaseFromThsHfIndexId int `gorm:"column:base_from_ths_hf_index_id;primaryKey"`
  19. //BaseFromThsHfIndexId int `orm:"column(base_from_ths_hf_index_id);pk"`
  20. BaseFromThsHfClassifyId int `description:"分类ID"`
  21. IndexCode string `description:"指标编码"`
  22. IndexName string `description:"指标名称"`
  23. Unit string `description:"单位"`
  24. Source string `description:"数据来源"`
  25. Frequency string `description:"频度"`
  26. StartDate time.Time `description:"开始日期(至时分秒)"`
  27. EndDate time.Time `description:"结束日期(至时分秒)"`
  28. Describe string `description:"指标描述"`
  29. Sort int `description:"排序"`
  30. IsStop int `description:"是否停更:0-否;1-停更"`
  31. TerminalCode string `description:"所属终端编码"`
  32. StockCode string `description:"证券代码"`
  33. Indicator string `description:"同花顺指标代码"`
  34. ApiPars string `description:"API请求参数"`
  35. LatestValue float64 `description:"最新值"`
  36. SysUserId int `description:"创建人ID"`
  37. SysUserRealName string `description:"创建人姓名"`
  38. CreateTime time.Time `description:"创建时间"`
  39. ModifyTime time.Time `description:"修改时间"`
  40. }
  41. func (m *BaseFromThsHfIndex) TableName() string {
  42. return "base_from_ths_hf_index"
  43. }
  44. type BaseFromThsHfIndexCols struct {
  45. PrimaryId string
  46. BaseFromThsHfClassifyId string
  47. IndexCode string
  48. IndexName string
  49. Unit string
  50. Source string
  51. Frequency string
  52. StartDate string
  53. EndDate string
  54. Describe string
  55. Sort string
  56. IsStop string
  57. TerminalCode string
  58. StockCode string
  59. Indicator string
  60. ApiPars string
  61. LatestValue string
  62. SysUserId string
  63. SysUserRealName string
  64. CreateTime string
  65. ModifyTime string
  66. }
  67. func (m *BaseFromThsHfIndex) Cols() BaseFromThsHfIndexCols {
  68. return BaseFromThsHfIndexCols{
  69. PrimaryId: "base_from_ths_hf_index_id",
  70. BaseFromThsHfClassifyId: "base_from_ths_hf_classify_id",
  71. IndexCode: "index_code",
  72. IndexName: "index_name",
  73. Unit: "unit",
  74. Source: "source",
  75. Frequency: "frequency",
  76. StartDate: "start_date",
  77. EndDate: "end_date",
  78. Describe: "describe",
  79. Sort: "sort",
  80. IsStop: "is_stop",
  81. TerminalCode: "terminal_code",
  82. StockCode: "stock_code",
  83. Indicator: "indicator",
  84. ApiPars: "api_pars",
  85. LatestValue: "latest_value",
  86. SysUserId: "sys_user_id",
  87. SysUserRealName: "sys_user_real_name",
  88. CreateTime: "create_time",
  89. ModifyTime: "modify_time",
  90. }
  91. }
  92. func (m *BaseFromThsHfIndex) Create() (err error) {
  93. //o := orm.NewOrm()
  94. //id, err := o.Insert(m)
  95. err = global.DEFAULT_DB.Create(&m).Error
  96. //if err != nil {
  97. // return
  98. //}
  99. //m.BaseFromThsHfIndexId = int(id)
  100. return
  101. }
  102. func (m *BaseFromThsHfIndex) CreateMulti(items []*BaseFromThsHfIndex) (err error) {
  103. if len(items) == 0 {
  104. return
  105. }
  106. //o := orm.NewOrm()
  107. //_, err = o.InsertMulti(len(items), items)
  108. err = global.DEFAULT_DB.CreateInBatches(items, len(items)).Error
  109. return
  110. }
  111. func (m *BaseFromThsHfIndex) Update(cols []string) (err error) {
  112. //o := orm.NewOrm()
  113. //_, err = o.Update(m, cols...)
  114. err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
  115. return
  116. }
  117. func (m *BaseFromThsHfIndex) Remove() (err error) {
  118. //o := orm.NewOrm()
  119. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
  120. //_, err = o.Raw(sql, m.BaseFromThsHfIndexId).Exec()
  121. err = global.DEFAULT_DB.Exec(sql, m.BaseFromThsHfIndexId).Error
  122. return
  123. }
  124. func (m *BaseFromThsHfIndex) MultiRemove(ids []int) (err error) {
  125. if len(ids) == 0 {
  126. return
  127. }
  128. //o := orm.NewOrm()
  129. //sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
  130. //_, err = o.Raw(sql, ids).Exec()
  131. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN ?`, m.TableName(), m.Cols().PrimaryId)
  132. err = global.DEFAULT_DB.Exec(sql, ids).Error
  133. return
  134. }
  135. func (m *BaseFromThsHfIndex) RemoveByCondition(condition string, pars []interface{}) (err error) {
  136. if condition == "" {
  137. return
  138. }
  139. //o := orm.NewOrm()
  140. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
  141. //_, err = o.Raw(sql, pars).Exec()
  142. err = global.DEFAULT_DB.Exec(sql, pars...).Error
  143. return
  144. }
  145. func (m *BaseFromThsHfIndex) GetItemById(id int) (item *BaseFromThsHfIndex, err error) {
  146. //o := orm.NewOrm()
  147. sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
  148. //err = o.Raw(sql, id).QueryRow(&item)
  149. err = global.DEFAULT_DB.Raw(sql, id).First(&item).Error
  150. return
  151. }
  152. func (m *BaseFromThsHfIndex) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromThsHfIndex, err error) {
  153. //o := orm.NewOrm()
  154. order := ``
  155. if orderRule != "" {
  156. order = ` ORDER BY ` + orderRule
  157. }
  158. sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
  159. //err = o.Raw(sql, pars).QueryRow(&item)
  160. err = global.DEFAULT_DB.Raw(sql, pars...).First(&item).Error
  161. return
  162. }
  163. func (m *BaseFromThsHfIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
  164. //o := orm.NewOrm()
  165. sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
  166. //err = o.Raw(sql, pars).QueryRow(&count)
  167. err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&count).Error
  168. return
  169. }
  170. func (m *BaseFromThsHfIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromThsHfIndex, err error) {
  171. //o := orm.NewOrm()
  172. fields := strings.Join(fieldArr, ",")
  173. if len(fieldArr) == 0 {
  174. fields = `*`
  175. }
  176. order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
  177. if orderRule != "" {
  178. order = ` ORDER BY ` + orderRule
  179. }
  180. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
  181. //_, err = o.Raw(sql, pars).QueryRows(&items)
  182. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
  183. return
  184. }
  185. func (m *BaseFromThsHfIndex) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromThsHfIndex, err error) {
  186. //o := orm.NewOrm()
  187. fields := strings.Join(fieldArr, ",")
  188. if len(fieldArr) == 0 {
  189. fields = `*`
  190. }
  191. order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
  192. if orderRule != "" {
  193. order = ` ORDER BY ` + orderRule
  194. }
  195. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
  196. //_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  197. pars = append(pars, startSize, pageSize)
  198. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
  199. return
  200. }
  201. // BaseFromThsHfIndexItem 同花顺高频数据信息
  202. type BaseFromThsHfIndexItem struct {
  203. IndexId int `description:"同花顺高频数据ID"`
  204. IndexCode string `description:"指标编码"`
  205. IndexName string `description:"指标名称"`
  206. Unit string `description:"单位"`
  207. Source string `description:"数据来源"`
  208. Frequency string `description:"频度"`
  209. StartDate string `description:"开始日期(至时分秒)"`
  210. EndDate string `description:"结束日期(至时分秒)"`
  211. Describe string `description:"指标描述"`
  212. Sort int `description:"排序"`
  213. CreateTime string `description:"创建时间"`
  214. ModifyTime string `description:"修改时间"`
  215. }
  216. func (m *BaseFromThsHfIndex) Format2Item() (item *BaseFromThsHfIndexItem) {
  217. item = new(BaseFromThsHfIndexItem)
  218. item.IndexId = m.BaseFromThsHfIndexId
  219. item.IndexCode = m.IndexCode
  220. item.IndexName = m.IndexName
  221. item.Unit = m.Unit
  222. item.Source = m.Source
  223. item.Frequency = m.Frequency
  224. item.StartDate = utils.TimeTransferString(utils.FormatDateTime, m.StartDate)
  225. item.EndDate = utils.TimeTransferString(utils.FormatDateTime, m.EndDate)
  226. item.Describe = m.Describe
  227. item.Sort = m.Sort
  228. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, m.CreateTime)
  229. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, m.ModifyTime)
  230. return
  231. }
  232. // ThsHfSearchEdbReq 搜索指标请求体
  233. type ThsHfSearchEdbReq struct {
  234. StockCode string `form:"StockCode" description:"证券代码" `
  235. EdbCode string `form:"EdbCode" description:"指标代码"`
  236. StartTime string `form:"StartTime" description:"每日数据开始时间"`
  237. EndTime string `form:"EndTime" description:"每日数据结束时间"`
  238. Interval int `form:"Interval" description:"时间周期"`
  239. Fill string `form:"Fill" description:"非交易间隔处理"`
  240. CPS string `form:"CPS" description:"复权方式"`
  241. BaseDate string `form:"BaseDate" description:"复权基点"`
  242. }
  243. // ThsHfApiResp 同花顺接口响应
  244. type ThsHfApiResp struct {
  245. ErrorCode int `json:"errorcode"`
  246. ErrMsg string `json:"errmsg"`
  247. Tables []struct {
  248. ThsCode string `json:"thscode"`
  249. Time []string `json:"time"`
  250. Table map[string][]float64 `json:"table"`
  251. } `json:"tables"`
  252. }
  253. // ThsHfAppResp 同花顺公用机响应
  254. type ThsHfAppResp struct {
  255. ErrorCode int `json:"errorcode"`
  256. ErrMsg string `json:"errmsg"`
  257. //Data []interface{} `json:"data"`
  258. Data []struct {
  259. Time string `json:"time"`
  260. ThsCode string `json:"thscode"`
  261. Open float64 `json:"open"`
  262. Close float64 `json:"close"`
  263. } `json:"data"`
  264. }
  265. // ThsHfIndexWithData 同花顺高频指标
  266. type ThsHfIndexWithData struct {
  267. StockCode string `description:"证券代码"`
  268. EdbCode string `description:"指标代码"`
  269. IndexData []*ThsHfIndexData `description:"指标数据"`
  270. }
  271. // ThsHfIndexData 同花顺高频指标数据
  272. type ThsHfIndexData struct {
  273. DataTime time.Time `description:"数据时间(2006-01-02 15:04)"`
  274. Value float64 `description:"数据值"`
  275. }
  276. type ThsHfBaseAddIndexItem struct {
  277. ClassifyId int `description:"分类ID"`
  278. Unit string `description:"单位"`
  279. IndexName string `description:"指标名称"`
  280. Frequency string `description:"频度"`
  281. StockCode string `description:"证券代码"`
  282. EdbCode string `description:"指标代码"`
  283. }
  284. // ThsHfBaseAddReq 新增至数据源请求
  285. type ThsHfBaseAddReq struct {
  286. StartTime string `description:"每日数据开始时间"`
  287. EndTime string `description:"每日数据结束时间"`
  288. Interval int `description:"时间周期"`
  289. Fill string `description:"非交易间隔处理"`
  290. CPS string `description:"复权方式"`
  291. BaseDate string `description:"复权基点"`
  292. SysAdminId int `description:"创建人ID"`
  293. SysAdminName string `description:"创建人姓名"`
  294. ThsHfBaseAddIndexItem `description:"指标信息"`
  295. }
  296. // CreateIndexAndData 新增指标和数据
  297. //func (m *BaseFromThsHfIndex) CreateIndexAndData(indexItem *BaseFromThsHfIndex, indexData []*BaseFromThsHfData) (err error) {
  298. // o := orm.NewOrm()
  299. // tx, e := o.Begin()
  300. // if e != nil {
  301. // err = fmt.Errorf("tx begin err: %v", e)
  302. // return
  303. // }
  304. // defer func() {
  305. // if err != nil {
  306. // _ = tx.Rollback()
  307. // return
  308. // }
  309. // _ = tx.Commit()
  310. // }()
  311. //
  312. // lastId, e := tx.Insert(indexItem)
  313. // if e != nil {
  314. // err = fmt.Errorf("insert index err: %v", e)
  315. // return
  316. // }
  317. // indexId := int(lastId)
  318. // indexItem.BaseFromThsHfIndexId = indexId
  319. //
  320. // if len(indexData) == 0 {
  321. // return
  322. // }
  323. // for _, v := range indexData {
  324. // v.BaseFromThsHfIndexId = indexId
  325. // }
  326. // if _, e = tx.InsertMulti(200, indexData); e != nil {
  327. // err = fmt.Errorf("insert index data err: %v", e)
  328. // return
  329. // }
  330. // return
  331. //}
  332. // ThsHfBaseRefreshReq 数据源刷新请求
  333. type ThsHfBaseRefreshReq struct {
  334. BaseIndexCode string `description:"源指标编码"`
  335. RefreshType int `description:"刷新类型: 1-最近6小时; 2-全部刷新"`
  336. }
  337. // ThsHfEdbAddReq 新增至指标库
  338. type ThsHfEdbAddReq struct {
  339. ConvertRule ThsHfIndexConvert2EdbRule
  340. NewIndex *ThsHfIndexMultiSave2EdbPreItem `description:"新增指标"`
  341. }
  342. type ThsHfIndexConvert2EdbRule struct {
  343. ConvertType int `description:"转换类型: 1-指定时间值; 2-区间计算值"`
  344. ConvertFixed struct {
  345. FixedDay int `description:"指定时间值日期: 1-当日; 2-前一日"`
  346. FixedTime string `description:"指定时间值时点(HH:mm:ss)"`
  347. } `description:"指定时间值"`
  348. ConvertArea struct {
  349. StartDay int `description:"起始时间日期: 1-当日; 2-前一日"`
  350. StartTime string `description:"起始时间时点(HH:mm:ss)"`
  351. EndDay int `description:"截止时间日期: 1-当日; 2-前一日"`
  352. EndTime string `description:"截止时间时点(HH:mm:ss)"`
  353. CalculateType int `description:"计算类型: 1-区间均值; 2-最大值; 3-最小值"`
  354. } `description:"区间计算值"`
  355. }
  356. // ThsHfIndexMultiSave2EdbPreItem 批量新增指标库信息
  357. type ThsHfIndexMultiSave2EdbPreItem struct {
  358. IndexId int `description:"指标ID"`
  359. IndexCode string `description:"指标编码"`
  360. IndexName string `description:"原指标名称"`
  361. NewIndexName string `description:"新指标名称"`
  362. StockCode string `description:"证券代码"`
  363. EdbCode string `description:"指标代码"`
  364. Unit string `description:"单位"`
  365. Frequency string `description:"原频度"`
  366. NewFrequency string `description:"新频度(固定日度)"`
  367. ClassifyId int `description:"指标库分类ID"`
  368. SysAdminId int `description:"创建人ID"`
  369. SysAdminName string `description:"创建人姓名"`
  370. Tips string `description:"提示信息"`
  371. ErrMsg string `description:"错误信息"`
  372. }
  373. // GetEdbInfoMaxAndMinInfo
  374. // @Description: 获取指标的最新数据记录信息
  375. // @author: Roc
  376. // @receiver m
  377. // @datetime 2024-07-02 14:50:50
  378. // @param edbCode string
  379. // @return item *EdbInfoMaxAndMinInfo
  380. // @return err error
  381. func (m BaseFromThsHfIndex) GetEdbInfoMaxAndMinInfo(edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  382. if utils.UseMongo {
  383. return m.getEdbInfoMaxAndMinInfoByMongo(edbCode)
  384. }
  385. return m.getEdbInfoMaxAndMinInfoByMysql(edbCode)
  386. }
  387. // getEdbInfoMaxAndMinInfoByMongo
  388. // @Description: 获取指标的最新数据记录信息(从mongo中获取)
  389. // @author: Roc
  390. // @receiver m
  391. // @datetime 2024-07-02 14:41:20
  392. // @param edbCode string
  393. // @return item *EdbInfoMaxAndMinInfo
  394. // @return err error
  395. func (m BaseFromThsHfIndex) getEdbInfoMaxAndMinInfoByMongo(edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  396. mogDataObj := new(mgo.BaseFromThsHfData)
  397. pipeline := []bson.M{
  398. {"$match": bson.M{"index_code": edbCode}},
  399. {"$group": bson.M{
  400. "_id": nil,
  401. "min_date": bson.M{"$min": "$data_time"},
  402. "max_date": bson.M{"$max": "$data_time"},
  403. "min_value": bson.M{"$min": "$value"},
  404. "max_value": bson.M{"$max": "$value"},
  405. }},
  406. {"$project": bson.M{"_id": 0}}, // 可选,如果不需要_id字段
  407. }
  408. result, err := mogDataObj.GetEdbInfoMaxAndMinInfo(pipeline)
  409. if err != nil {
  410. fmt.Println("BaseFromThsHfIndex GetEdbInfoMaxAndMinInfo Err:" + err.Error())
  411. return
  412. }
  413. if !result.MaxDate.IsZero() {
  414. whereQuery := bson.M{"index_code": edbCode, "data_time": result.MaxDate}
  415. selectParam := bson.D{{"value", 1}, {"_id", 0}}
  416. latestValue, tmpErr := mogDataObj.GetLatestValue(whereQuery, selectParam)
  417. if tmpErr != nil {
  418. err = tmpErr
  419. return
  420. }
  421. result.LatestValue = latestValue.Value
  422. result.EndValue = latestValue.Value
  423. }
  424. item = &EdbInfoMaxAndMinInfo{
  425. MinDate: result.MinDate.Format(utils.FormatDateTime),
  426. MaxDate: result.MaxDate.Format(utils.FormatDateTime),
  427. MinValue: result.MinValue,
  428. MaxValue: result.MaxValue,
  429. LatestValue: result.LatestValue,
  430. LatestDate: result.LatestDate.Format(utils.FormatDateTime),
  431. EndValue: result.EndValue,
  432. }
  433. return
  434. }
  435. // getEdbInfoMaxAndMinInfoByMysql
  436. // @Description: 获取指标的最新数据记录信息(从mysql中获取)
  437. func (m BaseFromThsHfIndex) getEdbInfoMaxAndMinInfoByMysql(edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  438. dataObj := BaseFromThsHfData{}
  439. result, err := dataObj.GetIndexMinMax(edbCode)
  440. if err != nil {
  441. return
  442. }
  443. item = &EdbInfoMaxAndMinInfo{
  444. MinDate: result.MinDate,
  445. MaxDate: result.MaxDate,
  446. MinValue: result.MinValue,
  447. MaxValue: result.MaxValue,
  448. LatestValue: result.LatestValue,
  449. LatestDate: result.LatestDate,
  450. EndValue: result.EndValue,
  451. }
  452. return
  453. }