From ad616943c826caef1ec09f086ee90079d42732db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Wed, 15 Jul 2026 22:52:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(user):=20=E4=BF=AE=E5=A4=8D=E3=80=8C?= =?UTF-8?q?=E6=88=91=E7=9A=84=E3=80=8D=E9=A1=B5=E8=AE=A2=E5=8D=95=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E7=BB=9F=E8=AE=A1=E6=98=BE=E7=A4=BA=E4=B8=BA=200=20?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正 UserOrderStats 接口字段与后端 DTO 完全对齐 - getUserOrderStats() 读取后端真实字段,数值使用 Number(x) 兜底 - 「我的订单」快捷入口 count 和 status 与 OrderListStatus 枚举对齐 - localStorage 缓存 key 升级至 v3,避免旧缓存干扰冷启动渲染 - 保证所有跳转订单列表的入口传递正确 status 参数,防止跳转错误的 tab --- .workbuddy/memory/2026-07-15.md | 13 +++++++++++ src/api/shop/shopUserCard/index.ts | 28 ++++++++++++++++++------ src/api/shop/shopUserCard/model/index.ts | 19 ++++++++++++---- src/pages/user/user.tsx | 16 ++++++++------ 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/.workbuddy/memory/2026-07-15.md b/.workbuddy/memory/2026-07-15.md index ff0abf2..2c82a9d 100644 --- a/.workbuddy/memory/2026-07-15.md +++ b/.workbuddy/memory/2026-07-15.md @@ -265,3 +265,16 @@ - 注意:宽度仍由容器 `w-full` + `mx-3` 边距控制,不直接套用后台 `width` 像素值;高度按比例缩放适配不同屏幕 + +## 修复「我的」页订单数量统计全为 0 的 bug +- 文件:`src/api/shop/shopUserCard/index.ts`、`src/api/shop/shopUserCard/model/index.ts`、`src/pages/user/user.tsx` +- 根因:前后端字段名不匹配 + - 后端 `/api/user/orders/stats` 返回 `UserOrderStats` DTO 字段:`total/waitPay/waitDeliver/waitVerify/waitReceive/waitComment/completed/refund/deleted/canceled`(参见 `com.gxwebsoft.shop.dto.UserOrderStats`) + - 前端 `getUserOrderStats()` 却读取 `pending/paid/shipped/completed`,导致 `pending/paid/shipped` 永远 undefined → 兜底为 0;只有 `completed` 字段名巧合一致才有数 +- 附带 bug:user.tsx「我的订单」快捷入口的 `status` 值写的是 0/1/2/3,与 `OrderListStatus`(0待付款 1待发货 3待收货 5已完成)不一致,点击「待收货」「已完成」会跳到订单列表页错误的 tab +- 修复: + 1. `UserOrderStats` 接口字段与后端 DTO 完全对齐(含 total/waitPay/waitDeliver/waitVerify/waitReceive/waitComment/completed/refund/deleted/canceled) + 2. `getUserOrderStats()` 改读后端真实字段,并用 `Number(d.x) || 0` 兜底 + 3. user.tsx 订单快捷入口 count 改用 `waitPay/waitDeliver/waitReceive/completed`,status 改为 `0/1/3/5` 与 `OrderListStatus` 对齐 + 4. localStorage 缓存 key 从 `user_order_stats_v2` 升级到 `v3`,让旧格式缓存自动失效,避免冷启动先渲染旧格式导致仍是 0 +- 关键约定:`OrderListStatus` 是前端订单 Tab 筛选状态的唯一真相源(-1全部/0待付款/1待发货/2待核销/3待收货/4待评价/5已完成/6退款/7已删除),所有跳订单列表的入口传 status 都要对齐它 diff --git a/src/api/shop/shopUserCard/index.ts b/src/api/shop/shopUserCard/index.ts index 254d12e..a0df990 100644 --- a/src/api/shop/shopUserCard/index.ts +++ b/src/api/shop/shopUserCard/index.ts @@ -33,25 +33,39 @@ export async function getUserCardStats(): Promise { /** * 获取用户订单统计 * 后端接口:/api/user/orders/stats(60s 缓存) + * 字段与后端 UserOrderStats DTO 对齐:waitPay/waitDeliver/waitReceive/completed 等 */ export async function getUserOrderStats(): Promise { try { const res = await request.get>('/user/orders/stats') if (res.code === 0 && res.data) { + const d = res.data return { - pending: res.data.pending || 0, - paid: res.data.paid || 0, - shipped: res.data.shipped || 0, - completed: res.data.completed || 0, + total: Number(d.total) || 0, + waitPay: Number(d.waitPay) || 0, + waitDeliver: Number(d.waitDeliver) || 0, + waitVerify: Number(d.waitVerify) || 0, + waitReceive: Number(d.waitReceive) || 0, + waitComment: Number(d.waitComment) || 0, + completed: Number(d.completed) || 0, + refund: Number(d.refund) || 0, + deleted: Number(d.deleted) || 0, + canceled: Number(d.canceled) || 0, } } } catch (e) { console.error('获取订单统计失败:', e) } return { - pending: 0, - paid: 0, - shipped: 0, + total: 0, + waitPay: 0, + waitDeliver: 0, + waitVerify: 0, + waitReceive: 0, + waitComment: 0, completed: 0, + refund: 0, + deleted: 0, + canceled: 0, } } diff --git a/src/api/shop/shopUserCard/model/index.ts b/src/api/shop/shopUserCard/model/index.ts index 3cc0554..ec3f132 100644 --- a/src/api/shop/shopUserCard/model/index.ts +++ b/src/api/shop/shopUserCard/model/index.ts @@ -9,9 +9,20 @@ export interface UserCardStats { giftCards: number } +/** + * 用户订单状态数量统计 + * 字段与后端 com.gxwebsoft.shop.dto.UserOrderStats 对齐 + * (statusFilter:-1全部 0待支付 1待发货 2待核销 3待收货 4待评价 5已完成 6退款 7已删除 8已取消) + */ export interface UserOrderStats { - pending: number // 待付款 - paid: number // 待发货 - shipped: number // 待收货 - completed: number // 已完成 + total: number // 全部(不含已取消) + waitPay: number // 待付款(statusFilter=0) + waitDeliver: number // 待发货(statusFilter=1) + waitVerify: number // 待核销(statusFilter=2) + waitReceive: number // 待收货(statusFilter=3) + waitComment: number // 待评价(statusFilter=4) + completed: number // 已完成(statusFilter=5) + refund: number // 退款/售后(statusFilter=6) + deleted: number // 已删除(statusFilter=7) + canceled: number // 已取消(statusFilter=8) } diff --git a/src/pages/user/user.tsx b/src/pages/user/user.tsx index 18a930e..1dd62da 100644 --- a/src/pages/user/user.tsx +++ b/src/pages/user/user.tsx @@ -41,7 +41,8 @@ const UserPage: React.FC = () => { cacheKey: 'user_order_stats', cacheTime: 30 * 1000, onSuccess: (data) => { - Taro.setStorageSync('user_order_stats_v2', data) + // v3: 字段结构变更(与后端 UserOrderStats DTO 对齐),旧版 v2 缓存自动失效 + Taro.setStorageSync('user_order_stats_v3', data) }, }) @@ -51,7 +52,7 @@ const UserPage: React.FC = () => { // 冷启动优化:先从 localStorage 读取缓存即时展示,消除骨架屏 const cachedCardStats = Taro.getStorageSync('user_card_stats_v2') if (cachedCardStats) mutateCardStats(cachedCardStats) - const cachedOrderStats = Taro.getStorageSync('user_order_stats_v2') + const cachedOrderStats = Taro.getStorageSync('user_order_stats_v3') if (cachedOrderStats) mutateOrderStats(cachedOrderStats) // 然后发起网络请求(stale-while-revalidate 后台刷新) runCardStats() @@ -78,7 +79,7 @@ const UserPage: React.FC = () => { if (cachedCardStats) { mutateCardStats(cachedCardStats) } - const cachedOrderStats = Taro.getStorageSync('user_order_stats_v2') + const cachedOrderStats = Taro.getStorageSync('user_order_stats_v3') if (cachedOrderStats) { mutateOrderStats(cachedOrderStats) } @@ -263,10 +264,11 @@ const UserPage: React.FC = () => { {[ - { icon: '💳', label: '待付款', status: 0, count: orderStats?.pending }, - { icon: '📦', label: '待发货', status: 1, count: orderStats?.paid }, - { icon: '🚚', label: '待收货', status: 2, count: orderStats?.shipped }, - { icon: '✅', label: '已完成', status: 3, count: orderStats?.completed }, + // status 与 OrderListStatus 对齐:0待付款 1待发货 3待收货 5已完成 + { icon: '💳', label: '待付款', status: 0, count: orderStats?.waitPay }, + { icon: '📦', label: '待发货', status: 1, count: orderStats?.waitDeliver }, + { icon: '🚚', label: '待收货', status: 3, count: orderStats?.waitReceive }, + { icon: '✅', label: '已完成', status: 5, count: orderStats?.completed }, ].map(item => (