diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/pom.xml b/yudao-module-mdpf/yudao-module-mdpf-biz/pom.xml
index 913ce5e69..4a1923214 100644
--- a/yudao-module-mdpf/yudao-module-mdpf-biz/pom.xml
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/pom.xml
@@ -50,5 +50,9 @@
poi-ooxml
4.1.2
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-excel
+
-
\ No newline at end of file
+
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/ProjectController.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/ProjectController.java
new file mode 100644
index 000000000..b08d8d56d
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/ProjectController.java
@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.project;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectPageReqVO;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectRespVO;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectSaveReqVO;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.project.ProjectDO;
+import cn.iocoder.yudao.module.mdpf.service.project.ProjectService;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+
+@Tag(name = "管理后台 - 项目")
+@RestController
+@RequestMapping("/att/project")
+@Validated
+public class ProjectController {
+
+ @Resource
+ private ProjectService projectService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建项目")
+ @PreAuthorize("@ss.hasPermission('att:project:create')")
+ public CommonResult createProject(@Valid @RequestBody ProjectSaveReqVO createReqVO) {
+ return success(projectService.createProject(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新项目")
+ @PreAuthorize("@ss.hasPermission('att:project:update')")
+ public CommonResult updateProject(@Valid @RequestBody ProjectSaveReqVO updateReqVO) {
+ projectService.updateProject(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除项目")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('att:project:delete')")
+ public CommonResult deleteProject(@RequestParam("id") Long id) {
+ projectService.deleteProject(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得项目")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('att:project:query')")
+ public CommonResult getProject(@RequestParam("id") Long id) {
+ ProjectDO project = projectService.getProject(id);
+ return success(BeanUtils.toBean(project, ProjectRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得项目分页")
+ @PreAuthorize("@ss.hasPermission('att:project:query')")
+ public CommonResult> getProjectPage(@Valid ProjectPageReqVO pageReqVO) {
+ PageResult pageResult = projectService.getProjectPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ProjectRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出项目 Excel")
+ @PreAuthorize("@ss.hasPermission('att:project:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProjectExcel(@Valid ProjectPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = projectService.getProjectPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "项目.xls", "数据", ProjectRespVO.class,
+ BeanUtils.toBean(list, ProjectRespVO.class));
+ }
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectPageReqVO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectPageReqVO.java
new file mode 100644
index 000000000..857f41e60
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectPageReqVO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.project.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 项目分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ProjectPageReqVO extends PageParam {
+
+ @Schema(description = "项目名称", example = "芋艿")
+ private String name;
+
+ @Schema(description = "项目管理员id", example = "29571")
+ private Long managerId;
+
+ @Schema(description = "项目描述", example = "随便")
+ private String description;
+
+ @Schema(description = "是否有效;0:无效,1:有效")
+ private String validFlag;
+
+ @Schema(description = "创建人id", example = "16812")
+ private Long creatorId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "更新人")
+ private String updater;
+
+ @Schema(description = "更新人id", example = "2533")
+ private Long updaterId;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "code")
+ private String code;
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectRespVO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectRespVO.java
new file mode 100644
index 000000000..7500beac0
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectRespVO.java
@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.project.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 项目 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProjectRespVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14209")
+ @ExcelProperty("ID")
+ private Long id;
+
+ @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+ @ExcelProperty("项目名称")
+ private String name;
+
+ @Schema(description = "项目管理员id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29571")
+ @ExcelProperty("项目管理员id")
+ private Long managerId;
+
+ @Schema(description = "项目描述", example = "随便")
+ @ExcelProperty("项目描述")
+ private String description;
+
+ @Schema(description = "是否有效;0:无效,1:有效", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否有效;0:无效,1:有效")
+ private String validFlag;
+
+ @Schema(description = "创建人id", example = "16812")
+ @ExcelProperty("创建人id")
+ private Long creatorId;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "更新人")
+ @ExcelProperty("更新人")
+ private String updater;
+
+ @Schema(description = "更新人id", example = "2533")
+ @ExcelProperty("更新人id")
+ private Long updaterId;
+
+ @Schema(description = "备注", example = "你说的对")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "code")
+ @ExcelProperty("code")
+ private String code;
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectSaveReqVO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectSaveReqVO.java
new file mode 100644
index 000000000..90b55ae13
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/project/vo/ProjectSaveReqVO.java
@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.project.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 项目新增/修改 Request VO")
+@Data
+public class ProjectSaveReqVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14209")
+ private Long id;
+
+ @Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+ @NotEmpty(message = "项目名称不能为空")
+ private String name;
+
+ @Schema(description = "项目管理员id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29571")
+ @NotNull(message = "项目管理员id不能为空")
+ private Long managerId;
+
+ @Schema(description = "项目描述", example = "随便")
+ private String description;
+
+ @Schema(description = "是否有效;0:无效,1:有效", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否有效;0:无效,1:有效不能为空")
+ private String validFlag;
+
+ @Schema(description = "创建人id", example = "16812")
+ private Long creatorId;
+
+ @Schema(description = "更新人")
+ private String updater;
+
+ @Schema(description = "更新人id", example = "2533")
+ private Long updaterId;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "code")
+ private String code;
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/ProjectUserRelController.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/ProjectUserRelController.java
new file mode 100644
index 000000000..da0ac64b3
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/ProjectUserRelController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo.*;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.projectuserrel.ProjectUserRelDO;
+import cn.iocoder.yudao.module.mdpf.service.projectuserrel.ProjectUserRelService;
+
+@Tag(name = "管理后台 - 项目表与用户表关联关系")
+@RestController
+@RequestMapping("/mdpf/project-user-rel")
+@Validated
+public class ProjectUserRelController {
+
+ @Resource
+ private ProjectUserRelService projectUserRelService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建项目表与用户表关联关系")
+ @PreAuthorize("@ss.hasPermission('mdpf:project-user-rel:create')")
+ public CommonResult createProjectUserRel(@Valid @RequestBody ProjectUserRelSaveReqVO createReqVO) {
+ return success(projectUserRelService.createProjectUserRel(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新项目表与用户表关联关系")
+ @PreAuthorize("@ss.hasPermission('mdpf:project-user-rel:update')")
+ public CommonResult updateProjectUserRel(@Valid @RequestBody ProjectUserRelSaveReqVO updateReqVO) {
+ projectUserRelService.updateProjectUserRel(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除项目表与用户表关联关系")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('mdpf:project-user-rel:delete')")
+ public CommonResult deleteProjectUserRel(@RequestParam("id") Long id) {
+ projectUserRelService.deleteProjectUserRel(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得项目表与用户表关联关系")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('mdpf:project-user-rel:query')")
+ public CommonResult getProjectUserRel(@RequestParam("id") Long id) {
+ ProjectUserRelDO projectUserRel = projectUserRelService.getProjectUserRel(id);
+ return success(BeanUtils.toBean(projectUserRel, ProjectUserRelRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得项目表与用户表关联关系分页")
+ @PreAuthorize("@ss.hasPermission('mdpf:project-user-rel:query')")
+ public CommonResult> getProjectUserRelPage(@Valid ProjectUserRelPageReqVO pageReqVO) {
+ PageResult pageResult = projectUserRelService.getProjectUserRelPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ProjectUserRelRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出项目表与用户表关联关系 Excel")
+ @PreAuthorize("@ss.hasPermission('mdpf:project-user-rel:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProjectUserRelExcel(@Valid ProjectUserRelPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = projectUserRelService.getProjectUserRelPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "项目表与用户表关联关系.xls", "数据", ProjectUserRelRespVO.class,
+ BeanUtils.toBean(list, ProjectUserRelRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelPageReqVO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelPageReqVO.java
new file mode 100644
index 000000000..5c2d1bba0
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelPageReqVO.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 项目表与用户表关联关系分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ProjectUserRelPageReqVO extends PageParam {
+
+ @Schema(description = "项目空间ID", example = "20683")
+ private Long projectId;
+
+ @Schema(description = "用户ID", example = "11066")
+ private Long userId;
+
+ @Schema(description = "是否有效;0:无效,1:有效")
+ private String validFlag;
+
+ @Schema(description = "创建人id", example = "11994")
+ private Long creatorId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "更新人id", example = "24433")
+ private Long updaterId;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelRespVO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelRespVO.java
new file mode 100644
index 000000000..4ecd4aa55
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelRespVO.java
@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 项目表与用户表关联关系 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProjectUserRelRespVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4436")
+ @ExcelProperty("ID")
+ private Long id;
+
+ @Schema(description = "项目空间ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20683")
+ @ExcelProperty("项目空间ID")
+ private Long projectId;
+
+ @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11066")
+ @ExcelProperty("用户ID")
+ private Long userId;
+
+ @Schema(description = "是否有效;0:无效,1:有效", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否有效;0:无效,1:有效")
+ private String validFlag;
+
+ @Schema(description = "创建人id", example = "11994")
+ @ExcelProperty("创建人id")
+ private Long creatorId;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "更新人id", example = "24433")
+ @ExcelProperty("更新人id")
+ private Long updaterId;
+
+ @Schema(description = "备注", example = "你猜")
+ @ExcelProperty("备注")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelSaveReqVO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelSaveReqVO.java
new file mode 100644
index 000000000..a8635a696
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/controller/admin/projectuserrel/vo/ProjectUserRelSaveReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 项目表与用户表关联关系新增/修改 Request VO")
+@Data
+public class ProjectUserRelSaveReqVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4436")
+ private Long id;
+
+ @Schema(description = "项目空间ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20683")
+ @NotNull(message = "项目空间ID不能为空")
+ private Long projectId;
+
+ @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11066")
+ @NotNull(message = "用户ID不能为空")
+ private Long userId;
+
+ @Schema(description = "是否有效;0:无效,1:有效", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否有效;0:无效,1:有效不能为空")
+ private String validFlag;
+
+ @Schema(description = "创建人id", example = "11994")
+ private Long creatorId;
+
+ @Schema(description = "更新人id", example = "24433")
+ private Long updaterId;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/dataobject/project/ProjectDO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/dataobject/project/ProjectDO.java
new file mode 100644
index 000000000..759bf7537
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/dataobject/project/ProjectDO.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.mdpf.dal.dataobject.project;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 项目 DO
+ *
+ * @author 海况播报
+ */
+@TableName("att_project")
+@KeySequence("att_project_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProjectDO extends BaseDO {
+
+ /**
+ * ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 项目名称
+ */
+ private String name;
+ /**
+ * 项目管理员id
+ */
+ private Long managerId;
+ /**
+ * 项目描述
+ */
+ private String description;
+ /**
+ * 是否有效;0:无效,1:有效
+ */
+ private String validFlag;
+ /**
+ * 创建人id
+ */
+ private Long creatorId;
+ /**
+ * 更新人id
+ */
+ private Long updaterId;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * code
+ */
+ private String code;
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/dataobject/projectuserrel/ProjectUserRelDO.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/dataobject/projectuserrel/ProjectUserRelDO.java
new file mode 100644
index 000000000..93529f03b
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/dataobject/projectuserrel/ProjectUserRelDO.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.mdpf.dal.dataobject.projectuserrel;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 项目表与用户表关联关系 DO
+ *
+ * @author 海况播报
+ */
+@TableName("att_project_user_rel")
+@KeySequence("att_project_user_rel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProjectUserRelDO extends BaseDO {
+
+ /**
+ * ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 项目空间ID
+ */
+ private Long projectId;
+ /**
+ * 用户ID
+ */
+ private Long userId;
+ /**
+ * 是否有效;0:无效,1:有效
+ */
+ private String validFlag;
+ /**
+ * 创建人id
+ */
+ private Long creatorId;
+ /**
+ * 更新人id
+ */
+ private Long updaterId;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/mysql/project/ProjectMapper.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/mysql/project/ProjectMapper.java
new file mode 100644
index 000000000..fcb3ba72c
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/mysql/project/ProjectMapper.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.mdpf.dal.mysql.project;
+
+import java.util.*;
+
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectPageReqVO;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.project.ProjectDO;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.apache.ibatis.annotations.Mapper;
+
+
+/**
+ * 项目 Mapper
+ *
+ * @author 海况播报
+ */
+@Mapper
+@DS("third")
+public interface ProjectMapper extends BaseMapperX {
+
+ default PageResult selectPage(ProjectPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(ProjectDO::getName, reqVO.getName())
+ .eqIfPresent(ProjectDO::getManagerId, reqVO.getManagerId())
+ .eqIfPresent(ProjectDO::getDescription, reqVO.getDescription())
+ .eqIfPresent(ProjectDO::getValidFlag, reqVO.getValidFlag())
+ .eqIfPresent(ProjectDO::getCreatorId, reqVO.getCreatorId())
+ .betweenIfPresent(ProjectDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(ProjectDO::getUpdaterId, reqVO.getUpdaterId())
+ .eqIfPresent(ProjectDO::getRemark, reqVO.getRemark())
+ .eqIfPresent(ProjectDO::getCode, reqVO.getCode())
+ .orderByDesc(ProjectDO::getId));
+ }
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/mysql/projectuserrel/ProjectUserRelMapper.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/mysql/projectuserrel/ProjectUserRelMapper.java
new file mode 100644
index 000000000..ea14ba11e
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/dal/mysql/projectuserrel/ProjectUserRelMapper.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.mdpf.dal.mysql.projectuserrel;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.projectuserrel.ProjectUserRelDO;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo.*;
+
+/**
+ * 项目表与用户表关联关系 Mapper
+ *
+ * @author 海况播报
+ */
+@Mapper
+@DS("third")
+public interface ProjectUserRelMapper extends BaseMapperX {
+
+ default PageResult selectPage(ProjectUserRelPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ProjectUserRelDO::getProjectId, reqVO.getProjectId())
+ .eqIfPresent(ProjectUserRelDO::getUserId, reqVO.getUserId())
+ .eqIfPresent(ProjectUserRelDO::getValidFlag, reqVO.getValidFlag())
+ .eqIfPresent(ProjectUserRelDO::getCreatorId, reqVO.getCreatorId())
+ .betweenIfPresent(ProjectUserRelDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(ProjectUserRelDO::getUpdaterId, reqVO.getUpdaterId())
+ .eqIfPresent(ProjectUserRelDO::getRemark, reqVO.getRemark())
+ .orderByDesc(ProjectUserRelDO::getId));
+ }
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/project/ProjectService.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/project/ProjectService.java
new file mode 100644
index 000000000..e88a38051
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/project/ProjectService.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.mdpf.service.project;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectPageReqVO;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectSaveReqVO;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.project.ProjectDO;
+
+import java.util.*;
+import javax.validation.*;
+
+
+/**
+ * 项目 Service 接口
+ *
+ * @author 海况播报
+ */
+public interface ProjectService {
+
+ /**
+ * 创建项目
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createProject(@Valid ProjectSaveReqVO createReqVO);
+
+ /**
+ * 更新项目
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateProject(@Valid ProjectSaveReqVO updateReqVO);
+
+ /**
+ * 删除项目
+ *
+ * @param id 编号
+ */
+ void deleteProject(Long id);
+
+ /**
+ * 获得项目
+ *
+ * @param id 编号
+ * @return 项目
+ */
+ ProjectDO getProject(Long id);
+
+ /**
+ * 获得项目分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 项目分页
+ */
+ PageResult getProjectPage(ProjectPageReqVO pageReqVO);
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/project/ProjectServiceImpl.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/project/ProjectServiceImpl.java
new file mode 100644
index 000000000..679787a78
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/project/ProjectServiceImpl.java
@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.mdpf.service.project;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectPageReqVO;
+import cn.iocoder.yudao.module.mdpf.controller.admin.project.vo.ProjectSaveReqVO;
+import cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo.ProjectUserRelSaveReqVO;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.project.ProjectDO;
+import cn.iocoder.yudao.module.mdpf.dal.mysql.project.ProjectMapper;
+import cn.iocoder.yudao.module.mdpf.service.projectuserrel.ProjectUserRelService;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+
+
+/**
+ * 项目 Service 实现类
+ *
+ * @author 海况播报
+ */
+@Service
+@Validated
+public class ProjectServiceImpl implements ProjectService {
+
+ @Resource
+ private ProjectMapper projectMapper;
+
+ @Resource
+ private ProjectUserRelService projectUserRelService;
+
+ @Override
+ public Long createProject(ProjectSaveReqVO createReqVO) {
+ // 插入
+ ProjectDO project = BeanUtils.toBean(createReqVO, ProjectDO.class);
+ LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
+ project.setCreatorId(loginUser.getId());
+ projectMapper.insert(project);
+ // 创建中间表
+ ProjectUserRelSaveReqVO saveReqVO = new ProjectUserRelSaveReqVO();
+ saveReqVO.setProjectId(project.getId());
+ saveReqVO.setUserId(loginUser.getId());
+ saveReqVO.setValidFlag(project.getValidFlag());
+ saveReqVO.setCreatorId(loginUser.getId());
+ projectUserRelService.createProjectUserRel(saveReqVO);
+ // 返回
+ return project.getId();
+ }
+
+ @Override
+ public void updateProject(ProjectSaveReqVO updateReqVO) {
+ // 校验存在
+ validateProjectExists(updateReqVO.getId());
+ // 更新
+ ProjectDO updateObj = BeanUtils.toBean(updateReqVO, ProjectDO.class);
+ LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
+ updateObj.setUpdaterId(loginUser.getId());
+ projectMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteProject(Long id) {
+ // 校验存在
+ validateProjectExists(id);
+ // 删除
+ projectMapper.deleteById(id);
+ }
+
+ private void validateProjectExists(Long id) {
+ if (projectMapper.selectById(id) == null) {
+ throw exception(new ErrorCode(10050, "项目不存在"));
+ }
+ }
+
+ @Override
+ public ProjectDO getProject(Long id) {
+ return projectMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getProjectPage(ProjectPageReqVO pageReqVO) {
+ return projectMapper.selectPage(pageReqVO);
+ }
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/projectuserrel/ProjectUserRelService.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/projectuserrel/ProjectUserRelService.java
new file mode 100644
index 000000000..3b784063e
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/projectuserrel/ProjectUserRelService.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.mdpf.service.projectuserrel;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo.*;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.projectuserrel.ProjectUserRelDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 项目表与用户表关联关系 Service 接口
+ *
+ * @author 海况播报
+ */
+public interface ProjectUserRelService {
+
+ /**
+ * 创建项目表与用户表关联关系
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createProjectUserRel(@Valid ProjectUserRelSaveReqVO createReqVO);
+
+ /**
+ * 更新项目表与用户表关联关系
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateProjectUserRel(@Valid ProjectUserRelSaveReqVO updateReqVO);
+
+ /**
+ * 删除项目表与用户表关联关系
+ *
+ * @param id 编号
+ */
+ void deleteProjectUserRel(Long id);
+
+ /**
+ * 获得项目表与用户表关联关系
+ *
+ * @param id 编号
+ * @return 项目表与用户表关联关系
+ */
+ ProjectUserRelDO getProjectUserRel(Long id);
+
+ /**
+ * 获得项目表与用户表关联关系分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 项目表与用户表关联关系分页
+ */
+ PageResult getProjectUserRelPage(ProjectUserRelPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/projectuserrel/ProjectUserRelServiceImpl.java b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/projectuserrel/ProjectUserRelServiceImpl.java
new file mode 100644
index 000000000..8369d7800
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/java/cn/iocoder/yudao/module/mdpf/service/projectuserrel/ProjectUserRelServiceImpl.java
@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.mdpf.service.projectuserrel;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.mdpf.controller.admin.projectuserrel.vo.*;
+import cn.iocoder.yudao.module.mdpf.dal.dataobject.projectuserrel.ProjectUserRelDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.mdpf.dal.mysql.projectuserrel.ProjectUserRelMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+
+
+/**
+ * 项目表与用户表关联关系 Service 实现类
+ *
+ * @author 海况播报
+ */
+@Service
+@Validated
+public class ProjectUserRelServiceImpl implements ProjectUserRelService {
+
+ @Resource
+ private ProjectUserRelMapper projectUserRelMapper;
+
+ @Override
+ public Long createProjectUserRel(ProjectUserRelSaveReqVO createReqVO) {
+ // 插入
+ ProjectUserRelDO projectUserRel = BeanUtils.toBean(createReqVO, ProjectUserRelDO.class);
+ projectUserRelMapper.insert(projectUserRel);
+ // 返回
+ return projectUserRel.getId();
+ }
+
+ @Override
+ public void updateProjectUserRel(ProjectUserRelSaveReqVO updateReqVO) {
+ // 校验存在
+ validateProjectUserRelExists(updateReqVO.getId());
+ // 更新
+ ProjectUserRelDO updateObj = BeanUtils.toBean(updateReqVO, ProjectUserRelDO.class);
+ projectUserRelMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteProjectUserRel(Long id) {
+ // 校验存在
+ validateProjectUserRelExists(id);
+ // 删除
+ projectUserRelMapper.deleteById(id);
+ }
+
+ private void validateProjectUserRelExists(Long id) {
+ if (projectUserRelMapper.selectById(id) == null) {
+ throw exception(new ErrorCode(0404, "项目表与用户表关联关系不存在"));
+ }
+ }
+
+ @Override
+ public ProjectUserRelDO getProjectUserRel(Long id) {
+ return projectUserRelMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getProjectUserRelPage(ProjectUserRelPageReqVO pageReqVO) {
+ return projectUserRelMapper.selectPage(pageReqVO);
+ }
+
+}
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/resources/mapper/project/ProjectMapper.xml b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/resources/mapper/project/ProjectMapper.xml
new file mode 100644
index 000000000..8abbfbeee
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/resources/mapper/project/ProjectMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/resources/mapper/projectuserrel/ProjectUserRelMapper.xml b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/resources/mapper/projectuserrel/ProjectUserRelMapper.xml
new file mode 100644
index 000000000..9deae99bf
--- /dev/null
+++ b/yudao-module-mdpf/yudao-module-mdpf-biz/src/main/resources/mapper/projectuserrel/ProjectUserRelMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file