| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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<any> {
- 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 || {};
- }
- }
|