base_from_ths_hf.go 17 KB

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