|
@@ -400,6 +400,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
}
|
|
}
|
|
|
Long activityId = task.getActivityId();
|
|
Long activityId = task.getActivityId();
|
|
|
Long taskId = task.getId();
|
|
Long taskId = task.getId();
|
|
|
|
|
+ String activityName = task.getActivityName();
|
|
|
|
|
|
|
|
// 3. 防重复签到 (利用数据库唯一索引兜底,这里做快速失败)
|
|
// 3. 防重复签到 (利用数据库唯一索引兜底,这里做快速失败)
|
|
|
// 优化:直接查库比 count 快,且逻辑更清晰
|
|
// 优化:直接查库比 count 快,且逻辑更清晰
|
|
@@ -417,6 +418,24 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
// 注意:selectByOpenIdAndActivityIdForUpdate 必须使用 FOR UPDATE 语法
|
|
// 注意:selectByOpenIdAndActivityIdForUpdate 必须使用 FOR UPDATE 语法
|
|
|
PointUserSignStatus status = pointUserSignStatusService.selectByOpenIdAndActivityIdForUpdate(openId, activityId);
|
|
PointUserSignStatus status = pointUserSignStatusService.selectByOpenIdAndActivityIdForUpdate(openId, activityId);
|
|
|
|
|
|
|
|
|
|
+ // 检查今天是否已经签到
|
|
|
|
|
+ // 逻辑:如果是老用户(status不为空) 且 最后签到日期是今天
|
|
|
|
|
+ boolean isSignedToday = false;
|
|
|
|
|
+
|
|
|
|
|
+ if (ObjectUtil.isNotNull(status)) {
|
|
|
|
|
+ Date lastSignDate = status.getLastSignDate();
|
|
|
|
|
+ // 比较日期是否相同 (忽略时分秒)
|
|
|
|
|
+ if (DateUtil.isSameDay(lastSignDate, new Date())) {
|
|
|
|
|
+ isSignedToday = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果今天已签,直接抛出异常
|
|
|
|
|
+ if (isSignedToday) {
|
|
|
|
|
+ // 这里可以定义一个自定义异常,或者使用通用的业务异常
|
|
|
|
|
+ throw new ServiceException("今日已签到,请勿重复操作");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
int newContinuousDays = 1;
|
|
int newContinuousDays = 1;
|
|
|
DateTime today = DateUtil.date();
|
|
DateTime today = DateUtil.date();
|
|
|
DateTime yesterday = DateUtil.yesterday();
|
|
DateTime yesterday = DateUtil.yesterday();
|
|
@@ -432,7 +451,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
pointUserSignStatusService.save(status);
|
|
pointUserSignStatusService.save(status);
|
|
|
} else {
|
|
} else {
|
|
|
// --- 非首次签到:计算连续天数 ---
|
|
// --- 非首次签到:计算连续天数 ---
|
|
|
- DateTime lastSignDate = status.getLastSignDate();
|
|
|
|
|
|
|
+ Date lastSignDate = status.getLastSignDate();
|
|
|
|
|
|
|
|
// 判断是否断签:昨天不是最后签到日期,即为断签
|
|
// 判断是否断签:昨天不是最后签到日期,即为断签
|
|
|
boolean isBreak = !DateUtil.isSameDay(lastSignDate, yesterday);
|
|
boolean isBreak = !DateUtil.isSameDay(lastSignDate, yesterday);
|
|
@@ -483,7 +502,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
// 7. 增加用户积分账户余额
|
|
// 7. 增加用户积分账户余额
|
|
|
// 注意:这里假设 pointAccountService 内部会写入 point_user_log (积分总流水表)
|
|
// 注意:这里假设 pointAccountService 内部会写入 point_user_log (积分总流水表)
|
|
|
try {
|
|
try {
|
|
|
- pointAccountService.addPoints(openId, rewardPoints, null, activityId, taskId, PointActivityTypeEnum.SIGN_TASK.getCode());
|
|
|
|
|
|
|
+ pointAccountService.addPoints(openId, rewardPoints, activityName, null, activityId, taskId, PointActivityTypeEnum.SIGN_TASK.getCode());
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
log.error("签到发放积分失败", e);
|
|
log.error("签到发放积分失败", e);
|
|
|
throw new RuntimeException("签到成功,但积分发放失败,请联系客服");
|
|
throw new RuntimeException("签到成功,但积分发放失败,请联系客服");
|
|
@@ -779,7 +798,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
ZoneId.systemDefault()
|
|
ZoneId.systemDefault()
|
|
|
);
|
|
);
|
|
|
LocalDateTime endOfDay = localDateTime.with(
|
|
LocalDateTime endOfDay = localDateTime.with(
|
|
|
- java.time.LocalTime.of(23, 59, 59));
|
|
|
|
|
|
|
+ LocalTime.of(23, 59, 59));
|
|
|
return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
|
|
return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
|
|
|
} catch (DateTimeException e) {
|
|
} catch (DateTimeException e) {
|
|
|
throw new IllegalArgumentException("Invalid end time", e);
|
|
throw new IllegalArgumentException("Invalid end time", e);
|
|
@@ -945,12 +964,13 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
// 2. 根据活动绑定的 taskId 查询签到任务
|
|
// 2. 根据活动绑定的 taskId 查询签到任务
|
|
|
LambdaQueryWrapper<PointSignTask> queryWrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<PointSignTask> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
queryWrapper.eq(PointSignTask::getActivityId, activity.getId());
|
|
queryWrapper.eq(PointSignTask::getActivityId, activity.getId());
|
|
|
- queryWrapper.eq(PointSignTask::getIsDeleted, 1);
|
|
|
|
|
|
|
+ queryWrapper.eq(PointSignTask::getIsDeleted, 0);
|
|
|
List<PointSignTask> list = pointSignTaskService.list(queryWrapper);
|
|
List<PointSignTask> list = pointSignTaskService.list(queryWrapper);
|
|
|
- PointSignTask task = new PointSignTask();
|
|
|
|
|
|
|
+ PointSignTask task = null;
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(list)) {
|
|
if (CollectionUtil.isNotEmpty(list)) {
|
|
|
task = CollectionUtil.getLast(list);
|
|
task = CollectionUtil.getLast(list);
|
|
|
|
|
+ task.setActivityName(activity.getName());
|
|
|
}
|
|
}
|
|
|
return task;
|
|
return task;
|
|
|
}
|
|
}
|