diff --git a/docs/00-ai-start-here.md b/docs/00-ai-start-here.md index 446b768..4ef32ef 100644 --- a/docs/00-ai-start-here.md +++ b/docs/00-ai-start-here.md @@ -119,7 +119,7 @@ cmbuyer 是一个自动化采购系统:**网页端**负责建单与人工决 只做: -- **手工填链接**建单、任务查询 +- **手工填链接**建单、任务查询、勾选待开始任务后批量开始第一趟试选 - 桌面端**定时轮询**领取(试选与下单两类) - 第一趟试选:精确勾选规格、读单价、截图、退出释放手机 - 人工确认「机器选对了吗」并签发授权(**锁定单价**) @@ -135,7 +135,7 @@ cmbuyer 是一个自动化采购系统:**网页端**负责建单与人工决 - **图片搜索**(B 路径)与多候选对照台 - **Excel 导入**、**ERP 建单**(均被待确认字段契约阻塞) - 订单自动回读核对 -- 批量勾选编排 +- 已开始任务的批量排序、暂停 / 继续和运行中人工接管 - 绕过验证码、风控、人脸、短信校验 - 拼多多以外的平台 - 多设备并行、审批链、退款、财务对账 diff --git a/docs/02-requirements.md b/docs/02-requirements.md index f5ec2c7..7573498 100644 --- a/docs/02-requirements.md +++ b/docs/02-requirements.md @@ -31,7 +31,7 @@ MVP 只做**任务自带商品链接**的情形,分两趟执行:第一趟试 | ID | 功能 | 用户能做什么 | 优先级 | 关联用户故事 | | --- | --- | --- | --- | --- | -| F-001 | 手工建单 | 管理员填写任务名称、拼多多链接、颜色分类、尺码、数量、价格上限,得到一条任务 | P0 | US-001 | +| F-001 | 手工建单 | 管理员在任务列表内填写任务名称、拼多多链接、颜色分类、尺码、数量、价格上限,保存一条待开始任务 | P0 | US-001 | | F-004 | 任务查询 | 管理员按关键词、状态、时间范围找到目标任务 | P0 | US-002 | | F-005 | 桌面端定时领取 | 执行员启动会话后,桌面端定时轮询领取待试选和已授权两类任务 | P0 | US-003 | | F-006 | 第一趟试选 | 系统打开商品、按维度精确勾选颜色分类和尺码、读单价、截图后退出 | P0 | US-003 | @@ -42,6 +42,7 @@ MVP 只做**任务自带商品链接**的情形,分两趟执行:第一趟试 | F-011 | 结果与失败分类回传 | 管理员看到成功、失败、已取消、待人工,以及可区分的失败原因和证据 | P0 | US-002、US-008 | | F-013 | 登录与身份隔离 | 管理员用账号登录网页端;桌面端用设备凭据接入,两者权限不互通 | P0 | US-007 | | F-017 | 下单 dry-run、提交围栏与调和 | 真机先只读演练到订单确认页;真实点击前由服务端原子冻结授权;点击后只调和结果、绝不重试 | P0 | US-005、US-008 | +| F-018 | 批量开始试选 | 管理员勾选一条或多条待开始任务,统一放入第一趟试选队列 | P0 | US-010 | > F-002、F-003、F-012 已移出 MVP,编号保留不重用,见下表。 @@ -51,7 +52,7 @@ MVP 只做**任务自带商品链接**的情形,分两趟执行:第一趟试 | --- | --- | --- | | F-002 Excel 批量建单 | 上传固定表头表格批量生成任务 | V2,被表头契约待确认阻塞 | | F-003 从 ERP 货运明细建单 | 同步顺运宝货运单后复核生成任务 | V2,被字段映射待确认阻塞 | -| F-012 批量顺序编排与人工接管 | 勾选多条按顺序跑、暂停继续 | V2;MVP 用定时轮询代替 | +| F-012 批量顺序编排与人工接管 | 对已开始任务排序、暂停继续、运行中接管 | V2;MVP 仅支持批量开始试选,实际执行仍由定时轮询领取 | | F-014 图片搜索路径(B 路径) | 任务只有参考图时搜图产出 goods_id 候选 | V2 | | F-015 候选对照台 | 多个候选并排对照挑选 | V2,随 F-014 | | F-016 订单自动核对回读 | 付款后只读读取订单页做五项唯一匹配并回写 | V2;MVP 用截图 + 人眼核对 | @@ -77,6 +78,7 @@ MVP 只做**任务自带商品链接**的情形,分两趟执行:第一趟试 | F-008、F-009、F-010、F-017 | US-005 | P0 | | F-013 | US-007 | P0 | | F-011 | US-008 | P0 | +| F-018 | US-010 | P0 | US-006(付款前核对)在 MVP 降级为:系统展示订单截图与授权信息,人在拼多多自行核对 后付款并手工标记完成。自动回读核对是 F-016(V2)。US-009(ERP 建单)随 F-003 移出 MVP。 @@ -85,9 +87,12 @@ US-006(付款前核对)在 MVP 降级为:系统展示订单截图与授权 ### 建单 -- **F-001**:填入任务名称、合法拼多多链接、颜色分类、尺码、数量、价格上限后提交,返回任务编号, - 任务出现在列表且状态为待领取。链接格式非法或无法解析出 `goods_id` 时明确报错并保留 - 已填内容。 +- **F-001**:在任务列表点击创建,填入任务名称、合法拼多多链接、颜色分类、尺码、数量、 + 价格上限后保存,返回任务编号;弹窗关闭,任务按创建时间倒序出现在第一行且状态为待开始。 + 链接格式非法或无法解析出 `goods_id` 时明确报错并保留已填内容。 +- **F-018**:列表只允许勾选待开始任务;全选只覆盖当前筛选结果中可开始的任务。点击 + 「开始试选」后,被选任务原子转为待领取,并明确提示这只是进入第一趟试选队列, + **不签发下单授权、不创建订单、不付款**。任一任务状态已变化时整批不提交,刷新后重选。 ### 第一趟:试选 @@ -151,11 +156,12 @@ US-006(付款前核对)在 MVP 降级为:系统展示订单截图与授权 | --- | --- | | 第一版平台 | 网页端(管理)+ Windows 桌面端(执行),驱动一台 Android 手机 | | 是否需要账号 | 是。管理员账号 + 桌面端设备凭据,两套身份分离 | -| 第一版范围 | 手工建单 → 定时领取 → **第一趟试选** → 人工确认 → dry-run / 提交围栏 → **第二趟下单** → 待付款 | +| 第一版范围 | 手工建单 → 批量开始试选 → 定时领取 → **第一趟试选** → 人工确认 → dry-run / 提交围栏 → **第二趟下单** → 待付款 | | 任务来源 | **仅手工填链接。** Excel 与 ERP 移出 MVP | | 找货方式 | **仅按链接。** 图片搜索移出 MVP | | 采购平台 | 仅拼多多 | | 领取方式 | 定时轮询,只在执行员启动的会话内运行 | +| 任务启动 | 创建后为待开始;管理员在列表勾选一条或多条并统一开始第一趟试选 | | 设备连接 | ADB over USB 或 WiFi 均支持;同一台手机不得同时以两种方式在线 | | 付款收口 | 系统展示订单截图,人核对后付款并手工标记完成 | | 暂不支持 | 自动付款、图搜、Excel、ERP、多设备并行、多平台、退款、审批链、AI 辅助 | diff --git a/docs/04-architecture.md b/docs/04-architecture.md index 06f2340..b5f27d8 100644 --- a/docs/04-architecture.md +++ b/docs/04-architecture.md @@ -12,7 +12,7 @@ v ┌─────────────────────────────────────────┐ │ web 端(Go 单二进制) │ - │ · 建单与任务生命周期 │ + │ · 建单、批量开始试选与任务生命周期 │ │ · 候选确认与下单授权(唯一决策权威) │ │ · 证据存储与审计 │ │ · 管理 Web(服务端渲染) │ @@ -87,8 +87,14 @@ 这是本项目最核心的结构决策。**MVP 只做 A 路径(任务自带商品链接),分两趟跑完。** ```text + ┌──────────── web 端开始第一趟 ────────────┐ + │ 新任务先保存为 DRAFT │ + │ 管理员在任务表格勾选一条或多条 │ + │ 原子转为 PENDING,只进入试选队列 │ + └────────────────────┬─────────────────────┘ + v ┌──────────────── 第一趟:试选 ────────────────┐ - │ desk 端轮询领取待执行任务 │ + │ desk 端轮询领取 PENDING 任务 │ │ 1. open_product(url) │ │ 2. 打开规格面板 │ │ 3. 按维度精确勾选颜色分类、尺码 │ @@ -301,10 +307,11 @@ MVP 的授权没有「选择理由 / 拒绝理由」——那是从多个候选 ### 5.2 状态机 -任务状态(web 端权威)。两趟执行对应两次 `CLAIMED → RUNNING`: +任务状态(web 端权威)。创建与开始试选分离;两趟执行对应两次 `CLAIMED → RUNNING`: ```text -PENDING / PENDING_RETRIAL ─claim→ CLAIMED ─start→ RUNNING(TRIAL) +DRAFT ─start trial→ PENDING ─┐ +PENDING_RETRIAL ─────────────┴─claim→ CLAIMED ─start→ RUNNING(TRIAL) ↑ │ ├→ NEEDS_MANUAL └────────release──────┘ └→ WAITING_CONFIRMATION ├→ CANCELED @@ -320,6 +327,7 @@ PENDING / PENDING_RETRIAL ─claim→ CLAIMED ─start→ RUNNING(TRIAL) | 状态 | 含义 | | --- | --- | +| `DRAFT` | 已保存、等待管理员开始试选;设备不可领取,也不存在下单授权 | | `RUNNING(TRIAL)` | 第一趟试选中:正在勾选规格、读价、截图 | | `WAITING_CONFIRMATION` | 试选已回传,**等人确认机器选对了没** | | `PENDING_RETRIAL` | 旧授权已过期或在围栏前被放弃,必须重新跑第一趟取得新价格 | @@ -333,6 +341,10 @@ PENDING / PENDING_RETRIAL ─claim→ CLAIMED ─start→ RUNNING(TRIAL) 授权状态:`PENDING_DELIVERY → DELIVERED → ACKNOWLEDGED → EXECUTING → FENCED → CONSUMED`。 人退回或重新确认时旧授权转 `SUPERSEDED`;超时转 `EXPIRED`。 +`DRAFT → PENDING` 只能由管理端“开始试选”动作触发。批量开始在一个事务中校验全部任务仍为 +`DRAFT` 且版本一致后统一流转;任一冲突时整批不变,避免用户误以为选中的任务都已开始。 +这个动作只开放第一趟领取资格,不创建 `order_authorizations` 或 `order_submissions`。 + ### 5.3 授权超时(MVP 必做,不得推后) > **前序项目的教训**:曾出现 `EXECUTING` 授权永不推进,导致确认表单被永久隐藏、任务 diff --git a/docs/06-tasks.md b/docs/06-tasks.md index 8894d60..de24c2d 100644 --- a/docs/06-tasks.md +++ b/docs/06-tasks.md @@ -25,7 +25,7 @@ | T-002 | 初始化 desk 端 Python 骨架 | - | 虚拟环境、`requirements.txt`、`unittest` 可运行;`python -m compileall` 通过;日志与产物目录策略明确且不记录敏感信息 | | T-003 | 建立 `init.ps1` 统一入口 | T-001, T-002 | 一条命令完成两端安装与基础验证并打印启动命令;未配置时主动失败而不是静默跳过 | | T-004 | 建立核心数据模型与状态机 | T-001 | `tasks`、`order_authorizations`、`order_submissions` 表与 `04-architecture.md` 一致;状态流转有单元测试;金额用十进制字符串 | -| T-005 | 网页端 MVP 交互原型 | - | `docs/design/web-*.html` 单文件假数据原型覆盖登录、建单、工作台、详情;键盘、窄屏、空态 / 错误 / 加载、围栏后调和状态可演示;经人工确认前保持 `DOING` | +| T-005 | 网页端 MVP 交互原型 | - | `docs/design/web-*.html` 单文件假数据原型覆盖登录、表格工作台、创建弹窗、批量开始试选、路由化详情抽屉与完整详情;键盘、窄屏、空态 / 错误 / 加载、围栏后调和状态可演示;经人工确认前保持 `DOING` | | T-006 | 桌面端 MVP 交互原型 | - | `docs/design/desk-*.html` 单文件假数据原型覆盖采购执行、设备与参数;明确 dry-run / 真实下单、App 版本失配、围栏后不可重试;经人工确认前保持 `DOING` | ### Phase 1 · 真机取证(最高风险,必须先做) @@ -51,9 +51,9 @@ | ID | 任务 | 依赖 | 验收要点 | | --- | --- | --- | --- | | T-201 | 管理员登录与会话 | T-004, T-005 | 登录建立会话;CSRF 生效;未登录跳转并只接受站内返回路径 | -| T-202 | 手工建单(F-001) | T-201 | 任务名称、链接、颜色分类、尺码、数量、价格上限校验;无法解析 `goods_id` 时明确报错并保留输入 | -| T-203 | 任务工作台与查询(F-004) | T-202 | 三泳道渲染;关键词 / 泳道 / 时间范围筛选;计数不随泳道变化;空状态可清除筛选 | -| T-204 | 任务详情页(F-011) | T-203 | 按状态呈现唯一主区块与主动作;执行证据可查看 | +| T-202 | 手工建单(F-001) | T-201 | 列表内创建弹窗与 `/tasks/new` 复用表单;任务名称、链接、颜色分类、尺码、数量、价格上限校验;成功创建 `DRAFT` 并倒序显示第一行 | +| T-203 | 任务表格、查询与批量开始试选(F-004、F-018) | T-202 | 传统表格无操作列;标题关键词筛选;只选 `DRAFT`;批量 `DRAFT → PENDING` 全有或全无;空状态可清除筛选 | +| T-204 | 路由化任务详情(F-011) | T-203 | 从列表进入显示保留现场的右侧抽屉,直达显示完整页;按状态呈现唯一主区块与主动作;执行证据可查看 | | T-205 | 试选结果接收与确认页(F-007) | T-204, T-103 | 接收 `spec_trials` 与规格面板截图;确认页展示需求 vs 所选、单价、合计、截图;**轻量版,非对照台** | | T-206 | 人工确认与授权签发(F-008) | T-205 | 确认即签发一次性授权并**锁定试选单价**;`expected_task_version` 冲突返回 409;金额上限服务端校验;支持「退回,不买」 | | T-207 | 授权超时与围栏前放弃(F-010) | T-206 | 围栏前超时 / 放弃后任务转 `PENDING_RETRIAL`,必须重新试选;围栏后禁止超时释放或放弃,改走人工核查;每个状态都有安全下一步 | diff --git a/docs/07-user-stories.md b/docs/07-user-stories.md index ca2e218..7f766a2 100644 --- a/docs/07-user-stories.md +++ b/docs/07-user-stories.md @@ -29,6 +29,7 @@ US 编号一经引用不再重用。需求变化时先改[需求](02-requirement | US-006 | 付款前核对订单再花钱 | P0 | 采购管理员 | 对着系统给的几项组织人工核对,不一致就不付 | F-009 收口 | IX-006 | 已定 | | US-007 | 管理身份和设备身份互不越权 | P0 | 采购管理员 | 设备被盗用也不能建单或改授权 | F-013 | IX-001 | 已定 | | US-008 | 任务出问题时知道该怎么办 | P0 | 采购执行员 | 看到具体原因和下一步,而不是一个「失败」 | F-011 | IX-008 | 已定 | +| US-010 | 把选中的任务交给机器试选 | P0 | 采购管理员 | 一次选中多条待开始任务,让桌面端逐条领取第一趟试选 | F-018 | IX-012 | 已定 | > US-009(从 ERP 货运明细建单)随 F-003 移出 MVP,编号保留不重用。 @@ -51,8 +52,8 @@ US 编号一经引用不再重用。需求变化时先改[需求](02-requirement **验收场景** -1. 假如我有商品链接和规格,当我填完表单提交,那么得到任务编号,任务出现在工作台的 - 「机器在跑」泳道且状态为待领取。 +1. 假如我有商品链接和规格,当我在任务列表的创建弹窗填完并保存,那么得到任务编号, + 弹窗关闭,任务按创建时间倒序出现在表格第一行且状态为待开始。 2. 假如链接无法解析出商品标识,当我提交,那么系统明确报错并保留我已填的内容。 3. 假如我没填价格上限,当我提交,那么系统拒绝——**价格上限是资金边界,不能留空**。 @@ -69,13 +70,13 @@ US 编号一经引用不再重用。需求变化时先改[需求](02-requirement **范围** -- 包含:按「谁持球」分组、关键词与时间范围查询、任务详情的结果与证据。 +- 包含:传统任务表格、关键词与时间范围查询、任务详情抽屉和完整详情页中的结果与证据。 - 不包含:自定义视图、导出报表、跨任务统计。 **验收场景** -1. 假如有任务停在等待人工确认,当我打开工作台,那么它出现在「等你决定」并且第一条 - 已经展开,我不用再点一次才看到内容。 +1. 假如有任务停在等待人工确认,当我打开工作台,那么表格状态与采购结果能让我一眼识别, + 双击该行即可在不丢失列表现场的情况下查看详情。 2. 假如我按关键词筛选后没有匹配,当结果为空,那么显示空状态并提供清除筛选,而不是 一片空白或报错。 3. 假如任务失败了,当我打开详情,那么我看到可区分的失败原因和当时的截图,而不只是 @@ -95,7 +96,7 @@ US 编号一经引用不再重用。需求变化时先改[需求](02-requirement **范围** - 包含:定时轮询领取、第一趟试选、第二趟下单、连续失败自动停。 -- 不包含:多台手机并行、无人值守整夜运行、批量勾选编排(V2)。 +- 不包含:多台手机并行、无人值守整夜运行、已开始任务的排序、暂停 / 继续和运行中接管(V2)。 **验收场景** @@ -225,6 +226,30 @@ US 编号一经引用不再重用。需求变化时先改[需求](02-requirement 5. 假如点击提交订单后无法判断是否已创建,那么系统转人工并提示「订单可能已创建、 支付未完成」,进入同一提交记录的调和,**不自动重试、不释放围栏**。 +### US-010 把选中的任务交给机器试选 + +- 优先级:P0 | 关联功能:F-018 | 关联交互:IX-012 +- 角色:采购管理员 +- 前置条件:已登录;任务表格中至少有一条待开始任务。 + +**用户故事** + +作为采购管理员,我想要勾选一条或多条待开始任务统一开始试选,从而在集中建单后一次交给 +桌面端逐条领取,而不必逐行点击操作按钮。 + +**范围** + +- 包含:当前筛选结果中的可开始任务全选、清除选择、批量进入第一趟试选队列。 +- 不包含:指定执行顺序、暂停 / 继续、运行中接管、多设备调度(F-012,V2)。 + +**验收场景** + +1. 假如我勾选了多条待开始任务,当我点击「开始试选」,那么这些任务一起转为待领取, + 页面明确说明不会创建订单或付款。 +2. 假如任务不是待开始,那么该行不能被本动作勾选,并能看见不可开始的原因。 +3. 假如其中一条任务在提交前已被别人启动,当版本冲突发生,那么整批不产生部分成功, + 页面刷新状态并让我重新选择。 + ## 四、交付前检查 - [ ] 每个 P0 功能至少关联一个 US 编号。 diff --git a/docs/08-interaction-checklist.md b/docs/08-interaction-checklist.md index bfc32bc..43833ec 100644 --- a/docs/08-interaction-checklist.md +++ b/docs/08-interaction-checklist.md @@ -19,15 +19,16 @@ IX 编号一经引用不再重用。交互清单不能扩大需求范围。 | ID | 关联 US | 页面 / 组件 | 触发 | 用户目标 | 预期结果 | 优先级 | 状态 | | --- | --- | --- | --- | --- | --- | --- | --- | | IX-001 | US-007 | web `/login` | 提交表单 | 进入管理后台 | 建立会话并进入原目标页或 `/tasks` | P0 | 已定 | -| IX-002 | US-001 | web `/tasks/new` | 提交表单 | 建单 | 解析出 `goods_id` 并返回任务编号 | P0 | 已定 | -| IX-003 | US-002 | web `/tasks` 查询条与泳道 | 输入 / 点选 | 找到要处理的任务 | 实时筛选、计数更新、空状态可清除 | P0 | 已定 | -| IX-004 | US-002 | web `/tasks/{id}` | 进入页面 | 了解任务当前处境 | 按状态呈现唯一主区块与主动作 | P0 | 已定 | +| IX-002 | US-001 | web `/tasks` 创建弹窗;`/tasks/new` 直达兜底 | 提交表单 | 建单 | 解析出 `goods_id`,关闭弹窗并把待开始任务插入表格第一行 | P0 | 已定 | +| IX-003 | US-002 | web `/tasks` 查询条与任务表格 | 输入后筛选 | 找到要处理的任务 | 默认显示标题关键词,可展开状态 / 时间条件;创建时间倒序;空状态可清除 | P0 | 已定 | +| IX-004 | US-002 | web `/tasks/{id}` 路由化详情抽屉 / 完整页 | 双击行、任务编号链接或直接进入 | 了解任务当前处境 | 从列表进入时右侧打开且保留现场;直达时显示完整页;按状态呈现唯一主区块与主动作 | P0 | 已定 | | IX-005 | US-004、US-005 | web 试选确认卡 | 查看后点确认 / 退回 | 确认机器选对了并授权 | 签发一次性授权并锁定单价,明确不付款 | P0 | 已定 | | IX-006 | US-006 | web 待付款核对卡 | 查看后手工标记 | 核对后付款 | 展示订单截图与授权信息;人付款后标记完成 | P0 | 已定 | | IX-007 | US-003 | desk 设备与参数页 | 填 serial → 连接检查 | 让设备就绪 | 连接成功并确认拼多多已安装 | P0 | 已定 | | IX-008 | US-003、US-008 | desk 采购执行页 | 开始 / 停止轮询 | 让手机自动跑并处理异常 | 待人工时显著提示缺什么;连续失败自动停 | P0 | 已定 | | IX-010 | US-005 | web 围栏前放弃授权入口 | 点击放弃 | 解开尚未提交的授权 | 授权作废,任务转待重新试选 | P0 | 已定 | | IX-011 | US-005、US-008 | web / desk 提交围栏与调和状态 | 真实点击前申请围栏;点击后回报 | 防止断网或重复操作产生第二笔订单 | 围栏前失败不点击;围栏后不明确只核查、不重试 | P0 | 已定 | +| IX-012 | US-010 | web `/tasks` 表格选择与上下文批量栏 | 勾选后点「开始试选」 | 批量交给桌面端试选 | `DRAFT → PENDING` 原子提交;仅开始第一趟,不授权、不下单、不付款 | P0 | 已定 | > IX-009(ERP 建单)随 F-003 移出 MVP,编号保留不重用。 @@ -39,7 +40,7 @@ IX 编号一经引用不再重用。交互清单不能扩大需求范围。 - 关联用户故事:US-004、US-005 - 关联需求 / 验收:F-007、F-008;[需求](02-requirements.md)第五节「决策与资金」 -- 页面 / 组件:web `/tasks/{id}` 的 `SpecTrialCard` + `AuthorizePanel` +- 页面 / 组件:web `/tasks/{id}` 路由化详情抽屉 / 完整页的 `SpecTrialCard` + `AuthorizePanel` - 目标角色:采购管理员 - 前置条件:已登录;任务状态为 `WAITING_CONFIRMATION`;已收到试选结果与规格面板截图 - 触发方式:查看后点击「确认下单(不付款)」或「退回,不买」 @@ -63,7 +64,7 @@ IX 编号一经引用不再重用。交互清单不能扩大需求范围。 | 规格不一致(✗) | **确认按钮禁用**并说明哪一项不符;只能「退回,不买」或转人工 | | 金额超上限(✗) | **确认按钮禁用**并显示超出多少;不提供「仍然确认」入口 | | 加载 / 提交中 | 按钮禁用并显示进行中,防重复提交 | -| 成功 | 跳回工作台,该任务进入「机器在跑」等待第二趟 | +| 成功 | 关闭详情抽屉或返回工作台,该任务显示为已授权并等待桌面端领取第二趟 | | 退回 | 二次确认后任务终止为 `CANCELED`,说明不会再自动执行 | | 服务或网络错误 | 保留页面状态,说明原因并允许重试 | | 权限不足 | 设备凭据调用此接口一律 403 并记录;页面不暴露任务内容 | @@ -177,6 +178,9 @@ IX 编号一经引用不再重用。交互清单不能扩大需求范围。 - 键盘可达、焦点可见、`prefers-reduced-motion` 生效。 - 状态不能只靠颜色表达。 - 金额一律显示两位小数并标注币种。 +- 双击只能作为效率快捷方式;任务编号链接和聚焦行后按 Enter 必须提供等价详情入口。 +- 表格行内的复选框、商品外链和任务编号链接不得误触发行双击;关闭详情抽屉后焦点回到原行。 +- 表格批量栏只在存在选择时出现;全选只覆盖当前筛选结果中允许当前动作的行。 ## 五、交付前检查 diff --git a/docs/api.md b/docs/api.md index 50ddca3..d3ef805 100644 --- a/docs/api.md +++ b/docs/api.md @@ -53,7 +53,8 @@ | `POST` | `/login` | 建立管理会话 | | `POST` | `/logout` | 销毁会话 | | `GET` | `/tasks` | 任务列表,支持 `q`、`status`、`days`、`cursor` | -| `POST` | `/tasks` | 手工建单(F-001) | +| `POST` | `/tasks` | 手工建单,初始状态为 `DRAFT`(F-001) | +| `POST` | `/tasks/start-trials` | 批量把 `DRAFT` 原子转为 `PENDING`,开始第一趟试选(F-018) | | `GET` | `/tasks/{id}` | 任务详情 | | `POST` | `/tasks/{id}/cancel` | 取消任务 | | `POST` | `/tasks/{id}/order-authorizations` | 确认试选结果并签发授权(F-008) | @@ -64,6 +65,28 @@ > Excel 导入(`/tasks/import`)与 ERP 货运(`/freight*`)已移出 MVP,见 > [需求](02-requirements.md)第三节后续迭代表。 +### `POST /tasks/start-trials` + +管理页面以带 CSRF 的表单提交结构化任务版本列表: + +```json +{ + "start_key": "<幂等键>", + "tasks": [ + { "id": "018f...", "expected_task_version": 1 }, + { "id": "0190...", "expected_task_version": 3 } + ] +} +``` + +- 只接受当前状态为 `DRAFT` 的任务;该动作含义是允许 desk 端领取第一趟试选,**不签发下单 + 授权、不建立提交围栏、不创建订单、不付款**。 +- 服务端在一个事务内校验全部任务存在、属于当前管理范围、状态仍为 `DRAFT` 且版本匹配, + 然后统一转 `PENDING` 并递增版本。任一项失败返回 `409 conflict`,整批不产生部分成功。 +- `tasks` 为空或包含重复 id 返回 `400 invalid_argument`;重复 `start_key` 返回第一次的结果, + 不重复推进版本。 +- SSR 成功后 `303` 返回原任务列表查询地址;冲突时保留筛选条件,刷新表格并要求重新选择。 + ### `POST /tasks/{id}/order-authorizations` ```json diff --git a/docs/current-state.md b/docs/current-state.md index bb7303c..dd010e3 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -13,7 +13,7 @@ - 日期:2026-08-03 - 阶段:**Phase 0 · 地基(先确认原型,尚未开始生产编码)** -- MVP 形态:手工填链接建单 → 定时轮询 → **第一趟试选** → 人工确认 → **第二趟下单** → 待付款 +- MVP 形态:手工填链接建单 → 批量开始试选 → 定时轮询 → **第一趟试选** → 人工确认 → **第二趟下单** → 待付款 - 技术栈:已定。web 端 Go 1.23+ / gin / SQLite;desk 端 Python 3.11+ / uiautomator2 / PySide6。 详见 [`03-tech-stack.md`](03-tech-stack.md) - 生产代码:**无**。仓库目前只有文档 @@ -22,8 +22,8 @@ - 标准启动路径:`./init.ps1`(Windows)/ `./init.sh`。已存在但会因两端目录未初始化而以 退出码 3 结束并列出待办任务——这是预期行为 - 标准验证路径:目前只有 `python scripts/validate_agent_context.py` 可跑通 -- 当前 blocker:T-005 / T-006 原型已实现并通过自动检查,正在等待人工确认;确认前不开始 - 对应生产 UI。 +- 当前 blocker:T-005 第二轮表格工作台修订和 T-006 均已通过自动检查;两者经人工确认前 + 不开始对应生产 UI。 ## 当前目录要点 @@ -42,10 +42,11 @@ 任务状态以 `docs/tasks/` 各任务文件 frontmatter 的 `status` 为准。本节只写项目级摘要: - 已完成:无。 -- 正在进行:T-005(网页端 MVP 交互原型)、T-006(桌面端 MVP 交互原型)。两个任务的 - HTML 与自动验证均已完成,因 `needs_human_review: true` 保持 `DOING`。 -- **下一步:人工浏览 6 个原型,确认布局、信息密度、唯一主动作和安全文案。** 明确确认后 - 才能把 T-005 / T-006 改为 `DONE`。 +- 正在进行:T-005(网页端 MVP 交互原型)、T-006(桌面端 MVP 交互原型)。T-005 第二轮 + 已将三泳道改为传统表格,并增加创建弹窗、`DRAFT` 批量开始试选和路由化详情抽屉;两项 + 自动验证均已完成。两个任务都因 `needs_human_review: true` 保持 `DOING`。 +- **下一步:人工浏览 6 个原型,重点确认 Web 表格字段、批量开始试选、创建弹窗、详情抽屉 + 与安全文案,以及桌面端执行状态。** 明确确认后才能把 T-005 / T-006 改为 `DONE`。 - 原型使用假数据、不调用真实接口、不驱动真机;T-001 / T-002 骨架可在确认后并行, Phase 2 生产页面还必须等待相关真机结论。 @@ -88,8 +89,9 @@ T-001 / T-002 完成后,本节替换为真实命令: 实现围栏前超时 / 放弃,在 T-208 实现围栏后调和;围栏后不得释放或重试。 4. **规格面板单价位置未取证**:闸门一依赖它,T-103 必须一并取证。若读不可靠, 确认页设计要改。 -5. **MVP 已收窄**:只做手工填链接 + 两趟执行。Excel、ERP、图搜、订单自动核对、 - AI 辅助全部推到 V2(见 `06-tasks.md` 的 T-501~T-508)。 +5. **MVP 已收窄**:只做手工填链接、批量开始第一趟试选和两趟执行。Excel、ERP、图搜、 + 批量顺序编排 / 暂停接管、订单自动核对、AI 辅助全部推到 V2(见 `06-tasks.md` 的 + T-501~T-508)。 6. **App 版本必须 fail closed**:运行时拼多多版本与本项目已取证版本不一致就停止领取, 不允许用旧判据继续跑。 diff --git a/docs/design/README.md b/docs/design/README.md index ced26aa..8fe34b4 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -17,6 +17,8 @@ - CSS / JS 全部内联,零构建依赖,双击即可在浏览器打开。 - 低保真优先:结构和控件齐全即可,不追求视觉完成度。 - 使用语义化标签(`button`、`form`、`table`、`dialog`、`nav`),标签本身就是控件清单。 +- 列表内详情可以使用路由驱动的抽屉 / 模态层,但必须保留可复制的详情 URL、浏览器返回和 + 完整页直达兜底;关闭后恢复触发行焦点与列表现场。 - 数据一律用假数据,页面顶部放固定横幅标注:`PROTOTYPE - 仅供枚举交互,非实现依据`。 - 不加载外部字体、CDN、图片或生产地址;浏览器网络面板除当前本地文件外应为零请求。 - 需要演示空态、加载、错误等状态时,可用少量内联 JS 做状态切换按钮,对应交互清单状态表的行。 diff --git a/docs/design/web-task-create.html b/docs/design/web-task-create.html index ac9ca3c..6204cc9 100644 --- a/docs/design/web-task-create.html +++ b/docs/design/web-task-create.html @@ -202,7 +202,8 @@

