project_fields_analysis.md 11 KB

项目字段结构分析文档

1. 确认需求阶段字段

1.1 确认需求按钮时间字段

位置: 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

2. 交付执行阶段字段

2.1 交付执行四个子阶段

阶段标识符:

  • white_model - 白模阶段
  • soft_decor - 软装阶段
  • rendering - 渲染阶段
  • post_process - 后期阶段

2.2 阶段状态字段

位置: 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

3. 产品空间场景字段分析

3.1 Product表结构 (产品空间)

主要字段:

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
}

3.2 Project表中的空间场景字段

位置: 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;         // 有效期
}

3.3 空间场景提取逻辑

从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记录
});

4. 已补充的字段结构

4.1 Project.data 中已添加的字段

// ✅ 已在确认需求阶段添加:阶段时间轴字段
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;           // 确认时间
};

4.2 ProjectFile.data 中已添加的字段

// ✅ 已在需求阶段和交付阶段文件上传时添加:文件关联信息
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')

4.3 字段补充实现位置

确认需求阶段 (stage-requirements.component.ts):

  • requirementsDetail - 需求确认详细信息 (行1368-1390)
  • phaseDeadlines - 阶段截止时间初始化 (行1392-1436)
  • spaceDeliverableSummary - 空间交付物汇总初始化 (行1438-1467)
  • ✅ 参考图片 ProjectFile.data 补充 (行445-459)
  • ✅ CAD文件 ProjectFile.data 补充 (行607-626)
  • ✅ AI分析结果保存到 ProjectFile.data.analysis.ai (行802-833)

交付执行阶段 (stage-delivery.component.ts):

  • ✅ 交付文件 ProjectFile.data 补充 (行685-703)
  • spaceDeliverableSummary 动态更新 (行1569, 1863-1929)
  • ✅ 审批状态变更时更新交付物进度

5. 字段使用示例

5.1 获取确认需求时间

const project = await projectQuery.get(projectId);
const data = project.get('data') || {};
const requirementsConfirmedAt = data.requirementsConfirmedAt; // ISO字符串
const confirmedTime = new Date(requirementsConfirmedAt);

5.2 获取交付阶段状态

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'
);

5.3 获取空间场景信息

// 方法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
}));

6. 数据同步建议

6.1 确保数据一致性

  • Product表中的空间信息应与Project.data.quotation.spaces保持同步
  • 交付阶段状态变更时,同时更新Project.currentStage字段
  • 空间名称修改时,同步更新所有关联的ProjectFile记录

6.2 性能优化

  • 使用include查询减少网络请求: query.include('contact', 'assignee', 'department')
  • 批量操作时使用Parse.Object.saveAll()
  • 大数据量时使用分页查询: query.limit(100).skip(offset)

文档生成时间: 2025-11-13
基于代码版本: yss-project latest
分析覆盖文件:

  • stage-requirements.component.ts
  • stage-delivery.component.ts
  • product-space.service.ts
  • 相关数据模型定义