# 05-A 移拨明确缺陷开发复验

同组织跨仓移拨及发出、在途、签收、完整冲销的明确缺陷已完成本地修复。05-A 整项仍为部分完成：申请分工、跨组织审批与结算按 Q-04 另行确认，正式岗位和数据库复验尚未执行。

依据：详设 01 V1.0、06 V1.1 §4.11/§7.4/§7.5、10 V1.2、10A V1.0 岗位矩阵及内部任务 05-A。代码仍复用 S-12/S-28 与既有库存更新器，没有改写上游设计或重做库存底座。

## 本次修复

- 同组织可以跨仓移拨；同一组织、同一仓库不能自调。双方组织—仓库 M-16 授权必须有效，货位及库区属于对应仓库、启用且正常。
- 调出可用量由既有 S-13/S-14 规则约束，预占量不能借作可用量。发出后调出库存减少，调入库存保持不变；签收才增加调入库存。
- 调入金额以原调出 S-21 实际金额为准，不采用录入标价。每行校验原调出流水的单据、明细、组织、仓库、物料、批次、货位、类型、数量及未冲销状态。单据总额同步为实际成本。
- 调入流水、余额及新建批次余额使用调入组织的 SubGroupId；移拨单头仍归调出方。此次只修复既有数据归属，不裁定跨组织结算。
- `InTransitQuantity/Amount` 为已发出状态的数量及金额查询投影；签收后归零。没有新增独立在途台账或数据库列，本次接续另补同组织办理页，见下节。
- 发出、签收、冲销先更新本单既有并发版本，再执行库存操作；各动作使用显式事务。重复发出/签收由状态约束拒绝，库存幂等键保留。
- 发出后签收只重验接收侧引用；调出侧随后停用不抹去已发出事实。接收侧被冻结或 M-16 撤销时拒绝签收，原合法在途状态保留。
- 仅已签收单可完整冲销：先撤销全部接收流水，再恢复全部调出流水，数量和金额严格取原流水反数。接收库存不足、预占、冻结或部分补偿时明确失败，不能只补调出仓。重复完整冲销不多记；历史仅改状态时可补齐一次。
- 已发出单不能作废或直接冲销，保留实物在途事实。已签收冲销须具备双方组织和仓库范围及独立冲销权限。
- 直接 API 的审批、发出、签收人员取当前账号关联的有效 Nova Person；旧人员参数仅兼容保留，不能指定他人。既有工作流完成回调仍负责审批/驳回状态，未改造其人员回填、发起或路由。

**设计与代码冲突已报告：** 旧代码强制调出、调入组织不同，并把录入价用于调入；详设允许同组织跨仓并要求实际成本。本次按既有设计修正上述两项，未改写设计事实源。跨组织申请、审批及结算未自行裁定。

## 接口操作与权限

基础路径 `/api/supply-cores/stock-transfers`，查询和页面仍要求 `SupplyCore.Inventory`。动作权限在控制器与应用服务两层保持一致；测试管理员授予全集。10A 未列清普通岗位的各个移拨动作，普通角色未自动新增授权，高敏审批和冲销须按业务确认配置。

| 操作 | 请求 | 附加动作权限 | 数据范围 |
| --- | --- | --- | --- |
| 新建 | POST 基础路径，含组织、仓库、日期、单号、明细 | StockTransfer.Create | 调出侧；校验双方 M-16 |
| 提交 | POST `/{id}/submit` | StockTransfer.Submit | 调出侧 |
| 审批/驳回 | POST `/{id}/approve` 或 `reject` | StockTransfer.Approve | 调出侧 |
| 发出 | POST `/{id}/ship` | StockTransfer.Ship | 调出侧 |
| 签收 | POST `/{id}/receive` | StockTransfer.Receive | 调入侧 |
| 草稿作废 | POST `/{id}/void` | StockTransfer.Void | 调出侧 |
| 已签收冲销 | POST `/{id}/reverse` | StockTransfer.Reverse | 双方 |

权限全名统一带 `SupplyCore.` 前缀。驳回、作废、冲销请求体为 `{"reason":"实际办理原因"}`。GET 单据或列表返回发出/签收流水引用及在途投影；列表按 `transferOrderState=已发出` 可查在途单。单号沿用现有输入契约。

## 本地验证与样例

本地构建 0 错误；Application 调拨、Sprint6a 与权限筛选 114 项、Domain 调拨 18 项、EF 并发模型 7 项通过。应用测试使用仓储替身与实际库存更新器，不能替代真实 PostgreSQL 的事务、并发和 HTTP 岗位复验。

同组织示例：仓 A 原存 100、金额 5,000；仓 B 原存 0。本次移拨 10，录入单价故意填 100，实际出库单价为 50。

