Admin:采购价格区仅展示已选明细和映射规格 #113

Closed
opened 2026-08-10 17:45:00 +08:00 by ila · 7 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#96
  • 所属 MVP / 版本:#97
  • 阶段:阶段 1 补充——采购价格确认
  • 关联:#88、#90、#98、#112

要解决什么

#113 首次实现后,采购弹窗仍会显示未勾选货运单的商品、颜色、尺码和价格输入。复现步骤:

  1. 顺运宝页面存在两条以上已完成 PDD 规格映射、可创建采购任务的明细。
  2. 只勾选其中一条,点击“创建采购任务”。
  3. 弹窗中仍出现其他未勾选明细的规格和价格行。

已确认根因:模板给每个未选 .purchase-confirm-row 设置了 hidden,JavaScript 也会更新 row.hidden 并禁用输入;但 CSS 的 .purchase-confirm-row { display: grid; } 覆盖了隐藏表现,且现有 Go 模板测试没有验证浏览器最终样式,所以缺陷未在自动测试中发现。

本工单继续保证每条已选明细只展示当前 mapping_option_key 对应的唯一 PDD 组合及一个价格输入,不展示其他货运单、其他颜色或其他 SKU。

做什么 / 不做什么

做

  • 增加明确的 .purchase-confirm-row[hidden] { display: none; } 规则,确保未选行在浏览器中不可见。
  • JavaScript 每次打开弹窗时按业务主键重新计算已选行:
    • 已选行移除隐藏并启用本行 input;
    • 未选行保持隐藏且所有 input disabled;
    • 不沿用上一次打开弹窗的显示状态。
  • 每条已选确认行只显示:
    • 顺运宝订单号、商品标题和数量;
    • 顺运宝规格原文;
    • 当前映射的唯一 PDD 颜色/尺码组合(只读);
    • 一个与该映射价格对应的人民币价格上限输入。
  • 不把 PddChoices 全量传给采购价格确认区。
  • 服务端继续用 syb_id + mapping_option_key + context_version 重新校验映射,拒绝失效或串行数据。
  • 增加 CSS/模板回归测试,并执行真实浏览器人工验证。

不做

  • 不隐藏当前已选 SKU 必需的颜色和尺码;它们用于采购员核对最终购买规格。
  • 不展示其他货运单、未选颜色、未选尺码组合或全部 SKU 价格。
  • 不在价格弹窗重新提供规格选择器。
  • 不改变规格匹配算法、PDD 采集结构或价格采样规则。
  • 不改变 #112 的 Client 指派和 Admin 确认策略。
  • 不修改数据库结构,不自动付款,不连接 Android 真机。

已确认的实现方案

  1. 在 admin/static/css/app.css 为采购确认行补充属性选择器隐藏规则,优先级足以覆盖默认 grid 布局。
  2. 检查 setupPurchaseModal:每次打开都只根据当前按钮的 data-purchase-id 或当前勾选框生成选中集合,并同步 hidden 与所有 input 的 disabled。
  3. SybOrderView 继续只通过当前 mapping_option_key 查找唯一 PddOptionChoice,模板只渲染其格式化标签和一个价格输入。
  4. 服务端不依赖页面隐藏状态,继续重新读取最新映射并验证 mapping_option_key/context_version。
  5. 自动测试至少断言隐藏 CSS 规则、未选 input 初始 disabled、页面不渲染全量 PddChoices;浏览器手工验证单选、批量和重复打开三种场景。

预计修改文件:

  • admin/static/css/app.css
  • admin/static/js/app.js(若状态重置检查需要)
  • admin/templates/syb/list.html
  • Admin 页面/模板测试
  • 必要的 docs/admin/05-ui-specification.md

