9.6 KiB
Codex 三期工程执行文档
适用范围:基于当前已经完成的通用后台底座,继续建设“农产品收购发票开票平台”业务闭环。
使用方式:建议你后续给 Codex 下任务时,一次只下发一个“任务包”,不要跨太多模块,这样实现时间更短、回归范围更可控。
1. 业务功能规划
1.1 新增业务菜单
当前系统管理、日志管理等菜单已经具备,后续只新增业务菜单,不重复建设已有后台功能。
建议新增一级菜单:
发票业务
建议在 发票业务 下新增 4 个菜单:
待开票列表- 用于查看业务系统返回的待开票数据、筛选、勾选、发起开票
开票任务- 用于查看开票状态、失败原因、票号信息、重试操作
认证中心- 用于处理票通认证状态、短信认证、扫码认证
票通账号配置- 用于维护公司与票通账号、默认开票参数、基础映射关系
说明:
开票结果不建议单独再做一个菜单,直接并入开票任务票通回调、主动查询补偿、业务系统回写不需要前端菜单,做后端能力即可
1.2 建议目录规划
为了适配当前项目结构,建议继续沿用现有 modules / features 风格,不要一开始就做大规模重构。
后端建议新增目录:
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
前端建议新增目录:
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 下指令时,也按下面的任务包来发,不要一次塞完整三期。
第一期:业务骨架和数据接入
目标:先把“业务菜单、业务数据接入、基础配置、任务落库”搭起来,不急着一次打通所有票通细节。
一期任务包建议:
-
新增业务菜单和前端页面骨架- 新增发票业务菜单
- 新建 4 个业务页面空壳
- 接通路由和权限码
-
新增业务表和后端模块骨架- 新增开票任务、任务明细、票通账号等表
- 新增 invoice 相关后端模块目录和路由注册
-
接入公司上下文和待开票列表- 打通当前用户所属公司信息
- 对接业务系统待开票列表接口
- 前端完成待开票列表查询展示
-
完成票通账号配置页- 后端完成账号配置增删改查
- 前端完成配置页面
-
完成本地开票任务创建骨架- 支持勾选数据创建本地任务
- 先把锁单、落库、状态初始化串起来
一期验收结果:
- 能看到新菜单
- 能查到待开票数据
- 能保存票通账号配置
- 能创建本地开票任务
第二期:开票主流程和认证流程
目标:把“发起开票 -> 遇到认证 -> 完成认证 -> 继续开票”这条主链路打通。
二期任务包建议:
-
接入票通开票主接口- 完成票通报文组装、加密、签名
- 打通蓝字开票主调用
-
补齐开票状态机和幂等控制- 固化
invoiceReqSerialNo - 完成
PENDING / PROCESSING / NEED_AUTH / SUCCESS / FAILED状态流转
- 固化
-
完成认证中心后端接口- 查询认证状态
- 短信验证码
- 短信登录
- 扫码二维码和扫码状态查询
-
完成前端开票确认和认证交互- 开票确认弹窗
- 短信认证弹窗
- 扫码认证弹窗
- 认证完成后继续原任务
-
完成开票任务列表和详情页- 展示任务状态、失败原因、票号信息
- 支持查看任务明细
二期验收结果:
- 能从待开票列表发起真实开票
- 遇到认证时可以完成短信或扫码认证
- 认证后可以继续原任务
- 能看到任务状态和开票结果
第三期:回调、补偿、稳定性收口
目标:把“结果同步、失败补偿、重试、运维可见性”补齐,让系统进入可持续使用状态。
三期任务包建议:
-
完成票通回调接收- 新增回调接口
- 完成验签、去重、状态更新
-
完成主动查询补偿- 定时查询处理中任务
- 补齐回调未达或超时场景
-
完成业务系统结果回写和补偿- 开票成功/失败回写业务系统
- 回写失败时记录补偿状态并支持重试
-
完成任务重试和异常处理- 支持失败任务重试
- 保证原幂等号复用
- 明确错误提示和异常留痕
-
完成页面收口和交付文档- 页面细节优化
- 状态文案统一
- 补一份联调说明和部署说明
三期验收结果:
- 开票结果可以通过回调或主动查询最终落定
- 结果能稳定回写业务系统
- 失败任务可以重试
- 系统具备基本可运维性
给 Codex 的推荐下发方式
后续你可以直接按下面这种方式给 Codex 发任务:
按一期第 1 个任务包做,只做菜单、路由和 4 个页面骨架,不做接口按一期第 3 个任务包做,只打通待开票列表前后端,不碰票通按二期第 3 个任务包做,只做认证中心后端接口和页面交互按三期第 2 个任务包做,只做处理中任务的主动查询补偿
这样做最适合 Codex:
- 单次上下文更清晰
- 改动范围更集中
- 验证更容易
- 出问题时也更容易回退和继续推进