-- 产出的资料文件**存档** —— 放行那一刻把它冻在这儿。 -- -- 文件平时是台账那一行的投影(标题 + 正文 + 格式 → 现造字节,见 `file-compose.ts`), -- 在办期间这样最好:台账改一格,文件跟着变,两处永远一致。 -- 但**收工之后不该再变**:归档件说的是「他签字那一刻交出去的是什么」, -- 台账后来被下一单改了,归档的那份也不能跟着改口。 -- -- 还有一条更硬的理由:资料常落在**主数据**上(如 `content.asset` 品牌内容库), -- 而试跑单放行时主数据只留在活动缓存、不落正式表(免得试跑往正式库里塞真资产)—— -- 于是放行前点得开、放行后点不开。存档这一份把两件事一起解决了。 create table sys.task_asset_file ( id text primary key, task_id text not null, address text not null, -- 域.对象 row_key jsonb not null, -- 那一行的主键(多列主键原样收) title text not null default '', format text not null, -- md | html | docx | xlsx name text not null, -- 文件名(含扩展名) bytes bytea not null, size integer not null, created_at timestamptz not null default now() ); create index task_asset_file_task_idx on sys.task_asset_file (task_id, created_at); -- 同一单同一行只存一份:重跑放行(或补存)覆盖它,不留两份说法不一的档 create unique index task_asset_file_row_idx on sys.task_asset_file (task_id, address, row_key);