修复bug问题

This commit is contained in:
胡圣锋 2025-11-23 13:35:36 +08:00
parent eea951ea09
commit 7e89a79567
5 changed files with 370 additions and 37 deletions

View File

@ -6,7 +6,7 @@ spring:
druid: druid:
# 主库数据源 # 主库数据源
master: master:
url: jdbc:mysql://1.15.149.240:3306/ry_xinli?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true url: jdbc:mysql://127.0.0.1:3306/ry_xinli?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: ry_xinli username: ry_xinli
password: ZLZBcfGtsWJe5r4z password: ZLZBcfGtsWJe5r4z
# 从库数据源 # 从库数据源

View File

@ -463,6 +463,17 @@ public class SysUserServiceImpl implements ISysUserService
userRoleMapper.deleteUserRoleByUserId(userId); userRoleMapper.deleteUserRoleByUserId(userId);
// 删除用户与岗位表 // 删除用户与岗位表
userPostMapper.deleteUserPostByUserId(userId); userPostMapper.deleteUserPostByUserId(userId);
// 删除用户的量表权限支持多用户授权后一个用户可能有多条权限记录
try {
com.ddnai.system.service.psychology.IPsyScalePermissionService permissionService =
SpringUtils.getBean(com.ddnai.system.service.psychology.IPsyScalePermissionService.class);
if (permissionService != null) {
permissionService.deletePermissionByUserId(userId);
}
} catch (Exception e) {
log.warn("删除用户量表权限失败userId: {}", userId, e);
// 不中断删除流程继续删除用户
}
return userMapper.deleteUserById(userId); return userMapper.deleteUserById(userId);
} }
@ -485,6 +496,24 @@ public class SysUserServiceImpl implements ISysUserService
userRoleMapper.deleteUserRole(userIds); userRoleMapper.deleteUserRole(userIds);
// 删除用户与岗位关联 // 删除用户与岗位关联
userPostMapper.deleteUserPost(userIds); userPostMapper.deleteUserPost(userIds);
// 删除用户的量表权限支持多用户授权后一个用户可能有多条权限记录
try {
com.ddnai.system.service.psychology.IPsyScalePermissionService permissionService =
SpringUtils.getBean(com.ddnai.system.service.psychology.IPsyScalePermissionService.class);
if (permissionService != null) {
for (Long userId : userIds) {
try {
permissionService.deletePermissionByUserId(userId);
} catch (Exception e) {
log.warn("删除用户量表权限失败userId: {}", userId, e);
// 继续处理其他用户
}
}
}
} catch (Exception e) {
log.warn("获取权限服务失败,跳过删除用户量表权限", e);
// 不中断删除流程继续删除用户
}
return userMapper.deleteUserByIds(userIds); return userMapper.deleteUserByIds(userIds);
} }

View File

@ -106,6 +106,38 @@ public class PsyScalePermissionServiceImpl implements IPsyScalePermissionService
{ {
permission.setStatus("0"); permission.setStatus("0");
} }
// 检查是否已存在相同的权限记录避免重复
PsyScalePermission query = new PsyScalePermission();
query.setScaleId(permission.getScaleId());
query.setUserId(permission.getUserId());
query.setRoleId(permission.getRoleId());
query.setDeptId(permission.getDeptId());
query.setClassName(permission.getClassName());
query.setStatus("0"); // 只检查有效状态的权限
List<PsyScalePermission> existing = permissionMapper.selectPermissionList(query);
if (existing != null && !existing.isEmpty())
{
// 检查是否有完全相同的权限记录除了时间范围
boolean hasDuplicate = existing.stream().anyMatch(p -> {
boolean sameUser = (p.getUserId() == null && permission.getUserId() == null)
|| (p.getUserId() != null && p.getUserId().equals(permission.getUserId()));
boolean sameRole = (p.getRoleId() == null && permission.getRoleId() == null)
|| (p.getRoleId() != null && p.getRoleId().equals(permission.getRoleId()));
boolean sameDept = (p.getDeptId() == null && permission.getDeptId() == null)
|| (p.getDeptId() != null && p.getDeptId().equals(permission.getDeptId()));
boolean sameClass = (p.getClassName() == null && permission.getClassName() == null)
|| (p.getClassName() != null && p.getClassName().equals(permission.getClassName()));
return sameUser && sameRole && sameDept && sameClass;
});
if (hasDuplicate)
{
throw new RuntimeException("该权限已存在,请勿重复添加");
}
}
return permissionMapper.insertPermission(permission); return permissionMapper.insertPermission(permission);
} }

