edb_data_dl.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. package data_manage
  2. import (
  3. "fmt"
  4. "github.com/beego/beego/v2/client/orm"
  5. "hongze/hongze_chart_lib/utils"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. type DlData struct {
  11. InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
  12. DataTime string `orm:"column(DATA_DATE)" description:"值"`
  13. }
  14. type BaseFromDlDataSimple struct {
  15. Id int `orm:"column(base_from_trade_dalian_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 BaseInfoFromDl struct {
  25. DealName string
  26. BuyName string
  27. SoldName string
  28. }
  29. type BaseFromTradeDalianIndex struct {
  30. BaseFromTradeDalianIndexId int `orm:"column(base_from_trade_dalian_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 GetEdbDataDlMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
  55. o := orm.NewOrmUsingDB("data")
  56. sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_dl WHERE edb_code=? `
  57. err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
  58. return
  59. }
  60. func GetEdbDataByDl(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
  61. o := orm.NewOrmUsingDB("data")
  62. o.Begin()
  63. searchItem = new(EdbInfoSearch)
  64. searchItem.EdbCode = edbCode
  65. dlBaseDataAll, err := GetBaseFromDalianDataAllByIndexCode(edbCode, suffix)
  66. if err != nil && err.Error() != utils.ErrNoRow() {
  67. return
  68. }
  69. var isAdd bool
  70. addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  71. dataList := make([]*EdbInfoSearchData, 0)
  72. existMap := make(map[string]string)
  73. for _, sv := range dlBaseDataAll {
  74. eDate := sv.DataTime
  75. dataTime, err := time.Parse(utils.FormatDate, eDate)
  76. if err != nil {
  77. fmt.Println("time.Parse Err:" + eDate)
  78. return nil, err
  79. }
  80. timestamp := dataTime.UnixNano() / 1e6
  81. timeStr := fmt.Sprintf("%d", timestamp)
  82. if _, ok := existMap[eDate]; !ok {
  83. if suffix == "deal" {
  84. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
  85. } else if suffix == "buy" {
  86. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
  87. } else {
  88. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
  89. }
  90. isAdd = true
  91. }
  92. if suffix == "deal" {
  93. existMap[eDate] = sv.DealValue
  94. } else if suffix == "buy" {
  95. existMap[eDate] = sv.BuyValue
  96. } else {
  97. existMap[eDate] = sv.SoldValue
  98. }
  99. }
  100. if isAdd {
  101. addSql = strings.TrimRight(addSql, ",")
  102. utils.FileLog.Info("addSql:" + addSql)
  103. _, err = o.Raw(addSql).Exec()
  104. if err != nil {
  105. return searchItem, err
  106. }
  107. }
  108. if err != nil {
  109. o.Rollback()
  110. } else {
  111. o.Commit()
  112. }
  113. size := utils.EDB_DATA_LIMIT
  114. dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_DL, size)
  115. if err != nil {
  116. utils.FileLogData.Info("GetEdbDataDlByCode Err:%s", err.Error())
  117. return searchItem, err
  118. }
  119. minDate, maxDate, err := GetEdbDataDlMaxOrMinDate(edbCode)
  120. if err != nil {
  121. return searchItem, err
  122. }
  123. searchItem.DataList = dataList
  124. searchItem.StartDate = minDate
  125. searchItem.EndDate = maxDate
  126. if searchItem.DataList == nil {
  127. searchItem.DataList = make([]*EdbInfoSearchData, 0)
  128. }
  129. return
  130. }
  131. // RefreshEdbDataByDl 刷新大商所指标数据
  132. func RefreshEdbDataByDl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
  133. o := orm.NewOrmUsingDB("data")
  134. o.Begin()
  135. defer func() {
  136. if err != nil {
  137. o.Rollback()
  138. } else {
  139. o.Commit()
  140. }
  141. }()
  142. if err != nil {
  143. return
  144. }
  145. var suffix string
  146. if strings.Contains(edbCode, "deal") {
  147. suffix = "deal"
  148. } else if strings.Contains(edbCode, "buy") {
  149. suffix = "buy"
  150. } else if strings.Contains(edbCode, "sold") {
  151. suffix = "sold"
  152. }
  153. edbInfoIdStr := strconv.Itoa(edbInfoId)
  154. //计算数据
  155. var condition string
  156. var pars []interface{}
  157. if edbCode != "" {
  158. if suffix == "deal" {
  159. condition += " AND deal_code=? "
  160. } else if suffix == "buy" {
  161. condition += " AND buy_code=? "
  162. } else {
  163. condition += " AND sold_code=? "
  164. }
  165. pars = append(pars, edbCode)
  166. }
  167. if startDate != "" {
  168. condition += " AND data_time>=? "
  169. pars = append(pars, startDate)
  170. }
  171. if endDate != "" {
  172. condition += " AND data_time<=? "
  173. pars = append(pars, endDate)
  174. }
  175. glDataList, err := GetDlDataByTradeCode(condition, pars)
  176. addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  177. var isAdd bool
  178. existMap := make(map[string]string)
  179. for _, v := range glDataList {
  180. var value string
  181. if suffix == "deal" {
  182. value = v.DealValue
  183. } else if suffix == "buy" {
  184. value = v.BuyValue
  185. } else {
  186. value = v.SoldValue
  187. }
  188. item := v
  189. itemValue := value
  190. if _, ok := existMap[v.DataTime]; !ok {
  191. count, err := GetEdbDataDlByCodeAndDate(edbCode, v.DataTime)
  192. if err != nil && err.Error() != utils.ErrNoRow() {
  193. return err
  194. }
  195. if count <= 0 {
  196. eDate := item.DataTime
  197. sValue := itemValue
  198. if sValue != "" {
  199. dataTime, err := time.Parse(utils.FormatDate, eDate)
  200. if err != nil {
  201. return err
  202. }
  203. timestamp := dataTime.UnixNano() / 1e6
  204. timeStr := fmt.Sprintf("%d", timestamp)
  205. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  206. isAdd = true
  207. }
  208. } else {
  209. err = ModifyEdbDataDl(int64(edbInfoId), v.DataTime, value)
  210. if err != nil {
  211. return err
  212. }
  213. }
  214. }
  215. existMap[v.DataTime] = value
  216. }
  217. if isAdd {
  218. addSql = strings.TrimRight(addSql, ",")
  219. _, err = o.Raw(addSql).Exec()
  220. if err != nil {
  221. return err
  222. }
  223. }
  224. return
  225. }
  226. // RefreshAllEdbDataByDl 全部刷新大商所
  227. func RefreshAllEdbDataByDl(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
  228. o := orm.NewOrmUsingDB("data")
  229. o.Begin()
  230. defer func() {
  231. if err != nil {
  232. o.Rollback()
  233. } else {
  234. o.Commit()
  235. }
  236. }()
  237. if err != nil {
  238. return
  239. }
  240. var suffix string
  241. if strings.Contains(edbCode, "deal") {
  242. suffix = "deal"
  243. } else if strings.Contains(edbCode, "buy") {
  244. suffix = "buy"
  245. } else if strings.Contains(edbCode, "sold") {
  246. suffix = "sold"
  247. }
  248. edbInfoIdStr := strconv.Itoa(edbInfoId)
  249. //计算数据
  250. var condition string
  251. var pars []interface{}
  252. if edbCode != "" {
  253. if suffix == "deal" {
  254. condition += " AND deal_code=? "
  255. } else if suffix == "buy" {
  256. condition += " AND buy_code=? "
  257. } else {
  258. condition += " AND sold_code=? "
  259. }
  260. pars = append(pars, edbCode)
  261. }
  262. if startDate != "" {
  263. condition += " AND data_time>=? "
  264. pars = append(pars, startDate)
  265. }
  266. if endDate != "" {
  267. condition += " AND data_time<=? "
  268. pars = append(pars, endDate)
  269. }
  270. glDataList, err := GetDlDataByTradeCode(condition, pars)
  271. //获取指标所有数据
  272. dataList := make([]*EdbDataBase, 0)
  273. dataTableName := GetEdbDataTableName(source)
  274. sql := `SELECT * FROM %s WHERE edb_info_id=? `
  275. sql = fmt.Sprintf(sql, dataTableName)
  276. _, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
  277. if err != nil {
  278. return err
  279. }
  280. dataMap := make(map[string]string)
  281. for _, v := range dataList {
  282. dataMap[v.DataTime] = v.Value
  283. }
  284. addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  285. var isAdd bool
  286. existMap := make(map[string]string)
  287. for _, v := range glDataList {
  288. var value string
  289. if suffix == "deal" {
  290. value = v.DealValue
  291. } else if suffix == "buy" {
  292. value = v.BuyValue
  293. } else {
  294. value = v.SoldValue
  295. }
  296. item := v
  297. itemValue := value
  298. if _, ok := existMap[v.DataTime]; !ok {
  299. eDate := item.DataTime
  300. sValue := itemValue
  301. if sValue != "" {
  302. dataTime, err := time.Parse(utils.FormatDate, eDate)
  303. if err != nil {
  304. return err
  305. }
  306. timestamp := dataTime.UnixNano() / 1e6
  307. timeStr := fmt.Sprintf("%d", timestamp)
  308. saveValue := sValue
  309. if existVal, ok := dataMap[eDate]; !ok {
  310. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
  311. isAdd = true
  312. } else {
  313. if existVal != saveValue {
  314. sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  315. sql = fmt.Sprintf(sql, dataTableName)
  316. _, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
  317. if err != nil {
  318. return err
  319. }
  320. }
  321. }
  322. }
  323. }
  324. existMap[v.DataTime] = v.DataTime
  325. }
  326. if isAdd {
  327. addSql = strings.TrimRight(addSql, ",")
  328. _, err = o.Raw(addSql).Exec()
  329. if err != nil {
  330. return err
  331. }
  332. }
  333. return
  334. }
  335. // GetBaseInfoFromDalianByIndexCode 获取指标信息
  336. func GetBaseInfoFromDalianByIndexCode(indexCode, suffix string) (list []*BaseInfoFromDl, err error) {
  337. o := orm.NewOrmUsingDB("data")
  338. sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `
  339. sql = fmt.Sprintf(sql, suffix)
  340. _, err = o.Raw(sql, indexCode).QueryRows(&list)
  341. return
  342. }
  343. func GetDlDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromDlDataSimple, err error) {
  344. sql := ` SELECT * FROM base_from_trade_dalian_index WHERE 1=1 `
  345. o := orm.NewOrmUsingDB("data")
  346. if condition != "" {
  347. sql += condition
  348. }
  349. sql += ` ORDER BY data_time DESC `
  350. _, err = o.Raw(sql, pars).QueryRows(&item)
  351. return
  352. }
  353. func AddEdbDataDlBySql(sqlStr string) (err error) {
  354. o := orm.NewOrmUsingDB("data")
  355. _, err = o.Raw(sqlStr).Exec()
  356. return
  357. }
  358. func GetEdbDataDlByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
  359. o := orm.NewOrmUsingDB("data")
  360. sql := ` SELECT * FROM edb_data_dl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
  361. _, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
  362. return
  363. }
  364. func GetBaseFromDalianDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeDalianIndex, err error) {
  365. o := orm.NewOrmUsingDB("data")
  366. sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `
  367. sql = fmt.Sprintf(sql, suffix)
  368. _, err = o.Raw(sql, indexCode).QueryRows(&list)
  369. return
  370. }
  371. func GetEdbDataDlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
  372. o := orm.NewOrmUsingDB("data")
  373. sql := ` SELECT COUNT(1) AS count FROM edb_data_dl WHERE edb_code=? AND data_time=? `
  374. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  375. return
  376. }
  377. func ModifyEdbDataDl(edbInfoId int64, dataTime, value string) (err error) {
  378. o := orm.NewOrmUsingDB("data")
  379. sql := ` UPDATE edb_data_dl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  380. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  381. return
  382. }