修复计划任务绑定人员。视图权限

This commit is contained in:
2025-11-28 18:43:27 +08:00
parent ba0aabdac3
commit fc960265f4
6 changed files with 100 additions and 54 deletions

View File

@@ -318,8 +318,8 @@ INSERT INTO `tb_sys_menu` VALUES
('3000', 'menu_admin_resource_manage', '资源管理', NULL, '', '', 'admin/resource.svg', 3, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:52:40', NULL, 0), ('3000', 'menu_admin_resource_manage', '资源管理', NULL, '', '', 'admin/resource.svg', 3, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:52:40', NULL, 0),
('3001', 'menu_admin_resource', '数据采集', 'menu_admin_resource_manage', '/admin/manage/resource/resource', 'admin/manage/resource/ResourceManagementView', NULL, 1, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0), ('3001', 'menu_admin_resource', '数据采集', 'menu_admin_resource_manage', '/admin/manage/resource/resource', 'admin/manage/resource/ResourceManagementView', NULL, 1, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3002', 'menu_admin_article', '文章管理', 'menu_admin_resource_manage', '/admin/manage/resource/article', 'admin/manage/resource/ArticleManagementView', NULL, 2, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0), ('3002', 'menu_admin_article', '文章管理', 'menu_admin_resource_manage', '/admin/manage/resource/article', 'admin/manage/resource/ArticleManagementView', NULL, 2, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3010', 'menu_article_add', '文章添加', 'menu_admin_article', '/article/add', 'public/article/ArticleAddView', NULL, 1, 3, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0), ('3010', 'menu_article_add', '文章添加', NULL, '/article/add', 'public/article/ArticleAddView', NULL, 1, 3, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('3011', 'menu_article_show', '文章展示', 'menu_admin_article', '/article/show', 'public/article/ArticleShowView', NULL, 2, 3, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0), ('3011', 'menu_article_show', '文章展示', NULL, '/article/show', 'public/article/ArticleShowView', NULL, 2, 3, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
('4000', 'menu_admin_content_manage', '运营管理', NULL, '', '', 'admin/maintain.svg', 4, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:52:42', NULL, 0), ('4000', 'menu_admin_content_manage', '运营管理', NULL, '', '', 'admin/maintain.svg', 4, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:52:42', NULL, 0),
('4001', 'menu_admin_banner', 'Banner管理', 'menu_admin_content_manage', '/admin/manage/content/banner', 'admin/manage/content/BannerManagementView', NULL, 1, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0), ('4001', 'menu_admin_banner', 'Banner管理', 'menu_admin_content_manage', '/admin/manage/content/banner', 'admin/manage/content/BannerManagementView', NULL, 1, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
('4002', 'menu_admin_tag', '标签管理', 'menu_admin_content_manage', '/admin/manage/content/tag', 'admin/manage/content/TagManagementView', NULL, 2, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0), ('4002', 'menu_admin_tag', '标签管理', 'menu_admin_content_manage', '/admin/manage/content/tag', 'admin/manage/content/TagManagementView', NULL, 2, 0, 'SidebarLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),

View File

@@ -116,6 +116,8 @@ public interface LearningTaskService {
*/ */
ResultDomain<TbTaskUser> addTaskUser(String taskID, List<String> userIDs); ResultDomain<TbTaskUser> addTaskUser(String taskID, List<String> userIDs);
ResultDomain<TbTaskUser> updateTaskUser(String taskID, List<String> userIDs);
/** /**
* @description 批量添加任务用户 * @description 批量添加任务用户
* @param taskID 任务ID * @param taskID 任务ID

View File

@@ -117,30 +117,21 @@ public class LearningTaskController {
return learningTaskService.addTaskUser(taskID, userIDs); return learningTaskService.addTaskUser(taskID, userIDs);
} }
/**
* 批量更新任务用户
*/
@PutMapping("/{taskID}/users")
public ResultDomain<TbTaskUser> updateTaskUser(@PathVariable("taskID") String taskID, @RequestBody Map<String, List<String>> map) {
List<String> userIDs = map.get("userIDs");
return learningTaskService.updateTaskUser(taskID, userIDs);
}
@DeleteMapping("/{taskID}/users") @DeleteMapping("/{taskID}/users")
public ResultDomain<Boolean> removeTaskUser(@PathVariable("taskID") String taskID, @RequestBody Map<String, List<String>> map) { public ResultDomain<Boolean> removeTaskUser(@PathVariable("taskID") String taskID, @RequestBody Map<String, List<String>> map) {
List<String> userIDs = map.get("userIDs"); List<String> userIDs = map.get("userIDs");
return learningTaskService.removeTaskUser(taskID, userIDs); return learningTaskService.removeTaskUser(taskID, userIDs);
} }
/**
* 分配任务给用户
*/
@PostMapping("/{taskID}/assign")
public ResultDomain<TbTaskUser> assignTaskToUser(@PathVariable("taskID") String taskID, @RequestParam String userID) {
return null;
// return learningTaskService.assignTaskToUser(taskID, userID);
}
/**
* 从用户移除任务
*/
@DeleteMapping("/{taskID}/user/{userID}")
public ResultDomain<Boolean> removeTaskFromUser(@PathVariable("taskID") String taskID, @PathVariable("userID") String userID) {
return null;
// return learningTaskService.removeTaskFromUser(taskID, userID);
}
/** /**
* 用户获取个人任务列表(用户视角) * 用户获取个人任务列表(用户视角)
*/ */

View File

@@ -111,6 +111,65 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
} }
} }
@Override
public ResultDomain<TbTaskUser> updateTaskUser(String taskID, List<String> userIDs){
ResultDomain<TbTaskUser> resultDomain = new ResultDomain<>();
TbSysUser user = LoginUtil.getCurrentUser();
if (user == null) {
resultDomain.fail("请先登录");
return resultDomain;
}
// 先查询已有人员
List<String> taskUsers = taskUserMapper.selectByTaskId(taskID).stream().map(TbTaskUser::getUserID).toList();
// newList: userIDs中有但taskUsers中没有的需要新增的用户
List<String> newList = userIDs.stream()
.filter(userId -> !taskUsers.contains(userId))
.toList();
// oldList: userIDs和taskUsers都有的保留的用户
List<String> oldList = userIDs.stream()
.filter(taskUsers::contains)
.toList();
// deleteList: taskUsers中有但userIDs中没有的需要删除的用户
List<String> deleteList = taskUsers.stream()
.filter(userId -> !userIDs.contains(userId))
.toList();
// 批量插入新用户
List<TbTaskUser> insertUsers = new ArrayList<>();
for (String userID : newList) {
TbTaskUser taskUser = new TbTaskUser();
taskUser.setId(IDUtils.generateID());
taskUser.setTaskID(taskID);
taskUser.setUserID(userID);
taskUser.setCreator(user.getId());
taskUser.setCreateTime(new Date());
insertUsers.add(taskUser);
}
// 执行批量操作
if (!insertUsers.isEmpty()) {
int insertResult = taskUserMapper.batchInsertTaskUsers(insertUsers);
logger.debug("批量插入任务用户: {}条", insertResult);
}
if (!deleteList.isEmpty()) {
int deleteResult = taskUserMapper.batchDeleteTaskUsers(taskID, deleteList);
logger.debug("批量删除任务用户: {}条", deleteResult);
}
// 更新学习人数:新人数 = 保留的 + 新增的
int newUserCount = oldList.size() + newList.size();
courseMapper.incrementLearnCount(taskID, newUserCount - taskUsers.size());
resultDomain.success("更新任务用户成功", insertUsers);
logger.info("任务{}更新用户成功: 新增{}人, 删除{}人, 保留{}人", taskID, newList.size(), deleteList.size(), oldList.size());
return resultDomain;
}
@Override @Override
public ResultDomain<TbTaskUser> batchAddTaskUsers(String taskID, List<String> userIDs, String deptID) { public ResultDomain<TbTaskUser> batchAddTaskUsers(String taskID, List<String> userIDs, String deptID) {
// TODO Auto-generated method stub // TODO Auto-generated method stub

View File

@@ -110,6 +110,17 @@ export const learningTaskApi = {
return response.data; return response.data;
}, },
/**
* 更新任务用户(统一的添加/删除人员接口)
* @param taskID 任务ID
* @param userIDs 用户ID列表
* @returns Promise<ResultDomain<TaskUser>>
*/
async updateTaskUser(taskID: string, userIDs: string[]): Promise<ResultDomain<TaskUser>> {
const response = await api.put<TaskUser>(`${this.learningTaskPrefix}/${taskID}/users`, { userIDs });
return response.data;
},
/** /**
* 获取用户任务进度 * 获取用户任务进度
* @param userID 用户ID * @param userID 用户ID
@@ -123,29 +134,7 @@ export const learningTaskApi = {
return response.data; return response.data;
}, },
/**
* 分配任务给用户
* @param taskID 任务ID
* @param userID 用户ID
* @returns Promise<ResultDomain<TaskUser>>
*/
async assignTaskToUser(taskID: string, userID: string): Promise<ResultDomain<TaskUser>> {
const response = await api.post<TaskUser>(`${this.learningTaskPrefix}/${taskID}/assign`, null, {
params: { userID }
});
return response.data;
},
/**
* 从用户移除任务
* @param taskID 任务ID
* @param userID 用户ID
* @returns Promise<ResultDomain<boolean>>
*/
async removeTaskFromUser(taskID: string, userID: string): Promise<ResultDomain<boolean>> {
const response = await api.delete<boolean>(`${this.learningTaskPrefix}/${taskID}/user/${userID}`);
return response.data;
},
/** /**
* 用户获取个人任务列表(用户视角) * 用户获取个人任务列表(用户视角)

View File

@@ -699,30 +699,35 @@ async function handleUserSelectConfirm(selectedUsers: any[]) {
saving.value = true; saving.value = true;
try { try {
const userIds = selectedUsers.map(u => u.id!); const selectedUserIds = selectedUsers.map(u => u.id!);
// 计算更新后的用户ID列表
let updatedUserIds: string[];
if (selectorMode.value === 'add') { if (selectorMode.value === 'add') {
// 执行添加操作 // 添加模式:合并现有用户和新选择的用户
for (const userID of userIds) { const currentUserIds = currentUsers.value.map(u => u.id!);
await learningTaskApi.assignTaskToUser(managingTask.value.learningTask.taskID!, userID); updatedUserIds = [...new Set([...currentUserIds, ...selectedUserIds])];
}
ElMessage.success(`成功添加 ${userIds.length} 位人员`);
// 更新当前用户列表 // 更新当前用户列表
currentUsers.value.push(...(selectedUsers as UserVO[])); currentUsers.value.push(...(selectedUsers as UserVO[]));
ElMessage.success(`成功添加 ${selectedUserIds.length} 位人员`);
} else { } else {
// 执行删除操作 // 删除模式:从现有用户中移除选择的用户
for (const userID of userIds) { updatedUserIds = currentUsers.value
await learningTaskApi.removeTaskFromUser(managingTask.value.learningTask.taskID!, userID); .map(u => u.id!)
} .filter(id => !selectedUserIds.includes(id));
ElMessage.success(`成功删除 ${userIds.length} 位人员`);
// 更新当前用户列表 // 更新当前用户列表
currentUsers.value = currentUsers.value.filter(user => currentUsers.value = currentUsers.value.filter(user =>
!userIds.includes(user.id!) !selectedUserIds.includes(user.id!)
); );
ElMessage.success(`成功删除 ${selectedUserIds.length} 位人员`);
} }
// 调用统一的更新接口
await learningTaskApi.updateTaskUser(managingTask.value.learningTask.taskID!, updatedUserIds);
closeSelectorModal(); closeSelectorModal();
loadTaskList(); loadTaskList();
} catch (error) { } catch (error) {