feat(personal): add scanned PDF OCR schema

This commit is contained in:
2026-07-12 21:14:53 +08:00
parent 92e2140abf
commit 88bfe1d815
3 changed files with 68 additions and 2 deletions
@@ -45,7 +45,18 @@ public final class PersonalAssistantDto {
public record ItemResponse(long id, String sourceType, String title, String originalUrl, String mimeType,
long sizeBytes, String status, String errorCode, String errorMessage, String summary,
List<String> tags, LocalDateTime capturedAt, LocalDateTime parsedAt) {
List<String> tags, LocalDateTime capturedAt, LocalDateTime parsedAt,
OcrProgressResponse ocr) {
public ItemResponse(long id, String sourceType, String title, String originalUrl, String mimeType,
long sizeBytes, String status, String errorCode, String errorMessage, String summary,
List<String> tags, LocalDateTime capturedAt, LocalDateTime parsedAt) {
this(id, sourceType, title, originalUrl, mimeType, sizeBytes, status, errorCode, errorMessage, summary,
tags, capturedAt, parsedAt, null);
}
}
public record OcrProgressResponse(boolean required, String status, int totalPages, int processedPages,
int successPages, int failedPages, List<Integer> failedPageNumbers) {
}
public record PageResponse<T>(List<T> rows, long total, int pageNum, int pageSize) {
@@ -59,8 +59,10 @@ class PersonalSchemaContractTest {
String session = tableDefinition(sql, "aihr_personal_chat_session");
String message = tableDefinition(sql, "aihr_personal_chat_message");
String cleanup = tableDefinition(sql, "aihr_personal_cleanup_job");
String ocrJob = tableDefinition(sql, "aihr_personal_ocr_job");
String ocrPage = tableDefinition(sql, "aihr_personal_ocr_page");
for (String definition : new String[] {space, item, fragment, session, message, cleanup}) {
for (String definition : new String[] {space, item, fragment, session, message, cleanup, ocrJob, ocrPage}) {
assertTrue(definition.contains("`owner_user_id` bigint not null"),
"Every personal table must carry a non-null owner_user_id");
}
@@ -123,6 +125,20 @@ class PersonalSchemaContractTest {
assertTrue(cleanup.contains("unique key `uk_personal_cleanup_item` (`tenant_id`, `owner_user_id`, `item_id`)"));
assertTrue(cleanup.contains("key `idx_personal_cleanup_status` (`status`, `update_time`)"));
assertTrue(ocrJob.contains("`total_pages` int not null"));
assertTrue(ocrJob.contains("`processed_pages` int not null default 0"));
assertTrue(ocrJob.contains("`success_pages` int not null default 0"));
assertTrue(ocrJob.contains("`failed_pages` int not null default 0"));
assertTrue(ocrJob.contains("`failed_page_numbers_json` json"));
assertTrue(ocrJob.contains("unique key `uk_personal_ocr_job_item` (`tenant_id`, `owner_user_id`, `item_id`)"));
assertTrue(ocrJob.contains("key `idx_personal_ocr_job_status` (`status`, `update_time`)"));
assertTrue(ocrPage.contains("`page_number` int not null"));
assertTrue(ocrPage.contains("`ocr_text` longtext"));
assertTrue(ocrPage.contains("`attempt_count` int not null default 0"));
assertTrue(ocrPage.contains("unique key `uk_personal_ocr_page_number` (`tenant_id`, `owner_user_id`, `item_id`, `page_number`)"));
assertTrue(ocrPage.contains("key `idx_personal_ocr_page_status` (`status`, `update_time`)"));
assertFalse(sql.contains("alter table aihr_knowledge_fragment"),
"Personal schema must not mutate enterprise knowledge tables");
assertFalse(sql.contains("alter table `aihr_knowledge_fragment`"),