edb_data_shfe.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. package data_manage
  2. import (
  3. "fmt"
  4. "hongze/hongze_task/utils"
  5. "rdluck_tools/orm"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. type ShfeData struct {
  11. InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
  12. DataTime string `orm:"column(DATA_DATE)" description:"值"`
  13. }
  14. type BaseFromShfeDataSimple struct {
  15. Id int `orm:"column(base_from_trade_ine_index_id);pk"`
  16. DealCode string
  17. BuyCode string
  18. SoldCode string
  19. DataTime string
  20. DealValue string
  21. BuyValue string
  22. SoldValue string
  23. }
  24. type BaseInfoFromShfe struct {
  25. DealName string
  26. BuyName string
  27. SoldName string
  28. }
  29. type BaseFromTradeShfeIndex struct {
  30. BaseFromTradeShfeIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
  31. Rank int
  32. DealShortName string
  33. DealName string
  34. DealCode string
  35. DealValue string
  36. DealChange int
  37. BuyShortName string
  38. BuyName string
  39. BuyCode string
  40. BuyValue string
  41. BuyChange int
  42. SoldShortName string
  43. SoldName string
  44. SoldCode string
  45. SoldValue string
  46. SoldChange int
  47. Frequency string
  48. ClassifyName string
  49. ClassifyType string
  50. CreateTime time.Time
  51. ModifyTime time.Time
  52. DataTime string
  53. }
  54. func GetEdbDataShfeMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
  55. o := orm.NewOrm()
  56. o.Using("data")
  57. sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_ine WHERE edb_code=? `
  58. err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
  59. return
  60. }
  61. // RefreshEdbDataByShfe 刷新上期能源指标数据
  62. func RefreshEdbDataByShfe(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  63. o := orm.NewOrm()
  64. o.Using("data")
  65. o.Begin()
  66. defer func() {
  67. if err != nil {
  68. o.Rollback()
  69. } else {
  70. o.Commit()
  71. }
  72. }()
  73. if err != nil {
  74. return
  75. }
  76. var suffix string
  77. if strings.Contains(edbCode, "deal") {
  78. suffix = "deal"
  79. } else if strings.Contains(edbCode, "buy") {
  80. suffix = "buy"
  81. } else if strings.Contains(edbCode, "sold") {
  82. suffix = "sold"
  83. }
  84. edbInfoIdStr := strconv.Itoa(edbInfoId)
  85. //计算数据
  86. var condition string
  87. var pars []interface{}
  88. if edbCode != "" {
  89. if suffix == "deal" {
  90. condition += " AND deal_code=? "
  91. } else if suffix == "buy" {
  92. condition += " AND buy_code=? "
  93. } else {
  94. condition += " AND sold_code=? "
  95. }
  96. pars = append(pars, edbCode)
  97. }
  98. if startDate != "" {
  99. condition += " AND data_time>=? "
  100. pars = append(pars, startDate)
  101. }
  102. if endDate != "" {
  103. condition += " AND data_time<=? "
  104. pars = append(pars, endDate)
  105. }
  106. glDataList, err := GetShfeDataByTradeCode(condition, pars)
  107. addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  108. var isAdd bool
  109. existMap := make(map[string]string)
  110. for _, v := range glDataList {
  111. var value string
  112. if suffix == "deal" {
  113. value = v.DealValue
  114. } else if suffix == "buy" {
  115. value = v.BuyValue
  116. } else {
  117. value = v.SoldValue
  118. }
  119. item := v
  120. itemValue := value
  121. if _, ok := existMap[v.DataTime]; !ok {
  122. count, err := GetEdbDataShfeByCodeAndDate(edbCode, v.DataTime)
  123. if err != nil && err.Error() != utils.ErrNoRow() {
  124. return err
  125. }
  126. if count <= 0 {
  127. eDate := item.DataTime
  128. sValue := itemValue
  129. if sValue != "" {
  130. dataTime, err := time.Parse(utils.FormatDate, eDate)
  131. if err != nil {
  132. return err
  133. }
  134. timestamp := dataTime.UnixNano() / 1e6
  135. timeStr := fmt.Sprintf("%d", timestamp)
  136. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  137. isAdd = true
  138. }
  139. } else {
  140. err = ModifyEdbDataShfe(int64(edbInfoId), v.DataTime, value)
  141. if err != nil {
  142. return err
  143. }
  144. }
  145. }
  146. existMap[v.DataTime] = value
  147. }
  148. if isAdd {
  149. addSql = strings.TrimRight(addSql, ",")
  150. _, err = o.Raw(addSql).Exec()
  151. if err != nil {
  152. return err
  153. }
  154. }
  155. return
  156. }
  157. // RefreshAllEdbDataByShfe 全部刷新上期能源
  158. func RefreshAllEdbDataByShfe(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
  159. o := orm.NewOrm()
  160. o.Using("data")
  161. o.Begin()
  162. defer func() {
  163. if err != nil {
  164. o.Rollback()
  165. } else {
  166. o.Commit()
  167. }
  168. }()
  169. if err != nil {
  170. return
  171. }
  172. var suffix string
  173. if strings.Contains(edbCode, "deal") {
  174. suffix = "deal"
  175. } else if strings.Contains(edbCode, "buy") {
  176. suffix = "buy"
  177. } else if strings.Contains(edbCode, "sold") {
  178. suffix = "sold"
  179. }
  180. edbInfoIdStr := strconv.Itoa(edbInfoId)
  181. //计算数据
  182. var condition string
  183. var pars []interface{}
  184. if edbCode != "" {
  185. if suffix == "deal" {
  186. condition += " AND deal_code=? "
  187. } else if suffix == "buy" {
  188. condition += " AND buy_code=? "
  189. } else {
  190. condition += " AND sold_code=? "
  191. }
  192. pars = append(pars, edbCode)
  193. }
  194. if startDate != "" {
  195. condition += " AND data_time>=? "
  196. pars = append(pars, startDate)
  197. }
  198. if endDate != "" {
  199. condition += " AND data_time<=? "
  200. pars = append(pars, endDate)
  201. }
  202. glDataList, err := GetShfeDataByTradeCode(condition, pars)
  203. //获取指标所有数据
  204. dataList := make([]*EdbDataBase, 0)
  205. dataTableName := GetEdbDataTableName(source)
  206. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  207. sql = fmt.Sprintf(sql, dataTableName)
  208. _, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
  209. if err != nil {
  210. return err
  211. }
  212. dataMap := make(map[string]string)
  213. for _, v := range dataList {
  214. dataMap[v.DataTime] = v.Value
  215. }
  216. addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  217. var isAdd bool
  218. existMap := make(map[string]string)
  219. for _, v := range glDataList {
  220. var value string
  221. if suffix == "deal" {
  222. value = v.DealValue
  223. } else if suffix == "buy" {
  224. value = v.BuyValue
  225. } else {
  226. value = v.SoldValue
  227. }
  228. item := v
  229. itemValue := value
  230. if _, ok := existMap[v.DataTime]; !ok {
  231. eDate := item.DataTime
  232. sValue := itemValue
  233. if sValue != "" {
  234. dataTime, err := time.Parse(utils.FormatDate, eDate)
  235. if err != nil {
  236. return err
  237. }
  238. timestamp := dataTime.UnixNano() / 1e6
  239. timeStr := fmt.Sprintf("%d", timestamp)
  240. saveValue := sValue
  241. if existVal, ok := dataMap[eDate]; !ok {
  242. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
  243. isAdd = true
  244. } else {
  245. if existVal != saveValue {
  246. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  247. sql = fmt.Sprintf(sql, dataTableName)
  248. _, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
  249. if err != nil {
  250. return err
  251. }
  252. }
  253. }
  254. }
  255. }
  256. existMap[v.DataTime] = v.DataTime
  257. }
  258. if isAdd {
  259. addSql = strings.TrimRight(addSql, ",")
  260. _, err = o.Raw(addSql).Exec()
  261. if err != nil {
  262. return err
  263. }
  264. }
  265. return
  266. }
  267. // GetBaseInfoFromShfeByIndexCode 获取指标信息
  268. func GetBaseInfoFromShfeByIndexCode(indexCode, suffix string) (list []*BaseInfoFromShfe, err error) {
  269. o := orm.NewOrm()
  270. o.Using("data")
  271. sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
  272. sql = fmt.Sprintf(sql, suffix)
  273. _, err = o.Raw(sql, indexCode).QueryRows(&list)
  274. return
  275. }
  276. func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) {
  277. sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 `
  278. o := orm.NewOrm()
  279. o.Using("data")
  280. if condition != "" {
  281. sql += condition
  282. }
  283. sql += ` ORDER BY data_time DESC `
  284. _, err = o.Raw(sql, pars).QueryRows(&item)
  285. return
  286. }
  287. func AddEdbDataShfeBySql(sqlStr string) (err error) {
  288. o := orm.NewOrm()
  289. o.Using("data")
  290. _, err = o.Raw(sqlStr).Exec()
  291. return
  292. }
  293. func GetBaseFromShfeDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShfeIndex, err error) {
  294. o := orm.NewOrm()
  295. o.Using("data")
  296. sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
  297. sql = fmt.Sprintf(sql, suffix)
  298. _, err = o.Raw(sql, indexCode).QueryRows(&list)
  299. return
  300. }
  301. func GetEdbDataShfeByCodeAndDate(edbCode string, startDate string) (count int, err error) {
  302. o := orm.NewOrm()
  303. o.Using("data")
  304. sql := ` SELECT COUNT(1) AS count FROM edb_data_ine WHERE edb_code=? AND data_time=? `
  305. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  306. return
  307. }
  308. func ModifyEdbDataShfe(edbInfoId int64, dataTime, value string) (err error) {
  309. o := orm.NewOrm()
  310. o.Using("data")
  311. sql := ` UPDATE edb_data_ine SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  312. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  313. return
  314. }