feat(shop): 优化VIP价格支持及线下付款兼容
- 结算页新增线下付款异常友好提示,避免支付配置中appid缺失错误 - 后端修复支付类型判断,防止线下付款仍试图创建微信支付订单 - 结算页默认支付方式调整为线下付款,货到付款选项注释 - 新增门店订单“修改金额”功能,支持弹窗输入新金额和修改原因 - 订单修改支持追加操作记录,接口复用updateShopOrder,无需新接口 - 重构多处页面和组件,使用响应式useVipStatus替代同步isVipMember缓存 - 新增OrderGoodsItem.price字段,下单时传VIP dealerPrice确保价格准确 - 购物车、商品详情、分类页、SkuSelector、商品卡片等支持动态VIP价格展示 - 修改购物车上下文calcPrice函数,响应VIP状态变更自动更新价格显示 - 提升前端VIP状态管理一致性,防止过期缓存导致VIP特权价格显示异常 - 验证构建通过,后端服务重启后生效线下付款修复和订单修改功能
This commit is contained in:
@@ -1,6 +1,41 @@
|
||||
# 2026-07-15 工作日志
|
||||
## 线下付款下单失败排查
|
||||
- 文件:`src/pages/shop/checkout.tsx`、`src/api/shop/shopOrder/index.ts`
|
||||
- 现象:结算页选择线下付款(payType=9)下单时报错:`创建支付订单失败:创建微信支付订单失败:支付配置中应用ID为null或空`
|
||||
- 原因:前端传参正确,但后端 `POST /shop/shop-order` 在 payType=9 时仍尝试创建微信支付订单,因未配置 appId 失败
|
||||
- 前端处理:
|
||||
- `checkout.tsx` 增加线下付款支付配置类错误的友好提示
|
||||
- `createOrder` 返回类型放宽为 `WxPayResult | null`,兼容非微信支付场景
|
||||
- 后端修复(`/Users/gxwebsoft/JAVA/guilixu-java`,3 个文件):
|
||||
1. `OrderBusinessService.java` — `createOrder()` 中 Integer 比较从 `==` 改为 `.equals()`,避免装箱陷阱导致 payType=8/9 拦截失效;微信支付分支前加日志
|
||||
2. `ShopOrderServiceImpl.java` — `createWxOrder()` 方法开头增加 payType 守卫,非微信支付(1/102)直接抛异常,不走 JSAPI 分支
|
||||
3. `ShopOrderController.java` — `saveLegacy()` 方法增加 payType 检查,货到付款/线下付款/余额支付跳过 createWxOrder
|
||||
- 验证:Maven compile 成功,无编译错误
|
||||
- 注意:后端服务需重启才能生效
|
||||
|
||||
## 结算页支付方式调整
|
||||
- 文件:`src/pages/shop/checkout.tsx`
|
||||
- 注释掉货到付款(id=8)选项,只保留线下付款(id=9)
|
||||
- 默认支付方式从 8(货到付款) 改为 9(线下付款)
|
||||
|
||||
## 门店订单修改金额功能
|
||||
- 文件:`src/pages/store/orders/index.tsx`
|
||||
- 新增 OpType `'editPrice'`,在订单卡片操作区增加橙色「修改金额」按钮
|
||||
- 仅对可操作订单(非已完成/非已关闭)显示
|
||||
- 弹窗包含:当前实付展示、新金额输入(digit)、修改原因(必填 textarea)
|
||||
- 提交调用 `updateShopOrder({ orderId, payPrice, comments })`,金额变更记录追加到 comments
|
||||
- 复用现有 `updateShopOrder` API(PUT `/shop/shop-order`),无需新增接口
|
||||
|
||||
## 修复 VIP 会员价格显示和下单问题
|
||||
- **根因**:`useVipStatus` hook 已定义但从未被任何页面使用,所有页面直接调用 `isVipMember()` 读取同步缓存。该缓存仅在「个人中心」页刷新,导致 VIP 会员访问商品详情/购物车/结算页时缓存为 stale false,不显示 dealerPrice
|
||||
- **修复文件**(共 9 个):
|
||||
1. `src/api/shop/shopOrder/model/index.ts` — `OrderGoodsItem` 新增 `price?: string` 字段,下单时传 VIP 单价
|
||||
2. `src/pages/shop/product-detail.tsx` — 引入 `useVipStatus`,用响应式 `isVip` 替换 `isVipMember()`
|
||||
3. `src/pages/shop/checkout.tsx` — 引入 `useVipStatus`,`goodsPrice` useMemo 依赖加 `isVip`;下单时 `OrderGoodsItem` 传 `price` 字段
|
||||
4. `src/pages/shop/index.tsx` — 引入 `useVipStatus`,替换 `isVipMember()`
|
||||
5. `src/pages/shop/category.tsx` — 引入 `useVipStatus`,替换 `isVipMember()`
|
||||
6. `src/pages/shop/cart.tsx` — 引入 `useVipStatus`,替换 `isVipMember()`
|
||||
7. `src/contexts/CartContext.tsx` — CartProvider 引入 `useVipStatus`,`calcPrice` 用响应式 `isVip`
|
||||
8. `src/components/business/SkuSelector/index.tsx` — 引入 `useVipStatus`,替换 `isVipMember()`
|
||||
9. `src/components/common/ProductCard/index.tsx` — 引入 `useVipStatus`,替换 `isVipMember()`
|
||||
- **原理**:`useVipStatus` 在组件挂载时异步调用 `checkAndCacheVipStatus` 查询后端并更新缓存+React state,state 变化触发重渲染,使所有价格显示/计算自动更新为 dealerPrice
|
||||
- 验证:`npx taro build --type weapp` 构建成功
|
||||
|
||||
@@ -18,7 +18,10 @@
|
||||
- 用户在 `vip-upgrade` 页面提交门店名称和地址申请
|
||||
- 门店店员在 `vip-review` 页面审核(通过/驳回)
|
||||
- VIP 会员特权:商品显示 `dealerPrice` 价格,下单使用该价格结算
|
||||
- VIP 状态判断:`isVipMember()` 从 localStorage 缓存读取,`checkAndCacheVipStatus(userId)` 异步更新
|
||||
- VIP 状态判断:`isVipMember()` 从 localStorage 缓存读取(同步),`checkAndCacheVipStatus(userId)` 异步更新
|
||||
- **响应式 VIP 状态**:使用 `useVipStatus` hook(`src/hooks/useVipStatus.ts`),组件挂载时异步校验并更新缓存 + React state,isVip 变化触发重渲染
|
||||
- **已接入 `useVipStatus` 的页面/组件**:商品详情、结算、商城首页、分类页、购物车页、CartContext、SkuSelector、ProductCard
|
||||
- `OrderGoodsItem` 接口新增 `price` 字段,VIP 下单时传 dealerPrice 给后端
|
||||
|
||||
## 商品价格字段约定
|
||||
- `product.price` - 到手价(主价格)
|
||||
|
||||
Reference in New Issue
Block a user