Vtrip B2B · 租户资源数据建模
本 Skill 面向 B2B 租户侧主数据建模与维护:用 OpenSSO secretKey 换取宿主 JWT,直连宿主 API,在 WORKBUDDY 租户下落地 / 查询资源数据。
| 资源域 | 能力 | 说明 |
|---|---|---|
| 业务销售区域 | 查询 / 保存目的地销售区域 | 租户配置项;国内 domesticDestNames、出境 overseasDestNames |
| 平台行程 | 搜索平台线路 / 批量导入租户行程库 | platform-trips/page + batch-reference |
| 平台商品 | 按经营区域 + 类目搜索平台商品 / 批量导入租户商品库 | platform-products/page + batch-reference |
| 租户行程库 | 分页查询 / 详情 | trip-itineraries/page + GET /{id};不接新建/规划 |
| 商品库 | 类目枚举、增删查改、上下架、日历价、分页 | 类目以 GET /api/v1/products/categories 为准(含日游、邮轮等);勿与行程类型、订单页类型混用 |
| 客户组织 | 列表 / 分页 / 详情 / 保存 | 租户客户主数据 |
| 运营订单 | 按下单日范围分页查询 | 只读核对;金额单位为元 |
| OP 落地页 | 用户明确要求时打开商品库/行程库 | 本地拼 Bridge,不另调列表接口 |
| 行程关联 | 商品字段 tripItineraryIds |
用行程实体 ID 挂已有行程;不含规划/微调/评估/新建模板 |
本 Skill 归属 vtrip_claw。数据只落在 JWT 租户;请求体不要传 tenantId。不要用 supplyBearerToken / Supply API。
三套「类型」不要混
| 用户在说 | 实际是 | 怎么查 |
|---|---|---|
| 日游、门票、邮轮商品 | 商品类目 categoryName |
--resource product --action categories,再用返回的中文名筛选/新建 |
| 普通 / 标准 / 邮轮行程 | 行程库类型 itineraryType(0/1/2) |
--resource trip-itinerary --action page --itinerary-type |
| 打开某天下的日游/游轮订单 | OP 订单页(分销 Skill) | 转 vtrip-b2b-product-sell 的 order-link;本 Skill 不拼订单列表链接 |
商品类目以宿主 GET /api/v1/products/categories 为准。口语「游轮」在商品/行程侧对应 「邮轮」。
禁止根据 OP 后台前端源码或其它仓库推断类目。
何时使用
- 「从平台搜北京行程」「把这条平台线路导入租户行程库」「补充自有行程资源」
- 「查租户行程库」「看看库里有哪些行程」
- 「查租户销售区域」「把成都、四川加到国内销售区域」「配置出境目的地日本」
- 「给租户建一个杭州门票」「建日游商品」「建邮轮商品(价格属性矩阵 + 船期库存)」「按类目筛商品」「上架/下架这些商品」
- 「新增/更新客户组织」「查客户列表」
- 「查某段时间订单」「按客户组织筛订单」
不要用于:商品分销下单(vtrip-b2b-product-sell)、路书展示(../ai-trip/vtrip-roadbook,渠道 ai_trip)。
对话路由
- 从平台搜商品 / 导入租户商品库 →
--resource platform-product(先page再batch-reference;--regions用经营区域、--category-name用类目枚举中文名)。与行程导入同构:page结果里的id直接进batch-reference --ids,alreadyReferenced标记已导入的。2026-09-15 生产实测:演艺、行程商品、单品门票、日游、邮轮、其他 平台暂无数据;日本、韩国 0 条 - 从平台搜线路 / 导入租户行程库 →
--resource platform-trip(先page再batch-reference)。--city-keyword是宽匹配:会返回途经该城市的跨区域大环线(搜「成都」多出甘南/九寨线,搜「昆明」多出贵州+云南长线),要收敛就加--departure-city-keyword和/或--total-days,或翻页看本地出发的线路 - 查询已在租户行程库中的线路 →
--resource trip-itinerary(page/get) - 查询/配置业务销售区域、目的地(国内/出境)→
--resource sales-region - 商品相关(类目/价库存/上下架)→ 类目不明时先
--resource product --action categories,再page/create/batch-status - 客户组织 / 客户信息 →
--resource customer-org - 订单核对 →
--resource order - 用户明确要打开商品库 / 行程库后台 →
--resource landing --action open --target product或itinerary。未点名不要生成链接。 - 「把商品挂到已有行程」→ 商品 create/update 传
tripItineraryIds(行程实体 ID,不是列表索引 ID)。本 Skill 不接行程规划 / 微调 / 评估,也不新建行程模板。 - 写操作前确认业务名称;商品
--body-file可用examples/product-create.min.json;客户可用--org-name+--status。接口商品金额为分,对人说元。
详见 references/conversation-flow.md。
凭证
与 vtrip-b2b-product-sell 共用客户 ApiKey(推荐):
| 用途 | 环境变量(优先) | 兼容变量 |
|---|---|---|
| 客户 ApiKey | VTRIP_OPEN_API_KEY |
VTRIP_API_KEY |
| OpenSSO secret(可跳过 resolve) | VTRIP_OPEN_SSO_SECRET_KEY |
VTRIP_B2B_SSO_SECRET |
| 已有宿主 JWT(可跳过换票) | VTRIP_B2B_HOST_TOKEN |
VTRIP_B2B_AUTH_TOKEN |
| 配置 | 环境变量 | 如何取值 |
|---|---|---|
| 开放平台 / 宿主 API / OP 前台 | 可覆盖:VTRIP_OPEN_PLATFORM_BASE_URL、VTRIP_B2B_HOST_API_BASE_URL、VTRIP_OP_WEB_BASE_URL |
未覆盖时按 ApiKey 前缀:vt_live → 生产(open.visiotrip.com.cn / ata-api / ataop);vt_test → 预发(open.vtrip.top:8443 / dev-ata-api / dev-ataop)。resolve 返回的 api_base、换票 hostApiBaseUrl 再覆盖业务请求基址。 |
鉴权优先级(脚本自动):
- 有
VTRIP_B2B_HOST_TOKEN→ 直接 Bearer - 有
VTRIP_OPEN_SSO_SECRET_KEY→POST /api/open/sso/token - 有
VTRIP_OPEN_API_KEY→secrets/resolve(app_code=vtrip_claw)→ secret →/token - 业务请求只带宿主 Bearer;禁止把 ApiKey 放进业务 Bearer;禁止回显 Token / secret / ApiKey
无凭证时输出 requires_credentials,不调用业务接口。详见 references/configure-credentials.md。
调用
# 平台行程线路搜索(目的地城市必填)
node scripts/data-model.js \
--resource platform-trip \
--action page \
--city-keyword "北京" \
--departure-city-keyword "天津" \
--total-days 2 \
--page-no 1 \
--page-size 20
# 将选中的平台行程导入租户行程库(ids 来自搜索结果的 id)
node scripts/data-model.js \
--resource platform-trip \
--action batch-reference \
--ids "62117"
# 平台商品:按经营区域 + 类目搜索(--regions 逗号分隔)
node scripts/data-model.js --resource platform-product --action page \
--regions "重庆,成都" --category-name "门票" --page-size 10
# 平台商品导入(ids 来自搜索结果 id,建议 50 条一批)
node scripts/data-model.js --resource platform-product --action batch-reference \
--ids "122649,110134"
# 查询租户行程库(筛选均可选)
node scripts/data-model.js --resource trip-itinerary --action page \
--itinerary-name "北京" --page-no 1 --page-size 10
node scripts/data-model.js --resource trip-itinerary --action get --id "<索引ID>"
# 查询租户业务销售区域(目的地)
node scripts/data-model.js --resource sales-region --action get
# 注意:save 是**全量覆盖**,传什么就是最终名单,旧目的地会被清掉;
# 只加/只改一个城市也要带上完整名单。验证脚本改动时不要拿本接口跑临时数据。
# 写入租户业务销售区域配置
node scripts/data-model.js \
--resource sales-region \
--action save \
--domestic-dest-names "成都,四川" \
--overseas-dest-names "日本"
# 商品类目(以宿主返回为准)
node scripts/data-model.js --resource product --action categories
# 商品分页(--category-name 须与类目接口返回的中文名一致)
node scripts/data-model.js \
--resource product \
--action page \
--category-name "日游" \
--page-no 1 \
--page-size 10
# 商品新增(复杂 body 用文件)
node scripts/data-model.js \
--resource product \
--action create \
--body-file ./tmp-product-create.json
# 商品详情 / 日历价 / 更新
node scripts/data-model.js --resource product --action get --id "<索引ID>"
node scripts/data-model.js --resource product --action prices --id "<索引ID>" \
--start-date "2026-09-01" --end-date "2026-09-30"
node scripts/data-model.js --resource product --action update --id "<索引ID>" \
--body-file ./tmp-product-update.json
# 批量上架/下架(ids 来自商品列表/详情的索引 ID;0 下架 / 1 上架)
node scripts/data-model.js --resource product --action batch-status \
--ids "<索引ID1>,<索引ID2>" --status 1
# 客户组织
node scripts/data-model.js --resource customer-org --action list
node scripts/data-model.js --resource customer-org --action page --keyword "测试"
node scripts/data-model.js --resource customer-org --action get --org-id "<orgId>"
node scripts/data-model.js --resource customer-org --action save --org-name "示例客户" --status 1
node scripts/data-model.js --resource landing --action open --target product
node scripts/data-model.js --resource landing --action open --target itinerary
# 订单
node scripts/data-model.js --resource order --action list \
--start-time "2026-09-01" --end-time "2026-09-12" \
--page-no 1 --page-size 20
商品 --id 必须是列表/详情返回的 tenant_resource_index.id(索引 ID)。
行程库 --id 同样是列表返回的索引 ID(详情路径用它)。挂商品用详情里的行程实体 ID(resourceId),不要和平台线路 id 混用。
平台行程导入的 --ids 必须是 平台行程搜索结果中的 id(如 62117)。
写商品 / 上下架 / 导入平台行程要求旅行社员工身份(OpenSSO 用户满足)。商品 batch-status 的 --ids 与商品 --id 相同,都是列表索引 ID,不要与平台行程 id 混用。更新接口不含 status,改上下架请用 batch-status。
输出处理
脚本成功时输出 DATA_MODEL_RESULT_START / END 包围的 JSON:status、resource、action、markdown、data。
对用户最终回复必须用脚本 markdown(或同等结构):一句话结论 + 中文表/名单 + 下一步。禁止把脚本 JSON、英文字段名当正文。内部编号只可作表末列。导入前确认线路名称。
- 只展示接口返回事实;禁止编造行程、价格、库存、区域、客户、订单。
- 商品接口金额为分,订单为元——对人一律说元。
- 落地页
jumpUrl必须原样可点;仅用户明确要求跳转时才生成。 - 失败时按 references/error-handling.md 处理;对人说凭证失效/没权限,不要丢错误码。
硬性规则
- 渠道
vtrip_claw;数据落 JWT 租户;body 不传tenantId。 - 只调本文档宿主接口;不用 Supply;不用 OpenClaw ApiKey 通道;不用
POST /api/user/orders/list。不要翻 OP 后台前端或其它代码仓推断类目/字段。 - 金额:商品价库存为分;订单为元;不擅自换算错单位。
- 不接行程规划 / 微调 / 评估 / 新建行程模板;租户行程库仅
page+get;平台行程仅搜索 +batch-reference导入;不传importCalendarPrices、tripDraft。本 Skill 不拼 OP 订单列表、不代客下单(日游/游轮订单页与邮轮创单属于分销 Skill)。 - 邮轮商品:类目
邮轮。dimensionValue是航线(上水/下水),scenicSpot是船名(如美维凯越、总统七号);对人只说航线/船名。去重看航线+船名+SKU 名。报价必须写价格属性矩阵(ticketPriceSpec.attributeAxes+priceMatrices,类别×规格),不要用顶层日历价冒充。船期库存走dateRangeStocks,不要写商品总库存。详情见 references/api.md「邮轮商品构建」。 - 凭据安全:不回显 / 落盘 secret 与 ApiKey;落地页/收银台
jumpUrl例外(须原样给用户点击,禁止朗读 token)。 - Base URL 仅 HTTPS(本机 localhost 除外)。
- 品牌:湖南视旅科技有限公司 · Vtrip B2B 数据建模。
参考
- references/api.md:换票、平台行程、销售区域、商品、客户组织、订单字段与路径。
- references/configure-credentials.md:secretKey / Host Token 配置。
- references/conversation-flow.md:意图路由与追问。
- references/error-handling.md:错误分类。