|
|
@@ -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>
|
|
|
|