cache.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package unicom
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "go-common/app/interface/main/app-wall/conf"
  7. "go-common/app/interface/main/app-wall/model/unicom"
  8. "go-common/library/cache/memcache"
  9. "go-common/library/ecode"
  10. log "go-common/library/log"
  11. )
  12. const (
  13. _initIPUnicomKey = "ipunicom_%v_%v"
  14. )
  15. // loadUnicomIP load unicom ip
  16. func (s *Service) loadUnicomIP() {
  17. unicomIP, err := s.dao.IPSync(context.TODO())
  18. if err != nil {
  19. log.Error("s.dao.IPSync error(%v)", err)
  20. return
  21. }
  22. s.unicomIpCache = unicomIP
  23. tmp := map[string]*unicom.UnicomIP{}
  24. for _, u := range s.unicomIpCache {
  25. key := fmt.Sprintf(_initIPUnicomKey, u.Ipbegin, u.Ipend)
  26. tmp[key] = u
  27. }
  28. s.unicomIpSQLCache = tmp
  29. log.Info("loadUnicomIPCache success")
  30. }
  31. // loadIPlimit ip limit
  32. func (s *Service) loadIPlimit(c *conf.Config) {
  33. hosts := make(map[string]struct{}, len(c.IPLimit.Addrs))
  34. for k, v := range c.IPLimit.Addrs {
  35. for _, ipStr := range v {
  36. key := fmt.Sprintf(_initIPlimitKey, k, ipStr)
  37. if _, ok := hosts[key]; !ok {
  38. hosts[key] = struct{}{}
  39. }
  40. }
  41. }
  42. s.operationIPlimit = hosts
  43. log.Info("load operationIPlimit success")
  44. }
  45. // loadUnicomIPOrder load unciom ip order update
  46. func (s *Service) loadUnicomIPOrder(now time.Time) {
  47. unicomIP, err := s.dao.UnicomIP(context.TODO(), now)
  48. if err != nil {
  49. log.Error("s.dao.UnicomIP(%v)", err)
  50. return
  51. }
  52. if len(unicomIP) == 0 {
  53. log.Info("unicom ip orders is null")
  54. return
  55. }
  56. tx, err := s.dao.BeginTran(context.TODO())
  57. if err != nil {
  58. log.Error("s.dao.BeginTran error(%v)", err)
  59. return
  60. }
  61. for _, uip := range unicomIP {
  62. key := fmt.Sprintf(_initIPUnicomKey, uip.Ipbegin, uip.Ipend)
  63. if _, ok := s.unicomIpSQLCache[key]; ok {
  64. delete(s.unicomIpSQLCache, key)
  65. continue
  66. }
  67. var (
  68. result int64
  69. )
  70. if result, err = s.dao.InUnicomIPSync(tx, uip, time.Now()); err != nil || result == 0 {
  71. tx.Rollback()
  72. log.Error("s.dao.InUnicomIPSync error(%v)", err)
  73. return
  74. }
  75. }
  76. for _, uold := range s.unicomIpSQLCache {
  77. var (
  78. result int64
  79. )
  80. if result, err = s.dao.UpUnicomIP(tx, uold.Ipbegin, uold.Ipend, 0, time.Now()); err != nil || result == 0 {
  81. tx.Rollback()
  82. log.Error("s.dao.UpUnicomIP error(%v)", err)
  83. return
  84. }
  85. }
  86. if err = tx.Commit(); err != nil {
  87. log.Error("tx.Commit error(%v)", err)
  88. return
  89. }
  90. log.Info("update unicom ip success")
  91. }
  92. func (s *Service) loadUnicomPacks() {
  93. pack, err := s.dao.UserPacks(context.TODO())
  94. if err != nil {
  95. log.Error("s.dao.UserPacks error(%v)", err)
  96. return
  97. }
  98. s.unicomPackCache = pack
  99. }
  100. func (s *Service) loadUnicomFlow() {
  101. var (
  102. list map[string]*unicom.UnicomUserFlow
  103. err error
  104. )
  105. if list, err = s.dao.UserFlowListCache(context.TODO()); err != nil {
  106. log.Error("load unicom s.dao.UserFlowListCache error(%v)", err)
  107. return
  108. }
  109. for key, u := range list {
  110. var (
  111. c = context.TODO()
  112. requestNo int64
  113. orderstatus string
  114. msg string
  115. )
  116. if err = s.dao.UserFlowCache(c, key); err != nil {
  117. if err == memcache.ErrNotFound {
  118. if err = s.returnPoints(c, u); err != nil {
  119. if err != ecode.NothingFound {
  120. log.Error("load unicom s.returnPoints error(%v)", err)
  121. continue
  122. }
  123. err = nil
  124. }
  125. log.Info("load unicom userbind timeout flow(%v)", u)
  126. } else {
  127. log.Error("load unicom s.dao.UserFlowCache error(%v)", err)
  128. continue
  129. }
  130. } else {
  131. if requestNo, err = s.seqdao.SeqID(c); err != nil {
  132. log.Error("load unicom s.seqdao.SeqID error(%v)", err)
  133. continue
  134. }
  135. if orderstatus, msg, err = s.dao.FlowQry(c, u.Phone, requestNo, u.Outorderid, u.Orderid, time.Now()); err != nil {
  136. log.Error("load unicom s.dao.FlowQry error(%v) msg(%s)", err, msg)
  137. continue
  138. }
  139. log.Info("load unicom userbind flow(%v) orderstatus(%s)", u, orderstatus)
  140. if orderstatus == "00" {
  141. continue
  142. } else if orderstatus != "01" {
  143. if err = s.returnPoints(c, u); err != nil {
  144. if err != ecode.NothingFound {
  145. log.Error("load unicom s.returnPoints error(%v)", err)
  146. continue
  147. }
  148. err = nil
  149. }
  150. }
  151. }
  152. delete(list, key)
  153. if err = s.dao.DeleteUserFlowCache(c, key); err != nil {
  154. log.Error("load unicom s.dao.DeleteUserFlowCache error(%v)", err)
  155. continue
  156. }
  157. }
  158. if err = s.dao.AddUserFlowListCache(context.TODO(), list); err != nil {
  159. log.Error("load unicom s.dao.AddUserFlowListCache error(%v)", err)
  160. return
  161. }
  162. log.Info("load unicom flow success")
  163. }
  164. // returnPoints retutn user integral and flow
  165. func (s *Service) returnPoints(c context.Context, u *unicom.UnicomUserFlow) (err error) {
  166. var (
  167. userbind *unicom.UserBind
  168. result int64
  169. )
  170. if userbind, err = s.unicomBindInfo(c, u.Mid); err != nil {
  171. return
  172. }
  173. ub := &unicom.UserBind{}
  174. *ub = *userbind
  175. ub.Flow = ub.Flow + u.Flow
  176. ub.Integral = ub.Integral + u.Integral
  177. if err = s.dao.AddUserBindCache(c, ub.Mid, ub); err != nil {
  178. log.Error("unicom s.dao.AddUserBindCache error(%v)", err)
  179. return
  180. }
  181. if result, err = s.dao.UpUserIntegral(c, ub); err != nil || result == 0 {
  182. log.Error("unicom s.dao.UpUserIntegral error(%v) or result==0", err)
  183. return
  184. }
  185. var packInt int
  186. if u.Integral > 0 {
  187. packInt = u.Integral
  188. } else {
  189. packInt = u.Flow
  190. }
  191. log.Info("unicom_pack(%v) mid(%v)", u.Desc+",领取失败并返还", userbind.Mid)
  192. s.unicomPackInfoc(userbind.Usermob, u.Desc+",领取失败并返还", u.Orderid, userbind.Phone, packInt, 0, userbind.Mid, time.Now())
  193. return
  194. }