- 门店中心右上角新增扫码登录按钮,使用base64 SVG图标兼容小程序Image组件渲染 - 扫码后通过解析二维码内容调用confirmWechatQRLogin接口完成PC端登录确认 - 支持扫码取消静默处理,扫码失败则弹窗提示错误信息 - 优化门店中心页面布局,调整扫码按钮绝对定位及样式 - 优化了用户管理页面的小型样式,包括按钮和文本间距调整 - 调整用户页面部分Badge显示逻辑,排除tabIndex为4的项不显示角标
10 KiB
10 KiB
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
- 注意:Taro 的
- ShopOrder Model:新增
paymentVoucher?: string字段 - 页面改动:
- OpType 从
'pay'|'complete'|'editPrice'改为'confirmPay'|'complete'|'editPrice' getOrderActions新增条件:!payStatus && payType===9 && orderStatus===0→ 显示"确认收款"按钮- 弹窗新增备注 Textarea(仅 confirmPay 显示),凭证图片限制1张(confirmPay),必填校验
submitOperation新增 confirmPay 分支,调用confirmOfflinePaymentAPI- 新增
payRemarksstate
- OpType 从
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()不执行 - 修复:
register.tsx和login.tsx:saveStorageByLoginUser后加loginUser(token, user)同步 UserContextsms-login.tsx:loginBySms后加syncFromStorage()同步状态- 防御性措施:
cart.tsx、product-detail.tsx、index/index.tsx的useDidShow加syncFromStorage()确保页面显示时从 storage 同步用户状态
门店订单页 Tab 改造(src/pages/store/orders/index.tsx)
- 需求:原「全部 / 已完成 / 已关闭」Tab 改为「待处理 / 已完成 / 已关闭」
- 待处理 = 待付款(0) + 待发货(1) + 待核销(2) + 待收货(3),按用户确认把待核销(2)也并入
- 已完成 = statusFilter 5(不变);已关闭 = statusFilter 8(不变)
- TabKey 类型:
'all' | 'pending' | 'completed'→'pending' | 'completed' | 'closed' - TABS 配置:删除原「全部」无筛选 Tab;待处理用 params 数组
[{statusFilter:0},{1},{2},{3}]并行请求合并去重(loadOrders 已支持) - 默认选中:
useState<TabKey>('all')→'pending' - 新订单角标:
tab.key === 'all'→tab.key === 'pending'(移到待处理 Tab) - statusFilter 后端映射参考(ShopOrderMapper.xml 第240-282行):0待支付=未付款、1待发货=pay1&delivery10&order0、2待核销=pay1&order0、3待收货=delivery20&order!=1、5已完成=order1、8已取消=order2
- 验证:tsc 仅剩预存
@tarojs/taro类型缺失环境报错,本文件无新错误 - ⚠️ 注意:原「全部」Tab 显示的「待评价(statusFilter=4)」订单在改版后无 Tab 承接(用户确认不含待评价),如需可见后续可并入待处理
门店订单页「收货信息」一键导航(src/pages/store/orders/index.tsx)
- 需求:订单卡片里的收货信息区域点击可一键导航
- 实现:
renderOrderCard的「收货信息」整块 View 加onClick={() => handleNavigate(order)},右侧加绿色「› 导航」标识提示可点 - 新增
handleNavigate(order):读取order.addressLat/order.addressLng(模型里为 string)→parseFloat转 number;坐标有效则Taro.openLocation({ latitude, longitude, name: realName, address, scale: 16 })(微信内置地图,自带导航选 App);坐标缺失/非法则 toast「该订单未记录定位信息,无法导航」兜底 - 注意:
Taro.openLocation是地图展示类 API,不在微信requiredPrivateInfos受限清单内,无需在小程序后台声明、无需ensurePrivacyAuthorized预检(与 chooseImage/getPhoneNumber 不同) - 验证:tsc 仅剩预存
@tarojs/taro类型缺失环境报错,本文件无新错误
订单详情页「过期时间」→「送达时间」(src/pages/order/detail.tsx)
- 需求:订单信息区原「过期时间」(order.expirationTime) 行改为「送达时间」
- 字段确认:用户选择「送达时间」用
order.deliveryTime,且保留现有「发货时间」行 →deliveryTime在两行各显示一次(用户明知并接受) - 改动:第408-413行
{order.expirationTime && ...过期时间}改为{order.deliveryTime && ...送达时间},数据用formatTime(order.deliveryTime)
门店订单页「发货」按钮 + 选发货人员写 shopOrderDelivery(解决物流页发货信息为空)
- 根因:物流页
pages/order/logistics.tsx的「发货信息」卡片依赖shopOrderDelivery发货单;门店「确认完成」只改订单状态、不建发货单 →delivery为 null → 卡片不渲染(空白) - 方案:在「确认收款」之后加「发货」按钮,选门店店员作为发货人,写入
shopOrderDelivery,从源头让物流页有数据 - 后端可行性(已确认):
POST /shop/shop-order-delivery(save) 已存在,实体字段全可空最少传 orderId;listShopStoreUser({storeId})已存在;请求层自动注入TenantId请求头(无需手动传租户);ShopOrderDelivery实体有 orderId/deliveryMethod/sendName/sendPhone/sendAddress - 前端改动:
- 新增
src/api/shop/shopOrderDelivery/index.ts:saveShopOrderDelivery(data)封装POST /shop/shop-order-delivery - 补全
src/api/shop/shopStoreUser/model的ShopStoreUser类型缺的name/phone/roleType/storeName/image(前端模型此前不完整,后端实体有) src/pages/store/orders/index.tsx:OpType增加'ship';OP_LABEL/OP_DESC补 shipgetOrderActions:已付款 且deliveryStatus<20(或未发货)且orderStatus!==1时显示「发货」(紫色bg-purple-500)- 新增状态
showShipModal/clerkList/selectedClerkId/loadingClerks/shipping - 新增
openShipModal(order)(拉listShopStoreUser({storeId: order.storeId}))与handleConfirmShip()(先saveShopOrderDelivery({orderId, deliveryMethod:20, sendName:clerk.name, sendPhone:clerk.phone, sendAddress:order.storeName}),再updateShopOrder({orderId, deliveryStatus:20, deliveryTime})) - 渲染「选择发货人员」底部弹层(店员列表可点选,确认发货按钮置灰直到选中)
- 新增
- 设计决策(用户确认):① 发货即把订单置「已发货」(deliveryStatus=20);② 发货人可选门店全部店员(经理+店员)
- 物流页:无需改动,
shopOrderDelivery存在即自动渲染发货人 - 验证:tsc 仅剩预存
@tarojs/taro类型缺失环境报错,本文件无新错误 - ⚠️ 行为说明:已付款未发货时「发货」与「确认完成」两个按钮同时显示;店员可跳过发货直接确认完成(该订单仍无发货单,物流页空白,与旧行为一致);如需强制「先发货才能确认完成」,可隐藏未发货订单的「确认完成」按钮(一行判断改动),待用户决定
验证
npx taro build --type weapp构建成功
门店中心右上角扫码登录 PC 后台(src/pages/store/center/index.tsx)
- 需求:门店中心顶部绿色渐变区右上角加一个二维码扫码图标,点击后调起微信扫码,扫码结果解析出 token 后调
confirmWechatQRLogin确认 PC 端登录 - 参考:
/Users/gxwebsoft/VUE/template-10584/src/pages/user/components/UserCard.tsx中的UnifiedQRButton组件 - 实现:
- 复用已有 API:
parseQRContent+confirmWechatQRLogin(@/api/passport/qr-login),与src/components/QRLoginScanner.tsx同款 - 新增
handleScanLogincallback:Taro.scanCode→parseQRContent→ 校验 token/userId →confirmWechatQRLogin→ 成功弹窗 - 右上角按钮用
absolute top-3 right-4 z-20定位,半透明白色圆形背景 + base64 SVG 图标 - 小程序不支持
<svg>标签,用Image组件 +data:image/svg+xml;base64,...data URI 渲染图标 - 用户取消扫码(errMsg 含 'cancel')静默处理
- 复用已有 API: