QUOTATION-DEDUPLICATION-USAGE.md 6.1 KB

报价重复空间清理 - 使用指南

快速开始

场景:您的报价页面出现重复空间

如果您看到类似这样的问题:

  • 🔴 儿童房 显示了 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: 确认您有编辑权限。只有具有编辑权限的用户才能看到"清理重复"按钮。


技术细节

检测逻辑

// 使用 Map 数据结构检测重复
const productNameMap = new Map<string, any[]>();

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)可以看到详细日志:

// 查看当前产品数量
console.log('产品总数:', this.products.length);

// 查看报价空间数量
console.log('报价空间数:', this.quotation.spaces.length);

// 手动触发清理(仅调试用)
// 在控制台执行:
component.cleanupDuplicateProducts();

联系支持

如果遇到问题:

  1. 查看浏览器控制台错误信息
  2. 截图当前页面状态
  3. 记录复现步骤
  4. 联系技术支持团队

最后更新: 2025-10-31
版本: v1.0.0
适用系统: 银三色设计管理系统