用户 2026-09-01 提出:「admin后台syb商品页,创建采购时太多限制了,因为是内部使用系统,需要放开限制」。经确认拆为 A/B 两单,本单为 A 类(低风险摩擦项)。B 类见配套工单(删除 #188 enforcePersistedMatch)。
enforcePersistedMatch
消除 SYB 商品列表页三类「被拦住但无法就地解决」的阻塞,改为人工就地确认后可继续创建采购。
server/app/goauto/purchase/batch.go:390-397
sybSpecsTrusted
SYB_PARSE_FAILED
NextAction=reparse
server/app/goauto/purchase/ai_match_eligibility.go
hasSelectableOtherDimension
disabled("PDD 商品包含颜色、尺码之外的可选规格,请人工处理")
len(dataset.skuCombinationsByPDD[pdd.ID]) == 0
disabled("缺少当前 PDD 商品的完整可售 SKU 组合,请先重新采集")
models.SYBProduct.ManuallyConfirmed
TargetColor
TargetSize
ManuallyConfirmed=true
disabled
三个写入动作统一走现有 ManualRequest 幂等 RequestID 模式(对齐 manual.go:13 AuthorizeRePurchase),落库记录操作人、时间、原值,保证可追溯。
ManualRequest
RequestID
manual.go:13 AuthorizeRePurchase
batch.go
server/
app/goauto/purchase
web/
.\scripts\verify.ps1 -Component all
docs/03-business-rules-and-glossary.md
docs/08-agent-api-contract.md
sync
sync --check
后端与修正弹层本已存在(PATCH /:productId/correction → sybimport.ManualCorrect,且 sybSpecsTrusted 自 4a1b4af 起已信任 ManuallyConfirmed),缺口只在入口:列表页 nextAction=reparse 原先跳转打开详情抽屉,用户还需在抽屉内再找「人工修正」。
PATCH /:productId/correction
sybimport.ManualCorrect
4a1b4af
ManuallyConfirmed
nextAction=reparse
改动仅限 web/src/views/goauto/syb-products/index.vue:
web/src/views/goauto/syb-products/index.vue
runPurchaseNextAction
reparse
openCorrect(row)
openCorrect(row = null)
fromList
查看并处理
人工修正
@click="openCorrect"
@click="openCorrect()"
验证:npx eslint 通过;grep 确认 tests/e2e/ 无用例依赖被改动的文案或行为。
npx eslint
grep
tests/e2e/
按本工单「设计证据」要求,A2/A3 为新交互,原型确认后才编写生产代码。
原型链接:https://claude.ai/code/artifact/89f715d6-cb26-4749-8a62-024e9ea3bdec 版本:v1 草稿 创建日期:2026-09-01 状态:待用户确认 覆盖范围:A2 第三维度规格选择弹层、A3 确认规格可售弹层;两者各覆盖正常、空、加载中、失败、禁用、权限边界六类状态;含三处人工确认的落库对照表。 版本识别方式:页面顶部 masthead 标注「工单 #190 / 版本 v1 草稿 / 2026-09-01」。
原型中提出三个待拍板问题,答复前不进入编码:
问题 2 的答复直接决定是否需要数据库迁移,属高风险项,需单独确认。
本工单最初的 A1/A2/A3 方案(为每个限制配人工确认弹层)经用户明确否决:需求是删除限制,不是新增人工确认交互。因此 A1 已撤销,A2/A3 原方案作废,改为按用户逐条勾选的清单直接删除拦截条件。原型链接(v1 草稿)已不再作为实施依据。
提交
55c2b6b
31c32d6
4eac729
删除的拦截(用户逐条确认)
AI 匹配 ai_match_eligibility.go(净删 59 行):
ai_match_eligibility.go
随之失效的 shopeeHasTarget、hasSelectableOtherDimension 及 encoding/json、productspec 导入一并删除。
shopeeHasTarget
encoding/json
productspec
规格映射 batch.go 预检 + service.go 创建:
service.go
spec_source=unresolved
unresolved
purchasePriceRange
mappedColor
PDD_PRICE_MISSING
保留的门禁及原因
service.go 中 spec_source=unresolved 且规则不含 purchase.spec-probe.v1 时仍拒绝创建。删除它会产生 Agent 无法执行的任务。
purchase.spec-probe.v1
用户原始清单中的 4 条未执行,原因如下:
AGENTS.md
pending
running
ruleSnapshot
MinUnitPriceCent
MaxUnitPriceCent
max >= min
priceGuard
用户已确认接受上述 4 条不做。
删除解析状态门禁后,批量 AI 匹配会以 parse_status=uncertain 或 failed 的目标规格进行匹配,AI 会把可能错误的目标映射到 PDD 规格并保存映射结果。#191 删除 enforcePersistedMatch 后,该链路将不再有服务端复核点。本项目为内部系统,该风险由人工承担。
parse_status=uncertain
failed
注:enforcePersistedMatch 本工单未改动,仍在 BatchPreview 中生效,因此 SYB 列表批量创建路径的「已保存确认映射 + 命中可售组合」要求当前仍然成立,直至 #191 实施。
BatchPreview
go build ./...
go test ./app/goauto/...
TestBatchPreviewRejectsUncertainParseAndMissingSKUCombination
TestBatchPreviewAllowsUncertainParseAndMissingSKUCombination
TestCreateLiveRejectsExpiredConfirmedMapping
TestCreateLiveDowngradesExpiredConfirmedMappingToSpecProbe
有长期文档影响,已完成闭环:
Business-Rules-and-Glossary
a6f63cc745cf0e0df7ca94521a70fb6af3adea26
harness.py sync
docs/12-syb-erp-interface.md 每次 sync 都会产生重复的 gitea-wiki-mirror 头部块。根因是线上 Wiki 页 SYB-ERP-Interface-Contract 的正文中嵌入了一份镜像头,即镜像文件曾被反向粘贴回 Wiki(AGENTS.md 明确禁止)。sync --check 仍报一致,不影响本工单闭环。建议另建工单清理该 Wiki 页正文。
docs/12-syb-erp-interface.md
gitea-wiki-mirror
SYB-ERP-Interface-Contract
feat/190-syb-inline-correction(分支名沿用自已撤销的 A1,未改名以保持已推送引用有效)
feat/190-syb-inline-correction
No dependencies set.
The note is not visible to the blocked user.
原始需求摘要
用户 2026-09-01 提出:「admin后台syb商品页,创建采购时太多限制了,因为是内部使用系统,需要放开限制」。经确认拆为 A/B 两单,本单为 A 类(低风险摩擦项)。B 类见配套工单(删除 #188
enforcePersistedMatch)。目标
消除 SYB 商品列表页三类「被拦住但无法就地解决」的阻塞,改为人工就地确认后可继续创建采购。
非目标
enforcePersistedMatch(属配套工单 B)当前事实(代码)
server/app/goauto/purchase/batch.go:390-397—sybSpecsTrusted为假时返回SYB_PARSE_FAILED,NextAction=reparseserver/app/goauto/purchase/ai_match_eligibility.go—hasSelectableOtherDimension命中即disabled("PDD 商品包含颜色、尺码之外的可选规格,请人工处理")len(dataset.skuCombinationsByPDD[pdd.ID]) == 0时disabled("缺少当前 PDD 商品的完整可售 SKU 组合,请先重新采集")models.SYBProduct.ManuallyConfirmed已存在(提交 4a1b4af),A1 可直接复用,无需迁移方案
TargetColor/TargetSize,保存时置ManuallyConfirmed=true,行状态即时变为可采购。复用现有字段,无数据库迁移。hasSelectableOtherDimension不再直接disabled,改为返回该维度可选值,人工在弹层中选定后随规格映射一并保存。三个写入动作统一走现有
ManualRequest幂等RequestID模式(对齐manual.go:13 AuthorizeRePurchase),落库记录操作人、时间、原值,保证可追溯。前置依赖与并行
batch.go同一区域,建议本单先合入子项目影响
server/:app/goauto/purchase包web/:SYB 商品列表页设计证据
风险
验收
验证
.\scripts\verify.ps1 -Component all文档影响
docs/03-business-rules-and-glossary.md:采购前置条件规则变化docs/08-agent-api-contract.mdsync+sync --check实施进展
A1 已完成(未提交)
后端与修正弹层本已存在(
PATCH /:productId/correction→sybimport.ManualCorrect,且sybSpecsTrusted自4a1b4af起已信任ManuallyConfirmed),缺口只在入口:列表页nextAction=reparse原先跳转打开详情抽屉,用户还需在抽屉内再找「人工修正」。改动仅限
web/src/views/goauto/syb-products/index.vue:runPurchaseNextAction中reparse分支改为直接openCorrect(row),不再绕详情抽屉openCorrect(row = null)支持列表行与抽屉两个来源,新增fromList标记决定保存后刷新列表还是刷新抽屉查看并处理→人工修正@click="openCorrect"会把 MouseEvent 当作 row 传入的缺陷,改为@click="openCorrect()"验证:
npx eslint通过;grep确认tests/e2e/无用例依赖被改动的文案或行为。A2 / A3 待设计确认
按本工单「设计证据」要求,A2/A3 为新交互,原型确认后才编写生产代码。
原型链接:https://claude.ai/code/artifact/89f715d6-cb26-4749-8a62-024e9ea3bdec
版本:v1 草稿
创建日期:2026-09-01
状态:待用户确认
覆盖范围:A2 第三维度规格选择弹层、A3 确认规格可售弹层;两者各覆盖正常、空、加载中、失败、禁用、权限边界六类状态;含三处人工确认的落库对照表。
版本识别方式:页面顶部 masthead 标注「工单 #190 / 版本 v1 草稿 / 2026-09-01」。
原型中提出三个待拍板问题,答复前不进入编码:
问题 2 的答复直接决定是否需要数据库迁移,属高风险项,需单独确认。
待验收
范围变更说明
本工单最初的 A1/A2/A3 方案(为每个限制配人工确认弹层)经用户明确否决:需求是删除限制,不是新增人工确认交互。因此 A1 已撤销,A2/A3 原方案作废,改为按用户逐条勾选的清单直接删除拦截条件。原型链接(v1 草稿)已不再作为实施依据。
已完成
提交
55c2b6bRevert A1(就地人工修正入口)31c32d6删除 AI 匹配与采购创建的规格前置限制4eac729同步业务规则镜像删除的拦截(用户逐条确认)
AI 匹配
ai_match_eligibility.go(净删 59 行):随之失效的
shopeeHasTarget、hasSelectableOtherDimension及encoding/json、productspec导入一并删除。规格映射
batch.go预检 +service.go创建:spec_source=unresolvedunresolvedpurchasePriceRange在mappedColor为空时取全部颜色价格区间,保留失效映射反而会卡在PDD_PRICE_MISSING保留的门禁及原因
service.go中spec_source=unresolved且规则不含purchase.spec-probe.v1时仍拒绝创建。删除它会产生 Agent 无法执行的任务。未执行的条目
用户原始清单中的 4 条未执行,原因如下:
AGENTS.md永久规则「同一 PDD 商品不能同时存在多个pending或running采集任务」,且并发属高风险项。删除需同步修改AGENTS.md并单独确认ruleSnapshot时 Agent 无执行依据MinUnitPriceCent/MaxUnitPriceCent有max >= min数据库约束,AgentpriceGuard依赖该区间,删除需先定兜底策略。且 #16 完成后其触发面已收窄至「商品完全无任何颜色价格」enforcePersistedMatch用户已确认接受上述 4 条不做。
已知后果(用户已知悉并接受)
删除解析状态门禁后,批量 AI 匹配会以
parse_status=uncertain或failed的目标规格进行匹配,AI 会把可能错误的目标映射到 PDD 规格并保存映射结果。#191 删除enforcePersistedMatch后,该链路将不再有服务端复核点。本项目为内部系统,该风险由人工承担。注:
enforcePersistedMatch本工单未改动,仍在BatchPreview中生效,因此 SYB 列表批量创建路径的「已保存确认映射 + 命中可售组合」要求当前仍然成立,直至 #191 实施。验证
go build ./...通过go test ./app/goauto/...全部通过TestBatchPreviewRejectsUncertainParseAndMissingSKUCombination→TestBatchPreviewAllowsUncertainParseAndMissingSKUCombinationTestCreateLiveRejectsExpiredConfirmedMapping→TestCreateLiveDowngradesExpiredConfirmedMappingToSpecProbe文档影响
有长期文档影响,已完成闭环:
Business-Rules-and-Glossary已更新并在线回读a6f63cc745cf0e0df7ca94521a70fb6af3adea26harness.py sync与一轮sync --check,检查通过docs/03-business-rules-and-glossary.md已提交(4eac729)附带发现(不在本工单范围)
docs/12-syb-erp-interface.md每次sync都会产生重复的gitea-wiki-mirror头部块。根因是线上 Wiki 页SYB-ERP-Interface-Contract的正文中嵌入了一份镜像头,即镜像文件曾被反向粘贴回 Wiki(AGENTS.md明确禁止)。sync --check仍报一致,不影响本工单闭环。建议另建工单清理该 Wiki 页正文。分支
feat/190-syb-inline-correction(分支名沿用自已撤销的 A1,未改名以保持已推送引用有效)