修复: aichat advance_task渲染显任务名 + 审批防双击 + time.ts销账

- UX-260618-14: advance_task 工具结果/审批卡显任务名替代UUID
  前端 ToolCard 取 r.title fallback r.id + TASK_ID_TOOL_ARG 审批卡 task_id→title 回显 + i18n
  后端 audit resolve_task_label 查 tasks 表(原误查 projects恒报不存在) + 删 tool_display_hint 短路让模板生效
- UX-260618-16: time.ts formatDate .value 已修(CR-24/25闭环),漏销账补登
- UX-260618-17: ProjectDetail handleApprovalMulti 补 submitting try/finally + 模板联动防双击
This commit is contained in:
2026-06-19 00:52:20 +08:00
parent 6d2244c03b
commit 1dc8b12ec4
8 changed files with 94 additions and 19 deletions

View File

@@ -8,7 +8,7 @@ use tauri::{AppHandle, Emitter, State};
use df_ai::ai_tools::{AiToolRegistry, RiskLevel};
use df_ai::provider::ChatMessage;
use df_storage::crud::{AiToolExecutionRepo, ProjectRepo};
use df_storage::crud::{AiToolExecutionRepo, ProjectRepo, TaskRepo};
use df_storage::db::Database;
use df_storage::models::AiToolExecutionRecord;
@@ -143,6 +143,26 @@ async fn resolve_project_label(db: &Arc<Database>, id: &str) -> String {
}
}
/// 查任务可读标签:id → "「任务标题」(id=x)",对齐 resolve_project_label 三臂语义。
///
/// UX-260618-14:advance_task 审批卡的 id 是 task_id,原 build_approval_reason 把 "id"
/// 统一走 resolve_project_label(查 projects 表),误把任务 id 当项目 id 解析,永远落到
/// "项目已不存在"。本方法改查 tasks 表,与 resolve_project_label 同 Ok(None)/Err 分流。
async fn resolve_task_label(db: &Arc<Database>, id: &str) -> String {
if id.is_empty() {
return String::new();
}
let repo = TaskRepo::new(db);
match repo.get_by_id(id).await {
Ok(Some(t)) => format!("{}」(id={})", t.title, id),
Ok(None) => format!("(任务已不存在, id={})", id),
Err(e) => {
tracing::warn!("resolve_task_label: 查询任务 id={} 失败,回退裸 id: {}", id, e);
format!("(id={})", id)
}
}
}
/// 拼审批 reason按工具名 + args 取可读字段,让用户知道"审批要做什么"。
///
/// 主要审批工具特化(带对象名/标识):
@@ -170,6 +190,8 @@ async fn build_approval_reason(
let val = s(key);
if val.is_empty() { values.clear(); break; }
match key {
// advance_task 的 id 是 task_id(非项目 id),改查 tasks 表,避免误报"项目已不存在"
"id" if tool_name == "advance_task" => values.push(resolve_task_label(db, &val).await),
"id" | "project_id" => values.push(resolve_project_label(db, &val).await),
_ => values.push(val.to_string()),
}