//! 想法晋升 — 将想法转为项目 use anyhow::Result; use serde::Serialize; use df_core::types::{IdeaId, ProjectId}; use crate::adversarial::Recommendation; use crate::capture::Idea; /// 晋升结果 #[derive(Debug, Clone, Serialize)] pub struct PromotionResult { pub idea_id: IdeaId, pub project_id: ProjectId, pub promoted: bool, pub reason: String, } /// 晋升策略 #[derive(Debug, Clone, Copy)] pub enum PromotionPolicy { /// 自动晋升(评分达标时自动转为项目) Auto, /// 手动确认(需要人工审批) Manual, /// 半自动(AI 评估 + 人工确认) SemiAuto, } /// 想法晋升器 pub struct IdeaPromoter { policy: PromotionPolicy, } impl IdeaPromoter { /// 创建晋升器 pub fn new(policy: PromotionPolicy) -> Self { Self { policy } } /// 评估并尝试晋升想法 /// /// TODO: 接入 df-project 创建项目 pub fn try_promote(&self, idea: &Idea, recommendation: &Recommendation) -> Result { match self.policy { PromotionPolicy::Auto => { if matches!(recommendation, Recommendation::ImmediateAction | Recommendation::Soon) { self.do_promote(idea) } else { Ok(PromotionResult { idea_id: idea.id.clone(), project_id: String::new(), promoted: false, reason: format!("评估建议 {:?},未达到自动晋升标准", recommendation), }) } } PromotionPolicy::Manual => { Ok(PromotionResult { idea_id: idea.id.clone(), project_id: String::new(), promoted: false, reason: "手动模式,等待人工审批".to_string(), }) } PromotionPolicy::SemiAuto => { // TODO: AI 评估 + 人工确认流程 Ok(PromotionResult { idea_id: idea.id.clone(), project_id: String::new(), promoted: false, reason: "半自动模式,等待确认".to_string(), }) } } } /// 执行晋升操作 fn do_promote(&self, idea: &Idea) -> Result { let project_id = df_core::types::new_id(); // TODO: 调用 df-project 创建项目 tracing::info!("想法 {} 晋升为项目 {}", idea.id, project_id); Ok(PromotionResult { idea_id: idea.id.clone(), project_id, promoted: true, reason: "评估达标,自动晋升".to_string(), }) } }