Vtrip B2B · 商品分销
本 Skill 面向租户侧 选品 → 选客户 → 预下单 → 正式下单。全程使用 OpenSSO 换出的旅行社员工宿主 JWT;不做代登。商品搜索走 /api/v1/products/page(替代旧的门票/日游/邮轮三条 Agent 搜索工具)。
| 步骤 | 能力 | 接口 |
|---|---|---|
| 1 选品 | 按类目 / 名称 / 地区查可售商品;详情 / 日历价 | POST /api/v1/products/page 等 |
| 2 选客户 | 客户组织列表 / 分页,记下 orgId |
GET/POST /api/customer-orgs* |
| 3 预下单 | 价库存校验,取得 preOrderKey |
POST /api/user/orders/pre |
| 4 正式下单 | preOrderKey + 客户 orgId 创建订单 |
POST /api/op/orders/create-for-customer |
本 Skill 归属 vtrip_claw。body 不传 tenantId。不要用 Supply Token。
何时使用
- 「查达古冰川门票」「按地区筛上架酒店」
- 「给某某客户下单这张票」「先预下单再创单」
不要用于:
| 场景 | 改用 |
|---|---|
| 商品上架/改价库存等主数据维护、销售区域、平台行程导入、运营订单核对 | vtrip-b2b-data-modeling |
| 整段行程推荐与报价 | vtrip-b2b-iti-quotation |
| 路书展示 | vtrip-roadbook |
对话路由
- 选品 →
--action page(建议--category-name+--status 1);必要时get/prices。记下productItemId、skuId、价格(分)。 - 选客户 →
--action customer-list或customer-page;选启用组织,记下orgId。 - 预下单 →
--action pre(单品可用 CLI 字段或--payload-file)→ 取得preOrderKey。 - 正式下单 →
--action create:--org-id+--pre-order-key+--order-amount(元)+ 联系人。
金额:商品价为分;创单 orderAmount 为元(lineTotalFen / 100)。详见 references/conversation-flow.md。
凭证
与 vtrip-b2b-data-modeling 同源客户 ApiKey:
| 用途 | 环境变量(优先) | 兼容变量 |
|---|---|---|
| 客户 ApiKey | VTRIP_OPEN_API_KEY |
VTRIP_API_KEY |
| OpenSSO secret | VTRIP_OPEN_SSO_SECRET_KEY |
VTRIP_B2B_SSO_SECRET |
| 已有宿主 JWT | VTRIP_B2B_HOST_TOKEN |
VTRIP_B2B_AUTH_TOKEN |
| 配置 | 环境变量 | 默认值 |
|---|---|---|
| 宿主 API 基址 | VTRIP_B2B_HOST_API_BASE_URL |
https://dev-ata-api.visiotrip.com.cn |
| 开放平台基址 | VTRIP_OPEN_PLATFORM_BASE_URL |
https://open.vtrip.top:8443 |
优先级:Host Token → secretKey → ApiKey(secrets/resolve → /api/open/sso/token)。业务请求只带宿主 Bearer。详见 references/configure-credentials.md。
调用
# 1. 选品(替代旧 ticket/day-tour/cruise 搜索)
node scripts/product-sell.js \
--action page \
--category-name "门票" \
--keyword "达古" \
--status 1 \
--page-no 1 \
--page-size 20
# 详情 / 日历价(可选)
node scripts/product-sell.js --action get --id "<索引ID>"
node scripts/product-sell.js --action prices --id "<索引ID>" \
--start-date "2026-09-01" --end-date "2026-09-30"
# 2. 选客户
node scripts/product-sell.js --action customer-list
node scripts/product-sell.js --action customer-page --keyword "测试" --status 1
# 3. 预下单(取得 preOrderKey)
node scripts/product-sell.js --action pre \
--product-item-id "109158" \
--sku-id "7020260913000001" \
--use-date "2026-09-20" \
--unit-price-fen "12000" \
--qty 1 \
--ticket-type-name "成人票"
# 或复杂报价:--payload-file ./tmp-pre.json ({ "payload": "<字符串>" } 或 SINGLE_ITEM 对象)
# 4. 正式下单
node scripts/product-sell.js --action create \
--org-id "<客户OrgId>" \
--pre-order-key "<preOrderKey>" \
--order-amount "120" \
--contact-name "张三" \
--contact-phone "13800000000"
常用参数
| action | 关键参数 |
|---|---|
page |
--category-name(门票/酒店/行程用车)、--keyword、--regions、--status |
customer-page |
--keyword、--status |
pre |
--product-item-id --sku-id --use-date --unit-price-fen,或 --payload-file |
create |
--org-id --pre-order-key --order-amount --contact-name --contact-phone |
输出处理
成功时输出 PRODUCT_SELL_RESULT_START / END 包围的 JSON:status、action、markdown、data。
- 只展示接口返回事实;禁止编造商品、价格、订单号、跳转链接。
- 商品金额按分理解;创单金额按元。
- 正式下单
data.jumpUrl为收银台跳转链接(URL 内含 token 等参数): - 必须原样保留在
data与对用户回复中,禁止截断、脱敏、替换或拦截。 - 回答用户时必须用 markdown 表格展示,便于点击跳转,格式固定为:
| 订单ID | 跳转链接 |
|----|----|
| {orderNo} | [点击跳转收银台]({jumpUrl}) |
- 表格中的
jumpUrl须为接口返回的完整链接(含 token),禁止改写。 - 失败按 references/error-handling.md 处理。
硬性规则
- 渠道
vtrip_claw;body 不传tenantId。 - 只调宿主 OpenSSO + products / customer-orgs / orders/pre / create-for-customer;不做代登;不用旧 Agent BFF 搜索 path。
- 类目仅
门票/酒店/行程用车。 - 预下单
payload必须是 JSON 字符串;lineTotalFen = unitPriceFen * qty。 - 正式下单必须带客户
orgId+quotationCacheKey(即 preOrderKey)。 - 品牌:湖南视旅科技有限公司 · Vtrip B2B 分销。
参考
- references/api.md
- references/configure-credentials.md
- references/conversation-flow.md
- references/error-handling.md