base_from_sh.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  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 BaseFromTradeShIndex struct {
  12. BaseFromTradeShIndexId int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
  13. //BaseFromTradeShIndexId int `orm:"column(base_from_trade_shanghai_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. type BaseFromShDataSimple struct {
  38. Id int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
  39. //Id int `orm:"column(base_from_trade_shanghai_index_id);pk"`
  40. DealCode string
  41. BuyCode string
  42. SoldCode string
  43. DataTime string
  44. DealValue string
  45. BuyValue string
  46. SoldValue string
  47. }
  48. // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
  49. func (m *BaseFromShDataSimple) AfterFind(db *gorm.DB) (err error) {
  50. m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
  51. return
  52. }
  53. func GetBaseFromShDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShIndex, err error) {
  54. //o := orm.NewOrm()
  55. sql := `SELECT * FROM base_from_trade_shanghai_index WHERE %s_code=? `
  56. sql = fmt.Sprintf(sql, suffix)
  57. //_, err = o.Raw(sql, indexCode).QueryRows(&list)
  58. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  59. return
  60. }
  61. func GetShDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShDataSimple, err error) {
  62. sql := ` SELECT * FROM base_from_trade_shanghai_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 AddEdbDataFromSh(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. shBaseDataAll, err := GetBaseFromShDataAllByIndexCode(edbCode, suffix)
  84. if err != nil && !utils.IsErrNoRow(err) {
  85. return
  86. }
  87. var isAdd bool
  88. addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  89. existMap := make(map[string]string)
  90. for _, sv := range shBaseDataAll {
  91. eDate := sv.DataTime
  92. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  93. if err != nil {
  94. fmt.Println("time.Parse Err:" + eDate)
  95. return err
  96. }
  97. timestamp := dataTime.UnixNano() / 1e6
  98. timeStr := fmt.Sprintf("%d", timestamp)
  99. if _, ok := existMap[eDate]; !ok {
  100. if suffix == "deal" {
  101. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
  102. } else if suffix == "buy" {
  103. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
  104. } else {
  105. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
  106. }
  107. isAdd = true
  108. }
  109. if suffix == "deal" {
  110. existMap[eDate] = sv.DealValue
  111. } else if suffix == "buy" {
  112. existMap[eDate] = sv.BuyValue
  113. } else {
  114. existMap[eDate] = sv.SoldValue
  115. }
  116. }
  117. if isAdd {
  118. addSql = strings.TrimRight(addSql, ",")
  119. utils.FileLog.Info("addSql:" + addSql)
  120. //_, err = o.Raw(addSql).Exec()
  121. err = global.DEFAULT_DB.Exec(addSql).Error
  122. if err != nil {
  123. return err
  124. }
  125. }
  126. return
  127. }
  128. // 刷新上期所指标数据
  129. func RefreshEdbDataFromSh(edbInfoId int, edbCode, startDate string) (err error) {
  130. source := utils.DATA_SOURCE_SH
  131. subSource := utils.DATA_SUB_SOURCE_EDB
  132. //o := orm.NewOrm()
  133. if err != nil {
  134. return
  135. }
  136. var suffix string
  137. if strings.Contains(edbCode, "deal") {
  138. suffix = "deal"
  139. } else if strings.Contains(edbCode, "buy") {
  140. suffix = "buy"
  141. } else if strings.Contains(edbCode, "sold") {
  142. suffix = "sold"
  143. }
  144. edbInfoIdStr := strconv.Itoa(edbInfoId)
  145. //计算数据
  146. var condition string
  147. var pars []interface{}
  148. if edbCode != "" {
  149. if suffix == "deal" {
  150. condition += " AND deal_code=? "
  151. } else if suffix == "buy" {
  152. condition += " AND buy_code=? "
  153. } else {
  154. condition += " AND sold_code=? "
  155. }
  156. pars = append(pars, edbCode)
  157. }
  158. if startDate != "" {
  159. condition += " AND data_time>=? "
  160. pars = append(pars, startDate)
  161. }
  162. glDataList, err := GetShDataByTradeCode(condition, pars)
  163. if err != nil {
  164. return
  165. }
  166. // 真实数据的最大日期 , 插入规则配置的日期
  167. var realDataMaxDate, edbDataInsertConfigDate time.Time
  168. var edbDataInsertConfig *EdbDataInsertConfig
  169. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  170. {
  171. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  172. if err != nil && !utils.IsErrNoRow(err) {
  173. return
  174. }
  175. if edbDataInsertConfig != nil {
  176. edbDataInsertConfigDate = edbDataInsertConfig.Date
  177. }
  178. }
  179. //获取指标所有数据
  180. var existCondition string
  181. var existPars []interface{}
  182. existCondition += " AND edb_info_id=? "
  183. existPars = append(existPars, edbInfoId)
  184. if startDate != "" {
  185. existCondition += " AND data_time>=? "
  186. existPars = append(existPars, startDate)
  187. }
  188. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  189. if err != nil {
  190. return err
  191. }
  192. existMap := make(map[string]*EdbInfoSearchData)
  193. for _, v := range existList {
  194. existMap[v.DataTime] = v
  195. }
  196. addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  197. var isAdd bool
  198. for _, v := range glDataList {
  199. var value string
  200. if suffix == "deal" {
  201. value = v.DealValue
  202. } else if suffix == "buy" {
  203. value = v.BuyValue
  204. } else {
  205. value = v.SoldValue
  206. }
  207. item := v
  208. itemValue := value
  209. eDate := item.DataTime
  210. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  211. if err != nil {
  212. return err
  213. }
  214. if _, ok := existMap[v.DataTime]; !ok {
  215. sValue := itemValue
  216. if sValue != "" {
  217. timestamp := dataTime.UnixNano() / 1e6
  218. timeStr := fmt.Sprintf("%d", timestamp)
  219. saveValue := sValue
  220. if findItem, ok := existMap[eDate]; !ok {
  221. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
  222. isAdd = true
  223. } else {
  224. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != sValue {
  225. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, sValue)
  226. if err != nil {
  227. return err
  228. }
  229. }
  230. }
  231. }
  232. }
  233. // 下面代码主要目的是处理掉手动插入的数据判断
  234. {
  235. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  236. realDataMaxDate = dataTime
  237. }
  238. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  239. isFindConfigDateRealData = true
  240. }
  241. }
  242. }
  243. // 处理手工数据补充的配置
  244. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  245. if isAdd {
  246. addSql = strings.TrimRight(addSql, ",")
  247. //_, err = o.Raw(addSql).Exec()
  248. err = global.DEFAULT_DB.Exec(addSql).Error
  249. if err != nil {
  250. return err
  251. }
  252. }
  253. return
  254. }
  255. type RefreshSHExchangeReq struct {
  256. Url string `description:"交易所链接"`
  257. Exchange string `description:"交易所"`
  258. Date string `description:"日期"`
  259. Data SHMessage
  260. }
  261. type Position []struct {
  262. ContractCode string `json:"INSTRUMENTID"`
  263. ProductSortNo int `json:"PRODUCTSORTNO"`
  264. Rank int `json:"RANK"`
  265. ParticipantID1 string `json:"PARTICIPANTID1"`
  266. ParticipantName1 string `json:"PARTICIPANTABBR1"`
  267. Deal interface{} `json:"CJ1"`
  268. Change1 interface{} `json:"CJ1_CHG"`
  269. ParticipantID2 string `json:"PARTICIPANTID2"`
  270. ParticipantName2 string `json:"PARTICIPANTABBR2"`
  271. BuyIn interface{} `json:"CJ2"`
  272. Change2 interface{} `json:"CJ2_CHG"`
  273. ParticipantID3 string `json:"PARTICIPANTID3"`
  274. ParticipantName3 string `json:"PARTICIPANTABBR3"`
  275. SoldOut interface{} `json:"CJ3"`
  276. Change3 interface{} `json:"CJ3_CHG"`
  277. ProductName string `json:"PRODUCTNAME"`
  278. }
  279. type SHMessage struct {
  280. Position Position `json:"o_cursor"`
  281. Length string `json:"showlength"`
  282. Code string `json:"o_code"`
  283. Msg string `json:"o_msg"`
  284. ReportDate string `json:"report_date"`
  285. UpdateDate string `json:"update_date"`
  286. PrintDate string `json:"print_date"`
  287. }
  288. type BaseFromTradeShanghaiIndex struct {
  289. BaseFromTradeShangHaiIndexId int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
  290. Rank int
  291. DealShortName string
  292. DealName string
  293. DealCode string
  294. DealValue int
  295. DealChange int
  296. BuyShortName string
  297. BuyName string
  298. BuyCode string
  299. BuyValue int
  300. BuyChange int
  301. SoldShortName string
  302. SoldName string
  303. SoldCode string
  304. SoldValue int
  305. SoldChange int
  306. Frequency string
  307. ClassifyName string
  308. ClassifyType string
  309. CreateTime time.Time
  310. ModifyTime time.Time
  311. DataTime string
  312. }
  313. func (e *BaseFromTradeShanghaiIndex) AfterFind(db *gorm.DB) (err error) {
  314. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  315. return
  316. }
  317. func AddBaseFromTradeShangHaiIndex(item *BaseFromTradeShanghaiIndex) (lastId int64, err error) {
  318. //o := orm.NewOrm()
  319. //lastId, err = o.Insert(item)
  320. err = global.DEFAULT_DB.Create(&item).Error
  321. if err != nil {
  322. return
  323. }
  324. lastId = int64(item.BaseFromTradeShangHaiIndexId)
  325. return
  326. }
  327. func GetBaseFromTradeShangHaiIndexAll(dateStr string) (list []*BaseFromTradeShanghaiIndex, err error) {
  328. //o := orm.NewOrm()
  329. sql := `SELECT * FROM base_from_trade_shanghai_index WHERE data_time=?`
  330. //_, err = o.Raw(sql, dateStr).QueryRows(&list)
  331. err = global.DEFAULT_DB.Raw(sql, dateStr).Find(&list).Error
  332. return
  333. }
  334. func ModifyBaseFromTradeShangHaiIndex(dealValue, buyValue, soldValue int, dataId int) (err error) {
  335. //o := orm.NewOrm()
  336. sql := `UPDATE base_from_trade_shanghai_index SET deal_value=?,buy_value=?,sold_value=?,modify_time=NOW() WHERE base_from_trade_shanghai_index_id=? `
  337. //_, err = o.Raw(sql, dealValue, buyValue, soldValue, dataId).Exec()
  338. err = global.DEFAULT_DB.Exec(sql, dealValue, buyValue, soldValue, dataId).Error
  339. return
  340. }