diff --git a/docs/task/196-顺运宝同步店铺准入.md b/docs/task/196-顺运宝同步店铺准入.md new file mode 100644 index 0000000..51433ef --- /dev/null +++ b/docs/task/196-顺运宝同步店铺准入.md @@ -0,0 +1,76 @@ +# 196 Admin:按允许店铺筛选顺运宝同步入库 + +- 类型:需求 +- 父级大工单:#14 +- 所属 MVP / 版本:#15 / 顺运宝同步店铺准入 +- 状态:已完成 +- 日期:2026-08-12 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/196 + +## 背景与目标 + +顺运宝日期范围可能包含多个店铺,原同步会为所有货运单拉取明细并入库。本任务增加 +管理员维护的全局允许店铺列表,使后续同步只接收目标店铺,同时保留原始全量容量、 +分页和游标完整性保护。 + +## 最终方案 + +- MySQL schema 追加 v14:新增 `syb_allowed_shops`,同步记录新增接受数、店铺跳过数 + 和店铺快照哈希;历史记录按“接受=原始、店铺跳过=0”回填。 +- 管理员可在顺运宝页进入“同步店铺”,新增、停用和重新启用店铺;采购员只看到 + 当前启用数量。所有写操作使用 POST、管理员权限和 CSRF。 +- 店铺名去除首尾空白后精确匹配,不做模糊、正则或大小写折叠;停用代替硬删除。 +- 同步入口在会话、OCR 和验证码请求前检查空白名单,后台启动后再次读取一次启用 + 店铺并固定为本次快照。 +- 同步仍先校验原始货运单总量、分页页长、分页前后总数和唯一 ID,之后才筛选; + 非允许店铺不请求明细、不入库。明细店铺变化时再次核对。 +- 不删除历史非白名单货运单,不改变 Client 四接口或任务逻辑。 +- SQLite→MySQL 历史迁移工具补齐旧同步记录的新增统计,保持旧数据语义。 + +## 改了哪些 + +- `admin/repository/mysql_db.go`:MySQL v14 可重放迁移和 schema 自检。 +- `admin/model/model.go`、`admin/repository/syb.go`:店铺模型、参数化读写和同步记录字段。 +- `admin/service/syb_allowed_shop.go`:管理员权限、表单校验和启用状态管理。 +- `admin/service/syb.go`:空白名单门禁、固定快照、全量校验后过滤和统计。 +- `admin/handler/web/syb_shop.go`、`admin/handler/web/others.go`、`admin/handler/web/web.go`: + 管理页路由、同步前置门禁和页面数据。 +- `admin/templates/syb/shops.html`、`admin/templates/syb/list.html`:店铺管理页、入口和启用数。 +- `admin/repository/sqlite_to_mysql.go`:历史同步记录新增字段归一化。 +- `admin/service/*test.go`、`admin/repository/mysql_db_integration_test.go`:准入、权限、筛选、 + 空白名单、明细二次拦截及 v13→v14 测试。 +- `docs/admin/03-data-model.md`、`05-ui-specification.md`、`08-顺运宝接口.md`:更新基线。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 管理员新增、停用和重新启用,采购员禁止管理 | 通过(代码和自动化测试) | +| 空白名单在任何顺运宝请求前阻止同步 | 通过(入口门禁及服务测试) | +| 原始全量容量和分页完整性校验先于店铺过滤 | 通过 | +| 非允许店铺不拉明细、不入库,首尾空白可匹配 | 通过(自动化测试) | +| 明细店铺变化或为空时再次拦截 | 通过(单元测试) | +| 同一次同步使用启动时固定快照 | 通过 | +| 同步记录区分原始、接受、店铺跳过和数量跳过 | 通过 | +| 历史顺运宝数据不删除,Client 接口不改变 | 通过 | +| MySQL v14 首建、升级、重放和自检 | 测试用例已补充;真实 MySQL 环境未执行 | +| 固定 Go 1.23.0 build、vet、test | 通过 | + +## 测试 + +- 执行的命令: + - `$env:GOTOOLCHAIN="go1.23.0"; go vet ./...; go build ./...; go test ./... -count=1` + - `go version` + - `git diff --check` +- 结果:Go 1.23.0 windows/amd64 下全部通过;代码提交 `8a8fff8`。 +- **没验证到的部分**:当前环境未配置名称以 `_test` 结尾的 MySQL 8.4 测试库, + 因此新增真实 MySQL 集成测试被测试基础设施跳过;未启动浏览器执行 1366×768 视觉、 + 键盘焦点和人工权限验收;未部署生产,也未在生产执行 v14。 + +## 遗留问题 + +生产升级后白名单初始为空,必须先由管理员配置并启用至少一个店铺,之后才能同步。 + +## 相关提交 + +- `8a8fff8` 按允许店铺筛选顺运宝同步