miniprogram.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package miniProgram
  2. import (
  3. "context"
  4. "debrisProduct/internal/model"
  5. "debrisProduct/internal/service"
  6. "debrisProduct/utility"
  7. "sync"
  8. "github.com/gogf/gf/v2/crypto/gmd5"
  9. "github.com/gogf/gf/v2/frame/g"
  10. "github.com/gogf/gf/v2/util/gconv"
  11. "github.com/gogf/gf/v2/util/gutil"
  12. )
  13. type (
  14. sMiniProgram struct {
  15. cacheMap map[string]*model.MiniProgram
  16. industryItemMiniProgram map[string]map[string]*model.MiniProgram
  17. lock sync.RWMutex
  18. md5 string
  19. }
  20. )
  21. func init() {
  22. var (
  23. sMp = &sMiniProgram{}
  24. )
  25. service.RegisterMiniProgram(sMp)
  26. }
  27. func (s *sMiniProgram) GetMiniProgramByCode(miniCode string) *model.MiniProgram {
  28. s.lock.RLock()
  29. defer s.lock.RUnlock()
  30. if v, ok := s.cacheMap[miniCode]; ok && v != nil {
  31. return v
  32. }
  33. return &model.MiniProgram{}
  34. }
  35. func (s *sMiniProgram) GetMiniProgramByCtx(ctx context.Context, miniCode string) *model.MiniProgram {
  36. s.lock.RLock()
  37. defer s.lock.RUnlock()
  38. if v, ok := s.cacheMap[miniCode]; ok && v != nil {
  39. mp := gutil.Copy(v).(*model.MiniProgram)
  40. if mpc := s.cacheMap[utility.GetAppidFromReferer(ctx)]; mpc != nil {
  41. mp.Appid = mpc.Appid
  42. mp.Appsecret = mpc.Appsecret
  43. }
  44. return mp
  45. }
  46. return &model.MiniProgram{}
  47. }
  48. func (s *sMiniProgram) GetMiniProgramByReferer(ctx context.Context) *model.MiniProgram {
  49. s.lock.RLock()
  50. defer s.lock.RUnlock()
  51. if v, ok := s.cacheMap[utility.GetAppidFromReferer(ctx)]; ok && v != nil {
  52. return gutil.Copy(v).(*model.MiniProgram)
  53. }
  54. return &model.MiniProgram{}
  55. }
  56. func (s *sMiniProgram) LoadMiniProgram(ctx context.Context) {
  57. res, _ := g.DB().GetAll(ctx, "SELECT a.name,a.code,a.industry_code,a.industry_item_code,a.appid,a.appsecret,a.point_version,b.value AS industryValue,b.name AS industryName FROM miniprogram a LEFT JOIN industry b ON a.industry_code = b.`code` order by a.id asc")
  58. if thisMd5, _ := gmd5.Encrypt(res.Json()); res.Len() > 0 && s.md5 != thisMd5 {
  59. var (
  60. cache = map[string]*model.MiniProgram{}
  61. industryItemMiniProgram = map[string]map[string]*model.MiniProgram{}
  62. )
  63. for _, m := range res.List() {
  64. appid := gconv.String(m["appid"])
  65. code := gconv.String(m["code"])
  66. mp := &model.MiniProgram{
  67. Code: code,
  68. Name: gconv.String(m["name"]),
  69. IndustryCode: gconv.String(m["industry_code"]),
  70. IndustryItemCode: gconv.String(m["industry_item_code"]),
  71. Appid: appid,
  72. Appsecret: gconv.String(m["appsecret"]),
  73. IndustryName: gconv.String(m["industryName"]),
  74. IndustryValue: gconv.String(m["industryValue"]),
  75. PointVersion: gconv.Int(m["point_version"]),
  76. }
  77. if code != "" {
  78. cache[code] = mp
  79. }
  80. if appid != "" {
  81. cache[appid] = mp
  82. }
  83. if industryItemMiniProgram[mp.IndustryCode] == nil {
  84. industryItemMiniProgram[mp.IndustryCode] = map[string]*model.MiniProgram{}
  85. }
  86. industryItemMiniProgram[mp.IndustryCode][mp.IndustryItemCode] = mp
  87. }
  88. s.lock.Lock()
  89. defer s.lock.Unlock()
  90. s.cacheMap = cache
  91. s.md5 = thisMd5
  92. s.industryItemMiniProgram = industryItemMiniProgram
  93. g.Log().Infof(ctx, "加载更新miniProgram配置")
  94. }
  95. }
  96. func (s *sMiniProgram) IsInExamine(ctx context.Context) bool {
  97. biz := service.BizCtx().Get(ctx)
  98. if biz == nil {
  99. return false
  100. }
  101. version := biz.Session.MustGet("version").String()
  102. if version == "" {
  103. return false
  104. }
  105. for _, v := range g.Config().MustGet(ctx, "examineVersion").Strings() {
  106. if v == version {
  107. return true
  108. }
  109. }
  110. for _, v := range g.Config(biz.MiniProgram.Code).MustGet(ctx, "examineVersion").Strings() {
  111. if v == version {
  112. return true
  113. }
  114. }
  115. return false
  116. }
  117. func (s *sMiniProgram) GetMiniProgramByIndustryItem(code, item string) *model.MiniProgram {
  118. s.lock.RLock()
  119. defer s.lock.RUnlock()
  120. if s.industryItemMiniProgram[code] != nil && s.industryItemMiniProgram[code][item] != nil {
  121. return s.industryItemMiniProgram[code][item]
  122. }
  123. return &model.MiniProgram{}
  124. }