pay_order.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package dao
  2. import (
  3. "context"
  4. "database/sql"
  5. "time"
  6. "go-common/app/service/main/tv/internal/model"
  7. xsql "go-common/library/database/sql"
  8. "go-common/library/log"
  9. xtime "go-common/library/time"
  10. "github.com/pkg/errors"
  11. )
  12. const (
  13. _getPayOrderByID = "SELECT `id`, `order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `token`, `ctime`, `mtime` FROM `tv_pay_order` WHERE `id`=?"
  14. _getPayOrderByOrderNo = "SELECT `id`, `order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `token`, `ctime`, `mtime` FROM `tv_pay_order` WHERE `order_no`=?"
  15. _getPayOrdersByMid = "SELECT `id`, `order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `token`, `ctime`, `mtime` FROM `tv_pay_order` WHERE `mid`=? ORDER BY `ctime` DESC LIMIT ?,?"
  16. _countPayOrderByMid = "SELECT count(*) FROM `tv_pay_order` WHERE `mid`=?"
  17. _getPayOrdersByMidAndStatus = "SELECT `id`, `order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `token`, `ctime`, `mtime` FROM `tv_pay_order` WHERE `mid`=? AND `status`=? ORDER BY `ctime` DESC LIMIT ?,?"
  18. _countPayOrderByMidAndStatus = "SELECT count(*) FROM `tv_pay_order` WHERE `mid`=? AND `status`=?"
  19. _getPayOrdersByMidAndStatusAndCtime = "SELECT `id`, `order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `ctime`, `mtime`, `token` FROM `tv_pay_order` WHERE `mid`=? AND `status`=? AND `ctime`>= ? AND `ctime` <= ? ORDER BY `ctime` DESC LIMIT ?,?"
  20. _countPayOrderByMidAndStatusAndCtime = "SELECT count(*) FROM `tv_pay_order` WHERE `mid`=? AND `status`=? AND `ctime`>= ? AND `ctime` <= ?"
  21. _insertPayOrder = "INSERT INTO tv_pay_order (`order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `token`, `app_channel`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
  22. _updatePayOrder = "UPDATE `tv_pay_order` SET `status`=?, `payment_time`=?, `ver` = `ver` + 1 WHERE `id`=? AND `ver`=?"
  23. _getUnpaidNoCallbackOrder = "SELECT `id`, `order_no`, `platform`, `order_type`, `mid`, `buy_months`, `product_id`, `money`, `quantity`, `refund_amount`, `status`, `third_trade_no`, `payment_money`, `payment_type`, `payment_time`, `ver`, `token`, `ctime`, `mtime` FROM `tv_pay_order` WHERE `status` = 1 and ctime > ? and ctime < ? order by id LIMIT ?,?"
  24. )
  25. // PayOrderByID quires one row from tv_pay_order.
  26. func (d *Dao) PayOrderByID(c context.Context, id int) (po *model.PayOrder, err error) {
  27. row := d.db.QueryRow(c, _getPayOrderByID, id)
  28. po = &model.PayOrder{}
  29. err = row.Scan(&po.ID, &po.OrderNo, &po.Platform, &po.OrderType, &po.Mid, &po.BuyMonths, &po.ProductId, &po.Money, &po.Quantity, &po.RefundAmount, &po.Status, &po.ThirdTradeNo, &po.PaymentMoney, &po.PaymentType, &po.PaymentTime, &po.Ver, &po.Token, &po.Ctime, &po.Mtime)
  30. if err == sql.ErrNoRows {
  31. return nil, nil
  32. }
  33. if err != nil {
  34. log.Error("rows.Scan(%s) error(%v)", _getPayOrderByID, err)
  35. err = errors.WithStack(err)
  36. return nil, err
  37. }
  38. return po, nil
  39. }
  40. // PayOrderByOrderNo quires one row from tv_pay_order.
  41. func (d *Dao) PayOrderByOrderNo(c context.Context, orderNo string) (po *model.PayOrder, err error) {
  42. row := d.db.QueryRow(c, _getPayOrderByOrderNo, orderNo)
  43. po = &model.PayOrder{}
  44. err = row.Scan(&po.ID, &po.OrderNo, &po.Platform, &po.OrderType, &po.Mid, &po.BuyMonths, &po.ProductId, &po.Money, &po.Quantity, &po.RefundAmount, &po.Status, &po.ThirdTradeNo, &po.PaymentMoney, &po.PaymentType, &po.PaymentTime, &po.Ver, &po.Token, &po.Ctime, &po.Mtime)
  45. if err == sql.ErrNoRows {
  46. return nil, nil
  47. }
  48. if err != nil {
  49. log.Error("rows.Scan(%s) error(%v)", _getPayOrderByOrderNo, err)
  50. err = errors.WithStack(err)
  51. return nil, err
  52. }
  53. return po, nil
  54. }
  55. // PayOrdersByMid quires rows from tv_pay_order.
  56. func (d *Dao) PayOrdersByMid(c context.Context, mid int, pn, ps int) (res []*model.PayOrder, total int, err error) {
  57. res = make([]*model.PayOrder, 0)
  58. totalRow := d.db.QueryRow(c, _countPayOrderByMid, mid)
  59. if err = totalRow.Scan(&total); err != nil {
  60. log.Error("row.ScanCount error(%v)", err)
  61. err = errors.WithStack(err)
  62. return
  63. }
  64. rows, err := d.db.Query(c, _getPayOrdersByMid, mid, (pn-1)*ps, ps)
  65. if err != nil {
  66. log.Error("db.Query(%s) error(%v)", _getPayOrdersByMid, err)
  67. err = errors.WithStack(err)
  68. return
  69. }
  70. defer rows.Close()
  71. for rows.Next() {
  72. po := &model.PayOrder{}
  73. if err = rows.Scan(&po.ID, &po.OrderNo, &po.Platform, &po.OrderType, &po.Mid, &po.BuyMonths, &po.ProductId, &po.Money, &po.Quantity, &po.RefundAmount, &po.Status, &po.ThirdTradeNo, &po.PaymentMoney, &po.PaymentType, &po.PaymentTime, &po.Ver, &po.Token, &po.Ctime, &po.Mtime); err != nil {
  74. log.Error("rows.Scan() error(%v)", err)
  75. err = errors.WithStack(err)
  76. return
  77. }
  78. res = append(res, po)
  79. }
  80. return
  81. }
  82. // PayOrdersByMidAndStatus quires rows from tv_pay_order.
  83. func (d *Dao) PayOrdersByMidAndStatus(c context.Context, mid int, status int8, pn, ps int) (res []*model.PayOrder, total int, err error) {
  84. res = make([]*model.PayOrder, 0)
  85. totalRow := d.db.QueryRow(c, _countPayOrderByMidAndStatus, mid, status)
  86. if err = totalRow.Scan(&total); err != nil {
  87. log.Error("row.ScanCount error(%v)", err)
  88. err = errors.WithStack(err)
  89. return
  90. }
  91. rows, err := d.db.Query(c, _getPayOrdersByMidAndStatus, mid, status, (pn-1)*ps, ps)
  92. if err != nil {
  93. log.Error("db.Query(%s) error(%v)", _getPayOrdersByMidAndStatus, err)
  94. err = errors.WithStack(err)
  95. return
  96. }
  97. defer rows.Close()
  98. for rows.Next() {
  99. po := &model.PayOrder{}
  100. if err = rows.Scan(&po.ID, &po.OrderNo, &po.Platform, &po.OrderType, &po.Mid, &po.BuyMonths, &po.ProductId, &po.Money, &po.Quantity, &po.RefundAmount, &po.Status, &po.ThirdTradeNo, &po.PaymentMoney, &po.PaymentType, &po.PaymentTime, &po.Ver, &po.Token, &po.Ctime, &po.Mtime); err != nil {
  101. log.Error("rows.Scan() error(%v)", err)
  102. err = errors.WithStack(err)
  103. return
  104. }
  105. res = append(res, po)
  106. }
  107. return
  108. }
  109. // PayOrdersByMidAndStatusAndCtime quires rows from tv_pay_order.
  110. func (d *Dao) PayOrdersByMidAndStatusAndCtime(c context.Context, mid int64, status int8, from, to xtime.Time, pn, ps int) (res []*model.PayOrder, total int, err error) {
  111. res = make([]*model.PayOrder, 0)
  112. totalRow := d.db.QueryRow(c, _countPayOrderByMidAndStatusAndCtime, mid, status, from, to)
  113. if err = totalRow.Scan(&total); err != nil {
  114. log.Error("row.ScanCount error(%v)", err)
  115. err = errors.WithStack(err)
  116. return
  117. }
  118. rows, err := d.db.Query(c, _getPayOrdersByMidAndStatusAndCtime, mid, status, from, to, (pn-1)*ps, ps)
  119. if err != nil {
  120. log.Error("db.Query(%s) error(%v)", _getPayOrdersByMidAndStatusAndCtime, err)
  121. err = errors.WithStack(err)
  122. return
  123. }
  124. defer rows.Close()
  125. for rows.Next() {
  126. po := &model.PayOrder{}
  127. if err = rows.Scan(&po.ID, &po.OrderNo, &po.Platform, &po.OrderType, &po.Mid, &po.BuyMonths, &po.ProductId, &po.Money, &po.Quantity, &po.RefundAmount, &po.Status, &po.ThirdTradeNo, &po.PaymentMoney, &po.PaymentType, &po.PaymentTime, &po.Ver, &po.Ctime, &po.Mtime, &po.Token); err != nil {
  128. log.Error("rows.Scan() error(%v)", err)
  129. err = errors.WithStack(err)
  130. return
  131. }
  132. res = append(res, po)
  133. }
  134. return
  135. }
  136. // TxInsertPayOrder insert one row into tv_pay_order.
  137. func (d *Dao) TxInsertPayOrder(ctx context.Context, tx *xsql.Tx, po *model.PayOrder) (id int64, err error) {
  138. var (
  139. res sql.Result
  140. )
  141. if res, err = tx.Exec(_insertPayOrder, po.OrderNo, po.Platform, po.OrderType, po.Mid, po.BuyMonths, po.ProductId, po.Money, po.Quantity, po.RefundAmount, po.Status, po.ThirdTradeNo, po.PaymentMoney, po.PaymentType, po.PaymentTime, po.Ver, po.Token, po.AppChannel); err != nil {
  142. log.Error("tx.Exec(%s) error(%v)", _insertPayOrder, err)
  143. err = errors.WithStack(err)
  144. return
  145. }
  146. if id, err = res.LastInsertId(); err != nil {
  147. err = errors.WithStack(err)
  148. return
  149. }
  150. return
  151. }
  152. // TxUpdatePayOrder updates status, third party no and payment time.
  153. func (d *Dao) TxUpdatePayOrder(ctx context.Context, tx *xsql.Tx, po *model.PayOrder) error {
  154. if _, err := tx.Exec(_updatePayOrder, po.Status, xtime.Time(time.Now().Unix()), po.ID, po.Ver); err != nil {
  155. log.Error("tx.Exec(%s) error(%v)", _updatePayOrder, err)
  156. err = errors.WithStack(err)
  157. return err
  158. }
  159. return nil
  160. }
  161. //UnpaidNotCallbackOrder get orders not paid where stime < ctime < etime
  162. func (d *Dao) UnpaidNotCallbackOrder(c context.Context, stime, etime xtime.Time, pn, ps int) (res []*model.PayOrder, err error) {
  163. rows, err := d.db.Query(c, _getUnpaidNoCallbackOrder, stime, etime, (pn-1)*ps, ps)
  164. if err != nil {
  165. log.Error("db.Query(%s) error(%v)", _getUnpaidNoCallbackOrder, err)
  166. err = errors.WithStack(err)
  167. return
  168. }
  169. for rows.Next() {
  170. po := &model.PayOrder{}
  171. if err = rows.Scan(&po.ID, &po.OrderNo, &po.Platform, &po.OrderType, &po.Mid, &po.BuyMonths, &po.ProductId, &po.Money, &po.Quantity, &po.RefundAmount, &po.Status, &po.ThirdTradeNo, &po.PaymentMoney, &po.PaymentType, &po.PaymentTime, &po.Ver, &po.Token, &po.Ctime, &po.Mtime); err != nil {
  172. log.Error("rows.Scan() error(%v)", err)
  173. err = errors.WithStack(err)
  174. return
  175. }
  176. res = append(res, po)
  177. }
  178. return
  179. }