Files
xinlong-shop-taro/.workbuddy/memory/2026-07-15.md
赵忠林 e47a0d3d3e feat(shop): 优化VIP价格支持及线下付款兼容
- 结算页新增线下付款异常友好提示,避免支付配置中appid缺失错误
- 后端修复支付类型判断,防止线下付款仍试图创建微信支付订单
- 结算页默认支付方式调整为线下付款,货到付款选项注释
- 新增门店订单“修改金额”功能,支持弹窗输入新金额和修改原因
- 订单修改支持追加操作记录,接口复用updateShopOrder,无需新接口
- 重构多处页面和组件,使用响应式useVipStatus替代同步isVipMember缓存
- 新增OrderGoodsItem.price字段,下单时传VIP dealerPrice确保价格准确
- 购物车、商品详情、分类页、SkuSelector、商品卡片等支持动态VIP价格展示
- 修改购物车上下文calcPrice函数,响应VIP状态变更自动更新价格显示
- 提升前端VIP状态管理一致性,防止过期缓存导致VIP特权价格显示异常
- 验证构建通过,后端服务重启后生效线下付款修复和订单修改功能
2026-07-15 02:45:19 +08:00

3.5 KiB
Raw Blame History

线下付款下单失败排查

  • 文件:src/pages/shop/checkout.tsxsrc/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-java3 个文件):
    1. OrderBusinessService.javacreateOrder() 中 Integer 比较从 == 改为 .equals(),避免装箱陷阱导致 payType=8/9 拦截失效;微信支付分支前加日志
    2. ShopOrderServiceImpl.javacreateWxOrder() 方法开头增加 payType 守卫,非微信支付(1/102)直接抛异常,不走 JSAPI 分支
    3. ShopOrderController.javasaveLegacy() 方法增加 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 APIPUT /shop/shop-order),无需新增接口

修复 VIP 会员价格显示和下单问题

  • 根因useVipStatus hook 已定义但从未被任何页面使用,所有页面直接调用 isVipMember() 读取同步缓存。该缓存仅在「个人中心」页刷新,导致 VIP 会员访问商品详情/购物车/结算页时缓存为 stale false不显示 dealerPrice
  • 修复文件(共 9 个):
    1. src/api/shop/shopOrder/model/index.tsOrderGoodsItem 新增 price?: string 字段,下单时传 VIP 单价
    2. src/pages/shop/product-detail.tsx — 引入 useVipStatus,用响应式 isVip 替换 isVipMember()
    3. src/pages/shop/checkout.tsx — 引入 useVipStatusgoodsPrice useMemo 依赖加 isVip;下单时 OrderGoodsItemprice 字段
    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 引入 useVipStatuscalcPrice 用响应式 isVip
    8. src/components/business/SkuSelector/index.tsx — 引入 useVipStatus,替换 isVipMember()
    9. src/components/common/ProductCard/index.tsx — 引入 useVipStatus,替换 isVipMember()
  • 原理useVipStatus 在组件挂载时异步调用 checkAndCacheVipStatus 查询后端并更新缓存+React statestate 变化触发重渲染,使所有价格显示/计算自动更新为 dealerPrice
  • 验证:npx taro build --type weapp 构建成功