新增: 灵感软删除回收站+雷达图正名(父⑤)

- IDEA-FIX-01: ideas 软删除(对标 tasks V14)— V28 迁移 deleted_at(幂等 ALTER) + IdeaRepo soft_delete/restore/list_deleted + list_by_query 恒带 deleted_at IS NULL(防回收站泄漏) + delete_idea 改软删 + restore_idea/list_deleted_ideas IPC + IdeaRecord 不加字段(纯 SQL WHERE 过滤)
- IDEA-FIX-14: 雷达图 CSS class radar→score-bar(IdeaDetail/ProjectDetail 2 文件 template+style+注释,纯正名零行为变更)
- 6 新测试(soft_delete 标记+过滤/幂等/missing, restore 还原/仅已删, list_deleted 排序);df-storage 73 测试过
This commit is contained in:
2026-06-26 20:42:48 +08:00
parent 308775cf4d
commit 005079f762
7 changed files with 230 additions and 37 deletions

View File

@@ -32,7 +32,8 @@ pub fn run(conn: &Connection) -> Result<()> {
// V27 = TD-260621-05 审批状态统一(ai_tool_executions.status executed→completed,
// 对齐 DTO 契约 audit/mod.rs:53 只列 completed + 前端 i18n auditLog.status 无 executed 键 +
// 治 AuditLog executed 记录显示错位蓝pending标签+raw"executed")。
let steps: [(i32, fn(&Connection) -> Result<()>); 27] = [
// V28 = 灵感软删回收站(ideas.deleted_at,对标 tasks.deleted_at V14/projects.deleted_at V11)。
let steps: [(i32, fn(&Connection) -> Result<()>); 28] = [
(1, migrate_v1),
(2, migrate_v2),
(3, migrate_v3),
@@ -60,6 +61,7 @@ pub fn run(conn: &Connection) -> Result<()> {
(25, migrate_v25),
(26, migrate_v26),
(27, migrate_v27),
(28, migrate_v28),
];
for (version, migrate_fn) in steps {
@@ -679,6 +681,23 @@ fn migrate_v27(conn: &Connection) -> Result<()> {
Ok(())
}
/// V28: 幂等补 ideas.deleted_at 列(灵感软删回收站,对标 tasks.deleted_at V14)
///
/// 删除灵感改为软删:deleted_at NULL=正常,非空=已进回收站(可恢复)。
/// 与 tasks/projects.soft_delete 同模板:IdeaRecord 不带该字段,纯靠 SQL WHERE
/// deleted_at IS NULL 过滤;关联数据(idea_evaluations 评估历史)不动,FK 仍满足,
/// 灵感数据完整保留待恢复。用 PRAGMA 探测列存在性,缺失才 ALTER
/// (同 v4/v5/v6/v8/v10/v11/v14/v15/v16/v17/v18/v19/v20/v23/v24 模式),对新库/老库均安全。
fn migrate_v28(conn: &Connection) -> Result<()> {
if !column_exists(conn, "ideas", "deleted_at") {
conn.execute("ALTER TABLE ideas ADD COLUMN deleted_at TEXT", [])?;
tracing::info!("v28: 补建 ideas.deleted_at 列(灵感软删回收站)");
}
conn.execute("INSERT INTO schema_version (version) VALUES (?)", [28])?;
tracing::info!("迁移 v28 完成");
Ok(())
}
/// V21 建表 SQL — 消息拆分存储 ai_messages 表
///
/// 与 V9_SQL 中的 ai_messages 镜像(V9 给新库,此 const 给老库 V21 迁移用 IF NOT EXISTS)。