feat: 仓储物流转运异常页新增「导出异常明细」(Excel / CSV) #72
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "codex/yanhui-wle-export-20261022"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
目的与范围
目前只能看(表格分页),没法导出。本次加一个「导出」按钮(Excel .xlsx / CSV .csv),
导出的是当前核验日 + 当前筛选下全部异常明细,不是当前屏。
backend/src/api/warehouseLogisticsException.js— 新增GET /api/warehouse-logistics-exception/exportbackend/src/services/warehouseLogisticsExceptionService.js— 导出入口 + 缓存改按核验日|明细上限分键backend/src/services/warehouseLogisticsExceptionRegistry.js— 仅补注释(说明「京喜京东」10-22 撤回全剔)backend/test/warehouseLogisticsException.test.js— 新增 2 个用例frontend/src/api/warehouseLogisticsException.js— 导出接口(超时 5 分钟)frontend/src/pages/WarehouseLogisticsException/index.jsx— 导出下拉 + 明细过滤抽出共用口径未做任何改动:承运商剔除(顺丰系全剔 / 京喜京东 / 睢宁中通按仓条件 / 武进安能 / 中铁 /
壹米滴答 / 自提 / 线下 / 商家配送)、订单终止与刷单信誉单剔除、异常 5 类判定,
全部沿用已合并的 #71。导出只换「取多少条」和「输出成文件」,不换判定。
两个实现要点
核验日|明细上限分键的 Map(上限 8 条)。页面按默认条数取、导出按 5000 条取,单槽缓存会互相踢掉 —— 导出一次之后,
页面下一次自动刷新就要重查库(20~40s,业务会当成「页面卡了」)。
EXPORT_COLUMNS(13 列纯文本标题),页面明细过滤抽成filterDetailOrders共用。页面列头用了 Tooltip,直接复用列定义会把表头导出成
[object Object];过滤共用同一个函数,才能保证「导出的就是页面看到的」。
同步与兼容性
9cba2f8(#71 的 merge commit)9cba2f8(提交前git fetch复核,HEAD..origin/main= 0)85e2db9(分支codex/yanhui-wle-export-20261022)新增接口为纯增量,
/list入参与返回结构一字未改(原有调用方零影响)。git diff --cached --stat无其他文件;Registry 改动只有注释(无代码行变化),三个文档(
AGENTS.md/仓库提交与合并规范.md/服务器部署规范.md)未在工作区变更。验证
npm --prefix backend run check→ syntax 通过;450 tests / 448 pass / 2 failsecret backup survives outside the repository with owner-only permissions—— Windows 下权限位是
0o666而非0o600,长期既有失败(平台差异)。负缓存带 TTL:TTL 内不重复解析,到期后必须重试—— 该用例要求系统库「解析失败」才走负缓存分支,本机当前 SSH 隧道在线、配置能成功读回,
于是首查没抛「业务数据库尚未配置」→
Missing expected rejection。环境相关(单跑该文件同样失败,改动该用例的文件未参与本次提交)。
node --test backend/test/warehouseLogisticsException.test.js→ 26/26 通过(原 24 + 新增 2:①导出行数 == 异常包裹数、字段齐全、带剔除口径;②分键缓存互不踢掉)
npm --prefix frontend run check→ lint 0 error / test 通过 / vite build 成功(48.7s)(页面当页只有 20 行 → 证明是导全量);选「未揽收(7)」再导出 → 7 行;
选一个 0 条的类型 → 只提示、不生成空文件;导出的 .xlsx 用 JSZip 解开核对表头与行数。
风险与回退
前端超时已放到 5 分钟、按钮带 loading 防重复点;异常包裹一天最多几百,
5000 只是兜底,真超了会在提示里明说「已截断」,不会静默少行。
回退只需 revert 本 PR 这一个提交
85e2db9,/list与既有页面行为立即复原;没有数据库、缓存持久化或配置需要清理(缓存是进程内 Map,重启即空)。
合并授权记录(规范第 6 节 · 路径二)
85e2db9f923678ef7605d05809decac33da633e89cba2f814012b45ecc207bd4e1d9f1f68eb4dedc说明:本 PR 为 AI 辅助开发、开发者即 yanhui 本人,当前
reviews = 0,无第三方审核者可用;按规范 6.1「仓库所有者/管理员对明确的 PR 作出书面合并指令时,该授权可以代替独立审核」,
据此执行合并。AI 未自审自合。
合并前检查(2026-10-22 10:05 GMT+8)
git rev-list --count HEAD..origin/main0(基线未前进)backend/src+frontend/srcmergeable/statetrue/openhead_sha== 本地 HEAD85e2db9✅base_sha== 当前origin/main9cba2f8✅warehouseLogisticsException.test.jsnpm --prefix backend run checknpm --prefix frontend run check两项后端失败与本 PR 无关:
resilientSecretStore是 Windows 权限位(0o666 vs 0o600)长期既有失败;cloudDatabaseConfigCache的负缓存用例要求系统库解析失败态,本机 SSH 隧道在线故首查不抛「业务数据库尚未配置」,单跑该文件同样失败,且该用例文件未参与本次提交。