feat(yeeke): 增加已重出退货同步、状态筛选及匹配排除 #345

Open
opened 2026-09-28 16:01:35 +08:00 by ila · 3 comments
Owner

原始需求与来源

2026-09-28 用户要求:现有 Yeeke 只拉取“待出货”,增加拉取“已重出”的退货商品。用户提供本机 mmt_yeeke_order2.har 作为只读请求证据,确认分析后要求建工单。本单仅建单,尚未授权实施或发布。

基线与已核验事实

  • 核验日期:2026-09-28;代码基线:main 9dace6ac89a8097a28a101a32b9b6f07e30ef69b。
  • HAR:POST /agent-foreign/packageClaimRec/relation/list;已重出请求为 status="2"、claimFlag="1"、relationFlag="1",分页为 pageNo/pageSize,排序 createTime desc;响应 records/status=2/items 与现有结构兼容。
  • server/app/goauto/yeekeclient/client.go 的 List 固定 status=1。
  • server/app/goauto/yeeke/sync.go 当前仅同步单状态,完整同步后全局 markMissing;状态识别目前仅确认 1。
  • server/app/goauto/returnmatch/service.go availableReturnPool 过滤 sync_status,但未按 claim_status 排除已重出。
  • 不上传 HAR 原文、会话凭据或业务原始数据至工单/Git/Wiki。

目标与非目标

目标:同时同步待出货(1)、已重出(2),显示和筛选已重出;保持现有幂等入库及只读第三方访问;已重出不再进入新退货匹配候选。
非目标:不修改 Android、采购流程、Yeeke 数据,不自动取消或释放既有匹配,不新增重出操作,不调整其他退货状态、账号权限或部署拓扑。

前置依赖与交付范围

  • 复用 #336/#337 对接与同步列表、#338 可用性和退货匹配实现;实施前核对最新 main 及上述契约。
  • 交付单元:Server(yeekeclient、yeeke、returnmatch 及测试)、Web(既有退货列表状态显示/筛选)和必要长期 Wiki。
  • 共享同步与匹配逻辑不与其他相关工单并行修改;不依赖 Android。
  • 预期复用已有 claim_status、sync_status、包裹/商品唯一键,无新增字段或数据库迁移。发现必须迁移时先更新方案并申请授权。

最小方案与流程设计

  1. List 支持显式状态参数,固定白名单 1/2;现有参数、会话及重试机制复用,避免全状态拉取。
  2. 一个同步运行、一个既有互斥租约内依次分页获取状态1、状态2;每个状态单独计分页完成性和指纹,合计运行计数,逐页入库。
  3. 按既有包裹 ExternalID、商品 ExternalKey 幂等更新,状态1→2保留本地身份和关联;跨状态同一包裹以已重出优先,避免并发状态变化后回退为待出货或计作重复新增。
  4. 只有两个状态都自然完整结束且无写入失败,才执行一次全局 markMissing,保留既有缺失比例保护。任何状态分页失败、重复页中断、达到页数上限或写入失败均不做 missing 清理;已入库数据保留,日志明确状态及失败页,运行不得冒充完整成功。
  5. 已识别状态增加2,原始业务状态仍保存在 claim_status;不得将已重出等同于 missing。
  6. 退货列表复用既有状态列和筛选,增加“已重出”;保持待出货及未知状态兼容。
  7. availableReturnPool 及创建新匹配的最终可用性校验仅允许待出货(status=1),已重出不得再次分配;既有匹配不自动删除、取消或释放,如涉及处置另行讨论。

设计证据

  • 后端流程采用本单最小方案,不强制完整 UI 原型。
  • Web 仅复用现有状态列/下拉筛选增加选项;实施前在工单补现有规范引用或标注截图,说明加载、空、失败和现有权限保持不变。
  • 本单方案状态:待实施;创建不等于实现/原型确认。

验收与测试

  • 请求测试验证两次状态查询参数,独立分页,响应结构兼容。
  • 两个状态都有数据可在同一运行入库;重复同步无新增重复记录;1→2复用原行,跨状态重复不会回退。
  • 任一状态分页/写入失败不将另一个状态或未拉完数据标 missing;两个状态完整时才进行一次缺失处理;保留既有恢复及缺失比例保护回归测试。
  • 已重出可显示、筛选,不标未知;待出货和未知状态既有行为不变。
  • 已重出即使 sync_status=ok 且未过销毁期限也不能进入新匹配;待出货正常匹配;既有匹配记录不自动变更。
  • 运行受影响 Go 单测与 Web 最小测试/构建,使用脱敏模拟样本;真实接口/线上验证须另获授权并记录未覆盖项,不触发采购、下单或付款。

