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;
}
}