feat(t227): query ERP directly from Go
This commit is contained in:
+17
-18
@@ -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,作为非秘密
|
||||
|
||||
Reference in New Issue
Block a user