SYB 商品页店铺筛选支持多选并保持单店铺查询兼容 #353

Open
opened 2026-09-30 10:28:31 +08:00 by ila · 0 comments
Owner

来源与当前事实(2026-09-30)

用户提出:SYB 商品页目前店铺只能选一个,希望能同时选择多个店铺。来源为本次对话的脱敏摘要;未授权实施或发布。

代码核对基线:main bf06b2d 及 #352 分支(#352 尚未合并)。web/src/views/goauto/syb-products/index.vue 当前以 el-autocomplete 保存单个 query.shopName,可选择或自由输入;listSybProducts 只发送一个 shopName。Server sybimport.List 对此参数做 shop_name LIKE %关键词%,与日期、订单号、解析状态、处理阶段及采购类型组合。店铺候选仅首次拉取 listSybShops(page=1,pageSize=200),超过 200 个时不完整;已停用店铺仍可出现在候选中。#74 确认了原单店铺名称包含查询语义。

Gitea MCP 本会话不可用,依仓库规则回退已配置 Gitea API 建单;无凭据输出。

目标与非目标

  • 目标:在 Admin → SYB 商品的「店铺」筛选中方便地勾选多个已有店铺,所选店铺之间 OR;与订单号、解析状态、处理阶段、采购类型、创建时间等其余条件 AND。查询结果、总数和分页一致,点查询时页码归 1,重置清空店铺选择。
  • 非目标:不改变 SYB 同步店铺白名单,不改商品归属或既有数据,不修改采购/退货动作,不增加数据库字段或迁移,不改 #352 来源创建时间的语义。

建议方案(待设计审核)

  1. Web 复用现有 Element Plus 风格,替换单值自动完成为可搜索、可清空的多选下拉;选多家时紧凑显示已选数量,弹层提供逐项勾选和清空,不让标签撑开第一行。停用店铺保留可选并标记,便于查历史商品;空选择表示不过滤。候选请求要覆盖分页或按关键字远程检索,不能只取前 200 家。加载中、无匹配候选、候选请求失败、已选店铺后来停用等状态均需可理解的反馈;键盘可操作。
  2. Server 新增 shopNames 多值查询参数(使用重复参数键/数组编码,不用逗号拼接店铺名称),去空、去重、限定合理数量与单项长度,使用参数化 shop_name IN (...) 精确匹配。保留原 shopName 的单关键词包含查询作为旧客户端兼容;新 Web 多选只发送 shopNames。两者同时提供时拒绝歧义或明确优先级,并写入共享 API 契约。
  3. 待用户审核的小交互取舍:现有输入框还能自由输入任意部分店铺名做模糊查询。建议新多选框以“输入文字过滤候选”为主,是否另保留独立「店铺关键词」模糊查询入口由轻量标注图确认;不能把“选中店铺”和“未选中时输入的搜索词”混成一个请求状态。
  4. Web 和 Server 均不主动改变 #352 的日期参数和实现。实施前基于最新 main 核对 #352 是否已合并;若同时改 sybimport/service.go,串行整合,不并行合并冲突。

设计证据与门禁

现有单行筛选栏与 Element Plus 多选组件为复用依据。实施前提交一张轻量标注截图/低保真图,涵盖未选、单选、多选折叠、搜索无结果、加载/失败、停用店铺及窄屏状态;记录审核链接/版本/确认人/时间/覆盖范围。用户确认交互与模糊查询保留方式后方可写生产代码。本单无新独立页面,不要求完整 QuantUX 原型。

验收与验证

  • 选 A、B 店铺返回两店明细,不返回 C;只选 A 与现有单店选择结果一致;空选择不加店铺限制。停用但有历史商品的店铺仍可查。
  • 多店铺与订单号、解析状态、处理阶段、采购类型、创建时间组合时,总数和每页数据一致;查询与重置正确清理选中行和页码。
  • 旧 shopName 模糊查询接口保持可用;多值非法/过量输入返回明确 422,不产生拼接 SQL;候选列表超过 200 条仍可找到后面的店铺。
  • 覆盖 Server 单元/接口测试、Web 最小组件/请求测试和页面交互检查;不触碰生产数据和数据库迁移。

交付单元、风险与文档

Web + Server + 共享 API 契约;无 Android/DB。无高风险数据操作,发布线上仍须单独授权。接口参数与店铺筛选业务规则属于长期事实:实施后先更新线上 Wiki,回读 revision,再按仓库流程同步镜像和检查;建单阶段不更新 Wiki。工单保持待设计确认,之后实施、验证、提交、推送并待验收。

