SPACE_DELETE_TEST_GUIDE.md 10 KB

空间删除同步测试指南

🔧 最新修复内容

问题诊断

您报告的问题:

  • ✅ 订单分配阶段:删除后显示5个空间
  • ❌ 确认需求阶段:仍显示9个空间
  • ❌ 交付执行阶段:仍显示9个空间
  • ❌ 设计师分配弹窗:仍显示9个空间

根本原因

  1. 数据未保存到数据库deleteSpace方法调用了saveUnifiedSpaceData,但之后又调用了regenerateQuotationFromSpaces,而后者只更新本地数据,没有保存到数据库
  2. 报价数据不完整:传递给saveUnifiedSpaceData的数据中,quotation.processes是空对象,导致报价明细丢失

修复方案

1. 完善deleteSpace方法的数据同步逻辑

修改前的问题

// ❌ 旧代码
await this.productSpaceService.saveUnifiedSpaceData(projectId, unifiedSpaces);
await this.regenerateQuotationFromSpaces(); // 只更新本地,未保存到数据库

修改后的正确逻辑

// ✅ 新代码
// 1. 从本地列表移除空间
this.projectSpaces = this.projectSpaces.filter(s => s.id !== spaceId);

// 2. 同时从报价数据中移除
this.quotation.spaces = this.quotation.spaces.filter((s: any) => s.spaceId !== spaceId);

// 3. 构建完整的统一空间数据(包含processes)
const unifiedSpaces = this.projectSpaces.map(space => {
  const quotationSpace = this.quotation.spaces.find((q: any) => q.spaceId === space.id);
  return {
    ...space,
    quotation: {
      price: quotationSpace?.subtotal || 0,
      processes: quotationSpace?.processes || {}, // 保留完整的工序信息
      subtotal: quotationSpace?.subtotal || 0
    }
  };
});

// 4. 保存到统一存储(自动同步到Project.data和Product表)
await this.productSpaceService.saveUnifiedSpaceData(projectId, unifiedSpaces);

// 5. 重新加载项目数据以获取最新同步结果
const query = new Parse.Query('Project');
this.project = await query.get(this.project.id);

// 6. 更新本地quotation数据
const data = this.project.get('data') || {};
if (data.quotation) {
  this.quotation = data.quotation;
}

🧪 测试步骤

测试前准备

  1. 清除浏览器缓存

    • Ctrl + Shift + Delete
    • 选择"缓存的图像和文件"
    • 点击"清除数据"
  2. 硬刷新页面

    • Ctrl + F5 (Windows)
    • Cmd + Shift + R (Mac)
  3. 打开浏览器控制台

    • F12
    • 切换到"Console"标签

测试场景 1:删除空间并验证同步

步骤 1:进入订单分配阶段

  1. 打开项目详情页
  2. 进入"订单分配"阶段
  3. 查看当前空间数量(例如:9个)
  4. 记录空间名称

预期结果

  • 显示所有空间(例如:厨房、客厅、次卧、儿童房、主卧、厨房、书房、阳台、卫生间)

步骤 2:删除空间

  1. 点击某个空间的删除按钮(例如:删除"儿童房")
  2. 确认删除
  3. 等待提示"空间删除成功"

预期结果

  • 本地列表立即更新,不再显示"儿童房"
  • 控制台输出:

    🗑️ [订单分配] 开始删除空间: space_xxx
    ✅ [订单分配] 空间删除成功,剩余 8 个空间
    ✅ [订单分配] 项目数据已刷新,报价空间数: 8
    

步骤 3:验证确认需求阶段

  1. 切换到"确认需求"阶段
  2. 查看空间列表

预期结果

  • ✅ 显示8个空间(不包含"儿童房")
  • 控制台输出:

    🔄 [需求确认] 开始加载项目空间...
    ✅ [需求确认] 从统一存储加载到 8 个空间
    ✅ [需求确认] 空间加载完成,共 8 个空间
    

步骤 4:验证交付执行阶段

  1. 切换到"交付执行"阶段
  2. 查看空间列表

预期结果

  • ✅ 显示8个空间(不包含"儿童房")
  • 控制台输出:

    🔄 [交付执行] 开始加载项目空间...
    ✅ [交付执行] 从统一存储加载到 8 个空间
    ✅ [交付执行] 空间加载完成,共 8 个空间
    

步骤 5:验证设计师分配弹窗

  1. 返回"订单分配"阶段
  2. 点击"分配设计师"按钮
  3. 查看空间列表

预期结果

  • ✅ 显示8个空间(不包含"儿童房")
  • 控制台输出:

    🔄 [设计师分配] 开始加载项目空间...
    ✅ [设计师分配] 从统一存储加载到 8 个空间
    ✅ [设计师分配] 空间加载完成,共 8 个空间: ['厨房', '客厅', ...]
    

测试场景 2:连续删除多个空间

步骤 1:删除第一个空间

  1. 在订单分配阶段删除"书房"
  2. 等待删除成功

步骤 2:删除第二个空间

  1. 继续删除"阳台"
  2. 等待删除成功

步骤 3:删除第三个空间

  1. 继续删除"卫生间"
  2. 等待删除成功

预期结果

  • 订单分配阶段:剩余5个空间
  • 确认需求阶段:显示5个空间 ✅
  • 交付执行阶段:显示5个空间 ✅
  • 设计师分配弹窗:显示5个空间 ✅

测试场景 3:刷新页面后验证持久化

步骤 1:删除空间

  1. 在订单分配阶段删除2个空间
  2. 等待删除成功

