Files
erp-next/doc/福安德智慧报价平台-完整开发方案.md
王文昊 e521b0dfeb feat(bid): 完成物料管理模块全功能开发
1. 新增物料详情页路由、菜单与接口,支持查看物料报价与信息
2. 重构物料列表页面,新增品牌筛选、表格样式优化与详情跳转
3. 扩展物料实体与数据库字段,新增材质、用途、性能参数等字段
4. 新增供应商/甲方报价查询、批量对比、同名称物料匹配接口
5. 新增物料详情组件,包含基础信息、供应商报价、甲方报价标签页
6. 修复比价路由跳转路径错误,调整数据库密码配置
7. 新增物料相关SQL脚本与初始化数据
2026-05-29 08:58:58 +08:00

42 KiB
Raw Blame History

福安德智慧报价平台 — 完整开发方案

基于 RuoYi-Vue v3.9.2 (Spring Boot 4.0.3 + JDK 17 + Vue 2 + Element UI) 融合 PPT《报价比对系统》5大板块 + XLSX《电气自动化设备综合管理系统_V1》27个Sheet数据 对接现有项目12个已完成模块


目录


一、项目全景与数据资产

1.1 PPT五大板块映射

PPT板块 对应功能 现有进度 开发类型
智采系统-物料信息 物料CRUD + 分类树 + 性能参数JSON biz_material 已有基础字段 扩展增强
智采系统-物料详情 详情页 + 3个Tab(历史报价/甲方报价/同比) 未开发 新建
智采系统-供应商管理 供货清单 + 报价单管理 + 指派界面 biz_supplier 已有基础 扩展增强
智采系统-报价商 供应商门户(已报项/可报项/报价界面) 未开发 新建
给甲方报价单 子RFQ拆解 + 成本回填 + 历史版本 + 横向对比 biz_client_quote 基础已有 核心增强

1.2 XLSX数据资产清单

Excel中包含了完整的电气设备业务数据共27个Sheet

Sheet 名称 行数 用途
1 00_导航首页 24 系统导航和功能入口说明
2 01_项目报价单(fad给甲方) 52 甲方报价模板(含品牌/型号/数量/折扣率)
3 02_报价汇总 27 按类汇总 + 加价系数 + 对外报价
4 10_变频器比价 48 汇川/禾望/西门子/ABB 三家比价
5 11_整流单元比价 37 整流/制动/回馈单元比价
6 12_PLC比价 15 CPU+模块比价
7 13_低压电器比价 22 断路器/接触器/热继电器比价
8 14_电缆线槽比价 25 电缆/控制线/线槽综合比价
9-19 20_变频器型号库 ~ 30_网关型号库 321+ 全品类型号数据库
20 31_品牌汇总 22 各品牌型号数量统计

1.3 核心业务流程

甲方需求 → 创建甲方报价单 → 拆解为内部RFQ(子报价单)
    → 指派供应商(可报项) → 供应商报价 → 比价选择
    → 成本回填甲方报价单 → 生成最终甲方报价 → 甲方确认
    → 生成采购单 → 交付 → 评价/异议处理

二、板块一:物料信息

2.1 现有基础

biz_material 表已有字段:

  • material_id, tenant_id, category_id, material_code, material_name
  • spec, unit, brand, description
  • status, create_by, create_time, update_by, update_time, remark

2.2 扩展字段

ALTER TABLE biz_material ADD COLUMN (
    -- PPT要求字段
    manufacturer     VARCHAR(100)    COMMENT '厂家/品牌(与brand一致作为冗余筛选)',
    model_size       VARCHAR(200)    COMMENT '型号/尺寸(如MD500T37G, TMY-60×6)',
    performance_params TEXT          COMMENT '性能参数(JSON格式: {"功率":"37kW","电压":"380V"})',
    material         VARCHAR(100)    COMMENT '材质(铜/铝合金/PVC等)',
    purpose          VARCHAR(500)    COMMENT '用途(如"通用负载","风机水泵")',
    remarks          TEXT            COMMENT '备注',
    category_tree_path VARCHAR(500)  COMMENT '分类路径(冗余,如"1/5/23")',
    spec_comparison_group VARCHAR(100) COMMENT '横向对比分组标识',

    -- 扩展业务字段
    min_stock        INT DEFAULT 0   COMMENT '最低库存预警',
    unit_weight      DECIMAL(10,4)   COMMENT '单重(kg)',
    image_url        VARCHAR(500)    COMMENT '物料图片',
    data_source      VARCHAR(20) DEFAULT 'manual' COMMENT '数据来源(manual/import/excel)',
    version          INT DEFAULT 1   COMMENT '乐观锁版本号'
);

-- 型号唯一索引(防止重复录入同规格物料)
ALTER TABLE biz_material ADD UNIQUE INDEX idx_model_manufacturer (manufacturer, model_size);

2.3 性能参数JSON规范

性能参数使用JSON格式存储前端动态渲染为键值对表格

// 变频器示例
{
  "功率": "37kW",
  "电压": "380V",
  "电流": "72A",
  "过载能力": "150%/60s",
  "通讯接口": "RS485/PROFINET",
  "防护等级": "IP20"
}

