Laravel收到账单PDF后,先确认提取字段,再写入业务表

AI摘要
账单PDF金额识别后先进入候选字段确认,再经校验与事务写入正式业务表;以教学账单BILL-271为例,金额135.60元、折扣0.00、到期日为空,解析结果与业务对象分离,金额用两位小数字符串校验,重复确认依源文件哈希唯一约束返回已有记录,并记录原始解析与人工修改。属技术型知识分享。

Laravel账单字段确认:先确认,再入库

账单PDF识别出金额后,不应立即写入正式业务表。先把候选字段和原文件放在一起确认,能避免将缺失日期、零折扣或错误金额静默带入系统。

本例用教学账单BILL-271,金额135.60元、折扣0.00、到期日未填写。

解析结果与候选字段分开

先用ComPDF全文解析接口取得实际输出。本次JSON包含正文和表格;应用再针对这个教学模板提取金额与折扣。不要把应用的正则映射说成接口已经直接返回了账单业务对象。

教学包包含输入、实际解析结果和 examples/laravel 完整示例,下载需要能访问Google Drive。解压后先在 examples/laravel 运行 composer install,再回到包的根目录执行:

php examples/laravel/review-check.php results/invoice-parsed/result_json.json samples/invoice.pdf

程序读取包中预先保存的解析JSON和原PDF,检查候选字段、确认写入和重复确认。它不会重新调用ComPDF API;测试使用本地SQLite,不连接实际财务系统。环境需有Laravel的正常依赖,包括mbstring与PDO SQLite。

确认后才进入事务

金额用带两位小数的字符串校验,本例存储也用字符串;生产表可以选择适当的定点类型。不要先转成浮点数再计算。

$validated = Validator::make($input, [
    'amount' => ['required', 'regex:/^\d+\.\d{2}$/'],
    'discount' => ['required', 'regex:/^\d+\.\d{2}$/'],
    'due_date' => ['nullable', 'date_format:Y-m-d'],
])->validate();

0.00是明确的零值,未填写的到期日保持null。确认接口还应使用应用既有的登录、权限和CSRF保护;教学CLI没有替代这些入口控制。

教学账单解析后的候选金额、零折扣与空日期;字段确认流程示意

图:教学账单解析后的候选金额、零折扣与空日期;字段确认流程示意

重复确认不要重复建记录

教学表对源文件哈希设置唯一约束,同一文件再次确认返回已有记录。正式应用还应加上租户范围和业务版本规则;文件内容相同并不总表示业务操作相同。

确认写入放在事务内,并记录原始解析结果与人工修改,不覆盖原件。示例只覆盖顺序重复确认,不用它证明并发请求已经处理完善。

验收读回的数据

本次PHP 8.4.27、Laravel 12.69.3检查通过:确认前没有记录、重复确认只有一条、折扣仍是0.00、日期仍为空、非法金额被拒绝。框架检查与ComPDF解析结果要分别保存,便于定位问题。

后续需要多模板、分类或更完整处理流程时,可评估DocSlight。本例没有测试DocSlight企业功能,也没有作财务合规或全自动入账承诺。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
37
粉丝
2
喜欢
7
收藏
9
排名:1412
访问:2714
私信
所有博文
社区赞助商