风险与文档影响

主要风险:扩大同步集合后 missing 误标、跨状态重复造成状态回退、已重出被重复分配。按上述双状态完整性、幂等和候选过滤处理。
长期文档需更新 Wiki 中 Yeeke 同步范围、状态定义、缺失处理与匹配可用性契约及相关代码映射;按 Wiki-first 在线回读 revision 后一轮 sync + sync --check。不导出任务归档。

工具说明与状态

本会话没有可用 Gitea MCP,创建/查询回退项目配置 Gitea API;凭据从本机安全配置读取,不写入工单。
状态:已建单,待实施。发布、权限或迁移仍按独立授权执行。

## 原始需求与来源 2026-09-28 用户要求:现有 Yeeke 只拉取“待出货”,增加拉取“已重出”的退货商品。用户提供本机 `mmt_yeeke_order2.har` 作为只读请求证据,确认分析后要求建工单。本单仅建单,尚未授权实施或发布。 ## 基线与已核验事实 - 核验日期:2026-09-28;代码基线:main `9dace6ac89a8097a28a101a32b9b6f07e30ef69b`。 - HAR:`POST /agent-foreign/packageClaimRec/relation/list`;已重出请求为 `status="2"`、`claimFlag="1"`、`relationFlag="1"`,分页为 pageNo/pageSize,排序 createTime desc;响应 records/status=2/items 与现有结构兼容。 - `server/app/goauto/yeekeclient/client.go` 的 List 固定 status=1。 - `server/app/goauto/yeeke/sync.go` 当前仅同步单状态,完整同步后全局 markMissing;状态识别目前仅确认 1。 - `server/app/goauto/returnmatch/service.go` availableReturnPool 过滤 sync_status,但未按 claim_status 排除已重出。 - 不上传 HAR 原文、会话凭据或业务原始数据至工单/Git/Wiki。 ## 目标与非目标 目标:同时同步待出货(1)、已重出(2),显示和筛选已重出;保持现有幂等入库及只读第三方访问;已重出不再进入新退货匹配候选。 非目标:不修改 Android、采购流程、Yeeke 数据,不自动取消或释放既有匹配,不新增重出操作,不调整其他退货状态、账号权限或部署拓扑。 ## 前置依赖与交付范围 - 复用 #336/#337 对接与同步列表、#338 可用性和退货匹配实现;实施前核对最新 main 及上述契约。 - 交付单元:Server(yeekeclient、yeeke、returnmatch 及测试)、Web(既有退货列表状态显示/筛选)和必要长期 Wiki。 - 共享同步与匹配逻辑不与其他相关工单并行修改;不依赖 Android。 - 预期复用已有 claim_status、sync_status、包裹/商品唯一键,无新增字段或数据库迁移。发现必须迁移时先更新方案并申请授权。 ## 最小方案与流程设计 1. List 支持显式状态参数,固定白名单 1/2;现有参数、会话及重试机制复用,避免全状态拉取。 2. 一个同步运行、一个既有互斥租约内依次分页获取状态1、状态2;每个状态单独计分页完成性和指纹,合计运行计数,逐页入库。 3. 按既有包裹 ExternalID、商品 ExternalKey 幂等更新,状态1→2保留本地身份和关联;跨状态同一包裹以已重出优先,避免并发状态变化后回退为待出货或计作重复新增。 4. 只有两个状态都自然完整结束且无写入失败,才执行一次全局 markMissing,保留既有缺失比例保护。任何状态分页失败、重复页中断、达到页数上限或写入失败均不做 missing 清理;已入库数据保留,日志明确状态及失败页,运行不得冒充完整成功。 5. 已识别状态增加2,原始业务状态仍保存在 claim_status;不得将已重出等同于 missing。 6. 退货列表复用既有状态列和筛选,增加“已重出”;保持待出货及未知状态兼容。 7. availableReturnPool 及创建新匹配的最终可用性校验仅允许待出货(status=1),已重出不得再次分配;既有匹配不自动删除、取消或释放,如涉及处置另行讨论。 ## 设计证据 - 后端流程采用本单最小方案,不强制完整 UI 原型。 - Web 仅复用现有状态列/下拉筛选增加选项;实施前在工单补现有规范引用或标注截图,说明加载、空、失败和现有权限保持不变。 - 本单方案状态:待实施;创建不等于实现/原型确认。 ## 验收与测试 - 请求测试验证两次状态查询参数,独立分页,响应结构兼容。 - 两个状态都有数据可在同一运行入库;重复同步无新增重复记录;1→2复用原行,跨状态重复不会回退。 - 任一状态分页/写入失败不将另一个状态或未拉完数据标 missing;两个状态完整时才进行一次缺失处理;保留既有恢复及缺失比例保护回归测试。 - 已重出可显示、筛选,不标未知;待出货和未知状态既有行为不变。 - 已重出即使 sync_status=ok 且未过销毁期限也不能进入新匹配;待出货正常匹配;既有匹配记录不自动变更。 - 运行受影响 Go 单测与 Web 最小测试/构建,使用脱敏模拟样本;真实接口/线上验证须另获授权并记录未覆盖项,不触发采购、下单或付款。 ## 风险与文档影响 主要风险:扩大同步集合后 missing 误标、跨状态重复造成状态回退、已重出被重复分配。按上述双状态完整性、幂等和候选过滤处理。 长期文档需更新 Wiki 中 Yeeke 同步范围、状态定义、缺失处理与匹配可用性契约及相关代码映射;按 Wiki-first 在线回读 revision 后一轮 sync + sync --check。不导出任务归档。 ## 工具说明与状态 本会话没有可用 Gitea MCP,创建/查询回退项目配置 Gitea API;凭据从本机安全配置读取,不写入工单。 状态:已建单,待实施。发布、权限或迁移仍按独立授权执行。
Author
Owner

