01 场景说明
在 AP(应付账款)审单业务中,财务人员每次付款前需要对一组采购单据进行交叉核验。典型的单据组合包括:- 发票(含数电票、纸质增值税专用发票/普通发票等):记录销售方/购买方信息、开票金额和税率
- 采购订单(PDF/Word):约定供应商信息、合同金额、税率和产品明细
- 收货单(PDF):记录实际收货数量、物料信息及关联的采购订单号
02 业务流程

工作空间、文件类别和审核规则库只需配置一次,后续可持续复用——直接上传新的待处理文件并创建新的审核任务即可。本示例为演示完整流程,将配置步骤和处理步骤放在同一段代码中运行。
03 先决条件
- 登录 TextIn 控制台,获取
x-ti-app-id和x-ti-secret-code - 下载示例样本文件,或使用自己的单据文件
04 类别与字段配置
本示例配置四个文件类别,均通过category/create 接口创建并配置字段。
国内票-数电票(样本:sample_invoice.pdf)
国内票-数电票(样本:sample_invoice.pdf)
增值税电子发票(数电票),包含发票号码、开票日期、购买方/销售方名称及税号、价税合计等基本信息字段,以及商品明细表格字段:
| 字段名 | 类型 |
|---|---|
| 发票号码 | 基本信息字段 |
| 开票日期 | 基本信息字段 |
| 价税合计 | 基本信息字段 |
| 税前金额 | 基本信息字段 |
| 税额 | 基本信息字段 |
| 销售方名称 | 基本信息字段 |
| 销售方纳税人识别号 | 基本信息字段 |
| 购买方名称 | 基本信息字段 |
| 购买方纳税人识别号 | 基本信息字段 |
| 发票备注 | 基本信息字段 |
| 商品名称 | 表格字段 |
| 规格型号 | 表格字段 |
| 单位 | 表格字段 |
| 数量 | 表格字段 |
| 单价 | 表格字段 |
| 金额 | 表格字段 |
| 税率 | 表格字段 |
| 税额 | 表格字段 |
采购合同(样本:sample_contract.pdf)
采购合同(样本:sample_contract.pdf)
采购合同是约定交易条款的核心文件,包含合同编号、甲乙方信息、金额、税率和产品明细。字段配置同时使用基本信息字段和表格字段:
| 字段名 | 类型 |
|---|---|
| 编号 | 基本信息字段 |
| 甲方 | 基本信息字段 |
| 乙方 | 基本信息字段 |
| 签订日期 | 基本信息字段 |
| 合作期间 | 基本信息字段 |
| 支付条款 | 基本信息字段 |
| 乙方银行账户信息 | 基本信息字段 |
| 开票信息 | 基本信息字段 |
| 违约金条款 | 基本信息字段 |
| 采购物料/服务数量 | 基本信息字段 |
| 合同类型 | 基本信息字段 |
| 采购金额 | 基本信息字段 |
| 采购单价 | 基本信息字段 |
| 税率 | 基本信息字段 |
| 乙方税号 | 基本信息字段 |
| 采购物料/服务 | 基本信息字段 |
| 产品型号 | 表格字段 |
| 产品说明 | 表格字段 |
| 单价 | 表格字段 |
| 数量 | 表格字段 |
| 金额 | 表格字段 |
入库单(样本:sample_inbound.pdf)
入库单(样本:sample_inbound.pdf)
入库单是仓库收货的凭证,记录实收数量、物料信息和供应商信息。字段配置同时使用基本信息字段和表格字段:
| 字段名 | 类型 |
|---|---|
| 收货单编号 | 基本信息字段 |
| 收货日期 | 基本信息字段 |
| 对应合同号 | 基本信息字段 |
| 供应商名称 | 基本信息字段 |
| 仓库/库位 | 基本信息字段 |
| 物流单号 | 基本信息字段 |
| 入库总金额 | 基本信息字段 |
| 收货结论 | 基本信息字段 |
| 备注 | 基本信息字段 |
| 仓库收货人 | 基本信息字段 |
| 仓库收货人日期 | 基本信息字段 |
| 质检确认 | 基本信息字段 |
| 质检确认日期 | 基本信息字段 |
| 供应商送货人 | 基本信息字段 |
| 供应商送货人日期 | 基本信息字段 |
| 供应商税号 | 基本信息字段 |
| 收货入库明细-物料编码 | 表格字段 |
| 收货入库明细-物料描述 | 表格字段 |
| 收货入库明细-单位 | 表格字段 |
| 收货入库明细-应收 | 表格字段 |
| 收货入库明细-实收 | 表格字段 |
| 收货入库明细-差异 | 表格字段 |
| 收货入库明细-质检 | 表格字段 |
| 收货入库明细-签收人 | 表格字段 |
验收单(样本:sample_acceptance.pdf)
验收单(样本:sample_acceptance.pdf)
验收单是确认货物/服务交付质量的凭证,仅包含基本信息字段:
| 字段名 | 类型 |
|---|---|
| 项目名称 | 基本信息字段 |
| 合同编号 | 基本信息字段 |
| 甲方单位名称 | 基本信息字段 |
| 乙方单位名称 | 基本信息字段 |
| 甲方验收人 | 基本信息字段 |
| 乙方施工人 | 基本信息字段 |
| 交付内容 | 基本信息字段 |
| 验收说明 | 基本信息字段 |
| 验收结论 | 基本信息字段 |
| 验收数量 | 基本信息字段 |
| 验收日期 | 基本信息字段 |
| 乙方税号 | 基本信息字段 |
05 审核规则配置
本示例的审核规则库包含 2 个规则组、12 条审核规则,覆盖跨单据业务一致性核验和文档完整性预检两个维度:规则组 1:业务一致性审核(跨单据交叉核验)
规则组 1:业务一致性审核(跨单据交叉核验)
| 规则名称 | 风险等级 | 审核逻辑 |
|---|---|---|
| 供应商一致性 | ● 高风险 | 若均存在税号,则发票销售方税号 = 合同乙方税号 = 入库单供应商税号;否则比对名称 |
| 金额匹配 | ● 高风险 | 发票价税合计金额 ≤ 采购合同总金额;框架协议(金额为空或 0)时不校验 |
| 数量一致性(入库单维度) | ● 中风险 | 若发票含商品明细,则发票数量合计 ≤ 入库单实收数量合计 |
| 标的一致性 | ● 低风险 | 合同约定的规格型号须与入库单、发票中的规格型号一致;未约定规格型号时校验标的物描述是否指向同一商品 |
| 税率一致性 | ● 中风险 | 发票各行税率须与合同约定税率一致;合同未约定税率时跳过 |
| 验收结论校验 | ● 中风险 | 验收单的验收结论须为合格/通过/验收通过/同意验收或类似认可状态 |
| 数量一致性(验收单维度) | ● 中风险 | 若发票含商品明细且验收单有合格数量,则发票数量合计 ≤ 验收单合格数量 |
| 合同关联性 | ● 中风险 | 入库单合同编号 = 采购合同编号;验收单合同编号 = 采购合同编号 |
规则组 2:文档采集与预处理审核
规则组 2:文档采集与预处理审核
| 规则名称 | 风险等级 | 审核逻辑 |
|---|---|---|
| 信息完整性校验 | ● 中风险 | 检查四类文档齐全性并核验各文档必填字段非空(详见审核点说明) |
| 发票日期合规性 | ● 中风险 | 发票开票日期 ≥ 合同签订日期 |
| 购买方信息匹配 | ● 高风险 | 发票购买方名称 = 上海合合信息科技股份有限公司;购买方税号 = 91310110791485269J |
| 税率合规性校验 | ● 中风险 | 货物类税率应为 13%,服务类应为 6%,小规模纳税人应为 1% 或 3% |
06 代码结构说明
示例代码将完整的七步流程放在一起运行,便于理解端到端的调用链路。在实际生产中,步骤 1、2、5(创建工作空间、配置文件类别、配置审核规则库)只需执行一次;后续处理新单据时,只需重复步骤 3、4、6、7(上传文件 → 获取抽取结果 → 提交审核任务 → 获取审核结果),直接复用已有的配置即可。参见 AP 审单场景(已完成配置)。 示例代码中的函数分为两类,理解这一点有助于对照 API 文档进行调试和扩展。两类函数
REST API 调用函数 — 每个函数直接封装一个 API 端点,函数参数与接口文档一一对应:| 函数(Python) | 方法(Java) | 对应 API 端点 | 说明 |
|---|---|---|---|
create_workspace | createWorkspace | POST /workspace/create | 创建工作空间,返回 workspace_id |
create_category | createCategory | POST /category/create | 创建文件类别并上传样本,返回 category_id |
batch_add_category_fields | batchAddCategoryFields | POST /category/fields/batch_add | 为已有类别追加字段(用于添加表格字段) |
upload_file | uploadFile | POST /file/upload | 异步上传文件,返回 batch_number,需轮询获取结果 |
upload_file_sync | uploadFileSync | POST /file/upload/sync | 同步上传文件,直接返回抽取结果,无需轮询 |
create_rule_repo | createRuleRepo | POST /review/rule_repo/create | 创建审核规则库,返回 repo_id |
create_rule_group | createRuleGroup | POST /review/rule_group/create | 在规则库内创建规则组,返回 group_id |
create_rule | createRule | POST /review/rule/create | 在规则组内创建审核规则,绑定适用分类 |
submit_review_task | submitReviewTask | POST /review/task/submit | 提交审核任务,返回审核 task_id |
| 函数(Python) | 方法(Java) | 作用 |
|---|---|---|
_headers | authHeaders | 构造鉴权请求头 |
_check | checkResponse | 校验响应 code,统一异常处理 |
_mime | mimeType | 根据扩展名推断 MIME 类型 |
wait_for_result | waitForResult | 循环轮询 file/fetch,等待抽取完成 |
display_result | displayResult | 格式化打印抽取结果 |
wait_for_review | waitForReview | 循环轮询 review/task/result,等待审核完成 |
display_review_result | displayReviewResult | 格式化打印审核结果 |
逐步代码说明
步骤 2:创建含表格字段的文件类别
步骤 2:创建含表格字段的文件类别
国内票-数电票、采购合同和入库单均包含表格字段,需先创建类别(配置基本信息字段),再通过
batch_add_category_fields 追加表格字段。table_id=-1 表示挂载到默认表格。- Python
- Java
步骤 3:上传待处理文件
步骤 3:上传待处理文件
文件上传支持两种模式,可根据业务场景选择:方式二:同步上传(直接返回抽取结果,跳过步骤 4)
- 异步上传(
file/upload):上传后立即返回batch_number,需配合步骤 4 轮询file/fetch获取抽取结果。适合大批量文件并发处理。 - 同步上传(
file/upload/sync):上传后等待处理完成,直接返回抽取结果,无需轮询。适合单文件或少量文件的实时场景。
- Python
- Java
- Python
- Java
步骤 4:获取抽取结果(使用同步上传时可跳过)
步骤 4:获取抽取结果(使用同步上传时可跳过)
若步骤 3 使用了同步上传
file/upload/sync,则已直接获得抽取结果,可跳过本步骤。file/fetch 接口等待处理完成:- Python
- Java
步骤 5:配置跨文档审核规则
步骤 5:配置跨文档审核规则
跨文档规则在
category_ids 中传入多个分类 ID。DocFlow 会从各分类已抽取的结果中提取规则关联字段,交由 AI 统一判断。- Python
- Java
抽取结果示例

