From f13953030b53d803b8ddb6699921c06c01d1754a Mon Sep 17 00:00:00 2001 From: richarjiang Date: Mon, 29 Sep 2025 17:22:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(challenges):=20=E6=96=B0=E5=A2=9E=E4=BB=8A?= =?UTF-8?q?=E6=97=A5=E4=B8=8A=E6=8A=A5=E5=80=BC=E4=B8=8E=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=80=BC=E5=AD=97=E6=AE=B5=E8=87=B3=E6=8E=92=E8=A1=8C=E6=A6=9C?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/challenges/challenges.service.ts | 24 ++++++++++++++++++++ src/challenges/dto/challenge-progress.dto.ts | 2 ++ 2 files changed, 26 insertions(+) diff --git a/src/challenges/challenges.service.ts b/src/challenges/challenges.service.ts index 66475c2..122e133 100644 --- a/src/challenges/challenges.service.ts +++ b/src/challenges/challenges.service.ts @@ -164,6 +164,28 @@ export class ChallengesService { rankingsRawCount: rankingsRaw.length, }); + const today = dayjs().format('YYYY-MM-DD'); + + const todayReportsMap = new Map(); + + if (rankingsRaw.length) { + const rankingUserIds = rankingsRaw.map((item) => item.userId); + + const reports = await this.progressReportModel.findAll({ + where: { + challengeId, + reportDate: today, + userId: { + [Op.in]: rankingUserIds, + }, + }, + }); + + for (const report of reports) { + todayReportsMap.set(report.userId, report.reportedValue ?? 0); + } + } + const completionTarget = challenge.minimumCheckInDays const progress = participation @@ -178,6 +200,8 @@ export class ChallengesService { avatar: item.user?.avatar ?? null, metric: `${item.progressValue}/${itemTarget}天`, badge: this.resolveRankingBadge(index), + todayReportedValue: todayReportsMap.get(item.userId) ?? 0, + todayTargetValue: challenge.targetValue, }; }); diff --git a/src/challenges/dto/challenge-progress.dto.ts b/src/challenges/dto/challenge-progress.dto.ts index 8a5eac1..70b64ea 100644 --- a/src/challenges/dto/challenge-progress.dto.ts +++ b/src/challenges/dto/challenge-progress.dto.ts @@ -11,4 +11,6 @@ export interface RankingItemDto { avatar: string | null; metric: string; badge?: string; + todayReportedValue: number; + todayTargetValue: number; }