创建后发生什么

    -
  1. 任务进入「机器在跑」。
  2. +
  3. 任务先保存为「待开始」。
  4. +
  5. 在任务表格勾选后统一点击「开始试选」。
  6. 第一趟只试选、读价、截图,然后退出商品。
  7. 你看过证据后再决定是否授权。
@@ -309,7 +310,7 @@ setReady(); form.hidden = true; status.className = 'status success show'; - status.innerHTML = '

任务已创建

任务编号 T-20260803-019,已进入「机器在跑」等待领取。系统尚未进行任何拼多多操作。

查看任务工作台'; + status.innerHTML = '

任务已创建

任务编号 T-20260803-019,当前为「待开始」。请回到任务表格勾选后点击“开始试选”;系统尚未进行任何拼多多操作。

查看任务工作台'; status.focus?.(); } diff --git a/docs/design/web-task-workbench.html b/docs/design/web-task-workbench.html index 89b8f7b..81b9880 100644 --- a/docs/design/web-task-workbench.html +++ b/docs/design/web-task-workbench.html @@ -4,113 +4,179 @@ - 任务工作台 · cmbuyer 原型 + 采购任务 · cmbuyer 原型 @@ -119,156 +185,413 @@
PROTOTYPE - 仅供枚举交互,非实现依据
cmbuyer - +
-

