From 93e8ee265fa9e9809b9684f507b179f22b9b5fb2 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Wed, 5 Mar 2025 16:23:44 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E7=94=A8=E6=88=B7=E5=92=8C=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 2 +- .../common/core/common/PageRequest.java | 31 ++ .../common/core/constant/CommonConstant.java | 18 ++ .../common/core/utils/sql/SqlUtil.java | 13 + .../mybatis/core/domain/BaseEntity.java | 4 +- .../handler/InjectionMetaObjectHandler.java | 2 +- .../project/controller/ProjectController.java | 113 +++++++ .../UserProjectRelevancyController.java | 132 ++++++++ .../org/dromara/project/domain/Project.java | 140 +++++++++ .../project/domain/UserProjectRelevancy.java | 42 +++ .../dromara/project/domain/bo/ProjectBo.java | 141 +++++++++ .../domain/bo/UserProjectRelevancyBo.java | 49 +++ .../domain/req/project/ProjectCreateReq.java | 107 +++++++ .../domain/req/project/ProjectQueryReq.java | 105 +++++++ .../domain/req/project/ProjectUpdateReq.java | 112 +++++++ .../UserProjectRelevancyCreateReq.java | 28 ++ .../UserProjectRelevancyQueryReq.java | 35 +++ .../UserProjectRelevancyUpdateReq.java | 33 ++ .../LoginUserProjectRelevancyResp.java | 42 +++ .../dromara/project/domain/vo/ProjectVo.java | 148 +++++++++ .../domain/vo/UserProjectRelevancyVo.java | 51 ++++ .../dromara/project/mapper/ProjectMapper.java | 15 + .../mapper/UserProjectRelevancyMapper.java | 15 + .../project/service/IProjectService.java | 98 ++++++ .../service/IUserProjectRelevancyService.java | 117 +++++++ .../service/impl/ProjectServiceImpl.java | 256 ++++++++++++++++ .../impl/UserProjectRelevancyServiceImpl.java | 287 ++++++++++++++++++ .../src/main/resources/mapper/package-info.md | 3 - .../mapper/project/ProjectMapper.xml | 7 + .../project/UserProjectRelevancyMapper.xml | 7 + RuoYi-Vue-Plus/script/sql/xinnengyuan.sql | 120 ++++++++ 31 files changed, 2266 insertions(+), 7 deletions(-) create mode 100644 RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/common/PageRequest.java create mode 100644 RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CommonConstant.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/ProjectController.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/UserProjectRelevancy.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/ProjectBo.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/UserProjectRelevancyBo.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyCreateReq.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyQueryReq.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyUpdateReq.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/resp/userprojectrelevancy/LoginUserProjectRelevancyResp.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/UserProjectRelevancyVo.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/ProjectMapper.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/UserProjectRelevancyMapper.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IProjectService.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java delete mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/ProjectMapper.xml create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/UserProjectRelevancyMapper.xml create mode 100644 RuoYi-Vue-Plus/script/sql/xinnengyuan.sql diff --git a/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application.yml b/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application.yml index 42158236..d34adc85 100644 --- a/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application.yml +++ b/RuoYi-Vue-Plus/ruoyi-admin/src/main/resources/application.yml @@ -261,7 +261,7 @@ management: --- # 默认/推荐使用sse推送 sse: - enabled: false + enabled: true path: /resource/sse --- # websocket diff --git a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/common/PageRequest.java b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/common/PageRequest.java new file mode 100644 index 00000000..b79da1cb --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/common/PageRequest.java @@ -0,0 +1,31 @@ +package org.dromara.common.core.common; + +import lombok.Data; +import org.dromara.common.core.constant.CommonConstant; + +/** + * 分页请求 + */ +@Data +public class PageRequest { + + /** + * 当前页号 + */ + private int current = 1; + + /** + * 页面大小 + */ + private int pageSize = 10; + + /** + * 排序字段 + */ + private String sortField; + + /** + * 排序顺序(默认升序) + */ + private String sortOrder = CommonConstant.SORT_ORDER_ASC; +} diff --git a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CommonConstant.java b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CommonConstant.java new file mode 100644 index 00000000..6281e7d8 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CommonConstant.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.constant; + +/** + * 通用常量 + */ +public interface CommonConstant { + + /** + * 升序 + */ + String SORT_ORDER_ASC = "ascend"; + + /** + * 降序 + */ + String SORT_ORDER_DESC = " descend"; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java index 1020c81e..ba737b60 100644 --- a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java +++ b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/sql/SqlUtil.java @@ -53,4 +53,17 @@ public class SqlUtil { } } } + + /** + * 校验排序字段是否合法(防止 SQL 注入) + * + * @param sortField 排序字段 + * @return 是否存在 SQL 注入 + */ + public static boolean validSortField(String sortField) { + if (StringUtils.isBlank(sortField)) { + return false; + } + return !StringUtils.containsAny(sortField, "=", "(", ")", " "); + } } diff --git a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java index 13a79416..4c53ecb1 100644 --- a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java +++ b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -33,8 +33,8 @@ public class BaseEntity implements Serializable { /** * 创建部门 */ - @TableField(fill = FieldFill.INSERT) - private Long createDept; +/* @TableField(fill = FieldFill.INSERT) + private Long createDept;*/ /** * 创建者 diff --git a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index fec25792..5cb96c35 100644 --- a/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/RuoYi-Vue-Plus/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -44,7 +44,7 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { // 填充创建人、更新人和创建部门信息 baseEntity.setCreateBy(userId); baseEntity.setUpdateBy(userId); - baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); +// baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId())); } } } else { diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/ProjectController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/ProjectController.java new file mode 100644 index 00000000..7debe4b3 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/ProjectController.java @@ -0,0 +1,113 @@ +package org.dromara.project.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.project.domain.bo.ProjectBo; +import org.dromara.project.domain.req.project.ProjectCreateReq; +import org.dromara.project.domain.req.project.ProjectQueryReq; +import org.dromara.project.domain.req.project.ProjectUpdateReq; +import org.dromara.project.domain.vo.ProjectVo; +import org.dromara.project.service.IProjectService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 项目 + * + * @author lcj + * @date 2025-03-04 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/project") +public class ProjectController extends BaseController { + + private final IProjectService projectService; + + /** + * 查询项目列表 + */ + @SaCheckPermission("project:project:list") + @GetMapping("/list") + public Page list(ProjectQueryReq req) { + return projectService.queryPageList(req); + } + + /** + * 导出项目列表 + */ + @SaCheckPermission("project:project:export") + @Log(title = "项目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ProjectBo bo, HttpServletResponse response) { + List list = projectService.queryList(bo); + ExcelUtil.exportExcel(list, "项目", ProjectVo.class, response); + } + + /** + * 获取项目详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("project:project:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(projectService.queryById(id)); + } + + /** + * 新增项目 + */ + @SaCheckPermission("project:project:add") + @Log(title = "项目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ProjectCreateReq req) { + if (req == null) { + throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST); + } + return R.ok(projectService.insertByBo(req)); + } + + /** + * 修改项目 + */ + @SaCheckPermission("project:project:edit") + @Log(title = "项目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ProjectUpdateReq req) { + return toAjax(projectService.updateByBo(req)); + } + + /** + * 删除项目 + * + * @param ids 主键串 + */ + @SaCheckPermission("project:project:remove") + @Log(title = "项目", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(projectService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java new file mode 100644 index 00000000..fd0e3788 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java @@ -0,0 +1,132 @@ +package org.dromara.project.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +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.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.project.domain.bo.UserProjectRelevancyBo; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq; +import org.dromara.project.domain.resp.userprojectrelevancy.LoginUserProjectRelevancyResp; +import org.dromara.project.domain.vo.UserProjectRelevancyVo; +import org.dromara.project.service.IUserProjectRelevancyService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统用户与项目关联 + * + * @author lcj + * @date 2025-03-04 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/projectRelevancy") +public class UserProjectRelevancyController extends BaseController { + + private final IUserProjectRelevancyService userProjectRelevancyService; + + /** + * 查询系统用户与项目关联列表 + */ + @SaCheckPermission("project:projectRelevancy:list") + @GetMapping("/list") + public TableDataInfo list(UserProjectRelevancyBo bo, PageQuery pageQuery) { + return userProjectRelevancyService.queryPageList(bo, pageQuery); + } + + /** + * 查询登录用户与项目关联列表 + */ + @SaCheckPermission("project:projectRelevancy:list") + @GetMapping("/login/list") + public R> listByLoginUser() { + Long userId = LoginHelper.getUserId(); + return R.ok(userProjectRelevancyService.queryListByUserId(userId)); + } + + /** + * 查询登录用户与项目关联分页 + */ + @SaCheckPermission("project:projectRelevancy:list") + @GetMapping("/login/page") + public R> pageByLoginUser(UserProjectRelevancyQueryReq req) { + Long userId = LoginHelper.getUserId(); + return R.ok(userProjectRelevancyService.queryPageByUserId(userId, req)); + } + + /** + * 导出系统用户与项目关联列表 + */ + @SaCheckPermission("project:projectRelevancy:export") + @Log(title = "系统用户与项目关联", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(UserProjectRelevancyBo bo, HttpServletResponse response) { + List list = userProjectRelevancyService.queryList(bo); + ExcelUtil.exportExcel(list, "系统用户与项目关联", UserProjectRelevancyVo.class, response); + } + + /** + * 获取系统用户与项目关联详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("project:projectRelevancy:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(userProjectRelevancyService.queryById(id)); + } + + /** + * 新增系统用户与项目关联 + */ + @SaCheckPermission("project:projectRelevancy:add") + @Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody UserProjectRelevancyCreateReq req) { + return R.ok(userProjectRelevancyService.insertByBo(req)); + } + + /** + * 修改系统用户与项目关联 + */ + @SaCheckPermission("project:projectRelevancy:edit") + @Log(title = "系统用户与项目关联", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody UserProjectRelevancyUpdateReq req) { + return toAjax(userProjectRelevancyService.updateByBo(req)); + } + + /** + * 删除系统用户与项目关联 + * + * @param ids 主键串 + */ + @SaCheckPermission("project:projectRelevancy:remove") + @Log(title = "系统用户与项目关联", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(userProjectRelevancyService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java new file mode 100644 index 00000000..5a1d03e9 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java @@ -0,0 +1,140 @@ +package org.dromara.project.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 项目对象 project + * + * @author lcj + * @date 2025-03-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("project") +public class Project extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long pId; + + /** + * 状态(0正常 1停用) + */ + private Long status; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String type; + + /** + * 项目类型(1光伏 2风电) + */ + private Long isType; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡范围(09:00,18:00) + */ + private String punchRange; + + /** + * 设计总量 + */ + private Long designTotal; + + /** + * 安全协议书 + */ + private String securityAgreement; + + /** + * 排序字段 + */ + private Long sort; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private Long showHidden; + + /** + * 是否删除(0正常 1删除) + */ + @TableLogic + private Long isDelete; + + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/UserProjectRelevancy.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/UserProjectRelevancy.java new file mode 100644 index 00000000..f43fb0b1 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/UserProjectRelevancy.java @@ -0,0 +1,42 @@ +package org.dromara.project.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 系统用户与项目关联对象 user_project_relevancy + * + * @author lcj + * @date 2025-03-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("user_project_relevancy") +public class UserProjectRelevancy extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/ProjectBo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/ProjectBo.java new file mode 100644 index 00000000..cfcddbaa --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/ProjectBo.java @@ -0,0 +1,141 @@ +package org.dromara.project.domain.bo; + +import org.dromara.project.domain.Project; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 项目业务对象 project + * + * @author lcj + * @date 2025-03-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Project.class, reverseConvertGenerate = false) +public class ProjectBo extends BaseEntity { + + /** + * 项目id + */ + @NotNull(message = "不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long pId; + + /** + * 状态(0正常 1停用) + */ + private Long status; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String type; + + /** + * 项目类型(1光伏 2风电) + */ + private Long isType; + + /** + * 删除时间 + */ + private Date deletedAt; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡范围(09:00,18:00) + */ + @NotBlank(message = "打卡范围(09:00,18:00)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String punchRange; + + /** + * 设计总量 + */ + @NotNull(message = "设计总量不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long designTotal; + + /** + * 安全协议书 + */ + private String securityAgreement; + + /** + * 排序字段 + */ + @NotNull(message = "排序字段不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long sort; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private Long showHidden; + + /** + * 是否删除(0正常 1删除) + */ + @NotNull(message = "是否删除(0正常 1删除)不能为空", groups = { EditGroup.class }) + private Long isDelete; + + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/UserProjectRelevancyBo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/UserProjectRelevancyBo.java new file mode 100644 index 00000000..d260c56f --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/bo/UserProjectRelevancyBo.java @@ -0,0 +1,49 @@ +package org.dromara.project.domain.bo; + +import org.dromara.project.domain.UserProjectRelevancy; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 系统用户与项目关联业务对象 user_project_relevancy + * + * @author lcj + * @date 2025-03-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = UserProjectRelevancy.class, reverseConvertGenerate = false) +public class UserProjectRelevancyBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long projectId; + + /** + * 删除时间 + */ + private Date deletedAt; + + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java new file mode 100644 index 00000000..feb8d5a6 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java @@ -0,0 +1,107 @@ +package org.dromara.project.domain.req.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:05 + */ +@Data +public class ProjectCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -7603153089205421154L; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long pId; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String type; + + /** + * 项目类型(1光伏 2风电) + */ + private Long isType; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡范围(09:00,18:00) + */ + private String punchRange; + + /** + * 设计总量 + */ + private Long designTotal; + + /** + * 安全协议书 + */ + private String securityAgreement; + + /** + * 排序字段 + */ + private Long sort; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private Long showHidden; +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java new file mode 100644 index 00000000..d4c0fa1d --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java @@ -0,0 +1,105 @@ +package org.dromara.project.domain.req.project; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.common.PageRequest; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:31 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ProjectQueryReq extends PageRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 5563677643070664671L; + + /** + * 项目 id + */ + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long pId; + + /** + * 状态(0正常 1停用) + */ + private Long status; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String type; + + /** + * 项目类型(1光伏 2风电) + */ + private Long isType; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡范围(09:00,18:00) + */ + private String punchRange; + + /** + * 设计总量 + */ + private Long designTotal; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private Long showHidden; +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java new file mode 100644 index 00000000..0b621734 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java @@ -0,0 +1,112 @@ +package org.dromara.project.domain.req.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 15:04 + */ +@Data +public class ProjectUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = 3431952359907567659L; + + /** + * + */ + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long pId; + + /** + * 状态(0正常 1停用) + */ + private Long status; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String type; + + /** + * 项目类型(1光伏 2风电) + */ + private Long isType; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡范围(09:00,18:00) + */ + private String punchRange; + + /** + * 设计总量 + */ + private Long designTotal; + + /** + * 安全协议书 + */ + private String securityAgreement; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private Long showHidden; +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyCreateReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyCreateReq.java new file mode 100644 index 00000000..ca9b2d2a --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyCreateReq.java @@ -0,0 +1,28 @@ +package org.dromara.project.domain.req.userprojectrelevancy; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:05 + */ +@Data +public class UserProjectRelevancyCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -7603153089205421154L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyQueryReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyQueryReq.java new file mode 100644 index 00000000..664e47a7 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyQueryReq.java @@ -0,0 +1,35 @@ +package org.dromara.project.domain.req.userprojectrelevancy; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.common.PageRequest; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:31 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class UserProjectRelevancyQueryReq extends PageRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 3252651952758479341L; + + /** + * 主键ID + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyUpdateReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyUpdateReq.java new file mode 100644 index 00000000..8fd3221e --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/userprojectrelevancy/UserProjectRelevancyUpdateReq.java @@ -0,0 +1,33 @@ +package org.dromara.project.domain.req.userprojectrelevancy; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 15:04 + */ +@Data +public class UserProjectRelevancyUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -8022860866890925958L; + + /** + * 主键ID + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/resp/userprojectrelevancy/LoginUserProjectRelevancyResp.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/resp/userprojectrelevancy/LoginUserProjectRelevancyResp.java new file mode 100644 index 00000000..277e1db3 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/resp/userprojectrelevancy/LoginUserProjectRelevancyResp.java @@ -0,0 +1,42 @@ +package org.dromara.project.domain.resp.userprojectrelevancy; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 15:30 + */ +@Data +public class LoginUserProjectRelevancyResp implements Serializable { + + @Serial + private static final long serialVersionUID = -2056438621566236671L; + + /** + * 主键ID + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java new file mode 100644 index 00000000..2b7cc965 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java @@ -0,0 +1,148 @@ +package org.dromara.project.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.project.domain.Project; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 项目视图对象 project + * + * @author lcj + * @date 2025-03-04 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Project.class) +public class ProjectVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 项目名称 + */ + @ExcelProperty(value = "项目名称") + private String projectName; + + /** + * 项目简称 + */ + @ExcelProperty(value = "项目简称") + private String shortName; + + /** + * 父项目id + */ + @ExcelProperty(value = "父项目id") + private Long pId; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private Long status; + + /** + * 项目图片 + */ + @ExcelProperty(value = "项目图片") + private String picUrl; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 项目类型 + */ + @ExcelProperty(value = "项目类型") + private String type; + + /** + * 项目类型(1光伏 2风电) + */ + @ExcelProperty(value = "项目类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=光伏,2=风电") + private Long isType; + + /** + * 项目地址 + */ + @ExcelProperty(value = "项目地址") + private String projectSite; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String principal; + + /** + * 负责人电话 + */ + @ExcelProperty(value = "负责人电话") + private String principalPhone; + + /** + * 实际容量 + */ + @ExcelProperty(value = "实际容量") + private String actual; + + /** + * 计划容量 + */ + @ExcelProperty(value = "计划容量") + private String plan; + + /** + * 开工时间 + */ + @ExcelProperty(value = "开工时间") + private String onStreamTime; + + /** + * 打卡范围(09:00,18:00) + */ + @ExcelProperty(value = "打卡范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=9:00,18:00") + private String punchRange; + + /** + * 设计总量 + */ + @ExcelProperty(value = "设计总量") + private Long designTotal; + + /** + * 安全协议书 + */ + @ExcelProperty(value = "安全协议书") + private String securityAgreement; + + /** + * 显示隐藏(0显示 1隐藏) + */ + @ExcelProperty(value = "显示隐藏", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=显示,2=隐藏") + private Long showHidden; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/UserProjectRelevancyVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/UserProjectRelevancyVo.java new file mode 100644 index 00000000..16f5263e --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/UserProjectRelevancyVo.java @@ -0,0 +1,51 @@ +package org.dromara.project.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.project.domain.UserProjectRelevancy; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 系统用户与项目关联视图对象 user_project_relevancy + * + * @author lcj + * @date 2025-03-04 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = UserProjectRelevancy.class) +public class UserProjectRelevancyVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户ID") + private Long userId; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 项目详情 + */ + @ExcelProperty(value = "项目详情") + private ProjectVo project; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/ProjectMapper.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/ProjectMapper.java new file mode 100644 index 00000000..0729e1ef --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/ProjectMapper.java @@ -0,0 +1,15 @@ +package org.dromara.project.mapper; + +import org.dromara.project.domain.Project; +import org.dromara.project.domain.vo.ProjectVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 项目Mapper接口 + * + * @author lcj + * @date 2025-03-04 + */ +public interface ProjectMapper extends BaseMapperPlus { + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/UserProjectRelevancyMapper.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/UserProjectRelevancyMapper.java new file mode 100644 index 00000000..aa265606 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/UserProjectRelevancyMapper.java @@ -0,0 +1,15 @@ +package org.dromara.project.mapper; + +import org.dromara.project.domain.UserProjectRelevancy; +import org.dromara.project.domain.vo.UserProjectRelevancyVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 系统用户与项目关联Mapper接口 + * + * @author lcj + * @date 2025-03-04 + */ +public interface UserProjectRelevancyMapper extends BaseMapperPlus { + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IProjectService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IProjectService.java new file mode 100644 index 00000000..1a13b160 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IProjectService.java @@ -0,0 +1,98 @@ +package org.dromara.project.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.project.domain.Project; +import org.dromara.project.domain.bo.ProjectBo; +import org.dromara.project.domain.req.project.ProjectCreateReq; +import org.dromara.project.domain.req.project.ProjectQueryReq; +import org.dromara.project.domain.req.project.ProjectUpdateReq; +import org.dromara.project.domain.vo.ProjectVo; + +import java.util.Collection; +import java.util.List; + +/** + * 项目Service接口 + * + * @author lcj + * @date 2025-03-04 + */ +public interface IProjectService extends IService { + + /** + * 查询项目 + * + * @param id 主键 + * @return 项目 + */ + ProjectVo queryById(Long id); + + /** + * 获取项目视图对象 + * + * @param project 项目对象 + * @return 项目视图对象 + */ + ProjectVo getProjectVo(Project project); + + /** + * 获取项目查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + QueryWrapper getQueryWrapper(ProjectQueryReq req); + + /** + * 分页查询项目列表 + * + * @param req 查询条件 + * @return 项目分页列表 + */ + Page queryPageList(ProjectQueryReq req); + + /** + * 查询符合条件的项目列表 + * + * @param bo 查询条件 + * @return 项目列表 + */ + List queryList(ProjectBo bo); + + /** + * 获取项目分页对象视图 + * + * @param projectPage 项目分页对象 + * @return 项目分页对象视图 + */ + Page getProjectVoPage(Page projectPage); + + /** + * 新增项目 + * + * @param dto 项目 + * @return 新项目 id + */ + Long insertByBo(ProjectCreateReq dto); + + /** + * 修改项目 + * + * @param req 项目 + * @return 是否修改成功 + */ + Boolean updateByBo(ProjectUpdateReq req); + + /** + * 校验并批量删除项目信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java new file mode 100644 index 00000000..68faf699 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java @@ -0,0 +1,117 @@ +package org.dromara.project.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.project.domain.UserProjectRelevancy; +import org.dromara.project.domain.bo.UserProjectRelevancyBo; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq; +import org.dromara.project.domain.resp.userprojectrelevancy.LoginUserProjectRelevancyResp; +import org.dromara.project.domain.vo.UserProjectRelevancyVo; + +import java.util.Collection; +import java.util.List; + +/** + * 系统用户与项目关联Service接口 + * + * @author lcj + * @date 2025-03-04 + */ +public interface IUserProjectRelevancyService extends IService { + + /** + * 获取系统用户与项目关联视图 + * + * @param userProjectRelevancy 系统用户与项目关联 + * @return 系统用户与项目关联视图 + */ + UserProjectRelevancyVo getUserProjectRelevancyVo(UserProjectRelevancy userProjectRelevancy); + + /** + * 获取系统用户与项目关联分页视图 + * + * @param userProjectRelevancyPage 系统用户与项目关联分页 + * @return 系统用户与项目关联分页视图 + */ + Page getUserProjectRelevancyVoPage(Page userProjectRelevancyPage); + + /** + * 查询系统用户与项目关联 + * + * @param id 主键 + * @return 系统用户与项目关联 + */ + UserProjectRelevancyVo queryById(Long id); + + /** + * 分页查询系统用户与项目关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 系统用户与项目关联分页列表 + */ + TableDataInfo queryPageList(UserProjectRelevancyBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的系统用户与项目关联列表 + * + * @param bo 查询条件 + * @return 系统用户与项目关联列表 + */ + List queryList(UserProjectRelevancyBo bo); + + /** + * 新增系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 新增关联信息ID + */ + Long insertByBo(UserProjectRelevancyCreateReq req); + + /** + * 修改系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 是否修改成功 + */ + Boolean updateByBo(UserProjectRelevancyUpdateReq req); + + /** + * 校验并批量删除系统用户与项目关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取当前登录用户项目列表 + * + * @param userId 登录用户ID + * @return 当前登录用户项目列表 + */ + List queryListByUserId(Long userId); + + /** + * 获取当前登录用户项目分页 + * + * @param userId 登录用户ID + * @param req 分页查询条件 + * @return 当前登录用户项目分页 + */ + Page queryPageByUserId(Long userId, UserProjectRelevancyQueryReq req); + + /** + * 获取用户和项目关联对象查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + QueryWrapper getQueryWrapper(UserProjectRelevancyQueryReq req); +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java new file mode 100644 index 00000000..4dfebc50 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java @@ -0,0 +1,256 @@ +package org.dromara.project.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.dromara.common.core.constant.CommonConstant; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.sql.SqlUtil; +import org.dromara.project.domain.Project; +import org.dromara.project.domain.bo.ProjectBo; +import org.dromara.project.domain.req.project.ProjectCreateReq; +import org.dromara.project.domain.req.project.ProjectQueryReq; +import org.dromara.project.domain.req.project.ProjectUpdateReq; +import org.dromara.project.domain.vo.ProjectVo; +import org.dromara.project.mapper.ProjectMapper; +import org.dromara.project.service.IProjectService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 项目Service业务层处理 + * + * @author lcj + * @date 2025-03-04 + */ +@Service +public class ProjectServiceImpl extends ServiceImpl + implements IProjectService { + + @Resource + private ProjectMapper baseMapper; + + /** + * 查询项目 + * + * @param id 主键 + * @return 项目 + */ + @Override + public ProjectVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public ProjectVo getProjectVo(Project project) { + if (project == null) { + return null; + } + // 对象转封装类 + ProjectVo projectVo = new ProjectVo(); + BeanUtils.copyProperties(project, projectVo); + return projectVo; + } + + /** + * 获取项目查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public QueryWrapper getQueryWrapper(ProjectQueryReq req) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (req == null) { + return queryWrapper; + } + // 从对象中取值 + Long id = req.getId(); + String projectName = req.getProjectName(); + String shortName = req.getShortName(); + Long pId = req.getPId(); + Long status = req.getStatus(); + String remark = req.getRemark(); + String type = req.getType(); + Long isType = req.getIsType(); + String projectSite = req.getProjectSite(); + String principal = req.getPrincipal(); + String principalPhone = req.getPrincipalPhone(); + String actual = req.getActual(); + String plan = req.getPlan(); + String onStreamTime = req.getOnStreamTime(); + String punchRange = req.getPunchRange(); + Long designTotal = req.getDesignTotal(); + Long showHidden = req.getShowHidden(); + String sortField = req.getSortField(); + String sortOrder = req.getSortOrder(); + String underlineSortField = StrUtil.toUnderlineCase(sortField); + // 模糊查询 + queryWrapper.like(StringUtils.isNotBlank(projectName), "project_name", projectName); + queryWrapper.like(StringUtils.isNotBlank(shortName), "short_name", shortName); + queryWrapper.like(StringUtils.isNotBlank(remark), "remark", remark); + queryWrapper.like(StringUtils.isNotBlank(type), "type", type); + queryWrapper.like(StringUtils.isNotBlank(projectSite), "project_site", projectSite); + queryWrapper.like(StringUtils.isNotBlank(principal), "principal", principal); + queryWrapper.like(StringUtils.isNotBlank(principalPhone), "principal_phone", principalPhone); + queryWrapper.like(StringUtils.isNotBlank(actual), "actual", actual); + queryWrapper.like(StringUtils.isNotBlank(plan), "plan", plan); + queryWrapper.like(StringUtils.isNotBlank(onStreamTime), "on_stream_time", onStreamTime); + queryWrapper.like(StringUtils.isNotBlank(punchRange), "punch_range", punchRange); + // 精确查询 + queryWrapper.eq(ObjectUtils.isNotEmpty(pId), "p_id", pId); + queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status); + queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id); + queryWrapper.eq(ObjectUtils.isNotEmpty(isType), "is_type", isType); + queryWrapper.eq(ObjectUtils.isNotEmpty(designTotal), "design_total", designTotal); + queryWrapper.eq(ObjectUtils.isNotEmpty(showHidden), "show_hidden", showHidden); + // 排序规则 + queryWrapper.orderBy(SqlUtil.validSortField(sortField), + sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + underlineSortField); + return queryWrapper; + } + + /** + * 分页查询项目列表 + * + * @param req 查询条件 + * @return 项目分页列表 + */ + @Override + public Page queryPageList(ProjectQueryReq req) { + long current = req.getCurrent(); + long size = req.getPageSize(); + // 查询数据库 + Page result = this.page(new Page<>(current, size), this.getQueryWrapper(req)); + return this.getProjectVoPage(result); + } + + /** + * 查询符合条件的项目列表 + * + * @param bo 查询条件 + * @return 项目列表 + */ + @Override + public List queryList(ProjectBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public Page getProjectVoPage(Page projectPage) { + List projectList = projectPage.getRecords(); + Page projectVoPage = new Page<>(projectPage.getCurrent(), projectPage.getSize(), projectPage.getTotal()); + if (CollUtil.isEmpty(projectList)) { + return projectVoPage; + } + // 对象列表 => 封装对象列表 + List projectVoList = projectList.stream().map(this::getProjectVo).toList(); + projectVoPage.setRecords(projectVoList); + return projectVoPage; + } + + private LambdaQueryWrapper buildQueryWrapper(ProjectBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(Project::getId); + lqw.like(StringUtils.isNotBlank(bo.getProjectName()), Project::getProjectName, bo.getProjectName()); + lqw.like(StringUtils.isNotBlank(bo.getShortName()), Project::getShortName, bo.getShortName()); + lqw.eq(bo.getPId() != null, Project::getPId, bo.getPId()); + lqw.eq(bo.getStatus() != null, Project::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getPicUrl()), Project::getPicUrl, bo.getPicUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), Project::getType, bo.getType()); + lqw.eq(bo.getIsType() != null, Project::getIsType, bo.getIsType()); + lqw.eq(bo.getDeletedAt() != null, Project::getDeletedAt, bo.getDeletedAt()); + lqw.eq(StringUtils.isNotBlank(bo.getProjectSite()), Project::getProjectSite, bo.getProjectSite()); + lqw.eq(StringUtils.isNotBlank(bo.getPrincipal()), Project::getPrincipal, bo.getPrincipal()); + lqw.eq(StringUtils.isNotBlank(bo.getPrincipalPhone()), Project::getPrincipalPhone, bo.getPrincipalPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getActual()), Project::getActual, bo.getActual()); + lqw.eq(StringUtils.isNotBlank(bo.getPlan()), Project::getPlan, bo.getPlan()); + lqw.eq(StringUtils.isNotBlank(bo.getOnStreamTime()), Project::getOnStreamTime, bo.getOnStreamTime()); + lqw.eq(StringUtils.isNotBlank(bo.getPunchRange()), Project::getPunchRange, bo.getPunchRange()); + lqw.eq(bo.getDesignTotal() != null, Project::getDesignTotal, bo.getDesignTotal()); + lqw.eq(StringUtils.isNotBlank(bo.getSecurityAgreement()), Project::getSecurityAgreement, bo.getSecurityAgreement()); + lqw.eq(bo.getSort() != null, Project::getSort, bo.getSort()); + lqw.eq(bo.getShowHidden() != null, Project::getShowHidden, bo.getShowHidden()); + return lqw; + } + + /** + * 新增项目 + * + * @param dto 项目 + * @return 新项目 id + */ + @Override + public Long insertByBo(ProjectCreateReq dto) { + // 将实体类和 DTO 进行转换 + Project project = new Project(); + BeanUtils.copyProperties(dto, project); + // 数据校验 + validEntityBeforeSave(project); + // 写入数据库 + boolean save = this.save(project); + if (!save) { + throw new ServiceException("新增项目失败,数据库异常", HttpStatus.ERROR); + } + // 返回新写入的数据 id + return project.getId(); + } + + /** + * 修改项目 + * + * @param req 项目 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(ProjectUpdateReq req) { + // 将实体类和 DTO 进行转换 + Project project = new Project(); + BeanUtils.copyProperties(req, project); + // 数据校验 + validEntityBeforeSave(project); + // 判断是否存在 + Project oldProject = this.getById(project.getId()); + if (oldProject == null) { + throw new ServiceException("修改项目失败,数据不存在", HttpStatus.NOT_FOUND); + } + // 操作数据库 + return this.updateById(project); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Project entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除项目信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java new file mode 100644 index 00000000..c2eee2e9 --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java @@ -0,0 +1,287 @@ +package org.dromara.project.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.dromara.common.core.constant.CommonConstant; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.sql.SqlUtil; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.project.domain.Project; +import org.dromara.project.domain.UserProjectRelevancy; +import org.dromara.project.domain.bo.UserProjectRelevancyBo; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq; +import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq; +import org.dromara.project.domain.resp.userprojectrelevancy.LoginUserProjectRelevancyResp; +import org.dromara.project.domain.vo.UserProjectRelevancyVo; +import org.dromara.project.mapper.UserProjectRelevancyMapper; +import org.dromara.project.service.IProjectService; +import org.dromara.project.service.IUserProjectRelevancyService; +import org.dromara.system.service.ISysUserService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +/** + * 系统用户与项目关联Service业务层处理 + * + * @author lcj + * @date 2025-03-04 + */ +@Service +public class UserProjectRelevancyServiceImpl extends ServiceImpl + implements IUserProjectRelevancyService { + + @Resource + private UserProjectRelevancyMapper baseMapper; + + @Resource + private ISysUserService userService; + + @Resource + private IProjectService projectService; + + @Override + public UserProjectRelevancyVo getUserProjectRelevancyVo(UserProjectRelevancy userProjectRelevancy) { + // 对象转封装类 + UserProjectRelevancyVo userProjectRelevancyVo = new UserProjectRelevancyVo(); + if (userProjectRelevancy == null) { + return userProjectRelevancyVo; + } + BeanUtils.copyProperties(userProjectRelevancy, userProjectRelevancyVo); + // 关联查询项目信息 + Long projectId = userProjectRelevancy.getProjectId(); + if (projectId != null) { + userProjectRelevancyVo.setProject(projectService.queryById(projectId)); + } + return userProjectRelevancyVo; + } + + @Override + public Page getUserProjectRelevancyVoPage(Page userProjectRelevancyPage) { + List userProjectRelevancyList = userProjectRelevancyPage.getRecords(); + Page userProjectRelevancyVoPage = new Page<>( + userProjectRelevancyPage.getCurrent(), + userProjectRelevancyPage.getSize(), + userProjectRelevancyPage.getTotal()); + if (CollUtil.isEmpty(userProjectRelevancyList)) { + return userProjectRelevancyVoPage; + } + // 对象列表 => 封装对象列表 + List userProjectRelevancyVoList = userProjectRelevancyList.stream().map(this::getUserProjectRelevancyVo).toList(); + userProjectRelevancyVoPage.setRecords(userProjectRelevancyVoList); + return userProjectRelevancyVoPage; + } + + /** + * 查询系统用户与项目关联 + * + * @param id 主键 + * @return 系统用户与项目关联 + */ + @Override + public UserProjectRelevancyVo queryById(Long id) { + // 查询数据 + UserProjectRelevancy userProjectRelevancy = this.getById(id); + // 封装并返回 + return this.getUserProjectRelevancyVo(userProjectRelevancy); + } + + /** + * 分页查询系统用户与项目关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 系统用户与项目关联分页列表 + */ + @Override + public TableDataInfo queryPageList(UserProjectRelevancyBo bo, PageQuery pageQuery) { + Page resultVo = pageQuery.build(); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = this.page(pageQuery.build(), lqw); + if (CollUtil.isEmpty(result.getRecords())) { + return TableDataInfo.build(resultVo); + } + List userProjectRelevancyVos = result.getRecords().stream().map(this::getUserProjectRelevancyVo).toList(); + resultVo.setRecords(userProjectRelevancyVos); + return TableDataInfo.build(resultVo); + } + + /** + * 查询符合条件的系统用户与项目关联列表 + * + * @param bo 查询条件 + * @return 系统用户与项目关联列表 + */ + @Override + public List queryList(UserProjectRelevancyBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(UserProjectRelevancyBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(UserProjectRelevancy::getId); + lqw.eq(bo.getUserId() != null, UserProjectRelevancy::getUserId, bo.getUserId()); + lqw.eq(bo.getProjectId() != null, UserProjectRelevancy::getProjectId, bo.getProjectId()); + return lqw; + } + + /** + * 新增系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 是否新增成功 + */ + @Override + public Long insertByBo(UserProjectRelevancyCreateReq req) { + // 将实体类和 DTO 进行转换 + UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); + BeanUtils.copyProperties(req, userProjectRelevancy); + // 数据校验 + validEntityBeforeSave(userProjectRelevancy); + // 写入数据库 + boolean save = this.save(userProjectRelevancy); + if (!save) { + throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR); + } + // 返回新写入的数据 id + return userProjectRelevancy.getId(); + } + + /** + * 修改系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(UserProjectRelevancyUpdateReq req) { + // 将实体类和 DTO 进行转换 + UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); + BeanUtils.copyProperties(req, userProjectRelevancy); + // 数据校验 + validEntityBeforeSave(userProjectRelevancy); + // 判断是否存在 + UserProjectRelevancy oldUserProjectRelevancy = this.getById(userProjectRelevancy.getId()); + if (oldUserProjectRelevancy == null) { + throw new ServiceException("修改用户和项目关联失败,数据不存在", HttpStatus.NOT_FOUND); + } + // 操作数据库 + return this.updateById(oldUserProjectRelevancy); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(UserProjectRelevancy entity) { + // TODO 做一些数据校验,如唯一约束 + Long projectId = entity.getProjectId(); + Long userId = entity.getUserId(); + if (projectId == null) { + throw new ServiceException("项目 id 不能为空", HttpStatus.BAD_REQUEST); + } + if (userId == null) { + throw new ServiceException("用户 id 不能为空", HttpStatus.BAD_REQUEST); + } + + } + + /** + * 校验并批量删除系统用户与项目关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 获取当前登录用户项目列表 + * + * @param userId 登录用户ID + * @return 当前登录用户项目列表 + */ + @Override + public List queryListByUserId(Long userId) { + // 添加查询条件,根据当前用户,获取数据 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(UserProjectRelevancy::getUserId, userId); + // 查询数据库,获取数据 + List list = this.list(queryWrapper); + // 获取封装 + return list.stream() + .map(userProjectRelevancy -> { + Long projectId = userProjectRelevancy.getProjectId(); + QueryWrapper projectQueryWrapper = new QueryWrapper<>(); + projectQueryWrapper.eq("id", projectId); + Project project = projectService.getOne(projectQueryWrapper); + if (project != null) { + LoginUserProjectRelevancyResp loginUserProjectRelevancy = new LoginUserProjectRelevancyResp(); + loginUserProjectRelevancy.setId(userProjectRelevancy.getId()); + loginUserProjectRelevancy.setUserId(userProjectRelevancy.getUserId()); + loginUserProjectRelevancy.setProjectId(projectId); + loginUserProjectRelevancy.setProjectName(project.getProjectName()); + loginUserProjectRelevancy.setShortName(project.getShortName()); + return loginUserProjectRelevancy; + } + return null; + }) + .filter(Objects::nonNull) + .toList(); + } + + @Override + public Page queryPageByUserId(Long userId, UserProjectRelevancyQueryReq req) { + long current = req.getCurrent(); + long size = req.getPageSize(); + // 添加查询条件 + req.setUserId(userId); + QueryWrapper queryWrapper = this.getQueryWrapper(req); + // 查询数据库 + Page result = this.page(new Page<>(current, size), queryWrapper); + return this.getUserProjectRelevancyVoPage(result); + } + + @Override + public QueryWrapper getQueryWrapper(UserProjectRelevancyQueryReq req) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (req == null) { + return queryWrapper; + } + // 从对象中取值 + Long id = req.getId(); + Long userId = req.getUserId(); + Long projectId = req.getProjectId(); + String sortField = req.getSortField(); + String sortOrder = req.getSortOrder(); + String underlineSortField = StrUtil.toUnderlineCase(sortField); + // 精确查询 + queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id); + queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "user_id", userId); + queryWrapper.eq(ObjectUtils.isNotEmpty(projectId), "project_id", projectId); + // 排序规则 + queryWrapper.orderBy(SqlUtil.validSortField(sortField), + sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + underlineSortField); + return queryWrapper; + } +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md deleted file mode 100644 index c938b1e5..00000000 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/package-info.md +++ /dev/null @@ -1,3 +0,0 @@ -java包使用 `.` 分割 resource 目录使用 `/` 分割 -
-此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/ProjectMapper.xml b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/ProjectMapper.xml new file mode 100644 index 00000000..7ef248cf --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/ProjectMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/UserProjectRelevancyMapper.xml b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/UserProjectRelevancyMapper.xml new file mode 100644 index 00000000..84aecf1b --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/UserProjectRelevancyMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql b/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql new file mode 100644 index 00000000..4024e643 --- /dev/null +++ b/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql @@ -0,0 +1,120 @@ +use energy; + +drop table if exists `project`; +create table `project` +( + `id` bigint not null auto_increment, + `project_name` varchar(64) null comment '项目名称', + `short_name` varchar(64) null comment '项目简称', + `p_id` bigint null comment '父项目id', + `status` tinyint(4) default 0 null comment '状态(0正常 1停用)', + `pic_url` varchar(255) null comment '项目图片', + `remark` varchar(500) null comment '备注', + `type` varchar(20) null comment '项目类型', + `is_type` tinyint(4) null comment '项目类型(1光伏 2风电)', + `create_by` bigint null comment '创建者', + `update_by` bigint null comment '更新者', + `create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间', + `update_time` datetime default CURRENT_TIMESTAMP null ON UPDATE CURRENT_TIMESTAMP comment '更新时间', + `deleted_at` datetime null comment '删除时间', + `project_site` varchar(255) null comment '项目地址', + `principal` varchar(50) null comment '负责人', + `principal_phone` varchar(50) null comment '负责人电话', + `actual` varchar(64) null comment '实际容量', + `plan` varchar(64) null comment '计划容量', + `on_stream_time` varchar(64) null comment '开工时间', + `punch_range` varchar(30) default '09:00,18:00' not null comment '打卡范围(09:00,18:00)', + `design_total` int default 0 not null comment '设计总量', + `security_agreement` varchar(255) null comment '安全协议书', + `sort` bigint default 0 not null comment '排序字段', + `show_hidden` tinyint(4) default 0 not null comment '显示隐藏(0显示 1隐藏)', + `is_delete` tinyint(4) default 0 not null comment '是否删除(0正常 1删除)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 60 + CHARACTER SET = utf8mb4 + COLLATE = utf8mb4_general_ci comment = '项目表' + ROW_FORMAT = DYNAMIC; + +DROP TABLE IF EXISTS `user_project_relevancy`; +CREATE TABLE `user_project_relevancy` +( + `id` bigint not null AUTO_INCREMENT COMMENT '主键ID', + `user_id` bigint not null comment '用户ID', + `project_id` bigint not null comment '项目ID', + `create_by` varchar(50) null comment '创建人', + `update_by` varchar(50) null comment '更新人', + `create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间', + `update_time` datetime default CURRENT_TIMESTAMP null ON UPDATE CURRENT_TIMESTAMP comment '更新时间', + PRIMARY KEY (`id`) USING BTREE, + INDEX `user_id` (`user_id` ASC) USING BTREE COMMENT '用户id', + INDEX `project_id` (`project_id` ASC) USING BTREE COMMENT '项目id' +) ENGINE = InnoDB + AUTO_INCREMENT = 1365 + CHARACTER SET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT = '系统用户与项目关联' + ROW_FORMAT = DYNAMIC; + +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896943300447367169, '项目', '1', '1', 'project', 'project/project/index', 1, 0, 'C', '0', '0', + 'project:project:list', '#', 103, 1, sysdate(), null, null, '项目菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896943300447367170, '项目查询', 1896943300447367169, '1', '#', '', 1, 0, 'F', '0', '0', + 'project:project:query', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896943300447367171, '项目新增', 1896943300447367169, '2', '#', '', 1, 0, 'F', '0', '0', 'project:project:add', + '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896943300447367172, '项目修改', 1896943300447367169, '3', '#', '', 1, 0, 'F', '0', '0', 'project:project:edit', + '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896943300447367173, '项目删除', 1896943300447367169, '4', '#', '', 1, 0, 'F', '0', '0', + 'project:project:remove', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896943300447367174, '项目导出', 1896943300447367169, '5', '#', '', 1, 0, 'F', '0', '0', + 'project:project:export', '#', 103, 1, sysdate(), null, null, ''); + +-- 菜单 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896949180526047233, '系统用户与项目关联', '1', '1', 'projectRelevancy', 'project/projectRelevancy/index', 1, 0, + 'C', '0', '0', 'project:projectRelevancy:list', '#', 103, 1, sysdate(), null, null, '系统用户与项目关联菜单'); + +-- 按钮 SQL +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896949180526047234, '系统用户与项目关联查询', 1896949180526047233, '1', '#', '', 1, 0, 'F', '0', '0', + 'project:projectRelevancy:query', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896949180526047235, '系统用户与项目关联新增', 1896949180526047233, '2', '#', '', 1, 0, 'F', '0', '0', + 'project:projectRelevancy:add', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896949180526047236, '系统用户与项目关联修改', 1896949180526047233, '3', '#', '', 1, 0, 'F', '0', '0', + 'project:projectRelevancy:edit', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896949180526047237, '系统用户与项目关联删除', 1896949180526047233, '4', '#', '', 1, 0, 'F', '0', '0', + 'project:projectRelevancy:remove', '#', 103, 1, sysdate(), null, null, ''); + +insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) +values (1896949180526047238, '系统用户与项目关联导出', 1896949180526047233, '5', '#', '', 1, 0, 'F', '0', '0', + 'project:projectRelevancy:export', '#', 103, 1, sysdate(), null, null, ''); From a17f735969fbea98ba01217573840c2f341360e5 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Thu, 6 Mar 2025 09:17:05 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E3=80=81=E7=94=A8=E6=88=B7=E4=B8=8E=E9=A1=B9=E7=9B=AE=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserProjectRelevancyController.java | 55 +++++++++++++++++++ .../org/dromara/project/domain/Project.java | 10 ++++ .../project/ProjectBatchByProjectListReq.java | 28 ++++++++++ .../domain/req/project/ProjectCreateReq.java | 10 ++++ .../domain/req/project/ProjectQueryReq.java | 10 ++++ .../domain/req/project/ProjectUpdateReq.java | 12 +++- .../dromara/project/domain/vo/ProjectVo.java | 13 ++++- .../service/impl/ProjectServiceImpl.java | 26 ++++++++- .../impl/UserProjectRelevancyServiceImpl.java | 4 -- RuoYi-Vue-Plus/script/sql/xinnengyuan.sql | 2 + 10 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectBatchByProjectListReq.java diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java index fd0e3788..aa647e4c 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java @@ -2,6 +2,7 @@ package org.dromara.project.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -17,7 +18,9 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; +import org.dromara.project.domain.UserProjectRelevancy; import org.dromara.project.domain.bo.UserProjectRelevancyBo; +import org.dromara.project.domain.req.project.ProjectBatchByProjectListReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq; @@ -27,6 +30,7 @@ import org.dromara.project.service.IUserProjectRelevancyService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; /** @@ -46,6 +50,7 @@ public class UserProjectRelevancyController extends BaseController { /** * 查询系统用户与项目关联列表 */ + @Tag(name = "查询用户与项目关联列表") @SaCheckPermission("project:projectRelevancy:list") @GetMapping("/list") public TableDataInfo list(UserProjectRelevancyBo bo, PageQuery pageQuery) { @@ -55,6 +60,7 @@ public class UserProjectRelevancyController extends BaseController { /** * 查询登录用户与项目关联列表 */ + @Tag(name = "查询登录用户与项目关联列表") @SaCheckPermission("project:projectRelevancy:list") @GetMapping("/login/list") public R> listByLoginUser() { @@ -65,6 +71,7 @@ public class UserProjectRelevancyController extends BaseController { /** * 查询登录用户与项目关联分页 */ + @Tag(name = "查询登录用户与项目关联分页") @SaCheckPermission("project:projectRelevancy:list") @GetMapping("/login/page") public R> pageByLoginUser(UserProjectRelevancyQueryReq req) { @@ -75,6 +82,7 @@ public class UserProjectRelevancyController extends BaseController { /** * 导出系统用户与项目关联列表 */ + @Tag(name = "导出用户与项目关联列表") @SaCheckPermission("project:projectRelevancy:export") @Log(title = "系统用户与项目关联", businessType = BusinessType.EXPORT) @PostMapping("/export") @@ -88,6 +96,7 @@ public class UserProjectRelevancyController extends BaseController { * * @param id 主键 */ + @Tag(name = "获取用户与项目关联详细信息") @SaCheckPermission("project:projectRelevancy:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @@ -98,6 +107,7 @@ public class UserProjectRelevancyController extends BaseController { /** * 新增系统用户与项目关联 */ + @Tag(name = "新增用户与项目关联") @SaCheckPermission("project:projectRelevancy:add") @Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT) @RepeatSubmit() @@ -106,9 +116,53 @@ public class UserProjectRelevancyController extends BaseController { return R.ok(userProjectRelevancyService.insertByBo(req)); } + /** + * 新增系统用户与项目列表关联 + */ + @Tag(name = "新增用户与项目列表关联") + @SaCheckPermission("project:projectRelevancy:add") + @Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add/project/list") + public R addBatchByProjectList(@RequestBody ProjectBatchByProjectListReq req) { + Long userId = req.getUserId(); + Long[] projectIdList = req.getProjectIdList(); + List userProjectRelevancyList = Arrays.stream(projectIdList).map(projectId -> { + UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + return userProjectRelevancy; + }).toList(); + boolean result = userProjectRelevancyService.saveBatch(userProjectRelevancyList); + return R.ok(result); + } + + /** + * 移除系统用户与项目列表关联 + */ + @Tag(name = "移除用户与项目列表关联") + @SaCheckPermission("project:projectRelevancy:remove") + @Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @DeleteMapping("/remove/project/list") + public R removeBatchByProjectList(@RequestBody ProjectBatchByProjectListReq req) { + Long userId = req.getUserId(); + Long[] projectIdList = req.getProjectIdList(); + List userProjectRelevancyList = Arrays.stream(projectIdList).map(projectId -> { + UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + return userProjectRelevancy; + }).toList(); + boolean result = userProjectRelevancyService.removeBatchByIds(userProjectRelevancyList); + return R.ok(result); + } + + /** * 修改系统用户与项目关联 */ + @Tag(name = "修改用户与项目关联") @SaCheckPermission("project:projectRelevancy:edit") @Log(title = "系统用户与项目关联", businessType = BusinessType.UPDATE) @RepeatSubmit() @@ -122,6 +176,7 @@ public class UserProjectRelevancyController extends BaseController { * * @param ids 主键串 */ + @Tag(name = "删除用户与项目关联") @SaCheckPermission("project:projectRelevancy:remove") @Log(title = "系统用户与项目关联", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java index 5a1d03e9..5e8eafc6 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/Project.java @@ -55,6 +55,16 @@ public class Project extends BaseEntity { */ private String picUrl; + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + /** * 备注 */ diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectBatchByProjectListReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectBatchByProjectListReq.java new file mode 100644 index 00000000..5e96e55f --- /dev/null +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectBatchByProjectListReq.java @@ -0,0 +1,28 @@ +package org.dromara.project.domain.req.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 17:16 + */ +@Data +public class ProjectBatchByProjectListReq implements Serializable { + + @Serial + private static final long serialVersionUID = -3366498681076059844L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID列表 + */ + private Long[] projectIdList; + +} diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java index feb8d5a6..55310603 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectCreateReq.java @@ -35,6 +35,16 @@ public class ProjectCreateReq implements Serializable { */ private String picUrl; + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + /** * 备注 */ diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java index d4c0fa1d..ae8ceac6 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectQueryReq.java @@ -43,6 +43,16 @@ public class ProjectQueryReq extends PageRequest implements Serializable { */ private Long status; + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + /** * 备注 */ diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java index 0b621734..73229bf1 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/req/project/ProjectUpdateReq.java @@ -16,7 +16,7 @@ public class ProjectUpdateReq implements Serializable { private static final long serialVersionUID = 3431952359907567659L; /** - * + * id */ private Long id; @@ -45,6 +45,16 @@ public class ProjectUpdateReq implements Serializable { */ private String picUrl; + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + /** * 备注 */ diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java index 2b7cc965..1cd54279 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/ProjectVo.java @@ -12,7 +12,6 @@ import java.io.Serial; import java.io.Serializable; - /** * 项目视图对象 project * @@ -64,6 +63,18 @@ public class ProjectVo implements Serializable { @ExcelProperty(value = "项目图片") private String picUrl; + /** + * 经度 + */ + @ExcelProperty(value = "经度") + private String lng; + + /** + * 纬度 + */ + @ExcelProperty(value = "纬度") + private String lat; + /** * 备注 */ diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java index 4dfebc50..faddedad 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/ProjectServiceImpl.java @@ -14,7 +14,9 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.sql.SqlUtil; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.project.domain.Project; +import org.dromara.project.domain.UserProjectRelevancy; import org.dromara.project.domain.bo.ProjectBo; import org.dromara.project.domain.req.project.ProjectCreateReq; import org.dromara.project.domain.req.project.ProjectQueryReq; @@ -22,7 +24,10 @@ import org.dromara.project.domain.req.project.ProjectUpdateReq; import org.dromara.project.domain.vo.ProjectVo; import org.dromara.project.mapper.ProjectMapper; import org.dromara.project.service.IProjectService; +import org.dromara.project.service.IUserProjectRelevancyService; +import org.dromara.system.service.ISysUserService; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.Collection; @@ -41,6 +46,13 @@ public class ProjectServiceImpl extends ServiceImpl @Resource private ProjectMapper baseMapper; + @Resource + private ISysUserService userService; + + @Lazy + @Resource + private IUserProjectRelevancyService userProjectRelevancyService; + /** * 查询项目 * @@ -205,8 +217,18 @@ public class ProjectServiceImpl extends ServiceImpl if (!save) { throw new ServiceException("新增项目失败,数据库异常", HttpStatus.ERROR); } - // 返回新写入的数据 id - return project.getId(); + Long projectId = project.getId(); + Long userId = LoginHelper.getUserId(); + // 同步保存用户与项目关联 + UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + boolean saveRelevancy = userProjectRelevancyService.save(userProjectRelevancy); + if (!saveRelevancy) { + throw new ServiceException("新增用户与项目关联失败,数据库异常", HttpStatus.ERROR); + } + // 返回新写入的数据 projectId + return projectId; } /** diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java index c2eee2e9..45461a78 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java @@ -26,7 +26,6 @@ import org.dromara.project.domain.vo.UserProjectRelevancyVo; import org.dromara.project.mapper.UserProjectRelevancyMapper; import org.dromara.project.service.IProjectService; import org.dromara.project.service.IUserProjectRelevancyService; -import org.dromara.system.service.ISysUserService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -47,9 +46,6 @@ public class UserProjectRelevancyServiceImpl extends ServiceImpl Date: Thu, 6 Mar 2025 10:12:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E3=80=81=E7=94=A8=E6=88=B7=E4=B8=8E=E9=A1=B9=E7=9B=AE=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserProjectRelevancyController.java | 10 +-- .../service/IUserProjectRelevancyService.java | 9 +++ .../impl/UserProjectRelevancyServiceImpl.java | 63 ++++++++++++++++++- RuoYi-Vue-Plus/script/sql/xinnengyuan.sql | 2 + 4 files changed, 72 insertions(+), 12 deletions(-) diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java index aa647e4c..b4a8d1ae 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/UserProjectRelevancyController.java @@ -125,15 +125,7 @@ public class UserProjectRelevancyController extends BaseController { @RepeatSubmit() @PostMapping("/add/project/list") public R addBatchByProjectList(@RequestBody ProjectBatchByProjectListReq req) { - Long userId = req.getUserId(); - Long[] projectIdList = req.getProjectIdList(); - List userProjectRelevancyList = Arrays.stream(projectIdList).map(projectId -> { - UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); - userProjectRelevancy.setUserId(userId); - userProjectRelevancy.setProjectId(projectId); - return userProjectRelevancy; - }).toList(); - boolean result = userProjectRelevancyService.saveBatch(userProjectRelevancyList); + Boolean result = userProjectRelevancyService.insertBatchByProjectList(req); return R.ok(result); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java index 68faf699..dd2044a8 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IUserProjectRelevancyService.java @@ -7,6 +7,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.project.domain.UserProjectRelevancy; import org.dromara.project.domain.bo.UserProjectRelevancyBo; +import org.dromara.project.domain.req.project.ProjectBatchByProjectListReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq; @@ -114,4 +115,12 @@ public interface IUserProjectRelevancyService extends IService getQueryWrapper(UserProjectRelevancyQueryReq req); + + /** + * 批量新增用户和项目关联 + * + * @param req 新增参数 + * @return 是否增加成功 + */ + Boolean insertBatchByProjectList(ProjectBatchByProjectListReq req); } diff --git a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java index 45461a78..b0828e3b 100644 --- a/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java +++ b/RuoYi-Vue-Plus/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/UserProjectRelevancyServiceImpl.java @@ -15,9 +15,11 @@ import org.dromara.common.core.utils.ObjectUtils; import org.dromara.common.core.utils.sql.SqlUtil; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.project.domain.Project; import org.dromara.project.domain.UserProjectRelevancy; import org.dromara.project.domain.bo.UserProjectRelevancyBo; +import org.dromara.project.domain.req.project.ProjectBatchByProjectListReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq; import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq; @@ -28,7 +30,9 @@ import org.dromara.project.service.IProjectService; import org.dromara.project.service.IUserProjectRelevancyService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -148,6 +152,16 @@ public class UserProjectRelevancyServiceImpl extends ServiceImpl() + .eq(UserProjectRelevancy::getUserId, userProjectRelevancy.getUserId()) + .eq(UserProjectRelevancy::getProjectId, userProjectRelevancy.getProjectId())) != null) { + throw new ServiceException("用户和项目关联已存在", HttpStatus.CONFLICT); + } // 写入数据库 boolean save = this.save(userProjectRelevancy); if (!save) { @@ -220,7 +234,10 @@ public class UserProjectRelevancyServiceImpl extends ServiceImpl queryListByUserId(Long userId) { // 添加查询条件,根据当前用户,获取数据 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(UserProjectRelevancy::getUserId, userId); + // 如果是超级管理员查看所有 + if (!LoginHelper.isSuperAdmin()) { + queryWrapper.eq(UserProjectRelevancy::getUserId, userId); + } // 查询数据库,获取数据 List list = this.list(queryWrapper); // 获取封装 @@ -249,8 +266,11 @@ public class UserProjectRelevancyServiceImpl extends ServiceImpl queryPageByUserId(Long userId, UserProjectRelevancyQueryReq req) { long current = req.getCurrent(); long size = req.getPageSize(); - // 添加查询条件 - req.setUserId(userId); + // 如果是超级管理员查看所有 + if (!LoginHelper.isSuperAdmin()) { + // 添加查询条件 + req.setUserId(userId); + } QueryWrapper queryWrapper = this.getQueryWrapper(req); // 查询数据库 Page result = this.page(new Page<>(current, size), queryWrapper); @@ -280,4 +300,41 @@ public class UserProjectRelevancyServiceImpl extends ServiceImpl().in("id", (Object[]) projectIdList)); + if (count < projectIdList.length) { + throw new ServiceException("项目ID列表错误,一个或多个项目不存在", HttpStatus.NOT_FOUND); + } + List userProjectRelevancyList = Arrays.stream(projectIdList).map(projectId -> { + UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + // 查询对应用户与项目关联信息是否存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + queryWrapper.eq("project_id", projectId); + // 如果存在则不保存 + UserProjectRelevancy one = this.getOne(queryWrapper); + if (one != null) { + return null; + } + return userProjectRelevancy; + }).filter(Objects::nonNull).toList(); + if (userProjectRelevancyList.isEmpty()) { + throw new ServiceException("对应用户与项目关系均已存在,无需重复添加", HttpStatus.BAD_REQUEST); + } + // 当用户与项目关系存在时修改,不存在则保存 + return this.saveOrUpdateBatch(userProjectRelevancyList); + } } diff --git a/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql b/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql index 7b3aaf54..090a6651 100644 --- a/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql +++ b/RuoYi-Vue-Plus/script/sql/xinnengyuan.sql @@ -57,6 +57,8 @@ CREATE TABLE `user_project_relevancy` COLLATE = utf8mb4_general_ci COMMENT = '系统用户与项目关联' ROW_FORMAT = DYNAMIC; + + -- 菜单 SQL insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)