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 1822b91..8655889 100644 --- a/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java +++ b/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java @@ -110,4 +110,9 @@ public interface LinkTaskMapper extends BaseMapper { * 根据状态列表和代理ID批量删除链接任务 */ int batchDeleteByStatusListAndAgentId(@Param("statusList") List statusList, @Param("agentId") Long agentId); + + /** + * 根据状态查询所有链接任务 + */ + List findByStatus(@Param("status") String status); } diff --git a/src/main/java/com/gameplatform/server/service/admin/AnnouncementByCodeService.java b/src/main/java/com/gameplatform/server/service/admin/AnnouncementByCodeService.java new file mode 100644 index 0000000..1746a80 --- /dev/null +++ b/src/main/java/com/gameplatform/server/service/admin/AnnouncementByCodeService.java @@ -0,0 +1,122 @@ +package com.gameplatform.server.service.admin; + +import com.gameplatform.server.mapper.agent.LinkTaskMapper; +import com.gameplatform.server.model.entity.admin.Announcement; +import com.gameplatform.server.model.entity.agent.LinkTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AnnouncementByCodeService { + + private static final Logger logger = LoggerFactory.getLogger(AnnouncementByCodeService.class); + + @Autowired + private LinkTaskMapper linkTaskMapper; + + @Autowired + private AnnouncementService announcementService; + + /** + * 根据codeNo获取对应代理商设置的公告 + * + * @param codeNo 链接编号 + * @return 代理商设置的启用公告列表 + * @throws IllegalArgumentException 当codeNo为空或对应的链接任务不存在时 + */ + public List getAnnouncementsByCodeNo(String codeNo) { + logger.info("开始根据codeNo查询代理商公告: {}", codeNo); + + if (codeNo == null || codeNo.trim().isEmpty()) { + logger.warn("codeNo为空或空字符串: {}", codeNo); + throw new IllegalArgumentException("codeNo不能为空"); + } + + logger.debug("步骤1: 根据codeNo查询link_task表: {}", codeNo); + LinkTask linkTask = linkTaskMapper.findByCodeNo(codeNo); + if (linkTask == null) { + logger.warn("未找到对应的链接任务, codeNo: {}", codeNo); + throw new IllegalArgumentException("找不到对应的链接任务: " + codeNo); + } + + logger.debug("查询到链接任务: id={}, agentId={}, status={}", + linkTask.getId(), linkTask.getAgentId(), linkTask.getStatus()); + + Long agentId = linkTask.getAgentId(); + if (agentId == null) { + logger.warn("链接任务的代理商ID为空, codeNo: {}, taskId: {}", codeNo, linkTask.getId()); + throw new IllegalArgumentException("链接任务的代理商ID为空: " + codeNo); + } + + logger.debug("步骤2: 根据agentId查询announcement表: agentId={}", agentId); + List announcements = announcementService.getEnabledAnnouncementsByBelongId(agentId.intValue()); + + logger.info("查询完成, codeNo: {}, agentId: {}, 找到公告数量: {}", + codeNo, agentId, announcements.size()); + + if (logger.isDebugEnabled()) { + announcements.forEach(announcement -> + logger.debug("公告详情: id={}, title={}, belongId={}", + announcement.getId(), announcement.getTitle(), announcement.getBelongId())); + } + + return announcements; + } + + /** + * 检查codeNo是否有效(链接任务存在) + * + * @param codeNo 链接编号 + * @return true 如果codeNo对应的链接任务存在,否则false + */ + public boolean isCodeNoValid(String codeNo) { + logger.debug("检查codeNo是否有效: {}", codeNo); + + if (codeNo == null || codeNo.trim().isEmpty()) { + logger.debug("codeNo为空,返回false: {}", codeNo); + return false; + } + + LinkTask linkTask = linkTaskMapper.findByCodeNo(codeNo); + boolean isValid = linkTask != null && linkTask.getAgentId() != null; + + logger.debug("codeNo有效性检查结果: {}, 有效: {}", codeNo, isValid); + if (linkTask != null) { + logger.debug("链接任务存在: id={}, agentId={}", linkTask.getId(), linkTask.getAgentId()); + } + + return isValid; + } + + /** + * 根据codeNo获取对应的代理商ID + * + * @param codeNo 链接编号 + * @return 代理商ID,如果codeNo无效返回null + */ + public Long getAgentIdByCodeNo(String codeNo) { + logger.debug("根据codeNo获取代理商ID: {}", codeNo); + + if (codeNo == null || codeNo.trim().isEmpty()) { + logger.debug("codeNo为空,返回null: {}", codeNo); + return null; + } + + LinkTask linkTask = linkTaskMapper.findByCodeNo(codeNo); + Long agentId = linkTask != null ? linkTask.getAgentId() : null; + + logger.debug("codeNo: {}, 对应的agentId: {}", codeNo, agentId); + if (linkTask != null) { + logger.debug("链接任务详情: id={}, status={}, agentId={}", + linkTask.getId(), linkTask.getStatus(), linkTask.getAgentId()); + } else { + logger.debug("未找到对应的链接任务: {}", codeNo); + } + + return agentId; + } +} \ No newline at end of file diff --git a/src/main/java/com/gameplatform/server/task/UsingLinkCheckTask.java b/src/main/java/com/gameplatform/server/task/UsingLinkCheckTask.java new file mode 100644 index 0000000..0b8499e --- /dev/null +++ b/src/main/java/com/gameplatform/server/task/UsingLinkCheckTask.java @@ -0,0 +1,104 @@ +package com.gameplatform.server.task; + +import com.gameplatform.server.mapper.agent.LinkTaskMapper; +import com.gameplatform.server.model.entity.agent.LinkTask; +import com.gameplatform.server.service.link.LinkStatusService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * USING状态链接检查定时任务 + * 每30秒检测状态为USING的链接,调用checkAndHandleLoginStatus函数 + */ +@Component +@Slf4j +public class UsingLinkCheckTask { + + private final LinkTaskMapper linkTaskMapper; + private final LinkStatusService linkStatusService; + + public UsingLinkCheckTask(LinkTaskMapper linkTaskMapper, LinkStatusService linkStatusService) { + this.linkTaskMapper = linkTaskMapper; + this.linkStatusService = linkStatusService; + } + + /** + * 每30秒检测一次USING状态的链接 + */ + @Scheduled(fixedRate = 30000) // 每30秒执行一次 + public void checkUsingLinksAndHandleLoginStatus() { + log.debug("开始定时检查USING状态的链接"); + + try { + // 1. 查询所有USING状态的链接任务 + List usingTasks = linkTaskMapper.findByStatus("USING"); + + if (usingTasks.isEmpty()) { + log.debug("当前没有USING状态的链接"); + return; + } + + log.debug("发现 {} 个USING状态的链接", usingTasks.size()); + + // 2. 对每个USING状态的链接调用checkAndHandleLoginStatus + for (LinkTask linkTask : usingTasks) { + try { + log.debug("检查链接 {} (设备: {}) 的登录状态", linkTask.getCodeNo(), linkTask.getMachineId()); + + // 调用checkAndHandleLoginStatus函数 - 这里需要使用私有方法的逻辑 + if (linkTask.getMachineId() != null) { + checkAndHandleLoginStatus(linkTask); + } else { + log.warn("链接 {} 没有关联设备,跳过检查", linkTask.getCodeNo()); + } + + } catch (Exception e) { + log.error("检查链接 {} 登录状态时发生异常: {}", linkTask.getCodeNo(), e.getMessage()); + // 继续检查下一个链接,不因为一个链接出错而中断整个流程 + } + } + + } catch (Exception e) { + log.error("定时检查USING状态链接时发生异常", e); + } + + log.debug("定时检查USING状态链接完成"); + } + + /** + * 检查并处理登录状态 + * 复制LinkStatusService中checkAndHandleLoginStatus的逻辑 + */ + private void checkAndHandleLoginStatus(LinkTask linkTask) { + try { + String deviceId = linkTask.getMachineId(); + if (deviceId == null) { + log.warn("无法获取设备编号: codeNo={}", linkTask.getCodeNo()); + return; + } + + log.debug("调用轮询上号接口检查链接 {} 的登录状态", linkTask.getCodeNo()); + + // 调用LinkStatusService的pollLogin方法来处理登录状态检查 + linkStatusService.pollLogin(linkTask.getCodeNo()) + .subscribe( + response -> { + if (response.isSuccess()) { + log.info("定时检查发现链接 {} 已成功登录,状态已更新", linkTask.getCodeNo()); + } else { + log.debug("链接 {} 尚未登录,状态: {}", linkTask.getCodeNo(), response.getStatus()); + } + }, + error -> { + log.warn("检查链接 {} 登录状态失败: {}", linkTask.getCodeNo(), error.getMessage()); + } + ); + + } catch (Exception e) { + log.error("处理链接 {} 登录状态检查时发生异常: {}", linkTask.getCodeNo(), e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/resources/mapper/agent/LinkTaskMapper.xml b/src/main/resources/mapper/agent/LinkTaskMapper.xml index 9cbe841..b589f51 100644 --- a/src/main/resources/mapper/agent/LinkTaskMapper.xml +++ b/src/main/resources/mapper/agent/LinkTaskMapper.xml @@ -248,4 +248,11 @@ #{status} + +