feat(t227): query ERP directly from Go

This commit is contained in:
QiuSW
2026-07-29 10:05:25 +08:00
parent a5a61c05d0
commit a822edd1b2
10 changed files with 682 additions and 97 deletions
+17 -18
View File
@@ -15,9 +15,7 @@
|
+--> SQLite / 文件存储
|
+--> loopback ERP Connector ----> 顺运宝 ERP
|
+--> Go 内存 ERP 会话 ---------> 顺运宝 ERP
+--> Go 内存 ERP 会话 / 直连 source ----> 顺运宝 ERP
^
|
Android 采购 App --------------------> VLM Provider
@@ -33,8 +31,8 @@ Android 采购 App --------------------> VLM Provider
- 拼多多是第三方受控边界,只能由 Android 设备在已登录会话中操作。
- VLM 配置和 Key 位于手机,Key 使用 Android Keystore 包装的加密存储;管理后端不
保存、下发或代理模型调用。
- ERP 账号、验证码会话、Cookie 和 JWT 只存在于 loopback Python Connector;
Go 后端只接收最小化规范货运数据。
- ERP 账号、验证码会话、Cookie 和可能的 JWT 仅存在于 Go API 进程的受锁内存会话;
浏览器和 SQLite 只接收最小化规范货运数据。
## 二、模块职责
@@ -136,34 +134,35 @@ App 支持两个显式模式:
### 2.4 顺运宝 ERP 适配层
Connector 是外部系统防腐层,不属于采购任务状态机:
Go 直连 source 是外部系统防腐层,不属于采购任务状态机:
```text
Admin 创建 sync run
-> Go 后台 worker 调用 loopback Connector
-> Connector 使用受控 ERP 会话查询 list/listTotal/listByStock
-> Connector 规范化并去除收件 PII
-> Go 后台 worker 复用受锁 ERP 内存会话
-> Go source 查询 listTotal/list/listByStock
-> Go source 规范化并去除收件 PII
-> Go 同事务 upsert freight order/items
-> Admin 复核 procurement request
-> 显式生成不可变 purchase task
```
- Python 进程默认只监听 `127.0.0.1`,使用独立服务密钥;Go 不传输或保存 ERP 密码。
- ERP 账号/密码只由 API 启动环境读取;浏览器不提交凭证,SQLite 和普通日志不保存凭证。
- 精确单号只是查询条件,外部身份固定为 `stock.id` 和 `details[].id`。
- Connector 不写本项目 SQLite,不调用 Roubao/拼多多/VLM,也不打印响应 body。
- source 不调用 Roubao/拼多多/VLM,不打印原始响应 body,只返回 allowlist 规范结构。
- Go handler 只创建 sync run;外部查询由有界 worker 执行,避免把验证码或 ERP
延迟绑定到浏览器请求。
- 未确认的 `productThumb` 只按 ERP 引用保存,不能拼接 URL 或越权下载。
- ERP 接口由页面协议观察得到,正式生产前需确认开放 API、服务账号、调用频率、
缓存和个人信息处理权限。
T-225 已在 `internal/platform/shunyunbao` 冻结直接 Go 实现的协议常量、请求 header、
完整单号/日期范围条件、分页、详情批量和 allowlist 归一化。T-226 已增加一个受互斥
保护的 Go 内存会话:Admin 以短期 ticket 读取验证码图片并人工输入验证码,服务端才
持有 Cookie jar;账号密码只从启动环境读取。进程重启即失去该会话,不用 Redis 或持久化
Cookie。货运用例只识别来源中立的“未配置、会话失效、未找到、协议异常、暂时不可用”
错误,不依赖 Connector 包。T-227 才将异步 sync worker 从 loopback Connector 切换到
Go source,T-228 删除旧 Python 进程和服务密钥。
T-225 冻结了 `internal/platform/shunyunbao` 的协议常量、请求 header、完整单号/日期范围
条件、分页、详情批量和 allowlist 归一化。T-226 增加受互斥保护的 Go 内存会话:Admin
以短期 ticket 读取验证码图片并人工输入验证码,服务端才持有 Cookie jar;账号密码只从
启动环境读取。T-227 将此会话直接作为 `FreightSource`:每次同步先校验会话,再以最多
100 条、每页 20 条和每批最多 100 个详情 ID 查询;响应不完整、身份冲突或会话失效均使
整批失败。进程重启即失去会话,不用 Redis 或持久化 Cookie。货运用例只识别来源中立的
“未配置、会话失效、未找到、协议异常、暂时不可用”错误。T-228 再删除未参与运行的旧
Python Connector、loopback 端口和服务密钥。
模式在 execution 开始时固定并写入结果;AI 失败后只能由人员明确切换,不能静默降级。
App 同时固定 provider ID、model、prompt/schema version 和证据 SHA-256,作为非秘密