Admin:档口入库码后台批量回写与进度反馈 #246

Open
opened 2026-08-15 16:46:07 +08:00 by ila · 1 comment
Owner

1. 基本信息

  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP/版本:#224
  • 阶段:档口入库码后台安全回写
  • 状态:待验收

2. 要解决什么

当前“回写顺运宝”在一次 HTTP 请求内同步处理,且最多只能选择 20 条。每条记录可能需要远端读取、删除、更新和结果核对,数量增加后页面会长时间等待,还可能因网关超时让采购员无法判断回写是否仍在执行。

目标是允许采购员一次勾选当前页面任意数量的可回写记录,提交后页面立即返回,由 Admin 后台分组处理,并能在档口入库码页面查看排队、回写中和逐条结果。

3. 做什么 / 不做什么

做什么

  • 继续使用现有 syb_inner_code_records 业务表,不新增批次表。
  • 为记录增加后台批次标识、排队时间,并增加“排队中”状态。
  • 提交时在事务内把选中的“可回写”记录加入同一后台批次;选择数量不再受 20 条限制。
  • 后台执行器每次从批次取最多 20 条,逐条沿用现有远端回写与回读核对安全门禁。
  • 页面显示当前批次总数、排队中、回写中、成功、失败/待核对进度,并提供刷新入口。
  • Admin 异常退出后:已开始远端写入的记录进入“待人工核对”;尚未开始的排队记录恢复为“可回写”,不得自动重放远端写入。
  • 同一记录重复提交、并发批次竞争时必须由数据库状态条件阻止重复回写。

不做什么

  • 不新增批次表或明细表。
  • 不改变顺运宝远端写入协议。
  • 不自动重试未知结果、失败记录或 Admin 重启前未开始的记录。
  • 不增加自动轮询脚本;用户通过页面刷新查看进度。
  • 不修改 Client。

4. 已确认的实现方案

  1. 新增 MySQL schema v25:在 syb_inner_code_records 增加 apply_batch_id、apply_queued_at,状态约束增加 queued,并增加批次查询索引。
  2. 新增“批量排队”仓储事务:锁定所选记录并要求全部仍为 ready,一次性更新为 queued;任意一条状态变化则整批不入队。
  3. Web POST 先确认顺运宝会话可用,再创建批次并立即重定向回列表;Handler 内部用单一互斥后台执行器串行消费批次,避免并发修改同一顺运宝会话或远端记录。
  4. 后台每轮最多读取 20 条 queued 记录,但逐条 claim 为 applying 后才执行远端操作。每条仍执行“写前读取、最多一次写入、写后核对”;不确定结果保持 needs_check。
  5. 页面通过 apply_batch_id 查询现有业务表聚合进度,使用文字和原生 progress 同时反馈,不只依赖颜色。
  6. 后台异常时将同批次尚未开始的 queued 记录释放回 ready 并说明原因;启动恢复同样执行该规则,applying 仍转为 needs_check。
  7. 预计修改:
    • admin/model/inner_code.go
    • admin/repository/mysql_db.go
    • admin/repository/inner_code.go
    • admin/service/inner_code_apply.go
    • admin/service/inner_code_page.go
    • admin/handler/web/inner_code.go
    • admin/templates/inner_code/list.html
    • 对应测试与稳定文档

5. 验收标准

  • 一次勾选超过 20 条(包括当前页 100 条)可以成功提交后台回写,页面不等待远端处理完成。
  • 后台内部按最多 20 条一组读取,远端写入仍逐条执行且每条最多写一次。
  • 页面可查看当前批次总数、排队中、回写中、成功、失败和待核对数量,并可手工刷新进度。
  • 同一记录重复提交或两个批次并发提交不会造成重复远端写入。
  • Admin 重启或后台异常时,未开始记录恢复为可回写;已进入不可确定远端阶段的记录进入待人工核对。
  • 现有成功、已存在、跳过、失败、待核对语义不变。
  • MySQL v24 → v25、空库迁移和重复启动自检通过。
  • 固定 Go 1.23.0 全量测试与格式检查通过。
  • 不新增批次业务表,不修改 Client。

6. 验证方式

在仓库根目录执行:

& 'C:\Program Files\Go\bin\gofmt.exe' -w <本工单修改的 Go 文件>
& 'C:\Program Files\Go\bin\go.exe' test ./...

另使用 MySQL 8.4 测试库验证 v24 → v25、空库迁移和重复启动;远端真实顺运宝回写只在人工验收环境使用测试数据验证。

风险和回退

  • 风险:远端写入结果未知时若自动重试,可能重复写入。因此后台只负责排队与串行执行,不改变“最多一次写入 + 回读核对”门禁。
  • 风险:Admin 进程退出会丢失内存队列,因此排队状态落在业务表;重启后仅释放未开始记录,不自动继续真实远端写入。
  • 回退:停止新批次提交,保留 v25 新字段;将 queued 记录恢复为 ready。已进入 applying 的记录必须人工核对,不能直接重试。
