报价服务设计(Quotation Service Design - QSV-D)
文档编号:DOC-P31-D / QSV-D
版本:V1.2
维护人:BO / DT
关联文档:README.md、QMD、RQD-B §一 QSV需求、RQD-O MFR/QTE需求、MDS 主数据服务、CPT L6 安装阶段、BAS 业务架构说明
V1.2 升级摘要(V8.0 阶段二-3 DDD 重构):
- 新增 §三 DDD 战略设计(子域定位 + 限界上下文 + 上下文映射 + 防腐层 ACL)
- 新增 §四 DDD 战术设计(聚合根 Quote + 3 实体 + 8 值对象 + 3 领域服务 + 6 领域事件 + 2 仓储 + 2 工厂 + 报价状态机)
- 原 §三~§五 章节编号顺延为 §五~§七(内容不变)
- 依据 BAS V1.0 §六 DDD 实施规范
一、定位
报价服务是平台的核心服务之一,为客户提供多维动态报价能力,是前期统一派单模式的定价基础。本子目录存放报价模型的设计文档、参数体系与校准记录。
报价服务与 CPT 协同运作:报价服务为客户项目提供定价,跟踪表服务采集的实际数据持续反哺报价参数校准。
报价模型基于 ../../ref/DOC-P30香港上门安装服务平台市场调研与报价模型设计报告.md 第七章设计,独立维护以便随运营数据持续校准。
二、设计原则
- 透明可解释:报价明细逐项展示,逻辑可审计。
- 动态精准:整合楼宇、区域、时段、复杂度等多维参数,避免"一刀切"。
- 规则优先:冷启动阶段以规则引擎为主;数据积累后引入机器学习优化。
- 持续校准:基于 CPT 采集的实际成交与服务时长数据,定期调整系数。
- 灵活可控(V1.1 新增):对无法提前确定的现场环境或服务需求,以「灵活部分」独立区块列出,提供单价+计价规则+最高限价,保障客户价格上限。
三、DDD 战略设计
V1.2 新增(V8.0 阶段二-3):依据 BAS V1.0 §六 DDD 实施规范,对 QSV 服务进行 DDD 战略设计。
3.1 子域定位
QSV 报价属于核心子域,是平台"动态报价引擎"的落地。
| 子域 |
类型 |
现阶段定位 |
成熟期定位 |
| 报价决策 |
🔴 核心 |
规则引擎驱动,多维参数报价 |
同 + ML 优化 + C2C 撮合 |
| 报价模型 |
🟢 支撑 |
8 大参数 + 32 因子 + 封顶价 |
同 + 季度自动校准 |
3.2 限界上下文
graph LR
subgraph "QSV 限界上下文"
BC1["报价决策 BC<br/>(核心)"]
BC2["报价模型 BC<br/>(支撑)"]
end
subgraph "外部上下文"
MDS_BC["MDS 主数据 BC"]
CPT_BC["CPT 客户项目跟踪 BC"]
OPS_BC["OPS 运营 BC"]
MFR_BC["MFR 生产商 BC"]
end
MDS_BC -.->|"OHS:品类费率/楼宇系数/师傅等级"| BC1
BC1 -.->|"ACL:费率查询"| BC2
CPT_BC -.->|"同步调用:QuoteRequest/Response"| BC1
BC1 -.->|"事件发布:QuoteGenerated"| CPT_BC
BC1 -.->|"事件发布:QuoteCalibrated"| MDS_BC
MFR_BC -.->|"OHS:MFR 开放报价 API"| BC1
CPT_BC -.->|"事件订阅:ActualData* 反哺"| BC2
OPS_BC -.->|"事件订阅:QuoteRejected 流失分析"| BC1
3.3 上下文映射模式
| 外部 BC |
映射模式 |
交互方式 |
说明 |
| MDS BC |
开放主机服务(OHS) |
QSV 查询 SCL/BPL/WPL 费率与系数 |
通过 ACL 转换为 PricingFactor VO |
| CPT BC |
同步调用(CS) |
L3 报价请求/响应;L6-L8 反哺 |
QSV 遵从 CPT 的 QuoteRequest API |
| OPS BC |
事件订阅(CS) |
QuoteRejected → OPS 流失分析 |
遵从 QSV 事件 schema |
| MFR BC |
开放主机服务(OHS) |
MFR 开放报价 API |
MFR 调用 QSV 生成报价 |
| QMD 报价模型 |
共享内核(SK) |
报价参数表共享 |
8 大参数 + 32 因子 |
3.4 防腐层(ACL)设计
| 外部模型 |
内部值对象 |
转换规则 |
| MDS 品类档案 |
CatalogFactor VO |
catalogId + baseFee + skillLevel |
| MDS 楼宇档案 |
BuildingFactor VO |
buildingId + type + floorMultiplier + elevatorFlag |
| MDS 师傅档案 |
WorkerFactor VO |
workerId + level + levelMultiplier |
| CPT 报价请求 |
QuoteRequest VO |
projectId + customerId + requirement + timestamp |
| MFR 开放报价请求 |
OpenQuoteRequest VO |
mfrId + productCatalog + batchFlag |
四、DDD 战术设计
V1.2 新增:定义 QSV 聚合根、实体、值对象、领域服务、领域事件与仓储。
4.1 聚合根:Quote(报价单)
| 属性 |
说明 |
| 唯一标识 |
quoteId(全局唯一,格式 QSV-YYYYMMDD-NNN) |
| 不变量 |
① 报价总额 = Σ(QuoteItem 金额) + 灵活部分上限 ② 封顶价 ≤ 系统设定上限 ③ 报价版本严格递增 ④ 灵活部分必须声明最高限价 |
| 边界 |
一个报价单的所有报价项、灵活部分、版本记录 |
| 生命周期 |
草稿 → 生成 → 接受/拒绝 → 归档(反哺) |
聚合内组成:
- 1 × Quote(聚合根)
- N × QuoteItem(报价项实体)
- 0..N × FlexiblePart(灵活部分实体)
- 1..N × QuoteVersion(报价版本实体)
4.2 实体清单
| 实体 |
唯一标识 |
职责 |
关键字段 |
QuoteItem |
itemId(quoteId + seq) |
单个报价项 |
name, baseFee, factors, subtotal |
FlexiblePart |
flexId |
灵活部分费用项 |
name, unitPrice, pricingRule, maxLimit, settlementBasis |
QuoteVersion |
versionId |
报价版本(支持 A/B 测试与议价) |
version, totalAmount, changes, reason |
4.3 值对象清单
| 值对象 |
字段 |
用途 |
QuoteRequest |
projectId, customerId, requirement, timestamp |
报价请求 |
QuoteBreakdown |
items[], flexibleParts[], totalAmount, capPrice |
报价分解 |
PriceCap |
capAmount, category, reason |
封顶价 |
PricingFactor |
factorType(8 大类), weight, value |
定价因子 |
FactorWeight |
factorId, weight, version, lastCalibratedAt |
因子权重(含校准记录) |
CatalogFactor |
catalogId, baseFee, skillLevel |
品类因子 |
BuildingFactor |
buildingId, type, floorMultiplier, elevatorFlag |
楼宇因子 |
WorkerFactor |
workerId, level, levelMultiplier |
师傅因子 |
4.4 领域服务
| 领域服务 |
职责 |
关键方法 |
算法 |
PricingEngine |
报价生成 |
generateQuote(request) recalculate(quote) |
total = Σ(baseFee × Π(factors)) + flexibleParts.maxLimit |
CapPriceService |
封顶价决策 |
checkCap(quote) applyCap(quote) |
封顶价 ≤ 品类上限 × 楼宇系数 |
QuoteCalibrationService |
报价校准 |
calibrateFactor(factorId, actualData) recordCalibration(calibration) |
基于 CPT 反哺数据季度调整 |
PricingEngine 报价算法伪代码:
def generate_quote(request):
# 1. 从 MDS 获取品类基础费率
catalog = mds_service.get_catalog(request.catalogId)
base_fee = catalog.baseFee
# 2. 计算楼宇系数
building = mds_service.get_building(request.buildingId)
floor_multiplier = building.floorMultiplier # 如唐楼5楼=1.8
# 3. 计算师傅等级系数
worker = mds_service.get_worker(request.workerId)
level_multiplier = worker.levelMultiplier # 金牌1.2/认证1.0/普通0.9
# 4. 时段系数(高峰1.2/平峰1.0/低谷0.8)
time_factor = calculate_time_factor(request.timeslot)
# 5. 复杂度系数(师傅现场评级 vs 系统预判)
complexity_factor = estimate_complexity(request)
# 6. 供需系数(区域热度)
supply_demand_factor = get_supply_demand_factor(request.area)
# 7. 计算确定部分
determined_amount = base_fee * floor_multiplier * level_multiplier * time_factor * complexity_factor * supply_demand_factor
# 8. 计算灵活部分(上限)
flexible_parts = get_flexible_parts(request.catalogId, request.scene)
flexible_max = sum(part.maxLimit for part in flexible_parts)
# 9. 封顶价校验
total = determined_amount + flexible_max
cap_price = CapPriceService.check_cap(quote=total, category=catalog.category)
if total > cap_price.capAmount:
total = cap_price.capAmount
trigger_cap_warning()
return Quote(
quoteId=generate_id(),
breakdown=QuoteBreakdown(determined=detected_amount, flexible=flexible_parts, total=total),
capPrice=cap_price
)
4.5 领域事件清单
| 事件名 |
发布时机 |
载荷 |
订阅方 |
QuoteGenerated |
报价生成完成 |
quoteId, projectId, totalAmount, breakdown |
CPT(L3 接收报价) |
QuoteAccepted |
客户接受报价 |
quoteId, projectId, acceptedAt |
CPT(L4 签约) |
QuoteRejected |
客户拒绝报价 |
quoteId, projectId, reason |
OPS(流失分析) |
QuoteCalibrated |
报价参数校准 |
factorId, oldWeight, newWeight, reason |
MDS(参数同步) |
CapPriceTriggered |
封顶价触发 |
quoteId, originalAmount, capAmount |
OPR(运营审计) |
FlexiblePartConfirmed |
灵活部分确认 |
quoteId, flexId, actualAmount |
CPT(L6 增项记录) |
4.6 仓储与工厂
| 仓储 |
聚合 |
职责 |
QuoteRepository |
Quote |
报价单持久化(含报价项、灵活部分、版本) |
PricingFactorRepository |
PricingFactor |
定价因子与权重查询(只读) |
| 工厂 |
职责 |
QuoteFactory |
从 QuoteRequest 创建报价单,初始化报价项与灵活部分 |
FlexiblePartFactory |
从品类+场景生成灵活部分模板 |
4.7 报价状态机(聚合根不变量)
stateDiagram-v2
[*] --> Draft: 创建草稿
Draft --> Generated: PricingEngine 生成
Generated --> Accepted: 客户接受
Generated --> Rejected: 客户拒绝
Generated --> Revised: 议价/调整
Revised --> Accepted: 客户接受
Revised --> Rejected: 客户拒绝
Accepted --> Archived: 项目归档(反哺)
Rejected --> Archived: 流失池归档
Archived --> [*]
Generated --> CapTriggered: 封顶价触发
CapTriggered --> Revised: 重新议价
五、服务边界(V1.1 新增)
5.1 报价服务覆盖范围
| 报价场景 |
触发方 |
输入 |
输出 |
对应需求 |
| CST 端询价报价 |
CST 客户 |
品类+地址+楼宇+时段 |
报价单(确定部分 + 灵活部分) |
QSV-01~08 |
| MFR 端组合报价查询 |
MFR 门户 |
批量订单参数 |
组合报价清单 |
MFR-06 |
| MFR 开放报价(V1.1 新增) |
MFR 员工个人 |
产品类型+规格型号+客户地址+安装需求 |
详细报价单 + PDF 下载 |
QSV-10 / MFR-11 |
| 报价参数校准 |
OPR 后台 |
CPT 实际数据 |
系数调整建议 |
QSV-08 / CPT-06 |
5.2 报价单结构(V1.1 新增灵活部分)
报价单分为两大区块:
flowchart TD
QUOTE["报价单"]
QUOTE --> FIXED["确定部分<br/>(可提前计算的费用)"]
QUOTE --> FLEX["灵活部分<br/>(无法提前确定的费用)"]
FIXED --> FIX1["安装费<br/>(基础人工费×多维系数+附加费)"]
FIXED --> FIX2["物流费<br/>(本地/跨境配送费)"]
FIXED --> FIX3["平台管理费"]
FLEX --> FLX1["客户配合等待费<br/>单价: HKD 50/15min<br/>计价规则: 超预约时间15min起计<br/>最高限价: HKD 200"]
FLEX --> FLX2["现场环境附加<br/>单价: HKD 50-200/项<br/>计价规则: 按实际勘察计<br/>最高限价: HKD 500"]
FLEX --> FLX3["拆旧不确定费<br/>单价: HKD 50-150/件<br/>计价规则: 按实际拆旧难度<br/>最高限价: HKD 600"]
FLEX --> FLX4["隐蔽工程不确定费<br/>单价: HKD 100-300/项<br/>计价规则: 按实际工程量<br/>最高限价: HKD 800"]
5.3 灵活部分设计规范(QSV-09 / QTE-08)
每项灵活费用必须包含以下 5 个字段:
| 字段 |
说明 |
示例 |
| 费用名称 |
简明描述费用项 |
客户配合等待费 |
| 单价 |
明确的计价单价 |
HKD 50 / 15 分钟 |
| 计价规则 |
触发条件与计价方式说明 |
超预约时间 15 分钟起计,每 15 分钟一档,不足 15 分钟按 15 分钟计 |
| 最高限价 |
该项费用的封顶金额 |
HKD 200(即最多计 4 档) |
| 结算依据 |
实际发生时的凭证要求 |
CPT L6 阶段师傅记录等待起止时间 + 客户确认 |
5.4 MFR 开放报价服务边界(QSV-10 / MFR-11 / QTE-09)
| 维度 |
说明 |
| 注册方式 |
MFR 员工以个人名义注册(手机号/邮箱),不强制绑定企业 |
| 绑定 MFR |
注册后可选绑定所属 MFR 企业(关联 PPL 档案 PPL-001),也可不绑定 |
| 输入字段 |
产品类型(8 大品类)+ 规格型号 + 客户地址(区域+楼宇类型)+ 安装服务需求(自由文本+结构化选项) |
| 输出 |
详细报价单(确定部分 + 灵活部分)+ 可下载 PDF |
| 报价效力 |
开放报价为「参考报价」,不直接生成订单;CST 确认后转为正式订单(CPT L1 线索来源) |
| 品牌展示 |
绑定 MFR → 展示 MFR 信任徽章 + Logo;未绑定 → 仅展示平台报价 |
| 费率来源 |
与 CST 端询价共享同一 QMD 报价模型 + MDS 主数据,确保报价一致性 |
六、对接方案
6.1 与 MDS 主数据服务对接
| 主数据 |
来源 |
用途 |
| 品类费率/产品参数 |
SCL |
安装费计算基础 |
| 楼宇系数/楼层附加 |
BPL |
楼宇系数计算 |
| 师傅等级系数 |
WPL |
师傅溢价计算 |
| 物流费率 |
DLV |
物流费计算 |
| 生产商评级/徽章 |
PPL |
MFR 开放报价品牌展示 + 溢价触发 |
6.2 与 CPT 客户跟踪服务对接
| 对接点 |
方向 |
说明 |
| 报价 → CPT L1 线索 |
→ |
开放报价确认后转为 CPT L1 线索 |
| CPT L6 → 灵活部分结算 |
← |
CPT L6 安装阶段采集灵活部分实际发生证据 |
| CPT L8 → 参数校准 |
← |
CPT L8 回访 NPS + 实际工时反哺 QMD 系数 |
6.3 与 OPS 运营服务对接
| 对接点 |
方向 |
说明 |
| 灵活部分限价配置 |
← |
OPR 后台配置各项灵活费用单价与最高限价 |
| 开放报价统计 |
→ |
OPS-D 运营数据看板统计 MFR 开放报价使用量 |
七、后续规划
修订记录
| 版本 |
日期 |
修订人 |
修订内容 |
| V1.0 |
2026-08-04 |
DT |
从 README.md 拆分独立 |
| V1.1 |
2026-08-21 |
DT |
新增 QSV-09 灵活部分 + QSV-10 MFR 开放报价:① §二 设计原则新增第 5 条「灵活可控」;② §三 服务边界新增 §3.1 报价场景表(含 MFR 开放报价)+ §3.2 报价单结构(确定部分+灵活部分 Mermaid 图)+ §3.3 灵活部分设计规范(5 字段:费用名称/单价/计价规则/最高限价/结算依据)+ §3.4 MFR 开放报价服务边界(注册/绑定/输入/输出/品牌展示/费率来源);③ §四 对接方案新增 MDS/CPT/OPS 三方对接表;④ §五 后续规划新增 3 项待办 |
| V1.2 |
2026-08-21 |
DT |
V8.0 阶段二-3 DDD 重构:① 新增 §三 DDD 战略设计(§3.1 子域定位 + §3.2 限界上下文 Mermaid 图 + §3.3 上下文映射模式表 + §3.4 防腐层 ACL 设计表);② 新增 §四 DDD 战术设计(§4.1 聚合根 Quote + §4.2 实体清单 3 实体 + §4.3 值对象清单 8 VO + §4.4 领域服务 3 服务含 PricingEngine 算法伪代码 + §4.5 领域事件清单 6 事件 + §4.6 仓储与工厂 2 仓储 2 工厂 + §4.7 报价状态机 Mermaid);③ 原 §三~§五 章节编号顺延为 §五~§七(内容不变);④ 依据 BAS V1.0 §六 DDD 实施规范 |