验收标准

  • 单选一条时,弹窗只显示这一条明细及一个价格输入。
  • 页面其他货运单、其他颜色和其他 SKU 不可见。
  • 当前已选 PDD 颜色和尺码仅作为一个只读映射结果展示。
  • 批量选择 N 条时恰好显示 N 条确认行,每条只有自己的映射规格和一个价格输入。
  • 关闭后改变勾选并再次打开,不残留上一次的确认行。
  • 未选行保持 hidden,其全部 input 保持 disabled 且不会随表单提交。
  • CSS 明确包含 .purchase-confirm-row[hidden] { display: none; } 或等效规则。
  • 默认价格来自当前 mapping_option_key 对应 choice。
  • 映射变化、价格失效或上下文版本变化时服务端拒绝旧弹窗。
  • 篡改隐藏字段不能切换到其他颜色或 SKU。
  • Go 1.23.0 专项和全量测试通过。
  • 浏览器人工验证通过;自动验证不连接 Android、不创建真实订单。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go vet ./...
go build ./...
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN

浏览器验证:

  1. 准备至少两条可采购明细,只勾选其中一条,弹窗只能看到这一条。
  2. 改勾另一条并重新打开,第一条不能残留。
  3. 批量选择两条,弹窗恰好显示两条,各自只有一个映射结果和一个价格输入。
  4. 修改映射后提交旧弹窗,服务端必须拒绝并提示刷新。
  5. 在浏览器开发者工具确认未选行计算样式为 display: none,其 input 为 disabled。

风险和回退

  • 风险:只修视觉隐藏但没有禁用 input,会误���交未选明细;只改 JavaScript 而不修 CSS,会再次被样式覆盖。
  • 控制:CSS 隐藏、JS 状态同步和服务端业务身份校验三层同时保留,并加入真实浏览器验收。
  • 回退:本修复不涉及数据库,可独立回退 CSS/模板/JS;已创建任务不修改。
