某中型企业财务部每月处理大量报销单,团队疲于奔命:

| 痛点 | 具体表现 | 后果 |
|---|---|---|
| 发票录入耗时 | 每张发票手工录入 | 财务时间被重复劳动占满 |
| 合规审核靠人眼 | 真伪、抬头、连号靠抽检 | 漏检风险 |
| 重复报销难查 | 同一张票被报两次偶发出现 | 资金损失 |
| 报销周期长 | 提交到到账周期长 | 员工体验差 |
复制代码改造前:
员工贴发票 → 填写报销单 → 主管审批 → 财务初审 → 财务复审 → 出纳打款改造后:
员工拍照上传 → Agent 识别+填单+合规检查 → 主管审批 → 通过后打款
↓
异常 → 人工介入(附检查摘要)
复制代码com.example.finance/
├── tools/
│ ├── OcrTools.java # 发票 OCR
│ ├── ComplianceTools.java # 合规与重复报销检查
│ └── PaymentTools.java # 打款执行
├── hitl/
│ └── FinanceHitlController.java # 超标/异常审批
└── ReimbursementAgentApp.java
复制代码import org.noear.solon.ai.annotation.ToolMapping;
import org.noear.solon.ai.chat.tool.AbsToolProvider;
import org.noear.solon.annotation.Param;/** 发票 OCR 工具 */
public class OcrTools extends AbsToolProvider {
@ToolMapping(description = "识别发票图片,返回发票代码、号码、日期、金额、购买方、销售方等字段")
public String ocr_invoice(
@Param(description = "发票图片 base64 或文件 ID") String imageRef) {
// 生产环境调用 OCR 服务
return """
{
"code":"044001900111",
"number":"12345678",
"date":"2026-06-18",
"amount":1200.00,
"tax":72.00,
"total":1272.00,
"buyer":"某某科技有限公司",
"seller":"某某酒店",
"category":"住宿"
}
""";
}
}/** 合规检查工具 */
public class ComplianceTools extends AbsToolProvider {
@ToolMapping(description = "检查发票真伪、抬头、是否重复报销,返回合规结论")
public String check_invoice(
@Param(description = "发票号码") String invoiceNo,
@Param(description = "购买方名称") String buyer,
@Param(description = "价税合计") double total) {
// 生产环境:税务查验接口 + 已报销库查询 + 公司抬头校验
if ("12345678".equals(invoiceNo) && total > 0) {
return """
{
"invoiceNo":"12345678",
"titleOk":true,
"duplicate":false,
"taxVerified":true,
"result":"PASS",
"message":"合规检查通过"
}
""";
}
return """
{
"result":"REJECT",
"message":"发票校验失败,请转人工"
}
""";
} @ToolMapping(description = "按费用类别检查是否超过公司报销标准")
public String check_policy(
@Param(description = "费用类别,如住宿/交通/餐饮") String category,
@Param(description = "金额") double amount) {
if ("餐饮".equals(category) && amount > 400) {
return "{"result":"OVER_LIMIT","limit":400,"amount":"
+ amount + ","message":"餐饮超标准,需主管确认"}";
}
return "{"result":"OK","message":"符合标准"}";
}
}/** 打款工具(敏感操作) */
public class PaymentTools extends AbsToolProvider {
@ToolMapping(description = "提交报销打款。仅在合规通过且审批完成后调用")
public String submit_payment(
@Param(description = "报销单号") String reportId,
@Param(description = "收款人") String employee,
@Param(description = "打款金额") double amount) {
return "{"status":"submitted","reportId":"" + reportId
+ "","employee":"" + employee + "","amount":" + amount + "}";
}
}
复制代码import org.noear.solon.ai.agent.AgentSession;
import org.noear.solon.ai.agent.react.ReActAgent;
import org.noear.solon.ai.agent.react.intercept.HITLInterceptor;
import org.noear.solon.ai.agent.session.InMemoryAgentSession;
import org.noear.solon.ai.chat.ChatModel;ChatModel chatModel = LlmUtil.getChatModel();HITLInterceptor hitl = new HITLInterceptor()
.onTool("submit_payment", (trace, args) -> {
// 打款一律人工确认;也可按金额阈值判断
return "报销打款需财务确认";
});ReActAgent agent = ReActAgent.of(chatModel)
.role("""
你是企业智能报销助手。处理步骤:
1. 先 OCR 识别发票
2. 再做合规检查(真伪/抬头/重复报销)
3. 再检查费用标准
4. 全部通过后,生成报销摘要;需要打款时调用 submit_payment
5. 任一检查失败,明确列出原因并建议转人工
""")
.defaultToolAdd(new OcrTools())
.defaultToolAdd(new ComplianceTools())
.defaultToolAdd(new PaymentTools())
.defaultInterceptorAdd(hitl)
.modelOptions(o -> o.temperature(0.0))
.maxTurns(12)
.autoRethink(true)
.build();AgentSession session = InMemoryAgentSession.of("expense_report_001");String prompt = """
员工张三提交差旅报销,部门销售部。
已上传 1 张住宿发票图片,文件 ID=img_001。
请完成识别、合规检查,并在可打款时提交支付。
""";String result = agent.prompt(prompt)
.session(session)
.call()
.getContent();
不要虚构 Memory memory; memory.search(...)。
正确做法:
check_invoice 工具内部查“已报销发票库”(DB/Redis)duplicate=true 复制代码// check_invoice 内部伪代码
if (reimbursedInvoiceRepository.exists(invoiceNo)) {
return "{"result":"REJECT","message":"该发票已被报销过"}";
}
当 check_policy 返回 OVER_LIMIT 时:
复制代码HITLInterceptor hitl = new HITLInterceptor()
.onTool("submit_payment", (trace, args) -> {
double amount = Double.parseDouble(args.get("amount").toString());
if (amount > 2000) {
return "单笔报销超过 2000,需财务负责人审批";
}
return "常规报销打款确认";
});
若餐饮票 500 元、标准 400 元:
check_policy 返回超标准| 业务场景 | 核心工具 | 关键规则 | 业务价值 |
|---|---|---|---|
| 采购发票校验 | 发票识别 + 订单匹配 | 三单匹配 | 对账效率提升 |
| 备用金核销 | 发票识别 + 预算查询 | 超标预警 | 核销周期缩短 |
| 客户开票 | 开票 API + 商品匹配 | 额度控制 | 降低开票错误 |
| 凭证生成 | 发票识别 + 科目映射 | 借贷平衡 | 制证提速 |
| 进项税认证 | 发票识别 + 税务接口 | 可抵扣判断 | 减少人工认证 |