market_mysql.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package dao
  2. import (
  3. "context"
  4. "time"
  5. "go-common/app/job/openplatform/open-market/model"
  6. "go-common/library/database/sql"
  7. "go-common/library/log"
  8. )
  9. const (
  10. _fetchProjectList = "SELECT `id`,`name`,`start_time`,`type` FROM `project` WHERE `status` = 1 AND `type` IN (1,3,4,5,6,8)"
  11. //_fetchUserWishFirst = "SELECT `mtime` FROM `user_wish` WHERE `item_id` = ? ORDER BY `mtime` LIMIT 1"
  12. _fetchUserWishByDay = "SELECT DISTINCT `id` FROM `user_wish` WHERE `item_id` = ? AND `mtime` BETWEEN ? AND ?"
  13. //_fetchUserFavoriteFirst = "SELECT `mtime` FROM `user_favorite` WHERE `item_id` = ? AND `status` = 1 AND `type` = 1 ORDER BY `mtime` LIMIT 1"
  14. _fetchUserFavoriteByDay = "SELECT DISTINCT `id` FROM `user_favorite` WHERE `item_id` = ? AND `status` = 1 AND `type` = 1 AND `mtime` BETWEEN ? AND ? "
  15. _fetchStockIfSoldOut = "SELECT `sku_id` FROM `sku_stock` WHERE `item_id` = ? AND `stock` <> 0 LIMIT 1"
  16. //_fetchStockSoldOutDay = "SELECT `mtime` FROM `sku_stock` WHERE `item_id` = ? AND `stock` = 0 ORDER BY `mtime` DESC LIMIT 1"
  17. )
  18. //FetchProject query project list from mysql
  19. func (d *Dao) FetchProject(c context.Context) (projectList []*model.Project, err error) {
  20. var rows *sql.Rows
  21. if rows, err = d.ticketDB.Query(c, _fetchProjectList); err != nil {
  22. log.Error("d._fetchProjectListSQL.Query error(%v)", err)
  23. return
  24. }
  25. defer rows.Close()
  26. for rows.Next() {
  27. project := new(model.Project)
  28. if err = rows.Scan(&project.ID, &project.Name, &project.StartTime, &project.Type); err != nil {
  29. log.Error("row.Scan() error(%v)", err)
  30. projectList = nil
  31. return
  32. }
  33. //if project.ID == 11644 || project.ID == 11678 || project.ID == 11643 || project.ID == 11650 {
  34. // continue
  35. //}
  36. if soldOut := d.CheckStock(context.TODO(), project.ID); soldOut {
  37. continue
  38. }
  39. projectList = append(projectList, project)
  40. }
  41. err = rows.Err()
  42. return
  43. }
  44. //CheckStock if a project sold out,return date
  45. func (d *Dao) CheckStock(c context.Context, projectID int32) (soldOut bool) {
  46. row := d.ticketDB.QueryRow(c, _fetchStockIfSoldOut, projectID)
  47. var skuID int
  48. if err := row.Scan(&skuID); err != nil {
  49. if err == sql.ErrNoRows {
  50. return true
  51. }
  52. log.Error("row.Scan() error(%v)", err)
  53. }
  54. return
  55. }
  56. //WishData fetch wishcount by project and date
  57. func (d *Dao) WishData(c context.Context, projectID int32, startTimeUnix int64) (wishData map[int32]int64, err error) {
  58. var (
  59. startTime string
  60. firstTime string
  61. firstDay time.Time
  62. startDay time.Time
  63. daysBefore = -1
  64. )
  65. wishData = make(map[int32]int64)
  66. startTime = time.Unix(startTimeUnix, 0).Add(time.Hour * 24).Format(_dateFormat)
  67. firstTime = time.Unix(startTimeUnix, 0).Add(time.Hour * 24).Add(time.Hour * 24 * -30).Format(_dateFormat)
  68. startDay, _ = time.Parse(_dateFormat, startTime)
  69. firstDay, _ = time.Parse(_dateFormat, firstTime)
  70. for {
  71. daysBefore++
  72. startDay = startDay.Add(time.Hour * -24)
  73. if !(startDay.Before(firstDay)) {
  74. var rows *sql.Rows
  75. count := 0
  76. if rows, err = d.ticketDB.Query(c, _fetchUserWishByDay, projectID, startDay.Format(_dateFormat), startDay.Add(time.Hour*24).Format(_dateFormat)); err != nil {
  77. log.Error("wish count query error(%v)", err)
  78. return
  79. }
  80. for rows.Next() {
  81. count++
  82. }
  83. err = rows.Err()
  84. wishData[int32(daysBefore)] = int64(count)
  85. rows.Close()
  86. continue
  87. }
  88. break
  89. }
  90. return
  91. }
  92. //FavoriteData fetch favoritecount by project and date
  93. func (d *Dao) FavoriteData(c context.Context, projectID int32, startTimeUnix int64) (favoriteData map[int32]int64, err error) {
  94. var (
  95. startTime string
  96. firstTime string
  97. firstDay time.Time
  98. startDay time.Time
  99. daysBefore = -1
  100. )
  101. favoriteData = make(map[int32]int64)
  102. startTime = time.Unix(startTimeUnix, 0).Add(time.Hour * 24).Format(_dateFormat)
  103. firstTime = time.Unix(startTimeUnix, 0).Add(time.Hour * 24).Add(time.Hour * 24 * -30).Format(_dateFormat)
  104. startDay, _ = time.Parse(_dateFormat, startTime)
  105. firstDay, _ = time.Parse(_dateFormat, firstTime)
  106. for {
  107. daysBefore++
  108. startDay = startDay.Add(time.Hour * -24)
  109. if !(startDay.Before(firstDay)) {
  110. var rows *sql.Rows
  111. count := 0
  112. if rows, err = d.ticketDB.Query(c, _fetchUserFavoriteByDay, projectID, startDay.Format(_dateFormat), startDay.Add(time.Hour*24).Format(_dateFormat)); err != nil {
  113. log.Error("wish count query error(%v)", err)
  114. return
  115. }
  116. for rows.Next() {
  117. count++
  118. }
  119. err = rows.Err()
  120. favoriteData[int32(daysBefore)] = int64(count)
  121. rows.Close()
  122. continue
  123. }
  124. break
  125. }
  126. return
  127. }