Add UPP STL asset indexing workflow

This commit is contained in:
Codex
2026-05-25 22:55:58 +08:00
parent 70215ce611
commit 7eebab455d
8 changed files with 1960 additions and 0 deletions

View File

@@ -0,0 +1,92 @@
CREATE TABLE IF NOT EXISTS upp_exam_assets (
ct_number text NOT NULL PRIMARY KEY,
list_present boolean NOT NULL DEFAULT false,
stl_present boolean NOT NULL DEFAULT false,
patient_name text,
patient_sex text,
patient_age text,
patient_id_masked text,
exam_date timestamptz,
task_created_at timestamptz,
exam_description text,
exam_device text,
algorithm_model text,
upp_status text,
list_record_count integer NOT NULL DEFAULT 0,
selected_list_record jsonb,
list_records jsonb NOT NULL DEFAULT '[]'::jsonb,
selected_source_case_dir text,
selected_source_stl_dir text,
processed_stl_dir text,
stl_case_name text,
stl_sequence_no integer,
stl_file_count integer NOT NULL DEFAULT 0,
stl_total_bytes bigint NOT NULL DEFAULT 0,
stl_files jsonb NOT NULL DEFAULT '[]'::jsonb,
stl_candidates jsonb NOT NULL DEFAULT '[]'::jsonb,
updated_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT ck_upp_exam_assets_ct_number_present CHECK (btrim(ct_number) <> ''),
CONSTRAINT ck_upp_exam_assets_ct_number_format CHECK (ct_number ~ '^D?CT[0-9]{8,}$')
);
DO $$
BEGIN
IF to_regclass('public.upp_stl_files') IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'upp_stl_files'
AND column_name = 'file_names'
)
THEN
CREATE TABLE IF NOT EXISTS upp_stl_files_row_detail_backup AS TABLE upp_stl_files;
DROP TABLE upp_stl_files;
END IF;
END $$;
CREATE TABLE IF NOT EXISTS upp_stl_files (
ct_number text NOT NULL PRIMARY KEY REFERENCES upp_exam_assets(ct_number) ON DELETE CASCADE,
file_count integer NOT NULL DEFAULT 0,
total_bytes bigint NOT NULL DEFAULT 0,
segment_names jsonb NOT NULL DEFAULT '[]'::jsonb,
segment_families jsonb NOT NULL DEFAULT '[]'::jsonb,
segment_categories jsonb NOT NULL DEFAULT '[]'::jsonb,
file_names jsonb NOT NULL DEFAULT '[]'::jsonb,
source_file_paths jsonb NOT NULL DEFAULT '[]'::jsonb,
processed_file_paths jsonb NOT NULL DEFAULT '[]'::jsonb,
files jsonb NOT NULL DEFAULT '[]'::jsonb,
updated_at timestamptz NOT NULL DEFAULT now()
);
ALTER TABLE upp_exam_assets ALTER COLUMN ct_number SET NOT NULL;
ALTER TABLE upp_stl_files ALTER COLUMN ct_number SET NOT NULL;
ALTER TABLE upp_stl_files ADD COLUMN IF NOT EXISTS segment_families jsonb NOT NULL DEFAULT '[]'::jsonb;
ALTER TABLE upp_stl_files ADD COLUMN IF NOT EXISTS segment_categories jsonb NOT NULL DEFAULT '[]'::jsonb;
CREATE INDEX IF NOT EXISTS idx_upp_exam_assets_list_present ON upp_exam_assets(list_present);
CREATE INDEX IF NOT EXISTS idx_upp_exam_assets_stl_present ON upp_exam_assets(stl_present);
CREATE INDEX IF NOT EXISTS idx_upp_exam_assets_patient_name ON upp_exam_assets(patient_name);
CREATE INDEX IF NOT EXISTS idx_upp_exam_assets_exam_date ON upp_exam_assets(exam_date);
CREATE INDEX IF NOT EXISTS idx_upp_exam_assets_list_records_gin ON upp_exam_assets USING gin (list_records);
CREATE INDEX IF NOT EXISTS idx_upp_exam_assets_stl_files_gin ON upp_exam_assets USING gin (stl_files);
CREATE INDEX IF NOT EXISTS idx_upp_stl_files_segment_names_gin ON upp_stl_files USING gin (segment_names);
CREATE INDEX IF NOT EXISTS idx_upp_stl_files_segment_families_gin ON upp_stl_files USING gin (segment_families);
CREATE INDEX IF NOT EXISTS idx_upp_stl_files_segment_categories_gin ON upp_stl_files USING gin (segment_categories);
CREATE INDEX IF NOT EXISTS idx_upp_stl_files_file_names_gin ON upp_stl_files USING gin (file_names);
CREATE INDEX IF NOT EXISTS idx_upp_stl_files_files_gin ON upp_stl_files USING gin (files);
COMMENT ON TABLE upp_exam_assets IS 'UPP列表、STL重建结果、未来CT数据的CT号唯一资产索引';
COMMENT ON COLUMN upp_exam_assets.ct_number IS 'CT检查号唯一索引键';
COMMENT ON COLUMN upp_exam_assets.list_records IS '来自UPP列表OCR的同CT号全部记录';
COMMENT ON COLUMN upp_exam_assets.selected_list_record IS '同CT号列表记录中按任务创建时间/检查时间选择的新记录';
COMMENT ON COLUMN upp_exam_assets.stl_candidates IS '同CT号全部候选STL目录保留去重选择依据';
COMMENT ON COLUMN upp_exam_assets.stl_files IS '最终选中STL目录的文件清单';
COMMENT ON COLUMN upp_exam_assets.processed_stl_dir IS '规范化后的STL目录目录名为CT号';
COMMENT ON TABLE upp_stl_files IS 'UPP最终选中STL文件聚合表每个CT号唯一一行';
COMMENT ON COLUMN upp_stl_files.ct_number IS 'CT检查号主键并关联upp_exam_assets.ct_number';
COMMENT ON COLUMN upp_stl_files.segment_names IS '最终选中STL文件的分割名称JSON数组';
COMMENT ON COLUMN upp_stl_files.segment_families IS '与segment_names同顺序的训练family JSON数组';
COMMENT ON COLUMN upp_stl_files.segment_categories IS '与segment_names同顺序的粗分类JSON数组';
COMMENT ON COLUMN upp_stl_files.file_names IS '最终选中STL文件名JSON数组';
COMMENT ON COLUMN upp_stl_files.files IS '最终选中STL文件完整明细JSON数组';