constgroup=awaitdatabase.one<{id: number}>('SELECT id FROM operation_groups ORDER BY id LIMIT 1');
assert(group,'SQLite 测试需要至少一个运营组');
constproject={id: awaitdatabase.insertId("INSERT INTO projects (group_id,name,slug) VALUES (?,?,?)",[group.id,'单轮验收测试',`round-test-${Date.now()}`])};
constcollectionId=awaitdatabase.insertId("INSERT INTO collections (project_id,name,status) VALUES (?,?,'reviewing')",[project.id,`轮次测试 ${Date.now()}`]);
constnoteId=awaitdatabase.insertId("INSERT INTO notes (project_id,collection_id,title,review_status) VALUES (?,?,?,'pending')",[project.id,collectionId,'第 1 轮']);
constround1=awaitdatabase.insertId("INSERT INTO review_rounds (note_id,round_number,status) VALUES (?,1,'reviewing')",[noteId]);
awaitdatabase.execute('UPDATE notes SET active_round_id=? WHERE id=?',[round1,noteId]);
awaitdatabase.execute("INSERT INTO work_versions (note_id,version_number,title,review_status,review_round_id,candidate_name,candidate_status) VALUES (?,1,?,'pending',?,'','pending')",[noteId,'第 1 轮',round1]);
db.exec('DROP INDEX idx_work_versions_one_per_round');
awaitdatabase.execute("INSERT INTO work_versions (note_id,version_number,title,review_status,review_round_id) VALUES (?,99,?,'pending',?)",[noteId,'旧多方案数据',round1]);
repairMultiSchemeRounds();
constmigrated=awaitdatabase.one<{review_round_id: number;round_status: string}>('SELECT v.review_round_id,r.status AS round_status FROM work_versions v JOIN review_rounds r ON r.id=v.review_round_id WHERE v.note_id=? AND v.version_number=99',[noteId]);
assert((awaitdatabase.one<{review_status: string}>('SELECT review_status FROM notes WHERE id=?',[noteId]))?.review_status==='changes_requested','要求修改后作品状态错误');
assert((awaitdatabase.one<{completion_reason: string}>('SELECT completion_reason FROM review_rounds WHERE id=?',[round1]))?.completion_reason==='changes_requested','退修轮次未完成');
constround2=awaitdatabase.insertId("INSERT INTO review_rounds (note_id,round_number,status) VALUES (?,2,'reviewing')",[noteId]);
awaitdatabase.execute("INSERT INTO work_versions (note_id,version_number,title,review_status,review_round_id,candidate_name,candidate_status) VALUES (?,2,?,'pending',?,'','pending')",[noteId,'第 2 轮',round2]);
awaitdatabase.execute("UPDATE notes SET active_round_id=?,version_number=2,title=?,review_status='pending' WHERE id=?",[round2,'第 2 轮',noteId]);
constimageId=awaitdatabase.insertId("INSERT INTO images (note_id,url,version_number) VALUES (?, '/test.jpg', 2)",[noteId]);
constannotationId=awaitdatabase.insertId("INSERT INTO annotations (image_id,x,y,content,author_name,author_role) VALUES (?,.5,.5,'待处理','测试运营','operator')",[imageId]);
constcommentId=awaitdatabase.insertId("INSERT INTO work_comments (note_id,version_number,content) VALUES (?,2,'总体意见')",[noteId]);
assert((awaitdatabase.one<{count: number}>('SELECT COUNT(*) AS count FROM feedback_replies WHERE note_id=? AND feedback_id=?',[noteId,annotationId]))?.count===1,'批注回复未保存');
assert(Boolean((awaitdatabase.one<{withdrawn_at: string|null}>('SELECT withdrawn_at FROM annotations WHERE id=?',[annotationId]))?.withdrawn_at),'撤回没有保留时间记录');
assert((awaitdatabase.one<{review_status: string}>('SELECT review_status FROM projects WHERE id=?',[project.id]))?.review_status==='completed','全部作品通过后项目未完成');
assert((awaitdatabase.one<{closure_reason: string}>('SELECT closure_reason FROM work_comments WHERE id=?',[commentId]))?.closure_reason==='approved_with_round','未处理反馈没有随轮关闭');