103 lines
3.1 KiB
Go
103 lines
3.1 KiB
Go
package admin_agent
|
||
|
||
import (
|
||
"context"
|
||
"database/sql"
|
||
"time"
|
||
"ycc-server/app/main/model"
|
||
"ycc-server/common/tool"
|
||
"ycc-server/common/xerr"
|
||
|
||
"github.com/pkg/errors"
|
||
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||
|
||
"ycc-server/app/main/api/internal/svc"
|
||
"ycc-server/app/main/api/internal/types"
|
||
|
||
"github.com/zeromicro/go-zero/core/logx"
|
||
"github.com/google/uuid"
|
||
)
|
||
|
||
type AdminGenerateDiamondInviteCodeLogic struct {
|
||
logx.Logger
|
||
ctx context.Context
|
||
svcCtx *svc.ServiceContext
|
||
}
|
||
|
||
func NewAdminGenerateDiamondInviteCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGenerateDiamondInviteCodeLogic {
|
||
return &AdminGenerateDiamondInviteCodeLogic{
|
||
Logger: logx.WithContext(ctx),
|
||
ctx: ctx,
|
||
svcCtx: svcCtx,
|
||
}
|
||
}
|
||
|
||
func (l *AdminGenerateDiamondInviteCodeLogic) AdminGenerateDiamondInviteCode(req *types.AdminGenerateDiamondInviteCodeReq) (resp *types.AdminGenerateDiamondInviteCodeResp, err error) {
|
||
// 1. 验证生成数量
|
||
if req.Count <= 0 || req.Count > 100 {
|
||
return nil, errors.Wrapf(xerr.NewErrMsg("生成数量必须在1-100之间"), "")
|
||
}
|
||
|
||
// 2. 生成钻石邀请码(平台发放,agent_id为NULL,target_level为3)
|
||
codes := make([]string, 0, req.Count)
|
||
var expireTime sql.NullTime
|
||
if req.ExpireDays > 0 {
|
||
expireTime = sql.NullTime{
|
||
Time: time.Now().AddDate(0, 0, int(req.ExpireDays)),
|
||
Valid: true,
|
||
}
|
||
}
|
||
|
||
err = l.svcCtx.AgentInviteCodeModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error {
|
||
for i := int64(0); i < req.Count; i++ {
|
||
// 生成8位随机邀请码(大小写字母+数字)
|
||
var code string
|
||
maxRetries := 10 // 最大重试次数
|
||
for retry := 0; retry < maxRetries; retry++ {
|
||
code = tool.Krand(8, tool.KC_RAND_KIND_ALL)
|
||
// 检查邀请码是否已存在
|
||
_, err := l.svcCtx.AgentInviteCodeModel.FindOneByCode(transCtx, code)
|
||
if err != nil {
|
||
if errors.Is(err, model.ErrNotFound) {
|
||
// 邀请码不存在,可以使用
|
||
break
|
||
}
|
||
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "检查邀请码失败, %v", err)
|
||
}
|
||
// 邀请码已存在,继续生成
|
||
if retry == maxRetries-1 {
|
||
return errors.Wrapf(xerr.NewErrMsg("生成邀请码失败,请重试"), "")
|
||
}
|
||
}
|
||
|
||
// 创建邀请码记录(平台发放的钻石邀请码)
|
||
inviteCode := &model.AgentInviteCode{
|
||
Id: uuid.NewString(),
|
||
Code: code,
|
||
AgentId: sql.NullString{Valid: false}, // NULL表示平台发放
|
||
TargetLevel: 3, // 钻石代理
|
||
Status: 0, // 未使用
|
||
ExpireTime: expireTime,
|
||
Remark: sql.NullString{String: req.Remark, Valid: req.Remark != ""},
|
||
}
|
||
|
||
_, err := l.svcCtx.AgentInviteCodeModel.Insert(transCtx, session, inviteCode)
|
||
if err != nil {
|
||
return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建邀请码失败, %v", err)
|
||
}
|
||
|
||
codes = append(codes, code)
|
||
}
|
||
|
||
return nil
|
||
})
|
||
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &types.AdminGenerateDiamondInviteCodeResp{
|
||
Codes: codes,
|
||
}, nil
|
||
}
|