# Data Model: REV-005 发票业务流实现 ## 建模原则 - 以“逻辑实体 + 现有在线主表承接 + 历史关系快照”三层表达,避免把旧系统全部 IV_* 细表误写为当前已落地在线表。 - 后台开票、客户侧查询下载、`SYS-008` 查询兜底、结果回写统一围绕单一发票申请主线建模。 - 一期不支持原始单账单直接任意部分开票,但关系模型需兼容拆账/分账后的多账单、多发票映射扩展。 ## 实体一:InvoiceApplication(发票申请单) ### 作用 统一承接后台单笔/批量已收费账单的发票申请输入,是 `IF-REV-008` 的主业务对象。 ### 核心字段 | 字段 | 类型 | 说明 | |------|------|------| | applicationNo | String | 发票申请单号 / 协同请求号 | | chargeIds | Array | 关联账单 ID 列表 | | custId | Long | 客户 ID | | invoiceType | Enum | `ELECTRONIC` / `PAPER` | | invoiceTitle | String | 发票抬头 | | taxNo | String | 纳税人识别号 | | invoiceAmount | Decimal | 本次申请开票总金额 | | receiverEmail | String | 电子票接收邮箱 | | receiverMobile | String | 电子票接收手机号 | | sourceChannel | Enum | `COUNTER` / `FINANCE_BACKOFFICE` | | applyStatus | Enum | `SUBMITTED` / `ACCEPTED` / `REJECTED` | | appliedAt | DateTime | 申请时间 | ### 校验规则 - `chargeIds`、`custId`、`invoiceType`、`invoiceTitle` 必填。 - 账单必须满足“已收费、未开票、未作废”。 - 原始单账单不允许直接任意部分金额开票;如需多张发票应来源于拆账/分账后的账单集合。 - 对同一账单组合的重复申请需按 `applicationNo` 或 `custId + chargeIds` 做幂等控制。 ### 物理承接 - 主承接:`biz_invoice` - 关联输入:`biz_cust_invoice`、`biz_charge*` ## 实体二:InvoiceRecord(发票记录) ### 作用 描述发票服务受理、开具成功/失败、票号回写、电子票文件地址等结果信息。 ### 核心字段 | 字段 | 类型 | 说明 | |------|------|------| | invoiceId | Long | 发票记录 ID | | applicationNo | String | 对应申请单号 | | sysRequestNo | String | `SYS-008` 受理号 / 外部请求号 | | invoiceStatus | Enum | `PENDING` / `SUCCESS` / `FAIL` / `INVALID` / `RED_INK` | | invoiceCode | String | 发票代码 | | invoiceNumber | String | 发票号码 | | invoiceDate | DateTime | 开票日期 | | fileUrl | String | 电子发票下载地址 | | failReason | String | 开票失败原因 | | pushStatus | Enum | `NONE` / `PUSHED` / `FAIL` | | updatedAt | DateTime | 最近状态更新时间 | ### 状态关系 - `PENDING` 表示已提交给 `SYS-008` 但尚未确认最终结果。 - `SUCCESS` 后允许客户侧查询、下载、推送电子发票。 - `FAIL` 记录失败原因并进入异常核查或人工重试。 ### 物理承接 - 主承接:`biz_invoice` - 历史参照:旧 `IV_INVOICE_INFOS` ## 实体三:ChargeInvoiceRelation(账单-发票关联) ### 作用 承接账单与发票的映射关系,支持单票对应多账单、拆账后分别开票和后续合并开票扩展。 ### 核心字段 | 字段 | 类型 | 说明 | |------|------|------| | relationId | Long | 关联记录 ID | | chargeId | Long | 账单 ID | | invoiceId | Long | 发票 ID | | applicationNo | String | 申请单号 | | relationType | Enum | `FULL_AMOUNT` / `SPLIT_BILL` / `MERGED_BILL` | | invoiceAmount | Decimal | 当前账单对应开票金额 | | relationStatus | Enum | `PENDING` / `BOUND` / `FAILED` | | snapshotVersion | String | 开票配置/税率快照版本 | ### 关键规则 - 一期默认 `relationType=FULL_AMOUNT` 或 `SPLIT_BILL`(来自拆账后的账单),不支持对原始单账单直接自由部分金额开票。 - 发票成功后必须把关系状态更新为 `BOUND`,并可供账单详情查询。 ### 物理承接 - 在线主承接:`biz_invoice` + 历史关系快照 - 历史参照:旧 `IV_CHARGE_INVOICES`、`IV_CHARGE_INVOICE_MAPPINGS` ## 实体四:InvoiceQueryTask(开票查询补偿任务) ### 作用 支持异步申请后的轮询查询、超时补偿和人工兜底查询,是“查询兜底”模式的核心对象。 ### 核心字段 | 字段 | 类型 | 说明 | |------|------|------| | queryTaskId | Long | 查询任务 ID | | applicationNo | String | 申请单号 | | sysRequestNo | String | 外部受理号 | | lastTryTime | DateTime | 最后一次查询时间 | | nextTryTime | DateTime | 下一次查询时间 | | tryCount | Integer | 已查询次数 | | queryStatus | Enum | `WAITING` / `RUNNING` / `DONE` / `FAILED` | | latestResult | String | 最近一次查询结果摘要 | | latestError | String | 最近一次查询错误 | ### 关键规则 - 申请成功后默认生成查询任务。 - 查询到终态后任务进入 `DONE`。 - 查询异常不应覆盖已成功开票状态,只记录异常并等待人工或系统补偿。 ### 物理承接 - 主承接:`biz_invoice` 扩展字段或关联查询日志对象 - 历史参照:旧发票表中的 `last_try_time`、`next_try_time`、`try_count` ## 实体五:InvoiceResultWriteBack(结果回写) ### 作用 统一描述 `SYS-008` 查询结果或主动回传结果进入营收域后的状态变更、幂等控制和操作留痕。 ### 核心字段 | 字段 | 类型 | 说明 | |------|------|------| | writeBackNo | String | 回写流水号 | | applicationNo | String | 申请单号 | | invoiceStatus | Enum | 发票状态 | | writeBackStatus | Enum | `SUCCESS` / `IGNORE_REPEAT` / `FAIL` | | invoiceCode | String | 发票代码 | | invoiceNumber | String | 发票号码 | | fileUrl | String | 下载地址 | | rawPayload | String | 原始回写/查询响应 | | processedAt | DateTime | 处理时间 | | processedBy | String | 系统任务 / 人工处理人 | ### 关键规则 - 按 `applicationNo + invoiceStatus` 做幂等控制。 - 已成功开票后收到失败结果,不覆盖成功状态,转入异常核查。 - 所有回写处理必须记录到操作留痕对象。 ### 物理承接 - 主承接:`biz_invoice` + `biz_operat_log*` ## 关系总览 ```text InvoiceApplication --> InvoiceRecord InvoiceApplication --> ChargeInvoiceRelation InvoiceApplication --> InvoiceQueryTask InvoiceRecord --> InvoiceResultWriteBack ChargeInvoiceRelation --> biz_charge* (N:1) InvoiceApplication --> biz_cust_invoice InvoiceApplication --> biz_invoice_taxrate InvoiceResultWriteBack --> biz_operat_log* ``` ## 状态与边界说明 - 一期默认后台申请、客户侧结果消费,不定义客户侧直接申请状态机。 - 作废、红冲作为 REV-005 后续能力保留在数据模型中,但 implement 时优先保证正常开票闭环。 - 旧发票明细、营业账开票关系、配置快照对象在当前阶段仅作为历史参照和追溯来源,不表述为已确认新增在线独立表。