View File

@ -96,15 +96,30 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="用户" prop="userId"> <el-form-item label="用户" prop="userIds">
<el-select v-model="form.userId" placeholder="请选择用户(留空表示所有用户)" clearable filterable style="width: 100%;"> <el-select
v-model="form.userIds"
placeholder="请选择用户(可多选,留空表示所有用户)"
clearable
filterable
multiple
remote
reserve-keyword
:remote-method="searchUsers"
:loading="userSearchLoading"
style="width: 100%;"
collapse-tags
:max-collapse-tags="3">
<el-option <el-option
v-for="user in userList" v-for="user in userOptions"
:key="user.userId" :key="user.userId"
:label="user.userName" :label="user.nickName ? `${user.nickName}${user.userName}` : user.userName"
:value="user.userId"> :value="user.userId">
</el-option> </el-option>
</el-select> </el-select>
<div style="margin-top: 5px; color: #909399; font-size: 12px;">
提示可输入姓名或账号搜索支持多选留空表示所有用户
</div>
</el-form-item> </el-form-item>
<el-form-item label="开始时间" prop="startTime"> <el-form-item label="开始时间" prop="startTime">
<el-date-picker <el-date-picker
@ -145,7 +160,9 @@
<script> <script>
import { listPermission, getPermission, delPermission, addPermission, updatePermission } from "@/api/psychology/permission"; import { listPermission, getPermission, delPermission, addPermission, updatePermission } from "@/api/psychology/permission";
import { listScale } from "@/api/psychology/scale"; import { listScale } from "@/api/psychology/scale";
import { listUser } from "@/api/system/user"; import { allocatedUserList } from "@/api/system/role";
import { listRole } from "@/api/system/role";
import { getUser } from "@/api/system/user";
export default { export default {
name: "PsyScalePermission", name: "PsyScalePermission",
@ -167,8 +184,12 @@ export default {
permissionList: [], permissionList: [],
// //
scaleList: [], scaleList: [],
// //
userList: [], userOptions: [],
//
userSearchLoading: false,
// ID
studentRoleId: null,
// //
title: "", title: "",
// //
@ -218,10 +239,96 @@ export default {
.filter(scale => !scale.sourceType || scale.sourceType === 'scale'); .filter(scale => !scale.sourceType || scale.sourceType === 'scale');
}); });
}, },
/** 加载用户列表 */ /** 加载用户列表(只加载学员角色的用户)- 改为远程搜索模式,不预加载 */
loadUsers() { loadUsers() {
listUser({ status: '0' }).then(response => { // ID
this.userList = response.rows || []; this.getStudentRoleId().then(studentRoleId => {
this.studentRoleId = studentRoleId;
if (!studentRoleId) {
console.warn("未找到学员角色,用户搜索功能可能不可用");
}
//
this.searchUsers("");
}).catch(error => {
console.error("获取学员角色ID失败:", error);
});
},
/** 搜索用户(远程搜索) */
searchUsers(keyword) {
if (!this.studentRoleId) {
// ID
this.getStudentRoleId().then(studentRoleId => {
this.studentRoleId = studentRoleId;
if (studentRoleId) {
this.doSearchUsers(keyword);
}
});
return;
}
this.doSearchUsers(keyword);
},
/** 执行用户搜索 */
doSearchUsers(keyword) {
this.userSearchLoading = true;
const searchParams = {
roleId: this.studentRoleId,
status: '0',
pageNum: 1,
pageSize: 100 // 100使
};
//
if (keyword && keyword.trim()) {
searchParams.userName = keyword.trim();
searchParams.phonenumber = keyword.trim();
}
allocatedUserList(searchParams).then(response => {
const rows = response.rows || [];
// allocatedUserListuserNamephonenumber
let filteredRows = rows;
if (keyword && keyword.trim()) {
const keywordLower = keyword.trim().toLowerCase();
filteredRows = rows.filter(item => {
const userName = (item.userName || '').toLowerCase();
const nickName = (item.nickName || '').toLowerCase();
return userName.includes(keywordLower) || nickName.includes(keywordLower);
});
}
this.userOptions = filteredRows.map(item => ({
userId: item.userId,
userName: item.userName,
nickName: item.nickName
}));
}).catch(error => {
console.error("搜索学员用户失败:", error);
this.userOptions = [];
}).finally(() => {
this.userSearchLoading = false;
});
},
/** 获取学员角色ID */
getStudentRoleId() {
return new Promise((resolve, reject) => {
//
listRole({}).then(response => {
const roles = response.rows || [];
// roleId=101 roleKey='student' roleName''
const studentRole = roles.find(role => {
return (role.roleId === 101) ||
(role.roleKey && role.roleKey.toLowerCase() === 'student') ||
(role.roleName && role.roleName.includes('学员'));
});
if (studentRole && studentRole.roleId) {
resolve(studentRole.roleId);
} else {
// 使101
console.warn("未找到学员角色使用默认值101");
resolve(101);
}
}).catch(error => {
console.error("获取角色列表失败:", error);
// 使101
resolve(101);
});
}); });
}, },
// //
@ -234,7 +341,8 @@ export default {
this.form = { this.form = {
permissionId: undefined, permissionId: undefined,
scaleId: undefined, scaleId: undefined,
userId: undefined, userId: undefined, //
userIds: [], // ID
deptId: undefined, deptId: undefined,
roleId: undefined, roleId: undefined,
className: undefined, className: undefined,
@ -273,30 +381,136 @@ export default {
const permissionId = row.permissionId || this.ids[0]; const permissionId = row.permissionId || this.ids[0];
getPermission(permissionId).then(response => { getPermission(permissionId).then(response => {
this.form = response.data; this.form = response.data;
// formuserIduserIds
if (this.form.userId && !this.form.userIds) {
this.form.userIds = [this.form.userId];
} else if (!this.form.userIds) {
this.form.userIds = [];
}
//
if (this.form.userIds && this.form.userIds.length > 0) {
this.loadSelectedUsers(this.form.userIds);
}
this.open = true; this.open = true;
this.title = "修改量表权限"; this.title = "修改量表权限";
}); });
}, },
/** 加载已选中的用户信息到选项列表 */
loadSelectedUsers(userIds) {
if (!userIds || userIds.length === 0) {
return;
}
// ID
const promises = userIds.map(userId => {
return getUser(userId).then(response => {
const userData = response.data || {};
return {
userId: userData.userId,
userName: userData.userName,
nickName: userData.nickName
};
}).catch(() => null);
});
Promise.all(promises).then(users => {
const validUsers = users.filter(u => u !== null);
//
validUsers.forEach(user => {
if (!this.userOptions.find(u => u.userId === user.userId)) {
this.userOptions.push(user);
}
});
});
},
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
//
const userIds = this.form.userIds || [];
//
if (this.form.permissionId != undefined) { if (this.form.permissionId != undefined) {
updatePermission(this.form).then(response => { //
this.$modal.msgSuccess("修改成功"); const originalPermissionId = this.form.permissionId;
this.open = false;
this.getList(); //
delPermission(originalPermissionId).then(() => {
//
this.createPermissionsForUsers(userIds);
}).catch(error => {
console.error("删除原权限失败:", error);
this.$modal.msgError(error.msg || "修改失败:删除原权限失败");
}); });
} else { } else {
addPermission(this.form).then(response => { //
this.$modal.msgSuccess("新增成功"); this.createPermissionsForUsers(userIds);
this.open = false;
this.getList();
});
} }
} }
}); });
}, },
/** 为多个用户创建权限记录 */
createPermissionsForUsers(userIds) {
if (userIds.length === 0) {
// userIdnull
const addForm = { ...this.form };
delete addForm.userIds;
delete addForm.permissionId;
addForm.userId = null;
addPermission(addForm).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
}).catch(error => {
console.error("新增权限失败:", error);
const errorMsg = error.msg || error.message || "新增失败";
this.$modal.msgError(errorMsg);
});
} else {
//
const promises = userIds.map(userId => {
const addForm = { ...this.form };
delete addForm.userIds;
delete addForm.permissionId;
addForm.userId = userId;
return addPermission(addForm).catch(error => {
// nullreject
if (error.msg && error.msg.includes("已存在")) {
console.warn(`用户 ${userId} 的权限已存在,跳过`);
return { skipped: true, userId };
}
throw error;
});
});
Promise.allSettled(promises).then(results => {
const successCount = results.filter(r => r.status === 'fulfilled' && !r.value?.skipped).length;
const skippedCount = results.filter(r => r.status === 'fulfilled' && r.value?.skipped).length;
const failedCount = results.filter(r => r.status === 'rejected').length;
let message = "";
if (successCount > 0) {
message = `成功为 ${successCount} 个用户分配权限`;
}
if (skippedCount > 0) {
message += (message ? "" : "") + `${skippedCount} 个用户权限已存在(已跳过)`;
}
if (failedCount > 0) {
message += (message ? "" : "") + `${failedCount} 个用户权限分配失败`;
}
if (successCount > 0 || skippedCount > 0) {
this.$modal.msgSuccess(message || "操作完成");
this.open = false;
this.getList();
} else {
this.$modal.msgError(message || "权限分配失败");
}
}).catch(error => {
console.error("批量新增权限失败:", error);
this.$modal.msgError(error.msg || error.message || "批量新增权限失败");
});
}
},
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const permissionIds = row.permissionId || this.ids; const permissionIds = row.permissionId || this.ids;

