future_good_edb_data.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package future_good
  2. import (
  3. "fmt"
  4. "github.com/beego/beego/v2/client/orm"
  5. "hongze/hongze_edb_lib/services"
  6. "hongze/hongze_edb_lib/services/alarm_msg"
  7. "hongze/hongze_edb_lib/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // FutureGoodEdbData 期货指标数据的表
  13. type FutureGoodEdbData struct {
  14. FutureGoodEdbDataId int `orm:"column(future_good_edb_data_id);pk"`
  15. FutureGoodEdbInfoId int `description:"期货指标id"`
  16. FutureGoodEdbCode string `description:"期货指标code"`
  17. DataTime time.Time `description:"数据日期"`
  18. TradeCode string `description:"证券代码"`
  19. Open float64 `description:"开盘价"`
  20. High float64 `description:"最高价"`
  21. Low float64 `description:"最低价"`
  22. Close float64 `description:"收盘价"`
  23. Volume float64 `description:"成交量"`
  24. Amt float64 `description:"成交额"`
  25. Oi float64 `description:"持仓量"`
  26. Settle float64 `description:"结算价"`
  27. DataTimestamp int64 `description:"数据日期时间戳"`
  28. ModifyTime time.Time
  29. CreateTime time.Time
  30. }
  31. // FutureGoodEdbDataItem 期货指标数据的表
  32. type FutureGoodEdbDataItem struct {
  33. FutureGoodEdbDataId int `orm:"column(future_good_edb_data_id);pk"`
  34. FutureGoodEdbInfoId int `description:"期货指标id"`
  35. FutureGoodEdbCode string `description:"期货指标code"`
  36. DataTime string `description:"数据日期"`
  37. TradeCode string `description:"证券代码"`
  38. Open float64 `description:"开盘价"`
  39. High float64 `description:"最高价"`
  40. Low float64 `description:"最低价"`
  41. Close float64 `description:"收盘价"`
  42. Volume float64 `description:"成交量"`
  43. Amt float64 `description:"成交额"`
  44. Oi float64 `description:"持仓量"`
  45. Settle float64 `description:"结算价"`
  46. DataTimestamp int64 `description:"数据日期时间戳"`
  47. ModifyTime time.Time
  48. CreateTime time.Time
  49. }
  50. // GetFutureGoodEdbDataList 获取期货指标数据列表
  51. func GetFutureGoodEdbDataList(condition string, pars []interface{}) (list []*FutureGoodEdbDataItem, err error) {
  52. o := orm.NewOrm()
  53. sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
  54. if condition != "" {
  55. sql += condition
  56. }
  57. sql += `ORDER BY data_time asc `
  58. _, err = o.Raw(sql, pars).QueryRows(&list)
  59. return
  60. }
  61. // AddEdbDataFromWind 添加wind商品指标数据
  62. func AddEdbDataFromWind(futureGoodEdbInfoId int, edbCode string, item *services.FutureGoodDataFromThs) (err error) {
  63. var errMsg string
  64. o := orm.NewOrm()
  65. defer func() {
  66. if err != nil {
  67. //go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", " 同花顺数据获取失败:err:"+errMsg, utils.EmailSendToUsers)
  68. go alarm_msg.SendAlarmMsg("wind商品数据获取失败:err:"+errMsg, 3)
  69. }
  70. }()
  71. var isAdd bool
  72. addSql := ` INSERT INTO future_good_edb_data(future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp) values `
  73. table := item.Tables
  74. dataLen := len(table.Time)
  75. for k := 0; k < dataLen; k++ {
  76. eDate := table.Time[k]
  77. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  78. if err != nil {
  79. errMsg = " time.Parse :" + err.Error()
  80. return err
  81. }
  82. timestamp := dataTime.UnixNano() / 1e6
  83. timeStr := fmt.Sprintf("%d", timestamp)
  84. tradeCode := ``
  85. open := utils.SubFloatToString(table.Open[k], 20)
  86. high := utils.SubFloatToString(table.High[k], 20)
  87. low := utils.SubFloatToString(table.Low[k], 20)
  88. closeVal := utils.SubFloatToString(table.Close[k], 20)
  89. volume := utils.SubFloatToString(table.Volume[k], 20)
  90. amt := utils.SubFloatToString(table.Amount[k], 20)
  91. oi := utils.SubFloatToString(table.Ccl[k], 20)
  92. settle := utils.SubFloatToString(table.Settlement[k], 20)
  93. addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
  94. isAdd = true
  95. }
  96. if isAdd {
  97. addSql = strings.TrimRight(addSql, ",")
  98. _, err = o.Raw(addSql).Exec()
  99. if err != nil {
  100. errMsg = " tx.Exec Err :" + err.Error()
  101. return
  102. }
  103. }
  104. return
  105. }
  106. // RefreshFutureEdbEdbInfoReq 刷新商品指标请求
  107. type RefreshFutureEdbEdbInfoReq struct {
  108. FutureGoodEdbInfoId int `description:"指标ID"`
  109. FutureGoodEdbCode string `description:"指标编码"`
  110. StartDate string `description:"开始日期"`
  111. }
  112. // RefreshFutureGoodEdbDataFromThs 刷新wind期货指标数据
  113. func RefreshFutureGoodEdbDataFromThs(futureGoodEdbInfoId int, edbCode, startDate string, item *services.FutureGoodDataFromThs) (err error) {
  114. o := orm.NewOrm()
  115. to, err := o.Begin()
  116. if err != nil {
  117. return
  118. }
  119. defer func() {
  120. if err != nil {
  121. fmt.Println("RefreshAllCalculateTbz,Err:" + err.Error())
  122. _ = to.Rollback()
  123. } else {
  124. _ = to.Commit()
  125. }
  126. }()
  127. var existList []*FutureGoodEdbData
  128. // 获取指标中所有存在的数据值
  129. {
  130. var condition string
  131. var pars []interface{}
  132. condition += " AND future_good_edb_info_id=? "
  133. pars = append(pars, futureGoodEdbInfoId)
  134. //if startDate != "" {
  135. // condition += " AND data_time >= ? "
  136. // pars = append(pars, startDate)
  137. //}
  138. sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
  139. if condition != "" {
  140. sql += condition
  141. }
  142. sql += `ORDER BY data_time asc `
  143. _, err = to.Raw(sql, pars).QueryRows(&existList)
  144. }
  145. existMap := make(map[string]*FutureGoodEdbData)
  146. for _, v := range existList {
  147. existMap[v.DataTime.Format(utils.FormatDate)] = v
  148. }
  149. addSql := ` INSERT INTO future_good_edb_data(future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp) values `
  150. var isAdd bool
  151. addMap := make(map[string]string)
  152. table := item.Tables
  153. dataLen := len(table.Time)
  154. for k := 0; k < dataLen; k++ {
  155. eDate := table.Time[k]
  156. dataTime, tmpErr := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  157. if tmpErr != nil {
  158. err = tmpErr
  159. return
  160. }
  161. timestamp := dataTime.UnixNano() / 1e6
  162. timeStr := fmt.Sprintf("%d", timestamp)
  163. tradeCode := ``
  164. open := utils.SubFloatToString(table.Open[k], 20)
  165. high := utils.SubFloatToString(table.High[k], 20)
  166. low := utils.SubFloatToString(table.Low[k], 20)
  167. closeVal := utils.SubFloatToString(table.Close[k], 20)
  168. volume := utils.SubFloatToString(table.Volume[k], 20)
  169. amt := utils.SubFloatToString(table.Amount[k], 20)
  170. oi := utils.SubFloatToString(table.Ccl[k], 20)
  171. settle := utils.SubFloatToString(table.Settlement[k], 20)
  172. if findItem, ok := existMap[eDate]; !ok {
  173. if _, existOk := addMap[eDate]; !existOk {
  174. addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, eDate, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
  175. addMap[eDate] = "1"
  176. }
  177. isAdd = true
  178. } else {
  179. if findItem != nil {
  180. updateCol := make([]string, 0)
  181. if findItem.TradeCode != tradeCode {
  182. findItem.TradeCode = tradeCode
  183. updateCol = append(updateCol, "TradeCode")
  184. }
  185. if utils.SubFloatToString(findItem.Open, 30) != open {
  186. findItem.Open = table.Open[k]
  187. updateCol = append(updateCol, "Open")
  188. }
  189. if utils.SubFloatToString(findItem.High, 30) != high {
  190. findItem.High = table.High[k]
  191. updateCol = append(updateCol, "High")
  192. }
  193. if utils.SubFloatToString(findItem.Low, 30) != low {
  194. findItem.Low = table.Low[k]
  195. updateCol = append(updateCol, "Low")
  196. }
  197. if utils.SubFloatToString(findItem.Close, 30) != closeVal {
  198. findItem.Close = table.Close[k]
  199. updateCol = append(updateCol, "Close")
  200. }
  201. if utils.SubFloatToString(findItem.Volume, 30) != volume {
  202. findItem.Volume = table.Volume[k]
  203. updateCol = append(updateCol, "Volume")
  204. }
  205. if utils.SubFloatToString(findItem.Amt, 30) != amt {
  206. findItem.Amt = table.Amount[k]
  207. updateCol = append(updateCol, "Amt")
  208. }
  209. if utils.SubFloatToString(findItem.Oi, 30) != oi {
  210. findItem.Oi = table.Ccl[k]
  211. updateCol = append(updateCol, "Oi")
  212. }
  213. if utils.SubFloatToString(findItem.Settle, 30) != settle {
  214. findItem.Settle = table.Settlement[k]
  215. updateCol = append(updateCol, "Settle")
  216. }
  217. if len(updateCol) > 0 {
  218. _, err = to.Update(findItem, updateCol...)
  219. if err != nil {
  220. return
  221. }
  222. }
  223. }
  224. }
  225. }
  226. if isAdd {
  227. addSql = strings.TrimRight(addSql, ",")
  228. _, err = to.Raw(addSql).Exec()
  229. if err != nil {
  230. fmt.Println("RefreshEdbDataFromWind add Err", err.Error())
  231. return
  232. }
  233. }
  234. return
  235. }
  236. func GetAddSql(futureGoodEdbInfoId, futureGoodEdbCode, dataTime, tradeCode, open, high, low, close, volume, amt, oi, settle, timestampStr string) (addSql string) {
  237. //future_good_edb_info_id,future_good_edb_code,data_time,trade_code,open,high,low,close,volume,amt,oi,settle,create_time,modify_time,data_timestamp
  238. nowStr := time.Now().Format(utils.FormatDateTime)
  239. //addSql += "("
  240. //addSql += futureGoodEdbInfoId + "," + "'" + futureGoodEdbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
  241. // "," + "'" + nowStr + "'"
  242. //addSql += "," + "'" + timestampStr + "'"
  243. //addSql += "),"
  244. addSql = fmt.Sprintf("(%s,'%s','%s','%s',%s,%s,%s,%s,%s,%s,%s,%s,'%s','%s',%s),", futureGoodEdbInfoId, futureGoodEdbCode, dataTime, tradeCode, open, high, low, close, volume, amt, oi, settle, nowStr, nowStr, timestampStr)
  245. return
  246. }