import { Injectable } from '@angular/core'; import { completionJSON } from 'fmode-ng/core/agent/chat/completion'; @Injectable({ providedIn: 'root' }) export class ProjectRetrospectiveAIService { constructor() {} async generate(options: { project: any; // FmodeObject (仅用于取标题/时间) data: any; // collectProjectData() 的结果 onProgress?: (msg: string) => void; }): Promise { const { project, data } = options; const safe = { title: project?.get?.('title') || '', createdAt: project?.get?.('createdAt') || '', products: (data?.products || []).map((p: any) => ({ id: p.id, name: p.name, type: p.type })), payments: { totalAmount: data?.finalPayment?.totalAmount || 0, paidAmount: data?.finalPayment?.paidAmount || 0, remainingAmount: data?.finalPayment?.remainingAmount || 0, status: data?.finalPayment?.status || 'pending' }, feedback: { overallRating: data?.customerFeedback?.overallRating || 0, dimensionRatings: data?.customerFeedback?.dimensionRatings || {} } }; const prompt = `你是一名项目复盘分析专家。请基于下面的项目数据,输出结构化复盘JSON:\n\n` + JSON.stringify(safe, null, 2) + `\n\n请严格输出为 JSON,字段含义如下: { "summary": string, // 100-200字项目摘要 "highlights": string[], // 3-6条亮点 "challenges": string[], // 3-6条挑战 "recommendations": string[], // 3-6条可执行建议 "efficiencyAnalysis": { "overallScore": number, // 0-100 "grade": "A"|"B"|"C"|"D"|"F", "stageMetrics": [ { "stage": string, "plannedDays": number, "actualDays": number, "efficiency": number, "status": "on-time"|"delayed"|"ahead" } ] }, "financialAnalysis": { "revenueAnalysis": { "contracted": number, "received": number, "pending": number }, "profitMargin": number, "budgetVariance": number }, "satisfactionAnalysis": { "overallScore": number, "nps": number }, "risksAndOpportunities": { "risks": [{"type":"timeline"|"budget"|"quality"|"resource"|"scope","description":string,"severity":"high"|"medium"|"low"}], "opportunities": [{"area":string, "description":string, "priority":"high"|"medium"|"low"}] } }`; const outputSchema = `{ "summary": "", "highlights": [""], "challenges": [""], "recommendations": [""], "efficiencyAnalysis": { "overallScore": 80, "grade": "B", "stageMetrics": [{"stage":"交付执行","plannedDays":10,"actualDays":11,"efficiency":91,"status":"delayed"}] }, "financialAnalysis": { "revenueAnalysis": { "contracted": 0, "received": 0, "pending": 0 }, "profitMargin": 20, "budgetVariance": 0 }, "satisfactionAnalysis": { "overallScore": 80, "nps": 20 }, "risksAndOpportunities": { "risks": [{"type":"timeline","description":"进度波动","severity":"medium"}], "opportunities": [{"area":"复购","description":"客户满意度较高","priority":"high"}] } }`; options.onProgress?.('AI 正在生成复盘...'); const result = await completionJSON( prompt, outputSchema, () => options.onProgress?.('分析中...'), 2, { model: 'doubao-1.6', vision: false } ); return result || {}; } }