future_good_edb_data.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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.FutureGoodDataFromWind) (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. for k, v := range item.Dt {
  74. timeStr := fmt.Sprintf("%d", v)
  75. v = v / 1000
  76. t := time.Unix(v, 0)
  77. dateTime := t.Format(utils.FormatDate)
  78. tradeCode := item.TradeCode[k]
  79. open := utils.SubFloatToString(item.Open[k], 20)
  80. high := utils.SubFloatToString(item.High[k], 20)
  81. low := utils.SubFloatToString(item.Low[k], 20)
  82. closeVal := utils.SubFloatToString(item.Close[k], 20)
  83. volume := utils.SubFloatToString(item.Volume[k], 20)
  84. amt := utils.SubFloatToString(item.Amt[k], 20)
  85. oi := utils.SubFloatToString(item.Oi[k], 20)
  86. settle := utils.SubFloatToString(item.Settle[k], 20)
  87. addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, dateTime, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
  88. isAdd = true
  89. }
  90. if isAdd {
  91. addSql = strings.TrimRight(addSql, ",")
  92. _, err = o.Raw(addSql).Exec()
  93. if err != nil {
  94. errMsg = " tx.Exec Err :" + err.Error()
  95. return
  96. }
  97. }
  98. return
  99. }
  100. // RefreshFutureEdbEdbInfoReq 刷新商品指标请求
  101. type RefreshFutureEdbEdbInfoReq struct {
  102. FutureGoodEdbInfoId int `description:"指标ID"`
  103. FutureGoodEdbCode string `description:"指标编码"`
  104. StartDate string `description:"开始日期"`
  105. }
  106. // RefreshFutureGoodEdbDataFromWind 刷新wind期货指标数据
  107. func RefreshFutureGoodEdbDataFromWind(futureGoodEdbInfoId int, edbCode, startDate string, item *services.FutureGoodDataFromWind) (err error) {
  108. o := orm.NewOrm()
  109. to, err := o.Begin()
  110. if err != nil {
  111. return
  112. }
  113. defer func() {
  114. if err != nil {
  115. fmt.Println("RefreshAllCalculateTbz,Err:" + err.Error())
  116. _ = to.Rollback()
  117. } else {
  118. _ = to.Commit()
  119. }
  120. }()
  121. var existList []*FutureGoodEdbDataItem
  122. // 获取指标中所有存在的数据值
  123. {
  124. var condition string
  125. var pars []interface{}
  126. condition += " AND future_good_edb_info_id=? "
  127. pars = append(pars, futureGoodEdbInfoId)
  128. //if startDate != "" {
  129. // condition += " AND data_time >= ? "
  130. // pars = append(pars, startDate)
  131. //}
  132. sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
  133. if condition != "" {
  134. sql += condition
  135. }
  136. sql += `ORDER BY data_time asc `
  137. _, err = to.Raw(sql, pars).QueryRows(&existList)
  138. }
  139. existMap := make(map[string]*FutureGoodEdbDataItem)
  140. for _, v := range existList {
  141. existMap[v.DataTime] = v
  142. }
  143. 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 `
  144. var isAdd bool
  145. addMap := make(map[string]string)
  146. for k, v := range item.Dt {
  147. timeStr := fmt.Sprintf("%d", v)
  148. v = v / 1000
  149. t := time.Unix(v, 0)
  150. dateTime := t.Format(utils.FormatDate)
  151. tradeCode := item.TradeCode[k]
  152. open := utils.SubFloatToString(item.Open[k], 20)
  153. high := utils.SubFloatToString(item.High[k], 20)
  154. low := utils.SubFloatToString(item.Low[k], 20)
  155. closeVal := utils.SubFloatToString(item.Close[k], 20)
  156. volume := utils.SubFloatToString(item.Volume[k], 20)
  157. amt := utils.SubFloatToString(item.Amt[k], 20)
  158. oi := utils.SubFloatToString(item.Oi[k], 20)
  159. settle := utils.SubFloatToString(item.Settle[k], 20)
  160. if findItem, ok := existMap[dateTime]; !ok {
  161. if _, existOk := addMap[dateTime]; !existOk {
  162. addSql += GetAddSql(strconv.Itoa(futureGoodEdbInfoId), edbCode, dateTime, tradeCode, open, high, low, closeVal, volume, amt, oi, settle, timeStr)
  163. addMap[dateTime] = "1"
  164. }
  165. isAdd = true
  166. } else {
  167. if findItem != nil {
  168. updateCol := make([]string, 0)
  169. if findItem.TradeCode != tradeCode {
  170. findItem.TradeCode = tradeCode
  171. updateCol = append(updateCol, "TradeCode")
  172. }
  173. if utils.SubFloatToString(findItem.Open, 30) != open {
  174. findItem.Open = item.Open[k]
  175. updateCol = append(updateCol, "Open")
  176. }
  177. if utils.SubFloatToString(findItem.High, 30) != high {
  178. findItem.High = item.High[k]
  179. updateCol = append(updateCol, "High")
  180. }
  181. if utils.SubFloatToString(findItem.Low, 30) != low {
  182. findItem.Low = item.Low[k]
  183. updateCol = append(updateCol, "Low")
  184. }
  185. if utils.SubFloatToString(findItem.Close, 30) != closeVal {
  186. findItem.Close = item.Close[k]
  187. updateCol = append(updateCol, "Close")
  188. }
  189. if utils.SubFloatToString(findItem.Volume, 30) != volume {
  190. findItem.Volume = item.Volume[k]
  191. updateCol = append(updateCol, "Volume")
  192. }
  193. if utils.SubFloatToString(findItem.Amt, 30) != amt {
  194. findItem.Amt = item.Amt[k]
  195. updateCol = append(updateCol, "Amt")
  196. }
  197. if utils.SubFloatToString(findItem.Oi, 30) != oi {
  198. findItem.Oi = item.Oi[k]
  199. updateCol = append(updateCol, "Oi")
  200. }
  201. if utils.SubFloatToString(findItem.Settle, 30) != settle {
  202. findItem.Settle = item.Settle[k]
  203. updateCol = append(updateCol, "Settle")
  204. }
  205. if len(updateCol) > 0 {
  206. _, err = to.Update(findItem, updateCol...)
  207. if err != nil {
  208. return
  209. }
  210. }
  211. }
  212. }
  213. }
  214. if isAdd {
  215. addSql = strings.TrimRight(addSql, ",")
  216. _, err = to.Raw(addSql).Exec()
  217. if err != nil {
  218. fmt.Println("RefreshEdbDataFromWind add Err", err.Error())
  219. return
  220. }
  221. }
  222. return
  223. }
  224. func GetAddSql(futureGoodEdbInfoId, futureGoodEdbCode, dataTime, tradeCode, open, high, low, close, volume, amt, oi, settle, timestampStr string) (addSql string) {
  225. //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
  226. nowStr := time.Now().Format(utils.FormatDateTime)
  227. //addSql += "("
  228. //addSql += futureGoodEdbInfoId + "," + "'" + futureGoodEdbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
  229. // "," + "'" + nowStr + "'"
  230. //addSql += "," + "'" + timestampStr + "'"
  231. //addSql += "),"
  232. 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)
  233. return
  234. }