# 2026-07-17 工作日志 ## 门店订单管理页改造(src/pages/store/orders/index.tsx) ### 1. 删除订单改为关闭订单 - 原"删除订单"按钮调用 `removeShopOrder`(物理删除),改为"关闭订单"调用 `updateShopOrder({ orderId, orderStatus: 2 })`(逻辑关闭) - 确认弹窗文案从"删除后无法恢复"改为"关闭后无法恢复" - 移除 `removeShopOrder` 导入,新增 `confirmOfflinePayment` 导入 ### 2. 待付款订单加确认收款按钮 - **背景**:线下付款(payType=9)且未付款的订单,门店需要"确认收款"功能,与后台管理(guilixu-admin)对齐 - **后端接口**:`PUT /shop/shop-order/confirm-offline-payment/{id}?remarks=xxx&paymentVoucher=xxx` - 后端 `ShopOrderController.confirmOfflinePayment()` → `ShopOrderServiceImpl.confirmOfflinePayment()` - 校验:payType必须为9(线下付款)、orderStatus不能为2(已关闭)、不能重复确认 - 确认后设置 payStatus=true、payTime=now(),可选保存 remarks(merchantRemarks) 和 paymentVoucher - **前端API**:在 `src/api/shop/shopOrder/index.ts` 新增 `confirmOfflinePayment(id, remarks?, paymentVoucher?)` 函数 - 注意:Taro 的 `request.put` 不支持 `params` 参数,需手动拼接 query string - **ShopOrder Model**:新增 `paymentVoucher?: string` 字段 - **页面改动**: - OpType 从 `'pay'|'complete'|'editPrice'` 改为 `'confirmPay'|'complete'|'editPrice'` - `getOrderActions` 新增条件:`!payStatus && payType===9 && orderStatus===0` → 显示"确认收款"按钮 - 弹窗新增备注 Textarea(仅 confirmPay 显示),凭证图片限制1张(confirmPay),必填校验 - `submitOperation` 新增 confirmPay 分支,调用 `confirmOfflinePayment` API - 新增 `payRemarks` state ### 3. 订单详情页金额明细0隐藏(src/pages/order/detail.tsx) - **Bug**:React 经典陷阱 `{order.reducePrice && Number(order.reducePrice) > 0 && (...)}`,当 reducePrice 为数字 0 时,`0 && ...` 短路求值为 0,React 渲染文本"0" - **修复**:改为 `{Number(order.reducePrice || 0) > 0 && (...)}`,始终返回 boolean ### 验证 - `npx taro build --type weapp` 构建成功 ## 地址/购物车问题修复 ### 5. 地图选择首次打开列表不显示(src/pages/user/address-edit.tsx) - **问题**:鸿蒙手机首次打开 `Taro.chooseLocation` 时地图 POI 列表不显示,需拖动才出现 - **根因**:未传入经纬度时地图默认定位到北京,鸿蒙系统不会自动获取用户位置 - **修复**:调 `chooseLocation` 前先 `Taro.getLocation({ type: 'gcj02' })` 获取当前位置,将 latitude/longitude 传给地图,确保首次打开就在用户位置附近,POI 列表立即加载 ### 6. 收货地址编辑不加载旧数据 - **Bug 1(API 路径不匹配)**:前端 `updateShopUserAddress` 调 `PUT /shop/shop-user-address/{id}`,但后端 `@PutMapping()` 无 `/{id}` 路径 → 404 - 修复:改为 `PUT /shop/shop-user-address`(去掉 `/{id}`,id 通过 body 传递) - **Bug 2(加载防御)**:`setFormData(addr)` 直接替换 state,若后端返回 null 字段会覆盖初始 `''` - 修复:改为 `setFormData(prev => ({...prev, ...addr, name: addr.name || '', ...}))` 保证字段非 null ### 7. 新用户注册后首次加购购物车不刷新 - **根因**:注册页 `register.tsx` 和登录页 `login.tsx` 只调 `saveStorageByLoginUser()` 存 storage,未调 `UserContext.loginUser()` 更新 React 状态 → `isLoggedIn` 仍为 `false` → 购物车页 `useDidShow` 中 `if (isLoggedIn) refresh()` 不执行 - **修复**: 1. `register.tsx` 和 `login.tsx`:`saveStorageByLoginUser` 后加 `loginUser(token, user)` 同步 UserContext 2. `sms-login.tsx`:`loginBySms` 后加 `syncFromStorage()` 同步状态 3. 防御性措施:`cart.tsx`、`product-detail.tsx`、`index/index.tsx` 的 `useDidShow` 加 `syncFromStorage()` 确保页面显示时从 storage 同步用户状态 ### 验证 - `npx taro build --type weapp` 构建成功