## 1. 基本信息 - 类型:需求 - 父级大工单:#14 - 所属 MVP/版本:#224 - 阶段:档口入库码后台安全回写 - 状态:待验收 ## 2. 要解决什么 当前“回写顺运宝”在一次 HTTP 请求内同步处理,且最多只能选择 20 条。每条记录可能需要远端读取、删除、更新和结果核对,数量增加后页面会长时间等待,还可能因网关超时让采购员无法判断回写是否仍在执行。 目标是允许采购员一次勾选当前页面任意数量的可回写记录,提交后页面立即返回,由 Admin 后台分组处理,并能在档口入库码页面查看排队、回写中和逐条结果。 ## 3. 做什么 / 不做什么 ### 做什么 - 继续使用现有 `syb_inner_code_records` 业务表,不新增批次表。 - 为记录增加后台批次标识、排队时间,并增加“排队中”状态。 - 提交时在事务内把选中的“可回写”记录加入同一后台批次;选择数量不再受 20 条限制。 - 后台执行器每次从批次取最多 20 条,逐条沿用现有远端回写与回读核对安全门禁。 - 页面显示当前批次总数、排队中、回写中、成功、失败/待核对进度,并提供刷新入口。 - Admin 异常退出后:已开始远端写入的记录进入“待人工核对”;尚未开始的排队记录恢复为“可回写”,不得自动重放远端写入。 - 同一记录重复提交、并发批次竞争时必须由数据库状态条件阻止重复回写。 ### 不做什么 - 不新增批次表或明细表。 - 不改变顺运宝远端写入协议。 - 不自动重试未知结果、失败记录或 Admin 重启前未开始的记录。 - 不增加自动轮询脚本;用户通过页面刷新查看进度。 - 不修改 Client。 ## 4. 已确认的实现方案 1. 新增 MySQL schema v25:在 `syb_inner_code_records` 增加 `apply_batch_id`、`apply_queued_at`,状态约束增加 `queued`,并增加批次查询索引。 2. 新增“批量排队”仓储事务:锁定所选记录并要求全部仍为 `ready`,一次性更新为 `queued`;任意一条状态变化则整批不入队。 3. Web POST 先确认顺运宝会话可用,再创建批次并立即重定向回列表;Handler 内部用单一互斥后台执行器串行消费批次,避免并发修改同一顺运宝会话或远端记录。 4. 后台每轮最多读取 20 条 `queued` 记录,但逐条 claim 为 `applying` 后才执行远端操作。每条仍执行“写前读取、最多一次写入、写后核对”;不确定结果保持 `needs_check`。 5. 页面通过 `apply_batch_id` 查询现有业务表聚合进度,使用文字和原生 `progress` 同时反馈,不只依赖颜色。 6. 后台异常时将同批次尚未开始的 `queued` 记录释放回 `ready` 并说明原因;启动恢复同样执行该规则,`applying` 仍转为 `needs_check`。 7. 预计修改: - `admin/model/inner_code.go` - `admin/repository/mysql_db.go` - `admin/repository/inner_code.go` - `admin/service/inner_code_apply.go` - `admin/service/inner_code_page.go` - `admin/handler/web/inner_code.go` - `admin/templates/inner_code/list.html` - 对应测试与稳定文档 ## 5. 验收标准 - [x] 一次勾选超过 20 条(包括当前页 100 条)可以成功提交后台回写,页面不等待远端处理完成。 - [x] 后台内部按最多 20 条一组读取,远端写入仍逐条执行且每条最多写一次。 - [x] 页面可查看当前批次总数、排队中、回写中、成功、失败和待核对数量,并可手工刷新进度。 - [x] 同一记录重复提交或两个批次并发提交不会造成重复远端写入。 - [x] Admin 重启或后台异常时,未开始记录恢复为可回写;已进入不可确定远端阶段的记录进入待人工核对。 - [x] 现有成功、已存在、跳过、失败、待核对语义不变。 - [ ] MySQL v24 → v25、空库迁移和重复启动自检通过。 - [x] 固定 Go 1.23.0 全量测试与格式检查通过。 - [x] 不新增批次业务表,不修改 Client。 ## 6. 验证方式 在仓库根目录执行: ```powershell & 'C:\Program Files\Go\bin\gofmt.exe' -w <本工单修改的 Go 文件> & 'C:\Program Files\Go\bin\go.exe' test ./... ``` 另使用 MySQL 8.4 测试库验证 v24 → v25、空库迁移和重复启动;远端真实顺运宝回写只在人工验收环境使用测试数据验证。 ## 风险和回退 - 风险:远端写入结果未知时若自动重试,可能重复写入。因此后台只负责排队与串行执行,不改变“最多一次写入 + 回读核对”门禁。 - 风险:Admin 进程退出会丢失内存队列,因此排队状态落在业务表;重启后仅释放未开始记录,不自动继续真实远端写入。 - 回退:停止新批次提交,保留 v25 新字段;将 `queued` 记录恢复为 `ready`。已进入 `applying` 的记录必须人工核对,不能直接重试。
Author
Owner

实施完成,待用户验收

  • 实现提交:f8f22a1(后台批量回写、MySQL v25、页面进度与异常恢复)
  • 归档提交:7736ab7
  • 归档:docs/task/246-admin档口入库码后台批量回写.md
  • 固定 Go 1.23.0:go vet ./...、go build ./...、go test ./... -count=1 全部通过。
  • 45 条一次入队、状态冲突整批回滚、批次进度聚合、后台异常和启动恢复自动化测试通过。
  • 真实 MySQL 8.4 集成用例已补充;当前没有启用独立 _test 库,安全门禁按预期跳过,未使用生产库代测。
  • 未向真实顺运宝发送写请求,也未部署生产;需用户选择测试货运单并在部署前完成 v25 迁移演练。
## 实施完成,待用户验收 - 实现提交:`f8f22a1`(后台批量回写、MySQL v25、页面进度与异常恢复) - 归档提交:`7736ab7` - 归档:`docs/task/246-admin档口入库码后台批量回写.md` - 固定 Go 1.23.0:`go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过。 - 45 条一次入队、状态冲突整批回滚、批次进度聚合、后台异常和启动恢复自动化测试通过。 - 真实 MySQL 8.4 集成用例已补充;当前没有启用独立 `_test` 库,安全门禁按预期跳过,未使用生产库代测。 - 未向真实顺运宝发送写请求,也未部署生产;需用户选择测试货运单并在部署前完成 v25 迁移演练。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#246