| 目录 | 用途 | 是否清洁 |
|---|---|---|
| ------ | ------ | ---------- |
~/.workbuddy/skills/lmj-pricing/ | Skill 代码(只读) | ✅ 始终清洁,无运行时产物 |
~/.lmj-pricing/cache/ | 乐享价格缓存、临时 JSON | 运行时产生 |
~/.lmj-pricing/logs/ | 运行日志 | 运行时产生 |
{WORKSPACE}/ | 报价单 HTML / Excel 交付物 | 仅输出最终交付物 |
> Skill 目录禁止写入。 所有中间数据(缓存、日志)写入 ~/.lmj-pricing/,交付物写入工作空间。
当用户提到以下关键词时激活本 Skill:
用户表达报价意向
│
▼
┌─────────────────────────────────────┐
│ 阶段一:需求梳理(对话交互) │
│ │
│ 必须确认以下信息后才进入下一阶段: │
│ □ 施工场景(内墙/外墙/工业/防水/木器)│
│ □ 用量方式(按面积→自动算桶数 │
│ 按桶数→直接算 │
│ 按kg→直接算) │
│ □ 如果是面积:多少平方?几遍? │
│ □ 预算范围(可选,用于推荐合适型号) │
│ □ 采购性质(单次/批量/年度框架) │
└─────────────────┬───────────────────┘
│ 确认后
▼
┌─────────────────────────────────────┐
│ 阶段二:乐享查价(后台自动) │
│ │
│ 调用 mcp__lexiang__smartsheet_list_records │
│ → 从「立镁家产品价格库」拉取最新价格 │
│ │
│ ⚠️ 乐享不可用时: │
│ → 不降级为 xlsx 本地镜像 │
│ → 而是暂停流程,提示用户: │
│ │
│ 「⚠️ 乐享连接暂不可用,无法获取最新价格。│
│ 请您提供立镁家的产品价格表(Excel/CSV │
│ 或直接告诉我产品和单价),我录入后继续。│
│ │
│ 快捷操作: │
│ 1. 发送价格表文件 → 我读取并缓存 │
│ 2. 口述价格 → 如「N300 180元/桶」 │
│ 3. 重试乐享连接」 │
│ │
│ 收到价格数据后写入 ~/.lmj-pricing/cache/prices.json │
│ 再继续阶段三 │
└─────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 阶段三:方案输出(给用户审核) │
│ │
│ 计算后展示初步方案,格式如下: │
│ │
│ 📋 报价初步方案 │
│ │
│ 产品:{名称}({系列}) │
│ 规格:{包装} | 单价:¥{价格}/桶 │
│ 用量:{桶数}桶({总kg}kg) │
│ 小计:¥{金额} │
│ 折扣:{规则} -¥{折扣额} │
│ 合计:¥{总价} │
│ │
│ 💡 建议:{施工建议/替代方案} │
│ 🔔 备注:满500kg享9.5折,1000kg享9折 │
│ │
│ ⚠️ 确认无误后回复「出报价单」, │
│ 我将生成 HTML+Excel+PDF 三种格式 │
└─────────────────┬───────────────────┘
│ 用户确认
▼
┌─────────────────────────────────────┐
│ 阶段四:生成产物 │
│ │
│ python3 quote_generator.py │
│ {型号} --{qty/area} {数值} │
│ --all --out ${WORKSPACE}/立镁家报价_{型号} │
│ │
│ 生成三个文件后用 preview_url 打开HTML │
│ deliver_attachments 交付所有文件 │
└─────────────────────────────────────┘
如果用户只说了型号没有场景(如「N500 多少钱」):
我先帮您确认几个信息,这样报价更准确:
1. 用在哪里?(家装内墙 / 工程外墙 / 工业防腐 / 防水 / 木器)
2. 按面积算还是按桶数算?(有平方数我帮您算需要多少桶)
3. 大概多少平方/多少桶?
4. 这是小批量试单还是批量采购?(影响折扣)
如果用户说了面积(如「200平方」):
200平方是做几遍?
- 一遍(底漆):约需 X 桶
- 两遍(面漆标准):约需 Y 桶
- 需要底漆+面漆全套方案吗?
如果选型不确定(如「墙面用什么漆好」):
我先帮您推荐一下:
- 普通家装:N300 标准型 ¥180/桶
- 有小孩老人:N800 净味零甲醛 ¥420/桶
- 预算有限:N100 经济型 ¥120/桶
您的场景是哪种?
需求确认后,查乐享获取最新价格:
Step 1: 调用乐享 Smartsheet
调用 DeferExecuteTool:
toolName: mcp__lexiang__smartsheet_list_records
params:
entry_id: c2fcea7d9f284eac84924d011d406193
smartsheet_id: 3fc4a8f1153b46ea887f40fa7d9da116
Step 2: 用引擎内置的 parse_lexiang_records() 将乐享记录转为价格字典,写入 JSON:
import sys, json
sys.path.insert(0, '~/.workbuddy/skills/lmj-pricing/scripts')
from price_engine import parse_lexiang_records
# records = 乐享返回的 records 列表
prices = parse_lexiang_records(records)
with open(os.path.expanduser('~/.lmj-pricing/cache/prices.json'), 'w') as f:
json.dump(prices, f, ensure_ascii=False)
> 乐享字段映射参见 price_engine.py 中的 LEXIANG_FIELD_MAP。
调用计算引擎(必须带 --prices-json)获取 JSON 结果:
python3 ~/.workbuddy/skills/lmj-pricing/scripts/price_engine.py {型号} [--qty {数量}|--area {面积}] --prices-json ~/.lmj-pricing/cache/prices.json --json
用以下模板展示给用户:
📋 报价初步方案
产品:{product_name}({series})
适用场景:{scenario}
规格:{pack_spec} | 单价:{unit_price}
用量:{packs_needed}桶({total_kg}kg)
小计:¥{subtotal}
{折扣行}
合计:¥{total}
💡 施工建议:{根据场景给出}
🔔 满500kg享9.5折,满1000kg享9折
确认无误请回复「出报价单」,我将生成正式文件。
如果价格明显异常(单价为0,如 LMJ-BK),提示用户:
> ⚠️ 该产品价格为面议,建议直接联系立镁家销售确认。
用户确认后执行(产物输出到当前工作空间):
python3 ~/.workbuddy/skills/lmj-pricing/scripts/quote_generator.py {型号} [--qty {数量}|--area {面积}] --prices-json ~/.lmj-pricing/cache/prices.json --all --out {WORKSPACE}/立镁家报价_{型号}
> {WORKSPACE} 替换为当前会话的工作空间目录。
> 价格缓存 ~/.lmj-pricing/cache/ 与运行日志 ~/.lmj-pricing/logs/ 为技能内部运行时数据,
> 不在 skill 目录或工作空间中产生任何中间文件。
生成后:
preview_url 打开 HTML 预览deliver_attachments 交付 HTML + Excel 两个文件| 采购量 | 折扣 |
|---|---|
| -------- | ------ |
| < 500kg | 标准价 |
| 500-999kg | 9.5 折 |
| 1000-2999kg | 9 折 |
| ≥ 3000kg | 8.5 折(面议) |
| 情况 | 处理 | |
|---|---|---|
| ------ | ------ | |
| 乐享 MCP 断连 | 暂停流程,提示用户提供价格表文件或口述价格。不可降级读取本地 XLSX。 | 收到价格数据后手工构建 JSON 再继续 |
| 乐享查价后型号缺失 | 提示「该型号在乐享价格库中未找到」,询问是否手动输入价格 | 手动录完后继续计算 |
| 型号模糊 | 列出可能的匹配让用户选 | |
| 工业/木器/防水按面积 | 提示该产品不支持按面积,请给桶数/kg数 | |
| 用户中途改需求 | 回到阶段一重新确认 |
如用户询问产品参数、施工方法等非报价问题 → 切换到 lexiang-search 技能(mcp__lexiang__search_kb_search),搜索「立镁家的知识库」。
共 1 个版本