如何构建用于跟踪供应商发票与付款的 Web 应用
构建供应商发票 Web 应用的逐步方案:采集发票、路由审批、跟踪付款状态、发送提醒并安全地汇报支出。

定义目标与 MVP 范围
在选择工具或绘制界面之前,先明确你要解决的具体问题以及为谁解决。供应商发票应用根据日常接触人员的不同,需求会差别很大。
确认主要用户
先列出核心用户群:
- 应付账款(AP)人员:接收发票、修正明细并推进流程
- 审批人(部门负责人、项目负责人):确认发票有效性
- 财务负责人:关注控制、报表与现金计划
- 供应商(可选):如果后来加入供应商提交与可见性门户
把 MVP 设计围绕最小用户集合展开——通常是 AP + 审批人。
定义最重要的目标
筛选出三个最关键的成果,常见选择:
- 减少逾期付款(明确到期日、提醒、减少卡住的发票)
- 加快审批速度(减少催促、减少 “这到哪了?” 的查询)
- 记录更整洁(发票数据与决策的单一真相来源)
把这些结果写下来;它们将成为验收标准。
统一“付款状态”词汇
团队对“已付”常有不同理解。及早决定你的官方状态,例如:
- Draft → Submitted → Approved → Scheduled → Paid
同时明确触发状态变更的事件(审批、导出到会计、银行确认等)。
锁定 MVP 以避免范围蔓延
对于 MVP,目标是:发票采集、基本校验、审批路由、状态跟踪和简单报表。把高级功能(OCR、供应商门户、深度 ERP 同步、复杂异常处理)放到“后续”列表并说明理由。
绘制发票到付款的工作流
在构建界面或表之前,把发票在公司内的真实流转路径写下来——从到达那一刻到付款确认为止。这将成为你应用状态、通知和报表的事实来源。
从当前现实开始
记录发票进入的渠道(邮箱、供应商门户、邮件扫描、员工上传)以及接下来谁会接触它们。访谈应付人员和至少一位审批人;你通常会发现非正式步骤(侧面邮件、电子表格检查),这些要么必须支持,要么需刻意移除。
定义必需的检查点
大多数发票到付款流程有几个强制门槛:
- 记账/科目编码(GL/科目、成本中心、项目、税务处理)
- 审批(单一审批、多步或并行)
- 付款执行(已计划、已发起、已发送)
- 对账(银行/ERP 确认,汇款单匹配)
把每个检查点写成状态变更并明确责任人及输入/输出。例如:“AP 为发票做编码 → 发票变为‘准备审批’ → 审批人批准或要求修改。”
及早列出例外情况
列出会打破简单顺路的边缘情况:
- 部分付款与跨发票拆分付款
- 争议(价格/数量不符)、挂起和供应商贷项/贷记单
- 重复发票(同编号/供应商/金额)与重新提交
设定 SLA 与升级规则
为每一步决定时间期望(例如审批在 3 个工作日内,付款在净期内)及超时处理:提醒、升级到经理或自动重新路由。这些规则将驱动你的通知和报表设计。
设计数据模型与状态
清晰的数据模型能保证发票在从上传到付款流转时的一致性。先从一小组可扩展的实体开始。
核心实体(你要存哪些)
至少将它们建为独立的表/集合:
- 供应商(Vendor):名称、税号/VAT、默认币种、付款条款、联系邮箱
- 发票(Invoice):vendor_id、invoice_number、issue_date、due_date、currency、subtotal、tax_total、total、PO_number(可选)、备注
- 明细行(Line Item)(MVP 可选,但有用):invoice_id、描述、数量、单价、税率、行总额
- 审批(Approval):invoice_id、approver_id、decision(Approved/Rejected)、decision_at、comment
- 付款(Payment):invoice_id、method、amount、scheduled_date、paid_date、reference(银行/交易 ID)
- 附件(Attachment):invoice_id、file_name、storage_key/url、uploaded_by、uploaded_at
将金额字段按整数(例如以分为单位)存储以避免四舍五入误差。
必填字段(使发票“真实”)
提交时将这些设为必填:供应商、发票号、开票日、币种和总额。如果流程依赖,添加 到期日、税额、PO 号 为必填。
状态枚举(如何描述进度)
在发票上定义单一状态以便每个人看到相同事实:
- Draft → 正在录入
- Submitted → 准备审核
- Approved / Rejected → 已决策
- Scheduled → 已计划付款
- Paid → 已结清
防重复机制
对 (vendor_id, invoice_number) 增加唯一约束。这是在加入发票上传与 OCR 之前对双重录入的最简单、效果最高的保护。
常见问题
谁应该是 MVP 供应商发票应用的主要用户?
从 应付账款(AP)人员 + 审批人 开始。这对组合解锁了核心闭环:发票被采集、校验、审批并跟踪到付款。
在流程稳定并且确认被采用后,再加入财务管理员、报表查看者和供应商门户。
在开始构建之前应该定义哪些最佳的 MVP 目标?
选择 3 个可衡量的结果,并把它们作为验收标准,例如:
- 减少逾期付款(更清晰的到期可见性与提醒)
- 加快审批(清晰队列与升级机制)
- 更整洁的记录(单一真相来源 + 审计日志)
如果某个功能不能提升上述任意一项,就把它推到“以后”。
我们如何选择发票和付款状态以免让团队困惑?
写下一条官方的状态链及每次变更的触发条件,例如:
- Draft → Submitted(AP 完成必填字段)
- Submitted → Approved/Rejected(审批人记录决策)
- Approved → Scheduled(计划付款)
- Scheduled → Paid(银行/会计确认 + 参考 ID)
避免使用像 “processed” 这种模糊状态,除非你能精确定义其含义。
针对发票、审批与付款我们应该以什么数据模型开始?
最小实用的数据表/集合:
- 供应商(Vendor)
- 发票(Invoice)
- 审批(Approval,记录不可变的决策)
- 付款(Payment,支持部分/多次付款的一对多)
- 附件(Attachment)
将金额字段按整数存储(例如以分为单位)以避免四舍五入误差,并保留原始发票文件不做改变。
我们如何防止发票被重复录入或被重复支付?
对 (vendor_id, invoice_number) 强制唯一约束。这是防止重复录入和重复付款的最直接高效手段。根据需要,可增加二次检查(金额/日期窗口)以应对供应商复用编号的情况。
在 UI 中显示“可能重复”的警告,并附上匹配发票的链接,方便 AP 快速核查。
在应付流程中哪些角色和权限是必需的?
使用精简的角色集合并以动作为中心的权限:
- AP Admin:管理设置、审批规则、异常覆盖
- AP Clerk:上传发票、修正校验错误、准备审批前的项
- 审批人:审批/拒绝分配给他们的发票
- 财务管理员:确认付款、对账、导出
- 只读:仅查看
将权限绑定到动词(view, create/upload, edit, approve, export)而不是具体页面。
委托审批(旷工/外出代签)应如何工作?
支持以下委托审批功能:
- 起止日期
- 审计备注,如 “由代理在 X 的授权下审批”
- 委托创建需受限(由 AP Admin 或经理创建)
并提供一个显示当前委托的页面,让覆盖关系对所有人可见、可审查。
哪些发票采集与校验规则可以预防后端问题?
把校验作为 保存 和 提交 的门槛:
- 必填字段:供应商、发票号、发票日期、总额、币种、到期日
- 日期规则:到期日不得早于发票日;对未来发票日给出警告
- 金额规则:非负总额;一致的四舍五入规则
- 重复检查:根据策略阻挡或警告
所有采集方式(手动、上传、邮件)都应产生相同的输出:一个 草稿发票 + 原始附件。
我们如何对部分付款建模并准确区分“已计划(Scheduled)”与“已付款(Paid)”?
将付款视为第一类记录,包含:
- 方式(ACH、wire、电汇、支票、卡、处理器)
- 发送/支付日期(记录实际发送时间)
- 金额
- 参考 ID(银行追踪号、支票号、交易 ID)
计算方式:
- 已付金额 = sum(payments)
- 未付余额 = 发票总额 − 已付金额
这让部分付款、计划与对账都变得清晰,而不是仅靠“已付款”复选框。
在不破坏工作流的情况下,安全地添加会计/ERP 集成的最佳方法是什么?
以 MVP 友好的方式开始集成:
- 先提供稳定的 CSV 导出,包含内部 ID,避免重复导入
- 明确哪个系统(QuickBooks/Xero/NetSuite 等)负责供应商记录、总账科目和付款确认
- 每次导出/同步都记录日志并提供清晰失败原因与重试机制
只有在内部流程可靠且审计到位后,再考虑双向同步。