edb_data_sh.go 11 KB

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