fix: 修复chatlog会话元数据回写与覆盖问题

- 为消息追加命令补充用户、助手与会话标题元信息

- 持久化后按会话聚合触发createOrTouch并优化空值覆盖策略

- 增加ChatPersistMySqlApplyService单测覆盖会话回写链路
This commit is contained in:
2026-04-07 14:51:11 +08:00
parent 3f128e977a
commit 81125ce55c
5 changed files with 201 additions and 8 deletions

View File

@@ -0,0 +1,72 @@
package tech.easyflow.chatlog.service;
import org.junit.Assert;
import org.junit.Test;
import tech.easyflow.chatlog.domain.command.ChatAppendMessageCommand;
import tech.easyflow.chatlog.domain.command.ChatSessionUpsertCommand;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
public class ChatPersistMySqlApplyServiceTest {
private final ChatPersistMySqlApplyService service =
new ChatPersistMySqlApplyService(null, null, null, null);
@Test
public void shouldBuildMissingSessionUpsertFromMessageMetadata() {
ChatAppendMessageCommand first = new ChatAppendMessageCommand();
first.setSessionId(BigInteger.valueOf(101));
first.setTenantId(BigInteger.ONE);
first.setDeptId(BigInteger.TEN);
first.setUserId(BigInteger.valueOf(12));
first.setUserAccount("admin");
first.setAssistantId(BigInteger.valueOf(99));
first.setAssistantCode("test-bot");
first.setAssistantName("测试助手");
first.setSessionTitle("你是谁");
first.setCreatedBy(BigInteger.valueOf(12));
first.setCreated(new Date(1_000L));
ChatAppendMessageCommand second = new ChatAppendMessageCommand();
second.setSessionId(BigInteger.valueOf(101));
second.setTenantId(BigInteger.ONE);
second.setDeptId(BigInteger.TEN);
second.setUserId(BigInteger.valueOf(12));
second.setAssistantId(BigInteger.valueOf(99));
second.setCreatedBy(BigInteger.valueOf(12));
second.setCreated(new Date(2_000L));
List<ChatSessionUpsertCommand> upserts = service.buildSessionUpserts(List.of(first, second));
Assert.assertEquals(1, upserts.size());
ChatSessionUpsertCommand upsert = upserts.get(0);
Assert.assertEquals(BigInteger.valueOf(101), upsert.getSessionId());
Assert.assertEquals("admin", upsert.getUserAccount());
Assert.assertEquals("test-bot", upsert.getAssistantCode());
Assert.assertEquals("测试助手", upsert.getAssistantName());
Assert.assertEquals("你是谁", upsert.getTitle());
Assert.assertEquals(new Date(2_000L), upsert.getOperateAt());
}
@Test
public void shouldFallbackTitleWhenMessageMetadataMissing() {
ChatAppendMessageCommand command = new ChatAppendMessageCommand();
command.setSessionId(BigInteger.valueOf(202));
command.setTenantId(BigInteger.ONE);
command.setDeptId(BigInteger.ONE);
command.setUserId(BigInteger.valueOf(7));
command.setAssistantId(BigInteger.valueOf(8));
command.setCreatedBy(BigInteger.valueOf(7));
command.setCreated(new Date(3_000L));
List<ChatSessionUpsertCommand> upserts = service.buildSessionUpserts(List.of(command));
Assert.assertEquals(1, upserts.size());
ChatSessionUpsertCommand upsert = upserts.get(0);
Assert.assertEquals("", upsert.getUserAccount());
Assert.assertEquals("会话-202", upsert.getTitle());
Assert.assertEquals(BigInteger.valueOf(7), upsert.getOperatorId());
}
}