新增: 审批超时后端兜底,覆盖重启恢复场景
前端已有审批超时定时器(设置页可选 0/5/15/30/60 分钟),负责会话 内运行的审批超时检测。但应用重启后前端定时器丢失,从数据库恢复 的待审批无人计时,会永久卡死会话。 本次补充后端兜底机制: - 待审批记录创建时刻,用于超时判定 - 在审批恢复入口检测超时,超时自动取消并写入审计 - 应用启动时从设置恢复超时配置(默认 15 分钟,0 为禁用) - 新增读写超时配置的接口,设置页可改 - 与前端共用同一个配置项,保证单一真相源 同时更新待办文档,把已实现项标记为完成。
This commit is contained in:
@@ -53,3 +53,41 @@ pub async fn settings_delete(
|
||||
pub async fn get_data_dir(state: State<'_, AppState>) -> Result<String, String> {
|
||||
Ok(state.data_dir.to_string_lossy().to_string())
|
||||
}
|
||||
|
||||
/// 读取审批超时分钟数(默认 15 分钟,0=禁用超时)
|
||||
///
|
||||
/// 前端 Settings 页启动时拉取,展示当前配置。
|
||||
#[tauri::command]
|
||||
pub async fn ai_get_approval_timeout(state: State<'_, AppState>) -> Result<u64, String> {
|
||||
Ok(state.approval_timeout_minutes.load(std::sync::atomic::Ordering::SeqCst))
|
||||
}
|
||||
|
||||
/// 设置审批超时分钟数并持久化(默认 15 分钟,0=禁用超时)
|
||||
///
|
||||
/// 前端 Settings 页保存时调用。值范围 0-1440(0=禁用,最大 24 小时)。
|
||||
/// 注意:此命令与前端 AdvancedSection.vue 的 df-approval-timeout KV 持久化路径不同,
|
||||
/// 前端走 appSettings.set 走 KV,这里作为后端热改入口。两者最终读写同一个 KV。
|
||||
#[tauri::command]
|
||||
pub async fn ai_set_approval_timeout(
|
||||
state: State<'_, AppState>,
|
||||
minutes: u64,
|
||||
) -> Result<u64, String> {
|
||||
// 范围校验(0-1440 分钟,即 0-24 小时)
|
||||
if minutes > 1440 {
|
||||
return Err("审批超时分钟数超出范围(最大 1440 = 24 小时)".to_string());
|
||||
}
|
||||
// 持久化到 Settings KV(与前端同 key,值为毫秒)
|
||||
let ms = minutes * 60_000;
|
||||
state
|
||||
.settings
|
||||
.set(
|
||||
crate::state::APPROVAL_TIMEOUT_KEY,
|
||||
&ms.to_string(),
|
||||
)
|
||||
.await
|
||||
.map_err(err_str)?;
|
||||
// 更新内存
|
||||
state.approval_timeout_minutes.store(minutes, std::sync::atomic::Ordering::SeqCst);
|
||||
tracing::info!("[APPROVAL-TIMEOUT] 已更新: {} 分钟 ({} ms)", minutes, ms);
|
||||
Ok(minutes)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user