任务工作台

按“谁持球”处理任务;第一条待决策任务默认展开。

- 新建采购任务 +

采购任务

创建后先保存为待开始;勾选后统一进入第一趟试选队列。

+

只开始试选,不会下单。 下单必须在试选完成并经人工确认后另行授权,付款始终由人完成。

-
-
-
-
- -
-

各泳道计数只随关键词与时间范围变化,不随泳道选择变化。

- -
- 共 6 条假数据任务,其中 3 条等你决定。 -
原型状态:
-
- -
-

正在加载任务,请稍候…

-
-
-

没有匹配的任务

调整关键词或时间范围,或者清除全部筛选条件。

-
- - -
-
-

等你决定

3
-

确认试选、核对待付款或处理结果不明。

-
-
-
T-20260803-018

8 月仓库工作服补货

等待确认
-
要求
白色 · XL · 2 件
机器选到
白色 · XL
读到单价
¥32.50
上限 / 合计
¥80.00 / ¥65.00
-
已展开:机器选对了吗?

规格一致、金额未超上限。确认前仍需查看规格面板截图。

查看证据并决定
- -
-
-
T-20260803-016

办公室收纳盒

结果不明
-
状态
可能已创建订单
提交记录
SUB-016-A
- -
-
-
T-20260801-009

