根据您的需求,我已经实现了一个封装的函数(服务),用于计算项目中的空间数量和每个空间对应的交付物上传状态。这个服务可以方便地在不同的地方使用,如组长端的项目负载时间轴图等。
文件:src/modules/project/services/project-space-deliverable.service.ts
功能特性:
核心方法:
// 获取项目完整统计
getProjectSpaceDeliverableSummary(projectId: string)
// 检查是否全部完成
isAllSpacesDelivered(projectId: string)
// 获取未完成空间列表
getIncompleteSpaces(projectId: string)
// 获取项目交付进度百分比
getProjectDeliveryProgress(projectId: string)
// 获取状态标签和颜色
getDeliveryStatusLabel(completionRate: number)
getDeliveryStatusColor(completionRate: number)
文件:src/app/pages/team-leader/project-timeline/project-timeline.ts
集成内容:
新增方法:
loadSpaceDeliverableData() // 加载统计数据
getSpaceDeliverableSummary(projectId) // 获取统计摘要
getProjectSpaceCount(projectId) // 获取空间数量
getProjectDeliveredSpaceCount(projectId) // 获取已完成空间数
getProjectDeliveryCompletionRate(projectId) // 获取完成率
getProjectDeliveryStatusText(projectId) // 获取状态文本
getProjectDeliveryStatusColor(projectId) // 获取状态颜色
formatSpaceDeliverableTooltip(projectId) // 格式化提示文本
文件:
src/app/pages/team-leader/project-timeline/project-timeline.htmlsrc/app/pages/team-leader/project-timeline/project-timeline.scss显示内容:
📦 2/3 (已完成空间/总空间)📦 空间 2/3 | 文件 15颜色规则:
#94a3b8#fbbf24#fb923c#60a5fa#818cf8#34d399完整使用指南:docs/PROJECT-SPACE-DELIVERABLE-SERVICE-GUIDE.md
快速开始指南:docs/PROJECT-SPACE-DELIVERABLE-QUICK-START.md
{
spaceId: string; // 空间ID
spaceName: string; // 空间名称
spaceType: string; // 空间类型(客厅、卧室等)
deliverableTypes: {
whiteModel: number; // 白模文件数
softDecor: number; // 软装文件数
rendering: number; // 渲染文件数
postProcess: number; // 后期文件数
};
totalFiles: number; // 总文件数
hasDeliverables: boolean; // 是否已上传交付物
completionRate: number; // 完成度(0-100)
}
{
projectId: string; // 项目ID
projectName: string; // 项目名称
totalSpaces: number; // 空间总数
spacesWithDeliverables: number; // 已上传交付物的空间数
spaces: SpaceDeliverableInfo[]; // 空间详细列表
totalDeliverableFiles: number; // 总交付文件数
totalByType: { // 各类型总计
whiteModel: number;
softDecor: number;
rendering: number;
postProcess: number;
};
overallCompletionRate: number; // 整体完成率(0-100)
}
// 在时间轴中显示每个项目的空间统计
const summary = await this.projectSpaceDeliverableService
.getProjectSpaceDeliverableSummary(projectId);
console.log(`项目有 ${summary.totalSpaces} 个空间`);
console.log(`已完成 ${summary.spacesWithDeliverables} 个空间`);
console.log(`完成率 ${summary.overallCompletionRate}%`);
const isCompleted = await this.projectSpaceDeliverableService
.isAllSpacesDelivered(projectId);
if (!isCompleted) {
const incompleteSpaces = await this.projectSpaceDeliverableService
.getIncompleteSpaces(projectId);
alert(`以下空间还未完成:${incompleteSpaces.join(', ')}`);
}
const progress = await this.projectSpaceDeliverableService
.getProjectDeliveryProgress(projectId);
const color = this.projectSpaceDeliverableService
.getDeliveryStatusColor(progress);
const label = this.projectSpaceDeliverableService
.getDeliveryStatusLabel(progress);
console.log(`进度:${progress}% - ${label} - 颜色:${color}`);
src/modules/project/services/project-space-deliverable.service.ts - 核心服务src/app/pages/team-leader/project-timeline/project-timeline.ts - 时间轴集成src/app/pages/team-leader/project-timeline/project-timeline.html - 时间轴UIsrc/app/pages/team-leader/project-timeline/project-timeline.scss - 时间轴样式docs/PROJECT-SPACE-DELIVERABLE-SERVICE-GUIDE.md - 完整使用指南docs/PROJECT-SPACE-DELIVERABLE-QUICK-START.md - 快速开始指南PROJECT-SPACE-DELIVERABLE-IMPLEMENTATION-SUMMARY.md - 实现总结(本文档)describe('ProjectSpaceDeliverableService', () => {
it('应该正确计算项目空间数量', async () => {
const summary = await service.getProjectSpaceDeliverableSummary('project1');
expect(summary.totalSpaces).toBeGreaterThan(0);
});
it('应该正确统计交付物', async () => {
const summary = await service.getProjectSpaceDeliverableSummary('project1');
expect(summary.totalDeliverableFiles).toBeGreaterThanOrEqual(0);
});
it('应该正确计算完成率', async () => {
const progress = await service.getProjectDeliveryProgress('project1');
expect(progress).toBeGreaterThanOrEqual(0);
expect(progress).toBeLessThanOrEqual(100);
});
});
describe('ProjectTimeline - Space Deliverable Integration', () => {
it('应该在时间轴中显示空间统计', async () => {
await component.loadSpaceDeliverableData();
const summary = component.getSpaceDeliverableSummary('project1');
expect(summary).toBeDefined();
expect(summary?.totalSpaces).toBeGreaterThan(0);
});
it('应该显示正确的状态颜色', () => {
const color = component.getProjectDeliveryStatusColor('project1');
expect(color).toBeDefined();
expect(color).toMatch(/^#[0-9a-f]{6}$/i);
});
});
如有问题或需要进一步的功能扩展,请:
docs/PROJECT-SPACE-DELIVERABLE-SERVICE-GUIDE.mddocs/PROJECT-SPACE-DELIVERABLE-QUICK-START.md本次实现完成了一个完整的、可复用的项目空间与交付物统计功能:
✅ 封装的服务:易于使用和维护 ✅ 时间轴集成:直观显示项目进度 ✅ 完整文档:便于理解和使用 ✅ 性能优化:支持缓存和批量加载 ✅ 扩展性强:可以轻松应用到其他地方
这个功能将帮助组长更好地了解每个项目的空间配置和交付进度,提高项目管理效率!
实现日期:2025-11-08 版本:v1.0.0