xzc преди 6 дни
родител
ревизия
7f8bd95a4f
променени са 2 файла, в които са добавени 21 реда и са изтрити 5 реда
  1. 1 1
      yudao-ui-admin-vue3/src/api/system/role/index.ts
  2. 20 4
      yudao-ui-admin-vue3/src/views/system/role/RoleAssignUserForm.vue

+ 1 - 1
yudao-ui-admin-vue3/src/api/system/role/index.ts

@@ -66,6 +66,6 @@ export const getRoleUserIdList = async (roleId: number): Promise<string[]> => {
 }
 
 // 批量分配用户角色
-export const assignRoleUsers = async (data: { roleId: string; userIds: string[] }) => {
+export const assignRoleUsers = async (data: { roleId: string; userIds?: string[]; removeUserIds?: string[] }) => {
   return await request.post({ url: '/system/user/assign-role-batch', data })
 }

+ 20 - 4
yudao-ui-admin-vue3/src/views/system/role/RoleAssignUserForm.vue

@@ -47,6 +47,8 @@ const formRef = ref()
 const userList = ref<any[]>([])
 // 已选中的用户 ID 列表
 const selectedUserIdList = ref<string[]>([])
+// 打开弹窗时的原始已选用户 ID(用于计算新增/移除)
+const originalUserIds = ref<string[]>([])
 
 /** 打开弹窗 */
 const open = async (row: RoleApi.RoleVO) => {
@@ -62,11 +64,16 @@ const open = async (row: RoleApi.RoleVO) => {
       UserApi.getSimpleUserList(),
       RoleApi.getRoleUserIdList(row.id)
     ])
+    // 统一将 id 转为字符串,避免 el-transfer 因类型不一致(number vs string)导致无法移除
     userList.value = allUsers.map((item) => ({
       ...item,
+      id: String(item.id),
       nickname: `${item.nickname}${item.employeeNo ? `(${item.employeeNo})` : ''}`
     }))
-    selectedUserIdList.value = existingUserIds || []
+    const userIdSet = new Set(userList.value.map((u) => u.id))
+    selectedUserIdList.value = (existingUserIds || []).map(String).filter((id) => userIdSet.has(id))
+    // 保存原始已选用户 ID,用于提交时计算新增/移除
+    originalUserIds.value = [...selectedUserIdList.value]
   } finally {
     formLoading.value = false
   }
@@ -82,13 +89,21 @@ const submitForm = async () => {
   }
   formLoading.value = true
   try {
-    if (selectedUserIdList.value.length === 0) {
-      message.warning('请至少选择一个用户')
+    // 计算新增用户(当前选中但原来不在)
+    const currentSet = new Set(selectedUserIdList.value)
+    const originalSet = new Set(originalUserIds.value)
+    const addUserIds = selectedUserIdList.value.filter((id) => !originalSet.has(id))
+    // 计算移除用户(原来在但当前未选中)
+    const removeUserIds = originalUserIds.value.filter((id) => !currentSet.has(id))
+
+    if (addUserIds.length === 0 && removeUserIds.length === 0) {
+      message.warning('未做任何更改')
       return
     }
     await RoleApi.assignRoleUsers({
       roleId: String(formData.roleId),
-      userIds: selectedUserIdList.value
+      userIds: addUserIds.length > 0 ? addUserIds : undefined,
+      removeUserIds: removeUserIds.length > 0 ? removeUserIds : undefined
     })
     message.success('分配用户成功')
     dialogVisible.value = false
@@ -102,6 +117,7 @@ const submitForm = async () => {
 const resetForm = () => {
   userList.value = []
   selectedUserIdList.value = []
+  originalUserIds.value = []
 }
 </script>