瀏覽代碼

修复管理端AI诗词权限过期时间遗漏

liyanbo 1 月之前
父節點
當前提交
479c80133f

+ 4 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/userwebexpiretime/vo/UserWebExpireTimePageReqVO.java

@@ -29,4 +29,8 @@ public class UserWebExpireTimePageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] aiCourseExpireTime;
 
+    @Schema(description = "AI诗词权限过期时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] aiPoetryExpireTime;
+
 }

+ 4 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/userwebexpiretime/vo/UserWebExpireTimeRespVO.java

@@ -31,4 +31,8 @@ public class UserWebExpireTimeRespVO {
     @ExcelProperty("AI实验课权限过期时间")
     private LocalDateTime aiCourseExpireTime;
 
+    @Schema(description = "AI诗词权限过期时间")
+    @ExcelProperty("AI诗词权限过期时间")
+    private LocalDateTime aiPoetryExpireTime;
+
 }

+ 1 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/mysql/userwebexpiretime/UserWebExpireTimeMapper.java

@@ -20,6 +20,7 @@ public interface UserWebExpireTimeMapper extends BaseMapperX<UserWebExpireTimeDO
                 .betweenIfPresent(UserWebExpireTimeDO::getCourseExpireTime, reqVO.getCourseExpireTime())
                 .betweenIfPresent(UserWebExpireTimeDO::getBlocklyExpireTime, reqVO.getBlocklyExpireTime())
                 .betweenIfPresent(UserWebExpireTimeDO::getAiCourseExpireTime, reqVO.getAiCourseExpireTime())
+                .betweenIfPresent(UserWebExpireTimeDO::getAiPoetryExpireTime, reqVO.getAiPoetryExpireTime())
                 .orderByDesc(UserWebExpireTimeDO::getUserId));
     }
 

+ 24 - 58
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/userwebexpiretime/UserWebExpireTimeServiceImpl.java

@@ -69,12 +69,12 @@ public class UserWebExpireTimeServiceImpl implements UserWebExpireTimeService {
     }
 
     @Override
