位置: Project.data.requirementsConfirmed* 字段组
// 确认需求阶段完成时保存的字段
data.requirementsConfirmed = true; // 是否已确认需求
data.requirementsConfirmedBy = this.currentUser.id; // 确认人ID
data.requirementsConfirmedByName = this.currentUser.get('name'); // 确认人姓名
data.requirementsConfirmedAt = new Date().toISOString(); // 确认时间 (ISO字符串)
文件位置: src/modules/project/pages/project-detail/stages/stage-requirements.component.ts:1363-1366
阶段标识符:
white_model - 白模阶段soft_decor - 软装阶段rendering - 渲染阶段post_process - 后期阶段位置: Project.data.deliveryStageStatus 对象
// 每个子阶段的状态结构
deliveryStageStatus: {
[stageId: string]: {
status: 'not_started' | 'in_progress' | 'completed' | 'approved' | 'rejected';
startedAt?: string; // 开始时间
completedAt?: string; // 完成时间
approvedAt?: string; // 审批通过时间
rejectedAt?: string; // 审批驳回时间
approvedBy?: string; // 审批人ID
rejectionReason?: string; // 驳回原因
}
}
示例:
data.deliveryStageStatus = {
white_model: {
status: 'approved',
startedAt: '2024-01-01T09:00:00.000Z',
completedAt: '2024-01-05T17:00:00.000Z',
approvedAt: '2024-01-06T10:00:00.000Z',
approvedBy: 'userId123'
},
soft_decor: {
status: 'in_progress',
startedAt: '2024-01-06T09:00:00.000Z'
},
rendering: {
status: 'not_started'
},
post_process: {
status: 'not_started'
}
}
文件位置: src/modules/project/pages/project-detail/stages/stage-delivery.component.ts:391-400
主要字段:
interface Product {
id: string;
project: Pointer<Project>; // 关联项目
productName: string; // 产品/空间名称
productType: string; // 产品类型
status: string; // 状态 ('not_started' | 'in_progress' | 'completed')
// 空间信息
space: {
spaceName: string; // 空间名称
area: number; // 面积
dimensions: { // 尺寸
length: number;
width: number;
height: number;
};
features: string[]; // 空间特征
constraints: string[]; // 限制条件
priority: number; // 优先级 (1-10)
complexity: string; // 复杂度 ('simple' | 'medium' | 'complex')
};
// 报价信息
quotation: {
price: number; // 价格
currency: string; // 货币
breakdown: object; // 价格明细
status: string; // 报价状态
validUntil: Date; // 有效期
};
// 需求信息
requirements: {
colorRequirement: object; // 色彩需求
spaceStructureRequirement: object; // 空间结构需求
materialRequirement: object; // 材质需求
lightingRequirement: object; // 照明需求
specificRequirements: object; // 特殊需求
};
profile: Pointer<Profile>; // 设计师
images: string[]; // 空间图片URLs
}
位置: Project.data.quotation.spaces 数组
// 报价明细中的空间信息
data.quotation = {
spaces: [
{
name: string; // 空间名称 (如: "客厅", "主卧", "厨房")
type: string; // 空间类型 (如: "living", "bedroom", "kitchen")
area: number; // 面积 (平方米)
price: number; // 单价
totalPrice: number; // 总价
description?: string; // 描述
productId?: string; // 关联的Product ID (如果已创建)
}
],
totalPrice: number; // 总价
currency: string; // 货币
validUntil: Date; // 有效期
}
从Product表提取:
// 获取项目所有产品空间
const products = await productSpaceService.getProjectProductSpaces(projectId);
products.forEach(product => {
const spaceName = product.name || product.space?.spaceName;
const spaceType = product.type || product.space?.spaceType;
const area = product.space?.area;
const complexity = product.space?.complexity;
const priority = product.space?.priority;
const status = product.status;
});
从Project.data提取:
// 从报价明细提取空间信息
const data = project.get('data') || {};
const quotationSpaces = data.quotation?.spaces || [];
quotationSpaces.forEach(space => {
const spaceName = space.name;
const spaceType = space.type;
const area = space.area;
const price = space.price;
const productId = space.productId; // 关联的Product记录
});
// ✅ 已在确认需求阶段添加:阶段时间轴字段
data.phaseDeadlines = {
modeling: {
startDate: Date;
deadline: Date;
estimatedDays: number;
status: 'not_started' | 'in_progress' | 'completed';
priority: 'high' | 'medium' | 'low';
};
softDecor: { /* 同上结构 */ };
rendering: { /* 同上结构 */ };
postProcessing: { /* 同上结构 */ };
};
// ✅ 已在确认需求阶段初始化,交付执行阶段动态更新:空间交付物汇总
data.spaceDeliverableSummary = {
[productId: string]: {
spaceName: string;
totalDeliverables: number;
completedDeliverables: number;
completionRate: number;
lastUpdateTime: string;
phaseProgress: {
white_model: number; // 0-100 (审批通过=100, 待审批=80, 驳回=50)
soft_decor: number;
rendering: number;
post_process: number;
};
};
overallCompletionRate: number; // 整体完成率
};
// ✅ 已在确认需求阶段添加:需求确认详细信息
data.requirementsDetail = {
globalRequirements: object; // 全局需求
spaceRequirements: object[]; // 空间需求
crossSpaceRequirements: object[]; // 跨空间需求
referenceImages: object[]; // 参考图片信息
cadFiles: object[]; // CAD文件信息
aiAnalysisResults: object; // AI分析结果
confirmedAt: string; // 确认时间
};
// ✅ 已在需求阶段和交付阶段文件上传时添加:文件关联信息
data.spaceId = string; // 关联的空间/产品ID
data.deliveryType = string; // 交付类型标识
data.uploadedFor = string; // 上传用途
data.uploadStage = string; // 上传阶段 ('requirements' | 'delivery')
// ✅ 已添加:AI分析结果结构
data.analysis = {
ai: {
// 图片分析结果
styleElements?: string[];
colorPalette?: string[];
materialAnalysis?: string[];
layoutFeatures?: string[];
mood?: string;
confidence?: number;
// CAD分析结果
spaceStructure?: object;
dimensions?: object;
constraints?: string[];
opportunities?: string[];
// 通用字段
analyzedAt: string;
version: string;
source: string;
};
manual: object | null; // 手动分析结果
lastAnalyzedAt: string | null; // 最后分析时间
// 交付文件专用字段
qualityScore?: number | null; // 质量评分
designCompliance?: object | null; // 设计合规性
};
// ✅ 需求阶段CAD文件额外字段
data.cadFormat = string; // CAD格式 (dwg/dxf/pdf)
// ✅ 交付阶段文件额外字段
data.approvalStatus = string; // 审批状态 ('unverified' | 'pending' | 'approved' | 'rejected')
确认需求阶段 (stage-requirements.component.ts):
requirementsDetail - 需求确认详细信息 (行1368-1390)phaseDeadlines - 阶段截止时间初始化 (行1392-1436)spaceDeliverableSummary - 空间交付物汇总初始化 (行1438-1467)ProjectFile.data 补充 (行445-459)ProjectFile.data 补充 (行607-626)ProjectFile.data.analysis.ai (行802-833)交付执行阶段 (stage-delivery.component.ts):
ProjectFile.data 补充 (行685-703)spaceDeliverableSummary 动态更新 (行1569, 1863-1929)const project = await projectQuery.get(projectId);
const data = project.get('data') || {};
const requirementsConfirmedAt = data.requirementsConfirmedAt; // ISO字符串
const confirmedTime = new Date(requirementsConfirmedAt);
const data = project.get('data') || {};
const deliveryStatus = data.deliveryStageStatus || {};
// 获取白模阶段状态
const whiteModelStatus = deliveryStatus.white_model?.status || 'not_started';
const whiteModelApprovedAt = deliveryStatus.white_model?.approvedAt;
// 检查所有阶段完成情况
const allStages = ['white_model', 'soft_decor', 'rendering', 'post_process'];
const completedStages = allStages.filter(stage =>
deliveryStatus[stage]?.status === 'approved'
);
// 方法1: 从Product表获取
const products = await productSpaceService.getProjectProductSpaces(projectId);
const spaceScenes = products.map(p => ({
id: p.id,
name: p.name,
type: p.type,
area: p.space?.area,
status: p.status,
complexity: p.space?.complexity
}));
// 方法2: 从Project.data获取
const data = project.get('data') || {};
const quotationSpaces = data.quotation?.spaces || [];
const spaceScenes = quotationSpaces.map(s => ({
name: s.name,
type: s.type,
area: s.area,
price: s.price,
productId: s.productId
}));
query.include('contact', 'assignee', 'department')query.limit(100).skip(offset)文档生成时间: 2025-11-13
基于代码版本: yss-project latest
分析覆盖文件: