# 04-A 领料出库首批凭证控制

2026-09-13 接续 05-A 页面后启动。04-A 为执行中，本记录只覆盖已经实现的字段及凭证守护，不代表整项完成。

依据：详设 01 V1.0、06 V1.1 §4.9、§7.8、§7.10，原表 55/56，以及本地接续任务 04-A。原表岗位与独立申请模型仍按 Q-04 确认。

## 已实现

- 正式领料页单号改为保存后由服务端生成，移除旧客户端 LL 时间戳取号及无效请求字段。
- 新建明细可填写税率（0—100%，默认沿用 13%），按小数比例传给既有接口；详情继续展示服务端税额和价税合计。
- 首次打印记录仅允许已审单生成；已登记首次打印后不能再登记，摘要长度符合既有 64 字符列约束，写入使用显式事务。
- 打印所属月按 Asia/Shanghai 业务时区推导；旧记录的 UTC 月份在首次打印时刻存在时按业务月兼容。月界在北京月初 00:00 生效，不使用操作系统时区。
- 已打印且跨月未出库的凭证在查询返回中显示已作废，页面不提供出库动作；直接调用发料接口同样在改变状态、库存或 NC 写入之前拒绝。
- 已出库及已冲销单不会因跨月作废；过期拒绝不会生成库存反向流水或改变已发生事实。

## 验证

全解决方案构建 0 错误；前端 TypeScript、正式菜单及生产构建通过。应用筛选 MaterialIssuance、StockTransfer、Sprint6a 与 Permissions 共 210 项，领域 MaterialIssuance 与 StockTransfer 共 49 项通过。覆盖首次打印、重复打印、未审单拒绝、UTC/业务月份边界、跨月拒绝前库存与 NC 零写入、已出库/已冲销不失效，既有领料审批模式和持久化边界回归保留。

使用正式 React 入口和受控 API 返回逐屏检查：过期凭证详情显示失效原因且无出库动作，待出库统计不计失效单；新建输入税率 9% 后请求实际传 0.09，不再发送 issuanceNo，成功消息使用服务端单号。截图为代码仓 `output/playwright/04-a-expired-voucher.png` 和 `output/playwright/04-a-create-tax.png`。此检查未启动真实 ABP Host。

应用测试为仓储替身与实际库存更新器；真实 PostgreSQL 并发和事务结果须在 test.fxkyjt.cn 的现有 ERP 共享库另验。本轮没有部署或迁移数据库。

## 剩余工作及方案边界

- S-08/S-26 独立领料申请尚未落库；既有来源展示兼容 S-01/S-22 的采购申请，并有父单/组织/行归属校验，不能当作原表 55 的完整申领链路。是否增建独立申请、发起/审核/确认岗位及申领量—实发量衔接待 Q-04 确认。
- PlanCheckState 仍未接通有效计划匹配、明确计划行选择和 A-08 例外批准。本次未把字段默认值当成校验通过，04-A 的“无计划不发料”验收仍不成立。
- 模拟收款尚未实现；首次打印只补了既有登记接口的守护，尚无正式纸质产物生成与内容摘要闭环。
- 跨月失效目前是查询投影及发料守护，未新增后台任务将历史 print_state 批量落库。周期失效登记、审计、复制新单及重新核验仍需接续。
- 财务售价口径和真实 NC 业务联调保持既有待办，不将成本占位或 stub 回写算作完成。

2026-09-13 更新：本批代码、测试与交付记录已提交 `8218132e`，首批实际开发范围已回写设计仓本期记录。尚未推送或部署本批应用代码；正式面板不据此登记整项完成。
