feat(review): 支持多候选稿验收轮次
- 支持每轮提交 1–5 个候选稿并按指定稿验收 - 保留历史轮次只读并兼容单候选稿版本接口 - 同步 SQLite/PostgreSQL schema、迁移验证、测试与项目文档
This commit is contained in:
@@ -5,7 +5,7 @@ import { newDb } from 'pg-mem';
|
||||
|
||||
const tables = [
|
||||
'operation_groups', 'users', 'projects', 'collections', 'notes', 'images', 'annotations',
|
||||
'work_comments', 'work_versions', 'review_events', 'sessions', 'customer_sessions',
|
||||
'work_comments', 'work_versions', 'review_rounds', 'review_events', 'sessions', 'customer_sessions',
|
||||
'audit_logs', 'api_keys', 'storage_configs',
|
||||
] as const;
|
||||
const booleanColumns: Record<string, Set<string>> = {
|
||||
@@ -22,7 +22,8 @@ try {
|
||||
const schema = fs.readFileSync(path.resolve('db/postgres/schema.sql'), 'utf8')
|
||||
.replace(/^BEGIN;|COMMIT;$/gm, '')
|
||||
.replace(/CREATE UNIQUE INDEX IF NOT EXISTS one_active_storage_config[^;]+;/, '')
|
||||
.replace(/-- COLLECTION_STATUS_REPAIR_START[\s\S]+?-- COLLECTION_STATUS_REPAIR_END/, '');
|
||||
.replace(/-- COLLECTION_STATUS_REPAIR_START[\s\S]+?-- COLLECTION_STATUS_REPAIR_END/, '')
|
||||
.replace(/-- REVIEW_ROUND_REPAIR_START[\s\S]+?-- REVIEW_ROUND_REPAIR_END/, '');
|
||||
await client.query(schema);
|
||||
for (const table of tables) {
|
||||
const exists = sqlite.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(table);
|
||||
@@ -38,6 +39,9 @@ try {
|
||||
}
|
||||
const current = (await client.query(`SELECT n.version_number,n.review_status,i.storage_provider FROM notes n JOIN images i ON i.note_id=n.id AND i.version_number=n.version_number WHERE n.id=1 LIMIT 1`)).rows[0];
|
||||
if (!current || Number(current.version_number) < 1) throw new Error('作品版本关系未正确迁移');
|
||||
const invalidRoundLinks = Number((await client.query('SELECT COUNT(*)::int AS count FROM work_versions v LEFT JOIN review_rounds r ON r.id=v.review_round_id WHERE r.id IS NULL')).rows[0].count);
|
||||
const invalidActiveRounds = Number((await client.query('SELECT COUNT(*)::int AS count FROM notes n LEFT JOIN review_rounds r ON r.id=n.active_round_id WHERE r.id IS NULL OR r.note_id!=n.id')).rows[0].count);
|
||||
if (invalidRoundLinks || invalidActiveRounds) throw new Error(`验收轮次迁移关联无效:versions=${invalidRoundLinks}, notes=${invalidActiveRounds}`);
|
||||
const activeStorage = Number((await client.query("SELECT COUNT(*)::int AS count FROM storage_configs WHERE status='active'")).rows[0].count);
|
||||
if (activeStorage > 1) throw new Error('活动对象存储配置超过一个');
|
||||
process.stdout.write(`PostgreSQL schema 与迁移映射验证通过:${tables.length} 张表,当前作品 V${current.version_number},存储=${current.storage_provider}\n`);
|
||||
|
||||
Reference in New Issue
Block a user