base_from_ths_hf.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. package models
  2. import (
  3. "eta/eta_index_lib/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "strings"
  7. "time"
  8. )
  9. var (
  10. ThsHfPeriodArr = []int{1, 3, 5, 10, 15, 30, 60} // 时间周期
  11. ThsHfCPSArr = []string{"no", "forward1", "forward2", "forward3", "forward4", "backward1", "backward2", "backward3", "backward4"} // 复权方式
  12. ThsHfFillArr = []string{"Original", "Previous", "Blank"} // 非交易间隔处理
  13. )
  14. // BaseFromThsHfIndex 同花顺高频数据
  15. type BaseFromThsHfIndex struct {
  16. BaseFromThsHfIndexId int `orm:"column(base_from_ths_hf_index_id);pk"`
  17. BaseFromThsHfClassifyId int `description:"分类ID"`
  18. IndexCode string `description:"指标编码"`
  19. IndexName string `description:"指标名称"`
  20. Unit string `description:"单位"`
  21. Source string `description:"数据来源"`
  22. Frequency string `description:"频度"`
  23. StartDate time.Time `description:"开始日期(至时分秒)"`
  24. EndDate time.Time `description:"结束日期(至时分秒)"`
  25. Describe string `description:"指标描述"`
  26. Sort int `description:"排序"`
  27. IsStop int `description:"是否停更:0-否;1-停更"`
  28. TerminalCode string `description:"所属终端编码"`
  29. StockCode string `description:"证券代码"`
  30. Indicator string `description:"同花顺指标代码"`
  31. ApiPars string `description:"API请求参数"`
  32. LatestValue float64 `description:"最新值"`
  33. SysUserId int `description:"创建人ID"`
  34. SysUserRealName string `description:"创建人姓名"`
  35. CreateTime time.Time `description:"创建时间"`
  36. ModifyTime time.Time `description:"修改时间"`
  37. }
  38. func (m *BaseFromThsHfIndex) TableName() string {
  39. return "base_from_ths_hf_index"
  40. }
  41. type BaseFromThsHfIndexCols struct {
  42. PrimaryId string
  43. BaseFromThsHfClassifyId string
  44. IndexCode string
  45. IndexName string
  46. Unit string
  47. Source string
  48. Frequency string
  49. StartDate string
  50. EndDate string
  51. Describe string
  52. Sort string
  53. IsStop string
  54. TerminalCode string
  55. StockCode string
  56. Indicator string
  57. ApiPars string
  58. LatestValue string
  59. SysUserId string
  60. SysUserRealName string
  61. CreateTime string
  62. ModifyTime string
  63. }
  64. func (m *BaseFromThsHfIndex) Cols() BaseFromThsHfIndexCols {
  65. return BaseFromThsHfIndexCols{
  66. PrimaryId: "base_from_ths_hf_index_id",
  67. BaseFromThsHfClassifyId: "base_from_ths_hf_classify_id",
  68. IndexCode: "index_code",
  69. IndexName: "index_name",
  70. Unit: "unit",
  71. Source: "source",
  72. Frequency: "frequency",
  73. StartDate: "start_date",
  74. EndDate: "end_date",
  75. Describe: "describe",
  76. Sort: "sort",
  77. IsStop: "is_stop",
  78. TerminalCode: "terminal_code",
  79. StockCode: "stock_code",
  80. Indicator: "indicator",
  81. ApiPars: "api_pars",
  82. LatestValue: "latest_value",
  83. SysUserId: "sys_user_id",
  84. SysUserRealName: "sys_user_real_name",
  85. CreateTime: "create_time",
  86. ModifyTime: "modify_time",
  87. }
  88. }
  89. func (m *BaseFromThsHfIndex) Create() (err error) {
  90. o := orm.NewOrm()
  91. id, err := o.Insert(m)
  92. if err != nil {
  93. return
  94. }
  95. m.BaseFromThsHfIndexId = int(id)
  96. return
  97. }
  98. func (m *BaseFromThsHfIndex) CreateMulti(items []*BaseFromThsHfIndex) (err error) {
  99. if len(items) == 0 {
  100. return
  101. }
  102. o := orm.NewOrm()
  103. _, err = o.InsertMulti(len(items), items)
  104. return
  105. }
  106. func (m *BaseFromThsHfIndex) Update(cols []string) (err error) {
  107. o := orm.NewOrm()
  108. _, err = o.Update(m, cols...)
  109. return
  110. }
  111. func (m *BaseFromThsHfIndex) Remove() (err error) {
  112. o := orm.NewOrm()
  113. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
  114. _, err = o.Raw(sql, m.BaseFromThsHfIndexId).Exec()
  115. return
  116. }
  117. func (m *BaseFromThsHfIndex) MultiRemove(ids []int) (err error) {
  118. if len(ids) == 0 {
  119. return
  120. }
  121. o := orm.NewOrm()
  122. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
  123. _, err = o.Raw(sql, ids).Exec()
  124. return
  125. }
  126. func (m *BaseFromThsHfIndex) RemoveByCondition(condition string, pars []interface{}) (err error) {
  127. if condition == "" {
  128. return
  129. }
  130. o := orm.NewOrm()
  131. sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
  132. _, err = o.Raw(sql, pars).Exec()
  133. return
  134. }
  135. func (m *BaseFromThsHfIndex) GetItemById(id int) (item *BaseFromThsHfIndex, err error) {
  136. o := orm.NewOrm()
  137. sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
  138. err = o.Raw(sql, id).QueryRow(&item)
  139. return
  140. }
  141. func (m *BaseFromThsHfIndex) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *BaseFromThsHfIndex, err error) {
  142. o := orm.NewOrm()
  143. order := ``
  144. if orderRule != "" {
  145. order = ` ORDER BY ` + orderRule
  146. }
  147. sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
  148. err = o.Raw(sql, pars).QueryRow(&item)
  149. return
  150. }
  151. func (m *BaseFromThsHfIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
  152. o := orm.NewOrm()
  153. sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
  154. err = o.Raw(sql, pars).QueryRow(&count)
  155. return
  156. }
  157. func (m *BaseFromThsHfIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromThsHfIndex, err error) {
  158. o := orm.NewOrm()
  159. fields := strings.Join(fieldArr, ",")
  160. if len(fieldArr) == 0 {
  161. fields = `*`
  162. }
  163. order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
  164. if orderRule != "" {
  165. order = ` ORDER BY ` + orderRule
  166. }
  167. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
  168. _, err = o.Raw(sql, pars).QueryRows(&items)
  169. return
  170. }
  171. func (m *BaseFromThsHfIndex) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*BaseFromThsHfIndex, err error) {
  172. o := orm.NewOrm()
  173. fields := strings.Join(fieldArr, ",")
  174. if len(fieldArr) == 0 {
  175. fields = `*`
  176. }
  177. order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
  178. if orderRule != "" {
  179. order = ` ORDER BY ` + orderRule
  180. }
  181. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
  182. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  183. return
  184. }
  185. // BaseFromThsHfIndexItem 同花顺高频数据信息
  186. type BaseFromThsHfIndexItem struct {
  187. IndexId int `description:"同花顺高频数据ID"`
  188. IndexCode string `description:"指标编码"`
  189. IndexName string `description:"指标名称"`
  190. Unit string `description:"单位"`
  191. Source string `description:"数据来源"`
  192. Frequency string `description:"频度"`
  193. StartDate string `description:"开始日期(至时分秒)"`
  194. EndDate string `description:"结束日期(至时分秒)"`
  195. Describe string `description:"指标描述"`
  196. Sort int `description:"排序"`
  197. CreateTime string `description:"创建时间"`
  198. ModifyTime string `description:"修改时间"`
  199. }
  200. func (m *BaseFromThsHfIndex) Format2Item() (item *BaseFromThsHfIndexItem) {
  201. item = new(BaseFromThsHfIndexItem)
  202. item.IndexId = m.BaseFromThsHfIndexId
  203. item.IndexCode = m.IndexCode
  204. item.IndexName = m.IndexName
  205. item.Unit = m.Unit
  206. item.Source = m.Source
  207. item.Frequency = m.Frequency
  208. item.StartDate = utils.TimeTransferString(utils.FormatDateTime, m.StartDate)
  209. item.EndDate = utils.TimeTransferString(utils.FormatDateTime, m.EndDate)
  210. item.Describe = m.Describe
  211. item.Sort = m.Sort
  212. item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, m.CreateTime)
  213. item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, m.ModifyTime)
  214. return
  215. }
  216. // ThsHfSearchEdbReq 搜索指标请求体
  217. type ThsHfSearchEdbReq struct {
  218. StockCode string `form:"StockCode" description:"证券代码" `
  219. EdbCode string `form:"EdbCode" description:"指标代码"`
  220. StartTime string `form:"StartTime" description:"每日数据开始时间"`
  221. EndTime string `form:"EndTime" description:"每日数据结束时间"`
  222. Interval int `form:"Interval" description:"时间周期"`
  223. Fill string `form:"Fill" description:"非交易间隔处理"`
  224. CPS string `form:"CPS" description:"复权方式"`
  225. BaseDate string `form:"BaseDate" description:"复权基点"`
  226. }
  227. // ThsHfApiResp 同花顺接口响应
  228. type ThsHfApiResp struct {
  229. ErrorCode int `json:"errorcode"`
  230. ErrMsg string `json:"errmsg"`
  231. Tables []struct {
  232. ThsCode string `json:"thscode"`
  233. Time []string `json:"time"`
  234. Table map[string][]float64 `json:"table"`
  235. } `json:"tables"`
  236. }
  237. // ThsHfAppResp 同花顺公用机响应
  238. type ThsHfAppResp struct {
  239. ErrorCode int `json:"errorcode"`
  240. ErrMsg string `json:"errmsg"`
  241. //Data []interface{} `json:"data"`
  242. Data []struct {
  243. Time string `json:"time"`
  244. ThsCode string `json:"thscode"`
  245. Open float64 `json:"open"`
  246. Close float64 `json:"close"`
  247. } `json:"data"`
  248. }
  249. // ThsHfIndexWithData 同花顺高频指标
  250. type ThsHfIndexWithData struct {
  251. StockCode string `description:"证券代码"`
  252. EdbCode string `description:"指标代码"`
  253. IndexData []*ThsHfIndexData `description:"指标数据"`
  254. }
  255. // ThsHfIndexData 同花顺高频指标数据
  256. type ThsHfIndexData struct {
  257. DataTime time.Time `description:"数据时间(2006-01-02 15:04)"`
  258. Value float64 `description:"数据值"`
  259. }
  260. type ThsHfBaseAddIndexItem struct {
  261. ClassifyId int `description:"分类ID"`
  262. Unit string `description:"单位"`
  263. IndexName string `description:"指标名称"`
  264. Frequency string `description:"频度"`
  265. StockCode string `description:"证券代码"`
  266. EdbCode string `description:"指标代码"`
  267. }
  268. // ThsHfBaseAddReq 新增至数据源请求
  269. type ThsHfBaseAddReq struct {
  270. StartTime string `description:"每日数据开始时间"`
  271. EndTime string `description:"每日数据结束时间"`
  272. Interval int `description:"时间周期"`
  273. Fill string `description:"非交易间隔处理"`
  274. CPS string `description:"复权方式"`
  275. BaseDate string `description:"复权基点"`
  276. SysAdminId int `description:"创建人ID"`
  277. SysAdminName string `description:"创建人姓名"`
  278. ThsHfBaseAddIndexItem `description:"指标信息"`
  279. }
  280. // CreateIndexAndData 新增指标和数据
  281. func (m *BaseFromThsHfIndex) CreateIndexAndData(indexItem *BaseFromThsHfIndex, indexData []*BaseFromThsHfData) (err error) {
  282. o := orm.NewOrm()
  283. tx, e := o.Begin()
  284. if e != nil {
  285. err = fmt.Errorf("tx begin err: %v", e)
  286. return
  287. }
  288. defer func() {
  289. if err != nil {
  290. _ = tx.Rollback()
  291. return
  292. }
  293. _ = tx.Commit()
  294. }()
  295. lastId, e := tx.Insert(indexItem)
  296. if e != nil {
  297. err = fmt.Errorf("insert index err: %v", e)
  298. return
  299. }
  300. indexId := int(lastId)
  301. indexItem.BaseFromThsHfIndexId = indexId
  302. if len(indexData) == 0 {
  303. return
  304. }
  305. for _, v := range indexData {
  306. v.BaseFromThsHfIndexId = indexId
  307. }
  308. if _, e = tx.InsertMulti(200, indexData); e != nil {
  309. err = fmt.Errorf("insert index data err: %v", e)
  310. return
  311. }
  312. return
  313. }
  314. // ThsHfEdbAddReq 新增至指标库
  315. type ThsHfEdbAddReq struct {
  316. ConvertRule ThsHfIndexConvert2EdbRule
  317. NewIndex *ThsHfIndexMultiSave2EdbPreItem `description:"新增指标"`
  318. }
  319. type ThsHfIndexConvert2EdbRule struct {
  320. ConvertType int `description:"转换类型: 1-指定时间值; 2-区间计算值"`
  321. ConvertFixed struct {
  322. FixedDay int `description:"指定时间值日期: 1-当日; 2-前一日"`
  323. FixedTime string `description:"指定时间值时点(HH:mm:ss)"`
  324. } `description:"指定时间值"`
  325. ConvertArea struct {
  326. StartDay int `description:"起始时间日期: 1-当日; 2-前一日"`
  327. StartTime string `description:"起始时间时点(HH:mm:ss)"`
  328. EndDay int `description:"截止时间日期: 1-当日; 2-前一日"`
  329. EndTime string `description:"截止时间时点(HH:mm:ss)"`
  330. CalculateType int `description:"计算类型: 1-区间均值; 2-最大值; 3-最小值"`
  331. } `description:"区间计算值"`
  332. }
  333. // ThsHfIndexMultiSave2EdbPreItem 批量新增指标库信息
  334. type ThsHfIndexMultiSave2EdbPreItem struct {
  335. IndexId int `description:"指标ID"`
  336. IndexCode string `description:"指标编码"`
  337. IndexName string `description:"原指标名称"`
  338. NewIndexName string `description:"新指标名称"`
  339. StockCode string `description:"证券代码"`
  340. EdbCode string `description:"指标代码"`
  341. Unit string `description:"单位"`
  342. Frequency string `description:"原频度"`
  343. NewFrequency string `description:"新频度(固定日度)"`
  344. ClassifyId int `description:"指标库分类ID"`
  345. SysAdminId int `description:"创建人ID"`
  346. SysAdminName string `description:"创建人姓名"`
  347. Tips string `description:"提示信息"`
  348. ErrMsg string `description:"错误信息"`
  349. }