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

113 lines
2.8 KiB
Go

// Package utils 依赖 joybuywork/internal 里面的东西写到这个文件
package utils
import (
"joybuywork/internal/consts"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/utils/verify"
"fmt"
"math/rand"
"strings"
"time"
"github.com/golang-module/carbon/v2"
)
func GetRandEnStr(l int) string {
b := make([]byte, l)
for i := range b {
c := rand.Intn(len(consts.RandEnStr))
b[i] = consts.RandEnStr[c]
}
return string(b)
}
// CampaignArchiveEnd 活动归档结束
func CampaignArchiveEnd(endTime int64) time.Time {
return carbon.CreateFromTimestamp(endTime).EndOfDay().ToStdTime()
}
// BehaviorFormatMark 行为带特殊id的标识
func BehaviorFormatMark(bt int32, markId any) string {
return fmt.Sprintf("%s%s%v", mtype.BehaviorTypeToMark[bt], consts.Colon, markId)
}
// BehaviorMarkToType 带特殊id的标识转换成类型
func BehaviorMarkToType(mark string) int32 {
mk := strings.Split(mark, consts.Colon)
return mtype.BehaviorMarkToType[mk[0]]
}
// BehaviorMarkId 获取带特殊id的标识的id
func BehaviorMarkId(mark string) string {
_, id, _ := strings.Cut(mark, consts.Colon)
return id
}
// FissionCampaignTaskMarkCondOneVal 完成任意事件的标识值
func FissionCampaignTaskMarkCondOneVal(condId int64) string {
return fmt.Sprintf("%s%s%d", mtype.FissionCampaignTaskMarkCondOne, consts.Colon, condId)
}
// FissionCampaignTaskMarkCondOneCondId 完成任意事件的条件ID
func FissionCampaignTaskMarkCondOneCondId(taskMark string) int64 {
_, id, _ := strings.Cut(taskMark, consts.Colon)
return StrToInt64(id)
}
// FissionCampaignTaskMarkRewardOneVal 完成奖品任务的标识值
func FissionCampaignTaskMarkRewardOneVal(rewardId int64) string {
return fmt.Sprintf("%s%s%d", mtype.FissionCampaignTaskMarkRewardOne, consts.Colon, rewardId)
}
// FissionCampaignTaskMarkRewardOneRewardId 完成奖品任务的奖品ID
func FissionCampaignTaskMarkRewardOneRewardId(taskMark string) int64 {
_, id, _ := strings.Cut(taskMark, consts.Colon)
return StrToInt64(id)
}
type CondTotalFinishRes struct {
Num int32 // 完成的次数
Remain string // 剩余累计计算数值
}
// CondTotalFinishNum 条件累计值完成次数
func CondTotalFinishNum(total, condVal string, bk ...func(doneNum int32) bool) (res *CondTotalFinishRes) {
res = &CondTotalFinishRes{}
t, cv := StrToFloat64(total), StrToFloat64(condVal)
defer func() {
res.Remain = t.String()
}()
if t.LessThan(cv) {
return
}
idx := 0
for {
idx++
res.Num++
t = t.Sub(cv)
if len(bk) > 0 && bk[0](res.Num) {
return
}
if t.LessThan(cv) || idx >= 50 {
return
}
}
}
// NewGlobalTrigger 全局驱动
func NewGlobalTrigger(fissionId int64, t int32) int32 {
if t == 0 || verify.InArray(fissionId, consts.IdReferral) {
return mtype.FissionCampaignCondTriggerTypeGlobal
}
return t
}