步骤 2:刷新页面

  1. F5 刷新页面
  2. 等待页面加载完成

步骤 3:验证各阶段

  1. 检查订单分配阶段:应显示剩余空间数
  2. 检查确认需求阶段:应显示相同数量
  3. 检查交付执行阶段:应显示相同数量
  4. 检查设计师分配弹窗:应显示相同数量

预期结果

  • ✅ 所有阶段显示相同的空间数量
  • ✅ 数据已正确持久化到数据库

🔍 调试方法

查看控制台日志

所有阶段都有详细的日志输出,可以帮助诊断问题:

订单分配阶段删除空间时:

🗑️ [订单分配] 开始删除空间: space_xxx
✅ [订单分配] 空间删除成功,剩余 5 个空间
✅ [订单分配] 项目数据已刷新,报价空间数: 5

确认需求阶段加载时:

🔄 [需求确认] 开始加载项目空间...
✅ [需求确认] 从统一存储加载到 5 个空间
✅ [需求确认] 空间加载完成,共 5 个空间

交付执行阶段加载时:

🔄 [交付执行] 开始加载项目空间...
✅ [交付执行] 从统一存储加载到 5 个空间
✅ [交付执行] 空间加载完成,共 5 个空间

设计师分配弹窗加载时:

🔄 [设计师分配] 开始加载项目空间...
✅ [设计师分配] 从统一存储加载到 5 个空间
✅ [设计师分配] 空间加载完成,共 5 个空间: ['厨房', '客厅', ...]

手动检查数据库

在浏览器控制台执行以下代码:

// 1. 获取当前项目
const projectId = '你的项目ID';
const Parse = window.Parse || FmodeParse.with('nova');
const query = new Parse.Query('Project');
const project = await query.get(projectId);

// 2. 查看统一空间数据
const data = project.get('data');
console.log('📊 unifiedSpaces:', data.unifiedSpaces);
console.log('📊 unifiedSpaces数量:', data.unifiedSpaces?.length);

// 3. 查看报价空间数据
console.log('📊 quotation.spaces:', data.quotation?.spaces);
console.log('📊 quotation.spaces数量:', data.quotation?.spaces?.length);

// 4. 查看Product表数据
const productQuery = new Parse.Query('Product');
productQuery.equalTo('project', project.toPointer());
productQuery.notEqualTo('isDeleted', true);
const products = await productQuery.find();
console.log('📊 Product表数量:', products.length);
console.log('📊 Product列表:', products.map(p => p.get('productName')));

预期结果

📊 unifiedSpaces数量: 5
📊 quotation.spaces数量: 5
📊 Product表数量: 5
✅ 三个数据源的数量一致

❌ 常见问题排查

问题 1:删除后其他阶段仍显示旧数据

可能原因

  1. 浏览器缓存未清除
  2. 页面未刷新

解决方案

  1. 清除浏览器缓存
  2. 硬刷新页面(Ctrl + F5)
  3. 关闭浏览器重新打开

问题 2:控制台显示"从Product表加载"而不是"从统一存储加载"

可能原因

  • Project.data.unifiedSpaces为空,系统回退到Product表

解决方案

  1. 在订单分配阶段重新保存一次
  2. 或者手动执行数据修复:

    const productSpaceService = // 获取service实例
    await productSpaceService.forceRepairSpaceData(projectId);
    

问题 3:删除空间后报价总额未更新

可能原因

  • 报价计算逻辑未触发

解决方案

  • 这是正常的,删除空间后会自动重新计算报价总额
  • 如果未更新,请刷新页面

✅ 验收标准

必须满足的条件:

  1. 数据一致性

    • ✅ 订单分配阶段删除空间后,本地列表立即更新
    • ✅ 确认需求阶段显示相同数量的空间
    • ✅ 交付执行阶段显示相同数量的空间
    • ✅ 设计师分配弹窗显示相同数量的空间
  2. 数据持久化

    • ✅ 刷新页面后,所有阶段仍显示正确的空间数量
    • Project.data.unifiedSpaces数量正确
    • Project.data.quotation.spaces数量正确
    • ✅ Product表记录数量正确
  3. 报价数据完整性

    • ✅ 删除空间后,剩余空间的报价明细(processes)保持完整
    • ✅ 报价总额正确更新
  4. 用户体验

    • ✅ 删除操作响应快速(< 2秒)
    • ✅ 有明确的成功提示
    • ✅ 控制台有详细的日志输出

📝 测试报告模板

请按照以下格式提供测试结果:

## 测试结果

### 测试环境
- 浏览器: Chrome/Firefox/Safari
- 版本: xxx
- 项目ID: xxx

### 测试场景 1:删除单个空间
- [ ] 订单分配阶段删除成功
- [ ] 确认需求阶段显示正确
- [ ] 交付执行阶段显示正确
- [ ] 设计师分配弹窗显示正确

### 测试场景 2:连续删除多个空间
- [ ] 第一次删除成功
- [ ] 第二次删除成功
- [ ] 第三次删除成功
- [ ] 所有阶段数量一致

### 测试场景 3:刷新页面验证
- [ ] 刷新前数据正确
- [ ] 刷新后数据保持一致
- [ ] 数据库数据正确

### 控制台日志

粘贴控制台日志...


### 截图
- 订单分配阶段截图
- 确认需求阶段截图
- 交付执行阶段截图
- 设计师分配弹窗截图

### 问题描述
如果有问题,请详细描述...

测试完成时间: ___________
测试人员: ___________
测试结果: ✅ 通过 / ❌ 未通过