base_from_shfe.go 11 KB

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