diff --git a/src/main/java/com/gameplatform/server/service/link/LinkStatusService.java b/src/main/java/com/gameplatform/server/service/link/LinkStatusService.java index d6b9047..4616864 100644 --- a/src/main/java/com/gameplatform/server/service/link/LinkStatusService.java +++ b/src/main/java/com/gameplatform/server/service/link/LinkStatusService.java @@ -437,8 +437,61 @@ public class LinkStatusService { * 用户端获取链接状态(支持linkId或codeNo参数,带自动刷新逻辑) */ public Mono getUserLinkStatus(Long linkId, String codeNo) { - return Mono.fromCallable(() -> doGetUserLinkStatus(linkId, codeNo)) - .subscribeOn(Schedulers.boundedElastic()); + return Mono.fromCallable(() -> { + log.info("=== 开始处理用户端链接状态查询 ==="); + log.info("linkId: {}, codeNo: {}", linkId, codeNo); + + try { + // 1. 查询链接任务 + LinkTask linkTask = null; + if (linkId != null) { + linkTask = linkTaskMapper.findById(linkId); + log.info("通过linkId查询链接任务: id={}", linkId); + } else if (codeNo != null && !codeNo.trim().isEmpty()) { + linkTask = linkTaskMapper.findByCodeNo(codeNo.trim()); + log.info("通过codeNo查询链接任务: codeNo={}", codeNo); + } + + if (linkTask == null) { + log.error("链接任务不存在: linkId={}, codeNo={}", linkId, codeNo); + throw new IllegalArgumentException("链接不存在"); + } + + log.info("查询到链接任务: id={}, codeNo={}, status={}, needRefresh={}", + linkTask.getId(), linkTask.getCodeNo(), linkTask.getStatus(), linkTask.getNeedRefresh()); + + return linkTask; + } catch (Exception e) { + log.error("=== 用户端链接状态查询失败 ==="); + log.error("错误详情: {}", e.getMessage(), e); + throw e; + } + }) + .subscribeOn(Schedulers.boundedElastic()) + .flatMap(linkTask -> { + // 如果是USING状态,先执行一次检测 + if ("USING".equals(linkTask.getStatus())) { + log.info("链接状态为USING,立即执行一次登录状态检测"); + return checkAndHandleLoginStatus(linkTask) + .doOnSuccess(pollResult -> { + log.info("登录状态检测完成: success={}, status={}", + pollResult.isSuccess(), pollResult.getStatus()); + }) + .doOnError(error -> { + log.warn("登录状态检测失败: {}", error.getMessage()); + }) + .onErrorResume(error -> { + // 检测失败不影响后续流程,继续返回状态 + log.warn("检测失败,继续返回当前状态"); + return Mono.empty(); + }) + .then(Mono.fromCallable(() -> doGetUserLinkStatus(linkId, codeNo))); + } else { + // 非USING状态,直接返回状态 + return Mono.fromCallable(() -> doGetUserLinkStatus(linkId, codeNo)); + } + }) + .subscribeOn(Schedulers.boundedElastic()); } private UserLinkStatusResponse doGetUserLinkStatus(Long linkId, String codeNo) {