Преглед на файлове

项目管理:
- 添加成员已完成
- 文件夹权限重写完成
文件下载:
- 已修改完毕文件上传逻辑,先可以支持直接使用<a>标签下载源名文件

Huanyi преди 22 часа
родител
ревизия
0e41287769
променени са 20 файла, в които са добавени 271 реда и са изтрити 79 реда
  1. 1 1
      ruoyi-admin/src/main/java/com/yingpaipay/web/service/strategy/PasswordAppletAuthService.java
  2. 1 1
      ruoyi-admin/src/main/resources/application.yml
  3. 8 8
      ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
  4. 4 2
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/SysUserFolders.java
  5. 0 7
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/mapper/SysUserFolderMapper.java
  6. 7 0
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/mapper/SysUserFoldersMapper.java
  7. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
  8. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java
  9. 12 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  10. 2 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DictTypeConst.java
  11. 3 3
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/UserAppletStatusConst.java
  12. 6 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/FolderController.java
  13. 21 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/ProjectController.java
  14. 28 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectAddMemberBo.java
  15. 14 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectMemberUpdateFoldersBo.java
  16. 10 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/ProjectFolderVo.java
  17. 6 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IProjectService.java
  18. 56 36
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/FolderServiceImpl.java
  19. 83 15
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/ProjectServiceImpl.java
  20. 5 3
      script/sql/business/create.sql

+ 1 - 1
ruoyi-admin/src/main/java/com/yingpaipay/web/service/strategy/PasswordAppletAuthService.java

@@ -5,7 +5,7 @@ import cn.dev33.satoken.stp.parameter.SaLoginParameter;
 import cn.hutool.core.lang.Dict;
 import cn.hutool.crypto.digest.BCrypt;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.yingpaipay.web.constant.UserAppletStatusConst;
+import com.yingpaipay.business.constant.UserAppletStatusConst;
 import com.yingpaipay.web.domain.bo.AppletLoginBo;
 import com.yingpaipay.web.domain.vo.AppletLoginVo;
 import com.yingpaipay.web.service.IAppletAuthService;

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -128,7 +128,7 @@ tenant:
         - sys_dict_type
         - applet_setting
         - sys_user_projects
-        - sys_user_folder
+        - sys_user_folders
 
 # MyBatisPlus配置
 # https://baomidou.com/config/

+ 8 - 8
ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java

@@ -343,8 +343,8 @@ public class OssClient {
      * @return UploadResult 包含上传后的文件信息
      * @throws OssException 如果上传失败,抛出自定义异常
      */
-    public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) {
-        return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), contentType);
+    public UploadResult uploadSuffix(byte[] data, String suffix, String originalName, String contentType) {
+        return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix, originalName), Long.valueOf(data.length), contentType);
     }
 
     /**
@@ -356,8 +356,8 @@ public class OssClient {
      * @return UploadResult 包含上传后的文件信息
      * @throws OssException 如果上传失败,抛出自定义异常
      */
