Commit Graph
209 Commits
Author SHA1 Message Date
QiuSW 8293b27c19 fix(syb): retry drifting sync page once (#270) 2026-09-12 09:34:44 +08:00
QiuSWandClaude Opus 5 503b3cbbc5 fix(goauto): create syb_product_filter on existing databases #269
Three defects that only a real MySQL run could show.

The table had no version-local migration. Adding the model to
migrations.Migrate covers databases built from scratch, but every existing
one already has the older versions recorded in sys_migration, so that list
never runs again there. cmd/migrate's post-migration table check caught it:
"迁移后仍缺少表:syb_product_filter". The new version file creates the table
and seeds the same eight rules with FirstOrCreate on the normalized key, so
running both paths against one database cannot duplicate them.

Keyword and NormalizedKeyword were typed text, which MySQL refuses to put in
a key specification without a prefix length (Error 1170), so the unique index
could not be built at all. They are sized 200 now, matching how SYBShop sizes
its own matching key. SQLite accepts text in an index, which is why the whole
test suite passed while the real migration failed.

The 只看启用 filter is removed rather than kept: hiding a disabled structural
rule would conceal the one state on this page that matters most, since a
disabled "#" means roughly 65% of 档口 rows start entering the system again.
Keyword search stays.

Verified against the local MySQL database: migration applies, eight rules
present with traditional Chinese preserved (印花大學T normalizes to 印花大學t),
menu row created under 采采管理.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-09-11 17:00:11 +08:00
QiuSWandClaude Opus 5 cad9f6d185 fix(goauto): add the missing menu migration for SYB product filters #269
Registering a module in access.GoAutoModules() does not make its page
reachable on an existing database. sys_menu rows are written by the
versioned migration that first created them, and that version is already
recorded in sys_migration everywhere — it never runs again. Startup only
reconciles the casbin API matrix, not menus.

So on a fresh database the page appeared and on every real one it did not:
the table, the API and the route were all present with no way to navigate
there. This adds a migration that upserts the entry under 采采管理 beside
「SYB 店铺」 and binds it to both 管理员 and 采购员.

Verified by deleting the row from an already-migrated database and
re-running migrate: 新执行 1 个,跳过 42 个, row restored with both roles.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-09-11 16:49:56 +08:00
QiuSWandClaude Opus 5 78df997fc3 test(goauto): pin SYB filter behaviour against real variationSku samples #269
The samples are the ones the production database actually holds: 档口 codes
like "新寮-雅伊阁大码女装#301" and "DD#004" must be filtered, while own
codes like "PDD0582", "my238", "1" and "引流款" must not, and an empty
variationSku is a product without a supplier code rather than a 档口 item.

The test also asserts the two structural rules record different hit counts.
That is the property the previous aggregate-per-kind write could not hold,
and the disable-confirmation dialog depends on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-09-11 16:37:43 +08:00
QiuSWandClaude Opus 5 20f59b68bd fix(goauto): record SYB filter hits per rule, not per kind #269
UpdateHits wrote one aggregate per kind, so every structural rule stored
the same number. The disable-confirmation dialog quotes that number
("停用「#」后…约 N 条明细会恢复入库"), and on real data "#" matches 8498
rows while "-" matches 6392 — the dialog would have warned with a figure
2100 rows off for one of them.

Match now returns the rule that matched instead of a char/keyword pair,
so the caller can attribute each hit to one rule, and UpdateHits writes
every rule's own count. Rules that matched nothing are written as 0 so a
previous run's number is never left behind.

The management page is reformatted to the repo's usual Vue layout and
gains the search / 只看启用 / 重置 controls the approved prototype shows.
Cancelling the disable confirmation now just reverts the switch instead
of throwing an unhandled rejection.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
2026-09-11 16:27:13 +08:00
QiuSW 652bf30f5a feat(goauto): add SYB product variation filters (#269) 2026-09-11 16:20:26 +08:00
QiuSW e4677069d7 fix(syb): allow metadata-only partial collection links #259 2026-09-10 16:07:58 +08:00
QiuSW 2b01974fe5 feat(syb): confirm one-click replacement from latest collection #258 2026-09-10 15:47:27 +08:00
QiuSW ea38ced58c fix(shopee): normalize colors before AI matching #257 2026-09-10 14:54:56 +08:00
QiuSW 2cb78ad8cd fix(collection): preserve task state during current-page reidentify #255 2026-09-10 14:26:39 +08:00
QiuSW b1594dc7bd feat(syb): link latest device collection and match specs #253 2026-09-10 11:34:22 +08:00
QiuSW 9088e6b734 fix(shopee): bound matching waits and recover drawer loading #254 2026-09-10 09:37:02 +08:00
QiuSW 72b8b5d4d0 fix(purchase): preserve conflicting order results for manual resolution (#241) 2026-09-08 15:02:51 +08:00
QiuSW 290a17ea15 feat(purchase): add agent order backfill endpoint (#241) 2026-09-08 14:41:56 +08:00
QiuSW c6a962d522 fix(syb): persist validated pages and report partial sync success (#239) 2026-09-08 09:35:36 +08:00
QiuSW 71f7751754 fix(client-api): support HTTP and HTTPS by default (#237) 2026-09-07 17:25:55 +08:00
QiuSW 57b0f1595f feat(client-api): add scoped editable client keys (#237) 2026-09-07 16:20:46 +08:00
QiuSW 29ba16e4f9 feat(syb): allow purchaser manual sync (#236) 2026-09-07 15:03:31 +08:00
QiuSW ff2d0ca0e5 fix(syb): recover bounded today pagination overlaps (#235) 2026-09-07 14:25:47 +08:00
QiuSW bf58ad0005 merge: integrate main and purchase fixes for release (#234) 2026-09-07 11:58:24 +08:00
QiuSW d84f6ddf21 fix(purchase): reuse validated probe mappings (#223) 2026-09-05 15:21:17 +08:00
QiuSW e4051ed8df feat(purchase): reuse probed PDD page (#219) 2026-09-05 10:34:35 +08:00
QiuSW 5859a819c8 feat(agent): 显示采购结果气泡 (#218) 2026-09-05 10:01:21 +08:00
QiuSW 8d2e61bb72 fix(purchase): 重建 Agent 重试任务 (#217) 2026-09-05 09:06:41 +08:00
QiuSW bd386cfae4 fix(syb): 修正规格颜色尺码反序 (#216) 2026-09-04 19:33:35 +08:00
QiuSW c09ddc8474 feat(purchase): 强制真机探测规格后匹配 (#215) 2026-09-04 19:03:16 +08:00
QiuSW 1ac50064bd fix(syb): 回填历史店铺标准化键 (#213) 2026-09-04 10:43:36 +08:00
QiuSW 8c76e0932b fix(syb): 冻结同步店铺快照 (#212) 2026-09-04 10:00:48 +08:00
QiuSW 043d71da64 fix(purchase): 放行已提取规格的存疑明细 (#205) 2026-09-03 15:20:57 +08:00
QiuSW 58e058f8ac feat: 一键匹配并确认蝦皮颜色尺码 (#194)
(cherry picked from commit 041cd8d03f)
2026-09-03 15:05:53 +08:00
QiuSW a8e01b9809 fix(device): 限定自动恢复窗口 (#201) 2026-09-03 11:17:02 +08:00
QiuSW 74f55f43cc fix(device): 修复自动恢复编译错误 (#201) 2026-09-03 11:16:26 +08:00
QiuSW 2c263e687e feat(device): 后台自动恢复设备身份 (#201) 2026-09-03 11:16:03 +08:00
QiuSW 13164adde0 fix(migrate): 补齐设备身份恢复字段 (#201) 2026-09-03 11:12:07 +08:00
QiuSW 379a83fe94 feat(device): 安全恢复原设备身份 (#201) 2026-09-03 10:41:20 +08:00
QiuSW fc28632d48 fix(purchase): 允许无 SKU 采集证据创建采购 (#200) 2026-09-03 09:56:38 +08:00
QiuSW e85f237f09 feat(purchase): 放行有结果的 AI 规格匹配 (#200) 2026-09-03 09:34:13 +08:00
QiuSW 81c1a7ead2 fix: add scheduled job execution history (#199) 2026-09-02 23:12:48 +08:00
QiuSW aa2ecc6ef7 feat: add scheduled SYB spec AI parsing (#198) 2026-09-02 21:33:14 +08:00
QiuSW b12460825c fix: prevent AI matching write timeout (#197) 2026-09-02 17:35:12 +08:00
QiuSW d7924619b6 feat: 增加蝦皮规格定时与手动自动匹配 (#195) 2026-09-01 23:41:11 +08:00
QiuSW 041cd8d03f feat: 一键匹配并确认蝦皮颜色尺码 (#194) 2026-09-01 22:20:48 +08:00
QiuSWandClaude Opus 5 31c32d6a86 feat: 放开 SYB 商品页 AI 匹配与采购创建的规格前置限制 (#190)
按用户确认的清单删除以下拦截,内部系统不再要求这些人工前置:

AI 匹配(ai_match_eligibility.go)
- 解析存疑 / 解析失败不再阻断匹配
- PDD 含颜色尺码之外的可选规格不再阻断
- 蝦皮商品未找到目标颜色 / 尺码不再阻断
- 缺少完整可售 SKU 组合不再阻断
- 随之失效的 shopeeHasTarget、hasSelectableOtherDimension 一并删除

规格映射(batch.go 预检 + service.go 创建)
- 失效的已确认映射不再拒绝,降级为 unresolved
- 确定性匹配失败不再拒绝,降级为 unresolved
- 两条路径行为对齐,避免预检通过而创建报错

保留:规则不支持 spec-probe 时仍拒绝创建,否则会产生 Agent
无法执行的任务。采购侧自身的解析门禁不在本次范围内。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 17:47:48 +08:00
QiuSW 4a1b4af29d fix: trust manually confirmed SYB specs (#188) 2026-09-01 16:04:35 +08:00
QiuSW 776db137be fix: require saved spec match before purchase (#188) 2026-09-01 15:32:26 +08:00
QiuSW 5446ebeaae fix: tighten batch AI matching eligibility (#188) 2026-09-01 14:49:00 +08:00
QiuSW 3ef0f72ff9 feat: batch AI match SYB purchase specs (#188) 2026-09-01 12:13:33 +08:00
QiuSW 3aab1f013d feat(goauto): 完善替代采集与颜色图片详情 (#184 #185) 2026-09-01 09:55:27 +08:00
QiuSW c07c3451f1 fix(admin): decouple SYB collection eligibility (#183) 2026-09-01 09:02:24 +08:00
QiuSW 7be57bfe6b feat(agent): allow configured HTTP transport (#181) 2026-09-01 00:12:43 +08:00