标注结果和标注结果归档优化

This commit is contained in:
wh
2026-05-06 19:07:45 +08:00
parent 99ffa9d490
commit 9d8d06427c
20 changed files with 736 additions and 306 deletions

View File

@@ -57,12 +57,12 @@ ON CONFLICT DO NOTHING;
INSERT INTO source_resource (
id, company_id, creator_id, creator_role, resource_name, resource_type,
bucket_name, file_path, file_size, source_status, storage_provider, remark
bucket_name, file_path, file_size, source_status, storage_provider, has_bbox, remark
) VALUES
(601, 2, 3, 'EMPLOYEE', '设备巡检规范.txt', 'TEXT',
'source-data', 'text/202604/601.txt', 20480, 'READY', 'rustfs', '文本资源示例'),
'source-data', 'text/202604/601.txt', 20480, 'READY', 'rustfs', NULL, '文本资源示例'),
(602, 2, 3, 'EMPLOYEE', '控制柜照片.jpg', 'IMAGE',
'source-data', 'image/202604/602.jpg', 532480, 'READY', 'rustfs', '图片资源示例')
'source-data', 'image/202604/602.jpg', 532480, 'READY', 'rustfs', TRUE, '图片资源示例')
ON CONFLICT DO NOTHING;
INSERT INTO annotation_task (
@@ -85,29 +85,25 @@ ON CONFLICT DO NOTHING;
INSERT INTO annotation_result (
id, company_id, creator_id, creator_role, task_id, resource_id,
qa_content_json, qa_content_storage_mode, qa_content_file_path, diff_summary,
qa_content_file_path, diff_summary_file_path,
requires_manual_review, is_deleted, reviewer_id, review_comment, reviewed_at
) VALUES
(801, 2, 3, 'EMPLOYEE', 701, 601,
'{"question":"巡检开始前需要做什么?","answer":"详见外置结果文件,包含完整步骤与注意事项。"}',
'EXTERNAL', 'annotation-results/202604/801-qa.json',
'{"extract_question":"巡检开始前需要做什么?","extract_answer":"开始前检查设备状态和作业环境。","verify_answer":"开始前应确认设备状态、防护用品和现场环境安全。","mismatch_fields":["answer"],"reason":"抽取答案遗漏了安全检查要点。"}',
'annotation-results/2/qa/801.json',
'annotation-results/2/diff/801.json',
TRUE, FALSE, NULL, NULL, NULL),
(802, 2, 3, 'EMPLOYEE', 702, 602,
'{"question":"图片中的控制柜当前状态如何?","answer":"控制柜处于运行状态,绿色指示灯亮起。"}',
'INLINE', NULL,
'{"extract_question":"图片中的控制柜当前状态如何?","extract_answer":"控制柜处于运行状态,绿色指示灯亮起。","verify_answer":"控制柜正在运行,指示灯显示正常。","mismatch_fields":[],"reason":"校验结果与抽取结果基本一致。"}',
'annotation-results/2/qa/802.json',
NULL,
FALSE, FALSE, 5, '结果可通过。', CURRENT_TIMESTAMP)
ON CONFLICT DO NOTHING;
INSERT INTO annotation_result_history (
id, company_id, creator_id, creator_role, source_result_id, task_id, resource_id,
qa_content_json, qa_content_storage_mode, qa_content_file_path, archive_reason, archived_by, archived_at
qa_content_file_path, archive_reason, archived_by, archived_at
) VALUES
(901, 2, 3, 'EMPLOYEE', 802, 702, 602,
'{"question":"图片中的控制柜当前状态如何?","answer":"控制柜处于运行状态,绿色指示灯亮起。"}',
'INLINE',
NULL,
'annotation-results/2/qa/802.json',
'审核通过后归档', 5, CURRENT_TIMESTAMP)
ON CONFLICT DO NOTHING;

View File

@@ -135,6 +135,7 @@ CREATE TABLE IF NOT EXISTS source_resource
file_size BIGINT NOT NULL DEFAULT 0,
source_status VARCHAR(32) NOT NULL DEFAULT 'UPLOADED',
storage_provider VARCHAR(64) NOT NULL DEFAULT 'rustfs',
has_bbox BOOLEAN,
remark VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
@@ -154,6 +155,7 @@ COMMENT ON COLUMN source_resource.file_path IS '文件存储路径,表示对
COMMENT ON COLUMN source_resource.file_size IS '文件大小,单位字节,默认 0。';
COMMENT ON COLUMN source_resource.source_status IS '资源状态,默认 UPLOADED可选 PROCESSING、READY、ARCHIVED。';
COMMENT ON COLUMN source_resource.storage_provider IS '存储提供方,默认 rustfs。';
COMMENT ON COLUMN source_resource.has_bbox IS '是否有BBOX标注。NULL表示非图片资源或未标注TRUE表示已标注BBOXFALSE表示已删除BBOX标注。';
COMMENT ON COLUMN source_resource.remark IS '备注说明。';
COMMENT ON COLUMN source_resource.created_at IS '创建时间。';
COMMENT ON COLUMN source_resource.updated_at IS '更新时间。';
@@ -242,25 +244,24 @@ COMMENT ON COLUMN annotation_task_resource.task_id IS '任务ID。';
COMMENT ON COLUMN annotation_task_resource.resource_id IS '资源ID。';
COMMENT ON COLUMN annotation_task_resource.created_at IS '创建时间。';
CREATE TABLE IF NOT EXISTS annotation_result
(
id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL,
creator_id BIGINT NOT NULL,
creator_role VARCHAR(32) NOT NULL DEFAULT 'EMPLOYEE',
task_id BIGINT NOT NULL,
resource_id BIGINT NOT NULL,
qa_content_json TEXT NOT NULL DEFAULT '{}',
qa_content_storage_mode VARCHAR(32) NOT NULL DEFAULT 'INLINE',
qa_content_file_path VARCHAR(512),
diff_summary TEXT NOT NULL DEFAULT '{}',
requires_manual_review BOOLEAN NOT NULL DEFAULT FALSE,
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
reviewer_id BIGINT,
review_comment TEXT,
reviewed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL,
creator_id BIGINT NOT NULL,
creator_role VARCHAR(32) NOT NULL DEFAULT 'EMPLOYEE',
task_id BIGINT NOT NULL,
resource_id BIGINT NOT NULL,
qa_content_file_path VARCHAR(512) NOT NULL,
diff_summary_file_path VARCHAR(512),
requires_manual_review BOOLEAN NOT NULL DEFAULT FALSE,
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
reviewer_id BIGINT,
review_comment TEXT,
reviewed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_annotation_result_company FOREIGN KEY (company_id) REFERENCES sys_company (id),
CONSTRAINT fk_annotation_result_creator FOREIGN KEY (creator_id) REFERENCES sys_user (id),
CONSTRAINT fk_annotation_result_task FOREIGN KEY (task_id) REFERENCES annotation_task (id),
@@ -268,18 +269,16 @@ CREATE TABLE IF NOT EXISTS annotation_result
CONSTRAINT fk_annotation_result_reviewer FOREIGN KEY (reviewer_id) REFERENCES sys_user (id)
);
COMMENT ON TABLE annotation_result IS '当前标注结果表。';
COMMENT ON TABLE annotation_result IS '当前标注结果表。问答内容和差异摘要统一存储在对象存储中。';
COMMENT ON COLUMN annotation_result.id IS '标注结果主键ID。';
COMMENT ON COLUMN annotation_result.company_id IS '所属公司ID。';
COMMENT ON COLUMN annotation_result.creator_id IS '结果创建人用户ID。';
COMMENT ON COLUMN annotation_result.creator_role IS '结果创建人数据权限角色,默认 EMPLOYEE。';
COMMENT ON COLUMN annotation_result.task_id IS '关联任务ID。';
COMMENT ON COLUMN annotation_result.resource_id IS '关联资源ID。';
COMMENT ON COLUMN annotation_result.qa_content_json IS '问答内容 JSON 字符串。字段类型为 TEXT建议结构为 {\"question\":\"...\",\"answer\":\"...\"}。中小体积内容默认直接入库';
COMMENT ON COLUMN annotation_result.qa_content_storage_mode IS '问答内容存储模式,默认 INLINE可选 INLINE、EXTERNAL。当完整问答内容较大时可设为 EXTERNAL仅在表内保留摘要或索引信息';
COMMENT ON COLUMN annotation_result.qa_content_file_path IS '当 qa_content_storage_mode = EXTERNAL 时,记录外置问答内容文件路径';
COMMENT ON COLUMN annotation_result.diff_summary IS '差异摘要 JSON 字符串。字段类型为 TEXT建议结构为 {\"extract_question\":\"...\",\"extract_answer\":\"...\",\"verify_answer\":\"...\",\"mismatch_fields\":[\"question\",\"answer\"],\"reason\":\"...\"}。';
COMMENT ON COLUMN annotation_result.requires_manual_review IS '是否需要人工审核,默认 FALSE。';
COMMENT ON COLUMN annotation_result.qa_content_file_path IS '问答内容文件路径存储在对象存储中。文件格式包含taskId、resourceId、records数组id、question、answer、requiresReview';
COMMENT ON COLUMN annotation_result.diff_summary_file_path IS '差异摘要文件路径存储在对象存储中。当存在差异时生成包含taskId、resourceId、records数组qaId、question、extractAnswer、verifyAnswer、diffReason、mergedAnswer';
COMMENT ON COLUMN annotation_result.requires_manual_review IS '是否需要人工审核,默认 FALSE。当diff_summary_file_path不为空时为TRUE';
COMMENT ON COLUMN annotation_result.is_deleted IS '软删除标记,默认 FALSE。';
COMMENT ON COLUMN annotation_result.reviewer_id IS '审核人用户ID。';
COMMENT ON COLUMN annotation_result.review_comment IS '审核意见。';
@@ -287,22 +286,21 @@ COMMENT ON COLUMN annotation_result.reviewed_at IS '审核时间。';
COMMENT ON COLUMN annotation_result.created_at IS '创建时间。';
COMMENT ON COLUMN annotation_result.updated_at IS '更新时间。';
CREATE TABLE IF NOT EXISTS annotation_result_history
(
id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL,
creator_id BIGINT NOT NULL,
creator_role VARCHAR(32) NOT NULL DEFAULT 'EMPLOYEE',
source_result_id BIGINT,
task_id BIGINT NOT NULL,
resource_id BIGINT NOT NULL,
qa_content_json TEXT NOT NULL DEFAULT '{}',
qa_content_storage_mode VARCHAR(32) NOT NULL DEFAULT 'INLINE',
qa_content_file_path VARCHAR(512),
archive_reason VARCHAR(255),
archived_by BIGINT,
archived_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL,
creator_id BIGINT NOT NULL,
creator_role VARCHAR(32) NOT NULL DEFAULT 'EMPLOYEE',
source_result_id BIGINT,
task_id BIGINT NOT NULL,
resource_id BIGINT NOT NULL,
qa_content_file_path VARCHAR(512) NOT NULL,
archive_reason VARCHAR(256),
archived_by BIGINT,
archived_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_annotation_result_history_company FOREIGN KEY (company_id) REFERENCES sys_company (id),
CONSTRAINT fk_annotation_result_history_creator FOREIGN KEY (creator_id) REFERENCES sys_user (id),
CONSTRAINT fk_annotation_result_history_result FOREIGN KEY (source_result_id) REFERENCES annotation_result (id),
@@ -311,7 +309,7 @@ CREATE TABLE IF NOT EXISTS annotation_result_history
CONSTRAINT fk_annotation_result_history_archived_by FOREIGN KEY (archived_by) REFERENCES sys_user (id)
);
COMMENT ON TABLE annotation_result_history IS '历史归档结果表。';
COMMENT ON TABLE annotation_result_history IS '历史归档结果表。问答内容存储在对象存储中。';
COMMENT ON COLUMN annotation_result_history.id IS '历史结果主键ID。';
COMMENT ON COLUMN annotation_result_history.company_id IS '所属公司ID。';
COMMENT ON COLUMN annotation_result_history.creator_id IS '历史记录创建人用户ID。';
@@ -319,9 +317,7 @@ COMMENT ON COLUMN annotation_result_history.creator_role IS '历史记录创建
COMMENT ON COLUMN annotation_result_history.source_result_id IS '来源运行态结果ID。';
COMMENT ON COLUMN annotation_result_history.task_id IS '关联任务ID。';
COMMENT ON COLUMN annotation_result_history.resource_id IS '关联资源ID。';
COMMENT ON COLUMN annotation_result_history.qa_content_json IS '归档后的问答内容 JSON 字符串。字段类型为 TEXT建议结构为 {"question":"...","answer":"..."}';
COMMENT ON COLUMN annotation_result_history.qa_content_storage_mode IS '归档后的问答内容存储模式,默认 INLINE可选 INLINE、EXTERNAL。';
COMMENT ON COLUMN annotation_result_history.qa_content_file_path IS '当 qa_content_storage_mode = EXTERNAL 时,记录归档后的外置问答内容文件路径。';
COMMENT ON COLUMN annotation_result_history.qa_content_file_path IS '归档后的问答内容文件路径,存储在对象存储中';
COMMENT ON COLUMN annotation_result_history.archive_reason IS '归档原因说明。';
COMMENT ON COLUMN annotation_result_history.archived_by IS '归档操作人用户ID。';
COMMENT ON COLUMN annotation_result_history.archived_at IS '归档时间。';
@@ -411,6 +407,8 @@ CREATE INDEX IF NOT EXISTS idx_sys_config_company_type ON sys_config (company_id
CREATE INDEX IF NOT EXISTS idx_source_resource_company_type ON source_resource (company_id, resource_type);
CREATE INDEX IF NOT EXISTS idx_source_resource_company_status ON source_resource (company_id, source_status);
CREATE INDEX IF NOT EXISTS idx_source_resource_creator ON source_resource (company_id, creator_id);
CREATE INDEX IF NOT EXISTS idx_source_resource_has_bbox ON source_resource (company_id, has_bbox);
CREATE INDEX IF NOT EXISTS idx_source_resource_has_bbox ON source_resource (company_id, has_bbox);
CREATE INDEX IF NOT EXISTS idx_annotation_task_company_status ON annotation_task (company_id, task_status);
CREATE INDEX IF NOT EXISTS idx_annotation_task_company_deleted ON annotation_task (company_id, is_deleted);
CREATE INDEX IF NOT EXISTS idx_annotation_task_creator ON annotation_task (company_id, creator_id);