开始实施 #345。基线更新为 main bce4897(包含 #346,Yeeke 相关逻辑未变)。设计证据:复用 web/src/views/goauto/yeeke-returns/index.vue 既有认领状态 el-select、列表/详情 el-tag 和清空筛选行为,仅增加 status=2 的“已重出”;status=1 展示“待出货”。保持现有加载、空态、失败重试及权限,不新增组件/布局。将补充双状态完整性和新匹配最终可用性回归。无数据库迁移,不发布线上。Gitea MCP 不可用,回退配置的 API。

开始实施 #345。基线更新为 main bce4897(包含 #346,Yeeke 相关逻辑未变)。设计证据:复用 web/src/views/goauto/yeeke-returns/index.vue 既有认领状态 el-select、列表/详情 el-tag 和清空筛选行为,仅增加 status=2 的“已重出”;status=1 展示“待出货”。保持现有加载、空态、失败重试及权限,不新增组件/布局。将补充双状态完整性和新匹配最终可用性回归。无数据库迁移,不发布线上。Gitea MCP 不可用,回退配置的 API。
Author
Owner

实施完成,待验收(2026-09-28)

提交:3b95d4e,已推送 feat/345-yeeke-reship;基线 origin/main bce4897。尚未合并 main、运行真实 Yeeke 同步或发布;本次无数据库迁移。

实现

  • 同步顺序遍历待出货 status=1 和已重出 status=2,保持 HAR 确认的 claimFlag/relationFlag 和排序;原 List 调用兼容 status=1。
  • 两组分页各自判重;共享原包裹标识,跨状态重复以已重出为准,原包裹/明细身份及已有匹配保留。
  • 仅两组完整且无写入错误才沿用 missing 安全阀。不完整分页、拉取或写入失败明确报告失败;已成功入库数据保留。
  • 退货商品列表及详情展示待出货/已重出,原状态筛选增加已重出;沿用既有组件及所有加载、空、异常和权限边界,未增加独立页面。依 UI/UX skill 保持原界面规范,不做风格重构。
  • 新匹配候选排除已重出及未识别状态;事务在插入前再次检查包裹/明细可用状态,复用包裹→明细锁顺序,状态变化记为跳过;不自动取消已有匹配。