// 电缆示例
{
  "芯数×截面": "3×70+1×35",
  "额定电压": "0.6/1kV",
  "外径": "42mm",
  "载流量": "210A",
  "护套材质": "PVC铠装"
}

前端组件使用Element UI动态表单el-form + el-table),每行=参数名+参数值+单位支持增删行。保存时组装为JSON字符串读取时JSON.parse后渲染为只读表格。

2.4 前端页面结构

物料信息列表页 (/bid/material)
├── 左侧:物料分类树 (复用 biz_material_category)
│   ├── 树节点点击 → 右侧表格过滤
│   └── 面包屑导航(基于category_tree_path)
├── 右侧:物料表格
│   ├── 顶部筛选栏
│   │   ├── 厂家下拉(去重,从manufacturer字段DISTINCT)
│   │   ├── 型号模糊搜索(输入前缀智能联想)
│   │   ├── 分类级联选择器
│   │   └── 关键词搜索
│   ├── 表格列:编码 | 名称 | 厂家 | 型号 | 材质 | 用途 | 单位 | 操作
│   └── 操作按钮:详情 | 编辑 | 删除 | 加入对比篮
└── 新增/编辑对话框(抽屉形式)
    ├── 基础信息(名称/分类/厂家/型号/材质/用途/单位)
    ├── 性能参数动态表单(支持增删行)
    ├── 规格明细(可扩展多规格)
    └── 图片上传(物料图/铭牌)

2.5 后端接口扩展

BizMaterialController 中新增:

接口 方法 说明
/bid/material/detail/{id} GET 物料详情(含性能参数解析+历史报价摘要)
/bid/material/manufacturer/list GET 厂家下拉列表(去重)
/bid/material/import POST Excel批量导入(EasyExcel解析)
/bid/material/export GET 导出为Excel模板
/bid/material/suggest GET 型号智能联想(q参数前缀匹配)
/bid/material/comparison-group/{groupId} GET 按对比组获取物料

三、板块二:物料详情

3.1 页面架构

采用"1+N"信息架构——1个基础信息区 + N个动态关联Tab

物料详情页 (/bid/material/detail/:id)
├── 顶部基础信息卡片(两栏)
│   ├── 左栏(16/24):基础信息表(物料ID/厂家/型号/材质/用途)
│   │   └── 性能参数表格(从JSON动态渲染)
│   └── 右栏(8/24)价格趋势ECharts迷你折线图
│       └── 近6个月最低报价走势(从biz_quotation_item聚合)
├── Tab 1供应商历史报价清单
├── Tab 2我方给甲方的历史报价
└── Tab 3不同品牌/规格同比

3.2 Tab 1供应商历史报价清单

数据来源biz_quotation_itembiz_quotationbiz_supplier

展示字段

字段 说明
报价日期 biz_quotation.submit_time
供应商名称 biz_supplier.supplier_name
单价(元) biz_quotation_item.unit_price
数量 biz_quotation_item.quantity
交期(周) biz_quotation_item.delivery_days / 7
报价单号 biz_quotation.quote_no
操作 查看详情(点击下钻到报价单)

关键交互

  • 点击单价 → 抽屉展示原始报价单详情
  • 价格预警高于近3个月平均价15% → 行背景红色高亮
  • 按时间倒序排列

后端API

// BizMaterialController
@GetMapping("/{id}/supplier-quotes")
public AjaxResult getSupplierQuoteHistory(@PathVariable Long id) {
    // 查询 biz_quotation_item JOIN biz_quotation JOIN biz_supplier
    // WHERE material_id = id ORDER BY submit_time DESC
}

3.3 Tab 2我方给甲方的历史报价

数据来源biz_client_quote_itembiz_client_quote

展示字段

字段 说明
报价日期 client_quote.create_time
甲方名称 client_quote.client_name
我方含税单价 client_quote_item.unit_price
折扣率 client_quote_item.discount_rate
最终成交价 含税单价 × 折扣率
状态 sent/accepted/rejected(带标签)
关联RFQ client_quote.rfq_id → biz_rfq.rfq_no

功能扩展

  • 落选标注原因(新增client_quote_item.reject_reason字段)
  • 版本对比(基于parent_quote_id)

3.4 Tab 3不同品牌/规格同比

新建对比关系表

