refactor(t228): remove Python ERP connector
This commit is contained in:
@@ -62,9 +62,10 @@ T-205 原子领取/租约状态机、T-206 Android 登录/有限离线、T-207
|
||||
结构化人工理由和修订历史也已完成。T-214 商品持久身份和重新定位指纹、T-215
|
||||
Admin 候选确认、不可变待投递授权、T-216 设备命令可靠投递及 T-217 已授权商品
|
||||
重新定位与订单 dry-run、T-218 单次订单提交围栏和订单回读,以及 T-219 Admin
|
||||
待付款提醒与端到端验收均已完成。采购任务来源现扩展为顺运宝 ERP:T-220 至
|
||||
T-224 将依次完成安全字段契约、精确单号 Connector、货运信息存储/Admin、待采购
|
||||
需求生成和日期增量同步;完成后再进入 T-301 P0 UI 完整交互验收。
|
||||
待付款提醒与端到端验收均已完成。采购任务来源已扩展为顺运宝 ERP:T-220 至 T-224
|
||||
完成字段契约、货运信息存储/Admin、采购需求生成和日期增量同步;T-225 至 T-228 已将
|
||||
验证码登录和查询统一迁移到 Go API 进程,删除 Python 服务、loopback 端口和共享 API Key。
|
||||
完成后再进入 T-301 P0 UI 完整交互验收。
|
||||
不得直接把候选链接或列表 ordinal 当成授权。
|
||||
手机从管理后端领取任务并回传结果,VLM、拼多多自动化和人工确认在 App 本地完成。
|
||||
T-206 增加有限离线执行;T-207 已复用 Roubao 端上 OpenAI 兼容适配器并加密本地 Key。
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
| 数据访问 | 标准库 `database/sql` | MVP 已定 | 领域层通过仓储接口访问,避免先引入 ORM 和代码生成复杂度。 |
|
||||
| 数据迁移 | Goose v3.26.0,使用嵌入式 SQL migration | 已验证 | v3.26.0 是已核实仍声明 Go 1.23.0 的最高版本;v3.27.x 要求 Go 1.25。 |
|
||||
| 管理 Web | Gin + `html/template` + `embed` + 少量原生 JS/CSS | MVP 已定 | 不单独引入 SPA 工程,模板和静态资源随服务构建。 |
|
||||
| ERP 直连适配 | Go 标准库 `net/http`、`net/http/cookiejar` | T-225 契约已冻结,尚未切换运行时 | Go 侧固定顺运宝请求、分页、详情批量和最小字段归一化;当前 Python loopback Connector 仅在 T-228 前临时保留。 |
|
||||
| ERP 直连适配 | Go 标准库 `net/http`、`net/http/cookiejar` | T-227 已验证 | Go 侧固定顺运宝验证码、登录、会话校验、分页、详情批量和最小字段归一化;不需要 Python 服务或共享 API Key。 |
|
||||
| 数据库 | SQLite | MVP 已定 | 单服务、单设备验证足够;多实例或并发提升前迁移 PostgreSQL。 |
|
||||
| 图片/截图 | 后端受控本地文件目录 + `golang.org/x/image` v0.28.0 | 已验证 | JPEG/PNG/WebP 真解码后白底缩放并编码为 JPEG;数据库只存元数据和随机相对键。 |
|
||||
| 管理鉴权 | bcrypt + 8 小时 opaque 服务端会话 Cookie | T-204 已验证 | `authctl` 预置 ADMIN;数据库只存密码 hash 与 session SHA-256,完整 RBAC 为 V2。 |
|
||||
@@ -122,12 +122,10 @@ backend-api/
|
||||
internal/config/ # 环境变量和安全默认
|
||||
internal/platform/database/ # SQLite 打开、pragma 和生命周期
|
||||
internal/platform/migration/ # Goose provider 封装
|
||||
internal/platform/shunyunbao/ # ERP 会话、协议、直连查询与 allowlist
|
||||
internal/transport/httpapi/ # Gin 路由、健康检查和 HTTP Server
|
||||
migrations/ # 嵌入式 Goose SQL migration
|
||||
var/ # 本地运行数据,必须忽略
|
||||
erp-connector/
|
||||
src/shunyunbaoerp/ # 顺运宝登录、查询、规范化与内部 HTTP 适配
|
||||
tests/ # 伪响应和脱敏结构测试,不访问线上 ERP
|
||||
docs/
|
||||
```
|
||||
|
||||
@@ -167,8 +165,7 @@ T-205 已在该分层上增加独立 `LifecycleService` 与 SQLite immediate tra
|
||||
PowerShell 等价环境变量,确保依赖没有暗中要求更高 Go 版本。
|
||||
- handler 不直接写 SQL,repository 不依赖 Gin,domain/usecase 不导入具体数据库驱动。
|
||||
- 密钥和设备令牌通过环境变量或本地忽略配置注入,不进入 Git。
|
||||
- T-225 后 Go `internal/platform/shunyunbao` 固定同一套脱敏协议契约;T-226 以前不装配
|
||||
直接会话,运行时仍使用临时 Connector。T-226 的会话只在进程内,不引入 Redis。
|
||||
- ERP 账号、密码、Cookie、JWT、验证码和 Connector 服务密钥只通过环境变量/受控秘密
|
||||
注入;不得进入 SQLite、浏览器、VLM、fixture 或普通日志。Go 适配器不得记录完整
|
||||
响应或 PII。
|
||||
- Go `internal/platform/shunyunbao` 固定同一套脱敏协议契约,并在 API 进程内装配受锁
|
||||
会话与 `FreightSource`;会话只在进程内,不引入 Redis。
|
||||
- ERP 账号、密码、Cookie、JWT 和验证码只通过后端环境变量或受控人工输入流转;不得进入
|
||||
SQLite、浏览器、VLM、fixture 或普通日志。Go 适配器不得记录完整响应或 PII。
|
||||
|
||||
@@ -161,8 +161,8 @@ T-225 冻结了 `internal/platform/shunyunbao` 的协议常量、请求 header
|
||||
启动环境读取。T-227 将此会话直接作为 `FreightSource`:每次同步先校验会话,再以最多
|
||||
100 条、每页 20 条和每批最多 100 个详情 ID 查询;响应不完整、身份冲突或会话失效均使
|
||||
整批失败。进程重启即失去会话,不用 Redis 或持久化 Cookie。货运用例只识别来源中立的
|
||||
“未配置、会话失效、未找到、协议异常、暂时不可用”错误。T-228 再删除未参与运行的旧
|
||||
Python Connector、loopback 端口和服务密钥。
|
||||
“未配置、会话失效、未找到、协议异常、暂时不可用”错误。T-228 已删除旧 Python
|
||||
Connector、loopback 端口和服务密钥;仓库运行时仅保留 Go API 进程。
|
||||
|
||||
模式在 execution 开始时固定并写入结果;AI 失败后只能由人员明确切换,不能静默降级。
|
||||
App 同时固定 provider ID、model、prompt/schema version 和证据 SHA-256,作为非秘密
|
||||
|
||||
@@ -113,7 +113,8 @@
|
||||
recovery 不得把 Authorization、Cookie、panic 或请求正文写普通日志。
|
||||
- SQLite 数据文件必须位于被忽略目录,启用 foreign keys、有限 busy timeout 和
|
||||
WAL;连接由进程入口显式关闭,migration 使用固定版本和受控 SQL 文件。
|
||||
- ERP adapter 只能把版本化 allowlist 归一化对象交给 `FreightSource`;收件人、电话、
|
||||
- ERP adapter 只能把版本化 allowlist 归一化对象交给 `FreightSource`;其 HTTP 会话只在
|
||||
Go API 进程内。收件人、电话、
|
||||
地址、完整响应、Cookie、JWT、账号、密码和验证码不得进入领域对象、错误、日志、
|
||||
fixture、SQLite、浏览器或 VLM。验证码必须由人员输入,禁止 OCR、猜测或重放。
|
||||
|
||||
|
||||
+1
-2
@@ -276,8 +276,7 @@ T-227 的后台 worker 使用当前 Go 内存会话,按 `listTotal -> list 分
|
||||
查询。每次先校验会话;列表最多 100 条、每页 20 条,详情每批最多 100 个外部 stock ID。
|
||||
未配置、未登录、找不到货运单、响应协议错误和暂时不可用分别落为
|
||||
`ERP_NOT_CONFIGURED`、`ERP_SESSION_REQUIRED`、`ERP_FREIGHT_NOT_FOUND`、
|
||||
`ERP_RESPONSE_INVALID` 和 `ERP_UNAVAILABLE`,不返回 ERP 原始错误 body。旧 Python
|
||||
Connector 仅在仓库中等待 T-228 删除,不再是运行时依赖。
|
||||
`ERP_RESPONSE_INVALID` 和 `ERP_UNAVAILABLE`,不返回 ERP 原始错误 body。
|
||||
|
||||
### `POST /api/v1/freight-items/{item_id}/procurement-request`
|
||||
|
||||
|
||||
+16
-16
@@ -5,7 +5,7 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-29
|
||||
- 阶段:T-227 Go 直连 ERP 查询已完成;T-228 待删除遗留 Python Connector
|
||||
- 阶段:T-228 已完成单 Go 后端 ERP 切换;等待真实凭证下的人工验证码登录 smoke
|
||||
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-219
|
||||
均按文档提交、实现提交的顺序纳入历史
|
||||
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
|
||||
@@ -22,7 +22,8 @@
|
||||
已增加受锁保护的 Go 内存 Cookie jar、验证码 ticket、登录和用户校验,以及 ADMIN 的
|
||||
`/erp` 页面/API;账号密码仅由 `CMROUBAO_SHUNYUNBAO_*` 启动环境读取,重启后需人工
|
||||
重新登录。T-227 已将其作为 `FreightSource`,查询先校验会话、再执行有界分页/详情
|
||||
批量并返回 allowlist;未访问真实 ERP。旧 Python Connector 仅待 T-228 删除。
|
||||
批量并返回 allowlist;T-228 已删除旧 Python Connector、loopback 端口和共享 API Key;
|
||||
未访问真实 ERP。
|
||||
- ERP 增量同步:v14 支持 Asia/Shanghai 创建日期闭区间和“同步至现在”,source 单窗
|
||||
最多 7 天,后端对较长水位范围切窗并从成功水位前 10 分钟所在自然日回看。
|
||||
货运落库、同步成功和水位推进同事务完成;失败与较旧范围成功不推进水位。Admin
|
||||
@@ -34,12 +35,12 @@
|
||||
- Android Studio:未安装;`winget` 静默安装卡住后已终止,不阻塞命令行构建
|
||||
- 测试:T-219 Android Debug/Release 单元测试与构建和根 `init.ps1` 通过;
|
||||
Debug APK `1.4.16 (21)` 已覆盖安装到 PKG110
|
||||
- 后端测试:T-226 已运行 `go test ./...`、`go test -race ./...`、`go vet ./...` 和三个 Go
|
||||
入口构建;T-227 增加 Go source 的伪 ERP 会话预检、完整单号、日期分页去重、详情
|
||||
allowlist 和稳定错误码覆盖,均未访问真实 ERP;
|
||||
- 后端测试:T-226 至 T-228 已运行 `go test ./...`、`go test -race ./...`、`go vet ./...`
|
||||
和三个 Go 入口构建;T-227 增加 Go source 的伪 ERP 会话预检、完整单号、日期分页去重、
|
||||
详情 allowlist 和稳定错误码覆盖;根 `init.ps1` 的 Android 测试/Debug APK 与 Go 标准
|
||||
验证也通过,均未访问真实 ERP;
|
||||
覆盖 v14 上下迁移、7 天切窗、水位重叠、中途失败、空窗口、重复页、来源 revision、
|
||||
水位事务/不回退、Admin API/SSR 和旧 Connector 严格响应窗口;Python 22 项伪响应
|
||||
测试保留至 T-228 删除前,未访问真实 ERP
|
||||
水位事务/不回退、Admin API/SSR 和 Go source 严格响应窗口;未访问真实 ERP
|
||||
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
|
||||
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
|
||||
脚本错误或外部请求,Android 可见交互控件均不小于 44px
|
||||
@@ -103,10 +104,9 @@
|
||||
对账和唯一对账成功;成功态展示完整订单号、平台时间、授权 SKU/数量/金额及受控
|
||||
证据,只提醒采购员打开拼多多人工核对付款。Roubao 显示相同终态;Web/App 均没有
|
||||
付款、重复提交或自动支付动作。隔离数据库真实 SSR 已通过三个响应式视口验收。
|
||||
- T-220/T-221 ERP 来源:字段契约已固定 stock/detail/item 外部身份、PII 最小化和
|
||||
缺图边界;Python Connector 只监听 loopback,服务密钥鉴权,受控验证码登录后按
|
||||
完整单号读取全部商品并输出 allowlist schema。16 项伪响应测试和真实 HTTP 健康
|
||||
smoke 通过,未访问线上 ERP。
|
||||
- T-220 至 T-228 ERP 来源:字段契约已固定 stock/detail/item 外部身份、PII 最小化和
|
||||
缺图边界;Go API 以受锁内存会话完成受控验证码登录,并直接按完整单号或日期范围查询
|
||||
allowlist schema。旧 Python Connector、8091 端口和共享服务密钥已删除;未访问线上 ERP。
|
||||
- Workflow:纯 Kotlin runner 已支持步骤 timeout、最多 3 次 retry、安全阻塞、
|
||||
用户停止和单 runner 并发拒绝;T-102 已接入搜索加有界候选采集五步
|
||||
- TaskSource:严格 CLI 已生成并验证真实私有 ProbeTask;默认 APK 不含私有 fixture
|
||||
@@ -182,23 +182,23 @@
|
||||
| `docs/tasks/T-225.md` | DONE | 冻结 Go 直连 ERP 协议与安全边界 |
|
||||
| `docs/tasks/T-226.md` | DONE | Go ERP 会话、验证码登录与 Admin 连接页 |
|
||||
| `docs/tasks/T-227.md` | DONE | Go 直连顺运宝查询接入货运同步 |
|
||||
| `docs/tasks/T-228.md` | DONE | 移除 Python Connector 并完成 Go 切换 |
|
||||
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
|
||||
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
|
||||
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
|
||||
| `android-buyer/task-contract/` | 已有 | Android/CLI 共享 ProbeTask 与 TaskSource |
|
||||
| `android-buyer/tools/shopee-importer/` | 已有 | 开发机私有 fixture 导入 CLI |
|
||||
| `backend-api/` | 已有 | Go-Gin 任务 API、SQLite、图片存储、管理 Web 和 migration |
|
||||
| `erp-connector/` | 已有 | 顺运宝 loopback Python Connector 与无网络伪响应测试 |
|
||||
| `init.ps1` / `init.sh` | 已验证/待跨平台 | Windows 同时验证 Android/Go;Unix 入口待 Linux/WSL 复核 |
|
||||
|
||||
## 任务摘要
|
||||
|
||||
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-219。
|
||||
- 已完成:另含 T-220 至 T-227 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
|
||||
直连协议、人工验证码会话和直连 `FreightSource`。
|
||||
- 已完成:另含 T-220 至 T-228 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
|
||||
直连协议、人工验证码会话、直连 `FreightSource` 和旧 Connector 清理。
|
||||
- 进行中:无。
|
||||
- 下一步:T-228 删除旧 Python Connector、loopback 端口/服务密钥及其文档;真实 ERP
|
||||
上线前仍需确认开放 API、数据使用权限并由人员完成验证码登录。
|
||||
- 下一步:真实 ERP 上线前确认开放 API、数据使用权限,并由人员在 `/erp` 完成验证码
|
||||
登录后以受控单号执行一次不记录订单内容的 smoke。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
|
||||
@@ -23,22 +23,22 @@
|
||||
|
||||
## Go 直连迁移契约(T-225)
|
||||
|
||||
T-225 在 `backend-api/internal/platform/shunyunbao` 用脱敏 fixture 固定以下内容,尚未
|
||||
改变当前 Python Connector 运行时路径:
|
||||
T-225 至 T-227 在 `backend-api/internal/platform/shunyunbao` 用脱敏 fixture 固定以下
|
||||
内容,并由 API 进程内的 Go source 直接执行:
|
||||
|
||||
- 基础请求 header 固定 `Accept`、`Origin`、`Referer`、`User-Agent` 和
|
||||
`X-Requested-With`;base URL 必须是无 userinfo、query、fragment 或路径的 origin。
|
||||
- 单号条件为 `t_stock.allcode`、`op=6`、`type=0`、`optType=1`;日期范围为
|
||||
`t_stock.created`、`op=0`、`type=3`、`optType=0`,单个 ERP 窗口最多 7 个自然日。
|
||||
- `listTotal`、`list` 共享 `history=0`、`length`、`start`、`pageIndex`、`store=false`、
|
||||
已验证 columns 和单一 `queries`;每页最多 500 条。
|
||||
已验证 columns 和单一 `queries`;运行时每页固定 20 条、单次最多 100 条。
|
||||
- `listByStock?hist=0` 每批最多 100 个去重后的正整数 stock id,详情 `id` 必须与列表
|
||||
`stock.id` 一致。
|
||||
- 所有结果必须经 Go allowlist 归一化;fixture 专门含收件信息、Cookie/JWT 标记值,
|
||||
测试断言它们不会出现在输出或错误里。
|
||||
|
||||
Go 直连的验证码、登录和 Cookie jar 属于 T-226。不得用本地 OCR 或 Redis 取代人工
|
||||
验证码流程;真实线上请求不属于自动化测试。
|
||||
Go 直连的验证码、登录、Cookie jar 和查询 source 都在 API 进程内。不得用本地 OCR 或
|
||||
Redis 取代人工验证码流程;真实线上请求不属于自动化测试。
|
||||
|
||||
## 身份和规范字段
|
||||
|
||||
|
||||
+23
-6
@@ -4,7 +4,7 @@ title: 移除 Python ERP Connector 并完成 Go 切换
|
||||
phase: 2
|
||||
deps:
|
||||
- T-227
|
||||
status: TODO
|
||||
status: DONE
|
||||
created: 2026-07-29
|
||||
context_ref: d62a4af
|
||||
work_branch: null
|
||||
@@ -18,11 +18,13 @@ write_paths:
|
||||
- docs/api.md
|
||||
- docs/current-state.md
|
||||
- docs/integrations/**
|
||||
- .gitignore
|
||||
- README.md
|
||||
- backend-api/README.md
|
||||
- backend-api/cmd/api/**
|
||||
- backend-api/internal/config/**
|
||||
- backend-api/internal/platform/erpconnector/**
|
||||
- backend-api/internal/repository/sqlite/**
|
||||
- erp-connector/**
|
||||
- scripts/start-erp-connector.bat
|
||||
- start-backend.bat
|
||||
@@ -55,11 +57,11 @@ Go 直连 source 经 T-227 验证后,保留 Python Connector、8091 loopback
|
||||
|
||||
## 验收要点
|
||||
|
||||
- [ ] 仓库不再包含 Python Connector、8091 监听、Connector API Key 或其启动命令。
|
||||
- [ ] Go 后端在 ERP 凭证缺失、未登录和伪 ERP 成功路径下均返回稳定、可操作状态。
|
||||
- [ ] `rg` 证明已跟踪文件无 Connector 运行时引用、真实凭证、Cookie、JWT 或订单样本。
|
||||
- [ ] `go test ./...`、`go test -race ./...`、`go vet ./...` 和根验证通过。
|
||||
- [ ] 文档只说明单 Go 后端、人工验证码和外部 ERP 风险;真实线上 smoke 结果明确记录。
|
||||
- [x] 仓库不再包含 Python Connector、8091 监听、Connector API Key 或其启动命令。
|
||||
- [x] Go 后端在 ERP 凭证缺失、未登录和伪 ERP 成功路径下均返回稳定、可操作状态。
|
||||
- [x] `rg` 证明已跟踪文件无 Connector 运行时引用、真实凭证、Cookie、JWT 或订单样本。
|
||||
- [x] `go test ./...`、`go test -race ./...`、`go vet ./...` 和根验证通过。
|
||||
- [x] 文档只说明单 Go 后端、人工验证码和外部 ERP 风险;真实线上 smoke 结果明确记录。
|
||||
|
||||
## 边界
|
||||
|
||||
@@ -70,3 +72,18 @@ Go 直连 source 经 T-227 验证后,保留 Python Connector、8091 loopback
|
||||
## 执行记录
|
||||
|
||||
- 2026-07-29:由 T-227 依赖创建,等待 Go 查询链路验收后进行删除。
|
||||
- 2026-07-29:开始实施;T-227 已由 `a822edd` 完成。确认外部原始研究脚本不在本次
|
||||
删除范围内,清理仅作用于仓库内旧 Connector、端口、共享服务密钥及其文档。
|
||||
- 2026-07-29:删除 `erp-connector/`、`internal/platform/erpconnector/` 和
|
||||
`scripts/start-erp-connector.bat`,同时移除 `CMROUBAO_ERP_CONNECTOR_*`、8091 默认值、
|
||||
共享 API Key 兼容和旧错误码。外部
|
||||
`D:\chengma\shunyunbaoerp\shunyunbaoerp_single.py` 未读取、未修改、未删除。
|
||||
- 2026-07-29:`start-backend.bat` 只启动 Go 后端;ERP 未配置时 `/erp` 给出可修复状态,
|
||||
同步 run 使用 `ERP_NOT_CONFIGURED` 或 `ERP_SESSION_REQUIRED`,不再依赖第二进程。
|
||||
- 验证:在 `backend-api/` 执行 `$env:GOTOOLCHAIN='local'; go test ./...; go test -race ./...;`
|
||||
`go vet ./...; go build ./cmd/api; go build ./cmd/migrate; go build ./cmd/authctl`,全部通过。
|
||||
根目录执行 `./init.ps1`,Android 测试/Debug APK 和 Go 标准验证全部通过。
|
||||
- 扫描:排除历史任务执行记录后,`rg` 未找到 Connector 运行时引用、8091、共享 API Key、
|
||||
真实凭证、Cookie、JWT 或订单样本;工作区内 `erp-connector/` 已不存在。
|
||||
- 未运行:未配置真实 ERP 凭证,未执行线上验证码/受控单号 smoke;上线前仍需人员完成
|
||||
`/erp` 人工验证码登录,并确认厂商开放 API、数据使用和个人信息处理授权。
|
||||
|
||||
Reference in New Issue
Block a user