From d5b30e2f084da3918916832065027c08fe1371e2 Mon Sep 17 00:00:00 2001 From: zhihao <18915542763@163.com> Date: Fri, 1 May 2026 02:35:48 +0800 Subject: [PATCH] =?UTF-8?q?czh-20260501-=E5=A2=9E=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=BA=A7=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TaskListController.java | 12 ++ .../modules/tasklist/entity/TaskList.java | 10 ++ .../tasklist/entity/TaskListFavorite.java | 8 + .../tasklist/mapper/TaskListMapper.java | 11 ++ .../tasklist/mapper/xml/TaskListMapper.xml | 52 +++++- .../tasklist/service/ITaskListService.java | 1 - .../impl/TaskListDetialServiceImpl.java | 69 ++++++++ .../service/impl/TaskListServiceImpl.java | 167 +++++++++++++++--- .../tasklist/vo/CreateTaskListReq.java | 3 + .../modules/tasklist/vo/TaskListPage.java | 10 ++ 10 files changed, 315 insertions(+), 28 deletions(-) diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java index 2aabd98..09af75d 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/controller/TaskListController.java @@ -531,4 +531,16 @@ public class TaskListController { return Result.OK(list); } + @AutoLog(value = "任务清单表-获取当前用户密级") + @Operation(summary = "获取当前用户密级") + @GetMapping(value = "/getCurrentUserSecurityLevel") + public Result getCurrentUserSecurityLevel() { + LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + Integer level = loginUser.getUserSecurityLevel(); + if (level == null) { + level = 3; + } + return Result.OK("查询成功", level); + } + } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java index 73d494a..9cf95b5 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskList.java @@ -71,6 +71,16 @@ public class TaskList implements Serializable { @Schema(description = "协作者名称") private java.lang.String collaboratorNames; + /**密级: 1=非密, 2=内部, 3=秘密, 4=机密*/ + @Excel(name = "密级", width = 15) + @Schema(description = "密级:1=非密,2=内部,3=秘密,4=机密") + private java.lang.Integer secretLevel; + + /**密级文本*/ + @Excel(name = "密级文本", width = 15) + @Schema(description = "密级文本") + private java.lang.String secretText; + @TableField(exist = false) @Schema(description = "创建时间字符串") private java.lang.String createTimeStr; diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java index d4f3ba4..6ecd951 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/entity/TaskListFavorite.java @@ -84,6 +84,14 @@ public class TaskListFavorite implements Serializable { @TableLogic private java.lang.String delFlag; + @TableField(exist = false) + @Schema(description = "清单密级") + private java.lang.Integer secretLevel; + + @TableField(exist = false) + @Schema(description = "清单密级文本") + private java.lang.String secretText; + @TableField(exist = false) @Schema(description = "当前用户对该清单的权限") private java.lang.String permission; diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java index 5ae878a..ee19690 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/TaskListMapper.java @@ -14,4 +14,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface TaskListMapper extends BaseMapper { + /** + * 查询当前用户可见的所有清单(包含部门、所有者、协作者、任务负责人/参与人维度) + * @param userId 当前用户ID + * @param userSecLevel 当前用户密级 + * @param orgCode 当前用户部门编码 + * @return 可见清单列表 + */ + List selectVisibleLists(@Param("userId") String userId, + @Param("userSecLevel") Integer userSecLevel, + @Param("orgCode") String orgCode); + } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml index 027ad6e..d6aac66 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/mapper/xml/TaskListMapper.xml @@ -2,4 +2,54 @@ - \ No newline at end of file + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java index ffc0c8d..9d35c89 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/ITaskListService.java @@ -97,5 +97,4 @@ public interface ITaskListService extends IService { List myResponsibleTasks(); List myFollowedTasks(); - } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java index 54fd480..46a7149 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListDetialServiceImpl.java @@ -1,8 +1,10 @@ package org.jeecg.modules.demo.tasklist.service.impl; +import org.jeecg.modules.demo.tasklist.entity.TaskList; import org.jeecg.modules.demo.tasklist.entity.TaskListDetial; import org.jeecg.modules.demo.tasklist.entity.TaskListPermission; import org.jeecg.modules.demo.tasklist.mapper.TaskListDetialMapper; +import org.jeecg.modules.demo.tasklist.mapper.TaskListMapper; import org.jeecg.modules.demo.tasklist.mapper.TaskListPermissionMapper; import org.jeecg.modules.demo.tasklist.service.ITaskListDetialService; import org.jeecg.modules.demo.tasklist.vo.CreateTaskReq; @@ -20,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import java.util.Date; import java.util.LinkedHashSet; import java.util.List; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import java.util.Set; @@ -29,6 +32,8 @@ public class TaskListDetialServiceImpl extends ServiceImpl validIds = new java.util.ArrayList<>(); + for (String id : ids) { + LoginUser user = sysBaseAPI.getUserById(id.trim()); + if (user == null) { + continue; + } + Integer userSecLevel = user.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + if (userSecLevel > listSecLevel) { + validIds.add(id.trim()); + } + } + return String.join(",", validIds); + } } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java index 7593f26..0a5d63b 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/service/impl/TaskListServiceImpl.java @@ -140,6 +140,14 @@ public class TaskListServiceImpl extends ServiceImpl i public String createTaskList(CreateTaskListReq req) { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); + Integer userSecLevel = loginUser.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + + if (req.getSecretLevel() != null && req.getSecretLevel() >= userSecLevel) { + throw new RuntimeException("您无权创建该密级的清单"); + } if (oConvertUtils.isNotEmpty(req.getPid())) { TaskListFavorite groupFav = taskListFavoriteMapper.selectById(req.getPid()); @@ -150,6 +158,8 @@ public class TaskListServiceImpl extends ServiceImpl i TaskList taskList = new TaskList(); taskList.setTasklistName(req.getTasklistName()); + taskList.setSecretLevel(req.getSecretLevel()); + taskList.setSecretText(getSecretText(req.getSecretLevel())); taskListMapper.insert(taskList); TaskListDetial defaultGroup = new TaskListDetial(); @@ -259,20 +269,47 @@ public class TaskListServiceImpl extends ServiceImpl i public List getMyFavorites() { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); + Integer userSecLevel = loginUser.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + QueryWrapper query = new QueryWrapper<>(); query.eq("user_id", userId); query.eq("del_flag", "0"); query.orderByAsc("type"); query.orderByAsc("sort_order"); - List list = taskListFavoriteMapper.selectList(query); - for (TaskListFavorite fav : list) { - if ("1".equals(fav.getType()) && fav.getMainId() != null && fav.getTasklistName() == null) { - TaskList tl = taskListMapper.selectById(fav.getMainId()); - if (tl != null) { - fav.setTasklistName(tl.getTasklistName()); - } - } + List favorites = taskListFavoriteMapper.selectList(query); + + List mainIds = new java.util.ArrayList<>(); + for (TaskListFavorite fav : favorites) { if ("1".equals(fav.getType()) && fav.getMainId() != null) { + mainIds.add(fav.getMainId()); + } + } + + java.util.Map listMap = new java.util.HashMap<>(); + if (!mainIds.isEmpty()) { + List lists = taskListMapper.selectBatchIds(mainIds); + for (TaskList tl : lists) { + listMap.put(tl.getId(), tl); + } + } + + List result = new java.util.ArrayList<>(); + for (TaskListFavorite fav : favorites) { + if ("1".equals(fav.getType()) && fav.getMainId() != null) { + TaskList tl = listMap.get(fav.getMainId()); + if (tl == null) continue; + + Integer listSecLevel = tl.getSecretLevel() != null ? tl.getSecretLevel() : 1; + if (userSecLevel <= listSecLevel) { + continue; + } + fav.setTasklistName(tl.getTasklistName()); + fav.setSecretLevel(tl.getSecretLevel()); + fav.setSecretText(tl.getSecretText()); + LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); permQuery.eq(TaskListPermission::getMainId, fav.getMainId()); permQuery.eq(TaskListPermission::getUserId, userId); @@ -280,9 +317,12 @@ public class TaskListServiceImpl extends ServiceImpl i if (perm != null) { fav.setPermission(perm.getPermission()); } + result.add(fav); + } else { + result.add(fav); } } - return list; + return result; } @Override @@ -440,6 +480,11 @@ public class TaskListServiceImpl extends ServiceImpl i public List getMyOwnLists() { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); + Integer userSecLevel = loginUser.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + final Integer finalUserSecLevel = userSecLevel; LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); permQuery.eq(TaskListPermission::getUserId, userId); @@ -453,6 +498,7 @@ public class TaskListServiceImpl extends ServiceImpl i LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.in(TaskList::getId, mainIds); + query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel)); query.orderByAsc(TaskList::getCreateTime); return enrichListSummaries(taskListMapper.selectList(query)); } @@ -461,26 +507,25 @@ public class TaskListServiceImpl extends ServiceImpl i public List getAllLists() { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); - - LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); - permQuery.eq(TaskListPermission::getUserId, userId); - List perms = taskListPermissionMapper.selectList(permQuery); - - List mainIds = perms.stream().map(TaskListPermission::getMainId).distinct().collect(java.util.stream.Collectors.toList()); - if (mainIds.isEmpty()) { - return java.util.Collections.emptyList(); + Integer userSecLevel = loginUser.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; } + String orgCode = loginUser.getOrgCode(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.in(TaskList::getId, mainIds); - query.orderByAsc(TaskList::getCreateTime); - return enrichListSummaries(taskListMapper.selectList(query)); + List lists = taskListMapper.selectVisibleLists(userId, userSecLevel, orgCode); + return enrichListSummaries(lists); } @Override public List getMyCollabLists() { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); + Integer userSecLevel = loginUser.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + final Integer finalUserSecLevel = userSecLevel; LambdaQueryWrapper permQuery = new LambdaQueryWrapper<>(); permQuery.eq(TaskListPermission::getUserId, userId); @@ -494,6 +539,7 @@ public class TaskListServiceImpl extends ServiceImpl i LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.in(TaskList::getId, mainIds); + query.and(w -> w.lt(TaskList::getSecretLevel, finalUserSecLevel).or().isNull(TaskList::getSecretLevel)); query.orderByAsc(TaskList::getCreateTime); return enrichListSummaries(taskListMapper.selectList(query)); } @@ -580,6 +626,29 @@ public class TaskListServiceImpl extends ServiceImpl i throw new RuntimeException("权限类型无效,仅支持可阅读(2)或可编辑(3)"); } + TaskList taskList = taskListMapper.selectById(req.getTaskListId()); + if (taskList == null) { + throw new RuntimeException("清单不存在"); + } + + LoginUser targetUser = sysBaseAPI.getUserById(req.getUserId()); + if (targetUser == null) { + throw new RuntimeException("用户不存在"); + } + + Integer targetUserSecLevel = targetUser.getUserSecurityLevel(); + Integer listSecLevel = taskList.getSecretLevel(); + if (listSecLevel == null) { + listSecLevel = 1; + } + if (targetUserSecLevel == null) { + targetUserSecLevel = 3; + } + + if (targetUserSecLevel <= listSecLevel) { + throw new RuntimeException("该用户密级不足,无法添加为协作人"); + } + LambdaQueryWrapper existCheck = new LambdaQueryWrapper<>(); existCheck.eq(TaskListPermission::getMainId, req.getTaskListId()); existCheck.eq(TaskListPermission::getUserId, req.getUserId()); @@ -669,6 +738,23 @@ public class TaskListServiceImpl extends ServiceImpl i public void addToFavorites(String taskListId, String pid) { LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = loginUser.getId(); + Integer userSecLevel = loginUser.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + + TaskList taskList = taskListMapper.selectById(taskListId); + if (taskList == null) { + throw new RuntimeException("清单不存在"); + } + + Integer listSecLevel = taskList.getSecretLevel(); + if (listSecLevel == null) { + listSecLevel = 1; + } + if (userSecLevel <= listSecLevel) { + throw new RuntimeException("您无权收藏该密级的清单"); + } LambdaQueryWrapper existCheck = new LambdaQueryWrapper<>(); existCheck.eq(TaskListFavorite::getMainId, taskListId); @@ -700,11 +786,6 @@ public class TaskListServiceImpl extends ServiceImpl i return; } - TaskList taskList = taskListMapper.selectById(taskListId); - if (taskList == null) { - throw new RuntimeException("清单不存在"); - } - String normalizedPid = oConvertUtils.isNotEmpty(pid) ? pid : null; if (normalizedPid != null) { TaskListFavorite groupFav = taskListFavoriteMapper.selectById(normalizedPid); @@ -744,4 +825,38 @@ public class TaskListServiceImpl extends ServiceImpl i return taskListDetialMapper.selectByFollowersId(loginUser.getId(), loginUser.getId()); } + private String getSecretText(Integer level) { + if (level == null) return "非密"; + switch (level) { + case 1: return "非密"; + case 2: return "内部"; + case 3: return "秘密"; + case 4: return "机密"; + default: return "非密"; + } + } + + private String filterUsersBySecLevel(String userIds, Integer listSecLevel) { + if (oConvertUtils.isEmpty(userIds)) return userIds; + if (listSecLevel == null) { + listSecLevel = 1; + } + String[] ids = userIds.split(","); + java.util.List validIds = new java.util.ArrayList<>(); + for (String id : ids) { + LoginUser user = sysBaseAPI.getUserById(id.trim()); + if (user == null) { + continue; + } + Integer userSecLevel = user.getUserSecurityLevel(); + if (userSecLevel == null) { + userSecLevel = 3; + } + if (userSecLevel > listSecLevel) { + validIds.add(id.trim()); + } + } + return String.join(",", validIds); + } + } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java index 373d3b6..d59e601 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/CreateTaskListReq.java @@ -15,4 +15,7 @@ public class CreateTaskListReq { @Schema(description = "目标排序位置(可选,不传则追加到末尾)") private Integer sortOrder; + + @Schema(description = "密级:1=非密,2=内部,3=秘密,4=机密") + private Integer secretLevel; } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java index e821719..16f911a 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/tasklist/vo/TaskListPage.java @@ -65,6 +65,16 @@ public class TaskListPage { @ExcelCollection(name="任务清单权限表") @Schema(description = "任务清单权限表") private List taskListPermissionList; + /**密级: 1=非密, 2=内部, 3=秘密, 4=机密*/ + @Excel(name = "密级", width = 15) + @Schema(description = "密级:1=非密,2=内部,3=秘密,4=机密") + private java.lang.Integer secretLevel; + + /**密级文本*/ + @Excel(name = "密级文本", width = 15) + @Schema(description = "密级文本") + private java.lang.String secretText; + @ExcelCollection(name="任务清单收藏表") @Schema(description = "任务清单收藏表") private List taskListFavoriteList;