DESKTOP-HN5QP3V\Administrator 1 месяц назад
Родитель
Сommit
7a42b6f981

+ 36 - 16
app/service/version.go

@@ -27,17 +27,19 @@ func (service *VersionServerService) Servers() ([]*version.Version, error) {
 }
 
 type VersionCheckService struct {
-	Version string `json:"version" binding:"required"`
-	Channel string `json:"channel" binding:"required"`
+	Version    string `json:"version" binding:"required"`
+	Channel    string `json:"channel" binding:"required"`
+	EnvVersion string `json:"envVersion"`
 }
 
 func (service *VersionCheckService) Check() (*version.Version, error) {
-	return task.VersionTask.Check(service.Version, service.Channel), nil
+	return task.VersionTask.Check(service.Version, service.Channel, service.EnvVersion), nil
 }
 
 type VersionShowService struct {
 	CondPage
-	Channel string `form:"channel" json:"channel"`
+	Channel    string `form:"channel" json:"channel"`
+	EnvVersion string `form:"envVersion" json:"envVersion"`
 }
 
 func (service *VersionShowService) List() ([]version.Version, error) {
@@ -46,22 +48,36 @@ func (service *VersionShowService) List() ([]version.Version, error) {
 	if service.Channel != "" {
 		queryDoc["channel"] = service.Channel
 	}
+	if service.EnvVersion != "" {
+		envVersion := task.NormalizeEnvVersion(service.EnvVersion)
+		if envVersion == "release" {
+			queryDoc["$or"] = []bson.M{
+				{"envVersion": envVersion},
+				{"envVersion": ""},
+				{"envVersion": bson.M{"$exists": false}},
+			}
+		} else {
+			queryDoc["envVersion"] = envVersion
+		}
+	}
 
 	err := mgm.Coll(&version.Version{}).SimpleFind(&versions, queryDoc)
 	return versions, err
 }
 
 type VersionCreateService struct {
-	Channel string `json:"channel" binding:"required"`
-	Version string `json:"version" binding:"required"`
-	Name    string `json:"name" binding:"required"`
-	CDN     string `json:"cdn" binding:"required"`
-	Url     string `json:"url" binding:"required"`
+	Channel    string `json:"channel" binding:"required"`
+	EnvVersion string `json:"envVersion"`
+	Version    string `json:"version" binding:"required"`
+	Name       string `json:"name" binding:"required"`
+	CDN        string `json:"cdn" binding:"required"`
+	Url        string `json:"url" binding:"required"`
 }
 
 func (service *VersionCreateService) Create() error {
 	version := new(version.Version)
 	version.Channel = service.Channel
+	version.EnvVersion = task.NormalizeEnvVersion(service.EnvVersion)
 	version.Name = service.Name
 	version.Version = service.Version
 	version.CDN = service.CDN
@@ -71,13 +87,14 @@ func (service *VersionCreateService) Create() error {
 }
 
 type VersionEditService struct {
-	Id      string  `json:"id" binding:"required"`
-	Channel *string `json:"channel"`
-	Version *string `json:"version"`
-	Name    *string `json:"name"`
-	CDN     *string `json:"cdn"`
-	Url     *string `json:"url"`
-	Default *bool   `json:"default"`
+	Id         string  `json:"id" binding:"required"`
+	Channel    *string `json:"channel"`
+	EnvVersion *string `json:"envVersion"`
+	Version    *string `json:"version"`
+	Name       *string `json:"name"`
+	CDN        *string `json:"cdn"`
+	Url        *string `json:"url"`
+	Default    *bool   `json:"default"`
 }
 
 func (service *VersionEditService) Edit() error {
@@ -89,6 +106,9 @@ func (service *VersionEditService) Edit() error {
 	if service.Channel != nil {
 		updateDoc["channel"] = service.Channel
 	}
+	if service.EnvVersion != nil {
+		updateDoc["envVersion"] = task.NormalizeEnvVersion(*service.EnvVersion)
+	}
 	if service.Name != nil {
 		updateDoc["name"] = service.Name
 	}

+ 52 - 10
app/task/version.go

@@ -3,12 +3,18 @@ package task
 import (
 	"dsbqj-admin/model/mongo/version"
 	"dsbqj-admin/pkg/util"
+	"strings"
 	"sync"
 
 	"github.com/kamva/mgm/v3"
 	"go.mongodb.org/mongo-driver/bson"
 )
 
+const (
+	releaseEnvVersion = "release"
+	trialEnvVersion   = "trial"
+)
+
 var VersionTask *Versions
 
 type Versions struct {
@@ -21,6 +27,13 @@ type ChannelVersions struct {
 	VMap  util.SafeMap[string, *version.Version]
 }
 
+func NormalizeEnvVersion(envVersion string) string {
+	if strings.EqualFold(strings.TrimSpace(envVersion), trialEnvVersion) {
+		return trialEnvVersion
+	}
+	return releaseEnvVersion
+}
+
 func VersionInit() *Versions {
 	VersionTask = new(Versions)
 	return VersionTask
@@ -38,28 +51,57 @@ func (this *Versions) Exec() {
 
 			channelVersion, _ := this.VChannels.Get(v.Channel)
 			channelVersion.VList.Push(v)
-			channelVersion.VMap.Set(v.Version, v)
+			channelVersion.VMap.Set(versionMapKey(v.Version, NormalizeEnvVersion(v.EnvVersion)), v)
 		}
 	}
 }
 
-func (this *Versions) Check(version string, channel string) *version.Version {
+func (this *Versions) Check(version string, channel string, envVersion string) *version.Version {
+	envVersionRequired := strings.TrimSpace(envVersion) != ""
+	envVersion = NormalizeEnvVersion(envVersion)
+
 	channelVersions, ok := this.VChannels.Get(channel)
 	if !ok { // 遍历列表
 		return nil
 	}
 
-	data, ok := channelVersions.VMap.Get(version)
-	if !ok {
-		for _, v := range channelVersions.VList.View() {
-			if v.Default && v.Version == version && v.Channel == channel {
-				data = v
-				break
-			}
+	if envVersionRequired {
+		if data := this.defaultVersion(channelVersions, channel, envVersion); data != nil {
+			return data
+		}
+		if data, ok := channelVersions.VMap.Get(versionMapKey(version, envVersion)); ok {
+			return data
+		}
+		return nil
+	}
+
+	if data := this.version(channelVersions, channel, version); data != nil {
+		return data
+	}
+
+	return this.defaultVersion(channelVersions, channel, envVersion)
+}
+
+func (this *Versions) version(channelVersions *ChannelVersions, channel string, version string) *version.Version {
+	for _, v := range channelVersions.VList.View() {
+		if v.Channel == channel && v.Version == version {
+			return v
 		}
 	}
+	return nil
+}
+
+func (this *Versions) defaultVersion(channelVersions *ChannelVersions, channel string, envVersion string) *version.Version {
+	for _, v := range channelVersions.VList.View() {
+		if v.Default && v.Channel == channel && NormalizeEnvVersion(v.EnvVersion) == envVersion {
+			return v
+		}
+	}
+	return nil
+}
 
-	return data
+func versionMapKey(version string, envVersion string) string {
+	return envVersion + ":" + version
 }
 
 func (this *Versions) Servers(channel string) []*version.Version {

+ 12 - 0
config/subscribe_template.yaml

@@ -0,0 +1,12 @@
+test:
+  hangup: "0ByvFSV3B3U5-1XyvruRe7AMHAxiwQBFUL50lmoatCY"
+  autofight: "5rwMjLs6nVQ0SMtS0EAPEpmXZduOdEgSWbIjSNG5T7M"
+  guildgame: "e6D_r9_5tKNZK0cvM8fjzMXy9z1-aoNYQ9TSvAEuklU"
+  alliance: "e6D_r9_5tKNZK0cvM8fjzMXy9z1-aoNYQ9TSvAEuklU"
+  warheavens: "e6D_r9_5tKNZK0cvM8fjzMXy9z1-aoNYQ9TSvAEuklU"
+product:
+  hangup: "Us9GD_cDCmCCp_lBnOy6yx4iZ6BDxv3Nll-Wijd4ey4"
+  autofight: "PyIjPh074kAIZNoBAJXizr3qCZBO9xiPxm6jpwapsN8"
+  guildgame: "4vcKi6k6roG0OmpLW9OqtLRYMkM32TEONhCEZJNuqnI"
+  alliance: "4vcKi6k6roG0OmpLW9OqtLRYMkM32TEONhCEZJNuqnI"
+  warheavens: "4vcKi6k6roG0OmpLW9OqtLRYMkM32TEONhCEZJNuqnI"

+ 1 - 0
model/mongo/version/version.go

@@ -7,6 +7,7 @@ import (
 type Version struct {
 	mgm.DefaultModel `bson:",inline" json:"id"`
 	Channel          string `bson:"channel" json:"channel"`
+	EnvVersion       string `bson:"envVersion" json:"envVersion"`
 	Version          string `bson:"version" json:"version"`
 	Name             string `bson:"name" json:"name"`
 	CDN              string `bson:"cdn" json:"cdn"`

+ 56 - 21
pkg/sender/subscribe.go

@@ -6,26 +6,20 @@ import (
 	"dsbqj-admin/pkg/logger"
 	"github.com/kamva/mgm/v3"
 	"go.mongodb.org/mongo-driver/bson"
+	yaml "gopkg.in/yaml.v2"
 	"log"
 	"os"
+	"strings"
+	"sync"
 )
 
-var templateMap = map[string]map[string]string{
-	"test": {
-		"hangup":     "0ByvFSV3B3U5-1XyvruRe7AMHAxiwQBFUL50lmoatCY",
-		"autofight":  "5rwMjLs6nVQ0SMtS0EAPEpmXZduOdEgSWbIjSNG5T7M",
-		"guildgame":  "e6D_r9_5tKNZK0cvM8fjzMXy9z1-aoNYQ9TSvAEuklU",
-		"alliance":   "e6D_r9_5tKNZK0cvM8fjzMXy9z1-aoNYQ9TSvAEuklU",
-		"warheavens": "e6D_r9_5tKNZK0cvM8fjzMXy9z1-aoNYQ9TSvAEuklU",
-	},
-	"product": {
-		"hangup":     "wAXZWcbt8Hkxmt2iZXR7ieiM1A_Mqt7cFU5ky6dZNMo",
-		"autofight":  "HbFIcVV78vbPr1uhe-tVAo8oQKv2jnljvPYRl-ktiFE",
-		"guildgame":  "Q6JBEqIPufrfmsZw-Wds2sdLATfJU2zA0ebpMR3W2F4",
-		"alliance":   "Q6JBEqIPufrfmsZw-Wds2sdLATfJU2zA0ebpMR3W2F4",
-		"warheavens": "Q6JBEqIPufrfmsZw-Wds2sdLATfJU2zA0ebpMR3W2F4",
-	},
-}
+const subscribeTemplateConfigFile = "config/subscribe_template.yaml"
+
+var (
+	subscribeTemplateOnce    sync.Once
+	subscribeTemplateMap     map[string]map[string]string
+	subscribeTemplateLoadErr error
+)
 
 type SubscribeSend struct {
 	DeviceId string
@@ -105,7 +99,7 @@ func (this *SubscribeSender) SendHangupSubscribe(deviceId string) {
 	msg["thing3"] = make(map[string]string)
 	msg["thing3"]["value"] = "您的挂机奖励时长已满,请打开游戏领取"
 
-	this.wxHelper.SendWechatSubscribe(subscribeOne.OpenId, templateMap[os.Getenv("CHANNEL")]["hangup"], msg)
+	this.sendWechatSubscribe(subscribeOne.OpenId, "hangup", msg)
 }
 
 func (this *SubscribeSender) SendAutoFightSubscribe(deviceId string) {
@@ -120,7 +114,7 @@ func (this *SubscribeSender) SendAutoFightSubscribe(deviceId string) {
 	msg["thing1"] = make(map[string]string)
 	msg["thing1"]["value"] = "离线闯关提醒"
 
-	this.wxHelper.SendWechatSubscribe(subscribeOne.OpenId, templateMap[os.Getenv("CHANNEL")]["autofight"], msg)
+	this.sendWechatSubscribe(subscribeOne.OpenId, "autofight", msg)
 }
 
 func (this *SubscribeSender) SendGuildGameSubscribe(openIds []string) {
@@ -131,7 +125,7 @@ func (this *SubscribeSender) SendGuildGameSubscribe(openIds []string) {
 	msg["thing4"]["value"] = "门派攻防战"
 
 	for _, openId := range openIds {
-		this.wxHelper.SendWechatSubscribe(openId, templateMap[os.Getenv("CHANNEL")]["guildgame"], msg)
+		this.sendWechatSubscribe(openId, "guildgame", msg)
 	}
 }
 
@@ -143,7 +137,7 @@ func (this *SubscribeSender) SendAllianceSubscribe(openIds []string) {
 	msg["thing4"]["value"] = "三界争峰"
 
 	for _, openId := range openIds {
-		this.wxHelper.SendWechatSubscribe(openId, templateMap[os.Getenv("CHANNEL")]["alliance"], msg)
+		this.sendWechatSubscribe(openId, "alliance", msg)
 	}
 }
 
@@ -155,6 +149,47 @@ func (this *SubscribeSender) SendWarHeavensSubscribe(openIds []string) {
 	msg["thing4"]["value"] = "决战诸仙"
 
 	for _, openId := range openIds {
-		this.wxHelper.SendWechatSubscribe(openId, templateMap[os.Getenv("CHANNEL")]["warheavens"], msg)
+		this.sendWechatSubscribe(openId, "warheavens", msg)
+	}
+}
+
+func (this *SubscribeSender) sendWechatSubscribe(openId string, module string, msg map[string]map[string]string) {
+	templateID := subscribeTemplateID(module)
+	if templateID == "" {
+		logger.Info("[push] subscribe template id not configured, channel=%s, module=%s", os.Getenv("CHANNEL"), module)
+		return
+	}
+
+	this.wxHelper.SendWechatSubscribe(openId, templateID, msg)
+}
+
+func subscribeTemplateID(module string) string {
+	templates, err := loadSubscribeTemplateConfig()
+	if err != nil {
+		logger.Info("[push] load subscribe template config failed: %v", err)
+		return ""
+	}
+
+	channel := strings.ToLower(strings.TrimSpace(os.Getenv("CHANNEL")))
+	moduleKey := strings.ToLower(strings.TrimSpace(module))
+	if channel != "" {
+		if templateID := strings.TrimSpace(templates[channel][moduleKey]); templateID != "" {
+			return templateID
+		}
 	}
+
+	return strings.TrimSpace(templates["default"][moduleKey])
+}
+
+func loadSubscribeTemplateConfig() (map[string]map[string]string, error) {
+	subscribeTemplateOnce.Do(func() {
+		data, err := os.ReadFile(subscribeTemplateConfigFile)
+		if err != nil {
+			subscribeTemplateLoadErr = err
+			return
+		}
+		subscribeTemplateLoadErr = yaml.Unmarshal(data, &subscribeTemplateMap)
+	})
+
+	return subscribeTemplateMap, subscribeTemplateLoadErr
 }

+ 18 - 8
pkg/serializer/version.go

@@ -2,28 +2,38 @@ package serializer
 
 import (
 	"dsbqj-admin/model/mongo/version"
+	"strings"
 )
 
 type Version struct {
-	Version string `json:"version"`
-	Name    string `json:"name"`
-	CDN     string `json:"cdn"`
-	Url     string `json:"url"`
+	Version    string `json:"version"`
+	EnvVersion string `json:"envVersion"`
+	Name       string `json:"name"`
+	CDN        string `json:"cdn"`
+	Url        string `json:"url"`
 }
 
 func BuildVersion(version *version.Version) *Version {
 	var res *Version
 	if version != nil {
 		res = &Version{
-			Version: version.Version,
-			Name:    version.Name,
-			CDN:     version.CDN,
-			Url:     version.Url,
+			Version:    version.Version,
+			EnvVersion: normalizeEnvVersion(version.EnvVersion),
+			Name:       version.Name,
+			CDN:        version.CDN,
+			Url:        version.Url,
 		}
 	}
 	return res
 }
 
+func normalizeEnvVersion(envVersion string) string {
+	if strings.EqualFold(strings.TrimSpace(envVersion), "trial") {
+		return "trial"
+	}
+	return "release"
+}
+
 type Versions map[string]interface{}
 
 func BuildVersions(versions []*version.Version) map[string]interface{} {