标签打印纸补货

待付款
-
规格
白色 · 50×30
授权金额
¥46.00
- -
+
+
+
+
+ + +
+

导入暂未开放;MVP 只支持手工创建。

-
-
-

机器在跑

2
-

待领取、试选、授权后第二趟与围栏前执行。

-
-
-
T-20260803-019

新建的工作服任务

待领取
-
要求
深灰 · L · 1 件
价格上限
¥45.00
- -
-
-
T-20260803-017

仓库防滑手套

第二趟 · 围栏前
-
锁定单价
¥12.80
授权到期
11:25
- -
+
+ +
-
+
-
-

已结束

1
-

已付款完成、失败或已取消的归档任务。

-
-
-
T-20260731-042

打包胶带补货

已完成
-
规格
透明 · 45mm
人工标记
采购管理员
- -
-
-
+
+ 正在准备假数据任务… +
原型状态
+
+ +
+ + + + +
双击非控件区域或聚焦行后按 Enter 查看详情;空格勾选待开始任务。
标题颜色尺码价格上限数量采购结果 ⓘ状态创建时间 ↓
+
+ +

正在加载采购任务,请稍候…

+

没有匹配的采购任务

更换标题关键词,或者清除当前筛选。

+
+ + + +

创建采购任务

保存后为待开始,不会立即驱动手机。

