telecom.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package telecom
  2. import (
  3. "context"
  4. "database/sql"
  5. "strconv"
  6. "time"
  7. "go-common/app/interface/main/app-wall/conf"
  8. "go-common/app/interface/main/app-wall/model/telecom"
  9. "go-common/library/cache/memcache"
  10. "go-common/library/cache/redis"
  11. xsql "go-common/library/database/sql"
  12. "go-common/library/log"
  13. httpx "go-common/library/net/http/blademaster"
  14. )
  15. const (
  16. _inOrderSyncSQL = `INSERT IGNORE INTO telecom_order (request_no,result_type,flowpackageid,flowpackagesize,flowpackagetype,trafficattribution,begintime,endtime,
  17. ismultiplyorder,settlementtype,operator,order_status,remainedrebindnum,maxbindnum,orderid,sign_no,accesstoken,phoneid,isrepeatorder,paystatus,
  18. paytime,paychannel,sign_status,refund_status) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE
  19. request_no=?,result_type=?,flowpackagesize=?,flowpackagetype=?,trafficattribution=?,begintime=?,endtime=?,
  20. ismultiplyorder=?,settlementtype=?,operator=?,order_status=?,remainedrebindnum=?,maxbindnum=?,orderid=?,sign_no=?,accesstoken=?,
  21. isrepeatorder=?,paystatus=?,paytime=?,paychannel=?,sign_status=?,refund_status=?`
  22. _inRechargeSyncSQL = `INSERT INTO telecom_recharge (request_no,fcrecharge_no,recharge_status,ordertotalsize,flowbalance) VALUES(?,?,?,?,?)`
  23. _orderByPhoneSQL = `SELECT phoneid,orderid,order_status,sign_no,isrepeatorder,begintime,endtime FROM telecom_order WHERE phoneid=?`
  24. _orderByOrderIDSQL = `SELECT phoneid,orderid,order_status,sign_no,isrepeatorder,begintime,endtime FROM telecom_order WHERE orderid=?`
  25. )
  26. type Dao struct {
  27. c *conf.Config
  28. client *httpx.Client
  29. payInfoURL string
  30. cancelRepeatOrderURL string
  31. sucOrderListURL string
  32. telecomReturnURL string
  33. telecomCancelPayURL string
  34. phoneAreaURL string
  35. orderStateURL string
  36. smsSendURL string
  37. phoneKeyExpired int32
  38. payKeyExpired int32
  39. db *xsql.DB
  40. inOrderSyncSQL *xsql.Stmt
  41. inRechargeSyncSQL *xsql.Stmt
  42. orderByPhoneSQL *xsql.Stmt
  43. orderByOrderIDSQL *xsql.Stmt
  44. phoneRds *redis.Pool
  45. // memcache
  46. mc *memcache.Pool
  47. expire int32
  48. }
  49. func New(c *conf.Config) (d *Dao) {
  50. d = &Dao{
  51. c: c,
  52. client: httpx.NewClient(conf.Conf.HTTPTelecom),
  53. payInfoURL: c.Host.Telecom + _payInfo,
  54. cancelRepeatOrderURL: c.Host.Telecom + _cancelRepeatOrder,
  55. sucOrderListURL: c.Host.Telecom + _sucOrderList,
  56. phoneAreaURL: c.Host.Telecom + _phoneArea,
  57. orderStateURL: c.Host.Telecom + _orderState,
  58. telecomReturnURL: c.Host.TelecomReturnURL,
  59. telecomCancelPayURL: c.Host.TelecomCancelPayURL,
  60. smsSendURL: c.Host.Sms + _smsSendURL,
  61. db: xsql.NewMySQL(c.MySQL.Show),
  62. phoneRds: redis.NewPool(c.Redis.Recommend.Config),
  63. //reids
  64. phoneKeyExpired: int32(time.Duration(c.Telecom.KeyExpired) / time.Second),
  65. payKeyExpired: int32(time.Duration(c.Telecom.PayKeyExpired) / time.Second),
  66. // memcache
  67. mc: memcache.NewPool(c.Memcache.Operator.Config),
  68. expire: int32(time.Duration(c.Memcache.Operator.Expire) / time.Second),
  69. }
  70. d.inOrderSyncSQL = d.db.Prepared(_inOrderSyncSQL)
  71. d.inRechargeSyncSQL = d.db.Prepared(_inRechargeSyncSQL)
  72. d.orderByPhoneSQL = d.db.Prepared(_orderByPhoneSQL)
  73. d.orderByOrderIDSQL = d.db.Prepared(_orderByOrderIDSQL)
  74. return
  75. }
  76. // InOrderSync
  77. func (d *Dao) InOrderSync(ctx context.Context, requestNo, resultType int, phone string, t *telecom.TelecomJSON) (row int64, err error) {
  78. res, err := d.inOrderSyncSQL.Exec(ctx, requestNo, resultType, t.FlowpackageID, t.FlowPackageSize, t.FlowPackageType, t.TrafficAttribution, t.BeginTime, t.EndTime,
  79. t.IsMultiplyOrder, t.SettlementType, t.Operator, t.OrderStatus, t.RemainedRebindNum, t.MaxbindNum, t.OrderID, t.SignNo, t.AccessToken,
  80. phone, t.IsRepeatOrder, t.PayStatus, t.PayTime, t.PayChannel, t.SignStatus, t.RefundStatus,
  81. requestNo, resultType, t.FlowPackageSize, t.FlowPackageType, t.TrafficAttribution, t.BeginTime, t.EndTime,
  82. t.IsMultiplyOrder, t.SettlementType, t.Operator, t.OrderStatus, t.RemainedRebindNum, t.MaxbindNum, t.OrderID,
  83. t.SignNo, t.AccessToken, t.IsRepeatOrder, t.PayStatus, t.PayTime, t.PayChannel, t.SignStatus, t.RefundStatus)
  84. if err != nil {
  85. log.Error("d.inOrderSyncSQL.Exec error(%v)", err)
  86. return
  87. }
  88. tmp := &telecom.OrderInfo{}
  89. tmp.OrderInfoJSONChange(t)
  90. phoneInt, _ := strconv.Atoi(t.PhoneID)
  91. if err = d.AddTelecomCache(ctx, phoneInt, tmp); err != nil {
  92. log.Error("s.AddTelecomCache error(%v)", err)
  93. }
  94. orderID, _ := strconv.ParseInt(t.OrderID, 10, 64)
  95. if err = d.AddTelecomOrderIDCache(ctx, orderID, tmp); err != nil {
  96. log.Error("s.AddTelecomOrderIDCache error(%v)", err)
  97. }
  98. return res.RowsAffected()
  99. }
  100. // InRechargeSync
  101. func (d *Dao) InRechargeSync(ctx context.Context, r *telecom.RechargeJSON) (row int64, err error) {
  102. res, err := d.inRechargeSyncSQL.Exec(ctx, r.RequestNo, r.FcRechargeNo, r.RechargeStatus, r.OrderTotalSize, r.FlowBalance)
  103. if err != nil {
  104. log.Error("d.inRechargeSyncSQL.Exec error(%v)", err)
  105. return
  106. }
  107. return res.RowsAffected()
  108. }
  109. func (d *Dao) OrdersUserFlow(ctx context.Context, phoneID int) (res map[int]*telecom.OrderInfo, err error) {
  110. res = map[int]*telecom.OrderInfo{}
  111. var (
  112. PhoneIDStr string
  113. OrderIDStr string
  114. )
  115. t := &telecom.OrderInfo{}
  116. row := d.orderByPhoneSQL.QueryRow(ctx, phoneID)
  117. if err = row.Scan(&PhoneIDStr, &OrderIDStr, &t.OrderState, &t.SignNo, &t.IsRepeatorder, &t.Begintime, &t.Endtime); err != nil {
  118. if err == sql.ErrNoRows {
  119. err = nil
  120. } else {
  121. log.Error("OrdersUserFlow row.Scan err (%v)", err)
  122. }
  123. return
  124. }
  125. t.TelecomChange()
  126. t.PhoneID, _ = strconv.Atoi(PhoneIDStr)
  127. t.OrderID, _ = strconv.ParseInt(OrderIDStr, 10, 64)
  128. if t.PhoneID > 0 {
  129. res[t.PhoneID] = t
  130. }
  131. return
  132. }
  133. func (d *Dao) OrdersUserByOrderID(ctx context.Context, orderID int64) (res map[int64]*telecom.OrderInfo, err error) {
  134. res = map[int64]*telecom.OrderInfo{}
  135. var (
  136. PhoneIDStr string
  137. OrderIDStr string
  138. )
  139. t := &telecom.OrderInfo{}
  140. row := d.orderByOrderIDSQL.QueryRow(ctx, orderID)
  141. if err = row.Scan(&PhoneIDStr, &OrderIDStr, &t.OrderState, &t.SignNo, &t.IsRepeatorder, &t.Begintime, &t.Endtime); err != nil {
  142. if err == sql.ErrNoRows {
  143. err = nil
  144. } else {
  145. log.Error("OrdersUserFlow row.Scan err (%v)", err)
  146. }
  147. return
  148. }
  149. t.TelecomChange()
  150. t.PhoneID, _ = strconv.Atoi(PhoneIDStr)
  151. t.OrderID, _ = strconv.ParseInt(OrderIDStr, 10, 64)
  152. if t.OrderID > 0 {
  153. res[t.OrderID] = t
  154. }
  155. return
  156. }