2 次代码提交 77db0613c5 ... b4a0799378

作者 SHA1 备注 提交日期
  wangzhijun b4a0799378 代码调整 4 天之前
  wangzhijun f30d4ff7f7 增加异步完成订单任务方法syncCompleteOrderTask 4 天之前

+ 26 - 8
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -907,12 +907,8 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         // 添加订单完成消息通知(用户侧)
         orderNotificationService.sendCompletedNotification(orderNew);
 
-        // 完成积分任务(按照新手活动、每日活动、每月活动的优先级顺序)
-        try {
-            this.pointUserActivityTaskCompletionService.completeOrderTaskByPriority(orderNew.getcOpenId());
-        } catch (Exception e) {
-            log.error("完成积分任务失败 - 订单号:{}, 错误信息:{}", orderNew.getOrderNo(), e.getMessage(), e);
-        }
+        // 异步完成积分任务
+        syncCompleteOrderTask(orderNew);
 
         return true;
     }
@@ -1441,8 +1437,11 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         // 统计用户在指定时间之前完成的订单数量
         // 完成状态包括:4-待评价(已完成)和5-已完成(已评价)
         LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(TOrder::getcOpenId, openId).in(TOrder::getnStatus, OrderStatusEnum.WAIT_EVALUATE.getCode(), OrderStatusEnum.COMPLETE.getCode()).lt(TOrder::getEndTime, queryTime);
-
+        queryWrapper.eq(TOrder::getcOpenId, openId)
+                .in(TOrder::getnStatus, OrderStatusEnum.WAIT_EVALUATE.getCode(), OrderStatusEnum.COMPLETE.getCode());
+        if (ObjectUtil.isNotNull(queryTime)) {
+            queryWrapper.lt(TOrder::getEndTime, queryTime);
+        }
         return Math.toIntExact(this.count(queryWrapper));
     }
 
@@ -1646,4 +1645,23 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         return Math.max(0, Math.min(requested, remainingQuota));
     }
 
+    private void syncCompleteOrderTask(TOrder orderNew) {
+
+        if (TransactionSynchronizationManager.isSynchronizationActive()) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+
+                @Override
+                public void afterCommit() {
+                    // 完成积分任务(按照新手活动、每日活动、每月活动的优先级顺序)
+                    try {
+                        pointUserActivityTaskCompletionService.completeOrderTaskByPriority(orderNew.getcOpenId());
+                    } catch (Exception e) {
+                        log.error("完成积分任务失败 - 订单号:{}, 错误信息:{}", orderNew.getOrderNo(), e.getMessage(), e);
+                    }
+                }
+            });
+        }
+
+    }
+
 }

+ 14 - 3
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java

@@ -262,6 +262,17 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
             StartTime = DateUtil.beginOfDay(new Date());
         } else if (typeEnum == PointActivityTypeEnum.MONTHLY_ACTIVITY) {
             StartTime = DateUtil.beginOfMonth(new Date());
+        } else if (typeEnum == PointActivityTypeEnum.NEW_USER_ACTIVITY) {
+            // 获取正在进行中的新手活动
+            LambdaQueryWrapper<PointActivity> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(PointActivity::getActivityType, PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode())
+                    .eq(PointActivity::getStatus, 0)
+                    .orderByDesc(PointActivity::getStartTime)
+                    .last("limit 1");
+            PointActivity activity = this.pointActivityService.getOne(queryWrapper);
+            if (ObjectUtil.isNotNull(activity)) {
+                StartTime = activity.getStartTime();
+            }
         }
         return StartTime;
     }
@@ -379,16 +390,16 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
             }
 
             // 3. 防重复领取:利用 TaskLimitTimesEnum 策略模式校验
-            PointUserActivityTaskCompletion record = getTaskRecordInPeriod(openId, activity.getId(), task.getId(), taskTypeEnum.getCode(), queryTime);
+            PointUserActivityTaskCompletion record = getTaskRecordInPeriod(openId, activity.getId(), task.getId(), ActivityCompletionTaskTypeEnum.ACTIVITY.getCode(), queryTime);
             int completedCount = (record != null) ? record.getCompletedCount() : 0;
             if (!limitEnum.executeCheck(completedCount)) {
                 return false;
             }
 
             // 4. 完成任务 + 发放积分
-            completeTask(openId, activity.getId(), task.getId(), taskTypeEnum.getCode());
+            completeTask(openId, activity.getId(), task.getId(), ActivityCompletionTaskTypeEnum.ACTIVITY.getCode());
             pointAccountService.addPoints(openId, task.getRewardPoints().intValue(), activity.getName(),
-                    null, activity.getId(), task.getId(), taskTypeEnum.getCode(), activityNameEnum.getInfo());
+                    null, activity.getId(), task.getId(), ActivityCompletionTaskTypeEnum.ACTIVITY.getCode(), activityNameEnum.getInfo());
             return true;
         } catch (ServiceException e) {
             if (!e.getMessage().contains("已完成") && !e.getMessage().contains("已领取")) {