|
@@ -193,24 +193,13 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
@Override
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void completeOrderTaskByPriority(String openId) {
|
|
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);
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ completeTaskByPriority(openId, TaskNameEnum.COMPLETE_ORDER, PointActivityTaskTypeEnum.COMPLETE_ORDER);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void completeRechargeTaskByPriority(String openId) {
|
|
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);
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ completeTaskByPriority(openId, TaskNameEnum.RECHARGE_TASK, PointActivityTaskTypeEnum.RECHARGE_TASK);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -266,7 +255,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
// 获取正在进行中的新手活动
|
|
// 获取正在进行中的新手活动
|
|
|
LambdaQueryWrapper<PointActivity> queryWrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<PointActivity> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
queryWrapper.eq(PointActivity::getActivityType, PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode())
|
|
queryWrapper.eq(PointActivity::getActivityType, PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode())
|
|
|
- .eq(PointActivity::getStatus, 0)
|
|
|
|
|
|
|
+ .eq(PointActivity::getStatus, 1)
|
|
|
.orderByDesc(PointActivity::getStartTime)
|
|
.orderByDesc(PointActivity::getStartTime)
|
|
|
.last("limit 1");
|
|
.last("limit 1");
|
|
|
PointActivity activity = this.pointActivityService.getOne(queryWrapper);
|
|
PointActivity activity = this.pointActivityService.getOne(queryWrapper);
|
|
@@ -308,7 +297,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
* 通用优先级任务完成方法
|
|
* 通用优先级任务完成方法
|
|
|
* 按活动类型优先级(新手 > 每日 > 每月)遍历匹配任务,完成首个合格任务后立即返回
|
|
* 按活动类型优先级(新手 > 每日 > 每月)遍历匹配任务,完成首个合格任务后立即返回
|
|
|
*/
|
|
*/
|
|
|
- private void completeTaskByPriority(String openId, TaskNameEnum activityNameEnum, PointActivityTaskTypeEnum taskTypeEnum, Function<Date, Integer> countFunction) {
|
|
|
|
|
|
|
+ private void completeTaskByPriority(String openId, TaskNameEnum activityNameEnum, PointActivityTaskTypeEnum taskTypeEnum) {
|
|
|
|
|
|
|
|
// 1. 检查用户是否已经完成过任何新手活动
|
|
// 1. 检查用户是否已经完成过任何新手活动
|
|
|
boolean hasCompletedNewUser = checkIfUserCompletedAnyNewUserTask(openId);
|
|
boolean hasCompletedNewUser = checkIfUserCompletedAnyNewUserTask(openId);
|
|
@@ -351,7 +340,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
// 4. 遍历当前类型的任务,尝试完成
|
|
// 4. 遍历当前类型的任务,尝试完成
|
|
|
for (PointActivityTask task : filteredTasks) {
|
|
for (PointActivityTask task : filteredTasks) {
|
|
|
PointActivity activity = activityMap.get(task.getActivityId());
|
|
PointActivity activity = activityMap.get(task.getActivityId());
|
|
|
- if (tryCompleteSingleTask(openId, task, activity, typeCode, taskTypeEnum, activityNameEnum, countFunction)) {
|
|
|
|
|
|
|
+ if (tryCompleteSingleTask(openId, task, activity, typeCode, taskTypeEnum, activityNameEnum)) {
|
|
|
return; // 完成首个合格任务后立即返回
|
|
return; // 完成首个合格任务后立即返回
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -375,7 +364,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
*/
|
|
*/
|
|
|
private boolean tryCompleteSingleTask(String openId, PointActivityTask task, PointActivity activity,
|
|
private boolean tryCompleteSingleTask(String openId, PointActivityTask task, PointActivity activity,
|
|
|
Integer typeCode, PointActivityTaskTypeEnum taskTypeEnum,
|
|
Integer typeCode, PointActivityTaskTypeEnum taskTypeEnum,
|
|
|
- TaskNameEnum activityNameEnum, Function<Date, Integer> countFunction) {
|
|
|
|
|
|
|
+ TaskNameEnum activityNameEnum) {
|
|
|
try {
|
|
try {
|
|
|
// 1. 解析频率限制
|
|
// 1. 解析频率限制
|
|
|
TaskLimitTimesEnum limitEnum = parseFrequencyLimit(task);
|
|
TaskLimitTimesEnum limitEnum = parseFrequencyLimit(task);
|
|
@@ -385,7 +374,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
|
|
|
|
|
// 2. 校验业务数据是否达标
|
|
// 2. 校验业务数据是否达标
|
|
|
Date queryTime = getQueryStartTime(activity.getIsPermanent(), typeCode);
|
|
Date queryTime = getQueryStartTime(activity.getIsPermanent(), typeCode);
|
|
|
- if (!isTaskTargetMet(task, taskTypeEnum, limitEnum.getTime(), countFunction, queryTime)) {
|
|
|
|
|
|
|
+ if (!isTaskTargetMet(task, taskTypeEnum, limitEnum.getTime(), queryTime, activity, openId)) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -433,8 +422,10 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
* - 完成订单:实际完成次数 >= 频率限制次数
|
|
* - 完成订单:实际完成次数 >= 频率限制次数
|
|
|
*/
|
|
*/
|
|
|
private boolean isTaskTargetMet(PointActivityTask task, PointActivityTaskTypeEnum taskTypeEnum,
|
|
private boolean isTaskTargetMet(PointActivityTask task, PointActivityTaskTypeEnum taskTypeEnum,
|
|
|
- int targetCount, Function<Date, Integer> countFunction, Date queryTime) {
|
|
|
|
|
- int actualCount = countFunction.apply(queryTime);
|
|
|
|
|
|
|
+ int targetCount, Date queryTime,
|
|
|
|
|
+ PointActivity activity, String openId) {
|
|
|
|
|
+ // 调用getActualCountByActivityType方法获取实际完成次数
|
|
|
|
|
+ int actualCount = getActualCountByActivityType(task, activity, queryTime, openId);
|
|
|
|
|
|
|
|
if (ObjUtil.equals(taskTypeEnum.getCode(), PointActivityTaskTypeEnum.RECHARGE_TASK.getCode())) {
|
|
if (ObjUtil.equals(taskTypeEnum.getCode(), PointActivityTaskTypeEnum.RECHARGE_TASK.getCode())) {
|
|
|
// 充值任务:triggerValue 为目标金额
|
|
// 充值任务:triggerValue 为目标金额
|
|
@@ -490,4 +481,67 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 根据活动类型获取任务完成次数
|
|
|
|
|
+ */
|
|
|
|
|
+ private int getActualCountByActivityType(PointActivityTask task, PointActivity activity,
|
|
|
|
|
+ Date queryTime, String openId) {
|
|
|
|
|
+ switch (activity.getActivityType()) {
|
|
|
|
|
+ case 1: // 新手活动
|
|
|
|
|
+ return getNewHandTaskCompletionCount(task, openId);
|
|
|
|
|
+ case 2: // 每日活动
|
|
|
|
|
+ return getDailyTaskCompletionCount(task, openId, queryTime);
|
|
|
|
|
+ default: // 每月活动
|
|
|
|
|
+ return getMonthlyTaskCompletionCount(task, openId, queryTime);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取新手活动任务完成次数(无时间限制,只要参与就累计)
|
|
|
|
|
+ */
|
|
|
|
|
+ private int getNewHandTaskCompletionCount(PointActivityTask task, String openId) {
|
|
|
|
|
+ PointUserActivityTaskCompletion completion = pointUserActivityTaskCompletionMapper.selectOne(
|
|
|
|
|
+ new LambdaQueryWrapper<PointUserActivityTaskCompletion>()
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getOpenId, openId)
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getTaskId, task.getId())
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getActivityId, task.getActivityId())
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ return completion != null ? completion.getCompletedCount() : 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取每日活动任务完成次数
|
|
|
|
|
+ */
|
|
|
|
|
+ private int getDailyTaskCompletionCount(PointActivityTask task, String openId, Date todayStart) {
|
|
|
|
|
+ Date todayEnd = DateUtil.endOfDay(todayStart != null ? todayStart : new Date());
|
|
|
|
|
+
|
|
|
|
|
+ PointUserActivityTaskCompletion completion = pointUserActivityTaskCompletionMapper.selectOne(
|
|
|
|
|
+ new LambdaQueryWrapper<PointUserActivityTaskCompletion>()
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getOpenId, openId)
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getTaskId, task.getId())
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getActivityId, task.getActivityId())
|
|
|
|
|
+ .between(PointUserActivityTaskCompletion::getLastCompletedTime, todayStart, todayEnd)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ return completion != null ? completion.getCompletedCount() : 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取每月活动任务完成次数
|
|
|
|
|
+ */
|
|
|
|
|
+ private int getMonthlyTaskCompletionCount(PointActivityTask task, String openId, Date todayStart) {
|
|
|
|
|
+ Date monthEnd = DateUtil.endOfMonth(todayStart != null ? todayStart : new Date());
|
|
|
|
|
+
|
|
|
|
|
+ PointUserActivityTaskCompletion completion = pointUserActivityTaskCompletionMapper.selectOne(
|
|
|
|
|
+ new LambdaQueryWrapper<PointUserActivityTaskCompletion>()
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getOpenId, openId)
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getTaskId, task.getId())
|
|
|
|
|
+ .eq(PointUserActivityTaskCompletion::getActivityId, task.getActivityId())
|
|
|
|
|
+ .between(PointUserActivityTaskCompletion::getLastCompletedTime, todayStart, monthEnd)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ return completion != null ? completion.getCompletedCount() : 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|