+
+ +
+

+

原型使用 .invalid 假链接;生产环境需解析出 goods_id。

+

+

+

金额使用十进制字符串,最多两位小数。

+

+
+
+
+
+ + +

任务详情

采购任务

+
+

系统只创建待付款订单,绝不自动付款。 当前详情使用假数据,不访问拼多多或真实接口。

+

采购要求

+

采购结果

+

当前状态与下一步

+

执行证据

假数据证据占位
真实可读字段必须等待 T-103 真机取证;不展示地址、手机号或付款信息。
+
+ +
+ diff --git a/docs/routes.md b/docs/routes.md index 3d9f86c..092da31 100644 --- a/docs/routes.md +++ b/docs/routes.md @@ -8,9 +8,9 @@ | 路由 | 页面 | 职责 | 用户故事 | 交互 | | --- | --- | --- | --- | --- | | `/login` | 登录 | 建立管理会话 | US-007 | IX-001 | -| `/tasks` | 工作台 | 按「谁持球」查看任务、查询筛选、进入详情 | US-002 | IX-003 | -| `/tasks/new` | 手工建单 | 填链接、颜色分类、尺码、数量、价格上限 | US-001 | IX-002 | -| `/tasks/{id}` | 任务详情 | 看要求与执行结果;**试选确认与授权**;待付款核对 | US-002、US-004、US-005 | IX-004、IX-005、IX-006 | +| `/tasks` | 采购任务 | 传统表格查询、创建弹窗、批量开始试选、进入详情抽屉 | US-001、US-002、US-010 | IX-002、IX-003、IX-004、IX-012 | +| `/tasks/new` | 手工建单直达页 | 复用创建表单,作为无脚本和直接访问的完整页兜底 | US-001 | IX-002 | +| `/tasks/{id}` | 任务详情 | 从列表进入时显示右侧详情抽屉;直接访问时显示完整页;承载试选确认、授权与待付款核对 | US-002、US-004、US-005 | IX-004、IX-005、IX-006 | > `/tasks/import`(Excel)与 `/freight*`(ERP)随 F-002 / F-003 推迟到 V2。 @@ -19,19 +19,26 @@ ## 二、web 端页面职责 -### 工作台 `/tasks` +### 采购任务 `/tasks` -按**谁持球**分三条泳道,不按状态码平铺: +采用采购人员熟悉的传统表格,默认按创建时间倒序。固定列为:选择、标题、颜色、尺码、 +价格上限、数量、采购结果、状态、创建时间;不设置操作列。 -| 泳道 | 包含状态 | 含义 | -| --- | --- | --- | -| 等你决定 | `WAITING_CONFIRMATION`、`WAITING_PAYMENT`、`NEEDS_MANUAL`、`RECONCILIATION_REQUIRED` | 停在这里等人 | -| 机器在跑 | `PENDING`、`PENDING_RETRIAL`、`CLAIMED`、`RUNNING(TRIAL)`、`AUTHORIZED`、`ORDERING` | 不用操作 | -| 已结束 | `SUCCEEDED`、`FAILED`、`CANCELED` | 归档 | - -- 落地时**第一条待决策任务直接展开**,不是先看一张表。 -- 查询:关键词(标题 / 规格 / 任务编号)、泳道、时间范围。 -- 计数只随关键词和时间范围变化,不随泳道选择变化。 +- 标题链接在新标签打开拼多多商品页;标题下方任务编号链接打开内部任务详情。 +- “采购结果”由结构化字段在展示层格式化为“阶段:颜色 | 尺码 | 单价 | 数量”;未产生 + 试选或下单结果时显示 `—`,不得把试选写成已下单。 +- 双击行非控件区域,或聚焦行后按 Enter,打开 `/tasks/{id}` 的右侧详情抽屉。关闭抽屉、 + 按 Esc 或浏览器返回后,保留筛选、选择、滚动位置并把焦点还给原行。 +- 直接访问 `/tasks/{id}` 或在抽屉中选择“在完整页面打开”时,使用完整详情页;关键路由可 + 深链接,不能只有无法复制地址的弹层状态。 +- 第一工具行:导入(MVP 禁用占位并说明原因)、创建。创建打开模态表单;保存后任务以 + `DRAFT` 状态出现在第一行。`/tasks/new` 保留为同表单的直达兜底。 +- 第二工具行默认显示标题关键词、筛选、清除;状态和创建时间放在默认折叠的“更多条件”中, + 保留 F-004 查询范围而不挤占常用操作。勾选 `DRAFT` 后切换成上下文批量栏,显示已选数量、 + 开始试选、清除选择;全选只覆盖当前筛选结果中的 `DRAFT`。 +- “开始试选”把所选任务原子转为 `PENDING`,只进入第一趟试选队列;不签发授权、不创建 + 订单、不付款。其他状态复选框禁用并说明原因。 +- 窄屏允许表格容器内部横向滚动,但页面本身不得横向溢出;选择列与标题列保持可见。 ### 任务详情 `/tasks/{id}` @@ -72,8 +79,9 @@ ### 建单页 -`/tasks/new` 填:任务名称、拼多多链接、颜色分类、尺码、数量、价格上限。 -链接无法解析出 `goods_id` 时明确报错并保留已填内容。 +`/tasks` 的创建弹窗与 `/tasks/new` 直达页复用同一表单:任务名称、拼多多链接、颜色分类、 +尺码、数量、价格上限。链接无法解析出 `goods_id` 时明确报错并保留已填内容;保存成功后 +任务为 `DRAFT`,尚未进入设备领取队列。 ## 三、desk 端界面结构 @@ -102,7 +110,7 @@ ## 四、导航规则 -- web 端任务详情返回工作台时保留原筛选条件。 +- web 端从路由化详情抽屉返回工作台时不重新加载列表;完整详情页返回时保留原筛选条件。 - desk 端启动时若服务端有本设备的活跃任务,优先恢复该任务,不允许直接领取下一条。 - 第一趟试选完成后**必须退出商品页**再进入下一轮轮询,不停在规格面板等人。 - desk 端在真机步骤执行期间禁用硬取消和关闭窗口,避免留下无法判定的中间态。 @@ -115,8 +123,11 @@ | 组件 | 归属 | 说明 | | --- | --- | --- | | `AppShell` | web 全局 | 导航、登录态、CSRF 注入 | -| `TaskLanes` | 工作台 | 三泳道渲染与折叠 | -| `QueryBar` | 工作台 | 关键词、泳道、时间范围 | +| `TaskTable` | 采购任务 | 任务表格、创建时间倒序、选择状态与结构化采购结果格式化 | +| `QueryBar` | 采购任务 | 标题关键词、筛选与清除 | +| `BulkTrialBar` | 采购任务 | `DRAFT` 批量选择与开始第一趟试选 | +| `CreateTaskDialog` | 采购任务 / 建单直达页 | 复用手工建单表单与字段错误 | +| `TaskDetailDrawer` | 采购任务 | `/tasks/{id}` 路由驱动的右侧详情容器与焦点恢复 | | `SpecTrialCard` | 任务详情 | 试选确认卡(MVP 签名组件) | | `AuthorizePanel` | 任务详情 | 确认 / 退回 / 放弃授权 | | `PaymentCheckCard` | 任务详情 | 待付款核对与标记完成 | diff --git a/docs/tasks/T-005.md b/docs/tasks/T-005.md index f72ce92..1b0918c 100644 --- a/docs/tasks/T-005.md +++ b/docs/tasks/T-005.md @@ -11,6 +11,7 @@ needs_device: false needs_human_review: true write_paths: - docs/tasks/T-005.md + - docs/00-ai-start-here.md - docs/02-requirements.md - docs/04-architecture.md - docs/06-tasks.md @@ -54,7 +55,7 @@ web 端尚无生产代码。若直接实现 SSR 页面,登录、建单、三 ## 方案 -### 文件与页面 +### 第一轮文件与页面(已由第二轮修订替代) 1. `web-login.html`:登录、站内返回提示、默认 / 校验错误 / 提交中状态。 2. `web-task-create.html`:任务名称、商品链接、颜色分类、尺码、数量、价格上限;逐字段错误、 @@ -72,8 +73,9 @@ web 端尚无生产代码。若直接实现 SSR 页面,登录、建单、三 不设置操作列。标题打开拼多多商品假链接,任务编号打开内部详情。 3. 表格上方第一行放“导入”“创建”:导入为有原因说明的禁用占位;创建打开模态表单, 保存后生成 `DRAFT` 假任务并按创建时间倒序插到第一行。 -4. 第二行默认显示标题关键词、筛选、清除;勾选可开始的 `DRAFT` 后切换为上下文批量栏, - 统一执行“开始试选”。动作只模拟 `DRAFT → PENDING`,固定说明不会创建订单或付款。 +4. 第二行默认显示标题关键词、筛选、清除;状态和创建时间收进默认折叠的“更多条件”,不 + 放弃 F-004 查询范围。勾选可开始的 `DRAFT` 后切换为上下文批量栏,统一执行“开始试选”。 + 动作只模拟 `DRAFT → PENDING`,固定说明不会创建订单或付款。 5. 双击行的非控件区域,或聚焦行后按 Enter,打开右侧详情抽屉;复选框、标题外链、任务 编号链接不误触发行双击。原型用 `#/tasks/{id}` 演示生产路由 `/tasks/{id}`,关闭抽屉恢复 原筛选、选择和滚动现场;直接访问详情仍由完整页兜底。 @@ -106,7 +108,7 @@ web 端尚无生产代码。若直接实现 SSR 页面,登录、建单、三 - 四个 HTML 均可从本地直接打开,控制台无 error,除本地文档导航外无网络请求。 - 四页之间的主要入口可通过相对链接到达;所有演示按钮均为原型状态切换,不发送真实请求。 -- 建单字段、三泳道、试选确认、围栏前放弃、围栏后调和、待付款核对全部有可观察页面状态。 +- 建单字段、任务表格、试选确认、围栏前放弃、围栏后调和、待付款核对全部有可观察页面状态。 - 加载、空、错误、禁用与成功反馈均可演示;禁用动作旁有原因,失败旁有恢复路径。 - 键盘可完成全部演示;375 / 768 / 1024 / 1440 px 无内容截断或页面级水平滚动。 - 运行:`python scripts/validate_agent_context.py`、`git diff --check`,并用浏览器逐页检查 @@ -134,6 +136,53 @@ web 端尚无生产代码。若直接实现 SSR 页面,登录、建单、三 ## 执行记录 +### 2026-08-03 · 第二轮表格工作台实现 + +- 任务继续保持 `DOING`:本轮自动验证已完成,但 `needs_human_review: true`,仍需人工确认 + 表格信息密度、上下文批量栏、创建弹窗与详情抽屉。 +- 整页重做 `web-task-workbench.html`:传统表格固定九列且无操作列;标题为拼多多商品假链接, + 任务编号为内部详情链接;默认按创建时间倒序,采购结果由结构化假数据在展示层用 `|` + 格式化,并区分试选、已下单和结果待核查。 +- 第一工具行实现禁用的导入占位和创建按钮;创建弹窗覆盖必填、商品链接、金额字符串与数量 + 校验,失败保留输入,保存成功后生成 `DRAFT` 假任务、清除筛选并聚焦表格第一行。 +- 第二工具行默认是标题关键词、筛选、清除;状态和创建时间在“更多条件”中;勾选后切换成 + 上下文批量栏。只有 `DRAFT` 可选,全选只覆盖当前筛选结果,开始试选后模拟整批 + `DRAFT → PENDING`,固定提示不授权、不下单、不付款。 +- 双击行非控件区域、任务编号链接和聚焦行按 Enter 均打开右侧详情抽屉;原型地址同步为 + `#/tasks/{id}`,用来演示生产 `/tasks/{id}`。关闭按钮、Esc 和浏览器返回均关闭抽屉并把焦点 + 还给原行;直接带 hash 打开也能恢复抽屉,完整详情页继续作为兜底。 +- 同步 `00-ai-start-here.md`、需求、用户故事、交互清单、架构状态机、管理端 API、路线图、 + 路由、当前状态和原型约定。新增的 MVP 能力仅为批量开始第一趟试选;排序、暂停 / 继续、 + 运行中接管仍保留在 V2。`web-task-create.html` 的成功态同步为 `DRAFT`。 +- `ui-ux-pro-max` 影响了可见焦点、键盘等价操作、原生 `dialog` 焦点约束、路由深链接、 + 抽屉关闭后的焦点恢复和窄屏表格容器滚动。其自动生成的夸张字体、深色主题和横向旅程模式 + 不适合运营表格,继续沿用第一轮的 Segoe UI、蓝色主动作与低动效基线。 + +**已运行验证** + +- `& .\init.ps1`:按当前 Phase 0 基线运行;上下文校验通过,因 `web/`、`desk/` 尚未初始化 + 按设计返回退出码 3 并提示 T-001 / T-002,未误报可运行生产代码。 +- `python scripts/validate_agent_context.py`:通过(6 个任务路由,18 个有效仓库路径)。 +- Node 内联静态检查:4 个 `web-*.html` 均有 doctype、viewport、原型横幅、 + `prefers-reduced-motion`;id 无重复,内联脚本可编译,相对 HTML 链接存在,无外部脚本、 + 字体或图片资源;工作台必需字段齐全且没有“操作”表头。 +- Playwright 浏览器交互:标题筛选得到正确单行;创建表单空标题错误保留弹窗,修正保存后 + 新任务为第一行并获焦点;全选两条 `DRAFT` 后上下文栏显示 2 条,开始后均转待领取且安全 + 提示正确;双击和 Enter 均写入详情路由并打开抽屉,关闭和 Esc 清空路由并恢复原行焦点; + 直接访问 `#/tasks/{id}` 能打开相应抽屉及完整页链接。 +- Playwright 响应式回归:登录、建单、工作台、详情四页在 375 / 768 / 1024 / 1440 px + 共 16 个组合均无页面级水平溢出;工作台窄屏只在表格容器内横向滚动。浏览器累计 + 0 error / 0 warning,未发生外部资源请求。 +- `git diff --check`:通过。 + +**未验证与待人工确认** + +- 没有生产 Go / SSR / 数据库代码,因此未运行 `go test ./...` 或 `go vet ./...`;本轮也不 + 证明 `POST /tasks/start-trials` 的事务、CSRF 或幂等实现。 +- 原型只使用 `.invalid` 商品假链接,不访问真实拼多多;不证明真机字段、选择器或 App 版本。 +- 待人确认:九列表格的列宽与信息密度、采购结果阶段前缀、选择后替换筛选栏的方式、 + 720 px 创建弹窗、860 px 详情抽屉,以及 375 px 下表格横向滚动是否符合实际使用习惯。 + ### 2026-08-03 · 第二轮人工评审修订计划 - 人工评审已确认:工作台改为传统表格;创建改为列表内模态表单;去掉操作列;标题链接