From babcf3643969f7d0c1ed0a2f599391ab97bdc74f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Thu, 23 Jul 2026 17:59:22 +0800
Subject: [PATCH] =?UTF-8?q?feat(user):=20=E8=A1=A5=E5=85=85=E5=BC=80?=
=?UTF-8?q?=E5=8F=91=E8=80=85=E5=AE=A1=E6=A0=B8=E9=80=9A=E8=BF=87=E6=97=B6?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=97=E5=91=98=E8=AE=B0=E5=BD=95=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 引入 addShopStoreUser 接口用于新增门店店员记录
- 新增 clerkStoreId 和 clerkTenantId 状态,保存当前审核店员的门店和租户信息
- 在审核通过后调用 addShopStoreUser,添加申请人为当前门店店员
- 保证只有当 clerkStoreId 存在时才执行新增操作
- 更新工作记录文档,补充审核通过流程中新添加的店员记录步骤
- 保持原有升级开发者逻辑和接口调用不变
---
.idea/workspace.xml | 20 ++++++++++----------
.workbuddy/memory/2026-07-23.md | 13 ++++++++++++-
.workbuddy/memory/MEMORY.md | 2 +-
src/pages/user/vip-review/index.tsx | 18 +++++++++++++++++-
4 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0da0472..f306e58 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -116,15 +116,7 @@
-
-
-
-
- 1775962292970
-
-
-
- 1775962292970
+
@@ -510,7 +502,15 @@
1784799951929
-
+
+
+ 1784800111045
+
+
+
+ 1784800111045
+
+
diff --git a/.workbuddy/memory/2026-07-23.md b/.workbuddy/memory/2026-07-23.md
index ad0aa78..f86510c 100644
--- a/.workbuddy/memory/2026-07-23.md
+++ b/.workbuddy/memory/2026-07-23.md
@@ -20,4 +20,15 @@
- `dist/passport/pay/index.js` 里 `nut-cell|nut-button|nut-divider|nut-price` 全部为 0;按钮编译成 `l.zx`(Taro Button 局部变量名)
- 文件最终 413 行,diff 集中在 import + 渲染区,逻辑(数据获取、JSAPI 支付、状态判断 payStatus vs status)没动
-**遗留**:项目其它页面(passport/{login,forget,register,setting,unified-qr,qr-login}、pages/order/*、pages/booking/*、components/common/{FixedButton,EmptyState}、components/QRLoginScanner)也用了 nutui Button/Checkbox/Input/Card/Tabs/Tag 等。如果以后用户反馈"按钮/输入框看不到或不可点",按同样模式替换即可。这次没改,避免一次改动面太大。
\ No newline at end of file
+**遗留**:项目其它页面(passport/{login,forget,register,setting,unified-qr,qr-login}、pages/order/*、pages/booking/*、components/common/{FixedButton,EmptyState}、components/QRLoginScanner)也用了 nutui Button/Checkbox/Input/Card/Tabs/Tag 等。如果以后用户反馈"按钮/输入框看不到或不可点",按同样模式替换即可。这次没改,避免一次改动面太大。
+
+## vip-review 审核通过补充:添加 shop_store_user 记录
+
+**背景**:之前实现的 `src/pages/user/vip-review/index.tsx` 审核通过只调了 `updateShopDealerApply` + `setUserDeveloper`,漏了"给申请人加一条门店店员记录"。用户 2026-07-23 指出"审核通过的操作,还是要添加一条记录到 shopStoreUser,可能之前理解错了",要求补上。
+
+**修改**(仅前端一个文件):
+- import 增加 `addShopStoreUser`(来自 `@/api/shop/shopStoreUser`)。
+- 新增 state `clerkStoreId` / `clerkTenantId`,在 `getMyClerk()` 成功后写入(店员记录自带 `storeId`/`tenantId`)。
+- `handleApprove` 在 `setUserDeveloper` 之后调 `addShopStoreUser({ userId, storeId: clerkStoreId, tenantId: clerkTenantId, isDelete: 0, comments: '开发者审核通过自动添加' })`,仅当 `clerkStoreId` 存在时执行。
+
+**依赖**:后端 `POST /shop/shop-store-user`(ShopStoreUserController.save,需 `shop:shopStoreUser:save` 权限,店员已有);tenantId 复用审核店员的租户,避免前端另取。
\ No newline at end of file
diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md
index 7070ee7..4c50308 100644
--- a/.workbuddy/memory/MEMORY.md
+++ b/.workbuddy/memory/MEMORY.md
@@ -7,7 +7,7 @@
- 后端仓库:`/Users/gxwebsoft/JAVA/com.gxwebsoft.core`(单 Maven 模块,包名 `com.gxwebsoft` 分包)。
- 标记接口:`PUT /api/system/user/developer/{userId}`(`UserController.setDeveloper` → `UserService.markAsDeveloper`),成功后经 `syncMessageProducer` 同步 websopy。
- 前端调用:`@/api/system/user` 的 `setUserDeveloper(userId)`。
-- **vip-review 审核通过流程(用户 2026-07-22 最终确认)**:前端 `handleApprove` 只调 `setUserDeveloper(userId)`(不碰 `sys_user_role`)。后端 `markAsDeveloper` 做两件事:① 把 `sys_user.is_developer` 置 `1`;② **替换**用户角色为 `developer`——`roleService.getByRoleCode(roleCode=developer, tenantId=用户租户)` 找到角色 → 删掉该用户现有 `sys_user_role` → 只绑定 developer 这一个角色,**不与原角色并存**(角色替换包 try/catch,失败不影响 isDeveloper 落库)。即"升级为开发者 = 单角色 developer + isDeveloper 标记位",不是新增第二个角色。
+- **vip-review 审核通过流程(用户 2026-07-22 最终确认,2026-07-23 补充)**:前端 `handleApprove` 依次调 ① `updateShopDealerApply(applyStatus=20)`;② `setUserDeveloper(userId)`(不碰 `sys_user_role`);③ **`addShopStoreUser`**——在当前门店下给申请人补一条 `shop_store_user`(店员)记录(`userId=申请人, storeId=审核店员所属门店, tenantId=同店员, isDelete=0`)。后端 `markAsDeveloper` 做两件事:① 把 `sys_user.is_developer` 置 `1`;② **替换**用户角色为 `developer`——`roleService.getByRoleCode(roleCode=developer, tenantId=用户租户)` 找到角色 → 删掉该用户现有 `sys_user_role` → 只绑定 developer 这一个角色,**不与原角色并存**(角色替换包 try/catch,失败不影响 isDeveloper 落库)。即"升级为开发者 = 单角色 developer + isDeveloper 标记位 + 一条门店店员记录",不是新增第二个角色。审核店员的 `storeId/tenantId` 来自 `getMyClerk()` 返回值(存于 `clerkStoreId/clerkTenantId` state)。
- 注意:前端 `vip-review` / `vip-upgrade` 等页面的变量名仍残留 `VIP_ROLE_*`、`pendingVipCount`、`dealerPrice` 等旧标识符(仅文案改成了「开发者」),后端角色与缓存 key 仍对应这些旧名,重命名需谨慎。
### 后端代码风格(com.gxwebsoft.core)
diff --git a/src/pages/user/vip-review/index.tsx b/src/pages/user/vip-review/index.tsx
index 0d21a3b..79fee6d 100644
--- a/src/pages/user/vip-review/index.tsx
+++ b/src/pages/user/vip-review/index.tsx
@@ -4,7 +4,7 @@ import Taro, { useDidShow } from '@tarojs/taro'
import { listShopDealerApply, updateShopDealerApply } from '@/api/shop/shopDealerApply'
import type { ShopDealerApply } from '@/api/shop/shopDealerApply/model'
import { setUserDeveloper } from '@/api/system/user'
-import { getMyClerk } from '@/api/shop/shopStoreUser'
+import { getMyClerk, addShopStoreUser } from '@/api/shop/shopStoreUser'
definePageConfig({
navigationBarTitleText: '开发者审核',
@@ -44,6 +44,8 @@ const VipReviewPage: React.FC = () => {
const [loading, setLoading] = useState(false)
const [submitting, setSubmitting] = useState(false)
const [isClerk, setIsClerk] = useState(false)
+ const [clerkStoreId, setClerkStoreId] = useState()
+ const [clerkTenantId, setClerkTenantId] = useState()
const loadingRef = useRef(false)
// 验证当前用户是否为店员
@@ -52,6 +54,9 @@ const VipReviewPage: React.FC = () => {
.then(data => {
if (data) {
setIsClerk(true)
+ // 记录当前店员所属门店与租户,审核通过时用于给申请人添加店员记录
+ setClerkStoreId(data.storeId)
+ setClerkTenantId(data.tenantId)
} else {
setIsClerk(false)
Taro.showToast({ title: '仅门店店员可访问', icon: 'none' })
@@ -132,6 +137,17 @@ const VipReviewPage: React.FC = () => {
// 审核通过:升级为开发者(后端 markAsDeveloper 会置 is_developer=1 并把角色替换为 developer)
await setUserDeveloper(item.userId!)
+ // 审核通过:在当前门店下给申请人添加一条店员(shop_store_user)记录
+ if (clerkStoreId) {
+ await addShopStoreUser({
+ userId: item.userId!,
+ storeId: clerkStoreId,
+ tenantId: clerkTenantId,
+ isDelete: 0,
+ comments: '开发者审核通过自动添加',
+ })
+ }
+
Taro.showToast({ title: '已通过', icon: 'success' })
loadList(activeTab)
} catch (e: any) {