验证

  • PASS:go test ./app/goauto/yeeke ./app/goauto/yeekeclient ./app/goauto/returnmatch
  • PASS:go build .
  • PASS:node --test tests/unit/yeeke-status.test.cjs(2/2)
  • PASS:pnpm build:prod(保留既有 CSS/chunk 警告);git diff --check。
  • 回归覆盖双状态请求参数、独立分页、状态 1→2 原 ID 保持、重复同步/跨状态去重、第二状态失败不误标 missing、已重出候选排除及最终落库校验、Web 标签/筛选及重置。
  • 未覆盖:真实 Yeeke、多进程 MySQL 并发、真实登录浏览器页面和线上部署;未执行支付、创建采购订单或生产写入。
  • 既有阻碍未扩大修复:harness check --strict 因基线已有 docs/evidence/pdd-home-35727-summary.md 未登记镜像失败;单文件 ESLint 因既有 openSybProduct 行 object-curly-spacing 失败。自动格式修正会触碰无关行,已撤回该无关修正。

长期文档

在线修改且回读 revision:Architecture-and-Code-Map 04cc54a554fc3bdc30273e6a5ace5fff5d95386f;Business-Rules-and-Glossary 57ae18796e441eeed7b0ffc2a833fe6b4b5055f1。已各运行一次 harness sync / sync --check,均通过,相关镜像已提交。
同步同时发现线上既有 #330 段落与基线 #343 内容有差异;本单未编辑该线上段落,镜像按权威源同步,另需独立核对。无关 docs/12-syb-erp-interface.md 镜像同步差异留在 worktree,未包含提交。

Gitea MCP 不可用,继续使用项目安全配置的 Gitea API 回写。保持工单开放,待用户验收及后续合并/发布授权。

## 实施完成,待验收(2026-09-28) 提交:3b95d4e,已推送 feat/345-yeeke-reship;基线 origin/main bce4897。尚未合并 main、运行真实 Yeeke 同步或发布;本次无数据库迁移。 ### 实现 - 同步顺序遍历待出货 status=1 和已重出 status=2,保持 HAR 确认的 claimFlag/relationFlag 和排序;原 List 调用兼容 status=1。 - 两组分页各自判重;共享原包裹标识,跨状态重复以已重出为准,原包裹/明细身份及已有匹配保留。 - 仅两组完整且无写入错误才沿用 missing 安全阀。不完整分页、拉取或写入失败明确报告失败;已成功入库数据保留。 - 退货商品列表及详情展示待出货/已重出,原状态筛选增加已重出;沿用既有组件及所有加载、空、异常和权限边界,未增加独立页面。依 UI/UX skill 保持原界面规范,不做风格重构。 - 新匹配候选排除已重出及未识别状态;事务在插入前再次检查包裹/明细可用状态,复用包裹→明细锁顺序,状态变化记为跳过;不自动取消已有匹配。 ### 验证 - PASS:go test ./app/goauto/yeeke ./app/goauto/yeekeclient ./app/goauto/returnmatch - PASS:go build . - PASS:node --test tests/unit/yeeke-status.test.cjs(2/2) - PASS:pnpm build:prod(保留既有 CSS/chunk 警告);git diff --check。 - 回归覆盖双状态请求参数、独立分页、状态 1→2 原 ID 保持、重复同步/跨状态去重、第二状态失败不误标 missing、已重出候选排除及最终落库校验、Web 标签/筛选及重置。 - 未覆盖:真实 Yeeke、多进程 MySQL 并发、真实登录浏览器页面和线上部署;未执行支付、创建采购订单或生产写入。 - 既有阻碍未扩大修复:harness check --strict 因基线已有 docs/evidence/pdd-home-35727-summary.md 未登记镜像失败;单文件 ESLint 因既有 openSybProduct 行 object-curly-spacing 失败。自动格式修正会触碰无关行,已撤回该无关修正。 ### 长期文档 在线修改且回读 revision:Architecture-and-Code-Map 04cc54a554fc3bdc30273e6a5ace5fff5d95386f;Business-Rules-and-Glossary 57ae18796e441eeed7b0ffc2a833fe6b4b5055f1。已各运行一次 harness sync / sync --check,均通过,相关镜像已提交。 同步同时发现线上既有 #330 段落与基线 #343 内容有差异;本单未编辑该线上段落,镜像按权威源同步,另需独立核对。无关 docs/12-syb-erp-interface.md 镜像同步差异留在 worktree,未包含提交。 Gitea MCP 不可用,继续使用项目安全配置的 Gitea API 回写。保持工单开放,待用户验收及后续合并/发布授权。
Author
Owner