-        public void deleteUserWebExpireTimeListByIds(List<Long> ids) {
+    public void deleteUserWebExpireTimeListByIds(List<Long> ids) {
         // 校验存在
         validateUserWebExpireTimeExists(ids);
-        // 删除
+        // 批量删除
         userWebExpireTimeMapper.deleteByIds(ids);
-        }
+    }
 
     private void validateUserWebExpireTimeExists(List<Long> ids) {
         List<UserWebExpireTimeDO> list = userWebExpireTimeMapper.selectByIds(ids);
@@ -96,92 +96,58 @@ public class UserWebExpireTimeServiceImpl implements UserWebExpireTimeService {
 
     @Override
     public PageResult<UserWebExpireTimeRespVO> getUserWebExpireTimePage(UserWebExpireTimePageReqVO pageReqVO) {
-        // 1. 首先查询所有符合条件的数据(不分页),因为需要进行内存筛选
-        // 临时保存分页参数,查询完后恢复
+        // 暂存分页参数,查询全部数据后用于内存分页(需关联用户和租户信息进行筛选)
         Integer originalPageSize = pageReqVO.getPageSize();
         Integer originalPageNo = pageReqVO.getPageNo();
-        
-        // 设置不分页,查询所有数据
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        PageResult<UserWebExpireTimeDO> userWebExpireTimeDOPageResult = userWebExpireTimeMapper.selectPage(pageReqVO);
-        List<UserWebExpireTimeDO> list = userWebExpireTimeDOPageResult.getList();
-        
-        // 恢复分页参数
+        List<UserWebExpireTimeDO> list = userWebExpireTimeMapper.selectPage(pageReqVO).getList();
         pageReqVO.setPageSize(originalPageSize);
         pageReqVO.setPageNo(originalPageNo);
 
-        // 2. 转换为RespVO并填充关联数据
-        // 取所有用户ID
+        // 批量查询关联的用户和租户信息,避免N+1问题
         Set<Long> userIdSet = list.stream().map(UserWebExpireTimeDO::getUserId).filter(Objects::nonNull).collect(Collectors.toSet());
-        List<AdminUserDO> userList = userIdSet.isEmpty() ? Collections.emptyList() : TenantUtils.executeIgnore(() ->
-                userMapper.selectBatchIds(userIdSet)
-        );
+        List<AdminUserDO> userList = userIdSet.isEmpty() ? Collections.emptyList() : TenantUtils.executeIgnore(() -> userMapper.selectBatchIds(userIdSet));
         Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(AdminUserDO::getId, AdminUserDO::getNickname));
+        Map<Long, AdminUserDO> userDoMap = userList.stream().collect(Collectors.toMap(AdminUserDO::getId, u -> u));
 
-        // 取所有租户ID
         Set<Long> tenantIdSet = userList.stream().map(AdminUserDO::getTenantId).filter(Objects::nonNull).collect(Collectors.toSet());
-        List<TenantDO> tenantList = tenantIdSet.isEmpty() ? Collections.emptyList() : TenantUtils.executeIgnore(() ->
-                tenantMapper.selectBatchIds(tenantIdSet)
-        );
+        List<TenantDO> tenantList = tenantIdSet.isEmpty() ? Collections.emptyList() : TenantUtils.executeIgnore(() -> tenantMapper.selectBatchIds(tenantIdSet));
         Map<Long, String> tenantMap = tenantList.stream().collect(Collectors.toMap(TenantDO::getId, TenantDO::getName));
 
-        // 转换为RespVO
-        List<UserWebExpireTimeRespVO> respVOList = list.stream().map(userWebExpireTime -> {
-            UserWebExpireTimeRespVO respVO = BeanUtils.toBean(userWebExpireTime, UserWebExpireTimeRespVO.class);
-
-            // 填充用户名
-            if (userWebExpireTime.getUserId() != null) {
-                respVO.setUserName(userMap.get(userWebExpireTime.getUserId()));
-                // 填充租户名称
-                AdminUserDO user = userList.stream().filter(u -> u.getId().equals(userWebExpireTime.getUserId())).findFirst().orElse(null);
+        // 转换为RespVO并填充用户名、租户名
+        List<UserWebExpireTimeRespVO> respVOList = list.stream().map(do_ -> {
+            UserWebExpireTimeRespVO respVO = BeanUtils.toBean(do_, UserWebExpireTimeRespVO.class);
+            if (do_.getUserId() != null) {
+                respVO.setUserName(userMap.get(do_.getUserId()));
+                AdminUserDO user = userDoMap.get(do_.getUserId());
                 if (user != null && user.getTenantId() != null) {
                     respVO.setTenantName(tenantMap.get(user.getTenantId()));
                 }
             }
-
             return respVO;
         }).collect(Collectors.toList());
 
-        // 3. 进行内存筛选
-        List<UserWebExpireTimeRespVO> filteredRespVOList = respVOList;
-
-        // 按用户名筛选
+        // 内存筛选:按用户名、租户名称模糊匹配
+        List<UserWebExpireTimeRespVO> filteredList = respVOList;
         if (pageReqVO.getUserName() != null && !pageReqVO.getUserName().isEmpty()) {
-            filteredRespVOList = filteredRespVOList.stream()
-                    .filter(respVO -> {
-                        if (respVO.getUserName() == null) {
-                            return false;
-                        }
-                        return respVO.getUserName().contains(pageReqVO.getUserName());
-                    })
+            filteredList = filteredList.stream()
+                    .filter(r -> r.getUserName() != null && r.getUserName().contains(pageReqVO.getUserName()))
                     .collect(Collectors.toList());
         }
-
-        // 按租户名称筛选
         if (pageReqVO.getTenantName() != null && !pageReqVO.getTenantName().isEmpty()) {
-            filteredRespVOList = filteredRespVOList.stream()
-                    .filter(respVO -> {
-                        if (respVO.getTenantName() == null) {
-                            return false;
-                        }
-                        return respVO.getTenantName().contains(pageReqVO.getTenantName());
-                    })
+            filteredList = filteredList.stream()
+                    .filter(r -> r.getTenantName() != null && r.getTenantName().contains(pageReqVO.getTenantName()))
                     .collect(Collectors.toList());
         }
 
-        // 4. 对筛选后的结果进行分页
+        // 内存分页
         int pageNo = pageReqVO.getPageNo();
         int pageSize = pageReqVO.getPageSize();
-        int total = filteredRespVOList.size();
-        
-        // 计算分页起始位置
+        int total = filteredList.size();
         int start = (pageNo - 1) * pageSize;
         int end = Math.min(start + pageSize, total);
-        
-        // 截取当前页数据
-        List<UserWebExpireTimeRespVO> pagedList = (start < end) ? filteredRespVOList.subList(start, end) : Collections.emptyList();
+        List<UserWebExpireTimeRespVO> pagedList = (start < end) ? filteredList.subList(start, end) : Collections.emptyList();
 
-        // 5. 返回正确的分页结果
         return new PageResult<>(pagedList, (long) total);
     }