基于ProjectPayment、ProjectFeedback、Product等表结构和现有的stage-aftercare组件,设计完整的项目售后归档模块,包含验收尾款、客户评价、项目复盘三大核心功能,通过数据分析实现项目执行效率和团队绩效的科学评估。
现有结构已支持尾款管理:
现有结构支持多维度评价:
现有结构支持复盘分析:
interface FinalPaymentModule {
// 尾款总览
paymentOverview: {
totalAmount: number; // 尾款总额
paidAmount: number; // 已支付金额
remainingAmount: number; // 待支付金额
dueDate: Date; // 应付款日期
overdueDays: number; // 逾期天数
status: PaymentStatus; // 支付状态
};
// 按产品分摊
productBreakdown: Array<{
productId: string;
productName: string;
productType: string;
amount: number;
percentage: number;
paidAmount: number;
vouchers: PaymentVoucher[];
}>;
// 支付凭证管理
paymentVouchers: Array<{
id: string;
amount: number;
paymentMethod: string;
paymentTime: Date;
voucherFile: Parse.Object;
verifiedStatus: 'pending' | 'verified' | 'rejected';
ocrResult?: OCRResult;
notes?: string;
}>;
}
enum PaymentStatus {
PENDING = 'pending', // 待支付
OVERDUE = 'overdue', // 逾期
PARTIAL = 'partial', // 部分支付
PAID = 'paid', // 已支付
DISPUTED = 'disputed' // 争议中
}
支付凭证OCR识别结构:
interface OCRResult {
confidence: number; // 识别置信度
amount: number; // 识别金额
paymentMethod: string; // 支付方式
transactionId?: string; // 交易号
payerName?: string; // 付款人姓名
paymentTime?: Date; // 付款时间
merchantName?: string; // 收款商户
rawText: string; // 原始识别文本
warnings?: string[]; // 识别警告
}
graph TD
A[进入售后归档] --> B[加载尾款信息]
B --> C{是否已有尾款记录?}
C -->|否| D[从报价自动生成尾款]
C -->|是| E[显示现有尾款状态]
D --> F[按产品分摊尾款]
E --> G[尾款管理界面]
F --> G
G --> H{支付状态}
H -->|待支付| I[上传支付凭证]
H -->|已支付| J[显示凭证列表]
I --> K[OCR自动识别]
K --> L[人工确认信息]
L --> M[更新支付状态]
M --> N[尾款结清]
J --> N
N --> O[进入评价阶段]
interface CustomerEvaluation {
// 基础信息
evaluationId: string;
projectId: string;
customerId: string;
evaluationTime: Date;
// 整体评价
overallRating: {
score: number; // 综合评分 1-5
comments: string; // 整体评价
wouldRecommend: boolean; // 是否愿意推荐
improvementSuggestions: string[];
};
// 分维度评价
dimensionRatings: Array<{
dimension: 'design_quality' | 'service_attitude' | 'delivery_timeliness' | 'value_for_money';
score: number; // 维度评分
weight: number; // 权重
comments?: string; // 维度评价
}>;
// 产品级评价
productRatings: Array<{
productId: string;
productName: string;
spaceSatisfaction: number; // 空间满意度
designRating: number; // 设计评分
functionalityRating: number; // 功能性评分
issues: string[]; // 存在问题
improvements: string[]; // 改进建议
photos?: string[]; // 实际效果照片
}>;
// 评价验证
verification: {
isVerified: boolean;
verificationMethod: 'customer_confirmation' | 'project_completion' | 'payment_confirmation';
verificationTime: Date;
verifiedBy: string;
};
}
评价引导策略:
// 扩展ProjectFeedback表结构
interface EnhancedProjectFeedback extends ProjectFeedback {
// 产品关联
product?: Parse.Object;
// 多维度评分
dimensionScores?: {
designQuality: number; // 设计质量
serviceAttitude: number; // 服务态度
deliveryTimeliness: number; // 交付及时性
valueForMoney: number; // 性价比
};
// 评价上下文
context?: {
evaluationStage: string; // 评价阶段
touchpoints: string[]; // 接触点
emotions: string[]; // 情感标签
expectations: string[]; // 期望值
};
// 改进建议分类
improvementCategories?: {
design: string[]; // 设计改进
service: string[]; // 服务改进
process: string[]; // 流程改进
communication: string[]; // 沟通改进
};
// 推荐意愿
recommendationWillingness?: {
score: number; // 推荐评分 1-10
reasons: string[]; // 推荐原因
barriers?: string[]; // 推荐障碍
networkScope: string[]; // 愿意推荐的圈层
};
}
多维度数据采集:
interface ProjectRetrospectiveData {
// 项目基础信息
projectBasic: {
title: string;
type: string;
duration: number; // 实际工期(天)
budget: number; // 项目预算
teamSize: number; // 团队规模
productCount: number; // 空间数量
};
// 时间节点分析
timelineAnalysis: {
nodes: Array<{
stage: string; // 阶段名称
plannedStart: Date; // 计划开始时间
actualStart: Date; // 实际开始时间
plannedEnd: Date; // 计划结束时间
actualEnd: Date; // 实际结束时间
duration: number; // 阶段耗时
delayDays: number; // 延期天数
efficiency: number; // 效率评分
}>;
bottlenecks: string[]; // 瓶颈环节
criticalPath: string[]; // 关键路径
};
// 团队效能分析
teamPerformance: Array<{
memberId: string;
memberName: string;
role: string; // 角色类型
workload: number; // 工作负载
efficiency: number; // 执行效率
quality: number; // 工作质量
collaboration: number; // 协作表现
timeDistribution: {
design: number; // 设计时间占比
communication: number; // 沟通时间占比
revision: number; // 修改时间占比
admin: number; // 行政时间占比
};
contributions: Array<{
type: 'design' | 'review' | 'coordination' | 'problem_solving';
description: string;
impact: 'high' | 'medium' | 'low';
}>;
}>;
// 质量分析
qualityAnalysis: {
revisionRate: number; // 修改率
firstPassYield: number; // 一次通过率
customerSatisfaction: number; // 客户满意度
issueResolutionTime: number; // 问题解决时间
qualityEscalations: number; // 质量升级次数
productScores: Array<{
productId: string;
productName: string;
finalScore: number;
issues: string[];
highlights: string[];
}>;
};
// 财务分析
financialAnalysis: {
budgetVariance: number; // 预算偏差
profitMargin: number; // 利润率
costBreakdown: {
labor: number; // 人力成本
materials: number; // 材料成本
overhead: number; // 管理费用
revisions: number; // 修改成本
};
cashFlow: Array<{
period: string;
inflow: number;
outflow: number;
netFlow: number;
}>;
};
}
复盘生成算法:
class RetrospectiveGenerator {
/**
* 生成项目复盘报告
*/
async generateRetrospective(
projectData: ProjectData,
changeLogs: ProjectChange[],
teamMetrics: TeamMetrics
): Promise<RetrospectiveReport> {
// 1. 数据预处理
const processedData = await this.preprocessData(projectData, changeLogs);
// 2. 效率分析
const efficiencyAnalysis = this.analyzeEfficiency(processedData);
// 3. 质量分析
const qualityAnalysis = this.analyzeQuality(processedData);
// 4. 团队协作分析
const collaborationAnalysis = this.analyzeCollaboration(changeLogs, teamMetrics);
// 5. 客户满意度分析
const satisfactionAnalysis = this.analyzeCustomerSatisfaction(processedData);
// 6. 生成洞察和建议
const insights = await this.generateInsights({
efficiency: efficiencyAnalysis,
quality: qualityAnalysis,
collaboration: collaborationAnalysis,
satisfaction: satisfactionAnalysis
});
return {
summary: this.generateSummary(insights),
highlights: insights.highlights,
challenges: insights.challenges,
lessons: insights.lessons,
recommendations: insights.recommendations,
teamMetrics: this.formatTeamMetrics(teamMetrics),
detailedAnalysis: {
efficiency: efficiencyAnalysis,
quality: qualityAnalysis,
collaboration: collaborationAnalysis,
timeline: this.analyzeTimeline(processedData)
}
};
}
/**
* 分析项目效率
*/
private analyzeEfficiency(data: ProcessedData): EfficiencyAnalysis {
return {
overallEfficiency: this.calculateOverallEfficiency(data),
stageEfficiency: this.calculateStageEfficiency(data),
resourceUtilization: this.calculateResourceUtilization(data),
bottlenecks: this.identifyBottlenecks(data),
timeDistribution: this.analyzeTimeDistribution(data)
};
}
/**
* 识别项目瓶颈
*/
private identifyBottlenecks(data: ProcessedData): Array<{
stage: string;
issue: string;
impact: string;
suggestion: string;
severity: 'high' | 'medium' | 'low';
}> {
const bottlenecks = [];
// 分析时间瓶颈
const timeBottlenecks = this.analyzeTimeBottlenecks(data.timeline);
bottlenecks.push(...timeBottlenecks);
// 分析协作瓶颈
const collaborationBottlenecks = this.analyzeCollaborationBottlenecks(data.teamWork);
bottlenecks.push(...collaborationBottlenecks);
// 分析质量瓶颈
const qualityBottlenecks = this.analyzeQualityBottlenecks(data.quality);
bottlenecks.push(...qualityBottlenecks);
return bottlenecks.sort((a, b) => {
const severityOrder = { 'high': 3, 'medium': 2, 'low': 1 };
return severityOrder[b.severity] - severityOrder[a.severity];
});
}
}
个人效率指标:
interface TeamMemberEfficiency {
memberId: string;
memberName: string;
// 时间效率
timeEfficiency: {
plannedVsActual: number; // 计划vs实际时间比
taskCompletionRate: number; // 任务完成率
onTimeDeliveryRate: number; // 按时交付率
avgTaskDuration: number; // 平均任务耗时
};
// 质量效率
qualityEfficiency: {
firstPassYield: number; // 一次通过率
revisionRate: number; // 修改率
errorRate: number; // 错误率
customerRating: number; // 客户评分
};
// 协作效率
collaborationEfficiency: {
communicationFrequency: number; // 沟通频次
responseTime: number; // 响应时间
coordinationScore: number; // 协调评分
knowledgeSharing: number; // 知识分享
};
// 综合效率评分
overallEfficiency: {
score: number; // 综合评分 0-100
ranking: number; // 团队排名
strengths: string[]; // 优势领域
improvements: string[]; // 改进建议
};
}
典型项目场景识别:
interface ProjectScenarioAnalysis {
// 项目复杂度评估
complexityAssessment: {
scopeComplexity: number; // 范围复杂度
technicalComplexity: number; // 技术复杂度
coordinationComplexity: number; // 协调复杂度
clientComplexity: number; // 客户复杂度
overallComplexity: 'simple' | 'moderate' | 'complex' | 'highly_complex';
};
// 风险识别
riskIdentification: {
identifiedRisks: Array<{
riskType: 'timeline' | 'budget' | 'quality' | 'resource' | 'scope';
probability: number; // 发生概率 0-1
impact: number; // 影响程度 0-1
riskLevel: 'low' | 'medium' | 'high' | 'critical';
mitigation: string; // 缓解措施
owner: string; // 负责人
}>;
riskMitigationEffectiveness: number; // 风险缓解有效性
};
// 成功因素分析
successFactors: {
keySuccessFactors: string[]; // 关键成功因素
clientAlignment: number; // 客户对齐度
teamCapability: number; // 团队能力
processMaturity: number; // 流程成熟度
technologyFit: number; // 技术适配性
};
// 改进机会
improvementOpportunities: Array<{
area: string; // 改进领域
currentPerformance: number; // 当前绩效
targetPerformance: number; // 目标绩效
improvementPotential: number; // 改进潜力
requiredActions: string[]; // 必要行动
estimatedEffort: string; // 预估工作量
expectedBenefit: string; // 预期收益
}>;
}
interface AftercarePageArchitecture {
// 视图管理
currentView: 'overview' | 'payment' | 'evaluation' | 'retrospective' | 'archive';
// 数据状态
dataStatus: {
loading: boolean;
error?: string;
lastSyncTime?: Date;
};
// 权限控制
permissions: {
canEditPayment: boolean;
canViewEvaluation: boolean;
canSubmitEvaluation: boolean;
canGenerateRetrospective: boolean;
canArchive: boolean;
};
// 导航配置
navigation: {
steps: Array<{
id: string;
title: string;
icon: string;
status: 'pending' | 'in_progress' | 'completed';
enabled: boolean;
}>;
currentStep: number;
};
}
概览仪表板:
时间线: 项目关键节点时间轴
<!-- 概览视图模板 -->
<div class="aftercare-overview">
<!-- 进度卡片 -->
<div class="progress-cards">
<div class="progress-card" [class.completed]="paymentCompleted">
<div class="card-icon">💰</div>
<h3>验收尾款</h3>
<div class="progress-bar">
<div class="progress-fill" [style.width.%]="paymentProgress"></div>
</div>
<p class="status">{{ paymentStatusText }}</p>
</div>
<div class="progress-card" [class.completed]="evaluationCompleted">
<div class="card-icon">⭐</div>
<h3>客户评价</h3>
<div class="progress-bar">
<div class="progress-fill" [style.width.%]="evaluationProgress"></div>
</div>
<p class="status">{{ evaluationStatusText }}</p>
</div>
<div class="progress-card" [class.completed]="retrospectiveCompleted">
<div class="card-icon">📊</div>
<h3>项目复盘</h3>
<div class="progress-bar">
<div class="progress-fill" [style.width.%]="retrospectiveProgress"></div>
</div>
<p class="status">{{ retrospectiveStatusText }}</p>
</div>
</div>
<!-- 关键指标 -->
<div class="key-metrics">
<div class="metric-card">
<h4>尾款状态</h4>
<div class="metric-value">{{ finalPaymentAmount }}</div>
<div class="metric-change" [class.positive]="paymentTrend > 0">
{{ paymentTrend > 0 ? '↑' : '↓' }} {{ Math.abs(paymentTrend) }}%
</div>
</div>
<div class="metric-card">
<h4>客户满意度</h4>
<div class="metric-value">{{ customerSatisfaction }}/5.0</div>
<div class="metric-stars">
@for (star of [1,2,3,4,5]; track star) {
<span class="star" [class.filled]="star <= customerSatisfaction">★</span>
}
</div>
</div>
<div class="metric-card">
<h4>项目效率</h4>
<div class="metric-value">{{ projectEfficiency }}%</div>
<div class="metric-label">vs 行业平均</div>
</div>
</div>
</div>
<!-- 快速操作 -->
<div class="quick-actions">
<button class="action-btn" (click)="navigateToPayment()" [disabled]="!canEditPayment">
<span class="btn-icon">💰</span>
管理尾款
</button>
<button class="action-btn" (click)="navigateToEvaluation()" [disabled]="!canViewEvaluation">
<span class="btn-icon">⭐</span>
查看评价
</button>
<button class="action-btn" (click)="generateRetrospective()" [disabled]="!canGenerateRetrospective">
<span class="btn-icon">📊</span>
生成复盘
</button>
<button class="action-btn primary" (click)="archiveProject()" [disabled]="!canArchive">
<span class="btn-icon">📁</span>
归档项目
</button>
</div>
</div>
智能尾款管理:
提醒功能: 逾期提醒和付款通知
interface PaymentManagementComponent {
// 尾款数据
finalPayment: FinalPaymentModule;
// 产品分摊
productAllocation: Array<{
product: Parse.Object;
allocation: PaymentAllocation;
status: 'pending' | 'partial' | 'completed';
}>;
// OCR处理
ocrProcessing: {
isProcessing: boolean;
progress: number;
result?: OCRResult;
};
// 上传管理
uploadManagement: {
multipleUpload: boolean;
dragDropEnabled: boolean;
supportedFormats: string[];
maxFileSize: number;
};
}
交互式评价界面:
奖励机制: 评价完成后的客户激励
<!-- 客户评价模板 -->
<div class="customer-evaluation">
<!-- 评价引导 -->
<div class="evaluation-wizard">
<div class="wizard-steps">
<div class="step" [class.active]="currentStep === 1" [class.completed]="stepCompleted(1)">
<span class="step-number">1</span>
<span class="step-label">整体评价</span>
</div>
<div class="step" [class.active]="currentStep === 2" [class.completed]="stepCompleted(2)">
<span class="step-number">2</span>
<span class="step-label">分项评分</span>
</div>
<div class="step" [class.active]="currentStep === 3" [class.completed]="stepCompleted(3)">
<span class="step-number">3</span>
<span class="step-label">详细反馈</span>
</div>
<div class="step" [class.active]="currentStep === 4" [class.completed]="stepCompleted(4)">
<span class="step-number">4</span>
<span class="step-label">确认提交</span>
</div>
</div>
</div>
<!-- 评价内容 -->
<div class="evaluation-content">
<!-- 整体评价 -->
@if (currentStep === 1) {
<div class="overall-evaluation">
<h3>您对整体服务的评价如何?</h3>
<div class="rating-scale">
@for (rating of [1,2,3,4,5]; track rating) {
<button class="rating-btn" (click)="setOverallRating(rating)">
<span class="rating-number">{{ rating }}</span>
<span class="rating-label">{{ getRatingLabel(rating) }}</span>
</button>
}
</div>
<textarea
class="evaluation-textarea"
placeholder="请分享您的整体体验..."
[(ngModel)]="evaluation.overallComments">
</textarea>
</div>
}
<!-- 分项评分 -->
@if (currentStep === 2) {
<div class="dimension-evaluation">
@for (dimension of evaluationDimensions; track dimension) {
<div class="dimension-item">
<h4>{{ dimension.label }}</h4>
<p class="dimension-desc">{{ dimension.description }}</p>
<div class="star-rating">
@for (star of [1,2,3,4,5]; track star) {
<span
class="star"
[class.filled]="star <= dimension.rating"
(click)="setDimensionRating(dimension.key, star)">
★
</span>
}
</div>
</div>
}
</div>
}
<!-- 详细反馈 -->
@if (currentStep === 3) {
<div class="detailed-feedback">
<div class="feedback-section">
<h4>最喜欢的方面</h4>
<div class="feedback-tags">
@for (tag of positiveTags; track tag) {
<span class="feedback-tag" (click)="toggleTag(tag, 'positive')">
{{ tag }}
</span>
}
</div>
</div>
<div class="feedback-section">
<h4>希望改进的方面</h4>
<div class="feedback-tags">
@for (tag of improvementTags; track tag) {
<span class="feedback-tag" (click)="toggleTag(tag, 'improvement')">
{{ tag }}
</span>
}
</div>
</div>
<div class="feedback-section">
<h4>照片反馈</h4>
<div class="photo-upload">
<div class="upload-area" (drop)="onPhotoDrop($event)" (dragover)="onDragOver($event)">
<span class="upload-icon">📷</span>
<p>上传实际效果照片</p>
<input type="file" accept="image/*" multiple (change)="onPhotoSelect($event)">
</div>
<div class="uploaded-photos">
@for (photo of uploadedPhotos; track photo) {
<div class="photo-item">
<img [src]="photo.url" [alt]="photo.description">
<button class="remove-btn" (click)="removePhoto(photo.id)">×</button>
</div>
}
</div>
</div>
</div>
</div>
}
</div>
</div>
数据驱动复盘:
对比分析: 与历史项目和行业基准对比
interface RetrospectiveVisualization {
// 时间线可视化
timelineChart: {
type: 'gantt' | 'timeline';
data: Array<{
phase: string;
planned: DateRange;
actual: DateRange;
participants: string[];
efficiency: number;
}>;
};
// 效率分析图表
efficiencyCharts: {
radarChart: {
dimensions: string[];
teamData: number[][];
benchmarkData: number[];
};
barChart: {
categories: string[];
planned: number[];
actual: number[];
};
};
// 团队绩效矩阵
teamMatrix: {
members: string[];
metrics: string[];
data: number[][];
heatmap: boolean;
};
// 趋势分析
trendAnalysis: {
timeSeries: Array<{
date: Date;
efficiency: number;
quality: number;
satisfaction: number;
}>;
projections: Array<{
futureDate: Date;
predictedEfficiency: number;
confidence: number;
}>;
};
}
多设备适配:
多用户协同:
AI辅助功能:
class ProjectEfficiencyAnalyzer {
/**
* 计算整体项目效率
*/
calculateOverallEfficiency(projectData: ProjectData): EfficiencyScore {
const { plannedDuration, actualDuration, milestones, teamWorkload } = projectData;
// 时间效率 = 计划时间 / 实际时间
const timeEfficiency = Math.min(1.0, plannedDuration / actualDuration) * 100;
// 里程碑完成率
const milestoneCompletionRate = this.calculateMilestoneCompletionRate(milestones);
// 资源利用效率
const resourceUtilization = this.calculateResourceUtilization(teamWorkload);
// 质量效率(基于修改率)
const qualityEfficiency = this.calculateQualityEfficiency(projectData.quality);
// 综合效率评分(加权平均)
const weights = {
time: 0.3,
milestones: 0.25,
resources: 0.25,
quality: 0.2
};
const overallEfficiency =
timeEfficiency * weights.time +
milestoneCompletionRate * weights.milestones +
resourceUtilization * weights.resources +
qualityEfficiency * weights.quality;
return {
overallScore: Math.round(overallEfficiency),
timeEfficiency: Math.round(timeEfficiency),
milestoneCompletionRate: Math.round(milestoneCompletionRate),
resourceUtilization: Math.round(resourceUtilization),
qualityEfficiency: Math.round(qualityEfficiency),
grade: this.getEfficiencyGrade(overallEfficiency)
};
}
/**
* 识别效率瓶颈
*/
identifyEfficiencyBottlenecks(projectData: ProjectData): Array<{
stage: string;
issue: string;
impact: number;
suggestion: string;
priority: 'high' | 'medium' | 'low';
}> {
const bottlenecks = [];
// 分析各阶段效率
for (const stage of projectData.stages) {
const stageEfficiency = this.calculateStageEfficiency(stage);
if (stageEfficiency < 0.7) { // 效率低于70%
bottlenecks.push({
stage: stage.name,
issue: `${stage.name}阶段效率偏低`,
impact: (0.7 - stageEfficiency) * 100,
suggestion: this.generateEfficiencySuggestion(stage),
priority: stageEfficiency < 0.5 ? 'high' : 'medium'
});
}
}
// 分析团队协作问题
const collaborationIssues = this.analyzeCollaborationIssues(projectData);
bottlenecks.push(...collaborationIssues);
return bottlenecks.sort((a, b) => b.impact - a.impact);
}
}
}
class TeamPerformanceAnalyzer {
/**
* 评估团队成员绩效
*/
evaluateMemberPerformance(
memberId: string,
projectData: ProjectData,
changeLogs: ProjectChange[]
): TeamMemberPerformance {
// 获取成员相关的数据
const memberData = this.extractMemberData(memberId, projectData, changeLogs);
// 工作量评估
const workloadScore = this.evaluateWorkload(memberData);
// 效率评估
const efficiencyScore = this.evaluateEfficiency(memberData);
// 质量评估
const qualityScore = this.evaluateQuality(memberData);
// 协作评估
const collaborationScore = this.evaluateCollaboration(memberData, changeLogs);
// 创新评估
const innovationScore = this.evaluateInnovation(memberData);
// 综合绩效评分
const overallScore = this.calculateOverallScore({
workload: workloadScore,
efficiency: efficiencyScore,
quality: qualityScore,
collaboration: collaborationScore,
innovation: innovationScore
});
return {
memberId,
overallScore,
workloadScore,
efficiencyScore,
qualityScore,
collaborationScore,
innovationScore,
strengths: this.identifyStrengths({
workload: workloadScore,
efficiency: efficiencyScore,
quality: qualityScore,
collaboration: collaborationScore,
innovation: innovationScore
}),
improvements: this.identifyImprovements({
workload: workloadScore,
efficiency: efficiencyScore,
quality: qualityScore,
collaboration: collaborationScore,
innovation: innovationScore
}),
recommendations: this.generateRecommendations(overallScore),
ranking: this.calculateRanking(memberId, overallScore, projectData)
};
}
/**
* 分析协作表现
*/
private evaluateCollaboration(memberData: any, changeLogs: ProjectChange[]): number {
const collaborationMetrics = {
communicationFrequency: 0,
responseTime: 0,
coordinationScore: 0,
knowledgeSharing: 0,
conflictResolution: 0
};
// 分析ProjectChange中的协作行为
const memberChanges = changeLogs.filter(log =>
log.profile.objectId === memberData.memberId
);
for (const change of memberChanges) {
switch (change.changeType) {
case 'communication':
collaborationMetrics.communicationFrequency += 1;
break;
case 'coordination':
collaborationMetrics.coordinationScore += 1;
break;
case 'knowledge_sharing':
collaborationMetrics.knowledgeSharing += 1;
break;
case 'conflict_resolution':
collaborationMetrics.conflictResolution += 1;
break;
}
// 计算响应时间
if (change.duration && change.duration < 3600000) { // 1小时内响应
collaborationMetrics.responseTime += 1;
}
}
// 归一化评分
const maxChanges = Math.max(...Object.values(collaborationMetrics));
const normalizedMetrics = Object.fromEntries(
Object.entries(collaborationMetrics).map(([key, value]) => [
key,
maxChanges > 0 ? value / maxChanges : 0
])
);
// 加权平均
const weights = {
communicationFrequency: 0.25,
responseTime: 0.3,
coordinationScore: 0.2,
knowledgeSharing: 0.15,
conflictResolution: 0.1
};
return Object.entries(weights).reduce((score, [metric, weight]) => {
return score + normalizedMetrics[metric] * weight;
}, 0) * 100;
}
}
}
class SatisfactionAnalyzer {
/**
* 分析客户满意度趋势
*/
analyzeSatisfactionTrends(
projectData: ProjectData,
feedbackHistory: ProjectFeedback[]
): SatisfactionAnalysis {
// 计算当前满意度
const currentSatisfaction = this.calculateCurrentSatisfaction(feedbackHistory);
// 分析历史趋势
const trendAnalysis = this.analyzeHistoricalTrends(feedbackHistory);
// 识别满意度驱动因素
const drivers = this.identifySatisfactionDrivers(feedbackHistory);
// 预测满意度
const prediction = this.predictSatisfaction(projectData, drivers);
return {
currentScore: currentSatisfaction.overallScore,
dimensionScores: currentSatisfaction.dimensionScores,
trend: trendAnalysis,
keyDrivers: drivers,
prediction: prediction,
improvementAreas: this.identifyImprovementAreas(currentSatisfaction, drivers),
recommendations: this.generateSatisfactionRecommendations(currentSatisfaction, drivers)
};
}
/**
* 识别满意度关键驱动因素
*/
private identifySatisfactionDrivers(feedback: ProjectFeedback[]): Array<{
factor: string;
impact: number;
correlation: number;
description: string;
}> {
const drivers = [];
// 分析各维度与整体满意度的相关性
const dimensions = ['designQuality', 'serviceAttitude', 'deliveryTimeliness', 'valueForMoney'];
for (const dimension of dimensions) {
const correlation = this.calculateCorrelation(
feedback.map(f => this.getDimensionScore(f, dimension)),
feedback.map(f => f.rating || 0)
);
if (Math.abs(correlation) > 0.5) { // 相关性阈值
drivers.push({
factor: dimension,
impact: Math.abs(correlation) * 100,
correlation: correlation,
description: this.getDriverDescription(dimension, correlation)
});
}
}
return drivers.sort((a, b) => b.impact - a.impact);
}
}
}
class RetrospectiveInsightGenerator {
/**
* 生成项目复盘洞察
*/
async generateInsights(projectData: ProjectData): Promise<RetrospectiveInsights> {
// 1. 数据预处理和特征提取
const features = await this.extractFeatures(projectData);
// 2. 模式识别
const patterns = this.identifyPatterns(features);
// 3. 异常检测
const anomalies = this.detectAnomalies(features);
// 4. 根因分析
const rootCauses = this.analyzeRootCauses(patterns, anomalies);
// 5. 生成洞察
const insights = await this.generateInsightsFromData(patterns, anomalies, rootCauses);
return {
summary: this.generateExecutiveSummary(insights),
highlights: insights.highlights,
challenges: insights.challenges,
rootCauses: insights.rootCauses,
lessons: insights.lessons,
recommendations: insights.recommendations,
actionItems: this.generateActionItems(insights),
riskFactors: this.identifyFutureRisks(insights),
successFactors: this.identifySuccessFactors(insights)
};
}
/**
* 识别项目模式
*/
private identifyPatterns(features: ProjectFeatures): Array<{
type: 'positive' | 'negative' | 'neutral';
pattern: string;
confidence: number;
evidence: string[];
impact: string;
}> {
const patterns = [];
// 识别高效模式
if (features.efficiencyPattern === 'consistent_high') {
patterns.push({
type: 'positive',
pattern: '持续高效执行',
confidence: 0.85,
evidence: [
'各阶段效率均高于80%',
'里程碑按时完成率100%',
'资源利用率稳定在75%-85%'
],
impact: '项目执行效率优秀,团队协作顺畅'
});
}
// 识别协作问题模式
if (features.collaborationIssues.length > 2) {
patterns.push({
type: 'negative',
pattern: '跨团队协作障碍',
confidence: 0.75,
evidence: features.collaborationIssues,
impact: '影响项目进度,增加沟通成本'
});
}
// 识别客户需求变化模式
if (features.requirementChanges > 3) {
patterns.push({
type: 'neutral',
pattern: '需求频繁变更',
confidence: 0.8,
evidence: [
`需求变更次数: ${features.requirementChanges}`,
'平均变更间隔: 7天',
'变更影响范围: 中等'
],
impact: '需要加强需求管理和变更控制'
});
}
return patterns;
}
}
通过重新设计项目售后归档模块,实现了:
✅ 完整功能覆盖 - 验收尾款、客户评价、项目复盘三大核心功能 ✅ 智能化升级 - OCR识别、AI复盘、智能评价引导 ✅ 数据驱动决策 - 多维度数据分析和洞察生成 ✅ 用户体验优化 - 响应式设计、实时协作、智能辅助 ✅ 科学绩效评估 - 团队成员效率的量化分析和评估
该方案将为项目管理提供强大的数据支持,帮助团队持续改进和优化项目执行效率。