95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
package activity
|
|
|
|
import (
|
|
"context"
|
|
|
|
"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,
|
|
}
|
|
if err := tx.Activities.WithContext(ctx).Omit(
|
|
tx.Activities.StartTime,
|
|
tx.Activities.EndTime,
|
|
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
|
|
}
|