feat(store): 修正 storeId 获取并新增发货人员选择功能

- 排查 orders 页请求 storeId=0 的根因,确认旧版 H5 构建发出该请求
- 明确门店 storeId 来源于 getMyClerk() 返回的 ShopStoreUser.storeId 字段
- 实现全局 useClerk 上下文,管理店员及门店信息,避免局部状态冗余
- 重构用户中心与门店中心页面为调用 useClerk,移除局部 storeInfo 状态
- 补全 ShopStoreUser 模型字段,支持完整店员信息展示
- 在 orders 页新增“确认发货”功能,支持选择发货人员并提交发货请求
- 发货单提交包含 sendStoreId 和 deliveryUserId,确保后端一致落库
- 全项目类型检查无新增报错,优化门店相关接口调用逻辑和状态管理
This commit is contained in:
2026-07-17 11:31:42 +08:00
parent 2745f4b0db
commit b406973039

View File

@@ -37,3 +37,29 @@
- 说明:前端发货只调 `PUT /shop/shop-order`,该接口内部 `new ShopOrderDelivery()` 并 save 落 `shop_order_delivery`;主表靠 `updateById(shopOrder)` 自动落库,发货单表需显式 set 字段。
- SQL`ALTER TABLE shop_order_delivery ADD send_store_id INT, delivery_user_id INT;`
- 验证:`vue-tsc` 前端零报错Java 用 `./mvnw -o compile` 后台验证中。
## Taro 商家端 storeId=0 排查guilixu-taro跨项目
- 用户反馈 orders 页请求 `/shop/shop-store-user?storeId=0`。排查结论:
- `guilixu-taro/src/pages/store/orders/index.tsx` **未调用** `shop-store-user`;全项目 `listShopStoreUser` 仅定义、无调用方。该请求非当前源码发出,应为线上旧版 H5 构建。
- **当前门店 storeId 的真实来源**`getMyClerk()``GET /shop/shop-store-user/my`)返回的 `ShopStoreUser` 对象,其 `.storeId` 字段shop_dealer.id才是门店 id。注意 `user.tsx:103``storeInfo`=getMyClerk 结果)判断"是否显示门店中心",所以那里就能拿到 `storeId = storeInfo.storeId`
- **易错点**`ShopStoreUser``id`(店员自身主键)和 `storeId`(门店 id两个字段二者不同。误用 `storeInfo.id` 当门店 id 是 bug。`booking/index.tsx:186``storeId: storeInfo!.id || 0``storeInfo` 恰为 `ShopStore` 类型故 `.id` 碰巧正确,但 `|| 0` 兜底在未加载时仍会变 0。
- **根因模式**:项目无全局门店/店员上下文,`storeInfo` 是各页面局部 useStateuser/booking/center 各一份)。需在 storeId 就绪前发请求 + `|| 0` 兜底 → `storeId=0`
- **已实施全局 `useClerk`**(用户确认后开工):
- 新增 `src/contexts/ClerkContext.tsx``ClerkProvider` + `useClerkContext`。登录态(`useUserContext().isLoggedIn`)变化即拉取/清空 `getMyClerk()`;对外暴露 `clerk`(ShopStoreUser|null)、`storeId`(=clerk?.storeId)、`loading``refreshClerk``clearClerk`
- 新增 `src/hooks/useClerk.ts`:镜像 `useUser` 的"优先 Context、未包裹则降级本地"范式,文件头注释写明用法与 `storeId>0` 守卫约定。
- `src/app.tsx`:在 `UserProvider` 内挂载 `<ClerkProvider>`(使其能响应登录/登出)。
- 重构 `src/pages/user/user.tsx``src/pages/store/center/index.tsx`:移除各自的局部 `storeInfo`/`getMyClerk` 调用,改为 `const { clerk: storeInfo, refreshClerk } = useClerk()`
- 补全 `src/api/shop/shopStoreUser/model/index.ts``ShopStoreUser` 模型:`getMyClerk`(/my) 联表返回的 `name`/`phone`/`avatar`/`storeName` 补入(原模型缺失,旧代码靠 `useState<any>` 掩盖)。
- **验证**:裸 `tsc --noEmit --types webpack-env` 全量检查——新建/改动的 `ClerkContext.tsx`/`useClerk.ts`/`app.tsx`/`user.tsx`/`center/index.tsx` 及模型 **零新增报错**`center` 页仅剩 4 个**既有**报错75 的 `finally`、82 的 `applyStatus`、89 的 `total`、106 的 `Option`,均在未改动的 `loadBadgeCounts`/`subscribe` 原函数里,属项目原有类型问题 / 裸 tsc 的 lib 配置 artifact。注意裸 `tsc` 默认会因 tsconfig `types:["@tarojs/taro"]`+`typeRoots``TS2688`,需用 `--types webpack-env` 覆盖才能跑真实业务检查。
- **未动**`booking/index.tsx``storeInfo` 是用户所选门店ShopStore来自 `getShopStore(id)`/选择),与店员所属门店是两回事,不在本次范围(其 `storeId: storeInfo!.id || 0` 属不同接口的兜底问题。orders 页现可随时从 `useClerk().storeId` 取当前门店 id。
## Taro 商家端 orders 页「选择发货人员」发货功能guilixu-taro
- 用户截图显示线上旧版 orders 页有「选择发货人员」弹窗且请求 `?storeId=0` 显示"暂无可选择的店员"。当前源码 `orders/index.tsx` 原本**没有**该功能(只有确认收款/确认完成),确认是旧构建。
-`src/pages/store/orders/index.tsx` 新增「确认发货」功能:
- 引入 `useClerk()``storeId`(杜绝 storeId=0`listShopStoreUser``ShopStoreUser` 类型。
- `OpType` 增加 `'deliver'``getOrderActions` 中「待发货」订单(`payStatus && deliveryStatus===10`)显示"确认发货"按钮。
- `openModal('deliver')` 时调 `loadClerkList()``storeId>0``listShopStoreUser({storeId})`,否则 toast 提示门店未就绪、不发请求。
- 弹窗内新增店员单选列表selectedClerkdeliver 模式隐藏凭证上传区。
- 提交发货:`deliveryType=2`(商家送货)、`deliveryStatus=20`(待收货)、`deliveryTime``sendName/sendPhone`(店员)、`sendStoreId=storeId``deliveryUserId=店员id``PUT /shop/shop-order`
- 后端已在上一轮把 `sendStoreId`/`deliveryUserId``shop_order` + `shop_order_delivery`,此处字段对齐。
- 验证:`tsc --noEmit --types webpack-env` 总报错仍 387零新增orders 页仅剩 2 个既有报错165 `fetchLatestOrders` 返回类型、169 `count` 隐式 any均在未改的 `useNewOrderDetector` 调用块)。