feat(yeeke): 退货包裹 Admin 只读模块页面与查询(菜单/列表/详情/同步记录) #337

Closed
opened 2026-09-23 11:52:37 +08:00 by ila · 12 comments
Owner

来源与原始需求摘要

2026-09-23,用户在本地验证 #336 后反馈:「admin页面没有yeeke的相关菜单」,并要求「要和 syb 商品一样,补全基本功能的模块页面和查询。建工单,做原型,我审核通过才能做工单」。

当前事实(main 02bddbf)

  • #336 已实现后端:GET /api/admin/v1/yeeke-returns/sync-runs、GET .../sync-runs/:runId、POST .../sync;权限模块 yeeke_returns("yeeke 退货同步",路径 /yeeke-returns,组件 /goauto/yeeke-returns/index,采购员默认可见)。
  • web/ 无任何改动,sys_menu 无菜单行,组件文件不存在 → Admin 无入口,采购员/管理员都看不到。
  • #336 未提供"退货包裹列表/明细"的查询接口,只有同步运行记录接口。

目标

补齐 yeeke 退货包裹的 Admin 只读模块,形态参照现有 SYB 商品页(web/src/views/goauto/syb-products/index.vue):列表 + 查询条件 + 详情 + 同步运行记录 + 手动同步;管理员与采购员均可见。

