跳转到主要内容
本文以费用报销为业务场景,演示如何通过 API 完成从创建空间、配置类别、上传文件、获取抽取结果到智能审核的完整流程。 如果您刚刚接触 DocFlow,建议先在 Web 页面 体验一下产品的基本功能,再阅读本文。

01 场景说明

在费用报销业务中,财务人员每天需要处理大量不同类型的报销单据,例如:
  • 报销申请单(XLS 格式):记录申请人、出差目的、费用明细等信息
  • 酒店水单(图片):记录入住日期、离店日期及消费明细
  • 支付记录(PDF):记录交易流水号、交易金额、收付款方信息
通过 DocFlow,您只需配置一次分类和字段,后续上传的单据即可自动完成分类识别结构化信息抽取;配置好审核规则库后,还可对抽取结果进行智能审核,自动发现金额不符、字段缺失等问题。

02 业务流程

费用报销业务流程
工作空间、文件类别和审核规则库只需配置一次,后续可持续复用——直接上传新的待处理文件并创建新的审核任务即可。本示例为演示完整流程,将配置步骤和处理步骤放在同一段代码中运行。

03 先决条件

  1. 登录 TextIn 控制台,获取 x-ti-app-idx-ti-secret-code
  2. 下载示例样本文件,或使用自己的报销单据

04 类别与字段配置

本示例配置三个文件类别,字段设计如下:

酒店水单(样本:sample_hotel_receipt.png)

酒店水单是住宿消费的凭证,通常包含入住/离店日期等全局信息,以及按天计费的消费明细表格。字段配置同时使用基本信息字段(全局信息)和表格字段(逐行消费记录),以完整提取单据中的结构化数据:酒店水单样本
字段名类型
入住日期基本信息字段
离店日期基本信息字段
总金额基本信息字段
日期表格字段
费用类型表格字段
金额表格字段
备注表格字段

支付记录(样本:sample_payment_record.pdf)

支付记录是银行或支付机构出具的电子回单,包含交易流水号、交易双方及金额等详情。通过字段抽取,可快速核验报销金额和收付款方是否与申请单一致:支付记录样本
字段名类型
交易流水号基本信息字段
交易授权码基本信息字段
付款卡种基本信息字段
收款方户名基本信息字段
付款方户名基本信息字段
交易时间基本信息字段
备注基本信息字段
收款方账户基本信息字段
收款方银行基本信息字段
交易金额基本信息字段
交易描述基本信息字段
付款银行基本信息字段
币种基本信息字段
交易账号/支付方式基本信息字段

报销申请单(样本:sample_expense_form.xls)

报销申请单是差旅费用报销的主单据,以 Excel 表格形式记录申请人信息、出差行程及各项费用明细。通过字段抽取,系统可自动录入申请人、金额、税率等关键数据,避免手工填表出错:
字段名类型
申请人基本信息字段
出差目的基本信息字段
报销期间基本信息字段
目的地基本信息字段
费用发生日期基本信息字段
费用项目基本信息字段
差旅费金额基本信息字段
税率基本信息字段
冲借款金额基本信息字段
申请付款金额基本信息字段
备注基本信息字段
税额基本信息字段

05 审核规则配置

本示例的审核规则库包含 3 个规则组、8 条审核规则,覆盖单据内合规性检查、差旅政策匹配和跨单据交叉核验三个维度:

规则组 1:报销申请单合规性检查(适用分类:报销申请单)

规则名称风险等级审核逻辑
行报销金额校验 高风险行申请付款金额 ≤ 行差旅费金额(含税)- 行冲借款金额,冲借款金额为空时视为 0
报销总金额校验 高风险申请付款总金额 ≤ Σ 行申请付款金额
报销期间与费用日期匹配 中风险”费用发生日期”应在”报销期间”所覆盖的日期范围内
必填字段完整性校验 高风险”申请人”、“费用发生日期”、“费用项目”、“申请付款金额”均不为空

规则组 2:差旅费用政策匹配审核(适用分类:酒店水单)

规则名称风险等级审核逻辑
城市差标匹配 中风险酒店住宿单价 ≤ 目的地城市差旅标准:一线城市(北京/上海/广州/深圳)≤ 800 元/晚,省会及计划单列市 ≤ 500 元/晚,其他城市 ≤ 300 元/晚
酒店明细合计金额校验 中风险所有明细行”金额”合计 = “总金额”

规则组 3:跨文档交叉审核(适用分类:报销申请单 + 酒店水单 + 支付记录)

规则名称风险等级审核逻辑
跨文档金额匹配 高风险报销申请单差旅费金额 = 酒店水单总金额 = 支付记录交易金额,允许 ±0.1 元误差
付款人身份与申请人一致性 中风险支付记录”付款方户名”与报销申请单”申请人”为同一人
跨文档规则的 category_ids 包含多个分类 ID,只有当审核任务覆盖所有关联分类时,该规则才会被触发执行。

06 代码结构说明

示例代码将完整的七步流程放在一起运行,便于理解端到端的调用链路。在实际生产中,步骤 1、2、5(创建工作空间、配置文件类别、配置审核规则库)只需执行一次;后续处理新单据时,只需重复步骤 3、4、6、7(上传文件 → 获取抽取结果 → 提交审核任务 → 获取审核结果),直接复用已有的工作空间、类别和规则库即可。 示例代码中的函数分为两类,理解这一点有助于对照 API 文档进行调试和扩展。

