base_from_shfe.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. package models
  2. import (
  3. "eta/eta_index_lib/global"
  4. "eta/eta_index_lib/utils"
  5. "fmt"
  6. "gorm.io/gorm"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. type BaseFromTradeShfeIndex struct {
  12. BaseFromTradeShfeIndexId int `gorm:"column:base_from_trade_ine_index_id;primaryKey"`
  13. //BaseFromTradeShfeIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
  14. Rank int
  15. DealShortName string
  16. DealName string
  17. DealCode string
  18. DealValue string
  19. DealChange int
  20. BuyShortName string
  21. BuyName string
  22. BuyCode string
  23. BuyValue string
  24. BuyChange int
  25. SoldShortName string
  26. SoldName string
  27. SoldCode string
  28. SoldValue string
  29. SoldChange int
  30. Frequency string
  31. ClassifyName string
  32. ClassifyType string
  33. CreateTime time.Time
  34. ModifyTime time.Time
  35. DataTime string
  36. }
  37. // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
  38. func (m *BaseFromTradeShfeIndex) AfterFind(db *gorm.DB) (err error) {
  39. m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
  40. return
  41. }
  42. func GetBaseFromShfeDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShfeIndex, err error) {
  43. //o := orm.NewOrm()
  44. sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
  45. sql = fmt.Sprintf(sql, suffix)
  46. //_, err = o.Raw(sql, indexCode).QueryRows(&list)
  47. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  48. return
  49. }
  50. type BaseFromShfeDataSimple struct {
  51. Id int `gorm:"column(base_from_trade_ine_index_id);primaryKey"`
  52. //Id int `orm:"column(base_from_trade_ine_index_id);pk"`
  53. DealCode string
  54. BuyCode string
  55. SoldCode string
  56. DataTime string
  57. DealValue string
  58. BuyValue string
  59. SoldValue string
  60. }
  61. func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) {
  62. sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 `
  63. //o := orm.NewOrm()
  64. if condition != "" {
  65. sql += condition
  66. }
  67. sql += ` ORDER BY data_time DESC `
  68. //_, err = o.Raw(sql, pars).QueryRows(&item)
  69. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
  70. return
  71. }
  72. // 新增上期能源指标数据
  73. func AddEdbDataFromShfe(edbCode string) (err error) {
  74. var suffix string
  75. if strings.Contains(edbCode, "deal") {
  76. suffix = "deal"
  77. } else if strings.Contains(edbCode, "buy") {
  78. suffix = "buy"
  79. } else if strings.Contains(edbCode, "sold") {
  80. suffix = "sold"
  81. }
  82. //o := orm.NewOrm()
  83. ineBaseDataAll, err := GetBaseFromShfeDataAllByIndexCode(edbCode, suffix)
  84. if err != nil && !utils.IsErrNoRow(err) {
  85. return
  86. }
  87. var isAdd bool
  88. addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  89. addSql = utils.ReplaceDriverKeywords("", addSql)
  90. existMap := make(map[string]string)
  91. for _, sv := range ineBaseDataAll {
  92. eDate := sv.DataTime
  93. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  94. if err != nil {
  95. fmt.Println("time.Parse Err:" + eDate)
  96. return err
  97. }
  98. timestamp := dataTime.UnixNano() / 1e6
  99. timeStr := fmt.Sprintf("%d", timestamp)
  100. if _, ok := existMap[eDate]; !ok {
  101. if suffix == "deal" {
  102. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
  103. } else if suffix == "buy" {
  104. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
  105. } else {
  106. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
  107. }
  108. isAdd = true
  109. }
  110. if suffix == "deal" {
  111. existMap[eDate] = sv.DealValue
  112. } else if suffix == "buy" {
  113. existMap[eDate] = sv.BuyValue
  114. } else {
  115. existMap[eDate] = sv.SoldValue
  116. }
  117. }
  118. if isAdd {
  119. addSql = strings.TrimRight(addSql, ",")
  120. utils.FileLog.Info("addSql:" + addSql)
  121. //_, err = o.Raw(addSql).Exec()
  122. err = global.DEFAULT_DB.Exec(addSql).Error
  123. if err != nil {
  124. return err
  125. }
  126. }
  127. return
  128. }
  129. // 刷新上期能源指标数据
  130. func RefreshEdbDataFromShfe(edbInfoId int, edbCode, startDate string) (err error) {
  131. source := utils.DATA_SOURCE_SHFE
  132. subSource := utils.DATA_SUB_SOURCE_EDB
  133. //o := orm.NewOrm()
  134. if err != nil {
  135. return
  136. }
  137. var suffix string
  138. if strings.Contains(edbCode, "deal") {
  139. suffix = "deal"
  140. } else if strings.Contains(edbCode, "buy") {
  141. suffix = "buy"
  142. } else if strings.Contains(edbCode, "sold") {
  143. suffix = "sold"
  144. }
  145. edbInfoIdStr := strconv.Itoa(edbInfoId)
  146. //计算数据
  147. var condition string
  148. var pars []interface{}
  149. if edbCode != "" {
  150. if suffix == "deal" {
  151. condition += " AND deal_code=? "
  152. } else if suffix == "buy" {
  153. condition += " AND buy_code=? "
  154. } else {
  155. condition += " AND sold_code=? "
  156. }
  157. pars = append(pars, edbCode)
  158. }
  159. if startDate != "" {
  160. condition += " AND data_time>=? "
  161. pars = append(pars, startDate)
  162. }
  163. glDataList, err := GetShfeDataByTradeCode(condition, pars)
  164. if err != nil {
  165. return
  166. }
  167. // 真实数据的最大日期 , 插入规则配置的日期
  168. var realDataMaxDate, edbDataInsertConfigDate time.Time
  169. var edbDataInsertConfig *EdbDataInsertConfig
  170. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  171. {
  172. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  173. if err != nil && !utils.IsErrNoRow(err) {
  174. return
  175. }
  176. if edbDataInsertConfig != nil {
  177. edbDataInsertConfigDate = edbDataInsertConfig.Date
  178. }
  179. }
  180. //获取指标所有数据
  181. var existCondition string
  182. var existPars []interface{}
  183. existCondition += " AND edb_info_id=? "
  184. existPars = append(existPars, edbInfoId)
  185. if startDate != "" {
  186. existCondition += " AND data_time>=? "
  187. existPars = append(existPars, startDate)
  188. }
  189. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  190. if err != nil {
  191. return err
  192. }
  193. existMap := make(map[string]*EdbInfoSearchData)
  194. for _, v := range existList {
  195. existMap[v.DataTime] = v
  196. }
  197. addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  198. var isAdd bool
  199. for _, v := range glDataList {
  200. var value string
  201. if suffix == "deal" {
  202. value = v.DealValue
  203. } else if suffix == "buy" {
  204. value = v.BuyValue
  205. } else {
  206. value = v.SoldValue
  207. }
  208. item := v
  209. itemValue := value
  210. eDate := item.DataTime
  211. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  212. if err != nil {
  213. return err
  214. }
  215. if _, ok := existMap[v.DataTime]; !ok {
  216. sValue := itemValue
  217. if sValue != "" {
  218. timestamp := dataTime.UnixNano() / 1e6
  219. timeStr := fmt.Sprintf("%d", timestamp)
  220. saveValue := sValue
  221. if findItem, ok := existMap[eDate]; !ok {
  222. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
  223. isAdd = true
  224. } else {
  225. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != saveValue {
  226. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, saveValue)
  227. if err != nil {
  228. return err
  229. }
  230. }
  231. }
  232. }
  233. }
  234. // 下面代码主要目的是处理掉手动插入的数据判断
  235. {
  236. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  237. realDataMaxDate = dataTime
  238. }
  239. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  240. isFindConfigDateRealData = true
  241. }
  242. }
  243. }
  244. // 处理手工数据补充的配置
  245. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  246. if isAdd {
  247. addSql = strings.TrimRight(addSql, ",")
  248. //_, err = o.Raw(addSql).Exec()
  249. err = global.DEFAULT_DB.Exec(addSql).Error
  250. if err != nil {
  251. return err
  252. }
  253. }
  254. return
  255. }
  256. type BaseFromTradeIneIndex struct {
  257. BaseFromTradeIneIndexId int `gorm:"column:base_from_trade_ine_index_id;primaryKey"`
  258. //BaseFromTradeIneIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
  259. Rank int
  260. DealShortName string
  261. DealName string
  262. DealCode string
  263. DealValue int
  264. DealChange int
  265. BuyShortName string
  266. BuyName string
  267. BuyCode string
  268. BuyValue int
  269. BuyChange int
  270. SoldShortName string
  271. SoldName string
  272. SoldCode string
  273. SoldValue int
  274. SoldChange int
  275. Frequency string
  276. ClassifyName string
  277. ClassifyType string
  278. CreateTime time.Time
  279. ModifyTime time.Time
  280. DataTime string
  281. }
  282. func (e *BaseFromTradeIneIndex) AfterFind(db *gorm.DB) (err error) {
  283. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  284. return
  285. }
  286. type BaseFromTradeMapping struct {
  287. BaseFromTradeMappingId int `gorm:"column:base_from_trade_mapping_id;primaryKey"`
  288. //BaseFromTradeMappingId int `orm:"column(base_from_trade_mapping_id);pk"`
  289. IndexName string
  290. IndexCode string
  291. Exchange string
  292. }
  293. func AddBaseFromTradeIneIndex(item *BaseFromTradeIneIndex) (lastId int64, err error) {
  294. //o := orm.NewOrm()
  295. //lastId, err = o.Insert(item)
  296. err = global.DEFAULT_DB.Create(&item).Error
  297. if err != nil {
  298. return
  299. }
  300. lastId = int64(item.BaseFromTradeIneIndexId)
  301. return
  302. }
  303. func GetBaseFromTradeIneIndexAll(dateStr string) (list []*BaseFromTradeIneIndex, err error) {
  304. //o := orm.NewOrm()
  305. sql := `SELECT * FROM base_from_trade_ine_index where data_time=?`
  306. //_, err = o.Raw(sql, dateStr).QueryRows(&list)
  307. err = global.DEFAULT_DB.Raw(sql, dateStr).Find(&list).Error
  308. return
  309. }
  310. func ModifyBaseFromTradeIneIndex(dealValue, buyValue, soldValue int, dataId int) (err error) {
  311. //o := orm.NewOrm()
  312. sql := `UPDATE base_from_trade_ine_index SET deal_value=?,buy_value=?,sold_value=?,modify_time=NOW() WHERE base_from_trade_ine_index_id=? `
  313. //_, err = o.Raw(sql, dealValue, buyValue, soldValue, dataId).Exec()
  314. err = global.DEFAULT_DB.Exec(sql, dealValue, buyValue, soldValue, dataId).Error
  315. return
  316. }
  317. func GetIndexCodeFromMapping(exchange string) (list []*BaseFromTradeMapping, err error) {
  318. //o := orm.NewOrm()
  319. sql := `SELECT * FROM base_from_trade_mapping where exchange=?`
  320. sql = utils.ReplaceDriverKeywords("", sql)
  321. //_, err = o.Raw(sql, exchange).QueryRows(&list)
  322. err = global.DEFAULT_DB.Raw(sql, exchange).Find(&list).Error
  323. return
  324. }
  325. func AddBaseFromTradeMapping(indexName, indexCode, exchange string) (err error) {
  326. //o := orm.NewOrm()
  327. sql := "Insert Into base_from_trade_mapping(index_name,index_code,exchange) Values('" + indexName + "','" + indexCode + "','" + exchange + "')"
  328. sql = utils.ReplaceDriverKeywords("", sql)
  329. //_, err = o.Raw(sql).Exec()
  330. err = global.DEFAULT_DB.Exec(sql).Error
  331. return
  332. }
  333. type RefreshINEExchangeReq struct {
  334. Date string `description:"日期"`
  335. Data IneJSONData
  336. }
  337. type IneJSONData struct {
  338. OCursor []OCursor `json:"o_cursor"`
  339. OCode interface{} `json:"o_code"`
  340. OMsg string `json:"o_msg"`
  341. ReportDate string `json:"report_date"`
  342. UpdateDate string `json:"update_date"`
  343. }
  344. type OCursor struct {
  345. Instrumentid string `json:"INSTRUMENTID"`
  346. Participantid3 string `json:"PARTICIPANTID3"`
  347. Participantid2 string `json:"PARTICIPANTID2"`
  348. Participantid1 string `json:"PARTICIPANTID1"`
  349. Participantabbr3 string `json:"PARTICIPANTABBR3"`
  350. Participantabbr2 string `json:"PARTICIPANTABBR2"`
  351. Rank int `json:"RANK"`
  352. Participantabbr1 string `json:"PARTICIPANTABBR1"`
  353. BuyIn interface{} `json:"CJ2"`
  354. Deal interface{} `json:"CJ1"`
  355. Change1 interface{} `json:"CJ1_CHG"`
  356. Change3 interface{} `json:"CJ3_CHG"`
  357. Productname string `json:"Productname"`
  358. Productsortno interface{} `json:"PRODUCTSORTNO"`
  359. SoldOut interface{} `json:"CJ3"`
  360. Change2 interface{} `json:"CJ2_CHG"`
  361. }