CREATE TABLE biz_material_comparison (
    id                BIGINT AUTO_INCREMENT PRIMARY KEY,
    group_id          VARCHAR(50) NOT NULL COMMENT '对比组ID(如"VFD-37kW-380V")',
    group_name        VARCHAR(200) COMMENT '对比组名称(如"37kW 380V变频器对比组")',
    material_id       BIGINT NOT NULL COMMENT '物料ID',
    counterpart_brand VARCHAR(100) COMMENT '对标品牌',
    counterpart_model VARCHAR(200) COMMENT '对标型号',
    comparison_notes  TEXT COMMENT '对比说明(差异点)',
    sort_order        INT DEFAULT 0 COMMENT '组内排序',
    status            CHAR(1) DEFAULT '0' COMMENT '状态',
    create_by         VARCHAR(64),
    create_time       DATETIME,
    update_by         VARCHAR(64),
    update_time       DATETIME,
    UNIQUE KEY uk_group_material (group_id, material_id),
    KEY idx_material (material_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物料横向对比组';

功能逻辑

  1. 管理员维护对比组(在物料详情页可直接操作)

    • 为某个物料添加"对标物料"(跨品牌)
    • 如汇川MD500T37G ↔ 禾望HV500-37G ↔ 西门子G120 PM240 37kW
  2. 自动对比展示

    • 系统自动从 biz_comparison 对比结果中拉取对标物料的最新供应商报价
    • 对比维度:单价 | 功率 | 过载能力 | 通讯接口 | 防护等级 | 适用场合
  3. 数据初始化

    • 利用Excel Sheet 10-14的比价数据预置对比组
    • 如Sheet 10中"37kW变频器"对应的汇川/禾望/西门子/ABB四家数据

前端展示

┌─────────────────────────────────────────────────────────────┐
│  37kW 380V变频器 对比组                                      │
├──────────────┬──────────┬──────────┬──────────┬────────────┤
│              │ 汇川      │ 禾望      │ 西门子    │ ABB        │
│              │ MD500T37G │ HV500-37G│ G120 37kW│ ACS880-01  │
├──────────────┼──────────┼──────────┼──────────┼────────────┤
│ 最低报价(元)  │ 6,200    │ 5,800    │ 10,500   │ 8,900      │
│ 功率(kW)     │ 37       │ 37       │ 37       │ 37         │
│ 过载能力      │ 150%/60s │ 150%/60s │ 140%/60s │ 150%/60s   │
│ 通讯接口      │ RS485    │ RS485    │ PROFINET │ PROFINET   │
│ 防护等级      │ IP20     │ IP20     │ IP20     │ IP21       │
│ 综合评价      │ ★★★★☆   │ ★★★★★   │ ★★★☆☆   │ ★★★★☆     │
├──────────────┼──────────┴──────────┴──────────┴────────────┤
│ 推荐选型      │ 禾望HV500-37G (性价比最优)                   │
└──────────────┴─────────────────────────────────────────────┘

四、板块三:供应商管理

4.1 现有基础

biz_supplier 表已有字段supplier_id, supplier_name, contact, phone, email, address, status

4.2 供应商详情页重构

在现有 /bid/supplier 基础上,将列表页改为"列表+详情"结构,点击供应商进入详情页:

供应商详情页 (/bid/supplier/detail/:id)
├── Tab 1: 基础信息 (现有功能)
│   ├── 供应商名称/联系人/电话/邮箱/地址
│   └── 资质文件上传(营业执照/授权证书)
├── Tab 2: 供货清单 (新建)
│   ├── 供应商-物料关系维护
│   └── 历史报价快速查看
├── Tab 3: 报价单管理 (增强)
│   ├── 参与的RFQ列表
│   └── 报价单状态跟踪
├── Tab 4: 历史报价趋势 (新建)
│   └── ECharts折线图
└── Tab 5: 账号管理 (新建)
    └── 供应商登录账号创建/权限管理

4.3 供货清单

新建供应商-物料关系表

CREATE TABLE biz_supplier_material (
    id                BIGINT AUTO_INCREMENT PRIMARY KEY,
    supplier_id       BIGINT NOT NULL,
    material_id       BIGINT NOT NULL,
    supply_status     TINYINT DEFAULT 1 COMMENT '0停供 1正常 2备选',
    last_quote_price  DECIMAL(18,4) COMMENT '最新报价(缓存)',
    last_quote_time   DATETIME COMMENT '最新报价时间',
    delivery_cycle    INT DEFAULT 0 COMMENT '供应周期(天)',
    min_order_qty     DECIMAL(15,4) DEFAULT 1 COMMENT '最小起订量',
    preferred         TINYINT DEFAULT 0 COMMENT '是否优选供应商',
    create_time       DATETIME,
    UNIQUE KEY uk_supplier_material (supplier_id, material_id),
    KEY idx_supplier (supplier_id),
    KEY idx_material (material_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商物料供应关系';

前端交互

  • 点击物料名称 → 跳转物料详情页(/bid/material/detail/:id)
  • 支持在物料详情页"添加供应商"反向维护
  • 批量导入根据Excel比价数据自动建立供应关系

4.4 报价单管理

供应商参与的RFQ及报价单管理增强现有 biz_rfq

ALTER TABLE biz_rfq ADD COLUMN (
    contract_no           VARCHAR(100)  COMMENT '合同号',
    client_name           VARCHAR(100)  COMMENT '甲方名称',
    project_name          VARCHAR(200)  COMMENT '项目名称',
    delivery_required_date DATE         COMMENT '要求交货日期',
    delivery_weeks        INT           COMMENT '要求交货周期(周)',
    quote_deadline        DATETIME      COMMENT '供应商报价截止日',
    total_budget          DECIMAL(18,4) COMMENT '预算总额',
    winner_supplier_id    BIGINT        COMMENT '中标供应商ID',
    winner_quotation_id   BIGINT        COMMENT '中标报价单ID'
);

报价单列表页字段:询价单号 | 合同号 | 甲方 | 项目名称 | 状态 | 报价截止日 | 已报价/邀请数 | 操作

状态流转draft(草稿) → published(已发布) → in_progress(报价中) → closed(已关闭) → completed(已完成)

4.5 指派供应商界面

触发点RFQ发布时选择被邀请的供应商

┌─ 指派供应商对话框 ─────────────────────────────────┐
│                                                     │
│  询价单号: RFQ-2026-001                              │
│  标题: 自动化生产线控制系统采购                         │
│                                                     │
│  ☐ 全选                         搜索供应商: [______] │
│                                                     │
│  ☑ 深圳市华顺达电子有限公司      上次合作: 2026-01    │
│  ☑ 苏州博远精密设备有限公司      上次合作: 2026-01    │
│  ☐ 上海瑞达工控科技有限公司      新供应商             │
│  ☑ 广州联盟电气集团             报价历史优秀           │
│  ☐ 武汉华中精工机械有限公司      评价4.8分            │
│                                                     │
│  发送方式: [📧 邮件通知] [💬 站内信] [📱 短信通知]    │
│                                                     │
│              [取消]          [确认指派]               │
└─────────────────────────────────────────────────────┘

指派后:系统向供应商发送通知,供应商登录后可看到"可报项"


五、板块四:报价商门户(供应商端)

5.1 账户体系设计

-- 在 sys_user 增加供应商类型字段(已有 tenant_id)
ALTER TABLE sys_user ADD COLUMN (
    user_type       TINYINT DEFAULT 1 COMMENT '1内部员工 2供应商账号',
    supplier_id     BIGINT COMMENT '关联供应商ID(仅user_type=2时有效)',
    account_status  TINYINT DEFAULT 1 COMMENT '0待审核 1正常 2冻结'
);

权限控制

  • 供应商账号(user_type=2) → 仅能看到本供应商数据(通过supplier_id过滤)
  • RuoYi @PreAuthorize注解 + 自定义数据权限拦截器
  • 路由层面:供应商端访问 /supplier/** 路径,内部员工无法访问

5.2 供应商路由体系

新建独立路由模块,与后台管理路由隔离:

// ruoyi-ui/src/router/supplier.js
export const supplierRoutes = [
  {
    path: '/supplier',
    component: Layout,
    hidden: true, // 不在管理后台侧边栏显示
    children: [
      { path: 'dashboard', component: () => import('@/views/supplier/dashboard'), meta: { title: '供应商首页' } },
      { path: 'rfq/pending', component: () => import('@/views/supplier/rfq-pending'), meta: { title: '可报项' } },
      { path: 'rfq/quoted', component: () => import('@/views/supplier/rfq-quoted'), meta: { title: '已报项' } },
      { path: 'quote/edit/:rfqId', component: () => import('@/views/supplier/quote-edit'), meta: { title: '报价填写' } },
      { path: 'profile', component: () => import('@/views/supplier/profile'), meta: { title: '我的信息' } },
    ]
  }
];

5.3 供应商首页 (/supplier/dashboard)

┌────────────────────────────────────────────────────────────┐
│  欢迎您,深圳市华顺达电子有限公司                             │
├──────────┬──────────┬──────────┬──────────┬───────────────┤
│  可报项   │  已报项   │  中标数   │  中标率   │  累计成交额    │
│    3      │   12     │    5     │  41.7%   │  ¥1,286,500  │
├──────────┴──────────┴──────────┴──────────┴───────────────┤
│  ⏰ 紧急提醒RFQ-2026-003 报价截止还剩 2天              │
│  📋 最新中标的报价单RFQ-2026-001 (2026-01-15中标)       │
└────────────────────────────────────────────────────────────┘

5.4 可报项 (/supplier/rfq/pending)

数据来源biz_rfq_supplier WHERE supplier_id = ? AND status = 'published' AND quote_deadline > NOW()

列表字段

字段 说明
RFQ编号 biz_rfq.rfq_no
甲方/项目 biz_rfq.client_name / project_name
报价截止日 biz_rfq.quote_deadline (红色<3天)
物料数量 biz_rfq_item COUNT
操作 立即报价(按钮)

紧急提醒截止前24小时发送站内信(复用RuoYi消息中心)

5.5 已报项 (/supplier/rfq/quoted)

数据来源biz_quotation WHERE supplier_id = ?

列表字段

字段 说明
RFQ编号 rfq_no
报价日期 quotation.create_time
物料数量 quotation_item COUNT
报价总额 quotation.total_amount
状态 pending(待开标)/won(已中标)/lost(未中标)
操作 查看详情 / 修改报价(截止前可改)

5.6 报价填写界面 (/supplier/quote/edit/:rfqId)

采用分步表单

Step 1 → 物料清单确认 (只读展示RFQ物料)
Step 2 → 逐项填价 (核心步骤)
Step 3 → 预览提交

Step 2 填价界面

物料清单表格:
┌──────────┬────────┬──────┬──────┬──────────┬────────┬──────────┐
│ 物料名称  │ 规格    │ 数量  │ 单位  │ 单价(元)* │ 交期(周)│ 备注     │
├──────────┼────────┼──────┼──────┼──────────┼────────┼──────────┤
│ PLC控制器 │ CPU... │ 5    │ 套   │ [___]    │ [___]  │ [______] │
│ 变频器    │ 三相...│ 8    │ 台   │ [___]    │ [___]  │ [______] │
│ 电源模块  │ 24V... │ 20   │ 台   │ [___]    │ [___]  │ [______] │
└──────────┴────────┴──────┴──────┴──────────┴────────┴──────────┘
  含税/未税切换: [●含税] [○未税]  自动计算增值税13%

关键交互

  • 必填校验:单价 > 0交期 ≤ RFQ要求
  • 智能提示当输入单价低于该物料历史最低价的80%时 → 警告弹窗"报价异常偏低,请确认"
  • 附件上传:产品彩页、资质证书、型式试验报告(新表biz_quotation_attachment)
  • 自动保存草稿(LocalStorage + 后端每3分钟自动保存)
  • 提交前预览比价结果(提示"您的报价在当前排名第X/共Y家")

5.7 供应商端API

接口 方法 说明
/supplier/dashboard/stats GET 统计数据总览
/supplier/rfq/pending GET 可报项列表(分页)
/supplier/rfq/quoted GET 已报项列表(分页)
/supplier/quote/draft/{rfqId} GET 获取草稿报价
/supplier/quote/save-draft POST 保存报价草稿
/supplier/quote/submit POST 提交报价
/supplier/quote/{id}/attachments POST 上传附件
/supplier/profile GET/PUT 供应商信息维护

六、板块五:甲方报价单

6.1 现有基础

biz_client_quote 已有基础CRUDbiz_client_quote_item 已有明细表。现有页面已支持基本的新建/编辑/PDF导出。

6.2 数据模型增强

-- 增强甲方报价单
ALTER TABLE biz_client_quote ADD COLUMN (
    rfq_id              BIGINT        COMMENT '关联内部RFQ',
    cost_total          DECIMAL(18,4) COMMENT '内部成本合计(供应商中标价汇总)',
    margin_rate         DECIMAL(5,2)  COMMENT '毛利率%',
    quote_version       INT DEFAULT 1 COMMENT '报价版本号',
    parent_quote_id     BIGINT        COMMENT '父报价单ID(版本迭代)',
    project_name        VARCHAR(200)  COMMENT '项目名称',
    validity_date       DATETIME      COMMENT '报价有效期',
    payment_terms       VARCHAR(500)  COMMENT '付款条件',
    delivery_terms      VARCHAR(500)  COMMENT '交货条款',
    status              VARCHAR(20)   COMMENT 'draft/sent/accepted/rejected/revised',
    margin_rate_setting DECIMAL(5,2) DEFAULT 15.00 COMMENT '加价系数(%)',
    tax_rate            DECIMAL(4,2) DEFAULT 13.00 COMMENT '税率(%)'
);

-- 新建甲方报价-物料-供应商关联表(记录每个物料选定的供应商)
CREATE TABLE biz_client_quote_item_source (
    id                  BIGINT AUTO_INCREMENT PRIMARY KEY,
    quote_item_id       BIGINT NOT NULL COMMENT 'biz_client_quote_item.id',
    supplier_id         BIGINT COMMENT '选定的供应商ID',
    supplier_quote_id   BIGINT COMMENT '供应商报价单ID(biz_quotation.quotation_id)',
    unit_cost           DECIMAL(18,4) COMMENT '供应商中标单价(含税)',
    selected_reason     VARCHAR(500) COMMENT '选择该供应商原因',
    internal_note       TEXT COMMENT '内部备注',
    create_by           VARCHAR(64),
    create_time         DATETIME,
    update_by           VARCHAR(64),
    update_time         DATETIME,
    KEY idx_quote_item (quote_item_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='甲方报价物料来源';

6.3 业务流程图

┌──────────────┐
│  甲方询价需求  │
└──────┬───────┘
       ▼
┌──────────────────┐
│  创建甲方报价单   │ ← 手动输入甲方需求物料
│  (biz_client_quote)│
└──────┬───────────┘
       ▼
┌──────────────────┐
│  生成内部RFQ     │ ← 从甲方物料自动拆解为RFQ
│  (点击"发起询价") │     按品类分多个子RFQ
└──────┬───────────┘
       ▼
┌──────────────────┐
│  指派供应商报价   │ ← 每个子RFQ指派不同供应商
│  (供应商端报价)   │     变频器→A/B/C, 电缆→D/E
└──────┬───────────┘
       ▼
┌──────────────────┐
│  比价选择供应商   │ ← 使用现有智慧比价引擎
│  (选定最优方案)   │
└──────┬───────────┘
       ▼
┌──────────────────┐
│  成本回填         │ ← 自动回填选中供应商价格到
│  (自动/手动同步)  │     biz_client_quote_item_source
└──────┬───────────┘
       ▼
┌──────────────────┐
│  计算对外报价     │ ← 成本 × (1 + 加价系数)
│  生成PDF → 发送甲方 │     可手动调整覆盖
└──────────────────┘

6.4 甲方报价单详情页重构

甲方报价单详情页 (/bid/clientquote/detail/:id)
├── 顶部操作栏
│   ├── 保存草稿 | 导出PDF | 发送甲方 | 版本迭代
│   └── 状态标签(draft/sent/accepted/rejected)
│
├── 基本信息卡片
│   ├── 客户名称 | 项目名称 | 有效期 | 币种
│   ├── 关联RFQ(下拉选择) | 合同号
│   └── 付款条件 | 交货条款
│
├── 物料清单表格(可编辑)
│   ├── 行数据:序号 | 类别 | 物料名称 | 品牌 | 型号规格
│   │          | 数量 | 单位 | 供应商中标价(成本)
│   │          | 加价系数 | 对外含税单价 | 小计
│   ├── 操作:添加行 | 删除行 | 批量导入
│   └── 特殊列:询价状态(未询价/报价中/已回价/已定价)
│       └── 已定价 → 显示供应商名称,点击查看来源
│       └── 未询价 → 点击"发起询价"→ 弹出选择供应商 → 生成子RFQ
│
├── 右侧成本汇总面板(固定)
│   ├── 物料成本合计: ¥XXX (自动汇总供应商中标价)
│   ├── 加价系数: 15% (可调整)
│   ├── 对外报价(含税): ¥XXX = 成本 × (1 + 加价系数)
│   ├── 预计毛利率: XX.X% (实时计算)
│   └── 操作按钮:同步最新采购价 | 重新计算
│
├── Tab: 智能选型对比
│   └── 选中物料 → 弹出对比窗口 → 展示同规格多品牌对比
│       → 一键替换物料型号和成本
│
└── Tab: 历史版本
    └── 版本列表(通过parent_quote_id关联)
        → 版本对比(高亮显示差异)

6.5 子RFQ生成逻辑

// 从甲方报价单生成内部RFQ
@PostMapping("/bid/clientquote/{id}/generateRfq")
public AjaxResult generateSubRfq(@PathVariable Long id, @RequestBody GenerateRfqRequest req) {
    // 1. 获取甲方报价单主表
    // 2. 根据选中的行物料,按category_id分组
    //    如: 变频器类一组,PLC类一组,电缆类一组
    // 3. 为每组创建子RFQ:
    //    - rfq_title = 甲方报价单项目名 + "(" + 类别名称 + ")"
    //    - deadline = 甲方报价单有效期前7天
    //    - parent_client_quote_id = 甲方报价单ID
    // 4. 将选中物料复制到biz_rfq_item
    // 5. 指派供应商(从req.supplier_ids)
    // 6. 返回生成的RFQ ID列表
}

6.6 成本回填机制

自动回填触发点

  1. 采购单确认时(biz_purchase_order.status → 'confirmed')
  2. 甲方报价单页面手动点击"同步最新采购价"

回填逻辑

// 自动回填
@PostMapping("/bid/clientquote/{id}/syncCost")
public AjaxResult syncCost(@PathVariable Long id) {
    // 1. 获取所有子RFQ的最新成交报价
    // 2. 将选中供应商的成交价写入biz_client_quote_item_source
    // 3. 更新biz_client_quote.cost_total
    // 4. 重新计算margin_rate
    // 5. 记录价格变动日志
}

价格变动日志表

CREATE TABLE biz_price_change_log (
    id              BIGINT AUTO_INCREMENT PRIMARY KEY,
    source_type     VARCHAR(20) COMMENT '来源类型(quotation/client_quote)',
    source_id       BIGINT COMMENT '来源ID',
    material_id     BIGINT COMMENT '物料ID',
    old_price       DECIMAL(18,4),
    new_price       DECIMAL(18,4),
    change_reason   VARCHAR(500) COMMENT '变更原因',
    operator        VARCHAR(64),
    create_time     DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='价格变动日志';

6.7 两个报价历史

历史1我方给甲方的报价历史

  • 数据源:biz_client_quote 通过 parent_quote_id 形成版本链
  • 功能:版本对比 → 选择两个版本高亮显示价格差异

历史2供应商给我方的报价历史

  • 数据源:biz_quotation_item 中该物料的历史记录
  • 功能:在甲方报价单物料行点击"查看成本来源" → 抽屉展示时间轴

七、报价单管理与指派系统

7.1 报价单详情页 (/bid/rfq/detail/:id)

RFQ详情页 (/bid/rfq/detail/:id)
├── 顶部:基础信息(合同号/甲方/截止日/状态)
├── 左侧:已邀请供应商列表
│   ├── 供应商名称 | 报价状态(未报价/已报价/已逾期)
│   ├── 已报价 → 显示报价金额及操作(查看详情)
│   └── 未报价 → 显示"催办"按钮(发送通知)
├── 右侧:物料明细及各家报价对比表格
│   ├── 与XLSX Sheet 10-14格式一致
│   ├── 行:物料,列:各供应商单价(最低价绿色高亮)
│   └── 差额/差价自动计算
├── 底部操作栏
│   ├── 确认中标 → 弹出选择中标供应商对话框
│   ├── 重新询价 → 复制当前RFQ生成新版本
│   ├── 导出比价报告(PDF) → 复用现有导出功能
│   └── 关闭询价

7.2 供应商报价填写界面(供应商端)

见5.6节详细描述。

7.3 比价报告PDF

模板格式参考XLSX Sheet 10-14包含

  • 表头RFQ编号、项目名称、日期
  • 物料对比表:每行展示各供应商报价、最低价标记
  • 推荐方案:综合评分推荐最优供应商
  • 统计摘要:总价对比、节省金额

八、电气设备数据初始化方案

8.1 数据范围

利用XLSX Sheet 20-31的型号库数据预置如下初始数据

品类 型号数量 数据来源Sheet 对应品牌
变频器 ~322 31_品牌汇总 汇川/禾望/西门子/ABB
整流制动单元 ~100 21_整流制动单元库 汇川/禾望/西门子
PLC CPU ~55 22_PLC_CPU型号库 西门子/三菱/欧姆龙
PLC扩展模块 ~98 23_PLC_扩展模块库 西门子/三菱/欧姆龙
低压电器 ~75 24_低压电器型号库 正泰/施耐德
触摸屏 ~20 25_触摸屏型号库 威纶通/昆仑通态/西门子
铜牌母线 ~20 26_铜牌母线型号库 TMY铜排
动力电缆 ~23 27_电缆型号库 YJV22系列
控制线 ~21 28_控制线型号库 KVVP系列
线槽 ~18 29_线槽型号库 PVC/钢制
工业网关 ~12 30_网关型号库 汇川/研华
合计 ~764

8.2 供应商初始化

基于XLSX比价数据中的供应商初始化以下供应商

供应商 供应品类 数据范围
A供应商(汇川/正泰等) 变频器/整流/低压电器 Sheet 10-14
B供应商(禾望等) 变频器/整流/PLC Sheet 10-14
C供应商(西门子/施耐德等) 变频器/PLC/低压电器 Sheet 10-14

8.3 对比组初始化

根据Sheet 10-14比价数据建立初始对比组

对比组 包含品牌 数据来源
37kW 380V变频器 汇川MD500T37G / 禾望HV500-37G / 西门子G120 / ABB ACS880 Sheet 10
55kW 380V变频器 汇川MD500T55G / 禾望HV500-55G / 西门子G120 PM240 Sheet 10
整流单元75kW MDR100T75 / HBD-075 / BLM-075 Sheet 11
CPU 1515-2 PN 三家供应商报价对比 Sheet 12
断路器NXM-125S 正泰/施耐德/其他 Sheet 13
动力电缆YJV 3×70+1×35 三家供应商报价对比 Sheet 14

8.4 导入策略

方案一SQL脚本导入推荐首批

  • 将型号库数据编写为 INSERT 语句
  • 写入 sql/demo_data.sql 或新建 sql/excel_import_data.sql
  • 每个物料生成 material_code (如 M-EL-001)

方案二Excel批量导入功能后续维护

  • 通过 /bid/material/import 接口
  • 上传Excel文件 → EasyExcel解析 → 数据校验 → 批量写入
  • 提供下载导入模板功能

九、开发优先级与里程碑

第一阶段基础数据层第1-2周

优先级 任务 涉及文件
P0 物料表字段扩展 + 性能参数JSON动态表单 biz_material + 前端物料表单
P0 物料分类树+表格联动 复用现有 BizMaterialCategoryController
P1 物料详情页基础框架 + Tab1(供应商历史报价) 新建 material/detail.vue
P1 供应商-物料关系表 + 供货清单Tab 新建 biz_supplier_material
P1 物料横向对比组表 + 维护界面 新建 biz_material_comparison
P2 Excel电气设备型号库数据导入(首批~764条) 扩充 demo_data.sql

第二阶段业务流程层第3-5周

优先级 任务 涉及文件
P0 RFQ增强(合同号/甲方/截止日/指派界面) biz_rfq 扩展 + RFQ详情页重构
P0 供应商门户独立路由 + 可报项/已报项列表 新建 views/supplier/*
P0 供应商报价填写界面(分步表单) 新建 supplier/quote-edit.vue
P1 供应商账号管理(账号创建/权限分配) sys_user user_type扩展
P1 甲方报价单增强(子RFQ生成) BizClientQuoteController
P1 成本回填机制(自动+手动触发) 新建 biz_client_quote_item_source
P2 物料详情Tab2(甲方历史报价) 扩展 material/detail.vue

第三阶段智能分析层第6-8周

优先级 任务 涉及文件
P1 物料详情Tab3(横向同比+推荐算法) 扩展 material/detail.vue
P1 甲方报价单智能选型对比 BizComparisonService 扩展
P2 价格趋势ECharts折线图(物料详情页) 物料详情右栏
P2 供应商报价历史趋势ECharts 供应商详情Tab4
P2 价格预警机制(高于均价15%红色高亮) 前端表格渲染
P3 比价报告PDF增强 复用现有JSPDF导出

第四阶段优化完善第9-10周

优先级 任务 涉及文件
P2 版本对比(甲方报价单历史版本diff) 扩展 client-quote
P2 批量导入Excel型号库(维护界面) /bid/material/import
P3 供应商端多语言/国际化 i18n配置
P3 性能优化(物料列表大数据量分页) 后端分页+前端虚拟滚动
P3 Docker部署配置更新 deploy/

十、关键接口清单

物料模块

接口 方法 说明 优先级
/bid/material/detail/{id} GET 物料详情+历史报价摘要 P0
/bid/material/{id}/supplier-quotes GET 供应商历史报价清单 P0
/bid/material/{id}/client-quotes GET 我方给甲方历史报价 P1
/bid/material/{id}/comparison GET 横向对比数据 P1
/bid/material/manufacturer/list GET 厂家下拉列表(去重) P0
/bid/material/import POST Excel批量导入 P1
/bid/material/export GET 导出模板 P1
/bid/material/suggest GET 型号智能联想 P2

供应商模块

接口 方法 说明 优先级
/bid/supplier/{id}/materials GET 供货清单(分页) P0
/bid/supplier/{id}/materials POST 添加供应物料 P1
/bid/supplier/{id}/quotes GET 报价单管理列表 P1
/bid/supplier/{id}/price-trend GET 历史报价趋势 P2
/bid/supplier/{id}/accounts GET 供应商账号列表 P1
/bid/supplier/{id}/accounts POST 创建供应商账号 P2

RFQ模块

接口 方法 说明 优先级
/bid/rfq/{id}/assign POST 指派供应商 P0
/bid/rfq/{id}/comparison GET 比价结果(现有增强) P0
/bid/rfq/{id}/bid-report GET 导出比价报告PDF P1
/bid/rfq/{id}/winner POST 确认中标供应商 P1

供应商端

接口 方法 说明 优先级
/supplier/dashboard/stats GET 统计数据总览 P0
/supplier/rfq/pending GET 可报项列表 P0
/supplier/rfq/quoted GET 已报项列表 P0
/supplier/quote/draft/{rfqId} GET 获取草稿报价 P0
/supplier/quote/save-draft POST 保存报价草稿 P0
/supplier/quote/submit POST 提交报价 P0
/supplier/quote/{id}/attachments POST 上传附件 P1

甲方报价单

接口 方法 说明 优先级
/bid/clientquote/{id}/generateRfq POST 生成子RFQ P0
/bid/clientquote/{id}/syncCost POST 同步采购成本 P1
/bid/clientquote/{id}/compareSpec GET 智能选型对比 P1
/bid/clientquote/{id}/versions GET 历史版本列表 P2
/bid/clientquote/version-compare POST 版本对比diff P2
/bid/clientquote/{id}/export-pdf GET 导出PDF P0(现有)

十一、权限与安全设计

11.1 权限矩阵

角色 物料 供应商 RFQ 供应商报价 比价 甲方报价 供应商门户
管理员 CRUD CRUD CRUD CRUD 查看 CRUD 不可访问
采购员 查看 查看/编辑 CRUD 查看 查看/操作 查看 不可访问
销售员 查看 查看 查看 查看 查看 创建/编辑 不可访问
供应商 查看(仅关联) 查看(仅自己) 查看(受邀) 查看(仅自己) 不可见 不可见 报价/查看

11.2 数据权限

  • 租户隔离:所有业务表已有 tenant_id查询SQL必须带 tenant_id = ?
  • 供应商隔离:供应商账号 user_type=2,所有查询追加 supplier_id = ?
  • 价格脱敏:供应商看不到其他供应商的报价价格(但可以看到自己的排名)

11.3 安全措施

  • 价格字段加密敏感价格字段在数据库中使用AES加密存储接口返回时按角色脱敏
  • 乐观锁防并发biz_quotation 增加 version 字段供应商报价提交时CAS检查
  • 操作日志所有CRUD操作使用RuoYi @Log 注解记录
  • 文件上传校验:限制附件类型(pdf/jpg/png)大小≤10MB

附录Excel数据对照表

XLSX → 系统表映射

Excel Sheet 对应系统表 说明
01_项目报价单 biz_client_quote + biz_client_quote_item 甲方报价模板映射
02_报价汇总 biz_client_quote (汇总字段) 汇总逻辑直接实现
10-14_比价表 biz_quotation + biz_comparison(已有) 比价数据初始化来源
20-30_型号库 biz_material 初始物料数据(764条)
31_品牌汇总 统计查询 直接SQL统计实现

XLSX比价表 → 系统比价引擎字段映射

Excel列 系统字段 说明
A供应商型号 quotation_item.material_name/spec 报价物料
A供应商报价 quotation_item.unit_price 供应商A报价单价
B供应商型号 quotation_item.material_name/spec 报价物料
B供应商报价 quotation_item.unit_price 供应商B报价单价
最低价 BizComparisonVO.minPrice 当前最低价(系统自动计算)
推荐 BizComparisonVO.recommendedSupplier 评分最优推荐

本文档基于PPT《报价比对系统》(6页) + XLSX《电气自动化设备综合管理系统_V1》(27Sheet) + 现有项目源码(RuoYi-Vue v3.9.2, 12个已完成模块)综合分析生成,可直接作为迭代开发的技术参考。

最后更新2026-05-27