两类函数

REST API 调用函数 — 每个函数直接封装一个 API 端点,函数参数与接口文档一一对应:
函数(Python)方法(Java)对应 API 端点说明
create_workspacecreateWorkspacePOST /workspace/create创建工作空间,返回 workspace_id
create_categorycreateCategoryPOST /category/create创建文件类别并上传样本文件,返回 category_id
batch_add_category_fieldsbatchAddCategoryFieldsPOST /category/fields/batch_add为已有类别追加字段(用于添加表格字段)
upload_fileuploadFilePOST /file/upload异步上传文件,返回 batch_number,需轮询获取结果
upload_file_syncuploadFileSyncPOST /file/upload/sync同步上传文件,直接返回抽取结果,无需轮询
create_rule_repocreateRuleRepoPOST /review/rule_repo/create创建审核规则库,返回 repo_id
create_rule_groupcreateRuleGroupPOST /review/rule_group/create在规则库内创建规则组,返回 group_id
create_rulecreateRulePOST /review/rule/create在规则组内创建审核规则,绑定适用分类
submit_review_tasksubmitReviewTaskPOST /review/task/submit提交审核任务,返回审核 task_id
工具辅助函数 — 不直接对应 API 端点,提供公共基础能力或封装轮询/展示逻辑:
函数(Python)方法(Java)作用
_headersauthHeaders构造鉴权请求头
_checkcheckResponse校验响应 code,统一异常处理
_mimemimeType根据扩展名推断 MIME 类型
wait_for_resultwaitForResult循环轮询 file/fetch,等待抽取完成
display_resultdisplayResult格式化打印抽取结果
wait_for_reviewwaitForReview循环轮询 review/task/result,等待审核完成
display_review_resultdisplayReviewResult格式化打印审核结果

逐步代码说明

步骤 1:创建工作空间

工作空间名称中加入时间戳,确保每次运行都会创建独立的新空间,避免重名错误。

步骤 2:配置文件类别

create_category 通过 multipart 表单一次性完成类别创建、样本上传和字段配置。对于需要表格字段的类别(如酒店水单),在创建后再调用 batch_add_category_fields 追加。

步骤 3:上传待处理文件

DocFlow 提供两种上传方式:
  • 异步上传 file/upload:立即返回 batch_number,需配合步骤 4 轮询 file/fetch 获取结果,适合批量并行上传
  • 同步上传 file/upload/sync:等待处理完成后直接返回抽取结果(结构与 file/fetch 一致),无需轮询,适合对接简单或文件量少的场景
两者的请求参数完全一致,仅 URL 路径不同。方式一:异步上传(需配合步骤 4 轮询)
方式二:同步上传(直接返回抽取结果,跳过步骤 4)

步骤 4:获取抽取结果(使用同步上传时可跳过)

若步骤 3 使用了同步上传 file/upload/sync,则已直接获得抽取结果,可跳过本步骤。
wait_for_result 封装了轮询逻辑,每隔 3 秒查询一次 file/fetch,直到 recognition_status 变为 1(成功)。返回的文件对象中包含 task_id,后续审核步骤需要用到。

步骤 5:配置审核规则库

规则库采用三层结构:规则库 → 规则组 → 规则。create_rulecategory_ids 参数指定规则适用的分类,使用步骤 2 中获得的 category_id

步骤 6:提交审核任务

从步骤 4 的抽取结果中提取 task_id,传入审核接口。审核任务是异步执行的,提交后需要轮询结果。

步骤 7:获取审核结果

wait_for_review 轮询 review/task/result 接口,直到任务状态变为终态(1=审核通过、2=审核失败、4=审核不通过、7=识别失败)。

抽取结果示例

抽取结果示例

审核结果示例

审核结果示例

07 完整示例代码下载

完整可运行代码(含 Python、Java 两个版本)已内置在文档仓库的 examples/ 目录下:

Python 示例

查看 Python 完整示例代码

Java 示例

查看 Java 完整示例代码

08 运行示例

环境要求:Python 3.8+1. 安装依赖
2. 填写配置打开 expense_reimbursement.py,填写文件顶部的配置项:
3. 运行
运行成功后,可登录 DocFlow Web 页面,在对应工作空间下直观查看每份文件的分类、字段抽取结果和智能审核结果,便于与代码输出对照验证。

预期控制台输出

成功运行后,控制台将输出如下内容(workspace_id、category_id 等 ID 因运行环境不同而变化):

09 结果说明

抽取结果

处理完成后,每份文件将返回分类结果和字段抽取结果。字段抽取结果位于 data.fields[],每个字段包含 keyvalue 及坐标 position(可用于原文高亮回显)。 以下为三份样本文件的实际接口返回(来自 file/fetch,省略了部分 position 坐标):

sample_expense_form.xls

sample_hotel_receipt.png

sample_payment_record.pdf

审核结果

审核完成后,可从 review/task/result 接口获取以下信息:
  • status:任务整体状态(1=审核通过,4=审核不通过,2=审核失败)
  • statistics:规则通过数、不通过数汇总
  • groups[].review_tasks[]:每条规则的详细审核结果,包含:
    • review_result:该规则的审核结论
    • reasoning:AI 给出的审核依据说明
    • anchors:依据在原文中的坐标位置(可用于高亮回显)