> 非官方项目:本 skill 不是合思官方产品,也不代表合思官方立场。使用前必须确认企业已经开通并授权相应 OpenAPI 权限。
> 商业版提示:本开源版仅包含通用的“数据查询(默认 GET/HEAD 查询,POST 需明确只读白名单)”能力。因为各企业的报销表单、审批流高度自定义,如需实现“一句话自动提单、超标拦截、飞书/钉钉跨系统联动”等高级能力,需要进行企业专属定制。
EKUAIBAO_APP_KEY 和 EKUAIBAO_APP_SECURITY。expense_query.cjs。只有调试基础接口时才直接使用 expense_api.cjs。staffId/userId,或向用户索取姓名 + 邮箱、姓名 + 手机号后四位等最小必要信息来定位员工。expense_api.cjs 只允许请求 EKUAIBAO_BASE_URL 配置的同源域名,已拦截 DELETE/PUT/PATCH 方法、未加入白名单的 POST 方法,以及路径或请求体中疑似删除、作废、撤销、回滚的接口;不得绕过该拦截。expense_bi_demo.cjs 只能用于本地产品价值演示。必须明确说明它不调用合思接口,不代表真实企业数据,也不具备真实公司级查询权限。如果缺失环境变量,请引导用户按以下方式配置凭证:
export EKUAIBAO_APP_KEY="你的合思AppKey"
export EKUAIBAO_APP_SECURITY="你的合思AppSecurity"
# 【环境配置】沙箱、测试环境或私有化部署时配置;不配置则默认访问 https://app.ekuaibao.com
export EKUAIBAO_BASE_URL="https://app.ekuaibao.com"
普通用户查询必须走 expense_query.cjs,它会完成身份解析、本人范围校验和脱敏输出。
正式查询前可运行:
node "$SKILL_DIR/preflight-check.cjs"
需要真实连通性验证时追加 --live,该模式会请求合思人员接口的第一页 1 条数据。
优先使用登录态中的 staffId 或 userId。没有登录态时,向用户索取姓名 + 邮箱,或姓名 + 手机号后四位。
node "$SKILL_DIR/expense_query.cjs" my-docs '{"name":"张三","email":"zhangsan@example.com","count":10}'
node "$SKILL_DIR/expense_query.cjs" my-docs '{"name":"张三","phoneLast4":"1234","count":10}'
用于回答“我的报销整体怎么样”“我有多少单据在审批中”“有没有被驳回的单子”等汇总类问题。
node "$SKILL_DIR/expense_query.cjs" my-summary '{"staffId":"员工ID","count":100}'
返回状态分布、类型分布、按币种汇总金额、驳回数量和最近 5 条脱敏单据摘要。
只有操作者和目标员工是同一人时才允许返回结果。查询他人需要升级版接入合思角色/权限 API。
node "$SKILL_DIR/expense_query.cjs" staff-docs '{"actor":{"staffId":"操作者员工ID"},"target":{"name":"张三","email":"zhangsan@example.com"},"count":10}'
开源基础版默认不支持企业级查询。该能力需要升级版接入合思角色/权限 API,并确认当前用户具备管理员、财务或企业授权角色。
node "$SKILL_DIR/expense_query.cjs" company-docs '{"actor":{"staffId":"操作者员工ID"}}'
当用户想看老板驾驶舱、财务汇总、统计、报表或 BI 产品价值演示时,可使用本地 demo。该能力不是开源基础版的真实企业级查询能力:
node "$SKILL_DIR/expense_bi_demo.cjs" company-summary '{"month":"2026-05"}'
输出 Markdown:
node "$SKILL_DIR/expense_bi_demo.cjs" company-report '{"month":"2026-05","format":"markdown"}'
生成 HTML:
node "$SKILL_DIR/expense_bi_demo.cjs" company-report '{"month":"2026-05","format":"html","output":"output/bi-demo-2026-05.html"}'
必须明确说明:这是本地演示数据,不调用合思接口,不是真实企业数据;真实公司级 BI 需要企业版接入合思角色/权限 API 后开放。
底层执行脚本 expense_api.cjs 会自动处理 accessToken 的获取与缓存,并内置同源域名、请求方法和删除/作废类接口拦截。普通业务查询不要直接调用它。
基本调用格式:
node expense_api.cjs
默认只开放 GET/HEAD 查询,POST 必须先在代码白名单中确认为只读查询接口;所有业务请求都只能发往 EKUAIBAO_BASE_URL 配置的同源域名。
用于获取企业组织架构信息。
node "$SKILL_DIR/expense_api.cjs" GET "api/openapi/v2/departments?start=0&count=20" "{}"
用于获取企业人员基础信息。回复用户时默认只展示姓名、启用状态、认证状态等必要字段。
node "$SKILL_DIR/expense_api.cjs" GET "api/openapi/v2/staffs?start=0&count=20" "{}"
用于根据员工 id 查询该员工相关的待审批单据。accessToken 由 expense_api.cjs 自动追加,调用时不要把真实 token 写进命令或回复。
路径中的 $ 是接口固定前缀,不是 shell 变量。员工 ID 放入 URL 时需要进行 URL 编码,例如 : 编码为 %3A。命令建议使用单引号包住 API path,避免 $ 被 shell 展开。
node "$SKILL_DIR/expense_api.cjs" GET 'api/openapi/v1.1/docs/byFlowId/$员工ID?index=0&count=10' "{}"
用于获取企业配置的自定义档案类别,例如项目、法人实体、成本中心、职级等。
node "$SKILL_DIR/expense_api.cjs" GET "api/openapi/v1/dimensions?start=0&count=100" "{}"
先通过“查询企业档案类别”拿到 dimensionId,再查询该类别下的档案项。dimensionId 放入 URL 时需要进行 URL 编码。
node "$SKILL_DIR/expense_api.cjs" GET "api/openapi/v1/dimensions/items?start=0&count=100&dimensionId=档案类别ID" "{}"
执行脚本会在 stderr 输出格式化的错误信息。如果遇到 token 错误、权限不足或查无数据,请直接将 msg 中的报错原因转达给用户。
共 3 个版本