| 节点 | 仓 A 数量/金额 | 在途数量/金额 | 仓 B 数量/金额 | 本单库存流水 |
| --- | --- | --- | --- | --- |
| 已审 | 100 / 5,000 | 0 / 0 | 0 / 0 | 0 |
| 发出 | 90 / 4,500 | 10 / 500 | 0 / 0 | 调出 −10 / −500 |
| 签收 | 90 / 4,500 | 0 / 0 | 10 / 500 | 再增调入 +10 / +500 |
| 完整冲销 | 100 / 5,000 | 0 / 0 | 0 / 0 | 再增两条反向关联流水 |
| 再次冲销 | 100 / 5,000 | 0 / 0 | 0 / 0 | 无新增 |

另已覆盖预占 80 后申请发出 50 被拒、同仓自调、双边范围错配、冻结货位、接收授权撤销/恢复、调出侧发出后冻结、原流水错配、并发版本异常、部分冲销及当前人员关联缺失。失败用例核对业务拒绝及可观测状态；替身不模拟数据库回滚，不据此声称中途已保存流水会自动撤销。

## 正式复验与后续边界

部署并确认岗位后，统一在 `https://test.fxkyjt.cn` 现有共享库执行，使用可识别的同组织样本，不另建复验数据库。

1. 按上表核对 S-12、S-28、S-13、S-14、S-21；签收成本必须等于实际发出金额，并保留双边原流水 ID。
2. 双会话重复发出、签收、冲销，核对至多一次成功及实际库存、流水数量；刷新后重试不能重复入账。
3. 第二行写库存或最后保存单头时注入受控失败，核对本次动作的全部状态、流水、余额、并发版本一起回滚。签收失败后此前已提交的调出事实与在途必须保留。
4. 分别测试调出岗、调入岗、只读岗及双边冲销岗；直接调用 API 同样受动作和组织/仓库范围限制。普通岗位授权配置须单独留证。
5. 核对被冻结货位、接收 M-16 被撤销、接收库存被消耗或预占时的拒绝结果；恢复合法条件后能够重办。
6. 跨组织流程待 Q-04 确认后另验审批、权属和结算。NC 未接通为真实调拨接口；本次不计财务联调完成。

05-A 不可据此标为整体完成，也不能关闭 OPEN-044、OPEN-037 或其他正式验收项。

## 接续：同组织跨仓办理页

正式入口为 `/supplycores/stock-transfer`，挂在库存作业菜单；库存流转查询提供关联入口。页面按服务端单据与库存 API 读取，不用示例数据补空白。新增内容如下：

- 单据列表、按状态筛选、详情及在途数量/金额；展示组织、仓库、物料完整编码、单位、发出与签收流水。
- 从受组织、仓库、物料分类范围约束的正可用库存选择来源；读取实际批次/货位及有效同组织 M-16 调入仓库，支持多行。重复来源及批次行按合计量校验，保存后仍由服务端在发出时复核并计算实际成本。
- 新建、提交、审核、驳回、发出、签收、草稿作废、完整冲销按各动作权限和状态显示。驳回后可修改原行数量及备注；修改不会重建明细 ID。新接口为 `PUT /api/supply-cores/stock-transfers/{id}/draft`，沿用 Create 权限并使用显式事务。
- 来源接口为 `/api/supply-cores/stock-transfer-sources` 的列表及详情。来源读取失败保留失败提示，不当成零库存；建单锁定同组织、同调出仓。
- 跨组织单据仅查询；当前提交接口推进待审状态，不能据此宣称已启动完整审批流程。财务栏只显示真实 `NcVoucherNumber`，不把 stub 的推送成功当作真实凭证。

原移拨表中的跨单位申请/签字、运杂费和其他费用不在本次同组织页面中自行实现；收发数量有差异时先核实，当前接口只支持整单签收。

本页最终前端构建、正式菜单检查通过，产物 manifest 存在 stock-transfer 入口。Application 移拨/Sprint6a/权限 124 项、Domain 移拨 18 项、本页浏览器 13 项通过；随后与 04-A 合并复验的应用 210 项、领域 49 项也通过（均为各次实际运行，不累加计数）。浏览器用受控 API 返回检查状态、权限、建单参数、草稿修改、失败提示和 375/768/1024/1440 宽度；不能替代真实 HTTP/数据库联验。

桌面详情与 375px 新建表单已逐屏检查，证据保存在代码仓 `output/playwright/05-a-transfer-detail.png` 和 `output/playwright/05-a-transfer-create-mobile.png`。这些是本地受控样例截图。

05-A 同组织办理页开发完成、待业务复验；整项仍为局部完成。2026-09-13 本批代码与记录已提交 `8218132e`，实际范围已回写设计仓本期记录，尚未推送或部署本批应用代码。