## 基本信息 - 类型:缺陷 - 父级大工单:#96 - 所属 MVP / 版本:#97 - 阶段:阶段 1 补充——采购价格确认 - 关联:#88、#90、#98、#112 ## 要解决什么 #113 首次实现后,采购弹窗仍会显示未勾选货运单的商品、颜色、尺码和价格输入。复现步骤: 1. 顺运宝页面存在两条以上已完成 PDD 规格映射、可创建采购任务的明细。 2. 只勾选其中一条,点击“创建采购任务”。 3. 弹窗中仍出现其他未勾选明细的规格和价格行。 已确认根因:模板给每个未选 `.purchase-confirm-row` 设置了 `hidden`,JavaScript 也会更新 `row.hidden` 并禁用输入;但 CSS 的 `.purchase-confirm-row { display: grid; }` 覆盖了隐藏表现,且现有 Go 模板测试没有验证浏览器最终样式,所以缺陷未在自动测试中发现。 本工单继续保证每条已选明细只展示当前 `mapping_option_key` 对应的唯一 PDD 组合及一个价格输入,不展示其他货运单、其他颜色或其他 SKU。 ## 做什么 / 不做什么 ### 做 - 增加明确的 `.purchase-confirm-row[hidden] { display: none; }` 规则,确保未选行在浏览器中不可见。 - JavaScript 每次打开弹窗时按业务主键重新计算已选行: - 已选行移除隐藏并启用本行 input; - 未选行保持隐藏且所有 input disabled; - 不沿用上一次打开弹窗的显示状态。 - 每条已选确认行只显示: - 顺运宝订单号、商品标题和数量; - 顺运宝规格原文; - 当前映射的唯一 PDD 颜色/尺码组合(只读); - 一个与该映射价格对应的人民币价格上限输入。 - 不把 `PddChoices` 全量传给采购价格确认区。 - 服务端继续用 `syb_id + mapping_option_key + context_version` 重新校验映射,拒绝失效或串行数据。 - 增加 CSS/模板回归测试,并执行真实浏览器人工验证。 ### 不做 - 不隐藏当前已选 SKU 必需的颜色和尺码;它们用于采购员核对最终购买规格。 - 不展示其他货运单、未选颜色、未选尺码组合或全部 SKU 价格。 - 不在价格弹窗重新提供规格选择器。 - 不改变规格匹配算法、PDD 采集结构或价格采样规则。 - 不改变 #112 的 Client 指派和 Admin 确认策略。 - 不修改数据库结构,不自动付款,不连接 Android 真机。 ## 已确认的实现方案 1. 在 `admin/static/css/app.css` 为采购确认行补充属性选择器隐藏规则,优先级足以覆盖默认 grid 布局。 2. 检查 `setupPurchaseModal`:每次打开都只根据当前按钮的 `data-purchase-id` 或当前勾选框生成选中集合,并同步 `hidden` 与所有 input 的 `disabled`。 3. `SybOrderView` 继续只通过当前 `mapping_option_key` 查找唯一 `PddOptionChoice`,模板只渲染其格式化标签和一个价格输入。 4. 服务端不依赖页面隐藏状态,继续重新读取最新映射并验证 `mapping_option_key/context_version`。 5. 自动测试至少断言隐藏 CSS 规则、未选 input 初始 disabled、页面不渲染全量 `PddChoices`;浏览器手工验证单选、批量和重复打开三种场景。 预计修改文件: - `admin/static/css/app.css` - `admin/static/js/app.js`(若状态重置检查需要) - `admin/templates/syb/list.html` - Admin 页面/模板测试 - 必要的 `docs/admin/05-ui-specification.md` ## 验收标准 - [x] 单选一条时,弹窗只显示这一条明细及一个价格输入。 - [x] 页面其他货运单、其他颜色和其他 SKU 不可见。 - [x] 当前已选 PDD 颜色和尺码仅作为一个只读映射结果展示。 - [x] 批量选择 N 条时恰好显示 N 条确认行,每条只有自己的映射规格和一个价格输入。 - [x] 关闭后改变勾选并再次打开,不残留上一次的确认行。 - [x] 未选行保持 `hidden`,其全部 input 保持 `disabled` 且不会随表单提交。 - [x] CSS 明确包含 `.purchase-confirm-row[hidden] { display: none; }` 或等效规则。 - [x] 默认价格来自当前 `mapping_option_key` 对应 choice。 - [x] 映射变化、价格失效或上下文版本变化时服务端拒绝旧弹窗。 - [x] 篡改隐藏字段不能切换到其他颜色或 SKU。 - [x] Go 1.23.0 专项和全量测试通过。 - [x] 浏览器人工验证通过;自动验证不连接 Android、不创建真实订单。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go vet ./... go build ./... go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN ``` 浏览器验证: 1. 准备至少两条可采购明细,只勾选其中一条,弹窗只能看到这一条。 2. 改勾另一条并重新打开,第一条不能残留。 3. 批量选择两条,弹窗恰好显示两条,各自只有一个映射结果和一个价格输入。 4. 修改映射后提交旧弹窗,服务端必须拒绝并提示刷新。 5. 在浏览器开发者工具确认未选行计算样式为 `display: none`,其 input 为 disabled。 ## 风险和回退 - 风险:只修视觉隐藏但没有禁用 input,会误���交未选明细;只改 JavaScript 而不修 CSS,会再次被样式覆盖。 - 控制:CSS 隐藏、JS 状态同步和服务端业务身份校验三层同时保留,并加入真实浏览器验收。 - 回退:本修复不涉及数据库,可独立回退 CSS/模板/JS;已创建任务不修改。
Author
Owner

状态:待实施。本工单与 #112 分开交付:只处理价格确认区按当前 mapping_option_key 展示选定颜色和对应价格,不修改执行模式、规格映射算法或价格采集结构。本轮未修改代码、未提交 Git。

状态:**待实施**。本工单与 #112 分开交付:只处理价格确认区按当前 mapping_option_key 展示选定颜色和对应价格,不修改执行模式、规格映射算法或价格采集结构。本轮未修改代码、未提交 Git。
Author
Owner

开始实施 #113。范围只处理采购确认区按当前有效 mapping_option_key 展示选定的 PDD 颜色和对应价格;不修改映射算法、执行模式、采集价格结构或用户已有的 Client 改动。

开始实施 #113。范围只处理采购确认区按当前有效 mapping_option_key 展示选定的 PDD 颜色和对应价格;不修改映射算法、执行模式、采集价格结构或用户已有的 Client 改动。
Author
Owner