## 来源与当前事实(2026-09-30) 用户提出:SYB 商品页目前店铺只能选一个,希望能同时选择多个店铺。来源为本次对话的脱敏摘要;未授权实施或发布。 代码核对基线:main `bf06b2d` 及 #352 分支(#352 尚未合并)。`web/src/views/goauto/syb-products/index.vue` 当前以 `el-autocomplete` 保存单个 `query.shopName`,可选择或自由输入;`listSybProducts` 只发送一个 `shopName`。Server `sybimport.List` 对此参数做 `shop_name LIKE %关键词%`,与日期、订单号、解析状态、处理阶段及采购类型组合。店铺候选仅首次拉取 `listSybShops(page=1,pageSize=200)`,超过 200 个时不完整;已停用店铺仍可出现在候选中。#74 确认了原单店铺名称包含查询语义。 Gitea MCP 本会话不可用,依仓库规则回退已配置 Gitea API 建单;无凭据输出。 ## 目标与非目标 - 目标:在 Admin → SYB 商品的「店铺」筛选中方便地勾选多个已有店铺,所选店铺之间 OR;与订单号、解析状态、处理阶段、采购类型、创建时间等其余条件 AND。查询结果、总数和分页一致,点查询时页码归 1,重置清空店铺选择。 - 非目标:不改变 SYB 同步店铺白名单,不改商品归属或既有数据,不修改采购/退货动作,不增加数据库字段或迁移,不改 #352 来源创建时间的语义。 ## 建议方案(待设计审核) 1. Web 复用现有 Element Plus 风格,替换单值自动完成为可搜索、可清空的多选下拉;选多家时紧凑显示已选数量,弹层提供逐项勾选和清空,不让标签撑开第一行。停用店铺保留可选并标记,便于查历史商品;空选择表示不过滤。候选请求要覆盖分页或按关键字远程检索,不能只取前 200 家。加载中、无匹配候选、候选请求失败、已选店铺后来停用等状态均需可理解的反馈;键盘可操作。 2. Server 新增 `shopNames` 多值查询参数(使用重复参数键/数组编码,不用逗号拼接店铺名称),去空、去重、限定合理数量与单项长度,使用参数化 `shop_name IN (...)` 精确匹配。保留原 `shopName` 的单关键词包含查询作为旧客户端兼容;新 Web 多选只发送 `shopNames`。两者同时提供时拒绝歧义或明确优先级,并写入共享 API 契约。 3. 待用户审核的小交互取舍:现有输入框还能自由输入任意部分店铺名做模糊查询。建议新多选框以“输入文字过滤候选”为主,是否另保留独立「店铺关键词」模糊查询入口由轻量标注图确认;不能把“选中店铺”和“未选中时输入的搜索词”混成一个请求状态。 4. Web 和 Server 均不主动改变 #352 的日期参数和实现。实施前基于最新 main 核对 #352 是否已合并;若同时改 `sybimport/service.go`,串行整合,不并行合并冲突。 ## 设计证据与门禁 现有单行筛选栏与 Element Plus 多选组件为复用依据。实施前提交一张轻量标注截图/低保真图,涵盖未选、单选、多选折叠、搜索无结果、加载/失败、停用店铺及窄屏状态;记录审核链接/版本/确认人/时间/覆盖范围。用户确认交互与模糊查询保留方式后方可写生产代码。本单无新独立页面,不要求完整 QuantUX 原型。 ## 验收与验证 - 选 A、B 店铺返回两店明细,不返回 C;只选 A 与现有单店选择结果一致;空选择不加店铺限制。停用但有历史商品的店铺仍可查。 - 多店铺与订单号、解析状态、处理阶段、采购类型、创建时间组合时,总数和每页数据一致;查询与重置正确清理选中行和页码。 - 旧 `shopName` 模糊查询接口保持可用;多值非法/过量输入返回明确 422,不产生拼接 SQL;候选列表超过 200 条仍可找到后面的店铺。 - 覆盖 Server 单元/接口测试、Web 最小组件/请求测试和页面交互检查;不触碰生产数据和数据库迁移。 ## 交付单元、风险与文档 Web + Server + 共享 API 契约;无 Android/DB。无高风险数据操作,发布线上仍须单独授权。接口参数与店铺筛选业务规则属于长期事实:实施后先更新线上 Wiki,回读 revision,再按仓库流程同步镜像和检查;建单阶段不更新 Wiki。工单保持待设计确认,之后实施、验证、提交、推送并待验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#353