fix(activity): 允许后台编辑未开始的福利活动

中文说明:新增后台专用福利活动详情查询,后台编辑未开始活动时不再复用前台的未开始拦截逻辑,避免后台打开编辑弹窗提示“活动未开始”。
This commit is contained in:
Zuncle 2026-05-03 23:03:52 +08:00
parent b3fcec569a
commit 6127dc1a35
3 changed files with 18 additions and 5 deletions

View File

@ -111,7 +111,7 @@ func (h *handler) GetWelfareActivity() core.HandlerFunc {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "活动ID无效"))
return
}
res, err := h.welfare.GetActivity(ctx.RequestContext(), id, 0)
res, err := h.welfare.GetActivityAdmin(ctx.RequestContext(), id)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.GetActivityError, err.Error()))
return

View File

@ -164,15 +164,27 @@ func (s *service) GetActivity(ctx context.Context, id int64, userID int64) (*Act
if userID <= 0 && item.Status == StatusActive && time.Now().Before(item.StartTime) {
return nil, errors.New("活动未开始")
}
return s.buildActivityDetail(ctx, item, userID)
}
func (s *service) GetActivityAdmin(ctx context.Context, id int64) (*ActivityDetail, error) {
var item Activity
if err := s.repo.GetDbR().WithContext(ctx).Where("id = ? AND deleted_at IS NULL", id).First(&item).Error; err != nil {
return nil, err
}
return s.buildActivityDetail(ctx, item, 0)
}
func (s *service) buildActivityDetail(ctx context.Context, item Activity, userID int64) (*ActivityDetail, error) {
detail := &ActivityDetail{Activity: item}
s.repo.GetDbR().WithContext(ctx).Where("activity_id = ?", id).Order("sort ASC, id ASC").Find(&detail.Prizes)
s.repo.GetDbR().WithContext(ctx).Where("activity_id = ?", item.ID).Order("sort ASC, id ASC").Find(&detail.Prizes)
s.fillPrizeMeta(ctx, detail.Prizes)
participants, _ := s.ListParticipants(ctx, id, 1, 20)
participants, _ := s.ListParticipants(ctx, item.ID, 1, 20)
if participants != nil {
detail.ParticipantCount = participants.Total
detail.Participants = participants.List
}
winners, _ := s.ListWinners(ctx, id, 1, 20)
winners, _ := s.ListWinners(ctx, item.ID, 1, 20)
if winners != nil {
detail.Winners = winners.List
}
@ -181,7 +193,7 @@ func (s *service) GetActivity(ctx context.Context, id int64, userID int64) (*Act
detail.CurrentPaid, _ = s.sumPaidAmount(ctx, userID, start, end)
detail.CanJoin = isJoinWindowOpen(item, time.Now()) && detail.CurrentPaid >= item.ThresholdAmount
var count int64
s.repo.GetDbR().WithContext(ctx).Model(&Participant{}).Where("activity_id = ? AND user_id = ? AND period_key = ?", id, userID, period).Count(&count)
s.repo.GetDbR().WithContext(ctx).Model(&Participant{}).Where("activity_id = ? AND user_id = ? AND period_key = ?", item.ID, userID, period).Count(&count)
detail.Joined = count > 0
}
return detail, nil

View File

@ -24,6 +24,7 @@ type Service interface {
CopyActivity(ctx context.Context, id int64, req SaveActivityRequest) (int64, error)
ListActivities(ctx context.Context, req ListActivitiesRequest) (*ListActivitiesResponse, error)
GetActivity(ctx context.Context, id int64, userID int64) (*ActivityDetail, error)
GetActivityAdmin(ctx context.Context, id int64) (*ActivityDetail, error)
DeleteActivity(ctx context.Context, id int64) error
SavePrizes(ctx context.Context, activityID int64, prizes []PrizeInput) error
ListParticipants(ctx context.Context, activityID int64, page int, pageSize int) (*ParticipantResponse, error)