|
|
@@ -157,9 +157,12 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
int targetCount = Integer.parseInt(task.getTriggerValue());
|
|
|
|
|
|
// 4. 任务校验逻辑
|
|
|
- if (ObjectUtil.notEqual(PointActivityTypeEnum.DAILY_ACTIVITY.getCode(), activityType) ||
|
|
|
- ObjectUtil.notEqual(PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode(), activityType) ||
|
|
|
- ObjectUtil.notEqual(PointActivityTypeEnum.MONTHLY_ACTIVITY.getCode(), activityType)) {
|
|
|
+ List<Integer> validTypes = Arrays.asList(
|
|
|
+ PointActivityTypeEnum.DAILY_ACTIVITY.getCode(),
|
|
|
+ PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode(),
|
|
|
+ PointActivityTypeEnum.MONTHLY_ACTIVITY.getCode()
|
|
|
+ );
|
|
|
+ if (!validTypes.contains(activityType)) {
|
|
|
throw new ServiceException("不支持的活动类型");
|
|
|
}
|
|
|
|
|
|
@@ -187,6 +190,29 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void completeOrderTaskByPriority(String openId) {
|
|
|
+ completeTaskByPriority(openId, TaskNameEnum.COMPLETE_ORDER, PointActivityTaskTypeEnum.COMPLETE_ORDER, new Function<Date, Integer>() {
|
|
|
+ @Override
|
|
|
+ public Integer apply(Date queryTime) {
|
|
|
+ return orderService.countCompletedOrders(openId, queryTime);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void completeRechargeTaskByPriority(String openId) {
|
|
|
+ completeTaskByPriority(openId, TaskNameEnum.RECHARGE_TASK, PointActivityTaskTypeEnum.RECHARGE_TASK, new Function<Date, Integer>() {
|
|
|
+ @Override
|
|
|
+ public Integer apply(Date queryTime) {
|
|
|
+ int latestAmount = rechargeService.getLatestRechargeAmount(openId, queryTime);
|
|
|
+ return ObjectUtil.defaultIfNull(latestAmount, 0);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据任务类型获取任务名称 JDK8 兼容
|
|
|
*/
|
|
|
@@ -272,7 +298,11 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
* 按活动类型优先级(新手 > 每日 > 每月)遍历匹配任务,完成首个合格任务后立即返回
|
|
|
*/
|
|
|
private void completeTaskByPriority(String openId, TaskNameEnum activityNameEnum, PointActivityTaskTypeEnum taskTypeEnum, Function<Date, Integer> countFunction) {
|
|
|
- // 1. 批量查询所有有效任务
|
|
|
+
|
|
|
+ // 1. 检查用户是否已经完成过任何新手活动
|
|
|
+ boolean hasCompletedNewUser = checkIfUserCompletedAnyNewUserTask(openId);
|
|
|
+
|
|
|
+ // 2. 批量查询所有有效任务
|
|
|
List<PointActivityTask> allTasks = pointActivityTaskService.list(Wrappers.lambdaQuery(PointActivityTask.class)
|
|
|
.eq(PointActivityTask::getTaskName, activityNameEnum.getInfo())
|
|
|
.eq(PointActivityTask::getStatus, 0)
|
|
|
@@ -281,13 +311,27 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 2. 批量查询关联活动,避免N+1查询
|
|
|
+ // 3. 批量查询关联活动,避免N+1查询
|
|
|
Set<Long> activityIds = allTasks.stream().map(PointActivityTask::getActivityId).collect(Collectors.toSet());
|
|
|
Map<Long, PointActivity> activityMap = pointActivityService.listByIds(activityIds).stream()
|
|
|
.collect(Collectors.toMap(PointActivity::getId, a -> a));
|
|
|
|
|
|
- // 3. 按优先级遍历活动类型
|
|
|
- for (Integer typeCode : ACTIVITY_TYPE_PRIORITY) {
|
|
|
+ // 4. 根据新手任务状态决定遍历的优先级
|
|
|
+ List<Integer> targetPriorities;
|
|
|
+ if (hasCompletedNewUser) {
|
|
|
+ // 如果已经完成过新手活动,则只处理每日和每月
|
|
|
+ targetPriorities = Arrays.asList(
|
|
|
+ PointActivityTypeEnum.DAILY_ACTIVITY.getCode(),
|
|
|
+ PointActivityTypeEnum.MONTHLY_ACTIVITY.getCode()
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ // 否则,按照默认优先级(新手>每日>每月)处理
|
|
|
+ targetPriorities = ACTIVITY_TYPE_PRIORITY;
|
|
|
+ }
|
|
|
+ // ----------------------------------------------------
|
|
|
+
|
|
|
+ // 5. 按优先级遍历活动类型
|
|
|
+ for (Integer typeCode : targetPriorities) {
|
|
|
List<PointActivityTask> filteredTasks = filterValidTasks(allTasks, activityMap, typeCode);
|
|
|
if (CollectionUtil.isEmpty(filteredTasks)) {
|
|
|
continue;
|
|
|
@@ -405,26 +449,34 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void completeOrderTaskByPriority(String openId) {
|
|
|
- completeTaskByPriority(openId, TaskNameEnum.COMPLETE_ORDER, PointActivityTaskTypeEnum.COMPLETE_ORDER, new Function<Date, Integer>() {
|
|
|
- @Override
|
|
|
- public Integer apply(Date queryTime) {
|
|
|
- return orderService.countCompletedOrders(openId, queryTime);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 检查用户是否已经完成过任何新手活动任务
|
|
|
+ */
|
|
|
+ private boolean checkIfUserCompletedAnyNewUserTask(String openId) {
|
|
|
+ // 1. 查询用户所有的任务完成记录
|
|
|
+ List<PointUserActivityTaskCompletion> records = this.list(
|
|
|
+ Wrappers.lambdaQuery(PointUserActivityTaskCompletion.class)
|
|
|
+ .eq(PointUserActivityTaskCompletion::getOpenId, openId)
|
|
|
+ );
|
|
|
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void completeRechargeTaskByPriority(String openId) {
|
|
|
- completeTaskByPriority(openId, TaskNameEnum.RECHARGE_TASK, PointActivityTaskTypeEnum.RECHARGE_TASK, new Function<Date, Integer>() {
|
|
|
- @Override
|
|
|
- public Integer apply(Date queryTime) {
|
|
|
- int latestAmount = rechargeService.getLatestRechargeAmount(openId, queryTime);
|
|
|
- return ObjectUtil.defaultIfNull(latestAmount, 0);
|
|
|
- }
|
|
|
- });
|
|
|
+ if (CollectionUtil.isEmpty(records)) {
|
|
|
+ return false; // 没有记录,肯定没完成过
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 获取这些记录关联的活动ID
|
|
|
+ Set<Long> activityIdSet = records.stream()
|
|
|
+ .map(PointUserActivityTaskCompletion::getActivityId)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ // 3. 查询这些活动的详细信息,看是否有“新手活动”类型
|
|
|
+ if (CollectionUtil.isNotEmpty(activityIdSet)) {
|
|
|
+ List<PointActivity> activities = pointActivityService.listByIds(activityIdSet);
|
|
|
+ return activities.stream().anyMatch(activity ->
|
|
|
+ PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode().equals(activity.getActivityType())
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
}
|
|
|
+
|
|
|
}
|