From 78976885fd5b86de869db65c7a1acba8ec59376d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 22 Oct 2026 23:55:47 +0800 Subject: [PATCH] fix(ai1): 对齐消息页顺序并兼容 JDK 17 --- yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/controller/admin/session/Ai1SessionMessageController.java | 2 +- yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/harness/session/Ai1SessionStreamTool.java | 4 ++-- yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageService.java | 2 +- yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImpl.java | 7 ++++++- yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/harness/mcp/Ai1McpToolFactoryTest.java | 8 ++++---- yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImplTest.java | 20 +++++++++++++++++--- 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/controller/admin/session/Ai1SessionMessageController.java b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/controller/admin/session/Ai1SessionMessageController.java index 2526abd..d0e5059 100644 --- a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/controller/admin/session/Ai1SessionMessageController.java +++ b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/controller/admin/session/Ai1SessionMessageController.java @@ -77,7 +77,7 @@ public class Ai1SessionMessageController { // ==================== 管理 ==================== @GetMapping("/page") - @Operation(summary = "获得会话消息分页", description = "按消息编号倒序") + @Operation(summary = "获得会话消息分页", description = "按消息编号倒序取最新页,页内按时间正序") @PreAuthorize("@ss.hasPermission('ai1:session:query')") public CommonResult> getSessionMessagePage(@Valid Ai1SessionMessagePageReqVO pageReqVO) { return success(BeanUtils.toBean(sessionMessageService.getSessionMessagePage(pageReqVO), diff --git a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/harness/session/Ai1SessionStreamTool.java b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/harness/session/Ai1SessionStreamTool.java index 6ee68a6..01712f8 100644 --- a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/harness/session/Ai1SessionStreamTool.java +++ b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/harness/session/Ai1SessionStreamTool.java @@ -529,7 +529,7 @@ public class Ai1SessionStreamTool implements SmartLifecycle { if (!lock.tryLock()) { return false; } - long ownerThreadId = Thread.currentThread().threadId(); + long ownerThreadId = Thread.currentThread().getId(); try { // 3. 锁内重新读取,期间可能已被 worker 完成 Ai1SessionMessageDO current = sessionMessageService.getSessionMessage(messageId); @@ -687,7 +687,7 @@ public class Ai1SessionStreamTool implements SmartLifecycle { if (!lock.tryLock()) { return; } - long workerThreadId = Thread.currentThread().threadId(); + long workerThreadId = Thread.currentThread().getId(); try { Long tenantId = Convert.toLong(fields.get(FIELD_TENANT_ID)); TenantUtils.execute(tenantId, () -> executeTask(recordId, fields, messageId, lock, workerThreadId, reclaimed)); diff --git a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageService.java b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageService.java index 66bc104..9daa762 100644 --- a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageService.java +++ b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageService.java @@ -26,7 +26,7 @@ public interface Ai1SessionMessageService { List getSessionMessageListBySessionId(Long sessionId); /** - * 获得会话消息分页,按编号倒序 + * 获得会话消息分页,按编号倒序取最新页,页内按时间正序 * * @param pageReqVO 分页查询 * @return 消息分页 diff --git a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImpl.java b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImpl.java index aa37ec6..f338b6d 100644 --- a/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImpl.java +++ b/yudao-module-ai1-springai/src/main/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImpl.java @@ -63,7 +63,12 @@ public class Ai1SessionMessageServiceImpl implements Ai1SessionMessageService { @Override public PageResult getSessionMessagePage(Ai1SessionMessagePageReqVO pageReqVO) { - return sessionMessageMapper.selectPage(pageReqVO); + PageResult pageResult = sessionMessageMapper.selectPage(pageReqVO); + // 按编号倒序取最新页,页内反转为时间正序 + if (CollUtil.isNotEmpty(pageResult.getList())) { + Collections.reverse(pageResult.getList()); + } + return pageResult; } @Override diff --git a/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/harness/mcp/Ai1McpToolFactoryTest.java b/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/harness/mcp/Ai1McpToolFactoryTest.java index bf83222..dc1ded3 100644 --- a/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/harness/mcp/Ai1McpToolFactoryTest.java +++ b/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/harness/mcp/Ai1McpToolFactoryTest.java @@ -67,7 +67,7 @@ public class Ai1McpToolFactoryTest extends BaseMockitoUnitTest { // 调用 List callbacks = buildTools(List.of(mcp), List.of("search")); // 断言 - assertEquals("github__search", callbacks.getFirst().getToolDefinition().name()); + assertEquals("github__search", callbacks.get(0).getToolDefinition().name()); } @Test @@ -78,8 +78,8 @@ public class Ai1McpToolFactoryTest extends BaseMockitoUnitTest { // 调用 List callbacks = buildTools(List.of(mcp), List.of("search")); // 断言 - assertEquals("a".repeat(56) + "__search", callbacks.getFirst().getToolDefinition().name()); - assertEquals(64, callbacks.getFirst().getToolDefinition().name().length()); + assertEquals("a".repeat(56) + "__search", callbacks.get(0).getToolDefinition().name()); + assertEquals(64, callbacks.get(0).getToolDefinition().name().length()); } @Test @@ -127,7 +127,7 @@ public class Ai1McpToolFactoryTest extends BaseMockitoUnitTest { List callbacks = buildTools(List.of(mcp), List.of(toolName)); // 调用 - String result = callbacks.getFirst().call("{\"query\":\"北京\"}"); + String result = callbacks.get(0).call("{\"query\":\"北京\"}"); // 断言 assertEquals("搜索结果", JsonUtils.parseObject(result, String.class)); verify(mcpClientTool).callTool(mcp, toolName, arguments); diff --git a/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImplTest.java b/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImplTest.java index 4605f25..8d809d7 100644 --- a/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImplTest.java +++ b/yudao-module-ai1-springai/src/test/java/cn/iocoder/yudao/module/ai1/service/session/Ai1SessionMessageServiceImplTest.java @@ -171,11 +171,25 @@ public class Ai1SessionMessageServiceImplTest extends BaseDbUnitTest { // 调用 PageResult pageResult = sessionMessageService.getSessionMessagePage(reqVO); - // 断言:按编号倒序 + // 断言:取最新一页,页内按时间正序 assertEquals(3, pageResult.getTotal()); - assertEquals(List.of(message3.getId(), message2.getId()), + assertEquals(List.of(message2.getId(), message3.getId()), pageResult.getList().stream().map(Ai1SessionMessageDO::getId).toList()); - assertNotEquals(message1.getId(), pageResult.getList().get(1).getId()); + + // 调用:第二页 + reqVO.setPageNo(2); + pageResult = sessionMessageService.getSessionMessagePage(reqVO); + // 断言:更早的消息 + assertEquals(3, pageResult.getTotal()); + assertEquals(List.of(message1.getId()), + pageResult.getList().stream().map(Ai1SessionMessageDO::getId).toList()); + + // 调用:超出范围的空页 + reqVO.setPageNo(3); + pageResult = sessionMessageService.getSessionMessagePage(reqVO); + // 断言 + assertEquals(3, pageResult.getTotal()); + assertTrue(pageResult.getList().isEmpty()); } @Test -- libgit2 0.21.4