// 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 }