View File

@ -59,7 +59,9 @@
<script> <script>
import { assignUserScales, getUserScaleIds } from "@/api/psychology/permission"; import { assignUserScales, getUserScaleIds } from "@/api/psychology/permission";
import { listScale } from "@/api/psychology/scale"; import { listScale } from "@/api/psychology/scale";
import { getUser, listUser } from "@/api/system/user"; import { getUser } from "@/api/system/user";
import { allocatedUserList } from "@/api/system/role";
import { listRole } from "@/api/system/role";
export default { export default {
name: "UserScalePermission", name: "UserScalePermission",
@ -129,26 +131,82 @@ export default {
})); }));
}); });
}, },
/** 搜索可切换的用户 */ /** 搜索可切换的用户(只搜索学员角色的用户) */
searchUsers(keyword) { searchUsers(keyword) {
this.userSearchLoading = true; this.userSearchLoading = true;
listUser({ // ID
pageNum: 1, this.getStudentRoleId().then(studentRoleId => {
pageSize: 20, if (!studentRoleId) {
status: '0', this.$modal.msgError("未找到学员角色,无法搜索用户");
userName: keyword, this.userOptions = [];
nickName: keyword this.userSearchLoading = false;
}).then(response => { return;
const rows = response.rows || []; }
this.userOptions = rows.map(item => ({ // 使allocatedUserList
userId: item.userId, allocatedUserList({
userName: item.userName, roleId: studentRoleId,
nickName: item.nickName status: '0',
})); pageNum: 1,
}).finally(() => { pageSize: 1000, //
userName: keyword || undefined,
phonenumber: keyword || undefined
}).then(response => {
const rows = response.rows || [];
// allocatedUserListuserNamephonenumber
let filteredRows = rows;
if (keyword) {
const keywordLower = keyword.toLowerCase();
filteredRows = rows.filter(item => {
const userName = (item.userName || '').toLowerCase();
const nickName = (item.nickName || '').toLowerCase();
return userName.includes(keywordLower) || nickName.includes(keywordLower);
});
}
this.userOptions = filteredRows.map(item => ({
userId: item.userId,
userName: item.userName,
nickName: item.nickName
}));
}).catch(error => {
console.error("搜索学员用户失败:", error);
this.$modal.msgError("搜索学员用户失败");
this.userOptions = [];
}).finally(() => {
this.userSearchLoading = false;
});
}).catch(error => {
console.error("获取学员角色ID失败:", error);
this.$modal.msgError("获取学员角色ID失败");
this.userOptions = [];
this.userSearchLoading = false; this.userSearchLoading = false;
}); });
}, },
/** 获取学员角色ID */
getStudentRoleId() {
return new Promise((resolve, reject) => {
//
listRole({}).then(response => {
const roles = response.rows || [];
// roleId=101 roleKey='student' roleName''
const studentRole = roles.find(role => {
return (role.roleId === 101) ||
(role.roleKey && role.roleKey.toLowerCase() === 'student') ||
(role.roleName && role.roleName.includes('学员'));
});
if (studentRole && studentRole.roleId) {
resolve(studentRole.roleId);
} else {
// 使101
console.warn("未找到学员角色使用默认值101");
resolve(101);
}
}).catch(error => {
console.error("获取角色列表失败:", error);
// 使101
resolve(101);
});
});
},
/** 切换用户 */ /** 切换用户 */
handleUserChange(value) { handleUserChange(value) {
if (!value) { if (!value) {