Install
openclaw skills install @zhaobod1/huo15-furniture-mfgUse this skill whenever the user asks about furniture manufacturing operations on the HeySleep/和栖家居 system — order tracking ("这个订单到哪一步了" "SO-260531-758 什么情况" "梁泽光的单发了吗" "哪些订单还没发货"), production ("在制有多少" "生产进度" "哪些制造单延期了" "MO-xxx 缺什么料" "欠料/缺料"), inventory ("山隐主垫还有几张" "库存查询" "型号 C3 有货吗"), quality ("待检" "质检合格率" "最近有没有不合格"), purchasing ("采购到货了吗" "哪些采购单逾期"), customers ("亿美诺的档案" "这个客户成交多少"), daily overview ("今日总览" "晨报" "今天接了几单/发了几单"), write actions ("给这个单留言" "@张三跟进" "提醒冯广权周一回复客户" "交期改到20号" "生产提前到周三" "改这单报价" "把这个客户存一下" "工艺要求发给车间" "这个跟进做完了"), or documents ("打印合同" "发我唛头标签" "要个施工单 PDF"). Backed by the 和栖家居 manufacturing system (test.heysleep.cn, db=test, 辉火云企业套件 v19) over XML-RPC. Also handles photo QC ("把这几张照片挂到质检单" "质检判合格"), custom-size quotations ("客户要 2 米乳胶床垫报个价" "建个报价草稿"), and channel analysis ("电商单占多少" "渠道分布"). Also triggers on: 和栖, heysleep, 床垫订单, 跟单, 交期, 制造单, 生产单, 发货状态, 山隐, 山宿, 销售合约, 唛头, 拍照质检, 非标报价. First run: python3 scripts/login.py init (地址/数据库/账号/密码 → ~/.huo15/tools.md, chmod 600). Pure standard library, zero dependencies. Write actions are two-step confirm-gated (dry-run preview → user approves → --yes).
openclaw skills install @zhaobod1/huo15-furniture-mfg通过 XML-RPC 操作和栖家居制造系统(辉火云企业套件 v19,test.heysleep.cn,db=test)。
查询:订单穿透 / 在制 / 欠料 / 库存 / 质检 / 采购 / 客户 / 总览 / 渠道分布 / 晨报预警(只读)。
操作(确认制):留言@人 / 跟进提醒 / 跟进完成·改期 / 调生产计划 / 调承诺交期 /
报价起草·编辑·带品牌 / 文本一句话建客户档案 / 工艺要求→车间看板 / 拍照质检(挂图+判定)/
合同·唛头 PDF。
收到图片要挂质检单时:先把图片落盘拿到本地路径,再 quality.py attach <单号> --image <路径>
走确认制;判定(judge)不可随意撤销,必须用户明确说"判合格/不合格"才执行。
完整命令与输出示例 → references/commands.md API/字段坑(改代码前必读) → references/heysleep-mfg-api.md
cd <skill目录>/scripts
python3 login.py init # ① 地址 ② 数据库 ③ 账号 ④ 密码(默认 test.heysleep.cn / test)
python3 login.py test # 验证连接
凭据存 ~/.huo15/tools.md(标记块独立,与 huo15-huihuo-odoo 共存,权限 600)。
AI 非交互配置用:printf '%s' "$PASSWORD" | python3 login.py set --login <账号> --secret-stdin。
| 用户在问 | 命令 |
|---|---|
| 这个订单到哪了 / 什么时候能发货 | python3 order.py status <订单号或客户名> |
| 哪些订单没发完 / 最近订单 | python3 order.py list --undelivered / --days N --customer X |
| 在制有多少 / 生产排到哪了 | python3 mfg.py wip |
| 哪些生产延期了 | python3 mfg.py late |
| 缺料吗 / MO-xxx 欠什么料 | python3 mfg.py shortage [制造单号] |
| xx 还有几张库存 / 型号 C3 有货吗 | python3 inventory.py find <关键词> |
| 有多少待检 / 最近质检 / 不合格 | python3 quality.py todo / recent / fail |
| 质检合格率 | python3 quality.py stats [--days N] |
| 采购到货了吗 / 哪些逾期 | python3 purchase.py incoming / overdue |
| 客户档案 / 成交历史 | python3 partner.py show <客户名> |
| 今日总览 / 晨报 | python3 overview.py today / yesterday |
| 给单据留言 / @同事 | python3 actions.py note <单号> --text "..." [--at 姓名] |
| 提醒某人跟进 | python3 actions.py remind <单号> --to 姓名 --date YYYY-MM-DD |
| 调生产计划开始 | python3 actions.py reschedule <MO号> --start "日期 时间" |
| 调承诺交期 | python3 actions.py delay <SO号> --date YYYY-MM-DD |
| 打印合同 / 唛头 / 施工单 | python3 report.py pdf <单号> --report contract|label|workorder |
| 晨报 / 风险预警(一条消息体量) | python3 digest.py morning / alerts [--quiet-if-clean] |
| 拍照挂质检单 / 质检判定 | python3 quality.py attach <QC或MO号> --image 路径 / judge <QC号> --result pass|fail |
| 非标报价草稿(尺寸+主料+品牌) | python3 quote.py draft --customer X --line "产品:数量[:长*宽*高[:主料]]" [--brand 品牌名] |
| 改报价草稿(改量/价/折扣、加删行) | python3 quote.py edit <SO> --set N:数量[:单价[:折扣]] / --add 产品:数量 / --del N |
| 文本一句话建客户档案 | python3 partner.py add --text "姓名 电话 地址" |
| 工艺要求→车间(关联制造单) | python3 actions.py worknote <SO> --text "..." [--at 姓名] |
| 跟进活动 完成 / 改期 | python3 actions.py activity-done <活动id或单号> / activity-reschedule <id> --date |
| 电商 vs 直营渠道分布 | python3 order.py channels [--days 30] |
actions.py 所有命令默认 dry-run(只打印预览,不写系统):
--at/--to 只接受内部用户姓名,解析不到会报错列候选——不要自己猜着换人actions.py undo-note <message_id> --yesreport.py pdf 输出本地文件路径后,把 PDF 作为文件消息发送给用户(走当前
聊天通道的发文件能力);绝不发 /tmp/... 本地路径或 localhost 链接当作交付。
order.py status——一条命令含 明细/生产/发货/质检 全链路,不用分四次查。actions.py note/remind 确认制流程)。~/.huo15/tools.md 内容、密码、API Key 输出到对话。origin=SO 单号,覆盖率 92%)→ 出库 → 质检1800*2000*280)x_follower_user_id、销售人 x_salesperson_user_id、来源单号 x_source_order_ref、实际发货 x_actual_shipment_time、型号 x_studio_xinghao| 坑 | 正确做法 |
|---|---|
| 质检状态字段 | quality_state(none/pass/fail),没有 state 字段 |
| name_search 参数 | Odoo 19 是 domain=,传 args= 直接 TypeError |
| 库存数量排序 | qty_available 等非存储计算字段不能进 order,取回后本地排 |
| 组件实收数量 | Odoo 19 是 quantity(不是 17 以前的 quantity_done) |
| SO→MO 链路 | mrp.production.origin = sale.order.name(92% 覆盖) |
| SO→出库链路 | 优先 stock.picking.sale_id,回退 origin |
| Datetime 时区 | 全部 UTC 存储,显示用 odoo_utils.from_utc,当天范围用 day_range_utc |
| 分组聚合 | read_group 多 groupby 必 lazy=False |
| message_post 返回 | XML-RPC 序列化成 [id] 列表,取标量再用 |
| 活动 mail.activity | date_deadline 是 Date;需 res_model_id(ir.model id);To-Do 类型 id=4 |
| QWeb PDF 渲染 | XML-RPC 渲染不了,走 /web/session/authenticate + GET /report/pdf/<name>/<id>(report.py 已封装) |
actions.py 且确认制(默认 dry-run + --yes 两段式)。