修复: 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()),
}

View File

@@ -1572,7 +1572,8 @@ pub(crate) fn tool_display_hint(name: &str) -> Option<&'static str> {
"bind_directory" => Some("绑定目录"),
"create_idea" => Some("捕获灵感"),
"update_task" => Some("修改任务"),
"advance_task" => Some("推进任务状态"),
// advance_task 不在此轻量映射:让 build_approval_reason 走 display_hint_for_tool
// 模板(含 target_status 详情),否则轻量命中"推进任务状态"丢失目标态信息(UX-260618-14)
"run_workflow" => Some("触发工作流"),
"delete_task" => Some("删除任务"),
"update_idea" => Some("修改灵感"),