用户授权合并及 167 发布完成(2026-09-28)

用户本轮明确授权合并并部署到 122.228.200.167。已合并并推送 origin/main:e7c049dbd6c8e89a82109f8b79f5ec95d6522fc3(包含实现 3b95d4e)。在独立干净 worktree 重新构建 Server/Linux amd64 与 Web;相关 Go 测试及 Web 两项单测通过,生产构建通过(既有 CSS/chunk 警告)。

发布目录 /home/goauto/releases/20260928-345-e7c049d;current 已原子切换,goauto.service active,nginx -t/reload 成功。二进制 SHA256:60efddb1c0a073fd641a1c6b102c3bc986cb78c93e4ceed63137a01d61a6c7f8。保留上一目录 20260928-344-9dace6a 可回滚;复制既有 config,沿用原 static/temp 资源,没有修改环境凭据或定时任务开关。本单无迁移,未执行数据库迁移、手动同步、匹配、采购或支付。

重启前只读查询:采集/采购/Yeeke 同步/订单回填 running 均 0;已有 pending 任务保留。默认 mysql 客户端插件不兼容,改用新机已安装的 /opt/mysql84-root/usr/bin/mysql 完成只读检查。

公网 http://122.228.200.167:9527 验证:

  • 首页和 /login 均为 Admin SPA(含 app 根节点、不含 GO-ADMIN 欢迎文案)。首页 10 个 JS/CSS 引用均 HTTP200。
  • health HTTP200,验证码 JSON code200;未认证退货接口业务码401。
  • 管理员只读查询 claimStatus=1、2 均 code200;状态1当前1858条,状态2当前0条。已重出 UI 构建资源存在。需下一次正常同步后验收已重出真实数据;此次没有主动触发同步。
  • 近期结构日志 panic/fatal/1146/1054 匹配数0。

发布沿用已记录的 167 部署方式,无新增长期运维/接口规则,本轮不重复更新或同步 Wiki;发布证据记录于本工单。Gitea MCP 不可用,回退 API。保持待验收,不关闭工单。

## 用户授权合并及 167 发布完成(2026-09-28) 用户本轮明确授权合并并部署到 122.228.200.167。已合并并推送 origin/main:e7c049dbd6c8e89a82109f8b79f5ec95d6522fc3(包含实现 3b95d4e)。在独立干净 worktree 重新构建 Server/Linux amd64 与 Web;相关 Go 测试及 Web 两项单测通过,生产构建通过(既有 CSS/chunk 警告)。 发布目录 /home/goauto/releases/20260928-345-e7c049d;current 已原子切换,goauto.service active,nginx -t/reload 成功。二进制 SHA256:60efddb1c0a073fd641a1c6b102c3bc986cb78c93e4ceed63137a01d61a6c7f8。保留上一目录 20260928-344-9dace6a 可回滚;复制既有 config,沿用原 static/temp 资源,没有修改环境凭据或定时任务开关。本单无迁移,未执行数据库迁移、手动同步、匹配、采购或支付。 重启前只读查询:采集/采购/Yeeke 同步/订单回填 running 均 0;已有 pending 任务保留。默认 mysql 客户端插件不兼容,改用新机已安装的 /opt/mysql84-root/usr/bin/mysql 完成只读检查。 公网 http://122.228.200.167:9527 验证: - 首页和 /login 均为 Admin SPA(含 app 根节点、不含 GO-ADMIN 欢迎文案)。首页 10 个 JS/CSS 引用均 HTTP200。 - health HTTP200,验证码 JSON code200;未认证退货接口业务码401。 - 管理员只读查询 claimStatus=1、2 均 code200;状态1当前1858条,状态2当前0条。已重出 UI 构建资源存在。需下一次正常同步后验收已重出真实数据;此次没有主动触发同步。 - 近期结构日志 panic/fatal/1146/1054 匹配数0。 发布沿用已记录的 167 部署方式,无新增长期运维/接口规则,本轮不重复更新或同步 Wiki;发布证据记录于本工单。Gitea MCP 不可用,回退 API。保持待验收,不关闭工单。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#345