فهرست منبع

项目成员邀请成功,文档管理初步搭建

Huanyi 2 روز پیش
والد
کامیت
addd6fee2e
19فایلهای تغییر یافته به همراه410 افزوده شده و 55 حذف شده
  1. 7 1
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/SysUserProject.java
  2. 19 0
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/bo/ListOnNameNotJoinProjectBo.java
  3. 2 2
      ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/mapper/SysUserProjectMapper.java
  4. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  5. 23 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserListOnNameVo.java
  6. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
  7. 39 8
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  8. 16 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/constant/DictTypeConst.java
  9. 15 15
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/FolderController.java
  10. 17 1
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/ProjectController.java
  11. 19 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectInviteMemberBo.java
  12. 21 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectInviteProjectMemberBo.java
  13. 29 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectOnDocumentBo.java
  14. 2 2
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/ProjectMemberListVo.java
  15. 37 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/ProjectOnDocumentVo.java
  16. 9 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/enumeration/ProjectStatusEnum.java
  17. 9 0
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/IProjectService.java
  18. 135 11
      ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/ProjectServiceImpl.java
  19. 1 15
      script/sql/business/create.sql

+ 7 - 1
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/SysUserProject.java → ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/SysUserProject.java

@@ -1,10 +1,12 @@
-package com.yingpaipay.business.domain;
+package com.yingpaipay.system.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * @Author: Huanyi
  * @CreateTime: 2025-12-09
@@ -21,4 +23,8 @@ public class SysUserProject {
 
     private Long projectId;
 
+    private String note;
+
+    private Date joinTime;
+
 }

+ 19 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/domain/bo/ListOnNameNotJoinProjectBo.java

@@ -0,0 +1,19 @@
+package com.yingpaipay.system.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ListOnNameNotJoinProjectBo {
+
+    private Long id;
+
+    private String name;
+
+}

+ 2 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/mapper/SysUserProjectMapper.java → ruoyi-modules/ruoyi-system/src/main/java/com/yingpaipay/system/mapper/SysUserProjectMapper.java

@@ -1,6 +1,6 @@
-package com.yingpaipay.business.mapper;
+package com.yingpaipay.system.mapper;
 
