# 报价重复空间清理 - 使用指南 ## 快速开始 ### 场景:您的报价页面出现重复空间 如果您看到类似这样的问题: - 🔴 儿童房 显示了 2 次 - 🔴 卫生间 显示了 2 次 - 🔴 厨房 显示了 2 次 - 🔴 客厅 显示了 2 次 **立即解决方案** ↓ --- ## 方法一:自动检测与清理(推荐)⭐ 当您点击"生成报价"时,系统会自动检测重复: ### 步骤: 1. 打开项目订单页面 ``` 路径: 系统管理后台 → 项目管理 → 项目详情 → 订单 URL: https://app.fmode.cn/dev/yss/admin/project-detail/{项目ID}/order ``` 2. 点击 **"生成报价"** 按钮 3. 如果存在重复,会弹出提示框: ``` 检测到 8 个重复空间产品,是否自动清理? [取消] [确定] ``` 4. 点击 **"确定"** 5. ✅ 完成!系统会: - 自动删除重复的产品记录 - 保留第一个创建的产品 - 重新生成唯一的报价列表 - 显示成功消息:"成功清理 X 个重复产品" ### 控制台日志参考: ``` ⚠️ 检测到重复空间: 儿童房 (产品ID: xxx) ⚠️ 检测到重复空间: 卫生间 (产品ID: xxx) ⚠️ 检测到 8 个重复产品,建议清理 🗑️ 开始清理 8 个重复产品... ✓ 已删除: 儿童房 (xxx) ✓ 已删除: 卫生间 (xxx) ... ✅ 重复产品清理完成 ✅ 报价空间生成完成: 8 个唯一空间 (原始产品: 16 个) ``` --- ## 方法二:手动清理重复 🔧 适用于:想要主动检查和清理重复产品 ### 步骤: 1. 打开项目订单页面 2. 在工具栏找到并点击 **"清理重复"** 按钮 ``` 位置: [生成报价] [添加产品] [清理重复] [保存报价] ↑ 这里 ``` 3. 系统扫描后显示详情: ``` 检测到以下空间存在重复: 儿童房、卫生间、厨房、客厅、次卧、阳台、餐厅 共 8 个重复产品,是否清理? [取消] [确定] ``` 4. 点击 **"确定"** 清理 5. ✅ 完成! ### 如果没有重复: ``` 没有检测到重复产品 [确定] ``` --- ## 清理规则说明 ### 保留策略 - ✅ **保留第一个**创建的产品 - ❌ **删除后续**重复的产品 - 🔍 判断依据:`productName`(空间名称) ### 示例说明 假设数据库中有: ``` 1. 儿童房 (ID: aaa, 创建时间: 10:00) ← 保留 2. 儿童房 (ID: bbb, 创建时间: 10:05) ← 删除 ``` 清理后只保留 `ID: aaa` 的儿童房记录。 --- ## 常见问题 FAQ ### Q1: 清理会影响已有的设计数据吗? **A:** 只删除重复的 Product 记录。保留的那条记录的所有数据(报价、分配、状态等)都会完整保留。 ### Q2: 清理后报价总额会变化吗? **A:** 会的。如果之前重复计算了价格,清理后会显示正确的总额。 ### Q3: 可以撤销清理操作吗? **A:** 删除操作不可逆。建议在测试环境先验证,或确认后再执行。 ### Q4: 为什么会出现重复产品? **A:** 可能原因: - 多次点击"生成报价" - 系统批量创建时未去重 - 数据导入时包含重复数据 ### Q5: 清理按钮看不到? **A:** 确认您有编辑权限。只有具有编辑权限的用户才能看到"清理重复"按钮。 --- ## 技术细节 ### 检测逻辑 ```typescript // 使用 Map 数据结构检测重复 const productNameMap = new Map(); for (const product of this.products) { const productName = product.get('productName'); if (!productNameMap.has(productName)) { productNameMap.set(productName, []); } productNameMap.get(productName)!.push(product); } // 标记重复的产品(保留第一个) for (const [name, products] of productNameMap.entries()) { if (products.length > 1) { for (let i = 1; i < products.length; i++) { duplicateProductIds.push(products[i].id); } } } ``` ### 清理流程 ``` 1. 扫描所有产品 ↓ 2. 按空间名称分组 ↓ 3. 找出重复的产品ID ↓ 4. 用户确认 ↓ 5. 批量删除重复记录 ↓ 6. 重新加载产品列表 ↓ 7. 重新生成报价 ↓ 8. 显示成功消息 ``` --- ## 预期效果对比 ### 修复前 ❌ ``` 报价列表: 主卧 ¥300 6% 书房 ¥300 6% 儿童房 ¥300 6% ← 重复 儿童房 ¥300 6% ← 重复 卫生间 ¥300 6% ← 重复 卫生间 ¥300 6% ← 重复 厨房 ¥300 6% ← 重复 厨房 ¥300 6% ← 重复 客厅 ¥300 6% ← 重复 客厅 ¥300 6% ← 重复 次卧 ¥300 6% ← 重复 次卧 ¥300 6% ← 重复 阳台 ¥300 6% ← 重复 阳台 ¥300 6% ← 重复 餐厅 ¥300 6% ← 重复 餐厅 ¥300 6% ← 重复 总计: 16 个空间 报价总额: ¥4,800 (包含重复计算) ``` ### 修复后 ✅ ``` 报价列表: 主卧 ¥300 12.5% 书房 ¥300 12.5% 儿童房 ¥300 12.5% ✓ 唯一 卫生间 ¥300 12.5% ✓ 唯一 厨房 ¥300 12.5% ✓ 唯一 客厅 ¥300 12.5% ✓ 唯一 次卧 ¥300 12.5% ✓ 唯一 阳台 ¥300 12.5% ✓ 唯一 总计: 8 个唯一空间 报价总额: ¥2,400 (准确) ``` --- ## 权限说明 | 功能 | 需要权限 | 说明 | |------|---------|------| | 查看报价 | 所有用户 | 任何人都可以查看 | | 生成报价 | 编辑权限 | `canEdit = true` | | 清理重复 | 编辑权限 | `canEdit = true` | | 删除产品 | 编辑权限 | `canEdit = true` | --- ## 浏览器控制台调试 打开浏览器控制台(F12)可以看到详细日志: ```javascript // 查看当前产品数量 console.log('产品总数:', this.products.length); // 查看报价空间数量 console.log('报价空间数:', this.quotation.spaces.length); // 手动触发清理(仅调试用) // 在控制台执行: component.cleanupDuplicateProducts(); ``` --- ## 联系支持 如果遇到问题: 1. 查看浏览器控制台错误信息 2. 截图当前页面状态 3. 记录复现步骤 4. 联系技术支持团队 --- **最后更新**: 2025-10-31 **版本**: v1.0.0 **适用系统**: 银三色设计管理系统