审核结果示例

07 完整示例代码下载
完整可运行代码(含 Python、Java 两个版本)已内置在文档仓库的examples/ 目录下:
Python 示例
查看 Python 完整示例代码
Java 示例
查看 Java 完整示例代码
08 运行示例
- Python
- Java
环境要求:Python 3.8+1. 安装依赖2. 填写配置打开 3. 运行
ap_review.py,填写文件顶部的配置项:预期控制台输出
成功运行后,控制台将输出如下内容(workspace_id、category_id 等 ID 因运行环境不同而变化):09 结果说明
抽取结果
处理完成后,每份文件将返回分类结果和字段抽取结果。字段抽取结果位于data.fields[],表格字段位于 data.items[][],每个字段包含 key、value 及坐标 position(可用于原文高亮回显)。
以下为发票样本文件的实际接口返回(来自 file/fetch,省略了部分 position 坐标):
sample_invoice.pdf
sample_invoice.pdf
审核结果
审核完成后,可从review/task/result 接口获取以下信息:
status:任务整体状态(1=审核通过,4=审核不通过,2=审核失败)statistics:规则通过数、不通过数汇总groups[].review_tasks[]:每条规则的详细审核结果,包含:review_result:该规则的审核结论(1=通过,4=不通过)reasoning:AI 给出的审核依据说明anchors:依据在原文中的坐标位置(可用于高亮回显)

