印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
6.4 KiB

1 year ago
package handler
import (
3 months ago
"fmt"
jsoniter "github.com/json-iterator/go"
1 year ago
"reflect"
"server/call"
"server/common"
"server/modules/backend/app"
"server/modules/backend/values"
"server/natsClient"
"server/pb"
3 months ago
"server/util"
1 year ago
"sort"
"strings"
3 months ago
"time"
1 year ago
"github.com/gin-gonic/gin"
)
// ConfigControlCommon 所有调控配置通用逻辑
func ConfigControlCommon(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
path := c.Request.URL.Path
path = strings.ReplaceAll(path, "/gm/control/", "")
all := strings.Split(path, "/")
if len(all) > 2 {
a.Code = values.CodeRetry
return
}
t := all[0]
opt := all[1]
reloadType := values.GetControlType(t)
element, list := common.GetConfigStructByType(reloadType)
var resp interface{}
if opt == "list" {
if !a.MGetAll(element, list) {
return
}
resp = CheckSpecial(reloadType, list)
if resp == nil {
resp = values.GMConfigCommonListResp{Config: list}
}
} else if opt == "edit" {
req := new(values.GMConfigCommonEditReq)
if !a.S(req) {
return
}
3 months ago
err := CheckEditSpecial(reloadType, element, req.Config, a)
if err != nil {
a.Msg = err.Error()
return
}
1 year ago
if !a.MUpdateAll(req.Config, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
} else if opt == "del" {
req := new(values.GMConfigCommonDelReq)
if !a.S(req) {
return
}
if !a.MDel(req.ID, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
}
a.Data = resp
}
func CheckSpecial(t int, list interface{}) interface{} {
switch t {
}
return nil
}
3 months ago
func haveUpdatedBase(obj interface{}) (have bool) {
if obj == nil {
return
}
t := reflect.TypeOf(obj)
if t.Kind() != reflect.Ptr {
return
}
elemType := t.Elem()
if elemType.Kind() == reflect.Struct {
for i := 0; i < elemType.NumField(); i++ {
field := elemType.Field(i)
if field.Anonymous && field.Type.Name() == "UpdatedBase" {
have = true
break
}
}
}
return
}
func CheckEditSpecial(t int, obj interface{}, config []map[string]interface{}, a *app.Gin) (err error) {
if haveUpdatedBase(obj) {
for _, update := range config {
update["UpdatedAt"] = time.Now().Unix()
update["Operator"] = a.User.Name
_, ok := update["ID"]
if !ok {
update["CreatedAt"] = time.Now().Unix()
}
}
}
switch t {
case common.ReloadConfigGameList:
for _, update := range config {
delete(update, "GameProvider")
delete(update, "GameID")
delete(update, "GameCode")
delete(update, "Icon")
delete(update, "Name")
delete(update, "GameType")
}
case common.ReloadConfigRank:
// todo 校验活动是否存在
for _, update := range config {
rankId, ok := update["ID"]
rankCycle := update["RankCycle"].(string)
rankType := util.ToInt(update["RankType"])
rankCycleMap := make(map[string]struct{})
_ = jsoniter.UnmarshalFromString(rankCycle, &rankCycleMap)
oldRanks := call.GetConfigRank(rankType)
if ok {
for _, oldRank := range oldRanks {
for oldRankType := range oldRank.RankCycleMap {
_, exist := rankCycleMap[oldRankType]
if exist && rankId != oldRank.ID {
err = fmt.Errorf("周期类型[%s] 已经在活动[%d]存在", oldRankType, oldRank.ID)
return
}
}
}
} else { // 新增,同等类型的活动不能重复
for _, oldRank := range oldRanks {
for oldRankType := range oldRank.RankCycleMap {
_, exist := rankCycleMap[oldRankType]
if exist {
err = fmt.Errorf("周期类型[%s] 已经在活动[%d]存在", oldRankType, oldRank.ID)
return
}
}
}
}
}
}
return nil
}
1 year ago
// ConfigPayWeight 支付渠道权重配置
func ConfigPayWeight(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
path := c.Request.URL.Path
index := strings.LastIndex(path, "/")
if index < 0 {
a.Code = values.CodeParam
return
}
opt := path[index+1:]
reloadType := common.ReloadConfigPayWeight
element, list := common.GetConfigStructByType(reloadType)
resp := values.GMConfigPayWeightResp{}
if opt == "list" {
if !a.MGetAll(element, list) {
return
}
list = reflect.ValueOf(list).Elem().Interface()
retList := []common.ConfigPayChannels{}
for _, v := range list.([]common.ConfigPayChannels) {
if v.CurrencyType == common.CurrencyINR {
1 year ago
retList = append(retList, v)
}
}
sort.Slice(retList, func(i, j int) bool {
return retList[i].PayPer > retList[j].PayPer
})
resp.Config = retList
// resp.Status, _ = db.Redis().GetInt(common.RedisKeyPayStatus)
} else if opt == "edit" {
req := new(values.GMConfigCommonEditReq)
if !a.S(req) {
return
}
if !a.MUpdateAll(req.Config, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
} else if opt == "del" {
req := new(values.GMConfigCommonDelReq)
if !a.S(req) {
return
}
if !a.MDel(req.ID, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
}
a.Data = resp
}
// ConfigWithdrawWeight 退出渠道配置
func ConfigWithdrawWeight(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
path := c.Request.URL.Path
index := strings.LastIndex(path, "/")
if index < 0 {
a.Code = values.CodeParam
return
}
opt := path[index+1:]
reloadType := common.ReloadConfigWithdrawWeight
element, list := common.GetConfigStructByType(reloadType)
var resp interface{}
if opt == "list" {
if !a.MGetAll(element, list) {
return
}
list = reflect.ValueOf(list).Elem().Interface()
retList := []common.ConfigWithdrawChannels{}
for _, v := range list.([]common.ConfigWithdrawChannels) {
if v.CurrencyType == common.CurrencyINR {
1 year ago
retList = append(retList, v)
}
}
sort.Slice(retList, func(i, j int) bool {
return retList[i].WithdrawPer > retList[j].WithdrawPer
})
resp = values.GMConfigCommonListResp{Config: retList}
} else if opt == "edit" {
req := new(values.GMConfigCommonEditReq)
if !a.S(req) {
return
}
if !a.MUpdateAll(req.Config, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
} else if opt == "del" {
req := new(values.GMConfigCommonDelReq)
if !a.S(req) {
return
}
if !a.MDel(req.ID, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
}
a.Data = resp
}