实现完成,状态:待用户验收。

  • 实现提交:66565d50ccfc3682860280613c6f70d2b3efde8b
  • 归档提交:5536592
  • 本地归档:docs/task/113-采购价格仅展示选定颜色.md
  • 验证:Go 1.23.0 下 go vet ./...、go build ./...、go test ./... -count=1 全部通过,git diff --check 通过
  • 实现结果:弹窗只显示当前映射的 PDD 规格及其价格输入;表单携带 mapping_option_key/context_version,映射变化时服务端拒绝旧弹窗创建
  • 未验证:未在浏览器人工操作弹窗,未连接 Android 真机,未创建真实未付款订单。
实现完成,状态:**待用户验收**。 - 实现提交:`66565d50ccfc3682860280613c6f70d2b3efde8b` - 归档提交:`5536592` - 本地归档:`docs/task/113-采购价格仅展示选定颜色.md` - 验证:Go 1.23.0 下 `go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过,`git diff --check` 通过 - 实现结果:弹窗只显示当前映射的 PDD 规格及其价格输入;表单携带 mapping_option_key/context_version,映射变化时服务端拒绝旧弹窗创建 - 未验证:未在浏览器人工操作弹窗,未连接 Android 真机,未创建真实未付款订单。
ila changed title from Admin:采购价格区仅展示已映射的选定颜色 to Admin:采购价格区仅展示已选明细和映射规格 2026-08-10 18:07:55 +08:00
Author
Owner

状态退回:待实施。复验确认首次实现未满足“未选中行隐藏”:.purchase-confirm-row { display: grid; } 覆盖了模板/JavaScript 设置的 hidden,导致其他货运单及规格价格行仍显示。工单已改为缺陷,要求补充 [hidden] { display: none; } 等效规则、保持未选 input disabled,并增加单选/批量/重复打开的浏览器人工验收。本轮仅更新工单,未修改代码。

状态退回:**待实施**。复验确认首次实现未满足“未选中行隐藏”:`.purchase-confirm-row { display: grid; }` 覆盖了模板/JavaScript 设置的 `hidden`,导致其他货运单及规格价格行仍显示。工单已改为缺陷,要求补充 `[hidden] { display: none; }` 等效规则、保持未选 input disabled,并增加单选/批量/重复打开的浏览器人工验收。本轮仅更新工单,未修改代码。
Author
Owner

开始按复验缺陷重新实施 #113:补齐未选采购确认行的强制隐藏样式,核对重复打开/批量选择时 hidden 与 disabled 同步,并增加 CSS/模板回归验证。不会连接 Android 或创建真实订单。

开始按复验缺陷重新实施 #113:补齐未选采购确认行的强制隐藏样式,核对重复打开/批量选择时 hidden 与 disabled 同步,并增加 CSS/模板回归验证。不会连接 Android 或创建真实订单。
Author
Owner

复验缺陷修复完成,状态:待用户验收。

  • 修复提交:1345803
  • 更新归档提交:3b659eb
  • 既有唯一映射规格实现:66565d5
  • 根因修复:增加 .purchase-confirm-row[hidden] { display: none; },防止 grid 覆盖 hidden;回归测试同时约束模板初始 disabled 和 JavaScript 每次打开同步 hidden/disabled
  • 验证:Go 1.23.0 下 go vet ./...、go build ./...、go test ./... -count=1 全部通过;Microsoft Edge headless 验证计算样式为 display:none
  • 未验证:未使用生产数据人工点击单选/批量/重复打开,未连接 Android,未创建真实订单。
复验缺陷修复完成,状态:**待用户验收**。 - 修复提交:`1345803` - 更新归档提交:`3b659eb` - 既有唯一映射规格实现:`66565d5` - 根因修复:增加 `.purchase-confirm-row[hidden] { display: none; }`,防止 grid 覆盖 hidden;回归测试同时约束模板初始 disabled 和 JavaScript 每次打开同步 hidden/disabled - 验证:Go 1.23.0 下 `go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过;Microsoft Edge headless 验证计算样式为 `display:none` - 未验证:未使用生产数据人工点击单选/批量/重复打开,未连接 Android,未创建真实订单。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:25:05 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#113