diff --git a/logs/server.2025-09-16.0.log.gz b/logs/server.2025-09-16.0.log.gz new file mode 100644 index 0000000..7cf7bb0 Binary files /dev/null and b/logs/server.2025-09-16.0.log.gz differ diff --git a/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java b/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java index 42f35be..e720093 100644 --- a/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java +++ b/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java @@ -33,6 +33,14 @@ public interface LinkTaskMapper extends BaseMapper { */ int updatePointsIfGreater(@Param("id") Long id, @Param("newPoints") Integer newPoints); + + /** + * 将指定设备上所有 LOGGED_IN 的任务标记为 COMPLETED,并写入原因与可选的完成点数。 + * 返回受影响的行数。 + */ + int completeLoggedInTasksByMachine(@Param("machineId") String machineId, + @Param("reason") String reason, + @Param("completedPoints") Integer completedPoints); List findByAgentId(@Param("agentId") Long agentId, @Param("size") int size, diff --git a/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java b/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java index 968adee..4c6391c 100644 --- a/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java +++ b/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java @@ -68,6 +68,9 @@ public class LinkTask { @TableField("completion_images") private String completionImages; // JSON格式存储4张图片URL + @TableField("reason") + private String reason; // 状态变化原因 + public Long getId() { return id; } @@ -133,5 +136,8 @@ public class LinkTask { public String getCompletionImages() { return completionImages; } public void setCompletionImages(String completionImages) { this.completionImages = completionImages; } + public String getReason() { return reason; } + public void setReason(String reason) { this.reason = reason; } + } diff --git a/src/main/java/com/gameplatform/server/service/detection/GameCompletionDetectionService.java b/src/main/java/com/gameplatform/server/service/detection/GameCompletionDetectionService.java index 0015f97..f77da68 100644 --- a/src/main/java/com/gameplatform/server/service/detection/GameCompletionDetectionService.java +++ b/src/main/java/com/gameplatform/server/service/detection/GameCompletionDetectionService.java @@ -202,6 +202,8 @@ public class GameCompletionDetectionService { try { task.setStatus("COMPLETED"); task.setUpdatedAt(now); + // 正常检测完成:记录原因 + task.setReason("状态:已完成"); // 设置完成点数 if (points != null) { diff --git a/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java b/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java index 04cd7bd..2d2cfcf 100644 --- a/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java +++ b/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java @@ -71,12 +71,28 @@ public class DeviceStatusCheckService { DeviceStatusInfo statusInfo = parseDeviceStatus(deviceStatus); log.debug("设备 {} 状态解析结果: {}", machineId, statusInfo); - // 3. 如果设备空闲,通过完成检测服务进行判定(含缓冲与二次确认) + // 3. 如果设备空闲,通过完成检测服务进行判定(含缓冲与二次确认)。 + // 若未能直接判定完成,则执行兜底:将该设备上 LOGGED_IN 的任务批量置为 COMPLETED,并写入原因。 if (statusInfo.isIdle()) { String source = "TIMER_TASK"; com.gameplatform.server.util.AuditLogger.debug("IdleDetected: device={}, source={}, status={}, points={}", machineId, source, statusInfo.getStatus(), statusInfo.getPoints()); // 调用完成检测服务(包含登录缓冲与二次确认) - completionDetectionService.detectGameCompletion(machineId, statusInfo.getStatus(), source); + boolean done = completionDetectionService.detectGameCompletion(machineId, statusInfo.getStatus(), source); + if (!done) { + // 兜底完成:当设备空闲,直接将 LOGGED_IN 任务置为完成 + String completionReason = "状态:已完成(空闲兜底)"; + Integer points = statusInfo.getPoints(); + try { + int affected = linkTaskMapper.completeLoggedInTasksByMachine(machineId, completionReason, points); + if (affected > 0) { + log.info("空闲兜底:设备 {} 完成了 {} 个任务,reason='{}' points={} ", machineId, affected, completionReason, points); + } else { + log.debug("空闲兜底:设备 {} 无需更新(无 LOGGED_IN 任务)", machineId); + } + } catch (Exception e) { + log.warn("空闲兜底完成失败 device={} err={}", machineId, e.getMessage()); + } + } } else { log.debug("设备 {} 状态为 [{}],非空闲状态,跳过检查", machineId, statusInfo.getStatus()); } diff --git a/src/main/resources/mapper/agent/LinkTaskMapper.xml b/src/main/resources/mapper/agent/LinkTaskMapper.xml index 169af7b..8bc3cb0 100644 --- a/src/main/resources/mapper/agent/LinkTaskMapper.xml +++ b/src/main/resources/mapper/agent/LinkTaskMapper.xml @@ -23,24 +23,25 @@ + SELECT id, batch_id, agent_id, code_no, token_hash, expire_at, status, region, machine_id, login_at, refund_at, revoked_at, created_at, updated_at, need_refresh, refresh_time, qr_created_at, qr_expire_at, first_region_select_at, completed_points, completion_images FROM link_task