-import com.yingpaipay.business.domain.SysUserProject;
+import com.yingpaipay.system.domain.SysUserProject;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 /**

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.digest.BCrypt;
+import com.yingpaipay.system.domain.bo.ListOnNameNotJoinProjectBo;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
@@ -315,4 +316,9 @@ public class SysUserController extends BaseController {
         return R.ok(userService.selectUserListByDept(deptId));
     }
 
+    @GetMapping("/listOnNameNotJoinProject")
+    public TableDataInfo<SysUserListOnNameVo> listOnNameNotJoinProject(ListOnNameNotJoinProjectBo bo, PageQuery pageQuery) {
+        return userService.listOnNameNotJoinProject(bo, pageQuery);
+    }
+
 }

+ 23 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserListOnNameVo.java

@@ -0,0 +1,23 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class SysUserListOnNameVo {
+
+    private Long id;
+
+    private String name;
+
+    private String deptName;
+
+    private String phoneNumber;
+
+}

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

@@ -1,9 +1,11 @@
 package org.dromara.system.service;
 
+import com.yingpaipay.system.domain.bo.ListOnNameNotJoinProjectBo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.vo.SysUserExportVo;
+import org.dromara.system.domain.vo.SysUserListOnNameVo;
 import org.dromara.system.domain.vo.SysUserVo;
 
 import java.util.List;
@@ -230,4 +232,6 @@ public interface ISysUserService {
     List<SysUserVo> selectUserListByDept(Long deptId);
 
     int updateUserAppletStatus(Long userId, Integer appletStatus);
+
+    TableDataInfo<SysUserListOnNameVo> listOnNameNotJoinProject(ListOnNameNotJoinProjectBo bo, PageQuery pageQuery);
 }

+ 39 - 8
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -11,7 +11,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yingpaipay.system.domain.SysUserProject;
 import com.yingpaipay.system.domain.SysUserProjects;
+import com.yingpaipay.system.domain.bo.ListOnNameNotJoinProjectBo;
+import com.yingpaipay.system.mapper.SysUserProjectMapper;
 import com.yingpaipay.system.mapper.SysUserProjectsMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -28,10 +31,7 @@ import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.SysUserPost;
 import org.dromara.system.domain.SysUserRole;
 import org.dromara.system.domain.bo.SysUserBo;
-import org.dromara.system.domain.vo.SysPostVo;
-import org.dromara.system.domain.vo.SysRoleVo;
-import org.dromara.system.domain.vo.SysUserExportVo;
-import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.domain.vo.*;
 import org.dromara.system.mapper.*;
 import org.dromara.system.service.ISysUserService;
 import org.springframework.cache.annotation.CacheEvict;
@@ -57,7 +57,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
     private final SysPostMapper postMapper;
     private final SysUserRoleMapper userRoleMapper;
     private final SysUserPostMapper userPostMapper;
-    private final SysUserProjectsMapper userProjectMapper;
+    private final SysUserProjectsMapper userProjectsMapper;
+    private final SysOssMapper ossMapper;
+    private final SysUserProjectMapper userProjectMapper;
 
     @Override
     public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@@ -185,7 +187,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
             return user;
         }
         user.setRoles(roleMapper.selectRolesByUserId(user.getUserId()));
-        SysUserProjects project = userProjectMapper.selectOne(Wrappers.lambdaQuery(SysUserProjects.class).eq(SysUserProjects::getUserId, userId));
+        SysUserProjects project = userProjectsMapper.selectOne(Wrappers.lambdaQuery(SysUserProjects.class).eq(SysUserProjects::getUserId, userId));
         if (project != null) {
             user.setProjects(project.getProjects());
         }
@@ -332,12 +334,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 
     private void insertUserProjects(SysUserBo user, Boolean flag) {
         if (flag) {
-            userProjectMapper.delete(Wrappers.lambdaQuery(SysUserProjects.class).eq(SysUserProjects::getUserId, user.getUserId()));
+            userProjectsMapper.delete(Wrappers.lambdaQuery(SysUserProjects.class).eq(SysUserProjects::getUserId, user.getUserId()));
         }
         SysUserProjects entity = new SysUserProjects();
         entity.setUserId(user.getUserId());
         entity.setProjects(user.getProjects());
-        userProjectMapper.insert(entity);
+        userProjectsMapper.insert(entity);
     }
 
     /**
@@ -608,6 +610,35 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                 .eq(SysUser::getUserId, userId));
     }
 
+    @Override
+    public TableDataInfo<SysUserListOnNameVo> listOnNameNotJoinProject(ListOnNameNotJoinProjectBo bo, PageQuery pageQuery) {
+        List<Long> userIds = new ArrayList<>();
+        userProjectMapper.selectList(Wrappers.lambdaQuery(SysUserProject.class).eq(SysUserProject::getProjectId, bo.getId()))
+            .forEach(e -> userIds.add(e.getUserId()));
+        Page<SysUser> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysUser.class)
+                .like(StringUtils.isNotBlank(bo.getName()), SysUser::getNickName, bo.getName())
+                .notIn(!userIds.isEmpty(), SysUser::getUserId, userIds)
+                .orderByDesc(SysUser::getUserId)
+        );
+        List<Long> deptIds = new ArrayList<>();
+        Map<Long, String> deptMap = new HashMap<>();
+        page.getRecords().forEach(e -> deptIds.add(e.getDeptId()));
+        if (!deptIds.isEmpty()) {
+            deptMapper.selectByIds(deptIds)
+                .forEach(e -> deptMap.put(e.getDeptId(), e.getDeptName()));
+        }
+        return TableDataInfo.build(page.convert(e -> {
+            SysUserListOnNameVo vo = new SysUserListOnNameVo();
+            vo.setId(e.getUserId());
+            vo.setName(e.getNickName());
+            vo.setDeptName(deptMap.get(e.getDeptId()));
+            vo.setPhoneNumber(e.getPhonenumber());
+            return vo;
+        }));
+    }
+
     /**
      * 通过用户ID查询用户账户
      *

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

@@ -0,0 +1,16 @@
+package com.yingpaipay.business.constant;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+public interface DictTypeConst {
+
+    String PROJECT_TYPE = "project_type";
+
+    String PROJECT_LANGUAGE = "project_language";
+
+}

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

@@ -1,26 +1,17 @@
 package com.yingpaipay.business.controller;
 
-import java.util.List;
 
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.yingpaipay.business.domain.bo.ProjectOnDocumentBo;
+import com.yingpaipay.business.domain.vo.ProjectOnDocumentVo;
+import com.yingpaipay.business.service.IProjectService;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
 import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.log.enums.BusinessType;
-import org.dromara.common.excel.utils.ExcelUtil;
-import com.yingpaipay.business.domain.vo.FolderVo;
-import com.yingpaipay.business.domain.bo.FolderBo;
 import com.yingpaipay.business.service.IFolderService;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
  * 文件夹管理
@@ -35,5 +26,14 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 public class FolderController extends BaseController {
 
     private final IFolderService folderService;
+    private final IProjectService projectService;
+
+    @SaCheckPermission("document:folder:listProject")
+    @GetMapping("/listProject")
+    public TableDataInfo<ProjectOnDocumentVo> listProject(ProjectOnDocumentBo bo, PageQuery pageQuery) {
+        return projectService.listOnDocument(bo, pageQuery);
+    }
+
+
 
 }

+ 17 - 1
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/controller/ProjectController.java

@@ -2,6 +2,7 @@ package com.yingpaipay.business.controller;
 
 import java.util.List;
 
+import com.yingpaipay.business.domain.bo.ProjectInviteProjectMemberBo;
 import com.yingpaipay.business.domain.bo.ProjectUpdateStatusBo;
 import com.yingpaipay.business.domain.vo.ProjectListByNameVo;
 import com.yingpaipay.business.domain.vo.ProjectMemberListVo;
@@ -126,10 +127,25 @@ public class ProjectController extends BaseController {
 
     @SaCheckPermission("project:management:queryProjectMember")
     @Log(title = "项目管理", businessType = BusinessType.UPDATE)
-    @RepeatSubmit()
     @GetMapping("/queryProjectMember")
     public TableDataInfo<ProjectMemberListVo> queryProjectMember(@RequestParam("id") Long id, PageQuery pageQuery) {
         return projectService.selectMemberListById(id, pageQuery);
     }
 
+    @SaCheckPermission("project:management:queryProjectMemberInviteMember")
+    @Log(title = "项目管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/queryProjectMemberInviteMember")
+    public R<Void> queryProjectMemberInviteMember(@RequestBody ProjectInviteProjectMemberBo bo) {
+        return toAjax(projectService.inviteProjectMember(bo));
+    }
+
+    @SaCheckPermission("project:management:queryProjectMemberRemove")
+    @Log(title = "项目管理", businessType = BusinessType.DELETE)
+    @RepeatSubmit()
+    @DeleteMapping("/queryProjectMemberRemove")
+    public R<Void> removeProjectMember(@RequestParam("projectId") Long projectId, @RequestParam("userId") Long userId) {
+        return toAjax(projectService.removeProjectMember(projectId, userId));
+    }
+
 }

+ 19 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectInviteMemberBo.java

@@ -0,0 +1,19 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ProjectInviteMemberBo {
+
+    private Long id;
+
+    private String note;
+
+}

+ 21 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectInviteProjectMemberBo.java

@@ -0,0 +1,21 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ProjectInviteProjectMemberBo {
+
+    private Long projectId;
+
+    private List<ProjectInviteMemberBo> users;
+
+}

+ 29 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/bo/ProjectOnDocumentBo.java

@@ -0,0 +1,29 @@
+package com.yingpaipay.business.domain.bo;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ProjectOnDocumentBo {
+
+    private String name;
+
+    private String code;
+
+    private String language;
+
+    private String type;
+
+    private Integer status;
+
+    private Map<String, Object> params = new HashMap<>();
+}

+ 2 - 2
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/ProjectMemberListVo.java

@@ -22,8 +22,8 @@ public class ProjectMemberListVo {
 
     private String dept;
 
-    private String role;
-
     private Date time;
 
+    private String note;
+
 }

+ 37 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/domain/vo/ProjectOnDocumentVo.java

@@ -0,0 +1,37 @@
+package com.yingpaipay.business.domain.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-12-09
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ProjectOnDocumentVo {
+
+    private Long id;
+
+    private String code;
+
+    private String name;
+
+    private String language;
+
+    private String type;
+
+    private String status;
+
+    private Date startTime;
+
+    private Date endTime;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 9 - 0
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/enumeration/ProjectStatusEnum.java

@@ -26,4 +26,13 @@ public enum ProjectStatusEnum {
         this.label = label;
     }
 
+    public static String getLabel(Integer value) {
+        for (ProjectStatusEnum status : values()) {
+            if (value.equals(status.value)) {
+                return status.label;
+            }
+        }
+        throw new IllegalArgumentException("未知状态");
+    }
+
 }

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

@@ -1,8 +1,11 @@
 package com.yingpaipay.business.service;
 
+import com.yingpaipay.business.domain.bo.ProjectInviteProjectMemberBo;
+import com.yingpaipay.business.domain.bo.ProjectOnDocumentBo;
 import com.yingpaipay.business.domain.bo.ProjectUpdateStatusBo;
 import com.yingpaipay.business.domain.vo.ProjectListByNameVo;
 import com.yingpaipay.business.domain.vo.ProjectMemberListVo;
+import com.yingpaipay.business.domain.vo.ProjectOnDocumentVo;
 import com.yingpaipay.business.domain.vo.ProjectVo;
 import com.yingpaipay.business.domain.bo.ProjectBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -76,4 +79,10 @@ public interface IProjectService {
     int updateStatus(ProjectUpdateStatusBo bo);
 
     TableDataInfo<ProjectMemberListVo> selectMemberListById(Long id, PageQuery pageQuery);
+
+    boolean inviteProjectMember(ProjectInviteProjectMemberBo bo);
+
+    int removeProjectMember(Long projectId, Long userId);
+
+    TableDataInfo<ProjectOnDocumentVo> listOnDocument(ProjectOnDocumentBo bo, PageQuery pageQuery);
 }

+ 135 - 11
ruoyi-modules/yingpaipay-business/src/main/java/com/yingpaipay/business/service/impl/ProjectServiceImpl.java

@@ -1,9 +1,15 @@
 package com.yingpaipay.business.service.impl;
 
-import com.yingpaipay.business.domain.bo.ProjectUpdateStatusBo;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yingpaipay.business.constant.DictTypeConst;
+import com.yingpaipay.business.domain.bo.*;
+import com.yingpaipay.business.domain.vo.ProjectOnDocumentVo;
+import com.yingpaipay.business.enumeration.ProjectStatusEnum;
+import com.yingpaipay.system.domain.SysUserProject;
 import com.yingpaipay.business.domain.vo.ProjectListByNameVo;
 import com.yingpaipay.business.domain.vo.ProjectMemberListVo;
 import com.yingpaipay.system.domain.SysUserProjects;
+import com.yingpaipay.system.mapper.SysUserProjectMapper;
 import com.yingpaipay.system.mapper.SysUserProjectsMapper;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -15,12 +21,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.SysUser;
 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.ISysRoleService;
 import org.springframework.stereotype.Service;
-import com.yingpaipay.business.domain.bo.ProjectBo;
 import com.yingpaipay.business.domain.vo.ProjectVo;
 import com.yingpaipay.business.domain.Project;
 import com.yingpaipay.business.mapper.ProjectMapper;
@@ -40,12 +46,13 @@ import java.util.*;
 public class ProjectServiceImpl implements IProjectService {
 
     private final ProjectMapper baseMapper;
-    private final SysUserProjectsMapper userProjectMapper;
+    private final SysUserProjectsMapper userProjectsMapper;
+    private final SysUserProjectMapper userProjectMapper;
     private final SysUserMapper userMapper;
 
     private final ISysOssService ossService;
     private final ISysDeptService deptService;
-    private final ISysRoleService roleService;
+    private final ISysDictTypeService dictTypeService;
 
     /**
      * 查询项目管理
@@ -118,12 +125,15 @@ public class ProjectServiceImpl implements IProjectService {
         lqw.between(params.get("beginUpdateTime") != null && params.get("endUpdateTime") != null,
             Project::getUpdateTime, params.get("beginUpdateTime"), params.get("endUpdateTime"));
 
-        SysUserProjects project = userProjectMapper.selectOne(Wrappers.lambdaQuery(SysUserProjects.class).eq(SysUserProjects::getUserId, LoginHelper.getUserId()));
-        if (project.getProjects().isEmpty()) {
+        // TODO 只有拥有该项目数据权限的人才能够在列表中看到该项目
+        String projects = userProjectsMapper.selectOne(
+            Wrappers.lambdaQuery(SysUserProjects.class)
+                .eq(SysUserProjects::getUserId, LoginHelper.getUserId())
+        ).getProjects();
+        if (projects.isEmpty()) {
             lqw.in(Project::getId, List.of(-1L));
-        } else if (!project.getProjects().equals("*")) {
-            List<Long> projectIds = Arrays.stream(project.getProjects().split(",")).map(Long::valueOf).toList();
-            lqw.in(Project::getId, projectIds);
+        } else if (!projects.equals("*")) {
+            lqw.in(Project::getId, Arrays.stream(projects.split(",")).map(Long::valueOf).toList());
         }
 
         return lqw;
@@ -219,6 +229,120 @@ public class ProjectServiceImpl implements IProjectService {
 
     @Override
     public TableDataInfo<ProjectMemberListVo> selectMemberListById(Long id, PageQuery pageQuery) {
-        return TableDataInfo.build();
+        List<Long> userIds = new ArrayList<>();
+        Page<SysUserProject> page = userProjectMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysUserProject.class)
+                .eq(SysUserProject::getProjectId, id)
+                .orderByDesc(SysUserProject::getJoinTime)
+        );
+        page.getRecords().forEach(e -> userIds.add(e.getUserId()));
+        if (userIds.isEmpty()) {
+            return TableDataInfo.build();
+        }
+        Map<Long, SysUser> userMap = new HashMap<>();
+        List<Long> deptIds = new ArrayList<>();
+        Map<Long, String> deptMap = new HashMap<>();
+        List<SysUser> userList = userMapper.selectByIds(userIds);
+        userList.forEach(e -> {
+            userMap.put(e.getUserId(), e);
+            deptIds.add(e.getDeptId());
+        });
+        if (!deptIds.isEmpty()) {
+            deptService.selectDeptByIds(deptIds)
+                .forEach(e -> deptMap.put(e.getDeptId(), e.getDeptName()));
+        }
+        return TableDataInfo.build(page.convert(e -> {
+            ProjectMemberListVo vo = new ProjectMemberListVo();
+            SysUser user = userMap.get(e.getUserId());
+            if (user == null) {
+                return null;
+            }
+            vo.setId(user.getUserId());
+            vo.setName(user.getNickName());
+            vo.setPhoneNumber(user.getPhonenumber());
+            vo.setDept(deptMap.get(user.getDeptId()));
+            vo.setNote(e.getNote());
+            vo.setTime(e.getJoinTime());
+            return vo;
+        }));
+    }
+
+    @Override
+    public boolean inviteProjectMember(ProjectInviteProjectMemberBo bo) {
+        if (bo.getUsers().isEmpty()) {
+            return true;
+        }
+        List<SysUserProject> userProjectList = new ArrayList<>();
+        List<ProjectInviteMemberBo> users = bo.getUsers();
+        for (ProjectInviteMemberBo user : users) {
+            SysUserProject entity = new SysUserProject();
+            entity.setUserId(user.getId());
+            entity.setNote(user.getNote());
+            entity.setProjectId(bo.getProjectId());
+            userProjectList.add(entity);
+        }
+        return userProjectMapper.insertBatch(userProjectList);
+    }
+
+    @Override
+    public int removeProjectMember(Long projectId, Long userId) {
+        return userProjectMapper.delete(
+            Wrappers.lambdaQuery(SysUserProject.class)
+                .eq(SysUserProject::getUserId, userId)
+                .eq(SysUserProject::getProjectId, projectId)
+        );
+    }
+
+    @Override
+    public TableDataInfo<ProjectOnDocumentVo> listOnDocument(ProjectOnDocumentBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<Project> wrapper = buildQueryOnDocumentWrapper(bo);
+        IPage<Project> page = baseMapper.selectPage(pageQuery.build(), wrapper);
+        return TableDataInfo.build(page.convert(e -> {
+            ProjectOnDocumentVo vo = new ProjectOnDocumentVo();
+            vo.setId(e.getId());
+            vo.setCode(e.getCode());
+            vo.setName(e.getName());
+            vo.setLanguage(e.getLanguage());
+            vo.setType(e.getType());
+            vo.setStatus(ProjectStatusEnum.getLabel(e.getStatus()));
+            vo.setStartTime(e.getStartTime());
+            vo.setEndTime(e.getEndTime());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setUpdateTime(e.getUpdateTime());
+            return vo;
+        }));
+    }
+
+    private LambdaQueryWrapper<Project> buildQueryOnDocumentWrapper(ProjectOnDocumentBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<Project> lqw = Wrappers.lambdaQuery();
+        lqw.orderByDesc(Project::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getCode()), Project::getCode, bo.getCode());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), Project::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getLanguage()), Project::getLanguage, bo.getLanguage());
+        lqw.eq(StringUtils.isNotBlank(bo.getType()), Project::getType, bo.getType());
+        lqw.eq(bo.getStatus() != null, Project::getStatus, bo.getStatus());
+        lqw.between(params.get("beginStartTime") != null && params.get("endStartTime") != null,
+            Project::getStartTime, params.get("beginStartTime"), params.get("endStartTime"));
+        lqw.between(params.get("beginEndTime") != null && params.get("endEndTime") != null,
+            Project::getEndTime, params.get("beginEndTime"), params.get("endEndTime"));
+        lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
+            Project::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
+        lqw.between(params.get("beginUpdateTime") != null && params.get("endUpdateTime") != null,
+            Project::getUpdateTime, params.get("beginUpdateTime"), params.get("endUpdateTime"));
+
+        // TODO 只有拥有该项目数据权限的人才能够在列表中看到该项目
+        String projects = userProjectsMapper.selectOne(
+            Wrappers.lambdaQuery(SysUserProjects.class)
+                .eq(SysUserProjects::getUserId, LoginHelper.getUserId())
+        ).getProjects();
+        if (projects.isEmpty()) {
+            lqw.in(Project::getId, List.of(-1L));
+        } else if (!projects.equals("*")) {
+            lqw.in(Project::getId, Arrays.stream(projects.split(",")).map(Long::valueOf).toList());
+        }
+
+        return lqw;
     }
 }

+ 1 - 15
script/sql/business/create.sql

@@ -36,6 +36,7 @@ CREATE TABLE `sys_user_project`
 (
     `user_id`   bigint NOT NULL COMMENT '用户ID',
     `project_id` bigint NOT NULL COMMENT '项目ID',
+    `note`      varchar(255) COMMENT '备注',
     `join_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
     PRIMARY KEY (`user_id`, `project_id`)
 ) ENGINE = InnoDB
@@ -68,21 +69,6 @@ CREATE TABLE `folder`
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='文件夹';
 
-CREATE TABLE `folder_permission`
-(
-    `id`          bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',
-    `folder_id`   bigint unsigned             NOT NULL COMMENT '所属文件夹',
-    `edit`        tinyint(1) unsigned         NOT NULL DEFAULT 0 COMMENT '编辑权限',
-    `create_dept` bigint(20) COMMENT '创建部门',
-    `create_by`   bigint(20) COMMENT '创建者',
-    `create_time` datetime COMMENT '创建时间',
-    `update_by`   bigint(20) COMMENT '更新者',
-    `update_time` datetime COMMENT '更新时间',
-    `del_flag`    char(1)                              DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
-    `tenant_id`   varchar(40) COMMENT '租户id'
-) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8mb4 COMMENT ='文件权限';
-
 CREATE TABLE `file`
 (
     `id`                 bigint unsigned PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '序号',