采购规则内容是源码常量:server/app/goauto/purchasecontract/default.go 的 DefaultLiveRule() 返回一整条 JSON,其自身注释即写明「Purchase rules do not yet have their own editable archive」。
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
所属与来源
AGENTS.md「Gitea 交互与工单最小读取」记录回退原因。当前事实(提交
9bb19b4复核)server/app/goauto/purchasecontract/default.go的DefaultLiveRule()返回一整条 JSON,其自身注释即写明「Purchase rules do not yet have their own editable archive」。purchase/batch.go:237(批量创建)与purchase/retry.go:126(批量重试)直接调用该常量。POST /api/admin/v1/purchase-tasks(purchase/service.go:47-50)虽接受调用方传入ruleSnapshot,但 Admin 无编辑入口,实际不可配。purchasecontract/contract.go:动作白名单、能力位、forbiddenClickFragments、swipe 参数上下限,均为源码常量。models.PurchaseTask.RuleSnapshot(models/purchase.go:117)冻结创建时的规则,purchase/lifecycle.go:180另存RuleSnapshotHash于尝试记录。collection_rule(models/schema.go:100-112)与完整 Admin 接口(access/purchaser.go:69-73:模板查看、列表、新增、修改、删除,且写操作对采购员角色关闭)。结论:PDD 侧任何采购流程文案或步骤变化,当前必须修改 Go 源码并重新部署服务端;采集侧经 #115 已可通过 Admin 配置,两者能力不对等。
目标
rule_snapshot保持不可变。非目标
pay/payment动作仍按 #116 口径拒绝。forbiddenClickFragments与地址类永久禁令。实施方案
一、数据模型
purchase_rule,结构对齐collection_rule:id、name、content_json、三个幂等请求 ID 列、时间戳与软删除列。不复用collection_rule表。AGENTS.md,迁移属高风险改动,实施前需再次人工确认。DefaultLiveRule()完全一致(逐字节比对),保证行为不变。二、服务端
purchasecontract.DefaultLiveRule()保留但降级为「初始化种子」,仅供迁移与测试使用;batch.go:237与retry.go:126改为从数据库读取当前启用的采购规则。purchase_task.rule_snapshot,RuleSnapshotHash逻辑不变;后续修改规则不影响已排队任务。purchasecontract.Validate(live 与 rehearsal 两种模式均校验),校验不通过即拒绝保存,不允许保存无效规则后再在执行期失败。三、Admin 接口与权限
/api/admin/v1/purchase-rules的查看、新增、修改、删除接口,路径风格对齐采集规则。access/purchaser.go中为采购规则单独登记权限点,不与采集规则共用。写操作(新增/修改/删除)对采购员角色关闭,与采集规则写操作的现有口径一致。createOrder与updateShippingAddress等不可逆动作,保存时必须二次确认;确认交互属界面变化,按双门禁需先提供设计证据(可复用现有规则编辑界面规范并提供标注截图),确认后再写生产代码。四、Admin 界面
安全边界
forbiddenClickFragments、地址类永久禁令、pay动作拒绝全部保持。验收标准
purchase_rule表创建成功,迁移可重复执行,既有表与数据不受影响。DefaultLiveRule()逐字节一致。rule_snapshot反映新内容,已有任务快照不变。pay动作、支付点击目标或地址类文字的规则时被拒绝,错误信息与 #116 口径一致。验证方式
go test ./app/goauto/purchase/... ./app/goauto/purchasecontract/... ./app/goauto/access/...依赖、并行与风险
AgentManualCollectionSetting的「Agent 手动采集规则」,再复用会产生歧义;建议「规则中心」下分「采集规则 / 采购规则」。purchase_rule表(不删表),代码恢复读取源码常量即可。文档影响
Architecture-and-Code-Map(docs/02-architecture-and-code-map.md):采购规则来源由源码常量改为数据库表。Android-Agent-API-Contract(docs/08-agent-api-contract.md):采购规则的存储位置与快照口径描述。Business-Rules-and-Glossary(docs/03-business-rules-and-glossary.md):采购规则可编辑范围与权限边界。sync与一轮sync --check,把页面与 revision 写回本工单。状态
待实施(数据库迁移需在实施前再次人工确认)。
修正:正文中的「启用规则」为悬空前提,改为单例生效设置
正文「实施方案 → 二、服务端」第 4、5 项写有「从数据库读取当前启用的采购规则」「读取不到启用规则时明确失败」。经复核,
enabled这一概念在当前代码中并不存在:models.CollectionRule(server/app/goauto/models/schema.go:100-112)只有软删除DeletedAt,没有enabled或is_default字段;若不修正,实施时会被迫自行发明一套启用语义。现按下述口径修订,覆盖正文第 4、5 项。
一、改用单例生效设置,不给规则加启用标记
新增单例表
purchase_rule_setting,结构对齐现有的agent_manual_collection_setting(schema.go:177-186):id固定为 1,autoIncrement:false);rule_id外键指向purchase_rule,OnDelete:RESTRICT;选择单例表而非在规则上加
is_default标记的理由:单例表天然保证「有且只有一条生效」,不需要额外维护「不得同时存在多条默认」的唯一性约束与并发校验。采购批量创建必须能唯一确定规则来源,单例语义与该需求完全吻合。二、正文第 4、5 项的修订表述
purchasecontract.DefaultLiveRule()保留但降级为初始化种子,仅供迁移与测试使用;purchase/batch.go:237与purchase/retry.go:126改为读取purchase_rule_setting指向的采购规则。三、迁移与接口补充
purchase_rule表并写入初始记录的同一事务内,创建purchase_rule_setting单行并指向该初始记录,保证迁移完成后采购立即可用。OnDelete:RESTRICT之外,服务层也要给出可读错误),避免出现无生效规则的状态。四、明确不在本工单范围:停用开关
用户于 2026-08-28 明确:停用开关先不做。
因此本工单不新增
enabled字段,不引入「生效 / 停用 / 删除」三态。规则可用性仍沿用AGENTS.md第 1 节既有业务规则:「规则创建即生效;删除后不能创建新任务,但已有任务继续使用自身规则快照」。该长期业务规则本工单不改动,相应地也不涉及Business-Rules-and-Glossary中该条的改写。若后续需要可逆的停用能力,须单独建单,并先取得用户对修改该条永久业务规则的确认。
五、受影响的验收标准
正文验收标准中涉及「启用规则」的两条相应调整为:
purchase_rule_setting指向的规则;单例设置缺失或指向失效规则时明确失败,不回退源码常量。正文其余目标、非目标、安全边界、验证方式与文档影响不变。
修订:界面部分改为「规则中心」一次到位
用户于 2026-08-28 确认:采集规则与采购规则统一收进「规则中心」,下分两类。本评论修订正文「非目标」与「实施方案 → 四、Admin 界面」,覆盖此前「不做模块合并与改名」「不改导航结构与模块名称」的表述。
一、修订原因
正文原写「提供采购规则编辑入口,本工单不改导航结构与模块名称」,该表述自相矛盾:新增一个入口本身就是导航变化,同样需要设计证据。按原计划会产生两次界面变动——先加一个临时的「采购规则」入口,之后再合并改名——用户需要重新适应两次导航,设计证据也要出两轮。
既然界面部分本就卡在设计证据之后,原型直接按目标形态绘制,导航只动一次。
二、非目标修订
删除原非目标中的「不做模块合并与改名」一条,替换为:
其余非目标不变(不实现支付、不放宽禁止清单、不改 Agent 代码与采购执行逻辑、不做停用开关)。
三、Admin 界面修订
原第四节替换为:
createOrder与updateShippingAddress等不可逆动作。Agent在本项目已指代 Android 客户端本身,以及AgentManualCollectionSetting中的「Agent 手动采集规则」,复用会产生歧义。四、实施顺序(明确分阶段)
界面与后端解耦,后端不等原型:
purchase_rule+purchase_rule_setting)、迁移与初始记录、服务端规则来源切换、Admin 接口与权限登记。此阶段完成后采购规则只能通过接口维护,界面上尚无规则中心。AGENTS.md双门禁,导航变化与新模块必须先经原型确认,确认前不得编写前端生产代码。第一阶段可与第二阶段并行;第三阶段严格等待第二阶段确认。
五、后续工单说明
原风险段提到的「后续工单:规则中心聚合视图与模块改名」不再单独建单,该范围已并入本工单的第二、三阶段。
六、验收标准补充
在正文既有验收标准基础上增加:
七、文档影响补充
在正文既有文档影响基础上增加:Wiki
Architecture-and-Code-Map需记录规则中心的入口结构与「产品层统一、数据层分离」的边界;若采集规则的接口路径未变,则Android-Agent-API-Contract中采集部分无需改动,实施时确认并在工单说明。正文的目标、安全边界、验证方式与依赖风险其余部分不变。
#127 + #146 v1 标注稿待确认(2026-08-29)
GoAuto #127 + #146 v1image/svg+xml)对既有方案的必要修订
#127 最后一次评论提出“规则中心”,但之后 #142 v2 已由用户确认并实施,当前长期导航事实是“采采管理”直接包含业务页面且不增加第三级。为避免回退已验收设计,本版以较新的 #142 为准:
覆盖范围
priceGuard.minRatio / maxRatio两个可见标签、范围、默认值与错误提示位置。设计确认后仍须用户单独明确授权 #127 的追加数据库迁移,才能进入生产实施。
用户于 2026-08-29 明确确认
#127 + #146 v1标注稿,并授权 #127 按工单方案实施追加数据库迁移。按较新的 #142 导航事实实施:在“采采管理”下新增同级“采购规则”,不引入第三级规则中心。现从 #127 开始实施;不执行支付、真实采购或未授权的数据删除。已按已确认的 #127+#146 v1 实施并推送,现转待验收。
实现:
提交:148ba96;测试夹具补充:5d85625;共享文档:1ec895b。
验证:相关 Go 单测、go test ./...、Server build、Web 定向 lint、Web build:prod、DevHarness strict check 均通过。
Wiki:Business Rules 96b59298692b897eb64f06a1d9c7ab03282fa7ad;API Contract 811176b77b923111b5ee972b421716ea224a3a96;Architecture d94641e4574e064395edb9da4b52b1a268925923;Local Dev 88cbef39a8744753021b82f2c97879db29e320d4。
边界:本次仅实现并测试追加迁移,未执行本机/正式数据库迁移,等待单独执行授权。