From 18f3e31251bf4bc7d1e6ba1776cd8c203d69e772 Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Wed, 30 Jul 2025 17:09:44 +0800 Subject: [PATCH] feat: track milk tea redemption count --- .../src/components/MilkTeaActivityComponent.vue | 13 +++++++++---- .../openisle/controller/ActivityController.java | 16 ++++++++++------ .../com/openisle/service/ActivityService.java | 15 +++++++++++++-- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/open-isle-cli/src/components/MilkTeaActivityComponent.vue b/open-isle-cli/src/components/MilkTeaActivityComponent.vue index f8649594a..a27a9b431 100644 --- a/open-isle-cli/src/components/MilkTeaActivityComponent.vue +++ b/open-isle-cli/src/components/MilkTeaActivityComponent.vue @@ -14,8 +14,8 @@
🔥 已兑换奶茶人数
- -
当前 {{ info.level1Count }} / 50
+ +
当前 {{ info.redeemCount }} / 50
@@ -57,7 +57,7 @@ export default { components: { ProgressBar, LevelProgress, BaseInput, BasePopup }, data () { return { - info: { level1Count: 0, ended: false }, + info: { redeemCount: 0, ended: false }, user: null, dialogVisible: false, contact: '', @@ -97,7 +97,12 @@ export default { body: JSON.stringify({ contact: this.contact }) }) if (res.ok) { - toast.success('兑换成功!') + const data = await res.json() + if (data.message === 'updated') { + toast.success('您已提交过兑换,本次更新兑换信息') + } else { + toast.success('兑换成功!') + } this.dialogVisible = false await this.loadInfo() } else { diff --git a/src/main/java/com/openisle/controller/ActivityController.java b/src/main/java/com/openisle/controller/ActivityController.java index 587b59847..998cd73eb 100644 --- a/src/main/java/com/openisle/controller/ActivityController.java +++ b/src/main/java/com/openisle/controller/ActivityController.java @@ -27,26 +27,30 @@ public class ActivityController { @GetMapping("/milk-tea") public MilkTeaInfo milkTea() { Activity a = activityService.getByType(ActivityType.MILK_TEA); - long count = activityService.countLevel1Users(); - if (!a.isEnded() && count > 50) { + long count = activityService.countParticipants(a); + if (!a.isEnded() && count >= 50) { activityService.end(a); } MilkTeaInfo info = new MilkTeaInfo(); - info.setLevel1Count(count); + info.setRedeemCount(count); info.setEnded(a.isEnded()); return info; } @PostMapping("/milk-tea/redeem") - public void redeemMilkTea(@RequestBody RedeemRequest req, Authentication auth) { + public java.util.Map redeemMilkTea(@RequestBody RedeemRequest req, Authentication auth) { User user = userService.findByIdentifier(auth.getName()).orElseThrow(); Activity a = activityService.getByType(ActivityType.MILK_TEA); - activityService.redeem(a, user, req.getContact()); + boolean first = activityService.redeem(a, user, req.getContact()); + if (first) { + return java.util.Map.of("message", "redeemed"); + } + return java.util.Map.of("message", "updated"); } @Data private static class MilkTeaInfo { - private long level1Count; + private long redeemCount; private boolean ended; } diff --git a/src/main/java/com/openisle/service/ActivityService.java b/src/main/java/com/openisle/service/ActivityService.java index cb173e4b5..2050dc5d7 100644 --- a/src/main/java/com/openisle/service/ActivityService.java +++ b/src/main/java/com/openisle/service/ActivityService.java @@ -37,9 +37,20 @@ public class ActivityService { activityRepository.save(activity); } - public void redeem(Activity activity, User user, String contact) { + public long countParticipants(Activity activity) { + return activity.getParticipants().size(); + } + + /** + * Redeem an activity for the given user. + * + * @return true if the user redeemed for the first time, false if the + * information was simply updated + */ + public boolean redeem(Activity activity, User user, String contact) { notificationService.createActivityRedeemNotifications(user, contact); - activity.getParticipants().add(user); + boolean added = activity.getParticipants().add(user); activityRepository.save(activity); + return added; } }