Commit Graph
100 Commits
Author SHA1 Message Date
chengma 6d6829e374 feat: 实现 Client 在线更新与安全回退 (#93) 2026-08-10 12:32:39 +08:00
chengma c24fac964e docs: 归档任务 #88 2026-08-10 12:26:48 +08:00
chengma d1165b9e17 feat: 重构顺运宝规格主链路 (#88) 2026-08-10 12:24:23 +08:00
chengma 5bb1258462 docs: 归档任务 #92 2026-08-10 12:00:04 +08:00
chengma 99252aecce feat: 增加 Client Windows 打包基础 (#92) 2026-08-10 11:59:13 +08:00
chengma 3bfaf44799 docs: 归档任务 #91 2026-08-10 11:19:45 +08:00
chengma 077cba6831 fix: 修复重新上报任务状态不一致 (#91) 2026-08-10 11:18:06 +08:00
chengma d81aa25b13 docs: 归档任务 #89 2026-08-10 10:57:41 +08:00
chengma 34ff39a200 feat: 增加任务批量勾选和重新上报 (#89) 2026-08-10 10:56:48 +08:00
chengma d017062d82 docs: 补充任务 #81 配置路径修复 2026-08-10 10:40:58 +08:00
chengma 45032ccf11 docs: 归档任务 #81 2026-08-10 10:36:09 +08:00
chengma a1ecaa28a7 docs: 更新任务 #87 验收缺陷归档 2026-08-10 10:17:35 +08:00
chengma 977af345b5 fix: 统一重新执行提示位置 (#87) 2026-08-10 10:16:11 +08:00
chengma 5a0a011e5b docs: 归档任务 #87 2026-08-10 10:06:21 +08:00
chengma bf816bce02 fix: 任务错误提示改为顶部居中 (#87) 2026-08-10 10:05:45 +08:00
chengma 663c5ee666 docs: 归档任务 #86 2026-08-10 09:59:49 +08:00
chengma 9e38f89023 docs: 更新任务 #84 验收修正归档 2026-08-10 09:59:48 +08:00
chengma 74198bd70d fix: 放大任务错误提示并自动关闭 (#84) 2026-08-10 09:59:34 +08:00
chengma f0715ee273 feat: 支持 MySQL 公网 TLS CA 校验 (#86) 2026-08-10 09:59:09 +08:00
chengma 830ca58030 docs: 归档任务 #85 2026-08-10 09:45:00 +08:00
chengma ddce0f6679 docs: 记录 MySQL 公网白名单规则 (#85) 2026-08-10 09:44:24 +08:00
chengma de8c61879e docs: 归档任务 #84 2026-08-10 09:36:45 +08:00
chengma e7fb06d7aa fix: 任务执行前检查 Android 设备连接 (#84) 2026-08-10 09:35:46 +08:00
chengma dee9f34035 docs: 归档任务 #83 2026-08-10 09:24:41 +08:00
chengma 04a777dc8e feat: 支持从 config.yaml 读取 MySQL 配置 (#83) 2026-08-10 09:24:04 +08:00
chengma ad44c3ee86 docs: 归档任务 #82 2026-08-10 09:10:18 +08:00
chengma 39f4a8ee4f fix: 优化重新采集取消交互 (#82) 2026-08-10 09:08:54 +08:00
chengma 8cc8574e8a feat: 准备 Admin 线上 HTTPS 部署 (#81) 2026-08-10 02:46:59 +08:00
chengma 78c0c4a73b docs: 归档任务 #80 2026-08-10 02:43:21 +08:00
chengma c296feaf74 feat: 实现 SQLite 到 MySQL 单向迁移 (#80) 2026-08-10 02:40:14 +08:00
chengma 86b9e696de docs: 归档任务 #79 2026-08-10 02:22:44 +08:00
chengma 13cfced80d feat: 迁移 Admin Repository 到 MySQL 8 (#79) 2026-08-10 02:21:31 +08:00
chengma 05793e48b3 docs: 归档任务 #78 2026-08-10 01:22:50 +08:00
chengma 7e74bf210d feat: 建立 MySQL 8 数据库基础 (#78) 2026-08-10 01:22:22 +08:00
chengma 93bbca88a8 docs: 归档任务 #75 2026-08-10 01:09:16 +08:00
chengma 7e90af0dc9 feat: 接入采购演练真机适配器 (#75) 2026-08-10 01:07:57 +08:00
chengma 18f3209a62 docs: 归档任务 #74 2026-08-10 00:50:36 +08:00
chengma d99c81310d feat: PDD 批量采集支持可选客户端 (#74) 2026-08-10 00:49:51 +08:00
chengma c52d730728 docs: 归档任务 #73 2026-08-10 00:29:49 +08:00
chengma c86c7482d9 feat: 完善采购任务安全恢复 (#73) 2026-08-10 00:27:52 +08:00
chengma d6339a810f docs: 归档任务 #72 2026-08-10 00:07:00 +08:00
chengma f201bcc4bf feat: 安全领取并分派采购任务 (#72) 2026-08-10 00:05:40 +08:00
chengma 460619392f docs: 归档任务 #71 2026-08-09 23:40:18 +08:00
chengma 311d55f0da feat: 实现采购任务安全演练 (#71) 2026-08-09 23:39:37 +08:00
chengma dbc08dc0ec docs: 归档任务 #69 2026-08-09 22:56:00 +08:00
chengma 4433e3af37 feat: 完成规格映射与采购任务创建 (#69) 2026-08-09 22:55:14 +08:00
chengma 610e9e3749 docs: 归档任务 #70 2026-08-09 22:48:51 +08:00
chengma a6c573a76a fix: 允许等待重试任务手动重新执行 (#70) 2026-08-09 22:47:44 +08:00
chengma 5df5398f32 docs: 归档任务 #68 2026-08-09 22:41:26 +08:00
chengma 518e6df349 feat: 统一蝦皮与顺运宝 PDD 关联入口 (#68) 2026-08-09 22:40:58 +08:00
chengma eb0e296b7c docs: 归档任务 #67 2026-08-09 22:34:34 +08:00
chengma 57a6484fd5 docs: 澄清顺运宝规格状态语义 (#67) 2026-08-09 22:34:22 +08:00
chengma c6ef54dce1 feat: 建立顺运宝采购处理状态 (#67) 2026-08-09 22:32:19 +08:00
chengma c01f3f8b0e docs: 归档任务 #66 2026-08-09 22:20:21 +08:00
chengma ff8cdd77c3 fix: Wi-Fi 恢复失败后继续搜索设备 (#66) 2026-08-09 22:18:55 +08:00
chengma 8643c37211 docs: 归档任务 #65 2026-08-09 22:05:35 +08:00
chengma e9a190eed7 style: 右对齐 Admin 底栏提示 (#65) 2026-08-09 22:05:11 +08:00
chengma 95df15747a docs: 归档任务 #64 2026-08-09 21:52:07 +08:00
chengma 155dd3b4a2 feat: 统一 Admin 主列表分页 (#64) 2026-08-09 21:51:20 +08:00
chengma 5c9ebd968c docs: 归档任务 #63 2026-08-09 21:45:28 +08:00
chengma eda3661604 feat: 增加采集任务重新执行入口 (#63) 2026-08-09 21:44:29 +08:00
chengma 72821eaaef docs: 修正任务 #46 归档格式 2026-08-09 21:23:06 +08:00
chengma 2756999a08 docs: 归档任务 #47 2026-08-09 21:22:49 +08:00
chengma d062d38ffc docs: 归档任务 #46 2026-08-09 21:22:49 +08:00
chengma 453dcf7c5f docs: 归档任务 #48 2026-08-09 21:14:58 +08:00
chengma e5abbfd4b9 docs: 归档任务 #62 2026-08-09 21:02:58 +08:00
chengma d8a24247df fix: 同步记录弹窗改为局部刷新 (#62) 2026-08-09 21:02:28 +08:00
chengma ee1e060e3a docs: 归档任务 #61 2026-08-09 20:41:51 +08:00
chengma 3fd863da64 feat: 优化顺运宝同步反馈与记录刷新 (#61) 2026-08-09 20:41:24 +08:00
chengma 59d70b2d64 docs: 归档任务 #60 2026-08-09 19:01:31 +08:00
chengma 919522ff79 fix: 修复顺运宝分页总数误判 (#60) 2026-08-09 19:01:04 +08:00
chengma 3bd9c9a2c3 docs: 归档任务 #59 2026-08-09 18:23:33 +08:00
chengma 05a54b044d feat: 统一顺运宝日期同步并记录历史 (#59) 2026-08-09 18:22:58 +08:00
chengma ea7932db63 docs: 归档任务 #58 2026-08-09 17:18:55 +08:00
chengma 4b5cd13807 fix: 增强顺运宝同步完整性保护 (#58) 2026-08-09 17:17:42 +08:00
chengma 17b8f53113 docs: 归档任务 #57 2026-08-09 16:50:20 +08:00
chengma 008bb87620 feat: 支持管理员自助修改密码 (#57) 2026-08-09 16:49:28 +08:00
chengma 2cbb98f09c docs: 归档任务 #56 2026-08-09 16:32:12 +08:00
chengma ff75b271ee fix: 防止拖选内容误关闭弹窗 (#56) 2026-08-09 16:31:41 +08:00
chengma 64318b92a0 docs: 归档任务 #55 2026-08-09 16:15:30 +08:00
chengma 2cce9e3888 fix: 用户密码最小长度调整为六位 (#55) 2026-08-09 16:14:58 +08:00
chengma ac9e227ee7 docs: 归档任务 #54 2026-08-09 16:03:13 +08:00
chengma e0c0dac7a0 feat: 增加客户端采购员归属管理 (#54) 2026-08-09 16:02:25 +08:00
chengma 0181170457 docs: 归档任务 #52 2026-08-09 13:57:17 +08:00
chengma 9959fac31a test: 验证网页登录不影响 Client 四接口 (#52) 2026-08-09 13:56:43 +08:00
chengma cbc01f8b39 docs: 归档任务 #51 2026-08-09 13:51:34 +08:00
chengma eea0d65ef8 feat: 实现 Admin 采购员账号管理 (#51) 2026-08-09 13:50:55 +08:00
chengma 771e2ee616 docs: 归档任务 #50 2026-08-09 13:37:23 +08:00
chengma 0a7db404a1 feat: 实现 Admin 首次初始化与网页登录 (#50) 2026-08-09 13:36:41 +08:00
chengma 1064ffed59 docs: 归档任务 #53 2026-08-09 13:24:36 +08:00
chengma a18d4e67ae feat: 顺运宝支持指定日期同步 (#53) 2026-08-09 13:24:02 +08:00
chengma 24b6c742c1 docs: 归档任务 #49 2026-08-09 13:12:58 +08:00
chengma fc03388ed4 docs: 定义 Admin 登录与账号管理基线 (#49) 2026-08-09 13:12:03 +08:00
chengmaandClaude Opus 5 6e6e99a5d7 fix: 进入顺运宝页面不再自动弹验证码框 (#48)
配了 ocr_url 也会在进入页面时被拦一次输验证码。根因是 OCR 自动登录
只接在「点同步」那条路径上,而进入页面走的是另一条:
SybList → 本地会话过期 → NeedLogin=true → 模板直接弹手工输入框,
压根不调 OCR。

改成 NeedLogin 只由 login_reason 驱动——也就是操作员主动点过同步、
且自动登录确实失败时才弹。这时弹框是他预期的。

打开页面现在纯粹是看数据,不触发任何对外部系统的动作;真正会登录的
只有「同步」一个按钮。这与 Client 侧「『获取任务』是唯一会产生外部
后果的命令」是同一条原则。

会话无效时改成顶部一行提示,按 ocr_url 配没配分两种文案:配了却提示
"需要手工输入"会让人以为配置没生效;没配却提示"会自动登录",点下去
弹出验证码框会让人莫名其妙。用 .hint 不用 .missing——这是状态说明
不是错误,红色留给「PDD 链接未填写」那种要立刻处理的。

EnsureSybSession 未改动:它只读 SQLite 缓存、本地判过期,不发外部
请求,页面渲染不会因此变慢。审查时我一度说它每次渲染都探测顺运宝,
那是错的,已核实。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 12:48:21 +08:00
chengmaandClaude Opus 5 2e686b17a4 feat: 顺运宝登录接入验证码自动识别 (#47)
#46 的登录只有手工输验证码一条路,而会话 24 小时就过期——每天第一次
同步都得有人在场,将来也做不了定时同步。

docs/admin/08 §8 当时写死"不引入 OCR 服务",理由是"多一个必须先启动的
东西"。那条判断基于示例脚本里的 http://127.0.0.1:8000/ocr(本机服务)。
用户提供了托管地址后前提不成立,本工单推翻它——文档里改写并保留原文,
让后来人知道这个决定变过、为什么变。

OCR 优先、手工兜底:识别成功直接登录,失败或服务不可达降级到 #46 已有的
手工弹窗,并在弹窗里说明是"已尝试 N 次"还是"服务不可用"。手工路径不删,
外部服务挂了不该让整个同步功能不可用。

识别失败也是 code:200。实测拿无文字图片探测 https://ocr.ilapage.cn/ocr
返回 {"code":200,"message":"Success","data":""}——不是错误码。所以
Recognize 只负责"这次 HTTP 调用有没有问题",空 data 照常返回 (", nil),
业务校验交给调用方;空 data 和长度不对收敛到同一个 len(code) != 4,
一条规则覆盖两种情况。

不合格的验证码不拿去登录:白费一次尝试,且频繁错误登录可能触发风控。
审查时变异测试发现这条没有测试守着——原测试只断言"重新取图了"和
"最终登录成功",禁用长度校验后依然成立。已补 loginRecorder 记录每次
提交到 /am/auth/login 的 code,断言登录只被调用一次且提交的是合格的那个。

每次重试重新取图(同一张图再识别结果一样,且可能已被上次失败的登录作废);
OCR 用独立 HTTP 客户端不带顺运宝 Cookie;验证码图片只在内存里传,不落盘。

OCR 不可达立即降级、不占用重试次数——对着连不上的地址重试 5 次,
操作员要等 50 秒才看到手工输入框,结果注定一样。

测试全部用 httptest,不打真实的 ocr.ilapage.cn 和 shunyunbaoerp.com。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 12:35:02 +08:00
chengmaandClaude Opus 5 5e426cacf6 feat: 顺运宝货运单同步 (#46)
顺运宝模块此前是骨架,「同步」点了提示"待接入"。5195 个蝦皮商品已经
进系统,但货运单(真实订单)一条都没有,后面的规格匹配无从谈起。

按接口契约(docs/admin/08,从 4 份 HAR 还原)实现:配置、登录(界面
手工输验证码)、会话缓存到 SQLite、按日期范围增量同步、落 syb_orders。

shopee_sku_id 绝不被同步覆盖。它是规格匹配的结果,顺运宝那边根本没有
这个值(只给 11 位商品ID,蝦皮規格ID 是 12 位)。同步写进去就是写空,
把人工攒的匹配成果洗掉且不报错。它只出现在 INSERT 列清单里,不在
DO UPDATE SET 里;repository 层和 service 端到端各有一个测试守着。

增量从「上次同步日期当天」重拉,不是第二天。created 筛选粒度是日期而
last_synced_at 精确到秒,从第二天拉会漏掉当天晚些时候创建的单且不报错。
宁可重复拉(upsert 幂等)也不能漏。中途失败不更新 last_synced_at,
否则下次跳过这段区间,漏的单永远补不回来。

日期运算用 UTC+8,不是 UTC。审查时从 HAR 确认 created 是当地时间:
抓包于 2026-07-28T03:31:45Z(= 11:31 UTC+8),同一响应里 created 是
"2026-07-28 10:37:59";若它是 UTC 则等于 18:37 UTC+8,比抓包晚 7 小时,
订单创建于未来,不成立。用 UTC 算会在本地 00:00-08:00 把"今天"算成昨天,
当天早晨的单这轮拉不到。用 time.FixedZone 写死,不用 LoadLocation——
那要读系统 tzdata,Windows 默认没有,打包成 exe 会失败。

金额一律取 detail/listByStock 的值:08 §5.1 实测同一响应里 amtOrder
在列表接口是分、escrowAmount 却不是,单位不统一,取错差 100 倍。

迁移 v5 纯追加(syb_session、syb_sync_state、syb_orders.product_spec),
v1-v4 逐字未动,CheckSchema 覆盖新表新列。

会话有效性判断把「网络故障」和「明确未登录」的分类集中在 Client.do()
一处——网络抖一下就判定登出的话,验证码会弹个不停,还会丢掉有效会话。

测试全部用 httptest 假服务端,不打真实站点。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 11:49:13 +08:00
chengma 7fb137f685 docs: 归档任务 #45 2026-08-09 11:12:51 +08:00
chengmaandClaude Opus 5 512ccf34d6 docs: 新增顺运宝接口契约;config.yaml 加入 gitignore
从 4 份 HAR 抓包和示例脚本还原 docs/admin/08-顺运宝接口.md。
全部结论标了出处,只有单一样本支撑的都标了 [待定]。

抓包验出三件和现有假设不符的事:

1. 登录响应的 JWT 从不参与请求,认证全靠 Cookie。示例脚本里
   self.token 只用于算缓存有效期,没进过任何请求头。Go 侧存 Cookie
   即可,token 都不用存。

2. _capture_refreshed_token 是死代码——它从响应头 X-Requested-With
   读刷新后的 JWT,而 4 份 HAR 共 18 个响应里带该头的是 0 个。
   会话就是 24 小时硬上限,没有滚动续期,不要移植这段逻辑。

3. 金额单位在同一个响应里不统一:amtOrder 在列表接口是分(61200
   对应 612.0),escrowAmount 却不是(505 对应 505.0)。不能假设
   "列表接口的金额都是分",逐字段确认。这条只有一个样本,已标 [待定]。

还推翻了「货运单规格能直接对上蝦皮商品規格ID」这个前提:顺运宝给的
productId 是 11 位商品ID,蝦皮規格ID 是 12 位。但 productSpec 的格式
与蝦皮报表完全一致,可直接复用 #38 的 ParseSpec,匹配走
"productId 定位商品 → 解析规格 → 在该商品的 SKU 里比对"。

admin/config.yaml 含明文密码且此前没有任何 gitignore 规则挡它,
一次目录级 git add 就会进历史。已加规则,并补 config.example.yaml
作为模板(不含真实凭据,进 git)。

已确认历史提交中从未出现过该凭据。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 10:59:00 +08:00
chengma 5fd71981e0 feat: 支持持续自动获取任务 (#45) 2026-08-09 10:54:18 +08:00
chengmaandClaude Opus 5 4022feee43 docs: 记录 #31 #32 验收通过
两份归档都由实现方写好,本次只更新状态。

#31 遵守了 #20 立的「迁移只追加」规则:v4 用 ALTER TABLE 加 shop_name,
v1/v2 原文未动,CheckSchema 也覆盖了新列。

#32 的 skus 是颜色×尺码的笛卡尔积并带 price_observed_at,
与 #31 的 price_granularity 对得上——两侧独立得出同一结论。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 10:19:11 +08:00