您报告的问题:
deleteSpace方法调用了saveUnifiedSpaceData,但之后又调用了regenerateQuotationFromSpaces,而后者只更新本地数据,没有保存到数据库saveUnifiedSpaceData的数据中,quotation.processes是空对象,导致报价明细丢失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;
}
清除浏览器缓存
Ctrl + Shift + Delete硬刷新页面
Ctrl + F5 (Windows)Cmd + Shift + R (Mac)打开浏览器控制台
F12预期结果:
预期结果:
控制台输出:
🗑️ [订单分配] 开始删除空间: space_xxx
✅ [订单分配] 空间删除成功,剩余 8 个空间
✅ [订单分配] 项目数据已刷新,报价空间数: 8
预期结果:
控制台输出:
🔄 [需求确认] 开始加载项目空间...
✅ [需求确认] 从统一存储加载到 8 个空间
✅ [需求确认] 空间加载完成,共 8 个空间
预期结果:
控制台输出:
🔄 [交付执行] 开始加载项目空间...
✅ [交付执行] 从统一存储加载到 8 个空间
✅ [交付执行] 空间加载完成,共 8 个空间
预期结果:
控制台输出:
🔄 [设计师分配] 开始加载项目空间...
✅ [设计师分配] 从统一存储加载到 8 个空间
✅ [设计师分配] 空间加载完成,共 8 个空间: ['厨房', '客厅', ...]
预期结果:
F5 刷新页面预期结果:
所有阶段都有详细的日志输出,可以帮助诊断问题:
🗑️ [订单分配] 开始删除空间: 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
✅ 三个数据源的数量一致
可能原因:
解决方案:
可能原因:
Project.data.unifiedSpaces为空,系统回退到Product表解决方案:
或者手动执行数据修复:
const productSpaceService = // 获取service实例
await productSpaceService.forceRepairSpaceData(projectId);
可能原因:
解决方案:
数据一致性
数据持久化
Project.data.unifiedSpaces数量正确Project.data.quotation.spaces数量正确报价数据完整性
用户体验
请按照以下格式提供测试结果:
## 测试结果
### 测试环境
- 浏览器: Chrome/Firefox/Safari
- 版本: xxx
- 项目ID: xxx
### 测试场景 1:删除单个空间
- [ ] 订单分配阶段删除成功
- [ ] 确认需求阶段显示正确
- [ ] 交付执行阶段显示正确
- [ ] 设计师分配弹窗显示正确
### 测试场景 2:连续删除多个空间
- [ ] 第一次删除成功
- [ ] 第二次删除成功
- [ ] 第三次删除成功
- [ ] 所有阶段数量一致
### 测试场景 3:刷新页面验证
- [ ] 刷新前数据正确
- [ ] 刷新后数据保持一致
- [ ] 数据库数据正确
### 控制台日志
粘贴控制台日志...
### 截图
- 订单分配阶段截图
- 确认需求阶段截图
- 交付执行阶段截图
- 设计师分配弹窗截图
### 问题描述
如果有问题,请详细描述...
测试完成时间: ___________
测试人员: ___________
测试结果: ✅ 通过 / ❌ 未通过