-    public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length, String contentType) {
-        return upload(inputStream, getPath(properties.getPrefix(), suffix), length, contentType);
+    public UploadResult uploadSuffix(InputStream inputStream, String suffix, String originalName, Long length, String contentType) {
+        return upload(inputStream, getPath(properties.getPrefix(), suffix, originalName), length, contentType);
     }
 
     /**
@@ -368,8 +368,8 @@ public class OssClient {
      * @return UploadResult 包含上传后的文件信息
      * @throws OssException 如果上传失败,抛出自定义异常
      */
-    public UploadResult uploadSuffix(File file, String suffix) {
-        return upload(file.toPath(), getPath(properties.getPrefix(), suffix), null, FileUtils.getMimeType(suffix));
+    public UploadResult uploadSuffix(File file, String suffix, String originalName) {
+        return upload(file.toPath(), getPath(properties.getPrefix(), suffix, originalName), null, FileUtils.getMimeType(suffix));
     }
 
     /**
@@ -469,7 +469,7 @@ public class OssClient {
      * @param suffix 后缀
      * @return 文件路径
      */
-    public String getPath(String prefix, String suffix) {
+    public String getPath(String prefix, String suffix, String originalName) {
         // 生成uuid
         String uuid = IdUtil.fastSimpleUUID();
         // 生成日期路径
@@ -477,7 +477,7 @@ public class OssClient {
         // 拼接路径
         String path = StringUtils.isNotEmpty(prefix) ?
             prefix + StringUtils.SLASH + datePath + StringUtils.SLASH + uuid : datePath + StringUtils.SLASH + uuid;
-        return path + suffix;
+        return path + suffix + "/" + originalName;
     }
 
     /**

+ 4 - 2
ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/SysUserFolder.java → ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/SysUserFolders.java

@@ -6,12 +6,14 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 @Data
-@TableName("sys_user_folder")
-public class SysUserFolder {
+@TableName("sys_user_folders")
+public class SysUserFolders {
 
     @TableId(type = IdType.INPUT)
     private Long userId;
 
     private String folders;
 
+    private Long projectId;
+
 }

+ 0 - 7
ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/mapper/SysUserFolderMapper.java

@@ -1,7 +0,0 @@
-package com.yingpaipay.system.mapper;
-
-import com.yingpaipay.system.domain.SysUserFolder;
-import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
-
-public interface SysUserFolderMapper extends BaseMapperPlus<SysUserFolder, SysUserFolder> {
-}

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/mapper/SysUserFoldersMapper.java

@@ -0,0 +1,7 @@
+package com.yingpaipay.system.mapper;
+
+import com.yingpaipay.system.domain.SysUserFolders;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+public interface SysUserFoldersMapper extends BaseMapperPlus<SysUserFolders, SysUserFolders> {
+}

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java

@@ -90,6 +90,8 @@ public interface ISysUserService {
 
     List<SysUserVo> selectUserByIds(List<Long> userIds);
 
+    List<SysUserVo> selectUserVoByIds(List<Long> userIds);
+
     /**
      * 根据用户ID查询用户所属角色组
      *

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOssServiceImpl.java

@@ -205,7 +205,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
         OssClient storage = OssFactory.instance();
         UploadResult uploadResult;
         try {
-            uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());
+            uploadResult = storage.uploadSuffix(file.getBytes(), suffix, originalfileName, file.getContentType());
         } catch (IOException e) {
             throw new ServiceException(e.getMessage());
         }
@@ -227,7 +227,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
         String originalfileName = file.getName();
         String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
         OssClient storage = OssFactory.instance();
-        UploadResult uploadResult = storage.uploadSuffix(file, suffix);
+        UploadResult uploadResult = storage.uploadSuffix(file, suffix, originalfileName);
         SysOssExt ext1 = new SysOssExt();
         ext1.setFileSize(file.length());
         // 保存文件信息

+ 12 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -213,12 +213,23 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
         if (userIds.isEmpty()) {
             return List.of();
         }
-        return baseMapper.selectUserList(new LambdaQueryWrapper<SysUser>()
+        return baseMapper.selectVoList(new LambdaQueryWrapper<SysUser>()
             .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName)
             .eq(SysUser::getStatus, SystemConstants.NORMAL)
             .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
     }
 
+    @Override
+    public List<SysUserVo> selectUserVoByIds(List<Long> userIds) {
+        if (userIds.isEmpty()) {
+            return List.of();
+        }
+        return baseMapper.selectVoList(
+            Wrappers.lambdaQuery(SysUser.class)
+            .eq(SysUser::getStatus, SystemConstants.NORMAL)
+            .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
+    }
+
     /**
      * 查询用户所属角色组
      *

+ 2 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DictTypeConst.java

@@ -19,4 +19,6 @@ public interface DictTypeConst {
 
     String CENTER_FILE_SPECIFICATION = "center_file_specification";
 
+    String AUDITOR_TYPE = "auditor_type";
+
 }

+ 3 - 3
ruoyi-admin/src/main/java/com/yingpaipay/web/constant/UserAppletStatusConst.java → ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/UserAppletStatusConst.java

@@ -1,4 +1,4 @@
-package com.yingpaipay.web.constant;
+package com.yingpaipay.business.constant;
 
 /**
  * @Author: Huanyi
@@ -9,8 +9,8 @@ package com.yingpaipay.web.constant;
 
 public interface UserAppletStatusConst {
 
-    String NORMAL = "0";
+    Integer NORMAL = 0;
 
-    String BANNED = "1";
+    Integer BANNED = 1;
 
 }

+ 6 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/FolderController.java

@@ -47,12 +47,18 @@ public class FolderController extends BaseController {
         return projectService.listOnDocument(bo, pageQuery);
     }
 
+
     @SaCheckPermission("document:folder:list")
     @GetMapping("/list")
     public R<List<FolderListVo>> list(Long projectId) {
         return R.ok(folderService.selectList(projectId));
     }
 
+    @GetMapping("/listOnProject")
+    public R<List<FolderListVo>> listOnProject(Long projectId) {
+        return R.ok(folderService.selectList(projectId));
+    }
+
     @SaCheckPermission("document:folder:add")
     @Log(title = "文件夹管理", businessType = BusinessType.INSERT)
     @RepeatSubmit()

+ 21 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/ProjectController.java

@@ -9,6 +9,8 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.service.UserService;
+import org.dromara.system.service.ISysUserService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -155,6 +157,25 @@ public class ProjectController extends BaseController {
 //        return toAjax(projectService.inviteCenterMember(bo));
 //    }
 
+    @SaCheckPermission("project:management:queryProjectMemberAddMember")
+    @Log(title = "项目管理", businessType = BusinessType.INSERT)
+    @PostMapping("/queryProjectMemberAddMember")
+    public R<Void> queryProjectMemberAddMember(@RequestBody ProjectAddMemberBo bo) {
+        return toAjax(projectService.insertUser(bo));
+    }
+
+    @GetMapping("/getFolders")
+    public R<ProjectFolderVo> getFolders(@RequestParam("userId") Long userId, @RequestParam("projectId") Long projectId) {
+        return R.ok(projectService.getFoldersByUserId(userId, projectId));
+    }
+
+    @SaCheckPermission("project:management:queryProjectMemberAssignFolders")
+    @Log(title = "项目管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/queryProjectMemberAssignFolders")
+    public R<Void> queryProjectMemberAssignFolders(@RequestBody ProjectMemberUpdateFoldersBo bo) {
+        return toAjax(projectService.updateFolders(bo));
+    }
+
     @SaCheckPermission("project:management:queryCenterMember")
     @GetMapping("/queryCenterMember")
     public TableDataInfo<ProjectCenterMemberListVo> queryCenterMember(ProjectCenterMemberListBo bo, PageQuery pageQuery) {

+ 28 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectAddMemberBo.java

@@ -0,0 +1,28 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class ProjectAddMemberBo {
+
+    private Long projectId;
+
+    private String phoneNumber;
+
+    private String nickname;
+
+    private String username;
+
+    private String password;
+
+    private String email;
+
+    private String gender;
+
+    private Long[] roleIds;
+
+    private Long deptId;
+
+    private String folders;
+
+}

+ 14 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectMemberUpdateFoldersBo.java

@@ -0,0 +1,14 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class ProjectMemberUpdateFoldersBo {
+
+    private Long userId;
+
+    private Long projectId;
+
+    private String folders;
+
+}

+ 10 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/ProjectFolderVo.java

@@ -0,0 +1,10 @@
+package com.yingpaipay.business.domain.vo;
+
+import lombok.Data;
+
+@Data
+public class ProjectFolderVo {
+
+    private String folders;
+
+}

+ 6 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IProjectService.java

@@ -81,4 +81,10 @@ public interface IProjectService {
     TableDataInfo<ProjectMemberNotInCenterVo> queryMemberNotInCenter(Long projectId, Long folderId, String name, PageQuery pageQuery);
 
     TableDataInfo<ProjectInDashboardWorkbenchVo> queryPageListOnDashboardWorkbench(ProjectListOnDashboardWorkbenchBo bo, PageQuery pageQuery);
+
+    boolean insertUser(ProjectAddMemberBo bo);
+
+    ProjectFolderVo getFoldersByUserId(Long userId, Long projectId);
+
+    boolean updateFolders(ProjectMemberUpdateFoldersBo bo);
 }

+ 56 - 36
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/FolderServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yingpaipay.business.constant.FolderTypeConst;
 import com.yingpaipay.business.domain.Folder;
-import com.yingpaipay.business.domain.Project;
 import com.yingpaipay.business.domain.bo.FolderBo;
 import com.yingpaipay.business.domain.bo.ProjectCenterListBo;
 import com.yingpaipay.business.domain.bo.ProjectCenterMemberListBo;
@@ -14,17 +13,19 @@ import com.yingpaipay.business.domain.vo.FolderListVo;
 import com.yingpaipay.business.domain.vo.FolderVo;
 import com.yingpaipay.business.domain.vo.ProjectCenterListVo;
 import com.yingpaipay.business.domain.vo.ProjectCenterMemberListVo;
-import com.yingpaipay.system.domain.SysUserFolder;
-import com.yingpaipay.system.mapper.SysUserFolderMapper;
+import com.yingpaipay.system.domain.SysUserFolders;
+import com.yingpaipay.system.mapper.SysUserFoldersMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.exception.BusinessException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.service.ISysDeptService;
 import org.dromara.system.service.ISysUserService;
 import org.springframework.stereotype.Service;
@@ -32,7 +33,6 @@ import com.yingpaipay.business.mapper.FolderMapper;
 import com.yingpaipay.business.service.IFolderService;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.sql.Wrapper;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -49,7 +49,7 @@ import java.util.stream.Collectors;
 public class FolderServiceImpl implements IFolderService {
 
     private final FolderMapper baseMapper;
-    private final SysUserFolderMapper userFolderMapper;
+    private final SysUserFoldersMapper userFoldersMapper;
 
     private final ISysUserService userService;
     private final ISysDeptService deptService;
@@ -195,47 +195,67 @@ public class FolderServiceImpl implements IFolderService {
 
     @Override
     public TableDataInfo<ProjectCenterMemberListVo> queryCenterMember(ProjectCenterMemberListBo bo, PageQuery pageQuery) {
-        List<Long> folderIds = new ArrayList<>();
-        Map<Long, String> folderMap = new HashMap<>();
-        baseMapper.selectList(Wrappers.lambdaQuery(Folder.class)
-                .like(StringUtils.isNotBlank(bo.getCenter()), Folder::getName, bo.getCenter())
-                .eq(Folder::getProjectId, bo.getProjectId())
-            ).forEach(e -> {
-                folderIds.add(e.getId());
-                folderMap.put(e.getId(), e.getName());
-        });
-        if (folderIds.isEmpty()) {
-            return TableDataInfo.build();
-        }
-        List<SysUserFolder> userFolders = userFolderMapper.selectList(
-            Wrappers.lambdaQuery(SysUserFolder.class).
-                in(SysUserFolder::getFolderId, folderIds)
+        IPage<SysUserFolders> page = userFoldersMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysUserFolders.class)
+                .eq(SysUserFolders::getProjectId, bo.getProjectId())
+                .orderByDesc(SysUserFolders::getUserId)
         );
         List<Long> userIds = new ArrayList<>();
-        userFolders.forEach(e -> userIds.add(e.getUserId()));
-        IPage<SysUser> page = userService.selectPageByNameAndIds(bo.getName(), userIds, pageQuery);
         List<Long> deptIds = new ArrayList<>();
+        Map<Long, SysUserVo> userMap = new HashMap<>();
         Map<Long, String> deptMap = new HashMap<>();
-        page.getRecords().forEach(e -> deptIds.add(e.getDeptId()));
-        if (!deptIds.isEmpty()) {
-            deptService.selectDeptByIds(deptIds).forEach(e -> deptMap.put(e.getDeptId(), e.getDeptName()));
-        }
+        Map<Long, Folder> folderMap = new HashMap<>();
+        page.getRecords().forEach(e -> userIds.add(e.getUserId()));
+        userService.selectUserVoByIds(userIds).forEach(e -> {
+            userMap.put(e.getUserId(), e);
+            deptIds.add(e.getDeptId());
+        });
+        deptService.selectDeptByIds(deptIds).forEach(e -> deptMap.put(e.getDeptId(), e.getDeptName()));
+        List<Folder> folderList = baseMapper.selectList(Wrappers.lambdaQuery(Folder.class).eq(Folder::getProjectId, bo.getProjectId()).eq(Folder::getType, FolderTypeConst.CENTER));
+        folderList.forEach(e -> folderMap.put(e.getId(), e));
+        Map<Long, List<Folder>> childerMap = folderList.stream().collect(Collectors.groupingBy(Folder::getParentId));
         return TableDataInfo.build(page.convert(e -> {
+
+            SysUserVo user = userMap.get(e.getUserId());
             ProjectCenterMemberListVo vo = new ProjectCenterMemberListVo();
-            StringBuilder centers = new StringBuilder();
-            userFolders.stream()
-                .filter(entity -> entity.getUserId().equals(e.getUserId()))
-                .forEach(entity -> centers.append(folderMap.get(entity.getFolderId())).append(","));
-            vo.setCenters(centers.toString());
-            vo.setId(e.getUserId());
-            vo.setName(e.getNickName());
-            vo.setPhoneNumber(e.getPhonenumber());
-            vo.setDept(deptMap.get(e.getDeptId()));
-            vo.setTime(e.getCreateTime());
+            Set<Folder> centers= new HashSet<>();
+            if (e.getFolders().equals("*")) {
+                folderMap.forEach((k, v) -> {
+                    if (v.getType().equals(FolderTypeConst.CENTER)) {
+                        centers.add(v);
+                    }
+                });
+            } else {
+                Long[] folderIds = Arrays.stream(e.getFolders().split(",")).map(Long::valueOf).toArray(Long[]::new);
+                for (Long folderId : folderIds) {
+                    Folder folder = folderMap.get(folderId);
+                    if (folder != null) {
+                        buildCenters(folder, childerMap, centers);
+                    }
+                }
+            }
+
+            vo.setCenters(String.join(",", new TreeSet<>(centers.stream().map(Folder::getName).collect(Collectors.toSet()))));
+            vo.setId(user.getUserId());
+            vo.setName(user.getNickName());
+            vo.setPhoneNumber(user.getPhonenumber());
+            vo.setDept(deptMap.get(user.getDeptId()));
+            vo.setTime(user.getCreateTime());
             return vo;
         }));
     }
 
+    private void buildCenters(Folder current, Map<Long, List<Folder>> childrenMap, Set<Folder> result) {
+        result.add(current);
+        List<Folder> childrens = childrenMap.get(current.getId());
+        if (childrens != null) {
+            for (Folder children : childrens) {
+                buildCenters(children, childrenMap, result);
+            }
+        }
+    }
+
     private LambdaQueryWrapper<Folder> buildCenterQueryWrapper(ProjectCenterListBo bo) {
         return Wrappers.lambdaQuery(Folder.class)
             .eq(Folder::getType, FolderTypeConst.CENTER)

+ 83 - 15
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/ProjectServiceImpl.java

@@ -1,15 +1,16 @@
 package com.yingpaipay.business.service.impl;
 
+import cn.hutool.crypto.digest.BCrypt;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yingpaipay.business.domain.Folder;
+import com.yingpaipay.business.constant.UserAppletStatusConst;
 import com.yingpaipay.business.domain.bo.*;
 import com.yingpaipay.business.domain.vo.*;
 import com.yingpaipay.business.enumeration.ProjectStatusEnum;
-import com.yingpaipay.business.mapper.FolderMapper;
-import com.yingpaipay.system.domain.SysUserFolder;
+import com.yingpaipay.system.domain.SysUserFolders;
 import com.yingpaipay.system.domain.SysUserProjects;
-import com.yingpaipay.system.mapper.SysUserFolderMapper;
+import com.yingpaipay.system.mapper.SysUserFoldersMapper;
 import com.yingpaipay.system.mapper.SysUserProjectsMapper;
+import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -22,14 +23,16 @@ import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.mybatis.helper.DataBaseHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.service.ISysDeptService;
-import org.dromara.system.service.ISysDictTypeService;
 import org.dromara.system.service.ISysOssService;
+import org.dromara.system.service.ISysUserService;
 import org.springframework.stereotype.Service;
 import com.yingpaipay.business.domain.Project;
 import com.yingpaipay.business.mapper.ProjectMapper;
 import com.yingpaipay.business.service.IProjectService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -47,10 +50,11 @@ public class ProjectServiceImpl implements IProjectService {
     private final ProjectMapper baseMapper;
     private final SysUserProjectsMapper userProjectsMapper;
     private final SysUserMapper userMapper;
-    private final SysUserFolderMapper userFolderMapper;
+    private final SysUserFoldersMapper userFoldersMapper;
 
     private final ISysOssService ossService;
     private final ISysDeptService deptService;
+    private final ISysUserService userService;
 
     /**
      * 查询项目管理
@@ -303,8 +307,6 @@ public class ProjectServiceImpl implements IProjectService {
 
     @Override
     public TableDataInfo<ProjectMemberNotInCenterVo> queryMemberNotInCenter(Long projectId, Long folderId, String name, PageQuery pageQuery) {
-        // TODO 排除已在中心中的人
-        List<Long> userIdsInFolder = new ArrayList<>();
         // TODO 只能是项目中的人
         List<Long> userIdsInProject = new ArrayList<>();
         userProjectsMapper.selectList(
@@ -318,12 +320,9 @@ public class ProjectServiceImpl implements IProjectService {
         if (userIdsInProject.isEmpty()) {
             return TableDataInfo.build();
         }
-        userFolderMapper.selectList(Wrappers.lambdaQuery(SysUserFolder.class).eq(SysUserFolder::getFolderId, folderId))
-            .forEach(e -> userIdsInFolder.add(e.getUserId()));
         IPage<SysUser> page = userMapper.selectPage(
             pageQuery.build(),
             Wrappers.lambdaQuery(SysUser.class)
-                .notIn(!userIdsInFolder.isEmpty(), SysUser::getUserId, userIdsInFolder)
                 .in(SysUser::getUserId, userIdsInProject)
                 .like(StringUtils.isNotBlank(name), SysUser::getNickName, name)
         );
@@ -379,10 +378,79 @@ public class ProjectServiceImpl implements IProjectService {
         }));
     }
 
-    private LambdaQueryWrapper<Folder> buildQueryProjectCenterWrapper(ProjectCenterListBo bo) {
-        return Wrappers.lambdaQuery(Folder.class)
-            .like(StringUtils.isNotEmpty(bo.getName()), Folder::getName, bo.getName())
-            .orderByDesc(Folder::getId);
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertUser(ProjectAddMemberBo bo) {
+
+        SysUserBo user = buildSysUser(bo);
+        boolean flag = userService.insertUser(user) == 0;
+        if (flag) {
+            throw new RuntimeException("新增用户失败");
+        }
+
+        // TODO 建立用户和文件夹之间的联系
+        SysUserFolders userFolders = new SysUserFolders();
+        userFolders.setUserId(user.getUserId());
+        userFolders.setFolders(bo.getFolders());
+        userFolders.setProjectId(bo.getProjectId());
+        boolean userFoldersFlag = userFoldersMapper.insert(userFolders) == 0;
+        if (userFoldersFlag) {
+            throw new RuntimeException("建立用户与文件夹链接失败");
+        }
+
+        return true;
+    }
+
+    @Override
+    public ProjectFolderVo getFoldersByUserId(Long userId, Long projectId) {
+        ProjectFolderVo vo = new ProjectFolderVo();
+        SysUserFolders folder = userFoldersMapper.selectOne(
+            Wrappers.lambdaQuery(SysUserFolders.class)
+                .eq(SysUserFolders::getUserId, userId)
+                .eq(SysUserFolders::getProjectId, projectId)
+        );
+        vo.setFolders(Optional.ofNullable(folder).map(SysUserFolders::getFolders).orElse(""));
+        return vo;
+    }
+
+    @Override
+    public boolean updateFolders(ProjectMemberUpdateFoldersBo bo) {
+        SysUserFolders sysUserFolders = userFoldersMapper.selectOne(
+            Wrappers.lambdaUpdate(SysUserFolders.class)
+                .eq(SysUserFolders::getUserId, bo.getUserId())
+                .eq(SysUserFolders::getProjectId, bo.getProjectId())
+        );
+        if (sysUserFolders == null) {
+            sysUserFolders = new SysUserFolders();
+            sysUserFolders.setUserId(bo.getUserId());
+            sysUserFolders.setProjectId(bo.getProjectId());
+            sysUserFolders.setFolders(bo.getFolders());
+            return userFoldersMapper.insert(sysUserFolders) > 0;
+        }
+        sysUserFolders.setFolders(bo.getFolders());
+        return userFoldersMapper.updateById(sysUserFolders) > 0;
+    }
+
+    private SysUserBo buildSysUser(ProjectAddMemberBo bo) {
+        SysUserBo user = new SysUserBo();
+        user.setDeptId(bo.getDeptId());
+        user.setUserName(bo.getUsername());
+        user.setNickName(bo.getNickname());
+        user.setUserType("sys_user");
+        user.setEmail(bo.getEmail());
+        user.setPhonenumber(bo.getPhoneNumber());
+        user.setSex(bo.getGender());
+        user.setPassword(BCrypt.hashpw(bo.getPassword()));
+        user.setStatus(SystemConstants.NORMAL);
+        user.setAppletStatus(UserAppletStatusConst.NORMAL);
+        user.setRoleIds(bo.getRoleIds());
+        user.setProjects(bo.getProjectId().toString() + ",");
+        user.setCreateDept(LoginHelper.getDeptId());
+        user.setCreateBy(LoginHelper.getUserId());
+        user.setCreateTime(new Date());
+        user.setUpdateBy(LoginHelper.getUserId());
+        user.setUpdateTime(new Date());
+        return user;
     }
 
     private LambdaQueryWrapper<Project> buildQueryOnDocumentWrapper(ProjectOnDocumentBo bo) {

+ 5 - 3
script/sql/business/create.sql

@@ -79,12 +79,14 @@ CREATE TABLE `document`
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='文档';
 
-CREATE TABLE `file_audit_log`
+CREATE TABLE `document_audit_log`
 (
     `id`            bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',
-    `file_id`       bigint unsigned             NOT NULL COMMENT '文件',
+    `document_id`   bigint unsigned             NOT NULL COMMENT '审核文档',
+    `oss_id`        bigint unique               NOT NULL COMMENT '历史版本',
+    `auditor_type`  char(1)                     NOT NULL COMMENT '审核人类型',
     `auditor_id`    bigint unsigned             NOT NULL COMMENT '审核人',
-    `result`        tinyint(1)                  NOT NULL COMMENT '审核结果',
+    `result`        tinyint(1)                  NOT NULL COMMENT '审核结果(0 -> 通过; 1 -> 驳回)',
     `reject_reason` varchar(255) COMMENT '驳回理由',
     `audit_time`    datetime                    NOT NULL COMMENT '审核时间',
     `create_dept`   bigint(20) COMMENT '创建部门',