本单范围

  1. 服务端新增只读查询接口:退货包裹分页列表(可按订单号、退货物流单号、店铺、商品ID/规格ID、认领状态、创建时间范围过滤)与包裹详情(含包裹内商品明细)。沿用 #336 的表与唯一键,不改同步逻辑。
  2. Web 页面:web/src/views/goauto/yeeke-returns/index.vue 与路由;列表、查询、分页、详情抽屉、同步运行记录、手动同步按钮;空态、加载态、失败态。
  3. 菜单与权限:追加迁移写入 sys_menu,关联管理员与采购员角色(参照 #237 客户端密钥菜单迁移);不新增角色。
  4. 未知认领状态原样展示并高亮,不归类(延续 #336 规则)。

非目标

  • 不做退货与 SYB 商品匹配、不做人工绑定、不做"使用退货"、不做库存占用。
  • 不调用 yeeke 写接口,页面无二次销售/销毁/回写入口。
  • 不改 #336 的同步、调度、租约与凭据存储。
  • 不展示 yeeke 账号、token、Cookie、完整响应。
  • 不下载或另存退货图片,只显示 yeeke 提供的外部 URL。

设计证据(原型)

  • QuantUX 线上原型:http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c (App ID 6ab34c45191a826306a7ff1c,3 屏 64 控件,2026-09-23 创建)
  • 屏 1「退货包裹列表」:页头 + 同步状态条(最后成功时间/读取/新增/更新/跳过/失败/定时任务状态 + 手动同步 + 同步运行记录入口)+ 6 项查询条件 + 表格(订单号、退货物流单号、店铺、仓库/库位、商品数、认领状态、认领时间、创建时间、销毁截止、最近同步、详情)+ 分页;含未知状态高亮行、空态/失败态/权限说明。
  • 屏 2「包裹详情抽屉」:基本信息 + 包裹内商品明细(图片、商品ID、规格ID、标题/规格文本、退货数量),同包裹多商品多规格分行不合并。
  • 屏 3「同步运行记录」:运行ID、触发方式、状态、起止时间、页数、读取/新增/更新/跳过/失败、脱敏原因;含成功/失败/中断三种样例。
  • 状态:草稿,待用户审核确认。用户确认前不得编写生产代码。

验收

  1. 管理员与采购员登录后都能在菜单看到「yeeke 退货同步」并打开页面;其他角色看不到。
  2. 6 项查询条件单独与组合生效;分页正确;清空条件可重置。
  3. 详情展示同一包裹的多商品多规格,互不覆盖。
  4. 未知认领状态原样显示并高亮。
  5. 空态、加载态、失败态按原型展示;同步失败时仍显示上次有效数据。
  6. 手动同步与 #336 的定时同步共用租约,不并发;页面不展示凭据、token、完整响应。
  7. 服务端与 Web 相关测试通过;既有 SYB/采购页面无回归。

风险与文档

新增 Admin 页面、菜单迁移与权限关联,属数据库迁移与权限变更,实施前需人工确认。长期文档:更新架构与代码图、业务规则、以及 Admin 模块清单。

依赖

依赖 #336(已合并 main,未发布线上)。本单的包裹列表/详情接口为新增,不修改 #336 已有接口。

## 来源与原始需求摘要 2026-09-23,用户在本地验证 #336 后反馈:「admin页面没有yeeke的相关菜单」,并要求「要和 syb 商品一样,补全基本功能的模块页面和查询。建工单,做原型,我审核通过才能做工单」。 ## 当前事实(main 02bddbf) - #336 已实现后端:`GET /api/admin/v1/yeeke-returns/sync-runs`、`GET .../sync-runs/:runId`、`POST .../sync`;权限模块 `yeeke_returns`("yeeke 退货同步",路径 `/yeeke-returns`,组件 `/goauto/yeeke-returns/index`,采购员默认可见)。 - `web/` 无任何改动,`sys_menu` 无菜单行,组件文件不存在 → Admin 无入口,采购员/管理员都看不到。 - #336 未提供"退货包裹列表/明细"的查询接口,只有同步运行记录接口。 ## 目标 补齐 yeeke 退货包裹的 Admin 只读模块,形态参照现有 SYB 商品页(`web/src/views/goauto/syb-products/index.vue`):列表 + 查询条件 + 详情 + 同步运行记录 + 手动同步;管理员与采购员均可见。 ## 本单范围 1. **服务端新增只读查询接口**:退货包裹分页列表(可按订单号、退货物流单号、店铺、商品ID/规格ID、认领状态、创建时间范围过滤)与包裹详情(含包裹内商品明细)。沿用 #336 的表与唯一键,不改同步逻辑。 2. **Web 页面**:`web/src/views/goauto/yeeke-returns/index.vue` 与路由;列表、查询、分页、详情抽屉、同步运行记录、手动同步按钮;空态、加载态、失败态。 3. **菜单与权限**:追加迁移写入 `sys_menu`,关联管理员与采购员角色(参照 #237 客户端密钥菜单迁移);不新增角色。 4. 未知认领状态原样展示并高亮,不归类(延续 #336 规则)。 ## 非目标 - 不做退货与 SYB 商品匹配、不做人工绑定、不做"使用退货"、不做库存占用。 - 不调用 yeeke 写接口,页面无二次销售/销毁/回写入口。 - 不改 #336 的同步、调度、租约与凭据存储。 - 不展示 yeeke 账号、token、Cookie、完整响应。 - 不下载或另存退货图片,只显示 yeeke 提供的外部 URL。 ## 设计证据(原型) - QuantUX 线上原型:http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c (App ID `6ab34c45191a826306a7ff1c`,3 屏 64 控件,2026-09-23 创建) - 屏 1「退货包裹列表」:页头 + 同步状态条(最后成功时间/读取/新增/更新/跳过/失败/定时任务状态 + 手动同步 + 同步运行记录入口)+ 6 项查询条件 + 表格(订单号、退货物流单号、店铺、仓库/库位、商品数、认领状态、认领时间、创建时间、销毁截止、最近同步、详情)+ 分页;含未知状态高亮行、空态/失败态/权限说明。 - 屏 2「包裹详情抽屉」:基本信息 + 包裹内商品明细(图片、商品ID、规格ID、标题/规格文本、退货数量),同包裹多商品多规格分行不合并。 - 屏 3「同步运行记录」:运行ID、触发方式、状态、起止时间、页数、读取/新增/更新/跳过/失败、脱敏原因;含成功/失败/中断三种样例。 - **状态:草稿,待用户审核确认。用户确认前不得编写生产代码。** ## 验收 1. 管理员与采购员登录后都能在菜单看到「yeeke 退货同步」并打开页面;其他角色看不到。 2. 6 项查询条件单独与组合生效;分页正确;清空条件可重置。 3. 详情展示同一包裹的多商品多规格,互不覆盖。 4. 未知认领状态原样显示并高亮。 5. 空态、加载态、失败态按原型展示;同步失败时仍显示上次有效数据。 6. 手动同步与 #336 的定时同步共用租约,不并发;页面不展示凭据、token、完整响应。 7. 服务端与 Web 相关测试通过;既有 SYB/采购页面无回归。 ## 风险与文档 新增 Admin 页面、菜单迁移与权限关联,属数据库迁移与权限变更,实施前需人工确认。长期文档:更新架构与代码图、业务规则、以及 Admin 模块清单。 ## 依赖 依赖 #336(已合并 main,未发布线上)。本单的包裹列表/详情接口为新增,不修改 #336 已有接口。
Author
Owner

范围调整:拆成两个模块(2026-09-23,用户确认)

对齐现有 SYB 的做法(syb_products 与 syb_sync_runs 是两个并列模块,各有独立页面),yeeke 也拆为两个模块,不把同步记录塞进退货包裹页:

模块键 菜单标题 路径 页面 内容
yeeke_returns(#336 已有) yeeke 退货包裹 /yeeke-returns web/src/views/goauto/yeeke-returns/index.vue 包裹列表、6 项查询、分页、详情抽屉;顶部保留同步状态摘要与「手动同步」按钮
yeeke_sync_runs(本单新增) yeeke 同步记录 /yeeke-sync-runs web/src/views/goauto/yeeke-sync-runs/index.vue 同步运行记录列表,含触发方式/状态/开始时间三项查询与分页,并提供「手动同步」

两个模块都挂在「采集采购」菜单组,与 SYB 商品 / SYB 同步记录并列;管理员与采购员均默认可见。

由此产生的改动

  • server/app/goauto/access/modules.go:新增 ModuleYeekeSyncRuns,加入采购员默认模块列表。这是对 #336 已合并代码的补充,在本单内完成,不修改 #336 的提交。
  • 菜单迁移写入两条 sys_menu 记录并分别关联管理员与采购员角色。
  • GET /api/admin/v1/yeeke-returns/sync-runs 增加触发方式、状态、开始时间范围过滤与分页(#336 已有接口的向后兼容扩展)。

原型已同步更新(同一 App,草稿待审核)

http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c

  • 屏 1「退货包裹列表」:同步状态摘要注明"详细记录见菜单「yeeke 同步记录」",按钮改为「查看同步记录」(跳转独立模块)。
  • 屏 3 改为「yeeke 同步记录(独立模块)」:新增查询区(触发方式 / 状态 / 开始时间)、「手动同步」按钮与分页,保留成功/失败/中断三种样例与脱敏说明。
  • 屏 2「包裹详情抽屉」不变。
## 范围调整:拆成两个模块(2026-09-23,用户确认) 对齐现有 SYB 的做法(`syb_products` 与 `syb_sync_runs` 是两个并列模块,各有独立页面),yeeke 也拆为两个模块,不把同步记录塞进退货包裹页: | 模块键 | 菜单标题 | 路径 | 页面 | 内容 | |---|---|---|---|---| | `yeeke_returns`(#336 已有) | yeeke 退货包裹 | `/yeeke-returns` | `web/src/views/goauto/yeeke-returns/index.vue` | 包裹列表、6 项查询、分页、详情抽屉;顶部保留同步状态摘要与「手动同步」按钮 | | `yeeke_sync_runs`(本单新增) | yeeke 同步记录 | `/yeeke-sync-runs` | `web/src/views/goauto/yeeke-sync-runs/index.vue` | 同步运行记录列表,含触发方式/状态/开始时间三项查询与分页,并提供「手动同步」 | 两个模块都挂在「采集采购」菜单组,与 SYB 商品 / SYB 同步记录并列;管理员与采购员均默认可见。 ### 由此产生的改动 - `server/app/goauto/access/modules.go`:新增 `ModuleYeekeSyncRuns`,加入采购员默认模块列表。这是对 #336 已合并代码的补充,在本单内完成,不修改 #336 的提交。 - 菜单迁移写入两条 `sys_menu` 记录并分别关联管理员与采购员角色。 - `GET /api/admin/v1/yeeke-returns/sync-runs` 增加触发方式、状态、开始时间范围过滤与分页(#336 已有接口的向后兼容扩展)。 ### 原型已同步更新(同一 App,草稿待审核) http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c - 屏 1「退货包裹列表」:同步状态摘要注明"详细记录见菜单「yeeke 同步记录」",按钮改为「查看同步记录」(跳转独立模块)。 - 屏 3 改为「yeeke 同步记录(独立模块)」:新增查询区(触发方式 / 状态 / 开始时间)、「手动同步」按钮与分页,保留成功/失败/中断三种样例与脱敏说明。 - 屏 2「包裹详情抽屉」不变。
Author
Owner

原型审核通过(2026-09-23)

用户于 2026-09-23 审核并确认通过。

  • 原型链接:http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c
  • App ID:6ab34c45191a826306a7ff1c;工具:QuantUX(MCP)
  • 覆盖范围:屏1「退货包裹列表」(同步状态摘要、手动同步、6 项查询、表格、未知状态高亮、分页、空态/失败态/权限说明);屏2「包裹详情抽屉」(基本信息 + 多商品多规格明细);屏3「yeeke 同步记录(独立模块)」(3 项查询、运行记录表、手动同步、分页、脱敏说明);4 条跳转线。
  • 确认人:用户;确认时间:2026-09-23;状态:已确认(由草稿转为已确认版本)。
  • 审核过程中修复:屏2/屏3 控件坐标未按画布绝对坐标偏移,导致点击跳转后为空白;已整体偏移修正并由用户复核通过。

按仓库规则,本单可进入实施:实施范围以工单正文 + 「范围调整:拆成两个模块」评论 + 本确认为准。页面结构、流程、状态或验收变化时须重新确认原型。

## 原型审核通过(2026-09-23) 用户于 2026-09-23 审核并确认通过。 - 原型链接:http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c - App ID:`6ab34c45191a826306a7ff1c`;工具:QuantUX(MCP) - 覆盖范围:屏1「退货包裹列表」(同步状态摘要、手动同步、6 项查询、表格、未知状态高亮、分页、空态/失败态/权限说明);屏2「包裹详情抽屉」(基本信息 + 多商品多规格明细);屏3「yeeke 同步记录(独立模块)」(3 项查询、运行记录表、手动同步、分页、脱敏说明);4 条跳转线。 - 确认人:用户;确认时间:2026-09-23;状态:**已确认**(由草稿转为已确认版本)。 - 审核过程中修复:屏2/屏3 控件坐标未按画布绝对坐标偏移,导致点击跳转后为空白;已整体偏移修正并由用户复核通过。 按仓库规则,本单可进入实施:实施范围以工单正文 + 「范围调整:拆成两个模块」评论 + 本确认为准。页面结构、流程、状态或验收变化时须重新确认原型。
Author
Owner

用户审核后的页面精简(2026-09-23)

用户在本地验证 #337 后要求:

  1. 去掉「yeeke 退货包裹」页和「yeeke 同步记录」页顶部的模块名和模块描述;
  2. 去掉退货包裹页的「手动同步」和「查看同步记录」按钮(手动同步只保留在同步记录页);
  3. 同步记录页的「手动同步」移到「重置」右边,并靠右对齐;
  4. 去掉退货包裹页的「商品ID/规格ID」与「退货物流单号」两个筛选条件(表格中的退货物流单号列、详情中的商品ID/规格ID列保留)。

实现

提交 3bc4784(分支 feat/337-yeeke-admin-ui):只改 web/src/views/goauto/yeeke-returns/index.vue 与 yeeke-sync-runs/index.vue,同步清理了不再使用的方法、数据字段和 import。服务端接口不变(被去掉的筛选参数仍兼容,只是页面不再传)。pnpm run build:prod 通过。本地 9527 开发服务已热更新。

原型同步更新(同一 App)

http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c

  • 屏1:删除页头、描述、手动同步、查看同步记录、退货物流单号与商品ID/规格ID筛选;剩余筛选(订单号、店铺、认领状态、创建时间)与查询/重置左移;删除跳转线 l2。
  • 屏3:删除页头、描述、「去退货包裹页」按钮与跳转线 l4;「手动同步」移到查询行最右侧。
  • 屏2 不变。

此次为用户直接提出的精简,页面结构随之变化,原型已同步为当前实现,请用户在本地确认后视为该版本已确认。

## 用户审核后的页面精简(2026-09-23) 用户在本地验证 #337 后要求: 1. 去掉「yeeke 退货包裹」页和「yeeke 同步记录」页顶部的模块名和模块描述; 2. 去掉退货包裹页的「手动同步」和「查看同步记录」按钮(手动同步只保留在同步记录页); 3. 同步记录页的「手动同步」移到「重置」右边,并靠右对齐; 4. 去掉退货包裹页的「商品ID/规格ID」与「退货物流单号」两个筛选条件(表格中的退货物流单号列、详情中的商品ID/规格ID列保留)。 ### 实现 提交 `3bc4784`(分支 `feat/337-yeeke-admin-ui`):只改 `web/src/views/goauto/yeeke-returns/index.vue` 与 `yeeke-sync-runs/index.vue`,同步清理了不再使用的方法、数据字段和 import。服务端接口不变(被去掉的筛选参数仍兼容,只是页面不再传)。`pnpm run build:prod` 通过。本地 9527 开发服务已热更新。 ### 原型同步更新(同一 App) http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c - 屏1:删除页头、描述、手动同步、查看同步记录、退货物流单号与商品ID/规格ID筛选;剩余筛选(订单号、店铺、认领状态、创建时间)与查询/重置左移;删除跳转线 l2。 - 屏3:删除页头、描述、「去退货包裹页」按钮与跳转线 l4;「手动同步」移到查询行最右侧。 - 屏2 不变。 此次为用户直接提出的精简,页面结构随之变化,原型已同步为当前实现,请用户在本地确认后视为该版本已确认。
Author
Owner

范围调整:退货列表按商品一行、参考图列、店铺下拉(2026-09-23,用户确认)

背景

本地首次成功同步:1287 个包裹、2131 个商品、0 失败。

用户决定

  1. 按商品拆分:列表每个退货商品一行(参照 SYB 商品页),同一包裹的多个商品/规格各占一行,包裹字段重复显示。包裹没有商品明细时仍显示一行并标注"无商品明细",避免漏看。数据层不变(#336 已分包裹表与商品表),无迁移。
  2. 去掉「退货物流单号」列(与订单号相同数据),原位置改为商品参考图(yeeke 外部 URL,不下载不另存)。
  3. 店铺筛选改下拉框,用户选择方案 1:选项来自已同步的 yeeke 店铺(按实际数据去重生成),筛选按 yeeke 店铺名精确匹配。

未采用的方案与原因(数据证据)

用店铺管理(SYB 店铺)做选项时,本地 14 个 yeeke 店铺按现有归一化规则只能对上一部分:完全一致 73 包裹、去空格后一致 384、名字包含 473、对不上 357(约 28%,5 个店铺);且"包含"规则会把 yeeke 的两个 PAPA 店铺归到同一个 SYB 店铺,有误判风险。故暂不采用。后续做退货与 SYB 商品匹配时,再评估在店铺管理中维护 yeeke 店铺对应关系。

实施要点

  • 服务端:退货列表接口改为按商品分页(含无明细包裹的占位行),返回包裹字段 + 商品字段;新增只读接口返回已同步 yeeke 店铺去重列表。
  • Web:表格列调整(订单号、商品参考图、商品标题/规格、商品ID/规格ID、数量、店铺、仓库/库位、认领状态、认领时间、销毁截止、最近同步、详情),店铺改 el-select;详情抽屉不变。

原型已更新(同一 App,屏1)

http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c
屏1 改名为「退货商品列表(每商品一行)」:表头与样例行改为按商品展示、参考图列、无明细占位行、店铺下拉、分页显示"共 2131 条商品"。待用户确认后实施。

## 范围调整:退货列表按商品一行、参考图列、店铺下拉(2026-09-23,用户确认) ### 背景 本地首次成功同步:1287 个包裹、2131 个商品、0 失败。 ### 用户决定 1. **按商品拆分**:列表每个退货商品一行(参照 SYB 商品页),同一包裹的多个商品/规格各占一行,包裹字段重复显示。包裹没有商品明细时仍显示一行并标注"无商品明细",避免漏看。数据层不变(#336 已分包裹表与商品表),无迁移。 2. **去掉「退货物流单号」列**(与订单号相同数据),原位置改为**商品参考图**(yeeke 外部 URL,不下载不另存)。 3. **店铺筛选改下拉框**,用户选择方案 1:**选项来自已同步的 yeeke 店铺**(按实际数据去重生成),筛选按 yeeke 店铺名精确匹配。 ### 未采用的方案与原因(数据证据) 用店铺管理(SYB 店铺)做选项时,本地 14 个 yeeke 店铺按现有归一化规则只能对上一部分:完全一致 73 包裹、去空格后一致 384、名字包含 473、**对不上 357(约 28%,5 个店铺)**;且"包含"规则会把 yeeke 的两个 PAPA 店铺归到同一个 SYB 店铺,有误判风险。故暂不采用。后续做退货与 SYB 商品匹配时,再评估在店铺管理中维护 yeeke 店铺对应关系。 ### 实施要点 - 服务端:退货列表接口改为按商品分页(含无明细包裹的占位行),返回包裹字段 + 商品字段;新增只读接口返回已同步 yeeke 店铺去重列表。 - Web:表格列调整(订单号、商品参考图、商品标题/规格、商品ID/规格ID、数量、店铺、仓库/库位、认领状态、认领时间、销毁截止、最近同步、详情),店铺改 el-select;详情抽屉不变。 ### 原型已更新(同一 App,屏1) http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c 屏1 改名为「退货商品列表(每商品一行)」:表头与样例行改为按商品展示、参考图列、无明细占位行、店铺下拉、分页显示"共 2131 条商品"。待用户确认后实施。
Author
Owner

详情改为「退货商品详情」(2026-09-23,用户选择方案 1)

列表按商品一行后,「详情」不再打开包裹详情,改为以当前商品为主的详情抽屉:

  1. 顶部:当前商品(参考图可看大图、完整标题与规格、商品ID、规格ID、退货数量);
  2. 中部:所属退货包裹信息(订单号、店铺、仓库/库位、认领状态、认领时间、销毁截止、创建/更新时间、最近同步);
  3. 底部:同包裹其他商品(不含当前商品)列表。
    无商品明细的包裹行:顶部显示「该包裹无商品明细」,其余照常。仍为只读,无任何写操作入口。

原型屏2 已改名为「退货商品详情抽屉」并同步更新(同一 App)。待用户确认原型后实施。

## 详情改为「退货商品详情」(2026-09-23,用户选择方案 1) 列表按商品一行后,「详情」不再打开包裹详情,改为**以当前商品为主**的详情抽屉: 1. 顶部:当前商品(参考图可看大图、完整标题与规格、商品ID、规格ID、退货数量); 2. 中部:所属退货包裹信息(订单号、店铺、仓库/库位、认领状态、认领时间、销毁截止、创建/更新时间、最近同步); 3. 底部:**同包裹其他商品**(不含当前商品)列表。 无商品明细的包裹行:顶部显示「该包裹无商品明细」,其余照常。仍为只读,无任何写操作入口。 原型屏2 已改名为「退货商品详情抽屉」并同步更新(同一 App)。待用户确认原型后实施。
Author
Owner

原型(第二版)审核通过(2026-09-23)

用户确认通过:屏1「退货商品列表(每商品一行)」(参考图列替代退货物流单号列、店铺下拉选项来自已同步 yeeke 店铺、无明细包裹占位行)、屏2「退货商品详情抽屉」(当前商品为主 + 所属包裹 + 同包裹其他商品)、屏3 不变。
原型:http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c ,App ID 6ab34c45191a826306a7ff1c;确认人:用户;确认时间:2026-09-23。

另:用户要求去掉「yeeke 同步记录」页底部说明文字并让页面撑满高度,已在提交 ac5d833 完成(表格填满剩余高度、分页贴底)。

## 原型(第二版)审核通过(2026-09-23) 用户确认通过:屏1「退货商品列表(每商品一行)」(参考图列替代退货物流单号列、店铺下拉选项来自已同步 yeeke 店铺、无明细包裹占位行)、屏2「退货商品详情抽屉」(当前商品为主 + 所属包裹 + 同包裹其他商品)、屏3 不变。 原型:http://192.168.0.224:8082/#/apps/6ab34c45191a826306a7ff1c ,App ID `6ab34c45191a826306a7ff1c`;确认人:用户;确认时间:2026-09-23。 另:用户要求去掉「yeeke 同步记录」页底部说明文字并让页面撑满高度,已在提交 `ac5d833` 完成(表格填满剩余高度、分页贴底)。
Author
Owner

实施回写(2026-09-24)

分支:feat/337-yeeke-admin-ui(基于 main 02bddbf),12 个提交,已推送 origin。未合并 main,未部署线上。

18 个文件,+1962/-74 行:server/app/goauto/yeeke/{list,handler,router,sync}.go(+对应测试)、yeekeclient/client.go(+测试)、access/{modules,purchaser}.go、迁移 1789800600000_yeeke_admin_menu.go、web/src/views/goauto/yeeke-returns/index.vue、web/src/views/goauto/yeeke-sync-runs/index.vue、web/src/api/goauto/yeeke-returns.js。

实现内容

  1. 只读接口:包裹/商品列表按商品分页(一行一个商品,无商品明细的包裹以占位行呈现);GET /yeeke-returns/shops 返回已同步的 yeeke 店铺去重列表;GET /yeeke-returns/items/:itemId 返回商品+所属包裹+同包裹其他商品;GET /yeeke-returns/:packageId 保留供占位行抽屉使用;同步记录接口补充触发方式/状态/时间过滤与分页。静态路由 /shops、/items/:itemId 注册在 /:packageId 之前,附路由不冲突测试。
  2. 菜单:迁移写入「yeeke 退货包裹」「yeeke 同步记录」两个 sys_menu,关联 admin 与 purchaser 角色,挂在采集采购组,参照 #237 客户端密钥菜单先例。
  3. 页面(均按原型两轮确认稿实施,原型见评论 8497/8503/后续):
    • 退货商品列表:订单号、商品参考图、商品标题、蝦皮id/sku_id、数量、店铺(下拉,选项来自已同步 yeeke 店铺)、规格数据、认领状态("1"→已认领,未识别值原样标红"其他:X")、上架时间、销毁截止、最近同步、详情;去掉商品数与退货物流单号列。
    • 详情抽屉:以当前商品为主(大图/标题/规格/蝦皮id/sku_id/数量)+ 所属包裹信息 + 同包裹其他商品(不含当前)。
    • 同步记录:独立模块,触发方式/状态/开始时间过滤,手动同步按钮靠右对齐,去除说明文字,页面撑满高度。
  4. yeeke 对接缺陷修复(本地真实同步验证发现并修复,均补充回归测试):验证码字段名(key 非 checkKey)、浏览器 UA 与 _t 参数、登录失败原因分类(仅验证码错误重试,其他原因立即停止)、会话检查改用真实存在的 /shopee/user/info 接口 + X-Access-Token 请求头(原 /sys/userInfo 不存在,回报 HTTP 500)、列表请求体字段对齐 web 客户端、退货数量字段容错解析字符串/数字/空值、时间按北京时间解析(原按 UTC 解析导致偏差 8 小时)、写入本地库改为一次性写入完整字段 + 事务(原先插入空占位行触发 MySQL 严格模式拒绝零日期,导致全部记录写入失败)。

验证

  • gofmt -l:涉及目录全部干净。
  • go build ./...、go vet ./app/goauto/...:通过。
  • go test -count=1 ./app/goauto/yeeke/... ./app/goauto/yeekeclient/... ./app/goauto/access/...:全部通过。
  • go test -count=1 ./app/goauto/sybimport/...:12 个既有失败,与干净 main 一致(此前多次核对),与本单无关,未修复。
  • pnpm run build:prod:通过,仅既有的 chunk 体积告警。
  • 本地真实同步验证(非模拟):登录(验证码 OCR)→ 会话检查 → 分页拉取成功,1287 个包裹、2131 个商品、0 条写入失败;已用真实数据核对列表分页、店铺下拉(14 个)、认领状态显示、详情抽屉同包裹商品分组均符合预期。

未做 / 遗留

  • 未合并 main、未部署线上;线上执行迁移前需人工确认(新增两条菜单数据,不改动历史表结构外的表)。
  • yeeke 账号凭据目前只在本地 config.yaml 配置用于验证;线上改用环境变量 GOAUTO_YEEKE_USERNAME/GOAUTO_YEEKE_PASSWORD(与 SYB 一致),尚未配置。
  • Wiki(架构/代码图、业务规则、Admin 模块清单)未更新。
  • 店铺筛选选项来自已同步 yeeke 店铺(原始名称),未与 SYB 店铺管理建立对应关系;用户已确认此方案,原因见评论(28% 无法精确匹配、存在误判风险),后续做退货与 SYB 商品匹配时再评估。
  • 认领状态列/筛选目前仅确认 "1"=已认领;未知值原样展示并标记,不静默归类。
  • 定时任务(GoAutoYeekeReturnSync)随迁移写入但默认关闭,需管理员手动启用;本单未提供启停入口。

状态:待验收。待用户确认合并、部署时机与迁移授权。

## 实施回写(2026-09-24) **分支**:`feat/337-yeeke-admin-ui`(基于 main `02bddbf`),12 个提交,已推送 origin。**未合并 main,未部署线上。** 18 个文件,+1962/-74 行:`server/app/goauto/yeeke/{list,handler,router,sync}.go`(+对应测试)、`yeekeclient/client.go`(+测试)、`access/{modules,purchaser}.go`、迁移 `1789800600000_yeeke_admin_menu.go`、`web/src/views/goauto/yeeke-returns/index.vue`、`web/src/views/goauto/yeeke-sync-runs/index.vue`、`web/src/api/goauto/yeeke-returns.js`。 ### 实现内容 1. **只读接口**:包裹/商品列表按**商品分页**(一行一个商品,无商品明细的包裹以占位行呈现);`GET /yeeke-returns/shops` 返回已同步的 yeeke 店铺去重列表;`GET /yeeke-returns/items/:itemId` 返回商品+所属包裹+同包裹其他商品;`GET /yeeke-returns/:packageId` 保留供占位行抽屉使用;同步记录接口补充触发方式/状态/时间过滤与分页。静态路由 `/shops`、`/items/:itemId` 注册在 `/:packageId` 之前,附路由不冲突测试。 2. **菜单**:迁移写入「yeeke 退货包裹」「yeeke 同步记录」两个 `sys_menu`,关联 admin 与 purchaser 角色,挂在采集采购组,参照 #237 客户端密钥菜单先例。 3. **页面**(均按原型两轮确认稿实施,原型见评论 8497/8503/后续): - 退货商品列表:订单号、商品参考图、商品标题、蝦皮id/sku_id、数量、店铺(下拉,选项来自已同步 yeeke 店铺)、规格数据、认领状态("1"→已认领,未识别值原样标红"其他:X")、上架时间、销毁截止、最近同步、详情;去掉商品数与退货物流单号列。 - 详情抽屉:以当前商品为主(大图/标题/规格/蝦皮id/sku_id/数量)+ 所属包裹信息 + 同包裹其他商品(不含当前)。 - 同步记录:独立模块,触发方式/状态/开始时间过滤,手动同步按钮靠右对齐,去除说明文字,页面撑满高度。 4. **yeeke 对接缺陷修复**(本地真实同步验证发现并修复,均补充回归测试):验证码字段名(`key` 非 `checkKey`)、浏览器 UA 与 `_t` 参数、登录失败原因分类(仅验证码错误重试,其他原因立即停止)、会话检查改用真实存在的 `/shopee/user/info` 接口 + `X-Access-Token` 请求头(原 `/sys/userInfo` 不存在,回报 HTTP 500)、列表请求体字段对齐 web 客户端、退货数量字段容错解析字符串/数字/空值、时间按北京时间解析(原按 UTC 解析导致偏差 8 小时)、写入本地库改为一次性写入完整字段 + 事务(原先插入空占位行触发 MySQL 严格模式拒绝零日期,导致全部记录写入失败)。 ### 验证 - `gofmt -l`:涉及目录全部干净。 - `go build ./...`、`go vet ./app/goauto/...`:通过。 - `go test -count=1 ./app/goauto/yeeke/... ./app/goauto/yeekeclient/... ./app/goauto/access/...`:全部通过。 - `go test -count=1 ./app/goauto/sybimport/...`:12 个既有失败,与干净 main 一致(此前多次核对),与本单无关,未修复。 - `pnpm run build:prod`:通过,仅既有的 chunk 体积告警。 - **本地真实同步验证**(非模拟):登录(验证码 OCR)→ 会话检查 → 分页拉取成功,1287 个包裹、2131 个商品、0 条写入失败;已用真实数据核对列表分页、店铺下拉(14 个)、认领状态显示、详情抽屉同包裹商品分组均符合预期。 ### 未做 / 遗留 - **未合并 main、未部署线上**;线上执行迁移前需人工确认(新增两条菜单数据,不改动历史表结构外的表)。 - yeeke 账号凭据目前只在本地 `config.yaml` 配置用于验证;线上改用环境变量 `GOAUTO_YEEKE_USERNAME`/`GOAUTO_YEEKE_PASSWORD`(与 SYB 一致),尚未配置。 - Wiki(架构/代码图、业务规则、Admin 模块清单)未更新。 - 店铺筛选选项来自已同步 yeeke 店铺(原始名称),未与 SYB 店铺管理建立对应关系;用户已确认此方案,原因见评论(28% 无法精确匹配、存在误判风险),后续做退货与 SYB 商品匹配时再评估。 - 认领状态列/筛选目前仅确认 `"1"=已认领`;未知值原样展示并标记,不静默归类。 - 定时任务(`GoAutoYeekeReturnSync`)随迁移写入但**默认关闭**,需管理员手动启用;本单未提供启停入口。 状态:**待验收**。待用户确认合并、部署时机与迁移授权。
Author
Owner

验收(2026-09-24)

用户确认:「#337验收通过合并到main」。

  • 合并:feat/337-yeeke-admin-ui 快进合并到 main(02bddbf..d0b8609),未新增合并提交;验证沿用实施回写中同一提交 d0b8609 的结果。
  • 未部署线上:线上迁移(两条菜单)与 GOAUTO_YEEKE_USERNAME/GOAUTO_YEEKE_PASSWORD 环境变量配置仍需另行授权。
  • 遗留:Wiki(架构/代码图、业务规则、Admin 模块清单)尚未更新,需补一轮 Wiki 同步。

状态:验收通过,关闭。

## 验收(2026-09-24) 用户确认:「#337验收通过合并到main」。 - 合并:`feat/337-yeeke-admin-ui` 快进合并到 `main`(`02bddbf..d0b8609`),未新增合并提交;验证沿用实施回写中同一提交 `d0b8609` 的结果。 - **未部署线上**:线上迁移(两条菜单)与 `GOAUTO_YEEKE_USERNAME`/`GOAUTO_YEEKE_PASSWORD` 环境变量配置仍需另行授权。 - **遗留**:Wiki(架构/代码图、业务规则、Admin 模块清单)尚未更新,需补一轮 Wiki 同步。 状态:验收通过,关闭。
ila closed this issue 2026-09-24 11:36:35 +08:00
Author
Owner

Wiki 遗留处理:用户 2026-09-24 决定并入 #338 的 Wiki 同步轮次一起更新,完成后在此补记页面与 revision。

Wiki 遗留处理:用户 2026-09-24 决定并入 #338 的 Wiki 同步轮次一起更新,完成后在此补记页面与 revision。
Author
Owner

线上部署(2026-09-27,用户授权:「把admin关于退货的更新代码部署到线上服务器」,范围选「只部署 main (#336/#337)」)

  • 版本:main d0b8609(含 #336 yeeke 退货同步、#337 退货 Admin 页面;#334/#335 仅 Android 与测试,服务端无行为变化)。linux/amd64,SHA-256 46332f282beb709a4818a762ec8a433b2d87d1fb0363a40cee48ee0c0ecee444;Web dist 由同一提交 pnpm run build:prod 构建。
  • 发布目录:/home/goauto/releases/20260927-d0b8609-336-337(config 复制自 20260922-3bf428a-331-333,static/var 链接不变),current 原子切换,goauto.service 重启后 active;健康检查、首页 200;日志无 panic/fatal/1146/1054。切换前采购/采集运行中任务为 0。
  • 配置:发布目录 config/settings.yml 补 extend.yeeke 段(baseurl/pagesize/maxpages/retry/ocrurl/ocrmaxattempts,与仓库一致)。
  • 凭据:按用户要求把本地 yeeke 账号写入线上 /etc/goauto/goauto.env(GOAUTO_YEEKE_USERNAME/GOAUTO_YEEKE_PASSWORD);经 SSH 标准输入传递,未出现在命令行、输出、日志或本工单;写前备份为 goauto.env.bak-20260927084727,权限保持 600 root:goauto。
  • 线上迁移(新执行 3 个:1789800400000 / 500000 / 600000):新建 yeeke_session、yeeke_return_package、yeeke_return_item、yeeke_sync_run;写入定时任务「yeeke 退货包裹同步」(job_id 6,status=2 关闭);新增菜单「yeeke 退货包裹」「yeeke 同步记录」并关联 admin、purchaser。
  • 接口:/api/admin/v1/yeeke-returns、/shops、/sync-runs 已挂载(未登录返回 401 JSON)。
  • 未验证:线上 yeeke 登录与真实同步(需在线上后台「yeeke 同步记录」点击手动同步);定时任务仍关闭,需管理员决定是否开启。
  • 回滚:current 切回 20260922-3bf428a-331-333 并重启;新增表与菜单不影响旧版本。
  • 线上系统盘使用 92%(剩 4.5G)。
## 线上部署(2026-09-27,用户授权:「把admin关于退货的更新代码部署到线上服务器」,范围选「只部署 main (#336/#337)」) - **版本**:main `d0b8609`(含 #336 yeeke 退货同步、#337 退货 Admin 页面;#334/#335 仅 Android 与测试,服务端无行为变化)。linux/amd64,SHA-256 `46332f282beb709a4818a762ec8a433b2d87d1fb0363a40cee48ee0c0ecee444`;Web dist 由同一提交 `pnpm run build:prod` 构建。 - **发布目录**:`/home/goauto/releases/20260927-d0b8609-336-337`(config 复制自 `20260922-3bf428a-331-333`,static/var 链接不变),`current` 原子切换,`goauto.service` 重启后 active;健康检查、首页 200;日志无 panic/fatal/1146/1054。切换前采购/采集运行中任务为 0。 - **配置**:发布目录 `config/settings.yml` 补 `extend.yeeke` 段(baseurl/pagesize/maxpages/retry/ocrurl/ocrmaxattempts,与仓库一致)。 - **凭据**:按用户要求把本地 yeeke 账号写入线上 `/etc/goauto/goauto.env`(`GOAUTO_YEEKE_USERNAME`/`GOAUTO_YEEKE_PASSWORD`);经 SSH 标准输入传递,未出现在命令行、输出、日志或本工单;写前备份为 `goauto.env.bak-20260927084727`,权限保持 600 root:goauto。 - **线上迁移**(新执行 3 个:1789800400000 / 500000 / 600000):新建 yeeke_session、yeeke_return_package、yeeke_return_item、yeeke_sync_run;写入定时任务「yeeke 退货包裹同步」(job_id 6,status=2 **关闭**);新增菜单「yeeke 退货包裹」「yeeke 同步记录」并关联 admin、purchaser。 - **接口**:`/api/admin/v1/yeeke-returns`、`/shops`、`/sync-runs` 已挂载(未登录返回 401 JSON)。 - **未验证**:线上 yeeke 登录与真实同步(需在线上后台「yeeke 同步记录」点击手动同步);定时任务仍关闭,需管理员决定是否开启。 - **回滚**:`current` 切回 `20260922-3bf428a-331-333` 并重启;新增表与菜单不影响旧版本。 - 线上系统盘使用 92%(剩 4.5G)。
Author
Owner

部署修正:yeeke 用户名编码错误(2026-09-27)

  • 现象:用户在线上点击手动同步,报「yeeke 登录被拒绝: 用户名或密码错误」。
  • 根因(部署失误):写入 goauto.env 时,本地 Windows Python 以控制台默认编码(GBK)向 SSH 管道输出,中文用户名被写成 GBK 字节(4 字节)而非 UTF-8(6 字节);密码为 ASCII 未受影响。当时只核对了字符长度,未核对字节。服务启动日志确认凭据来源为环境变量,排除了其他配置覆盖。
  • 修正:改用纯 ASCII 转义传输,仅替换 GOAUTO_YEEKE_USERNAME 一行(备份 goauto.env.bak-20260927090200,权限不变);重启前采购/采集/yeeke 同步运行中均为 0;重启后 active、健康检查 200;运行中进程的两个变量与本地逐字节 SHA-256 比对均一致(用户名 6 字节、密码 9 字节)。
  • 待用户再次手动同步验证登录。
## 部署修正:yeeke 用户名编码错误(2026-09-27) - **现象**:用户在线上点击手动同步,报「yeeke 登录被拒绝: 用户名或密码错误」。 - **根因(部署失误)**:写入 `goauto.env` 时,本地 Windows Python 以控制台默认编码(GBK)向 SSH 管道输出,中文用户名被写成 GBK 字节(4 字节)而非 UTF-8(6 字节);密码为 ASCII 未受影响。当时只核对了字符长度,未核对字节。服务启动日志确认凭据来源为环境变量,排除了其他配置覆盖。 - **修正**:改用纯 ASCII 转义传输,仅替换 `GOAUTO_YEEKE_USERNAME` 一行(备份 `goauto.env.bak-20260927090200`,权限不变);重启前采购/采集/yeeke 同步运行中均为 0;重启后 active、健康检查 200;运行中进程的两个变量与本地逐字节 SHA-256 比对均一致(用户名 6 字节、密码 9 字节)。 - 待用户再次手动同步验证登录。
Author
Owner

已按授权合并并发布 #336/#337:

  • main 已快进至 d0b8609;
  • 执行线上迁移:新增 0 个,跳过 57 个已应用版本,退货同步相关迁移已存在;
  • Server 使用 Linux x86_64 交叉编译版本;
  • Web dist 已发布;
  • 发布目录:/home/goauto/releases/20260927-d0b8609-336-337-r2;
  • goauto.service 重启后为 active;
  • 外部验证 http://185.216.248.75:9527/、/api/v1/health 和 #/yeeke-returns/index 均 HTTP 200;
  • 未启用或修改退货定时任务配置,未执行任何 yeeke 写操作。

当前待用户验收。

已按授权合并并发布 #336/#337: - main 已快进至 `d0b8609`; - 执行线上迁移:新增 0 个,跳过 57 个已应用版本,退货同步相关迁移已存在; - Server 使用 Linux x86_64 交叉编译版本; - Web dist 已发布; - 发布目录:`/home/goauto/releases/20260927-d0b8609-336-337-r2`; - `goauto.service` 重启后为 active; - 外部验证 `http://185.216.248.75:9527/`、`/api/v1/health` 和 `#/yeeke-returns/index` 均 HTTP 200; - 未启用或修改退货定时任务配置,未执行任何 yeeke 写操作。 当前待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#337