@@ -56,6 +56,7 @@ func InitCfg() { | |||||
Log = &conf.Log | Log = &conf.Log | ||||
RedisAddr = conf.RedisAddr | RedisAddr = conf.RedisAddr | ||||
Admin = &conf.Admin | Admin = &conf.Admin | ||||
AppComm = &conf.AppComm | |||||
MQ = &conf.MQ | MQ = &conf.MQ | ||||
ES = &conf.ES | ES = &conf.ES | ||||
ImBusinessRpc = &conf.ImBusinessRpc | ImBusinessRpc = &conf.ImBusinessRpc | ||||
@@ -0,0 +1,32 @@ | |||||
package db | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/db/gim/model" | |||||
) | |||||
type dbSysCfg struct{} | |||||
var DbSysCfg = new(dbSysCfg) | |||||
// SysCfgGetAll 获取系统配置 | |||||
func (*dbSysCfg) SysCfgGetAll(masterId int64) (*[]model.SysCfg, error) { | |||||
var cfgList []model.SysCfg | |||||
if err := db.ImDb.Where("`master_id`=?", masterId).Find(&cfgList); err != nil { | |||||
return nil, err | |||||
} | |||||
return &cfgList, nil | |||||
} | |||||
// SysCfgGetOne 获取一条记录 | |||||
func (*dbSysCfg) SysCfgGetOne(key string, masterId string) (*model.SysCfg, error) { | |||||
var cfgList model.SysCfg | |||||
isHas, err := db.ImDb.Where("`key` = ? and `master_id` = ?", key, masterId).Get(&cfgList) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if !isHas { | |||||
return nil, nil | |||||
} | |||||
return &cfgList, nil | |||||
} |
@@ -0,0 +1,8 @@ | |||||
package model | |||||
type SysCfg struct { | |||||
Key string // 键 | |||||
Val string // 值 | |||||
Memo string // 备注 | |||||
MasterId int64 // 站长id | |||||
} |
@@ -1,73 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/md" | |||||
"applet/app/utils" | |||||
"errors" | |||||
"strings" | |||||
"github.com/gin-gonic/gin" | |||||
) | |||||
// 因为在mw_auth已经做完所有校验, 因此在此不再做任何校验 | |||||
//GetUser is get user model | |||||
func GetUser(c *gin.Context) *md.User { | |||||
user, _ := c.Get("user") | |||||
return user.(*md.User) | |||||
} | |||||
func GetUid(c *gin.Context) string { | |||||
user, _ := c.Get("user") | |||||
u := user.(*md.User) | |||||
return utils.IntToStr(u.Info.Uid) | |||||
} | |||||
func CheckUser(c *gin.Context) (*md.User, error) { | |||||
token := c.GetHeader("Authorization") | |||||
if token == "" { | |||||
return nil, errors.New("token not exist") | |||||
} | |||||
// 按空格分割 | |||||
parts := strings.SplitN(token, " ", 2) | |||||
if !(len(parts) == 2 && parts[0] == "Bearer") { | |||||
return nil, errors.New("token format error") | |||||
} | |||||
// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 | |||||
mc, err := utils.ParseToken(parts[1]) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
// 获取user | |||||
u, err := db.UserFindByID(db.DBs[c.GetString("mid")], mc.UID) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if u == nil { | |||||
return nil, errors.New("token can not find user") | |||||
} | |||||
// 获取user profile | |||||
up, err := db.UserProfileFindByID(db.DBs[c.GetString("mid")], mc.UID) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
// 获取user 等级 | |||||
ul, err := db.UserLevelByID(db.DBs[c.GetString("mid")], u.Level) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
// 获取用户标签 | |||||
tags, err := db.UserTagsByUid(db.DBs[c.GetString("mid")], mc.UID) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
user := &md.User{ | |||||
Info: u, | |||||
Profile: up, | |||||
Level: ul, | |||||
Tags: tags, | |||||
} | |||||
return user, nil | |||||
} |
@@ -1,58 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/db/model" | |||||
"applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"github.com/gin-gonic/gin" | |||||
"github.com/tidwall/gjson" | |||||
"strings" | |||||
) | |||||
// 获取指定类型的域名:admin、wap、api | |||||
func GetWebSiteDomainInfo(c *gin.Context, domainType string) string { | |||||
if domainType == "" { | |||||
domainType = "wap" | |||||
} | |||||
domainSetting := SysCfgGet(c, "domain_setting") | |||||
domainTypePath := domainType + ".type" | |||||
domainSslPath := domainType + ".isOpenHttps" | |||||
domainPath := domainType + ".domain" | |||||
domainTypeValue := gjson.Get(domainSetting, domainTypePath).String() | |||||
domainSslValue := gjson.Get(domainSetting, domainSslPath).String() | |||||
domain := gjson.Get(domainSetting, domainPath).String() | |||||
scheme := "http://" | |||||
if domainSslValue == "1" { | |||||
scheme = "https://" | |||||
} | |||||
// 有自定义域名 返回自定义的 | |||||
if domainTypeValue == "own" && domain != "" { | |||||
return scheme + domain | |||||
} | |||||
// 否则返回官方的 | |||||
official, err := db.GetOfficialDomainInfoByType(db.Db, c.GetString("mid"), domainType) | |||||
if err != nil { | |||||
_ = logx.Errorf("Get Official Domain Fail! %s", err) | |||||
return "" | |||||
} | |||||
if strings.Contains(official, "http") { | |||||
return official | |||||
} | |||||
return scheme + official | |||||
} | |||||
// 获取指定类型的域名对应的masterId:admin、wap、api | |||||
func GetWebSiteDomainMasterId(domainType string, host string) string { | |||||
obj := new(model.UserAppDomain) | |||||
has, err := db.Db.Where("domain=? and type=?", host, domainType).Get(obj) | |||||
if err != nil || !has { | |||||
return "" | |||||
} | |||||
return utils.AnyToString(obj.Uuid) | |||||
} |
@@ -1,18 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"applet/app/md" | |||||
"github.com/gin-gonic/gin" | |||||
) | |||||
// 文件host | |||||
func FileImgHost(c *gin.Context) string { | |||||
res := SysCfgFind(c, md.KEY_CFG_FILE_SCHEME, md.KEY_CFG_FILE_HOST) | |||||
return res[md.KEY_CFG_FILE_SCHEME] + "://" + res[md.KEY_CFG_FILE_HOST] + "/" | |||||
} | |||||
// 获取缩略图参数 | |||||
func FileImgThumbnail(c *gin.Context) string { | |||||
return SysCfgGet(c, md.KEY_CFG_FILE_AVATAR_THUMBNAIL) | |||||
} |
@@ -1,71 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"applet/app/utils" | |||||
"fmt" | |||||
"strings" | |||||
"github.com/gin-gonic/gin" | |||||
) | |||||
//ImageFormat is 格式化 图片 | |||||
func ImageFormat(c *gin.Context, name string) string { | |||||
if strings.Contains(name, "https:") || strings.Contains(name, "http:") { | |||||
return name | |||||
} | |||||
scheme := SysCfgGet(c, "file_bucket_scheme") | |||||
domain := SysCfgGet(c, "file_bucket_host") | |||||
return fmt.Sprintf("%s://%s/%s", scheme, domain, name) | |||||
} | |||||
//OffImageFormat is 格式化官方 图片 | |||||
func OffImageFormat(c *gin.Context, name string) string { | |||||
if strings.Contains(name, "https:") || strings.Contains(name, "http:") { | |||||
return name | |||||
} | |||||
return fmt.Sprintf("%s://%s/%s", "http", "ossq.izhyin.cn", name) | |||||
} | |||||
// ImageBucket is 获取域名 | |||||
func ImageBucket(c *gin.Context) (string, string) { | |||||
return SysCfgGet(c, "file_bucket_scheme"), SysCfgGet(c, "file_bucket_host") | |||||
} | |||||
// ImageBucketNew is 获取域名 | |||||
func ImageBucketNew(c *gin.Context) (string, string, string, map[string]string) { | |||||
var list = make(map[string]string, 0) | |||||
for i := 1; i < 10; i++ { | |||||
keys := "file_bucket_sub_host" + utils.IntToStr(i) | |||||
list[keys] = SysCfgGet(c, keys) | |||||
} | |||||
return SysCfgGet(c, "file_bucket_scheme"), SysCfgGet(c, "file_bucket_host"), SysCfgGet(c, "file_bucket_sub_host"), list | |||||
} | |||||
// ImageFormatWithBucket is 格式化成oss 域名 | |||||
func ImageFormatWithBucket(scheme, domain, name string) string { | |||||
if strings.Contains(name, "http") { | |||||
return name | |||||
} | |||||
return fmt.Sprintf("%s://%s/%s", scheme, domain, name) | |||||
} | |||||
// ImageFormatWithBucket is 格式化成oss 域名 | |||||
func ImageFormatWithBucketNew(scheme, domain, subDomain string, moreSubDomain map[string]string, name string) string { | |||||
if strings.Contains(name, "http") { | |||||
return name | |||||
} | |||||
if strings.Contains(name, "{{subhost}}") && subDomain != "" { //读副域名 有可能是其他平台的 | |||||
domain = subDomain | |||||
} | |||||
//为了兼容一些客户自营商城导到不同系统 并且七牛云不一样 | |||||
for i := 1; i < 10; i++ { | |||||
keys := "file_bucket_sub_host" + utils.IntToStr(i) | |||||
if strings.Contains(name, "{{subhost"+utils.IntToStr(i)+"}}") && moreSubDomain[keys] != "" { | |||||
domain = moreSubDomain[keys] | |||||
} | |||||
name = strings.ReplaceAll(name, "{{subhost"+utils.IntToStr(i)+"}}", "") | |||||
} | |||||
name = strings.ReplaceAll(name, "{{host}}", "") | |||||
name = strings.ReplaceAll(name, "{{subhost}}", "") | |||||
return fmt.Sprintf("%s://%s/%s", scheme, domain, name) | |||||
} |
@@ -1,46 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"time" | |||||
"applet/app/db" | |||||
"applet/app/db/model" | |||||
"applet/app/e" | |||||
"applet/app/lib/qiniu" | |||||
"applet/app/md" | |||||
"applet/app/utils" | |||||
"github.com/gin-gonic/gin" | |||||
) | |||||
func FileSave(c *gin.Context, f *md.FileCallback) error { | |||||
// todo 校验时间是否超时, 目前没必要做时间校验,如果已经上传,但超时,那么会造成三方存储存在,可我方表不存在,导致冗余 | |||||
// 校验签名是否正确 | |||||
if qiniu.Sign(f.Time) != f.Sign { | |||||
return e.NewErrCode(e.ERR_SIGN) | |||||
} | |||||
newFile := &model.SysFile{ | |||||
ParentFid: utils.StrToInt64(f.DirId), | |||||
FileType: 1, | |||||
ShowName: f.FileName, | |||||
SaveName: f.FileName, | |||||
Uid: utils.StrToInt(f.Uid), | |||||
Ext: utils.FileExt(f.FileName), | |||||
Hash: f.Hash, | |||||
Mime: f.Mime, | |||||
Provider: f.Provider, | |||||
Width: utils.StrToInt(f.Width), | |||||
Height: utils.StrToInt(f.Height), | |||||
Bucket: f.Bucket, | |||||
FileSize: utils.StrToInt64(f.FileSize), | |||||
CreateAt: int(time.Now().Unix()), | |||||
} | |||||
file, _ := db.FileGetByPFidAndName(db.DBs[c.GetString("mid")], f.DirId, f.FileName) | |||||
if file != nil { | |||||
newFile.Fid = file.Fid | |||||
// 更新数据 | |||||
return db.FileUpdate(db.DBs[c.GetString("mid")], newFile) | |||||
} | |||||
return db.FileInsert(db.DBs[c.GetString("mid")], newFile) | |||||
} |
@@ -0,0 +1,43 @@ | |||||
package svc | |||||
import ( | |||||
"applet/app/cfg" | |||||
"applet/app/utils" | |||||
"applet/consume/md" | |||||
"encoding/json" | |||||
"errors" | |||||
) | |||||
// CurlSendRedPackage 发送专属红包 | |||||
func CurlSendRedPackage(args md.SendRedPackageReq, masterId, userId string) (error, map[string]interface{}) { | |||||
url := cfg.AppComm.URL + "/api/v1/comm/pay/balance_pay/im_send_red_package" | |||||
utils.FilePutContents("CurlSendRedPackage", utils.SerializeStr(map[string]interface{}{ | |||||
"data": args, | |||||
})) | |||||
bytes, err := utils.CurlPost(url, utils.Serialize(args), map[string]string{ | |||||
"master_id": masterId, | |||||
"mid": masterId, | |||||
"Request-uid": userId, | |||||
"Request-Type": "mq_consume", | |||||
}) | |||||
if err != nil { | |||||
return err, nil | |||||
} | |||||
var result struct { | |||||
Code int `json:"code"` | |||||
Msg string `json:"msg"` | |||||
Data map[string]interface{} `json:"data"` | |||||
} | |||||
utils.FilePutContents("CurlSendRedPackage", utils.SerializeStr(result)) | |||||
err = json.Unmarshal(bytes, &result) | |||||
if err != nil { | |||||
return err, nil | |||||
} | |||||
if result.Code != 1 { | |||||
if result.Msg != "" { | |||||
return errors.New(result.Msg), nil | |||||
} | |||||
return errors.New("请求comm发送红包 异常/失败"), nil | |||||
} | |||||
return nil, result.Data | |||||
} |
@@ -1,171 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"errors" | |||||
"fmt" | |||||
"github.com/gin-gonic/gin" | |||||
"strings" | |||||
"xorm.io/xorm" | |||||
"applet/app/cfg" | |||||
"applet/app/db" | |||||
"applet/app/md" | |||||
"applet/app/utils" | |||||
"applet/app/utils/cache" | |||||
) | |||||
// 单挑记录获取 | |||||
func SysCfgGet(c *gin.Context, key string) string { | |||||
mid := c.GetString("mid") | |||||
eg := db.DBs[mid] | |||||
return db.SysCfgGetWithDb(eg, mid, key) | |||||
} | |||||
// 多条记录获取 | |||||
func SysCfgFind(c *gin.Context, keys ...string) map[string]string { | |||||
e := db.DBs[c.GetString("mid")] | |||||
res := map[string]string{} | |||||
cacheKey := fmt.Sprintf(md.AppCfgCacheKey, c.GetString("mid")) | |||||
err := cache.GetJson(cacheKey, &res) | |||||
if err != nil || len(res) == 0 { | |||||
cfgList, _ := db.SysCfgGetAll(e) | |||||
if cfgList == nil { | |||||
return nil | |||||
} | |||||
for _, v := range *cfgList { | |||||
res[v.Key] = v.Val | |||||
} | |||||
// 先不设置缓存 | |||||
cache.SetJson(cacheKey, res, md.CfgCacheTime) | |||||
} | |||||
if len(keys) == 0 { | |||||
return res | |||||
} | |||||
tmp := map[string]string{} | |||||
for _, v := range keys { | |||||
if val, ok := res[v]; ok { | |||||
tmp[v] = val | |||||
} else { | |||||
tmp[v] = "" | |||||
} | |||||
} | |||||
return tmp | |||||
} | |||||
// 多条记录获取 | |||||
func EgSysCfgFind(keys ...string) map[string]string { | |||||
var e *xorm.Engine | |||||
res := map[string]string{} | |||||
if len(res) == 0 { | |||||
cfgList, _ := db.SysCfgGetAll(e) | |||||
if cfgList == nil { | |||||
return nil | |||||
} | |||||
for _, v := range *cfgList { | |||||
res[v.Key] = v.Val | |||||
} | |||||
// 先不设置缓存 | |||||
// cache.SetJson(md.KEY_SYS_CFG_CACHE, res, 60) | |||||
} | |||||
if len(keys) == 0 { | |||||
return res | |||||
} | |||||
tmp := map[string]string{} | |||||
for _, v := range keys { | |||||
if val, ok := res[v]; ok { | |||||
tmp[v] = val | |||||
} else { | |||||
tmp[v] = "" | |||||
} | |||||
} | |||||
return tmp | |||||
} | |||||
// 清理系统配置信息 | |||||
func SysCfgCleanCache() { | |||||
cache.Del(md.KEY_SYS_CFG_CACHE) | |||||
} | |||||
// 写入系统设置 | |||||
func SysCfgSet(c *gin.Context, key, val, memo string) bool { | |||||
cfg, err := db.SysCfgGetOne(db.DBs[c.GetString("mid")], key) | |||||
if err != nil || cfg == nil { | |||||
return db.SysCfgInsert(db.DBs[c.GetString("mid")], key, val, memo) | |||||
} | |||||
if memo != "" && cfg.Memo != memo { | |||||
cfg.Memo = memo | |||||
} | |||||
SysCfgCleanCache() | |||||
return db.SysCfgUpdate(db.DBs[c.GetString("mid")], key, val, cfg.Memo) | |||||
} | |||||
// 多条记录获取 | |||||
func SysCfgFindByIds(eg *xorm.Engine, keys ...string) map[string]string { | |||||
key := utils.Md5(eg.DataSourceName() + md.KEY_SYS_CFG_CACHE) | |||||
res := map[string]string{} | |||||
c, ok := cfg.MemCache.Get(key).(map[string]string) | |||||
if !ok || len(c) == 0 { | |||||
cfgList, _ := db.DbsSysCfgGetAll(eg) | |||||
if cfgList == nil { | |||||
return nil | |||||
} | |||||
for _, v := range *cfgList { | |||||
res[v.Key] = v.Val | |||||
} | |||||
cfg.MemCache.Put(key, res, 10) | |||||
} else { | |||||
res = c | |||||
} | |||||
if len(keys) == 0 { | |||||
return res | |||||
} | |||||
tmp := map[string]string{} | |||||
for _, v := range keys { | |||||
if val, ok := res[v]; ok { | |||||
tmp[v] = val | |||||
} else { | |||||
tmp[v] = "" | |||||
} | |||||
} | |||||
return tmp | |||||
} | |||||
// 支付配置 | |||||
func SysCfgFindPayment(c *gin.Context) ([]map[string]string, error) { | |||||
platform := c.GetHeader("platform") | |||||
payCfg := SysCfgFind(c, "pay_wx_pay_img", "pay_ali_pay_img", "pay_balance_img", "pay_type") | |||||
if payCfg["pay_wx_pay_img"] == "" || payCfg["pay_ali_pay_img"] == "" || payCfg["pay_balance_img"] == "" || payCfg["pay_type"] == "" { | |||||
return nil, errors.New("lack of payment config") | |||||
} | |||||
payCfg["pay_wx_pay_img"] = ImageFormat(c, payCfg["pay_wx_pay_img"]) | |||||
payCfg["pay_ali_pay_img"] = ImageFormat(c, payCfg["pay_ali_pay_img"]) | |||||
payCfg["pay_balance_img"] = ImageFormat(c, payCfg["pay_balance_img"]) | |||||
var result []map[string]string | |||||
if strings.Contains(payCfg["pay_type"], "aliPay") && platform != md.PLATFORM_WX_APPLET { | |||||
item := make(map[string]string) | |||||
item["pay_channel"] = "alipay" | |||||
item["img"] = payCfg["pay_ali_pay_img"] | |||||
item["name"] = "支付宝支付" | |||||
result = append(result, item) | |||||
} | |||||
if strings.Contains(payCfg["pay_type"], "wxPay") { | |||||
item := make(map[string]string) | |||||
item["pay_channel"] = "wx" | |||||
item["img"] = payCfg["pay_wx_pay_img"] | |||||
item["name"] = "微信支付" | |||||
result = append(result, item) | |||||
} | |||||
if strings.Contains(payCfg["pay_type"], "walletPay") { | |||||
item := make(map[string]string) | |||||
item["pay_channel"] = "fin" | |||||
item["img"] = payCfg["pay_balance_img"] | |||||
item["name"] = "余额支付" | |||||
result = append(result, item) | |||||
} | |||||
return result, nil | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package utils | |||||
import ( | |||||
"math/rand" | |||||
"time" | |||||
) | |||||
func RandFloats(min, max float64) float64 { | |||||
rand.Seed(time.Now().UnixNano()) | |||||
return min + rand.Float64()*(max-min) | |||||
} | |||||
func RandInt(max int) int { | |||||
rand.Seed(time.Now().UnixNano()) // seed后随机数可变 | |||||
return rand.Intn(max) // 0-100的随机数 | |||||
} |
@@ -224,3 +224,13 @@ func GetLastDateOfMonth(d time.Time) time.Time { | |||||
func GetZeroTime(d time.Time) time.Time { | func GetZeroTime(d time.Time) time.Time { | ||||
return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, d.Location()) | return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, d.Location()) | ||||
} | } | ||||
// UnixMilliTime 将时间转化为毫秒数 | |||||
func UnixMilliTime(t time.Time) int64 { | |||||
return t.UnixNano() / 1000000 | |||||
} | |||||
// UnunixMilliTime 将毫秒数转为为时间 | |||||
func UnunixMilliTime(unix int64) time.Time { | |||||
return time.Unix(0, unix*1000000) | |||||
} |
@@ -127,10 +127,11 @@ func handleDouShenUserRegisterConsumeForOfficial(msgData []byte) error { | |||||
return errors.New("当前官方群暂未设置群主,请联系管理员!!!") | return errors.New("当前官方群暂未设置群主,请联系管理员!!!") | ||||
} | } | ||||
//加入群 | //加入群 | ||||
_, err = utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).AddGroupMembers(utils.GetCtx("", strconv.FormatInt(userGroup.UserId, 10), "", msg.MasterId), &pb.AddGroupMembersReq{ | |||||
GroupId: int64(officialGroup.GroupId), | |||||
UserIds: []int64{gimUser.Id}, | |||||
}) | |||||
_, err = utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).AddGroupMembers( | |||||
utils.GetCtx("", strconv.FormatInt(userGroup.UserId, 10), "", msg.MasterId), &pb.AddGroupMembersReq{ | |||||
GroupId: int64(officialGroup.GroupId), | |||||
UserIds: []int64{gimUser.Id}, | |||||
}) | |||||
} | } | ||||
return nil | return nil | ||||
} | } |
@@ -4,6 +4,8 @@ import ( | |||||
"applet/app/cfg" | "applet/app/cfg" | ||||
"applet/app/db" | "applet/app/db" | ||||
db2 "applet/app/db/gim" | db2 "applet/app/db/gim" | ||||
"applet/app/svc" | |||||
utils2 "applet/app/utils" | |||||
"applet/app/utils/logx" | "applet/app/utils/logx" | ||||
utils "applet/app/utils/rpc" | utils "applet/app/utils/rpc" | ||||
"applet/consume/md" | "applet/consume/md" | ||||
@@ -106,6 +108,70 @@ func handleDouShenUserRegisterConsumeForOperationCenter(msgData []byte) error { | |||||
GroupId: int64(OperationGroup.GroupId), | GroupId: int64(OperationGroup.GroupId), | ||||
UserIds: []int64{gimUser.Id}, | UserIds: []int64{gimUser.Id}, | ||||
}) | }) | ||||
//发送专属红包 | |||||
gimSendSpeciallyRedPackageUser, err := db2.DbSysCfg.SysCfgGetOne("send_specially_red_package_user", msg.MasterId) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if gimSendSpeciallyRedPackageUser == nil { | |||||
return errors.New("暂未设置专属红包发送用户") | |||||
} | |||||
sendSpeciallyRedPackageUser, err := db.SysCfgGetOne(db.DBs[msg.MasterId], "send_specially_red_package_user") | |||||
if err != nil { | |||||
return err | |||||
} | |||||
amount, err := getSendAmount(msg.MasterId) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
args := md.SendRedPackageReq{ | |||||
UserId: strconv.FormatInt(gimUser.Id, 10), | |||||
DeviceId: "", | |||||
Token: "", | |||||
Amount: amount, | |||||
RedPacketType: 4, | |||||
RedPacketNums: 1, | |||||
RedPacketContent: "恭喜发财", | |||||
RedPacketSmallContent: "大吉大利", | |||||
ReceiverType: 2, | |||||
ReceiverId: int64(OperationGroup.GroupId), | |||||
SendTime: utils2.UnixMilliTime(time.Now()), | |||||
ToUserIds: []int64{gimUser.Id}, | |||||
RedPackageCover: "", | |||||
} | |||||
err, _ = svc.CurlSendRedPackage(args, msg.MasterId, sendSpeciallyRedPackageUser.Val) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
} | } | ||||
return nil | return nil | ||||
} | } | ||||
func getSendAmount(masterId string) (string, error) { | |||||
speciallyRedPackageAmountRadio, err := db.SysCfgGetOne(db.DBs[masterId], "specially_red_package_amount_radio") | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
var speciallyRedPackageAmountRadioData []*md.SpeciallyRedPackageAmountRadio | |||||
err = json.Unmarshal([]byte(speciallyRedPackageAmountRadio.Val), &speciallyRedPackageAmountRadioData) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
var tempSpeciallyRedPackageAmountRadioData []*md.SpeciallyRedPackageAmountRadio | |||||
for _, v := range speciallyRedPackageAmountRadioData { | |||||
for i := 0; i < utils2.StrToInt(v.Value); i++ { | |||||
tempSpeciallyRedPackageAmountRadioData = append(tempSpeciallyRedPackageAmountRadioData, v) | |||||
} | |||||
} | |||||
if len(tempSpeciallyRedPackageAmountRadioData) < 100 { | |||||
return "", errors.New("红包金额比例设置有误!") | |||||
} | |||||
randInt := utils2.RandInt(99) | |||||
min := tempSpeciallyRedPackageAmountRadioData[randInt].From | |||||
max := tempSpeciallyRedPackageAmountRadioData[randInt].To | |||||
amount := utils2.AnyToString(utils2.RandFloats(utils2.AnyToFloat64(min), utils2.AnyToFloat64(max))) | |||||
return amount, nil | |||||
} |
@@ -0,0 +1,44 @@ | |||||
package md | |||||
type SendRedPackageReq struct { | |||||
UserId string `json:"user_id"` //im用户id | |||||
DeviceId string `json:"device_id"` //设备id | |||||
Token string `json:"token"` //im-token | |||||
Amount string `json:"amount"` //红包金额 | |||||
RedPacketType int `json:"red_packet_type"` //红包类型(0:未知 1:好友红包 2:群组普通红包 3:群组手气红包 4:群组专属红包 5:系统红包) | |||||
RedPacketNums int `json:"red_packet_nums"` //红包数量 | |||||
RedPacketContent string `json:"red_packet_content"` //红包文字内容 | |||||
RedPacketSmallContent string `json:"red_packet_small_content"` //红包文字内容 | |||||
ReceiverType int `json:"receiver_type"` //接收者类型,1:user;2:group | |||||
ReceiverId int64 `json:"receiver_id"` //用户id或者群组id | |||||
SendTime int64 `json:"send_time"` //消息发送时间戳,精确到毫秒 | |||||
ToUserIds []int64 `json:"to_user_ids"` //红包给到哪些用户(专属红包) | |||||
RedPackageCover string `json:"red_package_cover"` //红包封面 | |||||
} | |||||
type GrabRedPackageReq struct { | |||||
UserId string `json:"user_id"` //im用户id | |||||
SendRedPackageUserNikeName string `json:"send_red_package_user_nike_name"` //红包发送者-im用户昵称 | |||||
SendRedPacketAvatarUrl string `json:"send_red_packet_avatar_url"` //红包发送者-im用户头像 | |||||
DeviceId string `json:"device_id"` //设备id | |||||
Token string `json:"token"` //im-token | |||||
ReceiverType int `json:"receiver_type"` //接收者类型,1:user;2:group | |||||
ReceiverId int64 `json:"receiver_id"` //用户id或者群组id | |||||
SendTime int64 `json:"send_time"` //消息发送时间戳,精确到毫秒 | |||||
RedPackageId int `json:"red_package_id"` //红包id | |||||
RedPackageCover string `json:"red_package_cover"` //红包封面 | |||||
} | |||||
type RedPackageDetailResp struct { | |||||
ImUserId string `json:"im_user_id"` //im用户id | |||||
UserNickName string `json:"user_nick_name"` //im用户昵称 | |||||
UserAvatarUrl string `json:"user_avatar_url"` //im用户昵称 | |||||
Amount string `json:"amount"` //金额 | |||||
ReceiveAt string `json:"received_at"` //领取时间 | |||||
} | |||||
type SpeciallyRedPackageAmountRadio struct { | |||||
From string `json:"form"` | |||||
To string `json:"to"` | |||||
Value string `json:"value"` | |||||
} |