2026-02-01 00:27:38 +08:00

96 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package activity
import (
"context"
"time"
"bindbox-game/internal/repository/mysql/dao"
"bindbox-game/internal/repository/mysql/model"
)
// CopyActivity 复制活动及其期次与奖励
// 参数: activityID 源活动ID
// 返回: 新活动ID与错误
func (s *service) CopyActivity(ctx context.Context, activityID int64) (int64, error) {
var newActivityID int64
err := s.writeDB.Transaction(func(tx *dao.Query) error {
src, err := s.readDB.Activities.WithContext(ctx).Where(s.readDB.Activities.ID.Eq(activityID)).First()
if err != nil {
return err
}
newAct := &model.Activities{
Name: src.Name,
Banner: src.Banner,
ActivityCategoryID: src.ActivityCategoryID,
Status: 1,
PriceDraw: src.PriceDraw,
IsBoss: src.IsBoss,
EndTime: time.Now().AddDate(1, 0, 0), // 默认1年后结束确保活动列表可见
}
if err := tx.Activities.WithContext(ctx).Omit(
tx.Activities.StartTime,
tx.Activities.ScheduledTime,
tx.Activities.LastSettledAt,
).Create(newAct); err != nil {
return err
}
newActivityID = newAct.ID
issues, err := s.readDB.ActivityIssues.WithContext(ctx).Where(s.readDB.ActivityIssues.ActivityID.Eq(activityID)).Order(s.readDB.ActivityIssues.Sort.Desc()).Find()
if err != nil {
return err
}
idMap := make(map[int64]int64, len(issues))
for _, srcIssue := range issues {
ni := &model.ActivityIssues{
ActivityID: newActivityID,
IssueNumber: srcIssue.IssueNumber,
Status: 3,
Sort: srcIssue.Sort,
}
if err := tx.ActivityIssues.WithContext(ctx).Create(ni); err != nil {
return err
}
idMap[srcIssue.ID] = ni.ID
}
if len(idMap) == 0 {
return nil
}
oldIDs := make([]int64, 0, len(idMap))
for k := range idMap {
oldIDs = append(oldIDs, k)
}
rewards, err := s.readDB.ActivityRewardSettings.WithContext(ctx).Where(s.readDB.ActivityRewardSettings.IssueID.In(oldIDs...)).Order(s.readDB.ActivityRewardSettings.Sort.Desc()).Find()
if err != nil {
return err
}
for _, r := range rewards {
nr := &model.ActivityRewardSettings{
IssueID: idMap[r.IssueID],
ProductID: r.ProductID,
Weight: r.Weight,
Quantity: r.Quantity,
OriginalQty: r.OriginalQty,
Level: r.Level,
Sort: r.Sort,
IsBoss: r.IsBoss,
}
if err := tx.ActivityRewardSettings.WithContext(ctx).Create(nr); err != nil {
return err
}
}
return nil
})
if err != nil {
return 0, err
}
return newActivityID, nil
}