# Codex 三期工程执行文档 适用范围:基于当前已经完成的通用后台底座,继续建设“农产品收购发票开票平台”业务闭环。 使用方式:建议你后续给 Codex 下任务时,一次只下发一个“任务包”,不要跨太多模块,这样实现时间更短、回归范围更可控。 ## 1. 业务功能规划 ### 1.1 新增业务菜单 当前系统管理、日志管理等菜单已经具备,后续只新增业务菜单,不重复建设已有后台功能。 建议新增一级菜单: - `发票业务` 建议在 `发票业务` 下新增 4 个菜单: - `待开票列表` - 用于查看业务系统返回的待开票数据、筛选、勾选、发起开票 - `开票任务` - 用于查看开票状态、失败原因、票号信息、重试操作 - `认证中心` - 用于处理票通认证状态、短信认证、扫码认证 - `票通账号配置` - 用于维护公司与票通账号、默认开票参数、基础映射关系 说明: - `开票结果` 不建议单独再做一个菜单,直接并入 `开票任务` - `票通回调`、`主动查询补偿`、`业务系统回写` 不需要前端菜单,做后端能力即可 ### 1.2 建议目录规划 为了适配当前项目结构,建议继续沿用现有 `modules` / `features` 风格,不要一开始就做大规模重构。 后端建议新增目录: ```text server/src/main/kotlin/com/bbit/platform/ database/invoice/ InvoiceJobTable.kt InvoiceJobItemTable.kt TaxAccountTable.kt InvoiceSyncLogTable.kt integration/biz/ BizSystemClient.kt BizInvoiceDtos.kt integration/piaotong/ PiaotongClient.kt PiaotongCrypto.kt PiaotongDtos.kt modules/invoice/candidate/ InvoiceCandidateModule.kt modules/invoice/job/ InvoiceJobModule.kt modules/invoice/auth/ InvoiceAuthModule.kt modules/invoice/settings/ TaxAccountModule.kt modules/invoice/callback/ PiaotongCallbackModule.kt modules/invoice/shared/ InvoiceStatus.kt InvoiceServices.kt ``` 前端建议新增目录: ```text web/src/ api/invoice/ candidates.ts jobs.ts auth.ts settings.ts types/invoice/ candidate.ts job.ts auth.ts settings.ts features/invoice/ candidates/index.vue jobs/index.vue auth-center/index.vue settings/index.vue components/invoice/ InvoiceConfirmDialog.vue InvoiceAuthDialog.vue InvoiceJobStatusTag.vue ``` ### 1.3 模块职责划分 建议后续只围绕 4 个业务模块推进: - `待开票模块` - 对接业务系统待开票列表 - 支持筛选、勾选、金额汇总、发起开票 - `开票任务模块` - 负责本地任务记录、状态流转、重试、详情查询 - `认证模块` - 负责认证状态查询、短信认证、扫码认证、认证后继续开票 - `账号配置模块` - 负责公司与票通账号、默认参数、启停状态维护 Codex 执行建议: - 不要把“票通对接、业务系统对接、前端页面、状态补偿”揉成一个任务 - 最适合的粒度是“一个模块的一条主链路” - 每次任务尽量能做到“改完即可本地验证一个页面或一个接口” ## 2. 需要准备的内容 这一章只写你这边需要准备的内容。票通接口文档已经在项目 `doc/` 目录里,后续不需要你再重复整理一遍。 ### 2.1 你自己的业务系统接口资料 这是最关键的一部分,建议你提前准备并确认下面这些接口或数据来源: - `当前登录人/公司上下文接口` - 至少要能拿到 `userId`、`companyId`、公司名称、销方税号 - `待开票列表接口` - 至少要能返回待开票主数据、金额、税率、商品信息、购销双方信息、唯一业务单号 - `开票前写库/锁单接口` - 发起开票前锁定业务数据,避免重复开票 - `开票结果回写接口` - 回写成功/失败状态、发票号码、数电发票号码、失败原因、票通流水号 - `可选:解锁或撤销接口` - 如果开票失败后需要解除业务锁定,最好也提前明确 每个接口至少准备 5 类信息: - 请求地址和调用方式 - 鉴权方式 - 请求参数说明 - 返回字段说明 - 一份真实示例报文 ### 2.2 业务规则说明 Codex 能写代码,但业务规则如果不明确,后面很容易返工。建议你提前确认这些规则: - 一条待开票数据是否对应一张发票,还是允许合并开票 - 发票商品行从哪里来,是业务系统直接给,还是平台侧组装 - 税率、税收分类编码、商品名称是否有默认规则 - 哪些字段缺失时不能发起开票 - 开票失败后,业务系统状态如何处理 - 同一业务单据的重复开票判断依据是什么 - 一个公司是否可能配置多个票通账号 ### 2.3 联调和测试资源 建议你至少准备一套可联调的数据环境: - 业务系统测试地址 - 可用的测试公司 - 至少 1 个可用测试账号 - 3 组待开票测试数据 - 正常成功 - 需要认证 - 明确失败 最好再补两类样例: - 一份真实的待开票列表返回数据 - 一份真实的开票结果回写样例 ### 2.4 环境和配置准备 建议你提前准备好下面这些配置: - 后端数据库连接信息 - Redis 连接信息 - 前端、后端联调地址 - 业务系统的接口鉴权配置 - 票通测试账号、密钥、平台编码 - 能接收回调的测试域名或内网穿透地址 说明: - 票通接口定义已经在 `doc/` 中,重点是确认账号和环境真实可用 - 如果业务系统接口还没稳定,建议先给一版 mock 或示例 JSON,Codex 可以先按样例落代码 ## 3. 具体的三期工程执行内容 ### 总体执行原则 三期都建议按“任务包”推进。每个任务包尽量满足下面三个条件: - 改动范围集中,不跨太多目录 - 能在一次对话里做完并验证 - 做完后能形成明确可见结果 建议你后续给 Codex 下指令时,也按下面的任务包来发,不要一次塞完整三期。 ### 第一期:业务骨架和数据接入 目标:先把“业务菜单、业务数据接入、基础配置、任务落库”搭起来,不急着一次打通所有票通细节。 一期任务包建议: 1. `新增业务菜单和前端页面骨架` - 新增发票业务菜单 - 新建 4 个业务页面空壳 - 接通路由和权限码 2. `新增业务表和后端模块骨架` - 新增开票任务、任务明细、票通账号等表 - 新增 invoice 相关后端模块目录和路由注册 3. `接入公司上下文和待开票列表` - 打通当前用户所属公司信息 - 对接业务系统待开票列表接口 - 前端完成待开票列表查询展示 4. `完成票通账号配置页` - 后端完成账号配置增删改查 - 前端完成配置页面 5. `完成本地开票任务创建骨架` - 支持勾选数据创建本地任务 - 先把锁单、落库、状态初始化串起来 一期验收结果: - 能看到新菜单 - 能查到待开票数据 - 能保存票通账号配置 - 能创建本地开票任务 ### 第二期:开票主流程和认证流程 目标:把“发起开票 -> 遇到认证 -> 完成认证 -> 继续开票”这条主链路打通。 二期任务包建议: 1. `接入票通开票主接口` - 完成票通报文组装、加密、签名 - 打通蓝字开票主调用 2. `补齐开票状态机和幂等控制` - 固化 `invoiceReqSerialNo` - 完成 `PENDING / PROCESSING / NEED_AUTH / SUCCESS / FAILED` 状态流转 3. `完成认证中心后端接口` - 查询认证状态 - 短信验证码 - 短信登录 - 扫码二维码和扫码状态查询 4. `完成前端开票确认和认证交互` - 开票确认弹窗 - 短信认证弹窗 - 扫码认证弹窗 - 认证完成后继续原任务 5. `完成开票任务列表和详情页` - 展示任务状态、失败原因、票号信息 - 支持查看任务明细 二期验收结果: - 能从待开票列表发起真实开票 - 遇到认证时可以完成短信或扫码认证 - 认证后可以继续原任务 - 能看到任务状态和开票结果 ### 第三期:回调、补偿、稳定性收口 目标:把“结果同步、失败补偿、重试、运维可见性”补齐,让系统进入可持续使用状态。 三期任务包建议: 1. `完成票通回调接收` - 新增回调接口 - 完成验签、去重、状态更新 2. `完成主动查询补偿` - 定时查询处理中任务 - 补齐回调未达或超时场景 3. `完成业务系统结果回写和补偿` - 开票成功/失败回写业务系统 - 回写失败时记录补偿状态并支持重试 4. `完成任务重试和异常处理` - 支持失败任务重试 - 保证原幂等号复用 - 明确错误提示和异常留痕 5. `完成页面收口和交付文档` - 页面细节优化 - 状态文案统一 - 补一份联调说明和部署说明 三期验收结果: - 开票结果可以通过回调或主动查询最终落定 - 结果能稳定回写业务系统 - 失败任务可以重试 - 系统具备基本可运维性 ### 给 Codex 的推荐下发方式 后续你可以直接按下面这种方式给 Codex 发任务: - `按一期第 1 个任务包做,只做菜单、路由和 4 个页面骨架,不做接口` - `按一期第 3 个任务包做,只打通待开票列表前后端,不碰票通` - `按二期第 3 个任务包做,只做认证中心后端接口和页面交互` - `按三期第 2 个任务包做,只做处理中任务的主动查询补偿` 这样做最适合 Codex: - 单次上下文更清晰 - 改动范围更集中 - 验证更容易 - 出问题时也更容易回退和继续推进