# 采购来票 + 付款关联来票 - 前端联调方案 ## 涉及页面 - 采购来票管理页(来票列表、新增/编辑/详情弹窗) - 采购订单详情页(展示该订单下已关联的来票信息) - 付款单管理页(新建/编辑弹窗、列表、详情) - 付款单详情页(展示关联的来票信息) ## 业务流程与数据带入 1. 采购订单(审核通过)-> 创建来票:`purchaseOrderId` 必选,供应商自动带出(以采购订单的供应商为准,前端无需传 `supplierId`,由后端按采购订单查询设置)。 2. 来票创建后 -> 上传发票附件(走 system 模块 Storage API)。**来票创建即生效,无审核环节**。 3. 新建付款单 -> 选择关联来票(`invoiceId` 必填):从 `GET /erp/purchase-invoice/simple-list?supplierId=&purchaseOrderId=` 选择,仅显示"已上传附件 + 剩余可付金额 > 0"的来票;选择后 `remainingInvoicePrice` 可用于预填付款金额上限。 对应关系:**采购订单(1) -> 来票(N) -> 付款(M)**。 ## API ### 1. 来票管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | /erp/purchase-invoice/create | 创建来票 | | PUT | /erp/purchase-invoice/update | 更新来票 | | DELETE | /erp/purchase-invoice/delete?id= | 删除来票 | | GET | /erp/purchase-invoice/get?id= | 获得来票详情 | | GET | /erp/purchase-invoice/page | 来票分页 | | GET | /erp/purchase-invoice/export-excel | 导出来票 Excel | | GET | /erp/purchase-invoice/simple-list?supplierId=&purchaseOrderId= | 精简列表(付款表单选来票) | > 已移除接口:`/erp/purchase-invoice/update-status`(审核/反审核)、`/erp/purchase-invoice/audit-count`(待审核数量)。前端请同步删除对应按钮与接口调用。 **创建/更新来票请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | id | Long | 否 | 更新时必填 | | purchaseOrderId | Long | 是 | 采购订单编号,必选 | | supplierId | Long | 否 | 供应商编号,**不传**,由后端按采购订单查询设置 | | invoiceNo | String | 否 | 发票号码 | | invoiceTitle | String | 否 | 发票抬头 | | price | BigDecimal | 是 | 来票金额(元) | | invoiceTime | LocalDateTime | 是 | 来票日期 | | remark | String | 否 | 备注 | | blobIds | List\ | 否 | 发票附件 blobId 列表 | **来票分页/详情响应字段:** | 字段 | 类型 | 说明 | |------|------|------| | no | String | 来票编号(后端生成,前缀 FPD) | | supplierName | String | 供应商名称 | | order | Object | 采购订单信息(嵌套) | | attachmentList | List | 发票附件列表 | | hasAttachment | Boolean | 是否已上传发票附件 | | remainingInvoicePrice | BigDecimal | 剩余可付金额 = 来票金额 - 该来票已付款金额 | > 已移除响应字段:`auditStatus`(审批状态)、`processInstanceId`(工作流编号)。 **simple-list 响应:** | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 来票编号 | | no | String | 来票编号 | | invoiceNo | String | 发票号码 | | invoiceTitle | String | 发票抬头 | | price | BigDecimal | 来票金额 | | supplierId | Long | 供应商编号 | | purchaseOrderId | Long | 采购订单编号 | | hasAttachment | Boolean | 是否已上传附件(恒为 true) | | remainingInvoicePrice | BigDecimal | 剩余可付金额 | ### 2. 付款单 | 方法 | 路径 | 说明 | |------|------|------| | POST | /erp/finance-payment/create | 创建付款单,请求体含 `invoiceId`(必填) | | PUT | /erp/finance-payment/update | 更新付款单,请求体含 `invoiceId`(必填) | | GET | /erp/finance-payment/get | 响应含 `invoiceId`、`invoice` 嵌套对象 | | GET | /erp/finance-payment/page | 响应含 `invoiceId`、`invoice` 嵌套对象 | **请求参数新增:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | invoiceId | Long | 是 | 关联的来票编号(新建付款单必填) | **响应字段新增:** | 字段 | 类型 | 说明 | |------|------|------| | invoiceId | Long | 关联的来票编号 | | invoice | Object | 关联的来票信息(含 no、invoiceNo、invoiceTitle、price 等) | **响应示例:** ```json { "code": 0, "data": { "id": 1, "no": "FKD20260810000001", "invoiceId": 100, "invoice": { "id": 100, "no": "FPD20260810000001", "invoiceNo": "02564178", "invoiceTitle": "XX科技有限公司", "price": 9000.00 }, "paymentPrice": 5000.00 } } ``` ## 字段展示规则 | 字段 | 展示位置 | 说明 | |------|----------|------| | 来票编号 | 来票列表、详情、付款详情 | 前缀 FPD | | 供应商 | 来票列表、详情 | 按采购订单带出 | | 采购订单 | 来票列表、详情 | 展示订单编号/信息 | | 发票号码/抬头 | 来票列表、详情 | 录入字段 | | 来票金额 | 来票列表、详情、付款表单 | 元 | | 来票日期 | 来票列表、详情 | | | 发票附件 | 来票详情、来票列表 | 上传/预览/下载,有附件显示"已上传"Tag | | 剩余可付金额 | 来票列表、付款表单 | 来票金额 - 已付款金额 | | 关联来票 | 付款列表、付款详情 | 展示 invoice.no / invoice.invoiceNo / invoice.price | > 已移除展示字段:来票列表的"审批状态"列、搜索条件"审核状态"、"审核/反审核"操作按钮。 ## 业务规则说明 | 场景 | 规则 | |------|------| | 来票创建 | 采购订单必须审核通过;来票供应商与采购订单一致;来票金额不超过订单剩余可开票金额;**创建即生效,无需审核** | | 来票编辑 | 任意状态可编辑,无审核状态限制 | | 来票删除 | 已有有效付款单(未作废且付款金额 > 0)关联的来票不可删除,其余可删除 | | 付款选择来票 | 已上传发票附件且剩余可付金额 > 0 的来票可选(**不再要求审核通过**) | | 付款金额上限 | 付款金额 <= 该来票金额 - 该来票已付款金额(未审核+审批中+已审核付款,排除作废) | | 供应商一致性 | 付款的供应商必须与关联来票的供应商一致 | | 存量付款单 | invoiceId 为空的存量付款单,编辑时需重新选择合格来票 | ## 注意事项 - 来票供应商不从前端传入,创建/更新时由后端根据采购订单自动设置,前端表单只展示。 - 付款表单选择来票时,先按供应商过滤(`supplierId`),可选订单时传 `purchaseOrderId` 进一步过滤。 - `remainingInvoicePrice` 为负数或 0 的来票不会出现在 simple-list 中,前端可直接按返回列表渲染。 - 付款金额校验在后端,前端可将来票的 `remainingInvoicePrice` 作为付款金额输入上限提示。 - 来票发票附件上传使用 system 模块 Storage API(upload -> bind),不要使用旧版 /infra/file 接口。