diff --git a/pom.xml b/pom.xml index 7c755e9..a8f1afd 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ dev - 127.0.0.1:8848 + 192.168.110.209:18848 DEFAULT_GROUP DEFAULT_GROUP nacos @@ -87,7 +87,7 @@ prod prod - 127.0.0.1:8848 + 192.168.110.2:18848 DEFAULT_GROUP DEFAULT_GROUP nacos diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemotePermissionService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemotePermissionService.java index 2a815a2..3bc8eaa 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemotePermissionService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemotePermissionService.java @@ -1,6 +1,9 @@ package org.dromara.system.api; -import java.util.Set; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; + +import java.util.List; /** * 用户权限处理 @@ -12,17 +15,17 @@ public interface RemotePermissionService { /** * 获取角色数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 角色权限信息 */ - Set getRolePermission(Long userId); + List getRolePermission(Long userId); /** * 获取菜单数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 菜单权限信息 */ - Set getMenuPermission(Long userId); + List getMenuPermission(Long userId); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteProjectService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteProjectService.java new file mode 100644 index 0000000..fb247eb --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteProjectService.java @@ -0,0 +1,17 @@ +package org.dromara.system.api; + +/** + * @author lilemy + * @date 2025-09-10 16:15 + */ +public interface RemoteProjectService { + + /** + * 通过项目ID查询项目名称 + * + * @param projectId 项目ID + * @return 项目名称 + */ + String selectProjectNameById(Long projectId); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java index 010ec42..f238a77 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/model/LoginUser.java @@ -2,11 +2,12 @@ package org.dromara.system.api.model; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import java.io.Serial; import java.io.Serializable; import java.util.List; -import java.util.Set; /** * 用户信息 @@ -35,6 +36,11 @@ public class LoginUser implements Serializable { */ private Long deptId; + /** + * 项目ID + */ + private Long projectId; + /** * 部门类别编码 */ @@ -88,12 +94,12 @@ public class LoginUser implements Serializable { /** * 菜单权限 */ - private Set menuPermission; + private List menuPermission; /** * 角色权限 */ - private Set rolePermission; + private List rolePermission; /** * 用户名 diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 416f7a4..34ba305 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -45,7 +45,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; /** * token 控制 @@ -99,11 +98,6 @@ public class TokenController { sysLoginService.checkTenant(loginBody.getTenantId()); // 登录 LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); - - Long userId = LoginHelper.getUserId(); - scheduledExecutorService.schedule(() -> { - remoteMessageService.publishMessage(List.of(userId), "欢迎登录RuoYi-Cloud-Plus微服务管理系统"); - }, 5, TimeUnit.SECONDS); return R.ok(loginVo); } diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java index 59af7cc..f9929db 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java @@ -137,7 +137,12 @@ public class SysLoginService { String password = registerBody.getPassword(); // 校验用户类型是否存在 String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); - + // 校验密码是否符合要求 + String pattern = "^(?!.*\\s)(?!^[a-zA-Z]+$)(?!^[0-9]+$)(?!^[^a-zA-Z0-9]+$)(?!^[a-zA-Z0-9]+$).{8,18}$"; + boolean isValid = password.matches(pattern); + if (!isValid) { + throw new UserException("注册失败,密码需满足8–18位,包含大小写字母、数字、特殊字符中的至少三种组合"); + } boolean captchaEnabled = captchaProperties.getEnabled(); // 验证码开关 if (captchaEnabled) { diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java index 53476f9..7af63e0 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java @@ -1,8 +1,8 @@ package org.dromara.auth.service.impl; -import cn.hutool.crypto.digest.BCrypt; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.parameter.SaLoginParameter; +import cn.hutool.crypto.digest.BCrypt; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -23,6 +23,7 @@ import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.api.RemoteProjectService; import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.domain.vo.RemoteClientVo; import org.dromara.system.api.model.LoginUser; @@ -45,6 +46,9 @@ public class PasswordAuthStrategy implements IAuthStrategy { @DubboReference private RemoteUserService remoteUserService; + @DubboReference + private RemoteProjectService remoteProjectService; + @Override public LoginVo login(String body, RemoteClientVo client) { PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); diff --git a/ruoyi-auth/src/main/resources/application.yml b/ruoyi-auth/src/main/resources/application.yml index 90c0535..cb32904 100644 --- a/ruoyi-auth/src/main/resources/application.yml +++ b/ruoyi-auth/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9210 + port: 19210 # Spring spring: diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index c38f39b..21490c0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -86,4 +86,9 @@ public interface CacheNames { */ String ONLINE_TOKEN = "online_tokens"; + /** + * 项目名称 + */ + String PROJECT_NAME = "project_name#30d"; + } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/vo/SysProjectRoleMenuVo.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/vo/SysProjectRoleMenuVo.java new file mode 100644 index 0000000..fa33544 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/vo/SysProjectRoleMenuVo.java @@ -0,0 +1,29 @@ +package org.dromara.common.core.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Set; + +/** + * @author lilemy + * @date 2025-08-27 18:14 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysProjectRoleMenuVo implements Serializable { + + /** + * 项目id + */ + private Long projectId; + + /** + * 项目菜单权限 + */ + private Set projectPermissions; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/vo/SysProjectRolePermissionVo.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/vo/SysProjectRolePermissionVo.java new file mode 100644 index 0000000..67a4d8b --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/vo/SysProjectRolePermissionVo.java @@ -0,0 +1,28 @@ +package org.dromara.common.core.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Set; + +/** + * @author lilemy + * @date 2025-08-27 17:53 + */ +@Data +public class SysProjectRolePermissionVo implements Serializable { + + @Serial + private static final long serialVersionUID = -6552769878716622338L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 项目菜单权限 + */ + private Set projectRoles; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java index d7db79a..1671dc3 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/PermissionService.java @@ -1,6 +1,9 @@ package org.dromara.common.core.service; -import java.util.Set; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; + +import java.util.List; /** * 用户权限处理 @@ -12,17 +15,17 @@ public interface PermissionService { /** * 获取角色数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 角色权限信息 */ - Set getRolePermission(Long userId); + List getRolePermission(Long userId); /** * 获取菜单数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 菜单权限信息 */ - Set getMenuPermission(Long userId); + List getMenuPermission(Long userId); } diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java index e6b0404..0362cef 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java @@ -1,7 +1,10 @@ package org.dromara.common.satoken.core.service; import cn.dev33.satoken.stp.StpInterface; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.common.core.enums.UserType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.service.PermissionService; @@ -12,6 +15,9 @@ import org.dromara.system.api.model.LoginUser; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * sa-token 权限管理实现类 @@ -30,17 +36,21 @@ public class SaPermissionImpl implements StpInterface { PermissionService permissionService = getPermissionService(); if (ObjectUtil.isNotNull(permissionService)) { List list = StringUtils.splitList(loginId.toString(), ":"); - return new ArrayList<>(permissionService.getMenuPermission(Long.parseLong(list.get(1)))); + return getPermissionListByProjectId(permissionService.getMenuPermission(Long.parseLong(list.get(1))), null); } else { throw new ServiceException("PermissionService 实现类不存在"); } } UserType userType = UserType.getUserType(loginUser.getUserType()); - if (userType == UserType.APP_USER) { + // 系统用户 + if (userType == UserType.SYS_USER) { + Long projectId = loginUser.getProjectId(); + List menuPermission = loginUser.getMenuPermission(); + return getPermissionListByProjectId(menuPermission, projectId); + } else if (userType == UserType.APP_USER) { // 其他端 自行根据业务编写 } - // SYS_USER 默认返回权限 - return new ArrayList<>(loginUser.getMenuPermission()); + return new ArrayList<>(); } /** @@ -53,17 +63,21 @@ public class SaPermissionImpl implements StpInterface { PermissionService permissionService = getPermissionService(); if (ObjectUtil.isNotNull(permissionService)) { List list = StringUtils.splitList(loginId.toString(), ":"); - return new ArrayList<>(permissionService.getRolePermission(Long.parseLong(list.get(1)))); + return getRoleListByProjectId(permissionService.getRolePermission(Long.parseLong(list.get(1))), null); } else { throw new ServiceException("PermissionService 实现类不存在"); } } UserType userType = UserType.getUserType(loginUser.getUserType()); - if (userType == UserType.APP_USER) { + // 系统用户 + if (userType == UserType.SYS_USER) { + Long projectId = loginUser.getProjectId(); + List rolePermission = loginUser.getRolePermission(); + return getRoleListByProjectId(rolePermission, projectId); + } else if (userType == UserType.APP_USER) { // 其他端 自行根据业务编写 } - // SYS_USER 默认返回权限 - return new ArrayList<>(loginUser.getRolePermission()); + return new ArrayList<>(); } private PermissionService getPermissionService() { @@ -74,4 +88,60 @@ public class SaPermissionImpl implements StpInterface { } } + /** + * 获取菜单权限列表 + * + * @param menuPermission 菜单权限 + * @param projectId 当前用户所在项目id + * @return 菜单权限列表 + */ + private List getPermissionListByProjectId(List menuPermission, Long projectId) { + if (CollUtil.isNotEmpty(menuPermission)) { + if (projectId != null) { + Map> map = menuPermission.stream() + .collect(Collectors.groupingBy(SysProjectRoleMenuVo::getProjectId)); + if (map.containsKey(projectId)) { + return map.get(projectId).stream() + .map(SysProjectRoleMenuVo::getProjectPermissions) + .flatMap(Set::stream) + .filter(s -> !s.isEmpty()) + .distinct() + .toList(); + } + } + List> setList = menuPermission.stream().map(SysProjectRoleMenuVo::getProjectPermissions).toList(); + return setList.stream().flatMap(Set::stream).filter(s -> !s.isEmpty()).distinct().toList(); + } else { + return new ArrayList<>(); + } + } + + /** + * 获取角色权限列表 + * + * @param rolePermission 角色权限 + * @param projectId 当前用户所在项目id + * @return 角色权限列表 + */ + private List getRoleListByProjectId(List rolePermission, Long projectId) { + if (CollUtil.isNotEmpty(rolePermission)) { + if (projectId != null) { + Map> map = rolePermission.stream() + .collect(Collectors.groupingBy(SysProjectRolePermissionVo::getProjectId)); + if (map.containsKey(projectId)) { + return map.get(projectId).stream() + .map(SysProjectRolePermissionVo::getProjectRoles) + .flatMap(Set::stream) + .filter(s -> !s.isEmpty()) + .distinct() + .toList(); + } + } + List> list = rolePermission.stream().map(SysProjectRolePermissionVo::getProjectRoles).toList(); + return list.stream().flatMap(Set::stream).filter(s -> !s.isEmpty()).distinct().toList(); + } else { + return new ArrayList<>(); + } + } + } diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 7d2136e..60fa54f 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -10,9 +10,11 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.common.core.enums.UserType; import org.dromara.system.api.model.LoginUser; +import java.util.List; import java.util.Set; /** @@ -38,6 +40,7 @@ public class LoginHelper { public static final String DEPT_NAME_KEY = "deptName"; public static final String DEPT_CATEGORY_KEY = "deptCategory"; public static final String CLIENT_KEY = "clientid"; + public static final String PROJECT_KEY = "projectId"; /** * 登录系统 基于 设备类型 @@ -55,6 +58,7 @@ public class LoginHelper { .setExtra(DEPT_KEY, loginUser.getDeptId()) .setExtra(DEPT_NAME_KEY, loginUser.getDeptName()) .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory()) + .setExtra(PROJECT_KEY, loginUser.getProjectId()) ); StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); } @@ -132,6 +136,13 @@ public class LoginHelper { return Convert.toStr(getExtra(DEPT_CATEGORY_KEY)); } + /** + * 获取项目ID + */ + public static Long getProjectId() { + return Convert.toLong(getExtra(PROJECT_KEY)); + } + /** * 获取当前 Token 的扩展信息 * @@ -197,7 +208,8 @@ public class LoginHelper { if (loginUser == null) { return false; } - return Convert.toBool(isTenantAdmin(loginUser.getRolePermission())); + List rolePermission = loginUser.getRolePermission(); + return Convert.toBool(isTenantAdmin(rolePermission.getFirst().getProjectRoles())); } /** diff --git a/ruoyi-common/ruoyi-common-service-impl/src/main/java/org/dromara/common/core/service/impl/PermissionServiceImpl.java b/ruoyi-common/ruoyi-common-service-impl/src/main/java/org/dromara/common/core/service/impl/PermissionServiceImpl.java index 3ba632a..e7b070f 100644 --- a/ruoyi-common/ruoyi-common-service-impl/src/main/java/org/dromara/common/core/service/impl/PermissionServiceImpl.java +++ b/ruoyi-common/ruoyi-common-service-impl/src/main/java/org/dromara/common/core/service/impl/PermissionServiceImpl.java @@ -1,11 +1,13 @@ package org.dromara.common.core.service.impl; import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.common.core.service.PermissionService; import org.dromara.system.api.RemotePermissionService; import org.springframework.stereotype.Service; -import java.util.Set; +import java.util.List; /** * 权限服务 @@ -19,12 +21,12 @@ public class PermissionServiceImpl implements PermissionService { private RemotePermissionService remotePermissionService; @Override - public Set getRolePermission(Long userId) { + public List getRolePermission(Long userId) { return remotePermissionService.getRolePermission(userId); } @Override - public Set getMenuPermission(Long userId) { + public List getMenuPermission(Long userId) { return remotePermissionService.getMenuPermission(userId); } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java index a6ecb2d..a56136c 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java @@ -33,4 +33,9 @@ public interface TransConstant { */ String OSS_ID_TO_URL = "oss_id_to_url"; + /** + * 项目id转名称 + */ + String PROJECT_ID_TO_NAME = "project_id_to_name"; + } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/ProjectNameTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/ProjectNameTranslationImpl.java new file mode 100644 index 0000000..470254a --- /dev/null +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/ProjectNameTranslationImpl.java @@ -0,0 +1,37 @@ +package org.dromara.common.translation.core.impl; + +import lombok.AllArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.translation.annotation.TranslationType; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.common.translation.core.TranslationInterface; +import org.dromara.system.api.RemoteProjectService; + +/** + * 项目名称翻译实现 + * + * @author lilemy + * @date 2025-09-10 16:13 + */ +@AllArgsConstructor +@TranslationType(type = TransConstant.PROJECT_ID_TO_NAME) +public class ProjectNameTranslationImpl implements TranslationInterface { + + @DubboReference + private RemoteProjectService remoteProjectService; + + /** + * 翻译 + * + * @param key 需要被翻译的键(不为空) + * @param other 其他参数 + * @return 返回键对应的值 + */ + @Override + public String translation(Object key, String other) { + if (key instanceof Long id) { + return remoteProjectService.selectProjectNameById(id); + } + return null; + } +} diff --git a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index ad40205..5b50702 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,3 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl org.dromara.common.translation.core.impl.OssUrlTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl org.dromara.common.translation.core.impl.NicknameTranslationImpl +org.dromara.common.translation.core.impl.ProjectNameTranslationImpl diff --git a/ruoyi-gateway/Dockerfile b/ruoyi-gateway/Dockerfile index 01eeb03..ef395c4 100644 --- a/ruoyi-gateway/Dockerfile +++ b/ruoyi-gateway/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds -#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds +#FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" @@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/gateway/logs \ WORKDIR /ruoyi/gateway -ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" +ENV SERVER_PORT=18899 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE ${SERVER_PORT} diff --git a/ruoyi-gateway/src/main/resources/application.yml b/ruoyi-gateway/src/main/resources/application.yml index 98c9dd0..e0b20a8 100644 --- a/ruoyi-gateway/src/main/resources/application.yml +++ b/ruoyi-gateway/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 8080 + port: 18899 servlet: context-path: / diff --git a/ruoyi-modules/ruoyi-gen/Dockerfile b/ruoyi-modules/ruoyi-gen/Dockerfile index 4427cc2..5721f9e 100644 --- a/ruoyi-modules/ruoyi-gen/Dockerfile +++ b/ruoyi-modules/ruoyi-gen/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds -#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds +#FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" @@ -9,7 +9,7 @@ RUN mkdir -p /ruoyi/gen/logs WORKDIR /ruoyi/gen -ENV SERVER_PORT=9202 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" +ENV SERVER_PORT=19202 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE ${SERVER_PORT} diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml index b90d964..eaa0223 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9202 + port: 19202 # Spring spring: diff --git a/ruoyi-modules/ruoyi-resource/Dockerfile b/ruoyi-modules/ruoyi-resource/Dockerfile index 4708c1a..93009c0 100644 --- a/ruoyi-modules/ruoyi-resource/Dockerfile +++ b/ruoyi-modules/ruoyi-resource/Dockerfile @@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/resource/logs \ WORKDIR /ruoyi/resource -ENV SERVER_PORT=9204 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" +ENV SERVER_PORT=19204 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE ${SERVER_PORT} diff --git a/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml b/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml index ff8e56b..9a7d067 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml +++ b/ruoyi-modules/ruoyi-resource/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9204 + port: 19204 # Spring spring: diff --git a/ruoyi-modules/ruoyi-system/Dockerfile b/ruoyi-modules/ruoyi-system/Dockerfile index ffc92a6..c6e8c64 100644 --- a/ruoyi-modules/ruoyi-system/Dockerfile +++ b/ruoyi-modules/ruoyi-system/Dockerfile @@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/system/logs \ WORKDIR /ruoyi/system -ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" +ENV SERVER_PORT=19201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" EXPOSE ${SERVER_PORT} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/constant/BusProjectConstant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/constant/BusProjectConstant.java new file mode 100644 index 0000000..4159542 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/constant/BusProjectConstant.java @@ -0,0 +1,31 @@ +package org.dromara.system.controller.constant; + +/** + * 项目常量 + * + * @author lilemy + * @date 2025/5/13 10:33 + */ +public interface BusProjectConstant { + + /** + * 项目天气封装信息缓存的 Redis Key 前缀 + */ + String PROJECT_WEATHER_LIST_VO_REDIS_KEY_PREFIX = "project:weather:list"; + + /** + * 项目安全生产天数缓存的 Redis Key 前缀 + */ + String PROJECT_SAFETY_DAYS_REDIS_KEY_PREFIX = "project:safetyDays"; + + /** + * 项目缓存的 Redis Key 前缀 + */ + String PROJECT_CACHE_REDIS_KEY_PREFIX = "project"; + + /** + * 父级id + */ + Long PARENT_ID = 0L; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectController.java new file mode 100644 index 0000000..0fa2d69 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectController.java @@ -0,0 +1,169 @@ +package org.dromara.system.controller.project; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.dto.project.*; +import org.dromara.system.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.system.domain.vo.project.BusProjectVo; +import org.dromara.system.domain.vo.project.BusSubProjectVo; +import org.dromara.system.service.IBusProjectService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 项目 + * + * @author lilemy + * @date 2025-03-04 + */ +@Validated +@RestController +@RequestMapping("/project/project") +public class BusProjectController extends BaseController { + + @Resource + private IBusProjectService projectService; + + /** + * 切换项目 + * + * @param id 项目id + */ + @GetMapping("/changeProject/{id}") + public R changeUserProject(@NotNull(message = "项目id不能为空") + @PathVariable Long id) { + return toAjax(projectService.changeUserProject(id)); + } + + /** + * 查询项目列表 + */ + @SaCheckPermission("project:project:list") + @GetMapping("/list") + public TableDataInfo list(BusProjectQueryReq req, PageQuery pageQuery) { + return projectService.queryPageList(req, pageQuery); + } + + /** + * 查询项目下的子项目列表 + */ + @SaCheckPermission("project:project:listSub") + @GetMapping("/list/sub/{id}") + public R> listSubProject(@NotNull(message = "项目id不能为空") + @PathVariable Long id) { + return R.ok(projectService.querySubList(id)); + } + + /** + * 导出项目列表 + */ + @SaCheckPermission("project:project:export") + @Log(title = "项目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusProjectQueryReq req, HttpServletResponse response) { + List list = projectService.queryList(req); + ExcelUtil.exportExcel(list, "项目", BusProjectVo.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 BusProjectCreateReq req) { + if (req == null) { + throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST); + } + return R.ok(projectService.insertByBo(req)); + } + + /** + * 新增子项目 + */ + @SaCheckPermission("project:project:sub") + @Log(title = "项目", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/sub") + public R addSub(@Validated(AddGroup.class) @RequestBody BusProjectCreateSubReq req) { + if (req == null) { + throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST); + } + return R.ok(projectService.insertSubByProject(req)); + } + + /** + * 修改项目 + */ + @SaCheckPermission("project:project:edit") + @Log(title = "项目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusProjectUpdateReq req) { + return toAjax(projectService.updateByBo(req)); + } + + /** + * 保存项目招标文件 + */ + @SaCheckPermission("project:project:saveTenderFile") + @Log(title = "项目", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/save/tender/file") + public R uploadTenderFile(@RequestBody BusProjectSaveTenderFileReq req) { + return toAjax(projectService.saveTenderFile(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)); + } + + /** + * 查询项目安全天数 + */ + @GetMapping("/safetyDay/{id}") + public R getSafetyDay(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(projectService.getSafetyDay(id)); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectFileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectFileController.java new file mode 100644 index 0000000..488bf1a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectFileController.java @@ -0,0 +1,82 @@ +package org.dromara.system.controller.project; + +import cn.dev33.satoken.annotation.SaCheckPermission; +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.EditGroup; +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.web.core.BaseController; +import org.dromara.system.domain.dto.projectfile.BusProjectFileQueryReq; +import org.dromara.system.domain.dto.projectfile.BusProjectFileUpdateReq; +import org.dromara.system.domain.vo.projectfile.BusProjectFileVo; +import org.dromara.system.service.IBusProjectFileService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 项目文件存储 + * + * @author lilemy + * @date 2025-04-23 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/projectFile") +public class BusProjectFileController extends BaseController { + + private final IBusProjectFileService busProjectFileService; + + /** + * 查询项目文件存储列表 + */ + @SaCheckPermission("project:projectFile:list") + @GetMapping("/list") + public TableDataInfo list(BusProjectFileQueryReq req, PageQuery pageQuery) { + return busProjectFileService.queryPageList(req, pageQuery); + } + + /** + * 获取项目文件存储详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("project:projectFile:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busProjectFileService.queryById(id)); + } + + /** + * 修改项目文件存储 + */ + @SaCheckPermission("project:projectFile:edit") + @Log(title = "项目文件存储", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusProjectFileUpdateReq req) { + return toAjax(busProjectFileService.updateByBo(req)); + } + + /** + * 删除项目文件存储 + * + * @param ids 主键串 + */ + @SaCheckPermission("project:projectFile:remove") + @Log(title = "项目文件存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busProjectFileService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectNewsController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectNewsController.java new file mode 100644 index 0000000..f1dbafc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectNewsController.java @@ -0,0 +1,116 @@ +package org.dromara.system.controller.project; + +import cn.dev33.satoken.annotation.SaCheckPermission; +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.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.web.core.BaseController; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsCreateReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsGisReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsQueryReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsUpdateReq; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsGisVo; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo; +import org.dromara.system.service.IBusProjectNewsService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 项目新闻 + * + * @author lilemy + * @date 2025-04-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/projectNews") +public class BusProjectNewsController extends BaseController { + + private final IBusProjectNewsService busProjectNewsService; + + /** + * 查询项目新闻列表 + */ + @SaCheckPermission("project:projectNews:list") + @GetMapping("/list") + public TableDataInfo list(BusProjectNewsQueryReq req, PageQuery pageQuery) { + return busProjectNewsService.queryPageList(req, pageQuery); + } + + /** + * 导出项目新闻列表 + */ + @SaCheckPermission("project:projectNews:export") + @Log(title = "项目新闻", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusProjectNewsQueryReq req, HttpServletResponse response) { + List list = busProjectNewsService.queryList(req); + ExcelUtil.exportExcel(list, "项目新闻", BusProjectNewsVo.class, response); + } + + /** + * 查询大屏项目新闻列表 + */ + @GetMapping("/list/gis") + public R> listGis(BusProjectNewsGisReq req) { + return R.ok(busProjectNewsService.queryGisList(req)); + } + + /** + * 获取项目新闻详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("project:projectNews:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busProjectNewsService.queryById(id)); + } + + /** + * 新增项目新闻 + */ + @SaCheckPermission("project:projectNews:add") + @Log(title = "项目新闻", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated @RequestBody BusProjectNewsCreateReq req) { + return R.ok(busProjectNewsService.insertByBo(req)); + } + + /** + * 修改项目新闻 + */ + @SaCheckPermission("project:projectNews:edit") + @Log(title = "项目新闻", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody BusProjectNewsUpdateReq req) { + return toAjax(busProjectNewsService.updateByBo(req)); + } + + /** + * 删除项目新闻 + * + * @param ids 主键串 + */ + @SaCheckPermission("project:projectNews:remove") + @Log(title = "项目新闻", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busProjectNewsService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectPunchrangeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectPunchrangeController.java new file mode 100644 index 0000000..98f63d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusProjectPunchrangeController.java @@ -0,0 +1,106 @@ +package org.dromara.system.controller.project; + +import cn.dev33.satoken.annotation.SaCheckPermission; +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.web.core.BaseController; +import org.dromara.system.domain.bo.BusProjectPunchrangeBo; +import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo; +import org.dromara.system.service.IBusProjectPunchrangeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 项目打卡范围 + * + * @author Lion Li + * @date 2025-07-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/projectPunchrange") +public class BusProjectPunchrangeController extends BaseController { + + private final IBusProjectPunchrangeService busProjectPunchrangeService; + + /** + * 查询项目打卡范围列表 + */ + @SaCheckPermission("project:projectPunchrange:list") + @GetMapping("/list") + public TableDataInfo list(BusProjectPunchrangeBo bo, PageQuery pageQuery) { + return busProjectPunchrangeService.queryPageList(bo, pageQuery); + } + + /** + * 导出项目打卡范围列表 + */ + @SaCheckPermission("project:projectPunchrange:export") + @Log(title = "项目打卡范围", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusProjectPunchrangeBo bo, HttpServletResponse response) { + List list = busProjectPunchrangeService.queryList(bo); + ExcelUtil.exportExcel(list, "项目打卡范围", BusProjectPunchrangeVo.class, response); + } + + /** + * 获取项目打卡范围详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("project:projectPunchrange:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(busProjectPunchrangeService.queryById(id)); + } + + /** + * 新增项目打卡范围 + */ + @SaCheckPermission("project:projectPunchrange:add") + @Log(title = "项目打卡范围", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody BusProjectPunchrangeBo bo) { + return toAjax(busProjectPunchrangeService.insertByBo(bo)); + } + + /** + * 修改项目打卡范围 + */ + @SaCheckPermission("project:projectPunchrange:edit") + @Log(title = "项目打卡范围", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody BusProjectPunchrangeBo bo) { + return toAjax(busProjectPunchrangeService.updateByBo(bo)); + } + + /** + * 删除项目打卡范围 + * + * @param ids 主键串 + */ + @SaCheckPermission("project:projectPunchrange:remove") + @Log(title = "项目打卡范围", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(busProjectPunchrangeService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusUserProjectRelevancyController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusUserProjectRelevancyController.java new file mode 100644 index 0000000..7f86910 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/project/BusUserProjectRelevancyController.java @@ -0,0 +1,165 @@ +package org.dromara.system.controller.project; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.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.system.domain.BusUserProjectRelevancy; +import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq; +import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo; +import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo; +import org.dromara.system.service.IBusUserProjectRelevancyService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统用户与项目关联 + * + * @author lilemy + * @date 2025-03-04 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/project/projectRelevancy") +public class BusUserProjectRelevancyController extends BaseController { + + private final IBusUserProjectRelevancyService userProjectRelevancyService; + + /** + * 查询用户与项目关联列表 + */ + @SaCheckPermission("project:projectRelevancy:list") + @GetMapping("/list") + public TableDataInfo list(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) { + return userProjectRelevancyService.queryPageList(req, pageQuery); + } + + /** + * 查询登录用户与项目关联列表 + */ + @GetMapping("/login/list") + public R> listByLoginUser() { + Long userId = LoginHelper.getUserId(); + return R.ok(userProjectRelevancyService.queryListByUserId(userId)); + } + + /** + * 查询登录用户与项目关联分页 + */ + @GetMapping("/login/page") + public TableDataInfo pageByLoginUser(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) { + Long userId = LoginHelper.getUserId(); + return userProjectRelevancyService.queryPageByUserId(userId, req, pageQuery); + } + + /** + * 导出用户与项目关联列表 + */ + @SaCheckPermission("project:projectRelevancy:export") + @Log(title = "系统用户与项目关联", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(BusUserProjectRelevancyQueryReq req, HttpServletResponse response) { + List list = userProjectRelevancyService.queryList(req); + ExcelUtil.exportExcel(list, "系统用户与项目关联", BusUserProjectRelevancyVo.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 @RequestBody BusUserProjectRelevancyCreateReq req) { + return R.ok(userProjectRelevancyService.insertByBo(req)); + } + + /** + * 新增用户与项目列表关联 + */ + @SaCheckPermission("project:projectRelevancy:addProjectList") + @Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/add/project/list") + public R addBatchByProjectList(@RequestBody BusProjectBatchByProjectListReq req) { + Boolean result = userProjectRelevancyService.insertBatchByProjectList(req); + return R.ok(result); + } + + /** + * 移除用户与项目列表关联 + */ + @SaCheckPermission("project:projectRelevancy:removeProjectList") + @Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @DeleteMapping("/remove/project/list") + public R removeBatchByProjectList(@RequestBody BusProjectBatchByProjectListReq req) { + Long userId = req.getUserId(); + List projectIdList = req.getProjectIdList(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("user_id", userId).in("project_id", projectIdList); + boolean result = userProjectRelevancyService.remove(wrapper); +/* 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); + } + + + /** + * 修改用户与项目关联 + */ + @SaCheckPermission("project:projectRelevancy:edit") + @Log(title = "系统用户与项目关联", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated @RequestBody BusUserProjectRelevancyUpdateReq 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-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 0bddc10..b6c3547 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -2,6 +2,7 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.tree.Tree; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.R; @@ -56,6 +57,15 @@ public class SysDeptController extends BaseController { return R.ok(depts); } + /** + * 根据项目id获取部门树以及岗位列表 + */ + @GetMapping("/list/tree") + public R>> listTreeByProjectId() { + List> tree = deptService.buildDeptTree(); + return R.ok(tree); + } + /** * 根据部门编号获取详细信息 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index 29d3360..821da69 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.lang.tree.Tree; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; @@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * 菜单信息 @@ -42,9 +44,15 @@ public class SysMenuController extends BaseController { * * @return 路由信息 */ - @GetMapping("/getRouters") - public R> getRouters() { - List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); + @GetMapping("/getRouters/{projectId}") + public R> getRouters(@NotNull(message = "项目主键不能为空") + @PathVariable Long projectId, String menuSource) { + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId(), projectId); + if ("2".equals(menuSource)) { + menus = menus.stream().filter(menu -> "2".equals(menu.getMenuSource())).collect(Collectors.toList()); + } else { + menus = menus.stream().filter(menu -> "1".equals(menu.getMenuSource())).collect(Collectors.toList()); + } return R.ok(menuService.buildMenus(menus)); } @@ -94,7 +102,9 @@ public class SysMenuController extends BaseController { */ @SaCheckPermission("system:menu:query") @GetMapping(value = "/roleMenuTreeselect/{roleId}") - public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId, String menuSource) { + SysMenuBo sysMenuBo = new SysMenuBo(); + sysMenuBo.setMenuSource(menuSource); List menus = menuService.selectMenuList(LoginHelper.getUserId()); MenuTreeSelectVo selectVo = new MenuTreeSelectVo( menuService.selectMenuListByRoleId(roleId), diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index b3e8cc4..f342d4f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -15,6 +15,7 @@ import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.bo.SysRoleBo; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysDeptService; @@ -49,6 +50,15 @@ public class SysRoleController extends BaseController { return roleService.selectPageRoleList(role, pageQuery); } + /** + * 获取角色信息列表(不分页) + */ + @SaCheckPermission("system:role:list") + @GetMapping("/listNoPage") + public R> listNoPage(SysRoleBo role) { + return R.ok(roleService.selectRoleList(role)); + } + /** * 导出角色信息列表 */ @@ -85,6 +95,17 @@ public class SysRoleController extends BaseController { } else if (!roleService.checkRoleKeyUnique(role)) { return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); } + Long deptId = role.getDeptId(); + if (deptId == null) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,请选择关联的部门"); + } + SysDeptVo deptVo = deptService.selectDeptById(deptId); + if (deptVo == null) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不存在"); + } + if (deptVo.getParentId() == 0) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不能为顶级部门"); + } return toAjax(roleService.insertRole(role)); } @@ -103,7 +124,17 @@ public class SysRoleController extends BaseController { } else if (!roleService.checkRoleKeyUnique(role)) { return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); } - + Long deptId = role.getDeptId(); + if (deptId == null) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,请选择关联的部门"); + } + SysDeptVo deptVo = deptService.selectDeptById(deptId); + if (deptVo == null) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不存在"); + } + if (deptVo.getParentId() == 0) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不能为顶级部门"); + } if (roleService.updateRole(role) > 0) { roleService.cleanOnlineUserByRole(role.getRoleId()); return R.ok(); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 049d552..88661b5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -1,14 +1,13 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.crypto.digest.BCrypt; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -25,8 +24,8 @@ import org.dromara.common.web.core.BaseController; import org.dromara.system.api.model.LoginUser; import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.bo.SysPostBo; -import org.dromara.system.domain.bo.SysRoleBo; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.*; import org.dromara.system.listener.SysUserImportListener; import org.dromara.system.service.*; @@ -134,7 +133,7 @@ public class SysUserController extends BaseController { userService.checkUserDataScope(userId); SysUserVo sysUser = userService.selectUserById(userId); userInfoVo.setUser(sysUser); - userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); +// userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); Long deptId = sysUser.getDeptId(); if (ObjectUtil.isNotNull(deptId)) { SysPostBo postBo = new SysPostBo(); @@ -142,11 +141,12 @@ public class SysUserController extends BaseController { userInfoVo.setPosts(postService.selectPostList(postBo)); userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); } + userInfoVo.setProjectRoles(roleService.selectRoleProjectList(userId)); } - SysRoleBo roleBo = new SysRoleBo(); +/* SysRoleBo roleBo = new SysRoleBo(); roleBo.setStatus(SystemConstants.NORMAL); List roles = roleService.selectRoleList(roleBo); - userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin()));*/ return R.ok(userInfoVo); } @@ -158,8 +158,17 @@ public class SysUserController extends BaseController { @PostMapping public R add(@Validated @RequestBody SysUserBo user) { deptService.checkDeptDataScope(user.getDeptId()); + // 去重后的所有 roleId + List roleList = user.getProjectRoles().stream() + .filter(dto -> dto.getRoleIds() != null) + .flatMap(dto -> dto.getRoleIds().stream()) + .distinct() + .toList(); + deptService.checkDeptMatchRole(user.getUserId(), roleList); if (!userService.checkUserNameUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isEmpty(user.getPhonenumber())) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号不能为空"); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { @@ -184,8 +193,17 @@ public class SysUserController extends BaseController { userService.checkUserAllowed(user.getUserId()); userService.checkUserDataScope(user.getUserId()); deptService.checkDeptDataScope(user.getDeptId()); + // 去重后的所有 roleId + List roleList = user.getProjectRoles().stream() + .filter(dto -> dto.getRoleIds() != null) + .flatMap(dto -> dto.getRoleIds().stream()) + .distinct() + .toList(); + deptService.checkDeptMatchRole(user.getUserId(), roleList); if (!userService.checkUserNameUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isEmpty(user.getPhonenumber())) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号不能为空"); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { @@ -268,15 +286,15 @@ public class SysUserController extends BaseController { /** * 用户授权角色 * - * @param userId 用户Id - * @param roleIds 角色ID串 + * @param userId 用户Id + * @param projectRoles 项目、角色关联列表 */ @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.GRANT) @PutMapping("/authRole") - public R insertAuthRole(Long userId, Long[] roleIds) { + public R insertAuthRole(Long userId, List projectRoles) { userService.checkUserDataScope(userId); - userService.insertUserAuth(userId, roleIds); + userService.insertUserAuth(userId, projectRoles); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProject.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProject.java new file mode 100644 index 0000000..633bf8b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProject.java @@ -0,0 +1,159 @@ +package org.dromara.system.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 lilemy + * @date 2025-03-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_project") +public class BusProject 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 parentId; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String projectType; + + /** + * 项目阶段 + */ + private String projectStage; + + /** + * 删除时间 + */ + 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 String tenderFiles; + + /** + * 项目概括 + */ + private String projectGeneralize; + + /** + * 排序字段 + */ + private Long sort; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private String showHidden; + + /** + * 是否删除(0正常 1删除) + */ + @TableLogic + private Long isDelete; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectFile.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectFile.java new file mode 100644 index 0000000..6cd795a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectFile.java @@ -0,0 +1,65 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 项目文件存储对象 bus_project_file + * + * @author lilemy + * @date 2025-04-23 + */ +@Data +@TableName("bus_project_file") +public class BusProjectFile implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件路径 + */ + private String filePath; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectNews.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectNews.java new file mode 100644 index 0000000..6855863 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectNews.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; + +/** + * 项目新闻对象 bus_project_news + * + * @author lilemy + * @date 2025-04-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bus_project_news") +public class BusProjectNews extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 附件 + */ + private String file; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectPunchrange.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectPunchrange.java new file mode 100644 index 0000000..14c59ee --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusProjectPunchrange.java @@ -0,0 +1,50 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 项目打卡范围对象 bus_project_punchrange + * + * @author Lion Li + * @date 2025-07-28 + */ +@Data +@TableName("bus_project_punchrange") +public class BusProjectPunchrange implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @TableId(value = "id") + private Long id; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 范围名称 + */ + private String punchName; + + /** + * 打卡范围 + */ + private String punchRange; + + /** + * 颜色 + */ + private String punchColor; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusUserProjectRelevancy.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusUserProjectRelevancy.java new file mode 100644 index 0000000..eb01307 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/BusUserProjectRelevancy.java @@ -0,0 +1,44 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 系统用户与项目关联对象 user_project_relevancy + * + * @author lilemy + * @date 2025-03-04 + */ +@Data +@TableName("bus_user_project_relevancy") +public class BusUserProjectRelevancy implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 用户类型(0系统管理员 1普通人员 2项目管理员) + */ + private String userType; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java index 2df5596..49fccf2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -106,6 +106,11 @@ public class SysMenu extends BaseEntity { @TableField(exist = false) private String parentName; + /** + * 菜单类型(menu_source) 1-web2-app + */ + private String menuSource; + /** * 子菜单 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java index fc5f4f2..fd6239c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -26,6 +26,11 @@ public class SysRole extends TenantEntity { @TableId(value = "role_id") private Long roleId; + /** + * 部门ID + */ + private Long deptId; + /** * 角色名称 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java index 0a50e80..76d7a49 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -26,4 +26,9 @@ public class SysUserRole { */ private Long roleId; + /** + * 项目ID + */ + private Long projectId; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/BusProjectPunchrangeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/BusProjectPunchrangeBo.java new file mode 100644 index 0000000..253525d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/BusProjectPunchrangeBo.java @@ -0,0 +1,51 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.BusProjectPunchrange; + +/** + * 项目打卡范围业务对象 bus_project_punchrange + * + * @author Lion Li + * @date 2025-07-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = BusProjectPunchrange.class, reverseConvertGenerate = false) +public class BusProjectPunchrangeBo extends BaseEntity { + + /** + * + */ + @NotNull(message = "不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long projectId; + + /** + * 范围名称 + */ + private String punchName; + + /** + * 打卡范围 + */ + private String punchRange; + + /** + * 颜色 + */ + private String punchColor; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/Punchrange.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/Punchrange.java new file mode 100644 index 0000000..f91f2b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/Punchrange.java @@ -0,0 +1,39 @@ +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author 铁憨憨 + * @Date 2025/7/28 19:15 + * @Version 1.0 + */ + +@Data +public class Punchrange implements Serializable { + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空") + private Long projectId; + + /** + * 范围名称 + */ + @NotNull(message = "范围名称不能为空") + private String punchName; + + /** + * 打卡范围 + */ + @NotNull(message = "打卡范围不能为空") + private String punchRange; + + /** + * 颜色 + */ + @NotNull(message = "颜色不能为空") + private String punchColor; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index 701a209..208dfbb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.system.domain.SysDept; +import java.util.List; + /** * 部门业务对象 sys_dept * @@ -33,16 +35,6 @@ public class SysDeptBo extends BaseEntity { */ private Long projectId; - /** - * 项目部门项目id - */ - private Long rowProjectId; - - /** - * 分包公司ID - */ - private Long contractorId; - /** * 部门名称 */ @@ -96,9 +88,8 @@ public class SysDeptBo extends BaseEntity { */ @NotBlank(message = "部门类型不能为空") private String deptType; -// /** -// * 归属部门id(部门树) -// */ -// private Long belongDeptId; + + private List deptTypes; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java index 7a610e7..888b91d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -107,5 +107,10 @@ public class SysMenuBo extends BaseEntity { */ private String remark; + /** + * 菜单类型(menu_source) 1-web2-app + */ + private String menuSource; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java index 5e3e602..665324a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -28,6 +28,16 @@ public class SysRoleBo extends BaseEntity { */ private Long roleId; + /** + * 部门ID + */ + private Long deptId; + + /** + * 角色类型 1-web 2-app + */ + private String roleSource; + /** * 角色名称 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index 1472d24..cfaee6d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -11,6 +11,9 @@ import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.xss.Xss; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; + +import java.util.List; /** * 用户信息业务对象 sys_user @@ -98,6 +101,11 @@ public class SysUserBo extends BaseEntity { */ private Long[] postIds; + /** + * 项目角色关联 + */ + private List projectRoles; + /** * 数据权限 当前角色ID */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectBatchByProjectListReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectBatchByProjectListReq.java new file mode 100644 index 0000000..7d77f37 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectBatchByProjectListReq.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025/3/5 17:16 + */ +@Data +public class BusProjectBatchByProjectListReq implements Serializable { + + @Serial + private static final long serialVersionUID = -3366498681076059844L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID列表 + */ + private List projectIdList; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectCreateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectCreateReq.java new file mode 100644 index 0000000..9a34cad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectCreateReq.java @@ -0,0 +1,127 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:05 + */ +@Data +public class BusProjectCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -7603153089205421154L; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String projectType; + + /** + * 项目阶段 + */ + private String projectStage; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡时间开始 + */ + private String playCardStart; + + /** + * 打卡时间结束 + */ + private String playCardEnd; + + /** + * 设计总量 + */ + private Long designTotal; + + /** + * 安全协议书 + */ + private String securityAgreement; + + /** + * 招标文件 + */ + private String tenderFiles; + + /** + * 项目概括 + */ + private String projectGeneralize; + + /** + * 排序字段 + */ + private Long sort; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private String showHidden; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectCreateSubReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectCreateSubReq.java new file mode 100644 index 0000000..ac113a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectCreateSubReq.java @@ -0,0 +1,28 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/6/6 11:57 + */ +@Data +public class BusProjectCreateSubReq implements Serializable { + + @Serial + private static final long serialVersionUID = 6380055877986391291L; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 父项目ID + */ + private Long parentId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectQueryReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectQueryReq.java new file mode 100644 index 0000000..c16b0af --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectQueryReq.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:31 + */ +@Data +public class BusProjectQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 5563677643070664671L; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long parentId; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 项目类型 + */ + private String projectType; + + /** + * 项目阶段 + */ + private String projectStage; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private String showHidden; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectSaveTenderFileReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectSaveTenderFileReq.java new file mode 100644 index 0000000..c994335 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectSaveTenderFileReq.java @@ -0,0 +1,31 @@ +package org.dromara.system.domain.dto.project; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025-08-19 17:34 + */ +@Data +public class BusProjectSaveTenderFileReq implements Serializable { + + @Serial + private static final long serialVersionUID = -8690332210810915922L; + + /** + * id + */ + @NotNull(message = "项目id不能为空") + private Long id; + + /** + * 招标文件 + */ + @NotBlank(message = "招标文件不能为空") + private String tenderFiles; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectUpdateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectUpdateReq.java new file mode 100644 index 0000000..3687da9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/BusProjectUpdateReq.java @@ -0,0 +1,150 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; +import org.dromara.system.domain.bo.Punchrange; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * @author lilemy + * @date 2025/3/5 15:04 + */ +@Data +public class BusProjectUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = 3431952359907567659L; + + /** + * id + */ + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 父项目id + */ + private Long parentId; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 项目图片 + */ + private String picUrl; + + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + + /** + * 备注 + */ + private String remark; + + /** + * 项目类型 + */ + private String projectType; + + /** + * 项目阶段 + */ + private String projectStage; + + /** + * 项目地址 + */ + private String projectSite; + + /** + * 负责人 + */ + private String principal; + + /** + * 负责人电话 + */ + private String principalPhone; + + /** + * 实际容量 + */ + private String actual; + + /** + * 计划容量 + */ + private String plan; + + /** + * 开工时间 + */ + private String onStreamTime; + + /** + * 打卡时间开始 + */ + private String playCardStart; + + /** + * 打卡时间结束 + */ + private String playCardEnd; + + /** + * 设计总量 + */ + private Long designTotal; + + /** + * 安全协议书 + */ + private String securityAgreement; + + /** + * 招标文件 + */ + private String tenderFiles; + + /** + * 项目概括 + */ + private String projectGeneralize; + + /** + * 显示隐藏(0显示 1隐藏) + */ + private String showHidden; + + /** + * 排序字段 + */ + private Long sort; + + /** + * 打卡范围 + */ + private List punchrangeList; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/ProjectPermsItem.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/ProjectPermsItem.java new file mode 100644 index 0000000..b5ea7ea --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/ProjectPermsItem.java @@ -0,0 +1,13 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; + +/** + * @author lilemy + * @date 2025-08-27 18:26 + */ +@Data +public class ProjectPermsItem { + private Long projectId; + private String perms; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/ProjectRolesItem.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/ProjectRolesItem.java new file mode 100644 index 0000000..05bcaa1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/project/ProjectRolesItem.java @@ -0,0 +1,20 @@ +package org.dromara.system.domain.dto.project; + +import lombok.Data; + +/** + * @author lilemy + * @date 2025-08-27 19:05 + */ +@Data +public class ProjectRolesItem { + private Long projectId; + private Long roleId; + private String roleName; + private String roleKey; + private Long deptId; + private Integer roleSort; + private String dataScope; + private String status; + private String isSpecial; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileQueryReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileQueryReq.java new file mode 100644 index 0000000..74e6098 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileQueryReq.java @@ -0,0 +1,33 @@ +package org.dromara.system.domain.dto.projectfile; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/23 14:16 + */ +@Data +public class BusProjectFileQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 399401709402729491L; + + /** + * 项目id + */ + private Long projectId; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 文件名称 + */ + private String fileName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileUpdateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileUpdateReq.java new file mode 100644 index 0000000..c8fa376 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileUpdateReq.java @@ -0,0 +1,38 @@ +package org.dromara.system.domain.dto.projectfile; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/23 14:18 + */ +@Data +public class BusProjectFileUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5620479296452749930L; + + /** + * 主键 + */ + private Long id; + + /** + * 项目id + */ + private Long projectId; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileUploadDxfReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileUploadDxfReq.java new file mode 100644 index 0000000..b04a769 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectfile/BusProjectFileUploadDxfReq.java @@ -0,0 +1,23 @@ +package org.dromara.system.domain.dto.projectfile; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/23 11:43 + */ +@Data +public class BusProjectFileUploadDxfReq implements Serializable { + + @Serial + private static final long serialVersionUID = -7096688035548954702L; + + /** + * 项目id + */ + private Long projectId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsCreateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsCreateReq.java new file mode 100644 index 0000000..f8c779b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsCreateReq.java @@ -0,0 +1,43 @@ +package org.dromara.system.domain.dto.projectnews; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/28 11:52 + */ +@Data +public class BusProjectNewsCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = 7116830397516873096L; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空") + private Long projectId; + + /** + * 标题 + */ + @NotBlank(message = "标题不能为空") + private String title; + + /** + * 内容 + */ + @NotBlank(message = "内容不能为空") + private String content; + + /** + * 附件 + */ + private String file; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsGisReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsGisReq.java new file mode 100644 index 0000000..2442669 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsGisReq.java @@ -0,0 +1,25 @@ +package org.dromara.system.domain.dto.projectnews; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/28 14:07 + */ +@Data +public class BusProjectNewsGisReq implements Serializable { + + @Serial + private static final long serialVersionUID = -291705026028532102L; + + /** + * 项目id + */ + @NotNull(message = "项目id不能为空") + private Long projectId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsQueryReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsQueryReq.java new file mode 100644 index 0000000..22bbc5c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsQueryReq.java @@ -0,0 +1,23 @@ +package org.dromara.system.domain.dto.projectnews; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/28 11:52 + */ +@Data +public class BusProjectNewsQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 1453496535743326174L; + + /** + * 项目id + */ + private Long projectId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsUpdateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsUpdateReq.java new file mode 100644 index 0000000..9f00023 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/projectnews/BusProjectNewsUpdateReq.java @@ -0,0 +1,40 @@ +package org.dromara.system.domain.dto.projectnews; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/28 11:53 + */ +@Data +public class BusProjectNewsUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -5988430319051945969L; + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空") + private Long id; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 附件 + */ + private String file; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java new file mode 100644 index 0000000..313e25e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/role/SysRoleProjectDto.java @@ -0,0 +1,37 @@ +package org.dromara.system.domain.dto.role; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author lilemy + * @date 2025-08-27 15:22 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysRoleProjectDto { + + /** + * 项目id + */ + private Long projectId; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 角色id列表 + */ + private List roleIds; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyCreateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyCreateReq.java new file mode 100644 index 0000000..bc13283 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyCreateReq.java @@ -0,0 +1,38 @@ +package org.dromara.system.domain.dto.userprojectrelevancy; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:05 + */ +@Data +public class BusUserProjectRelevancyCreateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -7603153089205421154L; + + /** + * 用户ID + */ + @NotNull(message = "用户ID不能为空") + private Long userId; + + /** + * 项目ID + */ + @NotNull(message = "项目ID不能为空") + private Long projectId; + + /** + * 用户类型(0系统管理员 1普通人员 2项目管理员) + */ + @NotBlank(message = "用户类型不能为空") + private String userType; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyQueryReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyQueryReq.java new file mode 100644 index 0000000..9dbd1dc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyQueryReq.java @@ -0,0 +1,32 @@ +package org.dromara.system.domain.dto.userprojectrelevancy; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 14:31 + */ +@Data +public class BusUserProjectRelevancyQueryReq implements Serializable { + + @Serial + private static final long serialVersionUID = 3252651952758479341L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 用户类型(0系统管理员 1普通人员 2项目管理员) + */ + private String userType; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyUpdateReq.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyUpdateReq.java new file mode 100644 index 0000000..2841fd0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/userprojectrelevancy/BusUserProjectRelevancyUpdateReq.java @@ -0,0 +1,42 @@ +package org.dromara.system.domain.dto.userprojectrelevancy; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 15:04 + */ +@Data +public class BusUserProjectRelevancyUpdateReq implements Serializable { + + @Serial + private static final long serialVersionUID = -8022860866890925958L; + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 项目ID + */ + private Long projectId; + + /** + * 用户类型(0系统管理员 1普通人员 2项目管理员) + */ + @NotBlank(message = "用户类型不能为空") + private String userType; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptTypeEnum.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptTypeEnum.java new file mode 100644 index 0000000..3cd0f40 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptTypeEnum.java @@ -0,0 +1,27 @@ +package org.dromara.system.domain.enums; + +import lombok.Getter; + +/** + * @author lilemy + * @date 2025/7/18 9:41 + */ +@Getter +public enum SysDeptTypeEnum { + + COMPANY("1", "总公司"), + SUB_COMPANY("2", "子公司"), + SPECIAL("3", "特殊"), + PROJECT("4", "项目"), + CONTRACT("5", "分包"); + + private final String code; + + private final String message; + + SysDeptTypeEnum(String code, String message) { + this.code = code; + this.message = message; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java index 455d980..5da0277 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -6,8 +6,6 @@ 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.contractor.domain.vo.SubContractorVo; -//import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.system.domain.SysDept; import java.io.Serial; @@ -50,26 +48,6 @@ public class SysDeptVo implements Serializable { */ private SysDeptVo parent; - /** - * 项目id - */ - private Long projectId; - - /** - * 分包公司ID - */ - private Long contractorId; - - /** - * 未绑定项目信息 - */ -// private List projectList; -// -// /** -// * 未绑定分包信息 -// */ -// private List contractorList; - /** * 祖级列表 */ @@ -135,9 +113,9 @@ public class SysDeptVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; -// /** -// * 子菜单 -// */ -// private List children = new ArrayList<>(); + /** + * 子菜单 + */ + private List children = new ArrayList<>(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java index a51564a..faaecaa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -108,6 +108,11 @@ public class SysMenuVo implements Serializable { */ private Date createTime; + /** + * 菜单类型(menu_source) 1-web2-app + */ + private String menuSource; + /** * 子菜单 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java index 1a205cc..1273d1b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -38,18 +38,34 @@ public class SysRoleVo implements Serializable { @ExcelProperty(value = "角色名称") private String roleName; + /** + * 项目ID + */ + private Long projectId; + /** * 角色权限字符串 */ @ExcelProperty(value = "角色权限") private String roleKey; + /** + * 部门ID + */ + @ExcelProperty(value = "部门") + private Long deptId; + /** * 显示顺序 */ @ExcelProperty(value = "角色排序") private Integer roleSort; + /** + * 角色类型 1-web 2-app + */ + private String roleSource; + /** * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限 5:仅本人数据权限 6:部门及以下或本人数据权限) */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java index 2525c89..5e8b4d8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java @@ -1,6 +1,7 @@ package org.dromara.system.domain.vo; import lombok.Data; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; import java.io.Serial; import java.io.Serializable; @@ -42,4 +43,9 @@ public class SysUserInfoVo implements Serializable { */ private List posts; + /** + * 项目角色列表 + */ + private List projectRoles; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java index 86249d2..f7b2069 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -139,4 +139,9 @@ public class SysUserVo implements Serializable { */ private Long roleId; + /** + * 项目组 + */ + private List projectIds; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java index 0606d26..3920bc0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java @@ -1,10 +1,12 @@ package org.dromara.system.domain.vo; import lombok.Data; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import java.io.Serial; import java.io.Serializable; -import java.util.Set; +import java.util.List; /** * 登录用户信息 @@ -25,11 +27,11 @@ public class UserInfoVo implements Serializable { /** * 菜单权限 */ - private Set permissions; + private List permissions; /** * 角色权限 */ - private Set roles; + private List roles; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectGisVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectGisVo.java new file mode 100644 index 0000000..a8ba2e2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectGisVo.java @@ -0,0 +1,47 @@ +package org.dromara.system.domain.vo.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025-08-21 19:14 + */ +@Data +public class BusProjectGisVo implements Serializable { + + @Serial + private static final long serialVersionUID = 7607042758858059082L; + + /** + * id + */ + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 项目简称 + */ + private String shortName; + + /** + * 经度 + */ + private String lng; + + /** + * 纬度 + */ + private String lat; + + /** + * 项目地址 + */ + private String projectSite; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectSafetyDayVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectSafetyDayVo.java new file mode 100644 index 0000000..f797c6d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectSafetyDayVo.java @@ -0,0 +1,23 @@ +package org.dromara.system.domain.vo.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/5/14 9:34 + */ +@Data +public class BusProjectSafetyDayVo implements Serializable { + + @Serial + private static final long serialVersionUID = -1479490255029878315L; + + /** + * 安全生产天数 + */ + private Long safetyDay; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectVo.java new file mode 100644 index 0000000..697ce72 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusProjectVo.java @@ -0,0 +1,204 @@ +package org.dromara.system.domain.vo.project; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.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.system.domain.BusProject; +import org.dromara.system.domain.bo.Punchrange; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 项目视图对象 project + * + * @author lilemy + * @date 2025-03-04 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusProject.class) +public class BusProjectVo 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 parentId; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 项目图片 + */ + @ExcelProperty(value = "项目图片") + private String picUrl; + + /** + * 经度 + */ + @ExcelProperty(value = "经度") + private String lng; + + /** + * 纬度 + */ + @ExcelProperty(value = "纬度") + private String lat; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 项目类型 + */ + @ExcelProperty(value = "项目类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "project_type") + private String projectType; + + /** + * 项目阶段 + */ + @ExcelProperty(value = "项目阶段", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "project_stage") + private String projectStage; + + /** + * 项目地址 + */ + @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 = "打卡范围") + private String punchRange; + + /** + * 打卡时间开始 + */ + private String playCardStart; + + /** + * 打卡时间结束 + */ + private String playCardEnd; + + /** + * 设计总量 + */ + @ExcelProperty(value = "设计总量") + private Long designTotal; + + /** + * 安全协议书 + */ + @ExcelProperty(value = "安全协议书") + private String securityAgreement; + + /** + * 招标文件 + */ + @ExcelProperty(value = "招标文件") + private String tenderFiles; + + /** + * 显示隐藏(0显示 1隐藏) + */ + @ExcelProperty(value = "显示隐藏", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=显示,2=隐藏") + private String showHidden; + + /** + * 排序字段 + */ + private Long sort; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 子项目 + */ + private List children; + + /** + * 打卡范围 + */ + private List punchrangeList; + + /** + * go项目id + */ + private Long goId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusSubProjectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusSubProjectVo.java new file mode 100644 index 0000000..44e0165 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/project/BusSubProjectVo.java @@ -0,0 +1,39 @@ +package org.dromara.system.domain.vo.project; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author lilemy + * @date 2025/6/4 9:53 + */ +@Data +public class BusSubProjectVo implements Serializable { + + @Serial + private static final long serialVersionUID = -5283786195929619472L; + + /** + * id + */ + private Long id; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 设计文件id + */ + private Long designId; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectfile/BusProjectFileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectfile/BusProjectFileVo.java new file mode 100644 index 0000000..8a82d4e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectfile/BusProjectFileVo.java @@ -0,0 +1,40 @@ +package org.dromara.system.domain.vo.projectfile; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.BusProjectFile; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 项目文件存储视图对象 bus_project_file + * + * @author lilemy + * @date 2025-04-23 + */ +@Data +@AutoMapper(target = BusProjectFile.class) +public class BusProjectFileVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件路径 + */ + private String filePath; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectnews/BusProjectNewsGisVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectnews/BusProjectNewsGisVo.java new file mode 100644 index 0000000..ed39ec5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectnews/BusProjectNewsGisVo.java @@ -0,0 +1,33 @@ +package org.dromara.system.domain.vo.projectnews; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/4/28 14:11 + */ +@Data +public class BusProjectNewsGisVo implements Serializable { + + @Serial + private static final long serialVersionUID = -751096185387401970L; + + /** + * 主键 + */ + private Long id; + + /** + * 标题 + */ + private String title; + + /** + * 显示 + */ + private Boolean show; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectnews/BusProjectNewsVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectnews/BusProjectNewsVo.java new file mode 100644 index 0000000..4574f1a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectnews/BusProjectNewsVo.java @@ -0,0 +1,50 @@ +package org.dromara.system.domain.vo.projectnews; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.BusProjectNews; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 项目新闻视图对象 bus_project_news + * + * @author lilemy + * @date 2025-04-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusProjectNews.class) +public class BusProjectNewsVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 标题 + */ + @ExcelProperty(value = "标题") + private String title; + + /** + * 内容 + */ + @ExcelProperty(value = "内容") + private String content; + + /** + * 附件 + */ + @ExcelProperty(value = "附件") + private String file; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectpunchrange/BusProjectPunchrangeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectpunchrange/BusProjectPunchrangeVo.java new file mode 100644 index 0000000..9b0d4d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/projectpunchrange/BusProjectPunchrangeVo.java @@ -0,0 +1,58 @@ +package org.dromara.system.domain.vo.projectpunchrange; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.BusProjectPunchrange; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 项目打卡范围视图对象 bus_project_punchrange + * + * @author Lion Li + * @date 2025-07-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusProjectPunchrange.class) +public class BusProjectPunchrangeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * + */ + @ExcelProperty(value = "") + private Long id; + + /** + * 项目ID + */ + @ExcelProperty(value = "项目ID") + private Long projectId; + + /** + * 范围名称 + */ + @ExcelProperty(value = "范围名称") + private String punchName; + + /** + * 打卡范围 + */ + @ExcelProperty(value = "打卡范围") + private String punchRange; + + /** + * 颜色 + */ + @ExcelProperty(value = "颜色") + private String punchColor; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/userprojectrelevancy/BusLoginUserProjectRelevancyVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/userprojectrelevancy/BusLoginUserProjectRelevancyVo.java new file mode 100644 index 0000000..e9f7962 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/userprojectrelevancy/BusLoginUserProjectRelevancyVo.java @@ -0,0 +1,47 @@ +package org.dromara.system.domain.vo.userprojectrelevancy; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author lilemy + * @date 2025/3/5 15:30 + */ +@Data +public class BusLoginUserProjectRelevancyVo 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; + + /** + * 用户类型(0系统管理员 1普通人员 2项目管理员) + */ + private String userType; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/userprojectrelevancy/BusUserProjectRelevancyVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/userprojectrelevancy/BusUserProjectRelevancyVo.java new file mode 100644 index 0000000..091329a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/userprojectrelevancy/BusUserProjectRelevancyVo.java @@ -0,0 +1,65 @@ +package org.dromara.system.domain.vo.userprojectrelevancy; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.BusUserProjectRelevancy; +import org.dromara.system.domain.vo.project.BusProjectVo; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 系统用户与项目关联视图对象 user_project_relevancy + * + * @author lilemy + * @date 2025-03-04 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = BusUserProjectRelevancy.class) +public class BusUserProjectRelevancyVo 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; + + /** + * 用户类型(0系统管理员 1普通人员 2项目管理员) + */ + @ExcelProperty(value = "用户类型(0系统管理员 1普通人员 2项目管理员)") + private String userType; + + /** + * 项目详情 + */ + @ExcelProperty(value = "项目详情") + private BusProjectVo project; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemotePermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemotePermissionServiceImpl.java index 9094a01..558569f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemotePermissionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemotePermissionServiceImpl.java @@ -2,11 +2,13 @@ package org.dromara.system.dubbo; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.system.api.RemotePermissionService; import org.dromara.system.service.ISysPermissionService; import org.springframework.stereotype.Service; -import java.util.Set; +import java.util.List; /** * 权限服务 @@ -21,12 +23,12 @@ public class RemotePermissionServiceImpl implements RemotePermissionService { private final ISysPermissionService permissionService; @Override - public Set getRolePermission(Long userId) { + public List getRolePermission(Long userId) { return permissionService.getRolePermission(userId); } @Override - public Set getMenuPermission(Long userId) { + public List getMenuPermission(Long userId) { return permissionService.getMenuPermission(userId); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteProjectServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteProjectServiceImpl.java new file mode 100644 index 0000000..d10b66e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteProjectServiceImpl.java @@ -0,0 +1,30 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.system.api.RemoteProjectService; +import org.dromara.system.service.IBusProjectService; +import org.springframework.stereotype.Service; + +/** + * @author lilemy + * @date 2025-09-11 18:33 + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteProjectServiceImpl implements RemoteProjectService { + + private final IBusProjectService projectService; + + /** + * 通过项目ID查询项目名称 + * + * @param projectId 项目ID + * @return 项目名称 + */ + @Override + public String selectProjectNameById(Long projectId) { + return projectService.getProjectNameById(projectId); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java index 23fd16b..c0867ac 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -59,6 +59,7 @@ public class RemoteUserServiceImpl implements RemoteUserService { private final SysPostMapper postMapper; private final SysUserRoleMapper userRoleMapper; private final SysUserPostMapper userPostMapper; + private final IBusUserProjectRelevancyService userProjectRelevancyService; /** * 通过用户名查询用户信息 @@ -79,6 +80,14 @@ public class RemoteUserServiceImpl implements RemoteUserService { } // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + if (!SystemConstants.SUPER_ADMIN_ID.equals(sysUser.getUserId())) { + List list = userProjectRelevancyService.lambdaQuery() + .eq(BusUserProjectRelevancy::getUserId, sysUser.getUserId()) + .list(); + if (CollUtil.isNotEmpty(list)) { + sysUser.setProjectIds(list.stream().map(BusUserProjectRelevancy::getProjectId).toList()); + } + } return buildLoginUser(sysUser); }); } @@ -266,6 +275,12 @@ public class RemoteUserServiceImpl implements RemoteUserService { loginUser.setTenantId(userVo.getTenantId()); loginUser.setUserId(userId); loginUser.setDeptId(userVo.getDeptId()); + List projectIds = userVo.getProjectIds(); + Long projectId = null; + if (CollUtil.isNotEmpty(projectIds)) { + projectId = projectIds.getFirst(); + } + loginUser.setProjectId(projectId); loginUser.setUsername(userVo.getUserName()); loginUser.setNickname(userVo.getNickName()); loginUser.setPassword(userVo.getPassword()); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectFileMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectFileMapper.java new file mode 100644 index 0000000..211618c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectFileMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.BusProjectFile; +import org.dromara.system.domain.vo.projectfile.BusProjectFileVo; + +/** + * 项目文件存储Mapper接口 + * + * @author lilemy + * @date 2025-04-23 + */ +public interface BusProjectFileMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectMapper.java new file mode 100644 index 0000000..998887b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.BusProject; +import org.dromara.system.domain.vo.project.BusProjectVo; + +/** + * 项目Mapper接口 + * + * @author lilemy + * @date 2025-03-04 + */ +public interface BusProjectMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectNewsMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectNewsMapper.java new file mode 100644 index 0000000..c783579 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectNewsMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.BusProjectNews; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo; + +/** + * 项目新闻Mapper接口 + * + * @author lilemy + * @date 2025-04-28 + */ +public interface BusProjectNewsMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectPunchrangeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectPunchrangeMapper.java new file mode 100644 index 0000000..3e1a12b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusProjectPunchrangeMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.BusProjectPunchrange; +import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo; + +/** + * 项目打卡范围Mapper接口 + * + * @author Lion Li + * @date 2025-07-28 + */ +public interface BusProjectPunchrangeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusUserProjectRelevancyMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusUserProjectRelevancyMapper.java new file mode 100644 index 0000000..edfdc84 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/BusUserProjectRelevancyMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.BusUserProjectRelevancy; +import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo; + +/** + * 系统用户与项目关联Mapper接口 + * + * @author lilemy + * @date 2025-03-04 + */ +public interface BusUserProjectRelevancyMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index 14f758a..84179b1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -3,11 +3,12 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.dromara.common.core.constant.SystemConstants; -import org.dromara.system.domain.SysMenu; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.vo.SysMenuVo; import org.apache.ibatis.annotations.Param; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.dto.project.ProjectPermsItem; +import org.dromara.system.domain.vo.SysMenuVo; import java.util.List; @@ -32,7 +33,7 @@ public interface SysMenuMapper extends BaseMapperPlus { * @param userId 用户ID * @return 权限列表 */ - List selectMenuPermsByUserId(Long userId); + List selectMenuPermsByUserId(Long userId); /** * 根据角色ID查询权限 @@ -62,7 +63,7 @@ public interface SysMenuMapper extends BaseMapperPlus { * @param userId 用户ID * @return 菜单列表 */ - List selectMenuTreeByUserId(Long userId); + List selectMenuTreeByUserId(Long userId, Long projectId); /** * 根据角色ID查询菜单树信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java index ac5a47e..7cd6fe0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -8,6 +8,7 @@ import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.dto.project.ProjectRolesItem; import org.dromara.system.domain.vo.SysRoleVo; import java.util.List; @@ -59,4 +60,12 @@ public interface SysRoleMapper extends BaseMapperPlus { */ List selectRolesByUserId(Long userId); + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectProjectRolesByUserId(Long userId); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectFileService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectFileService.java new file mode 100644 index 0000000..ab0322a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectFileService.java @@ -0,0 +1,90 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.system.domain.BusProjectFile; +import org.dromara.system.domain.dto.projectfile.BusProjectFileQueryReq; +import org.dromara.system.domain.dto.projectfile.BusProjectFileUpdateReq; +import org.dromara.system.domain.vo.projectfile.BusProjectFileVo; + +import java.util.Collection; +import java.util.List; + +/** + * 项目文件存储Service接口 + * + * @author lilemy + * @date 2025-04-23 + */ +public interface IBusProjectFileService extends IService { + + /** + * 查询项目文件存储 + * + * @param id 主键 + * @return 项目文件存储 + */ + BusProjectFileVo queryById(Long id); + + /** + * 分页查询项目文件存储列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 项目文件存储分页列表 + */ + TableDataInfo queryPageList(BusProjectFileQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的项目文件存储列表 + * + * @param req 查询条件 + * @return 项目文件存储列表 + */ + List queryList(BusProjectFileQueryReq req); + + /** + * 修改项目文件存储 + * + * @param req 项目文件存储 + * @return 是否修改成功 + */ + Boolean updateByBo(BusProjectFileUpdateReq req); + + /** + * 校验并批量删除项目文件存储信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取项目文件存储视图对象 + * + * @param projectFile 项目文件存储对象 + * @return 项目文件存储视图对象 + */ + BusProjectFileVo getVo(BusProjectFile projectFile); + + /** + * 获取项目文件存储查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(BusProjectFileQueryReq req); + + /** + * 获取项目文件存储分页对象视图 + * + * @param projectFilePage 项目文件存储分页对象 + * @return 项目文件存储分页对象视图 + */ + Page getVoPage(Page projectFilePage); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectNewsService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectNewsService.java new file mode 100644 index 0000000..9c78b22 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectNewsService.java @@ -0,0 +1,125 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.system.domain.BusProjectNews; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsCreateReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsGisReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsQueryReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsUpdateReq; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsGisVo; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo; + +import java.util.Collection; +import java.util.List; + +/** + * 项目新闻Service接口 + * + * @author lilemy + * @date 2025-04-28 + */ +public interface IBusProjectNewsService extends IService { + + /** + * 查询项目新闻 + * + * @param id 主键 + * @return 项目新闻 + */ + BusProjectNewsVo queryById(Long id); + + /** + * 分页查询项目新闻列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 项目新闻分页列表 + */ + TableDataInfo queryPageList(BusProjectNewsQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的项目新闻列表 + * + * @param req 查询条件 + * @return 项目新闻列表 + */ + List queryList(BusProjectNewsQueryReq req); + + /** + * 查询大屏项目新闻列表 + * + * @param req 列表查询条件 + * @return 大屏项目新闻列表 + */ + List queryGisList(BusProjectNewsGisReq req); + + /** + * 根据项目id查询项目新闻列表 + * + * @param projectId 项目id + * @return 项目新闻列表 + */ + List queryListByProject(Long projectId); + + /** + * 新增项目新闻 + * + * @param req 项目新闻 + * @return 新增项目新闻id + */ + Long insertByBo(BusProjectNewsCreateReq req); + + /** + * 修改项目新闻 + * + * @param req 项目新闻 + * @return 是否修改成功 + */ + Boolean updateByBo(BusProjectNewsUpdateReq req); + + /** + * 校验并批量删除项目新闻信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取项目新闻存储视图对象 + * + * @param projectNews 项目新闻存储对象 + * @return 项目新闻存储视图对象 + */ + BusProjectNewsVo getVo(BusProjectNews projectNews); + + /** + * 获取项目新闻存储查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(BusProjectNewsQueryReq req); + + /** + * 获取项目新闻存储分页对象视图 + * + * @param projectNewsPage 项目新闻存储分页对象 + * @return 项目新闻存储分页对象视图 + */ + Page getVoPage(Page projectNewsPage); + + /** + * 获取项目新闻存储列表视图对象 + * + * @param projectNewsList 项目新闻存储列表对象 + * @return 项目新闻存储列表视图对象 + */ + List getVoList(List projectNewsList); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectPunchrangeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectPunchrangeService.java new file mode 100644 index 0000000..29fbe81 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectPunchrangeService.java @@ -0,0 +1,70 @@ +package org.dromara.system.service; + +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.system.domain.BusProjectPunchrange; +import org.dromara.system.domain.bo.BusProjectPunchrangeBo; +import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo; + +import java.util.Collection; +import java.util.List; + +/** + * 项目打卡范围Service接口 + * + * @author Lion Li + * @date 2025-07-28 + */ +public interface IBusProjectPunchrangeService extends IService { + + /** + * 查询项目打卡范围 + * + * @param id 主键 + * @return 项目打卡范围 + */ + BusProjectPunchrangeVo queryById(Long id); + + /** + * 分页查询项目打卡范围列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目打卡范围分页列表 + */ + TableDataInfo queryPageList(BusProjectPunchrangeBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的项目打卡范围列表 + * + * @param bo 查询条件 + * @return 项目打卡范围列表 + */ + List queryList(BusProjectPunchrangeBo bo); + + /** + * 新增项目打卡范围 + * + * @param bo 项目打卡范围 + * @return 是否新增成功 + */ + Boolean insertByBo(BusProjectPunchrangeBo bo); + + /** + * 修改项目打卡范围 + * + * @param bo 项目打卡范围 + * @return 是否修改成功 + */ + Boolean updateByBo(BusProjectPunchrangeBo bo); + + /** + * 校验并批量删除项目打卡范围信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectService.java new file mode 100644 index 0000000..475300a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusProjectService.java @@ -0,0 +1,174 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.system.domain.BusProject; +import org.dromara.system.domain.dto.project.*; +import org.dromara.system.domain.vo.project.BusProjectGisVo; +import org.dromara.system.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.system.domain.vo.project.BusProjectVo; +import org.dromara.system.domain.vo.project.BusSubProjectVo; + +import java.util.Collection; +import java.util.List; + +/** + * 项目Service接口 + * + * @author lilemy + * @date 2025-03-04 + */ +public interface IBusProjectService extends IService { + + /** + * 查询项目 + * + * @param id 主键 + * @return 项目 + */ + BusProjectVo queryById(Long id); + + /** + * 分页查询项目列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 项目分页列表 + */ + TableDataInfo queryPageList(BusProjectQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的项目列表 + * + * @param req 查询条件 + * @return 项目列表 + */ + List queryList(BusProjectQueryReq req); + + /** + * 查询项目下的子项目列表 + * + * @param id 父项目id + * @return 项目下的子项目列表 + */ + List querySubList(Long id); + + /** + * 新增项目 + * + * @param dto 项目 + * @return 新项目 id + */ + Long insertByBo(BusProjectCreateReq dto); + + /** + * 新增子项目 + * + * @param dto 子项目 + * @return 子项目 id + */ + Long insertSubByProject(BusProjectCreateSubReq dto); + + /** + * 修改项目 + * + * @param req 项目 + * @return 是否修改成功 + */ + Boolean updateByBo(BusProjectUpdateReq req); + + /** + * 保存项目招标文件 + * + * @param req 项目招标文件 + * @return 是否保存成功 + */ + Boolean saveTenderFile(BusProjectSaveTenderFileReq req); + + /** + * 校验并批量删除项目信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取项目视图对象 + * + * @param project 项目对象 + * @return 项目视图对象 + */ + BusProjectVo getVo(BusProject project); + + /** + * 获取项目查询条件封装(不查询子项目) + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(BusProjectQueryReq req); + + /** + * 获取项目分页对象视图 + * + * @param projectPage 项目分页对象 + * @return 项目分页对象视图 + */ + Page getVoPage(Page projectPage); + + /** + * 校验用户是否拥有操作项目的权限 + * + * @param projectId 项目id + * @param userId 需要鉴权的用户id + */ + void validAuth(Long projectId, Long userId); + + /** + * 校验用户是否拥有操作项目的权限 + * + * @param projectIdList 项目id列表 + * @param userId 需要鉴权的用户id + */ + void validAuth(Collection projectIdList, Long userId); + + /** + * 获取项目安全天数 + * + * @param id 项目id + * @return 安全天数 + */ + BusProjectSafetyDayVo getSafetyDay(Long id); + + /** + * 获取项目地址信息 + * + * @return 项目地址信息列表 + */ + List getGisList(); + + /** + * 改变项目所属用户 + * + * @param id 项目id + * @return 是否成功 + */ + Boolean changeUserProject(Long id); + + BusProjectVo selectById(Long projectId); + + List selectProjectVoList(); + + /** + * 通过项目ID查询项目名称 + * + * @param projectId 项目ID + * @return 项目名称 + */ + String getProjectNameById(Long projectId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusUserProjectRelevancyService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusUserProjectRelevancyService.java new file mode 100644 index 0000000..4c5077b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IBusUserProjectRelevancyService.java @@ -0,0 +1,160 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.system.domain.BusUserProjectRelevancy; +import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq; +import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo; +import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo; + +import java.util.Collection; +import java.util.List; + +/** + * 系统用户与项目关联Service接口 + * + * @author lilemy + * @date 2025-03-04 + */ +public interface IBusUserProjectRelevancyService extends IService { + + /** + * 查询系统用户与项目关联 + * + * @param id 主键 + * @return 系统用户与项目关联 + */ + BusUserProjectRelevancyVo queryById(Long id); + + /** + * 分页查询系统用户与项目关联列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 系统用户与项目关联分页列表 + */ + TableDataInfo queryPageList(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery); + + /** + * 查询符合条件的系统用户与项目关联列表 + * + * @param req 查询条件 + * @return 系统用户与项目关联列表 + */ + List queryList(BusUserProjectRelevancyQueryReq req); + + /** + * 新增系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 新增关联id + */ + Long insertByBo(BusUserProjectRelevancyCreateReq req); + + /** + * 批量新增用户和项目关联 + * + * @param projectId 项目ID + * @param userIdList 用户ID列表 + * @param userType 用户类型 + */ + void saveBatchByUserList(Long projectId, List userIdList, String userType); + + /** + * 批量新增用户和项目关联 + * + * @param projectIdList 项目ID列表 + * @param userId 用户ID + * @param userType 用户类型 + */ + void saveBatchByProjectList(List projectIdList, Long userId, String userType); + + /** + * 修改系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 是否修改成功 + */ + Boolean updateByBo(BusUserProjectRelevancyUpdateReq req); + + /** + * 校验并批量删除系统用户与项目关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据用户ID删除系统用户与项目关联 + * + * @param userId 用户ID + */ + void deleteByUserId(Long userId); + + /** + * 根据项目ID和用户ID列表删除系统用户与项目关联 + * + * @param oldProjectId 项目ID + * @param userIds 用户ID列表 + */ + void deleteByProjectAndUserIds(Long oldProjectId, List userIds); + + /** + * 获取当前登录用户项目列表 + * + * @param userId 登录用户ID + * @return 当前登录用户项目列表 + */ + List queryListByUserId(Long userId); + + /** + * 获取当前登录用户项目分页 + * + * @param userId 登录用户ID + * @param req 分页查询条件 + * @param pageQuery 分页参数 + * @return 当前登录用户项目分页 + */ + TableDataInfo queryPageByUserId(Long userId, BusUserProjectRelevancyQueryReq req, PageQuery pageQuery); + + /** + * 批量新增用户和项目关联 + * + * @param req 新增参数 + * @return 是否增加成功 + */ + Boolean insertBatchByProjectList(BusProjectBatchByProjectListReq req); + + /** + * 获取系统用户与项目关联视图 + * + * @param userProjectRelevancy 系统用户与项目关联 + * @return 系统用户与项目关联视图 + */ + BusUserProjectRelevancyVo getVo(BusUserProjectRelevancy userProjectRelevancy); + + /** + * 获取用户和项目关联对象查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + LambdaQueryWrapper buildQueryWrapper(BusUserProjectRelevancyQueryReq req); + + /** + * 获取系统用户与项目关联分页视图 + * + * @param userProjectRelevancyPage 系统用户与项目关联分页 + * @return 系统用户与项目关联分页视图 + */ + Page getVoPage(Page userProjectRelevancyPage); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index 2e99357..5870cb5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -48,6 +48,13 @@ public interface ISysDeptService { */ List> buildDeptTreeSelect(List depts); + /** + * 构建前端所需要下拉树结构 + * + * @return 下拉树结构列表 + */ + List> buildDeptTree(); + /** * 根据角色ID查询部门树信息 * @@ -150,4 +157,12 @@ public interface ISysDeptService { * @return 部门列表 */ List selectDeptsSimple(); + + /** + * 校验部门和角色是否匹配 + * + * @param deptId 部门id + * @param roleIds 角色id列表 + */ + void checkDeptMatchRole(Long deptId, List roleIds); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java index f972691..349ef52 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -1,6 +1,7 @@ package org.dromara.system.service; import cn.hutool.core.lang.tree.Tree; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; import org.dromara.system.domain.SysMenu; import org.dromara.system.domain.bo.SysMenuBo; import org.dromara.system.domain.vo.RouterVo; @@ -39,7 +40,7 @@ public interface ISysMenuService { * @param userId 用户ID * @return 权限列表 */ - Set selectMenuPermsByUserId(Long userId); + List selectMenuPermsByUserId(Long userId); /** * 根据角色ID查询权限 @@ -52,10 +53,11 @@ public interface ISysMenuService { /** * 根据用户ID查询菜单树信息 * - * @param userId 用户ID + * @param userId 用户ID + * @param projectId 项目ID * @return 菜单列表 */ - List selectMenuTreeByUserId(Long userId); + List selectMenuTreeByUserId(Long userId, Long projectId); /** * 根据角色ID查询菜单树信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java index 0116df5..fbee2c2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -1,5 +1,9 @@ package org.dromara.system.service; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; + +import java.util.List; import java.util.Set; /** @@ -12,17 +16,17 @@ public interface ISysPermissionService { /** * 获取角色数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 角色权限信息 */ - Set getRolePermission(Long userId); + List getRolePermission(Long userId); /** * 获取菜单数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 菜单权限信息 */ - Set getMenuPermission(Long userId); + List getMenuPermission(Long userId); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java index cec4bf7..cafcf19 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -1,13 +1,14 @@ package org.dromara.system.service; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.SysRoleVo; import java.util.List; -import java.util.Set; /** * 角色业务层 @@ -49,7 +50,7 @@ public interface ISysRoleService { * @param userId 用户ID * @return 权限列表 */ - Set selectRolePermissionByUserId(Long userId); + List selectRolePermissionByUserId(Long userId); /** * 查询所有角色 @@ -82,6 +83,14 @@ public interface ISysRoleService { */ List selectRoleByIds(List roleIds); + /** + * 获取角色选择框列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRoleProjectList(Long userId); + /** * 校验角色名称是否唯一 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 13c74ca..b87afa8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -3,6 +3,7 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; @@ -162,10 +163,10 @@ public interface ISysUserService { /** * 用户授权角色 * - * @param userId 用户ID - * @param roleIds 角色组 + * @param userId 用户ID + * @param projectRoles 项目、角色关联组 */ - void insertUserAuth(Long userId, Long[] roleIds); + void insertUserAuth(Long userId, List projectRoles); /** * 修改用户状态 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectFileServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectFileServiceImpl.java new file mode 100644 index 0000000..24f81ce --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectFileServiceImpl.java @@ -0,0 +1,200 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.BusProjectFile; +import org.dromara.system.domain.dto.projectfile.BusProjectFileQueryReq; +import org.dromara.system.domain.dto.projectfile.BusProjectFileUpdateReq; +import org.dromara.system.domain.vo.projectfile.BusProjectFileVo; +import org.dromara.system.mapper.BusProjectFileMapper; +import org.dromara.system.service.IBusProjectFileService; +import org.dromara.system.service.IBusProjectService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 项目文件存储Service业务层处理 + * + * @author lilemy + * @date 2025-04-23 + */ +@Slf4j +@Service +public class BusProjectFileServiceImpl extends ServiceImpl + implements IBusProjectFileService { + + @Resource + private IBusProjectService projectService; + + /** + * 查询项目文件存储 + * + * @param id 主键 + * @return 项目文件存储 + */ + @Override + public BusProjectFileVo queryById(Long id) { + BusProjectFile projectFile = this.getById(id); + if (projectFile == null) { + throw new ServiceException("对应项目文件存储信息不存在", HttpStatus.NOT_FOUND); + } + return this.getVo(projectFile); + } + + /** + * 分页查询项目文件存储列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 项目文件存储分页列表 + */ + @Override + public TableDataInfo queryPageList(BusProjectFileQueryReq req, PageQuery pageQuery) { + Page projectFilePage = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(projectFilePage)); + } + + /** + * 查询符合条件的项目文件存储列表 + * + * @param req 查询条件 + * @return 项目文件存储列表 + */ + @Override + public List queryList(BusProjectFileQueryReq req) { + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + return this.list(lqw).stream().map(this::getVo).toList(); + } + + /** + * 修改项目文件存储 + * + * @param req 项目文件存储 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BusProjectFileUpdateReq req) { + // 将实体类和 DTO 进行转换 + BusProjectFile projectFile = new BusProjectFile(); + BeanUtils.copyProperties(req, projectFile); + // 数据校验 + validEntityBeforeSave(projectFile); + // 判断是否存在 + BusProjectFile oldProjectFile = this.getById(projectFile.getId()); + if (oldProjectFile == null) { + throw new ServiceException("修改项目文件存储失败,数据不存在", HttpStatus.NOT_FOUND); + } + // 操作数据库 + boolean update = this.updateById(projectFile); + if (!update) { + throw new ServiceException("修改项目文件存储失败,数据库异常", HttpStatus.ERROR); + } + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusProjectFile entity) { + // TODO 做一些数据校验,如唯一约束 + Long projectId = entity.getProjectId(); + if (projectId == null) { + throw new ServiceException("项目id不能为空", HttpStatus.BAD_REQUEST); + } + if (projectService.getById(projectId) == null) { + throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND); + } + } + + /** + * 校验并批量删除项目文件存储信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List projectFileList = this.listByIds(ids); + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = projectFileList.stream().map(BusProjectFile::getProjectId).toList(); + projectService.validAuth(projectId, userId); + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 获取项目文件存储视图对象 + * + * @param projectFile 项目文件存储对象 + * @return 项目文件存储视图对象 + */ + @Override + public BusProjectFileVo getVo(BusProjectFile projectFile) { + // 对象转封装类 + BusProjectFileVo projectFileVo = new BusProjectFileVo(); + if (projectFile == null) { + return projectFileVo; + } + BeanUtils.copyProperties(projectFile, projectFileVo); + return projectFileVo; + } + + /** + * 获取项目文件存储查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(BusProjectFileQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (req == null) { + return lqw; + } + Long projectId = req.getProjectId(); + String fileType = req.getFileType(); + String fileName = req.getFileName(); + lqw.like(StringUtils.isNotBlank(fileName), BusProjectFile::getFileName, fileName); + lqw.eq(ObjectUtils.isNotEmpty(projectId), BusProjectFile::getProjectId, projectId); + lqw.eq(StringUtils.isNotBlank(fileType), BusProjectFile::getFileType, fileType); + return lqw; + } + + /** + * 获取项目文件存储分页对象视图 + * + * @param projectFilePage 项目文件存储分页对象 + * @return 项目文件存储分页对象视图 + */ + @Override + public Page getVoPage(Page projectFilePage) { + List projectFileList = projectFilePage.getRecords(); + Page projectFileVoPage = new Page<>( + projectFilePage.getCurrent(), + projectFilePage.getSize(), + projectFilePage.getTotal()); + if (CollUtil.isEmpty(projectFileList)) { + return projectFileVoPage; + } + List projectFileVoList = projectFileList.stream().map(this::getVo).toList(); + projectFileVoPage.setRecords(projectFileVoList); + return projectFileVoPage; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectNewsServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectNewsServiceImpl.java new file mode 100644 index 0000000..7520e98 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectNewsServiceImpl.java @@ -0,0 +1,268 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.HttpStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.ObjectUtils; +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.system.domain.BusProjectNews; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsCreateReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsGisReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsQueryReq; +import org.dromara.system.domain.dto.projectnews.BusProjectNewsUpdateReq; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsGisVo; +import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo; +import org.dromara.system.mapper.BusProjectNewsMapper; +import org.dromara.system.service.IBusProjectNewsService; +import org.dromara.system.service.IBusProjectService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 项目新闻Service业务层处理 + * + * @author lilemy + * @date 2025-04-28 + */ +@Service +public class BusProjectNewsServiceImpl extends ServiceImpl + implements IBusProjectNewsService { + + @Resource + private IBusProjectService projectService; + + /** + * 查询项目新闻 + * + * @param id 主键 + * @return 项目新闻 + */ + @Override + public BusProjectNewsVo queryById(Long id) { + BusProjectNews projectNews = this.getById(id); + if (projectNews == null) { + throw new ServiceException("对应项目新闻存储信息不存在", HttpStatus.NOT_FOUND); + } + return this.getVo(projectNews); + } + + /** + * 分页查询项目新闻列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 项目新闻分页列表 + */ + @Override + public TableDataInfo queryPageList(BusProjectNewsQueryReq req, PageQuery pageQuery) { + Page projectNewsPage = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(projectNewsPage)); + } + + /** + * 查询符合条件的项目新闻列表 + * + * @param req 查询条件 + * @return 项目新闻列表 + */ + @Override + public List queryList(BusProjectNewsQueryReq req) { + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + return this.list(lqw).stream().map(this::getVo).toList(); + } + + /** + * 查询大屏项目新闻列表 + * + * @param req 列表查询条件 + * @return 大屏项目新闻列表 + */ + @Override + public List queryGisList(BusProjectNewsGisReq req) { + Long projectId = req.getProjectId(); + if (projectId == null || projectService.getById(projectId) == null) { + throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND); + } + List projectNewsList = this.lambdaQuery() + .select(BusProjectNews::getId, BusProjectNews::getTitle) + .eq(BusProjectNews::getProjectId, projectId) + .list(); + return projectNewsList.stream().map(projectNews -> { + BusProjectNewsGisVo projectNewsGisResp = new BusProjectNewsGisVo(); + BeanUtils.copyProperties(projectNews, projectNewsGisResp); + projectNewsGisResp.setShow(false); + return projectNewsGisResp; + }).toList(); + } + + /** + * 根据项目id查询项目新闻列表 + * + * @param projectId 项目id + * @return 项目新闻列表 + */ + @Override + public List queryListByProject(Long projectId) { + List list = this.lambdaQuery() + .eq(BusProjectNews::getProjectId, projectId) + .list(); + return this.getVoList(list); + } + + /** + * 新增项目新闻 + * + * @param req 项目新闻 + * @return 新增项目新闻id + */ + @Override + public Long insertByBo(BusProjectNewsCreateReq req) { + // 将实体类和 DTO 进行转换 + BusProjectNews projectNews = new BusProjectNews(); + BeanUtils.copyProperties(req, projectNews); + // 数据校验 + validEntityBeforeSave(projectNews, true); + // 操作数据库 + boolean save = this.save(projectNews); + if (!save) { + throw new ServiceException("新增项目新闻存储失败,数据库异常", HttpStatus.ERROR); + } + return projectNews.getId(); + } + + /** + * 修改项目新闻 + * + * @param req 项目新闻 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BusProjectNewsUpdateReq req) { + // 将实体类和 DTO 进行转换 + BusProjectNews projectNews = new BusProjectNews(); + BeanUtils.copyProperties(req, projectNews); + // 数据校验 + validEntityBeforeSave(projectNews, false); + // 判断是否存在 + BusProjectNews oldProjectNews = this.getById(projectNews.getId()); + if (oldProjectNews == null) { + throw new ServiceException("修改项目新闻存储失败,数据不存在", HttpStatus.NOT_FOUND); + } + // 操作数据库 + boolean update = this.updateById(projectNews); + if (!update) { + throw new ServiceException("修改项目新闻存储失败,数据库异常", HttpStatus.ERROR); + } + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusProjectNews entity, Boolean create) { + // TODO 做一些数据校验,如唯一约束 + Long projectId = entity.getProjectId(); + if (create) { + if (projectId == null) { + throw new ServiceException("项目id不能为空", HttpStatus.BAD_REQUEST); + } + } + if (projectId != null && projectService.getById(projectId) == null) { + throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND); + } + } + + /** + * 校验并批量删除项目新闻信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + List projectNewsList = this.listByIds(ids); + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + List projectId = projectNewsList.stream().map(BusProjectNews::getProjectId).toList(); + projectService.validAuth(projectId, userId); + } + return this.removeBatchByIds(ids); + } + + /** + * 获取项目新闻存储视图对象 + * + * @param projectNews 项目新闻存储对象 + * @return 项目新闻存储视图对象 + */ + @Override + public BusProjectNewsVo getVo(BusProjectNews projectNews) { + // 对象转封装类 + BusProjectNewsVo projectNewsVo = new BusProjectNewsVo(); + if (projectNews == null) { + return projectNewsVo; + } + BeanUtils.copyProperties(projectNews, projectNewsVo); + return projectNewsVo; + } + + /** + * 获取项目新闻存储查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(BusProjectNewsQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + Long projectId = req.getProjectId(); + lqw.eq(ObjectUtils.isNotEmpty(projectId), BusProjectNews::getProjectId, projectId); + return lqw; + } + + /** + * 获取项目新闻存储分页对象视图 + * + * @param projectNewsPage 项目新闻存储分页对象 + * @return 项目新闻存储分页对象视图 + */ + @Override + public Page getVoPage(Page projectNewsPage) { + List projectNewsList = projectNewsPage.getRecords(); + Page projectNewsVoPage = new Page<>( + projectNewsPage.getCurrent(), + projectNewsPage.getSize(), + projectNewsPage.getTotal()); + if (CollUtil.isEmpty(projectNewsList)) { + return projectNewsVoPage; + } + List projectNewsVoList = projectNewsList.stream().map(this::getVo).toList(); + projectNewsVoPage.setRecords(projectNewsVoList); + return projectNewsVoPage; + } + + /** + * 获取项目新闻存储列表视图对象 + * + * @param projectNewsList 项目新闻存储列表对象 + * @return 项目新闻存储列表视图对象 + */ + @Override + public List getVoList(List projectNewsList) { + return projectNewsList.stream().map(this::getVo).toList(); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectPunchrangeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectPunchrangeServiceImpl.java new file mode 100644 index 0000000..f0515bf --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectPunchrangeServiceImpl.java @@ -0,0 +1,133 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.BusProjectPunchrange; +import org.dromara.system.domain.bo.BusProjectPunchrangeBo; +import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo; +import org.dromara.system.mapper.BusProjectPunchrangeMapper; +import org.dromara.system.service.IBusProjectPunchrangeService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 项目打卡范围Service业务层处理 + * + * @author Lion Li + * @date 2025-07-28 + */ +@RequiredArgsConstructor +@Service +public class BusProjectPunchrangeServiceImpl extends ServiceImpl + implements IBusProjectPunchrangeService { + + /** + * 查询项目打卡范围 + * + * @param id 主键 + * @return 项目打卡范围 + */ + @Override + public BusProjectPunchrangeVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 分页查询项目打卡范围列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目打卡范围分页列表 + */ + @Override + public TableDataInfo queryPageList(BusProjectPunchrangeBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的项目打卡范围列表 + * + * @param bo 查询条件 + * @return 项目打卡范围列表 + */ + @Override + public List queryList(BusProjectPunchrangeBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(BusProjectPunchrangeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(BusProjectPunchrange::getId); + lqw.eq(bo.getProjectId() != null, BusProjectPunchrange::getProjectId, bo.getProjectId()); + lqw.like(StringUtils.isNotBlank(bo.getPunchName()), BusProjectPunchrange::getPunchName, bo.getPunchName()); + lqw.eq(StringUtils.isNotBlank(bo.getPunchRange()), BusProjectPunchrange::getPunchRange, bo.getPunchRange()); + lqw.eq(StringUtils.isNotBlank(bo.getPunchColor()), BusProjectPunchrange::getPunchColor, bo.getPunchColor()); + return lqw; + } + + /** + * 新增项目打卡范围 + * + * @param bo 项目打卡范围 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(BusProjectPunchrangeBo bo) { + BusProjectPunchrange add = MapstructUtils.convert(bo, BusProjectPunchrange.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改项目打卡范围 + * + * @param bo 项目打卡范围 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BusProjectPunchrangeBo bo) { + BusProjectPunchrange update = MapstructUtils.convert(bo, BusProjectPunchrange.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusProjectPunchrange 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-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectServiceImpl.java new file mode 100644 index 0000000..e5b69b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusProjectServiceImpl.java @@ -0,0 +1,654 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.PhoneUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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 lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.ObjectUtils; +import org.dromara.common.core.utils.StringUtils; +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.system.api.model.LoginUser; +import org.dromara.system.controller.constant.BusProjectConstant; +import org.dromara.system.domain.BusProject; +import org.dromara.system.domain.BusProjectFile; +import org.dromara.system.domain.BusProjectPunchrange; +import org.dromara.system.domain.BusUserProjectRelevancy; +import org.dromara.system.domain.bo.Punchrange; +import org.dromara.system.domain.dto.project.*; +import org.dromara.system.domain.vo.project.BusProjectGisVo; +import org.dromara.system.domain.vo.project.BusProjectSafetyDayVo; +import org.dromara.system.domain.vo.project.BusProjectVo; +import org.dromara.system.domain.vo.project.BusSubProjectVo; +import org.dromara.system.mapper.BusProjectMapper; +import org.dromara.system.service.IBusProjectFileService; +import org.dromara.system.service.IBusProjectPunchrangeService; +import org.dromara.system.service.IBusProjectService; +import org.dromara.system.service.IBusUserProjectRelevancyService; +import org.springframework.beans.BeanUtils; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static org.dromara.common.satoken.utils.LoginHelper.LOGIN_USER_KEY; + +/** + * 项目Service业务层处理 + * + * @author lilemy + * @date 2025-03-04 + */ +@Slf4j +@Service +public class BusProjectServiceImpl extends ServiceImpl + implements IBusProjectService { + + @Lazy + @Resource + private IBusUserProjectRelevancyService userProjectRelevancyService; + + @Lazy + @Resource + private IBusProjectFileService projectFileService; + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private IBusProjectPunchrangeService busProjectPunchrangeService; + + /** + * 查询项目 + * + * @param id 主键 + * @return 项目 + */ + @Override + public BusProjectVo queryById(Long id) { + BusProject project = this.getById(id); + if (project == null) { + throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND); + } + BusProjectVo vo = this.getVo(project); + //成功获取项目信息过后,还需要获取打卡范围 + List punchrangeList = busProjectPunchrangeService.lambdaQuery() + .eq(BusProjectPunchrange::getProjectId, id) + .list(); + if (!punchrangeList.isEmpty()) { + List punchranges = BeanUtil.copyToList(punchrangeList, Punchrange.class); + vo.setPunchrangeList(punchranges); + } + return vo; + } + + /** + * 分页查询项目列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 项目分页列表 + */ + @Override + public TableDataInfo queryPageList(BusProjectQueryReq req, PageQuery pageQuery) { + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + // 查询数据库 + Page result = this.page(pageQuery.build(), lqw); + return TableDataInfo.build(this.getVoPage(result)); + } + + /** + * 查询符合条件的项目列表 + * + * @param req 查询条件 + * @return 项目列表 + */ + @Override + public List queryList(BusProjectQueryReq req) { + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + return this.list(lqw).stream().map(this::getVo).toList(); + } + + /** + * 查询项目下的子项目列表 + * + * @param id 父项目id + * @return 项目下的子项目列表 + */ + @Override + public List querySubList(Long id) { + BusProject project = this.getById(id); + if (project == null) { + throw new ServiceException("查询项目不存在", HttpStatus.NOT_FOUND); + } + List subProjectList = this.list(new LambdaQueryWrapper() + .eq(BusProject::getParentId, id)); + return subProjectList.stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + return subProjectVo; + }).toList(); + } + + /** + * 新增项目 + * + * @param req 项目 + * @return 新项目 id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long insertByBo(BusProjectCreateReq req) { + // 将实体类和 DTO 进行转换 + BusProject project = new BusProject(); + BeanUtils.copyProperties(req, project); + String playCardStart = req.getPlayCardStart(); + String playCardEnd = req.getPlayCardEnd(); + String punchRange = playCardStart + "," + playCardEnd; + project.setPunchRange(punchRange); + // 数据校验 + validEntityBeforeSave(project, true); + if (this.lambdaQuery().eq(BusProject::getProjectName, req.getProjectName()).count() > 0) { + throw new ServiceException("项目名称已存在", HttpStatus.BAD_REQUEST); + } + if (this.lambdaQuery().eq(BusProject::getShortName, req.getShortName()).count() > 0) { + throw new ServiceException("项目简称已存在", HttpStatus.BAD_REQUEST); + } + // 写入数据库 + boolean save = this.save(project); + if (!save) { + throw new ServiceException("新增项目失败,数据库异常", HttpStatus.ERROR); + } + Long projectId = project.getId(); + // 保存管理员与项目关联 + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(SystemConstants.SUPER_ADMIN_ID); + userProjectRelevancy.setProjectId(projectId); + boolean saveRelevancy = userProjectRelevancyService.save(userProjectRelevancy); + if (!saveRelevancy) { + throw new ServiceException("新增用户与项目关联失败,数据库异常", HttpStatus.ERROR); + } + // 返回新写入的数据 projectId + return projectId; + } + + /** + * 新增子项目 + * + * @param dto 子项目 + * @return 子项目 id + */ + @Override + public Long insertSubByProject(BusProjectCreateSubReq dto) { + String projectName = dto.getProjectName(); + Long parentId = dto.getParentId(); + if (StringUtils.isBlank(projectName)) { + throw new ServiceException("子项目名称不能为空", HttpStatus.BAD_REQUEST); + } + BusProject project = this.getById(parentId); + if (project == null) { + throw new ServiceException("父项目不存在", HttpStatus.NOT_FOUND); + } + // 权限校验 + Long userId = LoginHelper.getUserId(); + validAuth(project.getId(), userId); + BusProject subProject = new BusProject(); + subProject.setParentId(parentId); + subProject.setProjectName(projectName); + subProject.setProjectType(project.getProjectType()); + boolean save = this.save(subProject); + if (!save) { + throw new ServiceException("新增子项目失败,数据库异常", HttpStatus.ERROR); + } + Long subProjectId = subProject.getId(); + // 同步保存用户与项目关联 + Set userIdList = new HashSet<>(List.of(userId, SystemConstants.SUPER_ADMIN_ID)); + List userProjectRelevancyList = userIdList.stream().map(id -> { + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(id); + userProjectRelevancy.setProjectId(subProjectId); + return userProjectRelevancy; + }).toList(); + boolean saveRelevancy = userProjectRelevancyService.saveBatch(userProjectRelevancyList); + if (!saveRelevancy) { + throw new ServiceException("新增用户与项目关联失败,数据库异常", HttpStatus.ERROR); + } + return subProjectId; + } + + /** + * 修改项目 + * + * @param req 项目 + * @return 是否修改成功 + */ + @Override + @Transactional + public Boolean updateByBo(BusProjectUpdateReq req) { + // 将实体类和 DTO 进行转换 + BusProject project = new BusProject(); + BeanUtils.copyProperties(req, project); + String playCardStart = req.getPlayCardStart(); + String playCardEnd = req.getPlayCardEnd(); + if (StringUtils.isNotBlank(playCardStart) && StringUtils.isNotBlank(playCardEnd)) { + String punchRange = playCardStart + "," + playCardEnd; + project.setPunchRange(punchRange); + } + // 数据校验 + validEntityBeforeSave(project, false); + // 权限校验 + Long userId = LoginHelper.getUserId(); + validAuth(project.getId(), userId); + // 判断是否存在 + BusProject oldProject = this.getById(project.getId()); + if (oldProject == null) { + throw new ServiceException("修改项目失败,数据不存在", HttpStatus.NOT_FOUND); + } + // 判断名称是否重复 + if (req.getProjectName() != null && !req.getProjectName().equals(oldProject.getProjectName())) { + Long count = this.lambdaQuery().eq(BusProject::getProjectName, req.getProjectName()).count(); + if (count > 0) { + throw new ServiceException("项目名称重复", HttpStatus.BAD_REQUEST); + } + } + // 操作数据库 + if (this.updateById(project)) { + if (CollUtil.isNotEmpty(req.getPunchrangeList())) { + //删除所有旧的范围 + busProjectPunchrangeService.remove(Wrappers.lambdaQuery(BusProjectPunchrange.class).eq(BusProjectPunchrange::getProjectId, project.getId())); + //新增打卡范围 + List busProjectPunchranges = BeanUtil.copyToList(req.getPunchrangeList(), BusProjectPunchrange.class); + if (!busProjectPunchrangeService.saveBatch(busProjectPunchranges)) { + throw new ServiceException("打卡范围增加失败", HttpStatus.ERROR); + } + } + return true; + } + return false; + } + + /** + * 保存项目招标文件 + * + * @param req 项目招标文件 + * @return 是否保存成功 + */ + @Override + public Boolean saveTenderFile(BusProjectSaveTenderFileReq req) { + BusProject project = this.getById(req.getId()); + if (project == null) { + throw new ServiceException("保存项目招标文件失败,数据不存在", HttpStatus.NOT_FOUND); + } + BusProject newProject = new BusProject(); + newProject.setId(project.getId()); + newProject.setTenderFiles(req.getTenderFiles()); + boolean b = this.updateById(newProject); + if (!b) { + throw new ServiceException("保存项目招标文件失败", HttpStatus.ERROR); + } + // todo 通知给各部⻔主任 + return true; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusProject entity, Boolean create) { + // TODO 做一些数据校验,如唯一约束 + String projectName = entity.getProjectName(); + String principalPhone = entity.getPrincipalPhone(); + // 新增项目参数验证 + if (create) { + if (StringUtils.isBlank(projectName)) { + throw new ServiceException("项目名称不能为空", HttpStatus.BAD_REQUEST); + } + if (StringUtils.isBlank(principalPhone)) { + throw new ServiceException("负责人电话不能为空", HttpStatus.BAD_REQUEST); + } + } + if (StringUtils.isNotBlank(principalPhone) && !PhoneUtil.isPhone(principalPhone)) { + throw new ServiceException("负责人手机号格式不正确", HttpStatus.BAD_REQUEST); + } + } + + /** + * 校验并批量删除项目信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + Long userId = LoginHelper.getUserId(); + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + this.validAuth(ids, userId); + // 查看是否有子项目 + Long count = this.lambdaQuery() + .in(BusProject::getParentId, ids) + .count(); + if (count > 0) { + throw new ServiceException("删除项目中存在子项目,请先删除子项目", HttpStatus.BAD_REQUEST); + } + } + // 删除项目 + boolean removeProjectList = this.removeBatchByIds(ids); + if (!removeProjectList) { + throw new ServiceException("删除项目失败,数据库异常", HttpStatus.ERROR); + } + // 删除用户与项目关联表 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BusUserProjectRelevancy::getProjectId, ids); + boolean removeRelevancyList = userProjectRelevancyService.remove(lqw); + if (!removeRelevancyList) { + throw new ServiceException("删除项目与用户关联失败,数据库异常", HttpStatus.ERROR); + } + return true; + } + + /** + * 获取项目视图对象 + * + * @param project 项目对象 + * @return 项目视图对象 + */ + @Override + public BusProjectVo getVo(BusProject project) { + if (project == null) { + return null; + } + // 对象转封装类 + BusProjectVo projectVo = new BusProjectVo(); + BeanUtils.copyProperties(project, projectVo); + String punchRange = project.getPunchRange(); + if (StringUtils.isNotBlank(punchRange)) { + String[] split = punchRange.split(","); + projectVo.setPlayCardStart(split[0]); + projectVo.setPlayCardEnd(split[1]); + } + // 关联子项目列表 + List subProjectList = this.lambdaQuery() + .select(BusProject::getId, BusProject::getProjectName, BusProject::getCreateTime) + .eq(BusProject::getParentId, project.getId()) + .list(); + if (CollUtil.isNotEmpty(subProjectList)) { + List subIdList = subProjectList.stream().map(BusProject::getId).toList(); + // 关联设计id + List projectFileList = projectFileService.lambdaQuery() + .in(BusProjectFile::getProjectId, subIdList) + .list(); + Map> map = projectFileList.stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId)); + List subProjectVoList = subProjectList.stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + Long id = subProject.getId(); + if (map.containsKey(id)) { + subProjectVo.setDesignId(map.get(id).getFirst().getId()); + } + return subProjectVo; + }).toList(); + projectVo.setChildren(subProjectVoList); + } + return projectVo; + } + + /** + * 获取项目查询条件封装(不查询子项目) + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(BusProjectQueryReq req) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (req == null) { + return lqw; + } + // 从对象中取值 + String projectName = req.getProjectName(); + String shortName = req.getShortName(); + Long parentId = req.getParentId(); + String status = req.getStatus(); + String projectType = req.getProjectType(); + String projectCategory = req.getProjectStage(); + String projectSite = req.getProjectSite(); + String principal = req.getPrincipal(); + String principalPhone = req.getPrincipalPhone(); + String showHidden = req.getShowHidden(); + // 模糊查询 + lqw.like(StringUtils.isNotBlank(projectName), BusProject::getProjectName, projectName); + lqw.like(StringUtils.isNotBlank(shortName), BusProject::getShortName, shortName); + lqw.like(StringUtils.isNotBlank(projectSite), BusProject::getProjectSite, projectSite); + lqw.like(StringUtils.isNotBlank(principal), BusProject::getPrincipal, principal); + lqw.like(StringUtils.isNotBlank(principalPhone), BusProject::getPrincipalPhone, principalPhone); + // 精确查询 + lqw.eq(ObjectUtils.isNotEmpty(status), BusProject::getStatus, status); + lqw.eq(ObjectUtils.isNotEmpty(projectType), BusProject::getProjectType, projectType); + lqw.eq(ObjectUtils.isNotEmpty(projectCategory), BusProject::getProjectStage, projectCategory); + lqw.eq(ObjectUtils.isNotEmpty(showHidden), BusProject::getShowHidden, showHidden); + if (ObjectUtils.isNotEmpty(parentId)) { + lqw.eq(BusProject::getParentId, parentId); + } else { + // 不查询子项目 + final Long PID = 0L; + lqw.eq(BusProject::getParentId, PID); + } + // 排序 + lqw.orderByAsc(BusProject::getSort); + return lqw; + } + + + @Override + public Page getVoPage(Page projectPage) { + List projectList = projectPage.getRecords(); + Page projectVoPage = new Page<>(projectPage.getCurrent(), projectPage.getSize(), projectPage.getTotal()); + if (CollUtil.isEmpty(projectList)) { + return projectVoPage; + } + // 获取项目文件id + Set projectIdList = projectList.stream().map(BusProject::getId).collect(Collectors.toSet()); + // 获取子项目列表 + List subProjectList = this.lambdaQuery() + .select(BusProject::getId, BusProject::getParentId, BusProject::getProjectName, BusProject::getCreateTime) + .in(BusProject::getParentId, projectIdList) + .list(); + Set subIdList = subProjectList.stream().map(BusProject::getId).collect(Collectors.toSet()); + Map> subProjectMap = subProjectList.stream().collect(Collectors.groupingBy(BusProject::getParentId)); + Map> projectFileMap = projectFileService.lambdaQuery() + .in(CollUtil.isNotEmpty(subIdList), BusProjectFile::getProjectId, subIdList).list() + .stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId)); + + // 对象列表 => 封装对象列表 + List projectVoList = projectList.stream().map(project -> { + // 对象转封装类 + BusProjectVo projectVo = new BusProjectVo(); + BeanUtils.copyProperties(project, projectVo); + String punchRange = project.getPunchRange(); + if (StringUtils.isNotBlank(punchRange)) { + String[] split = punchRange.split(","); + projectVo.setPlayCardStart(split[0]); + projectVo.setPlayCardEnd(split[1]); + } + // 关联子项目 + List subProjectVoList = new ArrayList<>(); + if (subProjectMap.containsKey(project.getId())) { + subProjectVoList = subProjectMap.get(project.getId()).stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + Long id = subProject.getId(); + // 关联设计id + if (projectFileMap.containsKey(id)) { + subProjectVo.setDesignId(projectFileMap.get(id).getFirst().getId()); + } + return subProjectVo; + }).toList(); + } + projectVo.setChildren(subProjectVoList); + return projectVo; + }).toList(); + projectVoPage.setRecords(projectVoList); + return projectVoPage; + } + + /** + * 校验用户是否拥有操作项目的权限 + * + * @param projectId 项目对象 + * @param userId 需要鉴权的用户id + */ + @Override + public void validAuth(Long projectId, Long userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(BusUserProjectRelevancy::getProjectId, projectId); + lqw.eq(BusUserProjectRelevancy::getUserId, userId); + if (userProjectRelevancyService.count(lqw) <= 0) { + throw new ServiceException("当前用户无该项目权限操作", HttpStatus.FORBIDDEN); + } + } + + /** + * 校验用户是否拥有操作项目的权限 + * + * @param projectIdList 项目id列表 + * @param userId 需要鉴权的用户id + */ + @Override + public void validAuth(Collection projectIdList, Long userId) { + // 查询关联表,返回和用户关联的项目ID列表 + Set collect = userProjectRelevancyService.listObjs( + new LambdaQueryWrapper() + .select(BusUserProjectRelevancy::getProjectId) + .in(BusUserProjectRelevancy::getProjectId, projectIdList) + .eq(BusUserProjectRelevancy::getUserId, userId) + .groupBy(BusUserProjectRelevancy::getProjectId) + ).stream().map(obj -> (Long) obj).collect(Collectors.toSet()); + // 找出没有关联数据的项目ID + List invalidIds = projectIdList.stream() + .filter(id -> !collect.contains(id)) + .toList(); + if (!invalidIds.isEmpty()) { + throw new ServiceException("操作失败,项目编号为:" + invalidIds + ",没有操作权限", HttpStatus.FORBIDDEN); + } + } + + /** + * 获取项目安全天数 + * + * @param id 项目id + * @return 安全天数 + */ + @Override + public BusProjectSafetyDayVo getSafetyDay(Long id) { + // 构建缓存 key + String cacheKey = String.format("%s:%s", BusProjectConstant.PROJECT_SAFETY_DAYS_REDIS_KEY_PREFIX, id); + // 查询分布式缓存(Redis) + ValueOperations valueOps = stringRedisTemplate.opsForValue(); + String cachedValue = valueOps.get(cacheKey); + if (cachedValue != null) { + // 如果命中Redis,返回结果 + return JSONUtil.toBean(cachedValue, BusProjectSafetyDayVo.class); + } + BusProject project = this.getById(id); + if (project == null) { + throw new ServiceException("项目信息不存在", HttpStatus.NOT_FOUND); + } + long days = DateUtils.difference(project.getCreateTime(), new Date(), TimeUnit.DAYS); + BusProjectSafetyDayVo safetyDayVo = new BusProjectSafetyDayVo(); + safetyDayVo.setSafetyDay(days); + // 更新缓存 + String cacheValue = JSONUtil.toJsonStr(safetyDayVo); + // 更新 Redis 缓存 + int cacheExpireTime = 12; + valueOps.set(cacheKey, cacheValue, cacheExpireTime, TimeUnit.HOURS); + // 返回结果 + return safetyDayVo; + } + + /** + * 获取项目地址信息 + * + * @return 项目地址信息列表 + */ + @Override + public List getGisList() { + // 查询所有的顶级项目 + List projects = this.lambdaQuery() + .eq(BusProject::getParentId, BusProjectConstant.PARENT_ID) + .eq(BusProject::getStatus, "0") + .list(); + return projects.stream().map(project -> { + BusProjectGisVo vo = new BusProjectGisVo(); + BeanUtils.copyProperties(project, vo); + return vo; + }).toList(); + } + + /** + * 改变项目所属用户 + * + * @param id 项目id + * @return 是否成功 + */ + @Override + public Boolean changeUserProject(Long id) { + // 将用户选择项目设置到缓存中 + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser != null) { + loginUser.setProjectId(id); + StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); + return true; + } + return false; + } + + @Override + public BusProjectVo selectById(Long projectId) { + return baseMapper.selectVoById(projectId); + } + + @Override + public List selectProjectVoList() { + return baseMapper.selectVoList(); + } + + /** + * 通过项目ID查询项目名称 + * + * @param projectId 项目ID + * @return 项目名称 + */ + @Cacheable(cacheNames = CacheNames.PROJECT_NAME, key = "#projectId") + @Override + public String getProjectNameById(Long projectId) { + if (projectId == 0) { + return null; + } + BusProject project = this.lambdaQuery() + .select(BusProject::getProjectName) + .eq(BusProject::getId, projectId) + .one(); + return project != null ? project.getProjectName() : null; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusUserProjectRelevancyServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusUserProjectRelevancyServiceImpl.java new file mode 100644 index 0000000..9797427 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/BusUserProjectRelevancyServiceImpl.java @@ -0,0 +1,462 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +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.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.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.controller.constant.BusProjectConstant; +import org.dromara.system.domain.BusProject; +import org.dromara.system.domain.BusUserProjectRelevancy; +import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq; +import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq; +import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo; +import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo; +import org.dromara.system.mapper.BusUserProjectRelevancyMapper; +import org.dromara.system.service.IBusProjectService; +import org.dromara.system.service.IBusUserProjectRelevancyService; +import org.dromara.system.service.ISysUserService; +import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 系统用户与项目关联Service业务层处理 + * + * @author lilemy + * @date 2025-03-04 + */ +@Service +public class BusUserProjectRelevancyServiceImpl extends ServiceImpl + implements IBusUserProjectRelevancyService { + + @Resource + private IBusProjectService projectService; + + @Lazy + @Resource + private ISysUserService userService; + + /** + * 查询系统用户与项目关联 + * + * @param id 主键 + * @return 系统用户与项目关联 + */ + @Override + public BusUserProjectRelevancyVo queryById(Long id) { + // 查询数据 + BusUserProjectRelevancy userProjectRelevancy = this.getById(id); + if (userProjectRelevancy == null) { + throw new ServiceException("对应用户与项目关联不存在", HttpStatus.NOT_FOUND); + } + // 封装并返回 + return this.getVo(userProjectRelevancy); + } + + /** + * 分页查询系统用户与项目关联列表 + * + * @param req 查询条件 + * @param pageQuery 分页参数 + * @return 系统用户与项目关联分页列表 + */ + @Override + public TableDataInfo queryPageList(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) { + // 查询数据库 + Page result = this.page(pageQuery.build(), this.buildQueryWrapper(req)); + return TableDataInfo.build(this.getVoPage(result)); + } + + /** + * 查询符合条件的系统用户与项目关联列表 + * + * @param req 查询条件 + * @return 系统用户与项目关联列表 + */ + @Override + public List queryList(BusUserProjectRelevancyQueryReq req) { + LambdaQueryWrapper lqw = this.buildQueryWrapper(req); + return this.list(lqw).stream().map(this::getVo).toList(); + } + + /** + * 新增系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 新增关联id + */ + @Override + public Long insertByBo(BusUserProjectRelevancyCreateReq req) { + // 将实体类和 DTO 进行转换 + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + BeanUtils.copyProperties(req, userProjectRelevancy); + // 数据校验 + validEntityBeforeSave(userProjectRelevancy, true); + // 判断对应的用户与项目关联是否存在 + if (this.getOne(new LambdaQueryWrapper() + .eq(BusUserProjectRelevancy::getUserId, userProjectRelevancy.getUserId()) + .eq(BusUserProjectRelevancy::getProjectId, userProjectRelevancy.getProjectId())) != null) { + throw new ServiceException("用户和项目关联已存在", HttpStatus.CONFLICT); + } + // 写入数据库 + boolean save = this.save(userProjectRelevancy); + if (!save) { + throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR); + } + // 返回新写入的数据 id + return userProjectRelevancy.getId(); + } + + /** + * 批量新增用户和项目关联 + * + * @param projectId 项目ID + * @param userIdList 用户ID列表 + * @param userType 用户类型 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveBatchByUserList(Long projectId, List userIdList, String userType) { + if (ObjectUtils.isEmpty(projectId) || ObjectUtils.isEmpty(userIdList)) { + return; + } + List userProjectRelevancyList = userIdList.stream().map(userId -> { + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + userProjectRelevancy.setUserType(userType); + return userProjectRelevancy; + }).toList(); + boolean saveRelevancy = this.saveBatch(userProjectRelevancyList); + if (!saveRelevancy) { + throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR); + } + } + + /** + * 批量新增用户和项目关联 + * + * @param projectIdList 项目ID列表 + * @param userId 用户ID + * @param userType 用户类型 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void saveBatchByProjectList(List projectIdList, Long userId, String userType) { + if (ObjectUtils.isEmpty(projectIdList) || ObjectUtils.isEmpty(userId) || StringUtils.isBlank(userType)) { + return; + } + List userProjectRelevancyList = projectIdList.stream().map(projectId -> { + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + userProjectRelevancy.setUserType(userType); + return userProjectRelevancy; + }).toList(); + boolean saveRelevancy = this.saveBatch(userProjectRelevancyList); + if (!saveRelevancy) { + throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR); + } + } + + /** + * 修改系统用户与项目关联 + * + * @param req 系统用户与项目关联 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(BusUserProjectRelevancyUpdateReq req) { + // 将实体类和 DTO 进行转换 + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + BeanUtils.copyProperties(req, userProjectRelevancy); + // 数据校验 + validEntityBeforeSave(userProjectRelevancy, false); + // 判断是否存在 + BusUserProjectRelevancy oldUserProjectRelevancy = this.getById(userProjectRelevancy.getId()); + if (oldUserProjectRelevancy == null) { + throw new ServiceException("修改用户和项目关联失败,数据不存在", HttpStatus.NOT_FOUND); + } + // 操作数据库 + return this.updateById(oldUserProjectRelevancy); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(BusUserProjectRelevancy entity, Boolean create) { + // TODO 做一些数据校验,如唯一约束 + Long projectId = entity.getProjectId(); + Long userId = entity.getUserId(); + if (create) { + if (projectId == null) { + throw new ServiceException("项目 id 不能为空", HttpStatus.BAD_REQUEST); + } + if (userId == null) { + throw new ServiceException("用户 id 不能为空", HttpStatus.BAD_REQUEST); + } + } + // 判断对应项目是否存在 + if (projectService.getById(projectId) == null) { + throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); + } + // 判断对应用户是否存在 + if (userService.selectUserById(userId) == null) { + throw new ServiceException("用户不存在", HttpStatus.NOT_FOUND); + } + } + + /** + * 校验并批量删除系统用户与项目关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + // 获取当前登录用户 + Long userId = LoginHelper.getUserId(); + // 获取待删除数据详情 + List busUserProjectRelevancyList = this.listByIds(ids); + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + // 获取项目id列表 + List projectIdList = busUserProjectRelevancyList.stream().map(BusUserProjectRelevancy::getProjectId).toList(); + // 判断是否有权限操作对应项目下的内容 + projectService.validAuth(projectIdList, userId); + } + // 判断对应数据是否都存在 + if (busUserProjectRelevancyList.size() != ids.size()) { + throw new ServiceException("删除系统用户与项目关联失败,数据缺失", HttpStatus.BAD_REQUEST); + } + return this.removeBatchByIds(ids); + } + + /** + * 根据用户ID删除系统用户与项目关联 + * + * @param userId 用户ID + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByUserId(Long userId) { + List relevancyList = this.lambdaQuery() + .eq(BusUserProjectRelevancy::getUserId, userId) + .list(); + if (CollUtil.isNotEmpty(relevancyList)) { + boolean result = this.removeBatchByIds(relevancyList); + if (!result) { + throw new ServiceException("删除用户项目关联失败,数据库异常", HttpStatus.ERROR); + } + } + } + + /** + * 根据项目ID和用户ID列表删除系统用户与项目关联 + * + * @param oldProjectId 项目ID + * @param userIds 用户ID列表 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByProjectAndUserIds(Long oldProjectId, List userIds) { + List relevancyList = this.lambdaQuery() + .eq(BusUserProjectRelevancy::getProjectId, oldProjectId) + .in(BusUserProjectRelevancy::getUserId, userIds) + .list(); + if (CollUtil.isNotEmpty(relevancyList)) { + boolean result = this.removeBatchByIds(relevancyList); + if (!result) { + throw new ServiceException("删除用户项目关联失败,数据库异常", HttpStatus.ERROR); + } + } + } + + /** + * 获取当前登录用户项目列表 + * + * @param userId 登录用户ID + * @return 当前登录用户项目列表 + */ + @Override + public List queryListByUserId(Long userId) { + // 添加查询条件,根据当前用户,获取数据 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(BusUserProjectRelevancy::getUserId, userId); + // 查询数据库,获取数据 + List list = this.list(queryWrapper); + List projectIdList = list.stream().map(BusUserProjectRelevancy::getProjectId).toList(); + if (CollUtil.isEmpty(projectIdList)) { + return new ArrayList<>(); + } + Map> projectMap = projectService.lambdaQuery() + .select(BusProject::getId, BusProject::getParentId, BusProject::getProjectName, BusProject::getShortName) + .in(BusProject::getId, projectIdList) + .eq(BusProject::getParentId, BusProjectConstant.PARENT_ID) + .list() + .stream().collect(Collectors.groupingBy(BusProject::getId)); + // 获取封装 + return list.stream() + .map(userProjectRelevancy -> { + Long projectId = userProjectRelevancy.getProjectId(); + BusProject project = null; + if (projectMap.containsKey(projectId)) { + project = projectMap.get(projectId).getFirst(); + } + if (project != null && project.getParentId().equals(BusProjectConstant.PARENT_ID)) { + BusLoginUserProjectRelevancyVo loginUserProjectRelevancy = new BusLoginUserProjectRelevancyVo(); + 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(); + } + + /** + * 获取当前登录用户项目分页 + * + * @param userId 登录用户ID + * @param req 分页查询条件 + * @param pageQuery 分页查询条件 + * @return 当前登录用户项目分页 + */ + @Override + public TableDataInfo queryPageByUserId(Long userId, BusUserProjectRelevancyQueryReq req, + PageQuery pageQuery) { + // 添加查询条件 + req.setUserId(userId); + LambdaQueryWrapper queryWrapper = this.buildQueryWrapper(req); + // 查询数据库 + Page result = this.page(pageQuery.build(), queryWrapper); + return TableDataInfo.build(this.getVoPage(result)); + } + + /** + * 批量新增用户和项目关联 + * + * @param req 新增参数 + * @return 是否增加成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertBatchByProjectList(BusProjectBatchByProjectListReq req) { + Long userId = req.getUserId(); + List projectIdList = req.getProjectIdList(); + long count = projectService.count(new QueryWrapper().in("id", projectIdList)); + if (count < projectIdList.size()) { + throw new ServiceException("项目ID列表错误,一个或多个项目不存在", HttpStatus.NOT_FOUND); + } + List userProjectRelevancyList = projectIdList.stream().map(projectId -> { + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(userId); + userProjectRelevancy.setProjectId(projectId); + // 查询对应用户与项目关联信息是否存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", userId); + queryWrapper.eq("project_id", projectId); + // 如果存在则不保存 + BusUserProjectRelevancy 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); + } + + /** + * 获取系统用户与项目关联视图 + * + * @param userProjectRelevancy 系统用户与项目关联 + * @return 系统用户与项目关联视图 + */ + @Override + public BusUserProjectRelevancyVo getVo(BusUserProjectRelevancy userProjectRelevancy) { + // 对象转封装类 + BusUserProjectRelevancyVo userProjectRelevancyVo = new BusUserProjectRelevancyVo(); + if (userProjectRelevancy == null) { + return userProjectRelevancyVo; + } + BeanUtils.copyProperties(userProjectRelevancy, userProjectRelevancyVo); + // 关联查询项目信息 + Long projectId = userProjectRelevancy.getProjectId(); + if (projectId != null) { + userProjectRelevancyVo.setProject(projectService.queryById(projectId)); + } + return userProjectRelevancyVo; + } + + /** + * 获取用户和项目关联对象查询条件封装 + * + * @param req 查询条件 + * @return 查询条件封装 + */ + @Override + public LambdaQueryWrapper buildQueryWrapper(BusUserProjectRelevancyQueryReq req) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (req == null) { + return queryWrapper; + } + // 从对象中取值 + Long userId = req.getUserId(); + Long projectId = req.getProjectId(); + String userType = req.getUserType(); + // 精确查询 + queryWrapper.eq(ObjectUtils.isNotEmpty(userId), BusUserProjectRelevancy::getUserId, userId); + queryWrapper.eq(ObjectUtils.isNotEmpty(projectId), BusUserProjectRelevancy::getProjectId, projectId); + queryWrapper.eq(StringUtils.isNotBlank(userType), BusUserProjectRelevancy::getUserType, userType); + return queryWrapper; + } + + /** + * 获取系统用户与项目关联分页视图 + * + * @param userProjectRelevancyPage 系统用户与项目关联分页 + * @return 系统用户与项目关联分页视图 + */ + @Override + public Page getVoPage(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::getVo).toList(); + userProjectRelevancyVoPage.setRecords(userProjectRelevancyVoList); + return userProjectRelevancyVoPage; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 4936e7a..545bbde 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.*; @@ -26,6 +27,7 @@ import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysPostMapper; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysDeptService; @@ -40,7 +42,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * 部门管理 服务实现 @@ -54,6 +55,7 @@ public class SysDeptServiceImpl implements ISysDeptService { private final SysDeptMapper baseMapper; private final SysRoleMapper roleMapper; private final SysUserMapper userMapper; + private final SysPostMapper postMapper; /** * 分页查询部门管理数据 @@ -101,37 +103,12 @@ public class SysDeptServiceImpl implements ISysDeptService { lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); - lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); lqw.eq(StringUtils.isNotBlank(bo.getIsShow()), SysDept::getIsShow, bo.getIsShow()); lqw.eq(StringUtils.isNotBlank(bo.getDeptType()), SysDept::getDeptType, bo.getDeptType()); lqw.orderByAsc(SysDept::getAncestors); lqw.orderByAsc(SysDept::getParentId); lqw.orderByAsc(SysDept::getOrderNum); lqw.orderByAsc(SysDept::getDeptId); -// Map params = bo.getParams(); -// LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); -// lqw.eq(SysDept::getDelFlag, SystemConstants.NORMAL); -// lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); -// lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); -// lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); -// lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory()); -// lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); -// lqw.between(params.get("beginTime") != null && params.get("endTime") != null, -// SysDept::getCreateTime, params.get("beginTime"), params.get("endTime")); -// lqw.orderByAsc(SysDept::getAncestors); -// lqw.orderByAsc(SysDept::getParentId); -// lqw.orderByAsc(SysDept::getOrderNum); -// lqw.orderByAsc(SysDept::getDeptId); -// if (ObjectUtil.isNotNull(bo.getBelongDeptId())) { -// //部门树搜索 -// lqw.and(x -> { -// Long parentId = bo.getBelongDeptId(); -// List deptList = baseMapper.selectListByParentId(parentId); -// List deptIds = StreamUtils.toList(deptList, SysDept::getDeptId); -// deptIds.add(parentId); -// x.in(SysDept::getDeptId, deptIds); -// }); -// } return lqw; } @@ -182,61 +159,46 @@ public class SysDeptServiceImpl implements ISysDeptService { // ); } - //TODO 同步xinnengyuan的service - -// /** -// * 构建前端所需要下拉树结构 -// * -// * @param projectId 项目id -// * @return 下拉树结构列表 -// */ -// @Override -// public List> buildDeptTreeByProjectId(Long projectId) { -// SysDept dept = baseMapper.selectOne( -// new LambdaQueryWrapper<>(SysDept.class) -// .eq(SysDept::getProjectId, projectId) -// .eq(SysDept::getDeptType, SysDeptTypeEnum.PROJECT.getCode()) -// .eq(SysDept::getStatus, SystemConstants.NORMAL) -// ); -// if (dept == null) { -// return List.of(); -// } -// List deptIds = Stream.concat( -// Arrays.stream(dept.getAncestors().split(",")) -// .filter(StringUtils::isNotBlank) -// .map(Long::parseLong), -// Stream.of(dept.getDeptId()) -// ).toList(); -// List deptVoList = baseMapper.selectVoByIds(deptIds); -// List postVos = postMapper.selectVoList( -// new LambdaQueryWrapper<>(SysPost.class) -// .in(SysPost::getDeptId, deptIds) -// .eq(SysPost::getStatus, SystemConstants.NORMAL) -// ); -// Map> postVoMap = postVos.stream().collect(Collectors.groupingBy(SysPostVo::getDeptId)); -// // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 -// List> treeList = CollUtil.newArrayList(); -// for (SysDeptVo d : deptVoList) { -// Long parentId = d.getParentId(); -// SysDeptVo sysDeptVo = StreamUtils.findFirst(deptVoList, it -> it.getDeptId().longValue() == parentId); -// if (ObjectUtil.isNull(sysDeptVo)) { -// List> trees = TreeBuildUtils.build(deptVoList, parentId, (deptVo, tree) -> { -// Long deptId = deptVo.getDeptId(); -// tree.setId(deptId) -// .setParentId(deptVo.getParentId()) -// .setName(deptVo.getDeptName()) -// .setWeight(deptVo.getOrderNum()) -// .putExtra("disabled", SystemConstants.DISABLE.equals(deptVo.getStatus())); -// tree.putExtra("deptType", deptVo.getDeptType()); -// tree.putExtra("postVoList", postVoMap.get(deptId)); -// } -// ); -// Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId()); -// treeList.add(tree); -// } -// } -// return treeList; -// } + /** + * 构建前端所需要下拉树结构 + * + * @return 下拉树结构列表 + */ + @Override + public List> buildDeptTree() { + List deptVoList = baseMapper.selectVoList(); + if (CollUtil.isEmpty(deptVoList)) { + return CollUtil.newArrayList(); + } + List postVos = postMapper.selectVoList( + new LambdaQueryWrapper<>(SysPost.class) + .in(SysPost::getDeptId, deptVoList.stream().map(SysDeptVo::getDeptId).collect(Collectors.toSet())) + .eq(SysPost::getStatus, SystemConstants.NORMAL) + ); + Map> postVoMap = postVos.stream().collect(Collectors.groupingBy(SysPostVo::getDeptId)); + // 获取当前列表中每一个节点的parentId,然后在列表中查找是否有id与其parentId对应,若无对应,则表明此时节点列表中,该节点在当前列表中属于顶级节点 + List> treeList = CollUtil.newArrayList(); + for (SysDeptVo d : deptVoList) { + Long parentId = d.getParentId(); + SysDeptVo sysDeptVo = StreamUtils.findFirst(deptVoList, it -> it.getDeptId().longValue() == parentId); + if (ObjectUtil.isNull(sysDeptVo)) { + List> trees = TreeBuildUtils.build(deptVoList, parentId, (deptVo, tree) -> { + Long deptId = deptVo.getDeptId(); + tree.setId(deptId) + .setParentId(deptVo.getParentId()) + .setName(deptVo.getDeptName()) + .setWeight(deptVo.getOrderNum()) + .putExtra("disabled", SystemConstants.DISABLE.equals(deptVo.getStatus())); + tree.putExtra("deptType", deptVo.getDeptType()); + tree.putExtra("postVoList", postVoMap.get(deptId)); + } + ); + Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId()); + treeList.add(tree); + } + } + return treeList; + } /** * 根据角色ID查询部门树信息 @@ -493,4 +455,29 @@ public class SysDeptServiceImpl implements ISysDeptService { .eq(SysDept::getStatus, SystemConstants.NORMAL)); } + /** + * 校验部门和角色是否匹配 + * + * @param deptId 部门id + * @param roleIds 角色id列表 + */ + @Override + public void checkDeptMatchRole(Long deptId, List roleIds) { + if (ObjectUtil.isNull(deptId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + List roleList = roleMapper.selectByIds(roleIds); + for (SysRole role : roleList) { + if (!role.getStatus().equals(SystemConstants.NORMAL)) { + throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST); + } + if (!role.getDeptId().equals(deptId)) { + throw new ServiceException("角色部门与部门不匹配", HttpStatus.BAD_REQUEST); + } + } + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 89a09f7..cfcefeb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -20,6 +21,7 @@ import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRoleMenu; import org.dromara.system.domain.SysTenantPackage; import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.dto.project.ProjectPermsItem; import org.dromara.system.domain.vo.MetaVo; import org.dromara.system.domain.vo.RouterVo; import org.dromara.system.domain.vo.SysMenuVo; @@ -32,6 +34,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * 菜单 业务层处理 @@ -100,15 +103,23 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 权限列表 */ @Override - public Set selectMenuPermsByUserId(Long userId) { - List perms = baseMapper.selectMenuPermsByUserId(userId); - Set permsSet = new HashSet<>(); - for (String perm : perms) { - if (StringUtils.isNotEmpty(perm)) { - permsSet.addAll(StringUtils.splitList(perm.trim())); - } - } - return permsSet; + public List selectMenuPermsByUserId(Long userId) { + List items = baseMapper.selectMenuPermsByUserId(userId); + return items.stream() + .filter(item -> item.getPerms() != null && !item.getPerms().isBlank()) // 过滤掉空的 perms + .collect(Collectors.groupingBy( + ProjectPermsItem::getProjectId, + Collectors.mapping(ProjectPermsItem::getPerms, Collectors.toList()) + )) + .entrySet().stream() + .map(e -> { + SysProjectRoleMenuVo vo = new SysProjectRoleMenuVo(); + vo.setProjectId(e.getKey()); + Set set = new HashSet<>(e.getValue()); + vo.setProjectPermissions(set); + return vo; + }) + .toList(); } /** @@ -130,20 +141,21 @@ public class SysMenuServiceImpl implements ISysMenuService { } /** - * 根据用户ID查询菜单 + * 根据用户ID查询菜单树信息 * - * @param userId 用户名称 + * @param userId 用户ID + * @param projectId 项目ID * @return 菜单列表 */ @Override - public List selectMenuTreeByUserId(Long userId) { + public List selectMenuTreeByUserId(Long userId, Long projectId) { List menus; if (LoginHelper.isSuperAdmin(userId)) { menus = baseMapper.selectMenuTreeAll(); } else { - menus = baseMapper.selectMenuTreeByUserId(userId); + menus = baseMapper.selectMenuTreeByUserId(userId, projectId); } - return getChildPerms(menus, Constants.TOP_PARENT_ID); + return getChildPerms(menus, 0); } /** @@ -376,11 +388,11 @@ public class SysMenuServiceImpl implements ISysMenuService { * @param parentId 传入的父节点ID * @return String */ - private List getChildPerms(List list, Long parentId) { + private List getChildPerms(List list, int parentId) { List returnList = new ArrayList<>(); for (SysMenu t : list) { // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 - if (t.getParentId().equals(parentId)) { + if (t.getParentId() == parentId) { recursionFn(list, t); returnList.add(t); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java index 7ccae4b..ba7f184 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -2,13 +2,19 @@ package org.dromara.system.service.impl; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.BusProject; +import org.dromara.system.service.IBusProjectService; import org.dromara.system.service.ISysMenuService; import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysRoleService; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -22,40 +28,57 @@ public class SysPermissionServiceImpl implements ISysPermissionService { private final ISysRoleService roleService; private final ISysMenuService menuService; + private final IBusProjectService projectService; /** * 获取角色数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 角色权限信息 */ @Override - public Set getRolePermission(Long userId) { - Set roles = new HashSet<>(); + public List getRolePermission(Long userId) { // 管理员拥有所有权限 if (LoginHelper.isSuperAdmin(userId)) { - roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); + List roles = new ArrayList<>(); + List projects = projectService.list(); + for (BusProject project : projects) { + SysProjectRolePermissionVo vo = new SysProjectRolePermissionVo(); + Set role = new HashSet<>(); + vo.setProjectId(project.getId()); + role.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); + vo.setProjectRoles(role); + roles.add(vo); + } + return roles; } else { - roles.addAll(roleService.selectRolePermissionByUserId(userId)); + return roleService.selectRolePermissionByUserId(userId); } - return roles; } /** * 获取菜单数据权限 * - * @param userId 用户id + * @param userId 用户id * @return 菜单权限信息 */ @Override - public Set getMenuPermission(Long userId) { - Set perms = new HashSet<>(); + public List getMenuPermission(Long userId) { // 管理员拥有所有权限 if (LoginHelper.isSuperAdmin(userId)) { - perms.add("*:*:*"); + List roles = new ArrayList<>(); + List projects = projectService.list(); + for (BusProject project : projects) { + SysProjectRoleMenuVo vo = new SysProjectRoleMenuVo(); + Set role = new HashSet<>(); + vo.setProjectId(project.getId()); + role.add("*:*:*"); + vo.setProjectPermissions(role); + roles.add(vo); + } + return roles; } else { - perms.addAll(menuService.selectMenuPermsByUserId(userId)); + return menuService.selectMenuPermsByUserId(userId); } - return perms; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 57d1407..a824308 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -13,8 +13,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.constant.SystemConstants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; @@ -23,22 +24,23 @@ 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.system.api.model.LoginUser; -import org.dromara.system.domain.SysRole; -import org.dromara.system.domain.SysRoleDept; -import org.dromara.system.domain.SysRoleMenu; -import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.dto.project.ProjectRolesItem; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.mapper.SysRoleDeptMapper; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysRoleMenuMapper; import org.dromara.system.mapper.SysUserRoleMapper; +import org.dromara.system.service.IBusProjectService; import org.dromara.system.service.ISysRoleService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * 角色 业务层处理 @@ -53,6 +55,7 @@ public class SysRoleServiceImpl implements ISysRoleService { private final SysRoleMenuMapper roleMenuMapper; private final SysUserRoleMapper userRoleMapper; private final SysRoleDeptMapper roleDeptMapper; + private final IBusProjectService projectService; @Override public TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery) { @@ -123,15 +126,29 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 权限列表 */ @Override - public Set selectRolePermissionByUserId(Long userId) { - List perms = baseMapper.selectRolesByUserId(userId); - Set permsSet = new HashSet<>(); - for (SysRoleVo perm : perms) { - if (ObjectUtil.isNotNull(perm)) { - permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); - } + public List selectRolePermissionByUserId(Long userId) { + List items = baseMapper.selectProjectRolesByUserId(userId); + // 过滤掉项目id为null的数据 + items = items.stream().filter(item -> item.getProjectId() != null).toList(); + if (CollUtil.isEmpty(items)) { + return new ArrayList<>(); } - return permsSet; + return items.stream() + .filter(Objects::nonNull) // 保证不为空 + .peek(item -> { + if (item.getRoleKey() != null) { + item.setRoleKey(item.getRoleKey().trim()); // roleKey 去空格 + } + }) + .collect(Collectors.groupingBy(ProjectRolesItem::getProjectId)) + .entrySet().stream() + .map(e -> { + SysProjectRolePermissionVo vo = new SysProjectRolePermissionVo(); + vo.setProjectId(e.getKey()); + vo.setProjectRoles(e.getValue().stream().map(ProjectRolesItem::getRoleKey).collect(Collectors.toSet())); + return vo; + }) + .toList(); } /** @@ -180,6 +197,46 @@ public class SysRoleServiceImpl implements ISysRoleService { .in(CollUtil.isNotEmpty(roleIds), "r.role_id", roleIds)); } + /** + * 获取角色选择框列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRoleProjectList(Long userId) { + if (userId.equals(SystemConstants.SUPER_ADMIN_ID)) { + return List.of(); + } else { + List userRoles = userRoleMapper.selectList(new LambdaQueryWrapper<>(SysUserRole.class) + .eq(SysUserRole::getUserId, userId)); + if (CollUtil.isEmpty(userRoles)) { + return List.of(); + } + List projectIds = userRoles.stream().map(SysUserRole::getProjectId).distinct().toList(); + List projectList = projectService.listByIds(projectIds); + if (CollUtil.isEmpty(projectList)) { + return List.of(); + } + Map> projectMap = projectList.stream().collect(Collectors.groupingBy(BusProject::getId)); + List list = new ArrayList<>(); + Map> map = userRoles.stream().collect(Collectors.groupingBy(SysUserRole::getProjectId)); + for (Map.Entry> entry : map.entrySet()) { + Long key = entry.getKey(); + SysRoleProjectDto dto = new SysRoleProjectDto(); + dto.setProjectId(key); + dto.setRoleIds(StreamUtils.toList(entry.getValue(), SysUserRole::getRoleId)); + if (projectMap.containsKey(key)) { + BusProject project = projectMap.get(key).getFirst(); + dto.setProjectName(project.getProjectName()); + dto.setShortName(project.getShortName()); + } + list.add(dto); + } + return list; + } + } + /** * 校验角色名称是否唯一 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index f4c4cca..ca70038 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -21,11 +21,13 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.*; +import org.dromara.system.service.IBusUserProjectRelevancyService; import org.dromara.system.service.ISysUserService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -52,6 +54,7 @@ public class SysUserServiceImpl implements ISysUserService { private final SysPostMapper postMapper; private final SysUserRoleMapper userRoleMapper; private final SysUserPostMapper userPostMapper; + private final IBusUserProjectRelevancyService userProjectRelevancyService; @Override public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { @@ -90,6 +93,7 @@ public class SysUserServiceImpl implements ISysUserService { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(SysUser::getDelFlag, SystemConstants.NORMAL) .eq(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId()) + .like(StringUtils.isNotBlank(user.getNickName()), SysUser::getNickName, user.getNickName()) .in(StringUtils.isNotBlank(user.getUserIds()), SysUser::getUserId, StringUtils.splitTo(user.getUserIds(), Convert::toLong)) .like(StringUtils.isNotBlank(user.getUserName()), SysUser::getUserName, user.getUserName()) .like(StringUtils.isNotBlank(user.getNickName()), SysUser::getNickName, user.getNickName()) @@ -196,7 +200,7 @@ public class SysUserServiceImpl implements ISysUserService { @Override public List selectUserByIds(List userIds, Long deptId) { return baseMapper.selectUserList(new LambdaQueryWrapper() - .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) .eq(SysUser::getStatus, SystemConstants.NORMAL) + .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber).eq(SysUser::getStatus, SystemConstants.NORMAL) .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId) .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)); } @@ -362,13 +366,13 @@ public class SysUserServiceImpl implements ISysUserService { /** * 用户授权角色 * - * @param userId 用户ID - * @param roleIds 角色组 + * @param userId 用户ID + * @param projectRoles 项目、角色关联组 */ @Override @Transactional(rollbackFor = Exception.class) - public void insertUserAuth(Long userId, Long[] roleIds) { - insertUserRole(userId, roleIds, true); + public void insertUserAuth(Long userId, List projectRoles) { + insertUserRole(userId, projectRoles, true); } /** @@ -441,7 +445,7 @@ public class SysUserServiceImpl implements ISysUserService { * @param clear 清除已存在的关联数据 */ private void insertUserRole(SysUserBo user, boolean clear) { - this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); + this.insertUserRole(user.getUserId(), user.getProjectRoles(), clear); } /** @@ -471,13 +475,18 @@ public class SysUserServiceImpl implements ISysUserService { /** * 新增用户角色信息 * - * @param userId 用户ID - * @param roleIds 角色组 - * @param clear 清除已存在的关联数据 + * @param userId 用户ID + * @param projectRoles 角色项目关联组 + * @param clear 清除已存在的关联数据 */ - private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { - if (ArrayUtil.isNotEmpty(roleIds)) { - List roleList = new ArrayList<>(List.of(roleIds)); + private void insertUserRole(Long userId, List projectRoles, boolean clear) { + if (ArrayUtil.isNotEmpty(projectRoles)) { + // 去重后的所有 roleId + List roleList = new ArrayList<>(projectRoles.stream() + .filter(dto -> dto.getRoleIds() != null) + .flatMap(dto -> dto.getRoleIds().stream()) + .distinct() + .toList()); if (!LoginHelper.isSuperAdmin(userId)) { roleList.remove(SystemConstants.SUPER_ADMIN_ID); } @@ -491,13 +500,35 @@ public class SysUserServiceImpl implements ISysUserService { // 删除用户与角色关联 userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); } - // 新增用户与角色管理 - List list = StreamUtils.toList(roleList, roleId -> { - SysUserRole ur = new SysUserRole(); - ur.setUserId(userId); - ur.setRoleId(roleId); - return ur; - }); + // 新增用户与角色、项目关联 + List list = new ArrayList<>(); + List listProject = new ArrayList<>(); + for (SysRoleProjectDto dto : projectRoles) { + List roleIds = dto.getRoleIds(); + Long projectId = dto.getProjectId(); + if (CollUtil.isNotEmpty(roleIds) && projectId != null) { + for (Long roleId : roleIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + ur.setProjectId(projectId); + list.add(ur); + } + } + if (projectId != null) { + BusUserProjectRelevancy projectRelevancy = new BusUserProjectRelevancy(); + projectRelevancy.setUserId(userId); + projectRelevancy.setProjectId(projectId); + listProject.add(projectRelevancy); + } + } + if (clear) { + // 删除用户与项目的关联 + userProjectRelevancyService.remove(new LambdaQueryWrapper<>(BusUserProjectRelevancy.class) + .eq(BusUserProjectRelevancy::getUserId, userId)); + } + // 新增用户与项目的关联 + userProjectRelevancyService.saveBatch(listProject); userRoleMapper.insertBatch(list); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/application.yml b/ruoyi-modules/ruoyi-system/src/main/resources/application.yml index 50b0251..768b020 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/application.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9201 + port: 19201 # Spring spring: diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectFileMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectFileMapper.xml new file mode 100644 index 0000000..7fd193f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectFileMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectMapper.xml new file mode 100644 index 0000000..a3c7484 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectNewsMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectNewsMapper.xml new file mode 100644 index 0000000..1cf9dbb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectNewsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectPunchrangeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectPunchrangeMapper.xml new file mode 100644 index 0000000..749670e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusProjectPunchrangeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusUserProjectRelevancyMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusUserProjectRelevancyMapper.xml new file mode 100644 index 0000000..8ed48a0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/BusUserProjectRelevancyMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index b9eced8..ec979fb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -1,22 +1,13 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - + + @@ -52,19 +73,23 @@ order by m.parent_id, m.order_num - + select distinct ur.project_id, + m.perms from sys_menu m - left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0' - left join sys_role r on r.role_id = rm.role_id and r.status = '0' - where r.role_id in (select role_id from sys_user_role where user_id = #{userId}) + left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0' + left join sys_role r on r.role_id = rm.role_id and r.status = '0' + left join sys_user_role ur on ur.role_id = r.role_id + where ur.user_id = #{userId} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index 4ef7b1e..7e0dab5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -1,7 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> @@ -48,12 +48,29 @@ r.data_scope, r.status from sys_role r - WHERE r.del_flag = '0' and r.role_id in (select role_id from sys_user_role where user_id = #{userId}) + WHERE r.del_flag = '0' + and r.role_id in (select role_id from sys_user_role where user_id = #{userId}) + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml b/ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml index 808604a..f766c75 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9205 + port: 19205 # Spring spring: diff --git a/ruoyi-visual/ruoyi-monitor/Dockerfile b/ruoyi-visual/ruoyi-monitor/Dockerfile index 0b9c718..1412efd 100644 --- a/ruoyi-visual/ruoyi-monitor/Dockerfile +++ b/ruoyi-visual/ruoyi-monitor/Dockerfile @@ -11,7 +11,7 @@ WORKDIR /ruoyi/monitor ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" -EXPOSE 9100 +EXPOSE 19100 ADD ./target/ruoyi-monitor.jar ./app.jar diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml b/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml index 2bca46a..edba14b 100644 --- a/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml +++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9100 + port: 19100 # Spring spring: diff --git a/ruoyi-visual/ruoyi-nacos/Dockerfile b/ruoyi-visual/ruoyi-nacos/Dockerfile index 9b14944..dccf005 100644 --- a/ruoyi-visual/ruoyi-nacos/Dockerfile +++ b/ruoyi-visual/ruoyi-nacos/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds -#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds +#FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" @@ -9,7 +9,7 @@ RUN mkdir -p /ruoyi/nacos WORKDIR /ruoyi/nacos -EXPOSE 8848 +EXPOSE 18848 ENV TZ=Asia/Shanghai LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m" diff --git a/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties b/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties index dea1765..5ac1898 100644 --- a/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties +++ b/ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties @@ -13,23 +13,18 @@ # See the License for the specific language governing permissions and # limitations under the License. # - #*************** Spring Boot Related Configurations ***************# - ### Default web context path: server.servlet.contextPath=/nacos ### Include message field server.error.include-message=ALWAYS ### Default web server port: -server.port=8848 - +server.port=18848 #*************** Network Related Configurations ***************# ### If prefer hostname over ip for Nacos server addresses in cluster.conf: # nacos.inetutils.prefer-hostname-over-ip=false - ### Specify local server's IP: # nacos.inetutils.ip-address= - spring.application.name=ruoyi-nacos #*************** Config Module Related Configurations ***************# ### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced. @@ -38,58 +33,42 @@ nacos.plugin.datasource.log.enabled=true spring.sql.init.platform=mysql ### Count of DB: db.num=1 - ### Connect URL of DB: -db.url.0=jdbc:mysql://192.168.110.149:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true -db.user.0=zhihuiyunweidev -db.password.0=zhihuiyunweidev - +db.url.0=jdbc:mysql://192.168.110.2:13386/xny-config-dev?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +db.user.0=xny-config-dev +db.password.0=riSnaDKWAMHDWE2w ### the maximum retry times for push nacos.config.push.maxRetryTime=50 - #*************** Naming Module Related Configurations ***************# - ### If enable data warmup. If set to false, the server would accept request without local data preparation: # nacos.naming.data.warmup=true - ### If enable the instance auto expiration, kind like of health check of instance: # nacos.naming.expireInstance=true - nacos.naming.empty-service.auto-clean=true nacos.naming.empty-service.clean.initial-delay-ms=50000 nacos.naming.empty-service.clean.period-time-ms=30000 - - #*************** CMDB Module Related Configurations ***************# ### The interval to dump external CMDB in seconds: # nacos.cmdb.dumpTaskInterval=3600 - ### The interval of polling data change event in seconds: # nacos.cmdb.eventTaskInterval=10 - ### The interval of loading labels in seconds: # nacos.cmdb.labelTaskInterval=300 - ### If turn on data loading task: # nacos.cmdb.loadDataAtStart=false - - #*************** Metrics Related Configurations ***************# # 指向 ruoyi-monitor 监控 -spring.boot.admin.client.url=http://127.0.0.1:9100 +spring.boot.admin.client.url=http://192.168.110.2:19100 spring.boot.admin.client.username=ruoyi spring.boot.admin.client.password=123456 spring.boot.admin.client.instance.service-host-type=IP spring.boot.admin.client.instance.metadata.username=${spring.boot.admin.client.username} spring.boot.admin.client.instance.metadata.userpassword=${spring.boot.admin.client.password} - ### Metrics for prometheus management.endpoints.web.exposure.include=* - ### Metrics for elastic search management.metrics.export.elastic.enabled=false #management.metrics.export.elastic.host=http://localhost:9200 - ### Metrics for influx management.metrics.export.influx.enabled=false #management.metrics.export.influx.db=springboot @@ -97,32 +76,24 @@ management.metrics.export.influx.enabled=false #management.metrics.export.influx.auto-create-db=true #management.metrics.export.influx.consistency=one #management.metrics.export.influx.compressed=true - #*************** Access Control Related Configurations ***************# ### If enable spring security, this option is deprecated in 1.2.0: #spring.security.enabled=false - ### The ignore urls of auth, is deprecated in 1.2.0: nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** - ### The auth system to use, currently only 'nacos' and 'ldap' is supported: nacos.core.auth.system.type=nacos - ### If turn on auth system: nacos.core.auth.enabled=true - ### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay. nacos.core.auth.caching.enabled=true - ### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version. nacos.core.auth.enable.userAgentAuthWhite=false - ### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false. ### The two properties is the white list for auth and used by identity the request from other server. ### 此处为用户名密码 需要自行修改 nacos.core.auth.server.identity.key=ruoyi-vue-plus-key nacos.core.auth.server.identity.value=ruoyi-vue-plus-value - ### worked when nacos.core.auth.system.type=nacos ### The token expiration in seconds: nacos.core.auth.plugin.nacos.token.cache.enable=false @@ -131,7 +102,6 @@ nacos.core.auth.plugin.nacos.token.expire.seconds=18000 #nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789 ### 此处为token密钥 需要自行修改 nacos.core.auth.plugin.nacos.token.secret.key=rE7bYayhpvduYwCxuhckybEPDXyna6xwm5m7MZjtjrdXjVxAbXAMccXHyaJvB346 - ### worked when nacos.core.auth.system.type=ldap,{0} is Placeholder,replace login username #nacos.core.auth.ldap.url=ldap://localhost:389 #nacos.core.auth.ldap.basedc=dc=example,dc=org @@ -141,17 +111,13 @@ nacos.core.auth.plugin.nacos.token.secret.key=rE7bYayhpvduYwCxuhckybEPDXyna6xwm5 #nacos.core.auth.ldap.filter.prefix=uid #nacos.core.auth.ldap.case.sensitive=true #nacos.core.auth.ldap.ignore.partial.result.exception=false - #*************** Control Plugin Related Configurations ***************# # plugin type #nacos.plugin.control.manager.type=nacos - # local control rule storage dir, default ${nacos.home}/data/connection and ${nacos.home}/data/tps #nacos.plugin.control.rule.local.basedir=${nacos.home} - # external control rule storage type, if exist #nacos.plugin.control.rule.external.storage= - #*************** Config Change Plugin Related Configurations ***************# # webhook #nacos.core.config.plugin.webhook.enabled=false @@ -159,7 +125,6 @@ nacos.core.auth.plugin.nacos.token.secret.key=rE7bYayhpvduYwCxuhckybEPDXyna6xwm5 #nacos.core.config.plugin.webhook.url=http://localhost:8080/webhook/send?token=*** # The content push max capacity ,byte #nacos.core.config.plugin.webhook.contentMaxCapacity=102400 - # whitelist #nacos.core.config.plugin.whitelist.enabled=false # The import file suffixs @@ -169,22 +134,14 @@ nacos.core.auth.plugin.nacos.token.secret.key=rE7bYayhpvduYwCxuhckybEPDXyna6xwm5 #*************** Istio Related Configurations ***************# ### If turn on the MCP server: nacos.istio.mcp.server.enabled=false - - - ###*************** Add from 1.3.0 ***************### - - #*************** Core Related Configurations ***************# - ### set the WorkerID manually # nacos.core.snowflake.worker-id= - ### Member-MetaData # nacos.core.member.meta.site= # nacos.core.member.meta.adweight= # nacos.core.member.meta.weight= - ### MemberLookup ### Addressing pattern category, If set, the priority is highest # nacos.core.member.lookup.type=[file,address-server] @@ -199,9 +156,7 @@ nacos.istio.mcp.server.enabled=false # address.server.port=8080 ## Request address of [address-server] mode # address.server.url=/nacos/serverlist - #*************** JRaft Related Configurations ***************# - ### Sets the Raft cluster election timeout, default value is 5 second # nacos.core.protocol.raft.data.election_timeout_ms=5000 ### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute diff --git a/ruoyi-visual/ruoyi-seata-server/Dockerfile b/ruoyi-visual/ruoyi-seata-server/Dockerfile index 3e004a5..8082ccf 100644 --- a/ruoyi-visual/ruoyi-seata-server/Dockerfile +++ b/ruoyi-visual/ruoyi-seata-server/Dockerfile @@ -1,6 +1,6 @@ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ -FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds -#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds +#FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds +FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds #FROM findepi/graalvm:java17-native LABEL maintainer="Lion Li" @@ -13,7 +13,7 @@ WORKDIR /ruoyi/seata-server ENV TZ=PRC LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" SEATA_IP="" SEATA_PORT="" RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -EXPOSE 7091 +EXPOSE 17091 EXPOSE 8091 ADD ./target/ruoyi-seata-server.jar ./app.jar diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml b/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml index 190bf7a..b2ff5b2 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml +++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 7091 + port: 17091 spring: application: diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml b/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml index 06c7b14..7d30b27 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml +++ b/ruoyi-visual/ruoyi-seata-server/src/main/resources/logback-spring.xml @@ -19,7 +19,7 @@ - + diff --git a/script/config/nacos/application-common.yml b/script/config/nacos/application-common.yml index 39aa291..05a00a8 100644 --- a/script/config/nacos/application-common.yml +++ b/script/config/nacos/application-common.yml @@ -104,11 +104,11 @@ spring: # redis通用配置 子服务可以自行配置进行覆盖 data: redis: - host: localhost - port: 6379 + host: 192.168.110.2 + port: 9287 # redis 密码必须配置 - password: ruoyi123 - database: 0 + password: syar23rdsaagdrsa + database: 20 # 需要使用数字 timeout: 10000 ssl.enabled: false @@ -290,7 +290,7 @@ seata: # 多租户配置 tenant: # 是否开启 - enable: true + enable: false # 排除表 excludes: - sys_menu diff --git a/script/config/nacos/datasource.yml b/script/config/nacos/datasource.yml index bcf6b98..c20e8ec 100644 --- a/script/config/nacos/datasource.yml +++ b/script/config/nacos/datasource.yml @@ -2,21 +2,21 @@ datasource: system-master: # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能 - url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true - username: root - password: password + url: jdbc:mysql://192.168.110.2:13386/xny-cloud-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + username: xny-cloud-dev + password: madMPGz7KjJEJR3M gen: - url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true - username: root - password: password + url: jdbc:mysql://192.168.110.2:13386/xny-cloud-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + username: xny-cloud-dev + password: madMPGz7KjJEJR3M job: - url: jdbc:mysql://localhost:3306/ry-job?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true - username: root - password: password + url: jdbc:mysql://192.168.110.2:13386/xny-job-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true + username: xny-job-dev + password: aK2HmkXRL8yM7hXG workflow: - url: jdbc:mysql://localhost:3306/ry-workflow?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - username: root - password: password + url: jdbc:mysql://192.168.110.2:13386/xny-cloud-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + username: xny-cloud-dev + password: madMPGz7KjJEJR3M # system-oracle: # url: jdbc:oracle:thin:@//localhost:1521/XE # username: ROOT diff --git a/script/config/nacos/ruoyi-gen.yml b/script/config/nacos/ruoyi-gen.yml index f15a248..8a31c98 100644 --- a/script/config/nacos/ruoyi-gen.yml +++ b/script/config/nacos/ruoyi-gen.yml @@ -34,4 +34,4 @@ gen: # 自动去除表前缀,默认是false autoRemovePre: false # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) - tablePrefix: sys_ + tablePrefix: sys_,bus_ diff --git a/script/config/nacos/seata-server.properties b/script/config/nacos/seata-server.properties index 8ad7dad..bb89dfa 100644 --- a/script/config/nacos/seata-server.properties +++ b/script/config/nacos/seata-server.properties @@ -2,24 +2,21 @@ service.vgroupMapping.ruoyi-auth-group=default service.vgroupMapping.ruoyi-system-group=default service.vgroupMapping.ruoyi-resource-group=default service.vgroupMapping.ruoyi-workflow-group=default - service.enableDegrade=false service.disableGlobalTransaction=false - #Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional. store.mode=db store.lock.mode=db store.session.mode=db #Used for password encryption #store.publicKey= - #These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. store.db.datasource=hikari store.db.dbType=mysql store.db.driverClassName=com.mysql.cj.jdbc.Driver -store.db.url=jdbc:mysql://127.0.0.1:3306/ry-seata?useUnicode=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true -store.db.user=root -store.db.password=root +store.db.url=jdbc:mysql://192.168.110.2:13386/xny-seata-dev?useUnicode=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true +store.db.user=xny-seata-dev +store.db.password=iFePJ4rJrzHKAGbX store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table @@ -28,7 +25,6 @@ store.db.distributedLockTable=distributed_lock store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000 - # redis 模式 store.mode=redis 开启 (控制台查询功能有限,不影响实际执行功能) # store.redis.host=127.0.0.1 # store.redis.port=6379 @@ -39,7 +35,6 @@ store.db.maxWait=5000 # store.redis.database=0 # store.redis.password= # store.redis.queryLimit=100 - #Transaction rule configuration, only for the server server.recovery.committingRetryPeriod=1000 server.recovery.asynCommittingRetryPeriod=1000 @@ -52,7 +47,6 @@ server.distributedLockExpireTime=10000 server.xaerNotaRetryTimeout=60000 server.session.branchAsyncQueueSize=5000 server.session.enableBranchAsyncRemove=false - #Transaction rule configuration, only for the client client.rm.asyncCommitBufferLimit=10000 client.rm.lock.retryInterval=10 @@ -82,20 +76,16 @@ client.undo.logTable=undo_log client.undo.compress.enable=true client.undo.compress.type=zip client.undo.compress.threshold=64k - #For TCC transaction mode tcc.fence.logTableName=tcc_fence_log tcc.fence.cleanPeriod=1h - #Log rule configuration, for client and server log.exceptionRate=100 - #Metrics configuration, only for the server metrics.enabled=false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898 - #For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html #Transport configuration, for client and server transport.type=TCP diff --git a/script/docker/docker-compose.yml b/script/docker/docker-compose.yml index 399aac8..124841f 100644 --- a/script/docker/docker-compose.yml +++ b/script/docker/docker-compose.yml @@ -24,13 +24,13 @@ services: --explicit_defaults_for_timestamp=true --lower_case_table_names=1 privileged: true - network_mode: "host" + network_mode: "xny-cloud" nacos: image: ruoyi/ruoyi-nacos:2.4.1 container_name: nacos ports: - - "8848:8848" + - "18848:18848" - "9848:9848" - "9849:9849" environment: @@ -38,10 +38,10 @@ services: JAVA_OPTS: "-Xms256m -Xmx512m" volumes: # 日志目录 注意集群模式下 日志目录不能一致 需要区分例如 nacos1 nacos2 - - /docker/nacos/logs/:/root/nacos/logs + - /mnt/disk2/docker/nacos/logs/:/root/nacos/logs # 集群配置文件 集群所有nacos都必须使用此文件 - - /docker/nacos/conf/cluster.conf:/root/nacos/conf/cluster.conf - network_mode: "host" + - /mnt/disk2/docker/nacos/conf/cluster.conf:/root/nacos/conf/cluster.conf + network_mode: "xny-cloud" redis: image: redis:7.2.8 @@ -58,7 +58,7 @@ services: - /docker/redis/data/:/redis/data/ command: "redis-server /redis/config/redis.conf" privileged: true - network_mode: "host" + network_mode: "xny-cloud" minio: # minio 最后一个未阉割版本 不能再进行升级 在往上的版本功能被阉割 @@ -92,13 +92,13 @@ services: - /docker/minio/config:/root/.minio/ command: server --address ':9000' --console-address ':9001' /data # 指定容器中的目录 /data privileged: true - network_mode: "host" + network_mode: "xny-cloud" seata-server: image: ruoyi/ruoyi-seata-server:2.4.1 container_name: seata-server ports: - - "7091:7091" + - "17091:17091" - "8091:8091" environment: TZ: Asia/Shanghai @@ -110,7 +110,7 @@ services: # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" nginx-web: image: nginx:1.22.1 @@ -131,7 +131,7 @@ services: # 日志目录 - /docker/nginx/log:/var/log/nginx privileged: true - network_mode: "host" + network_mode: "xny-cloud" sentinel: image: ruoyi/ruoyi-sentinel-dashboard:2.4.1 @@ -146,7 +146,7 @@ services: # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent restart: always - network_mode: "host" + network_mode: "xny-cloud" ruoyi-monitor: image: ruoyi/ruoyi-monitor:2.4.1 @@ -155,14 +155,14 @@ services: # 时区上海 TZ: Asia/Shanghai ports: - - "9100:9100" + - "19100:19100" volumes: # 配置文件 - /docker/ruoyi-monitor/logs/:/ruoyi/monitor/logs # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-snailjob-server: image: ruoyi/ruoyi-snailjob-server:2.4.1 @@ -176,7 +176,7 @@ services: volumes: - /docker/snailjob/logs/:/ruoyi/snailjob/logs privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-gateway: image: ruoyi/ruoyi-gateway:2.4.1 @@ -185,14 +185,14 @@ services: # 时区上海 TZ: Asia/Shanghai ports: - - "8080:8080" + - "18899:18899" volumes: # 配置文件 - /docker/ruoyi-gateway/logs/:/ruoyi/gateway/logs # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-auth: image: ruoyi/ruoyi-auth:2.4.1 @@ -208,7 +208,7 @@ services: # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-system: image: ruoyi/ruoyi-system:2.4.1 @@ -217,14 +217,14 @@ services: # 时区上海 TZ: Asia/Shanghai ports: - - "9201:9201" + - "19201:19201" volumes: # 配置文件 - /docker/ruoyi-system/logs/:/ruoyi/system/logs # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-gen: image: ruoyi/ruoyi-gen:2.4.1 @@ -233,14 +233,14 @@ services: # 时区上海 TZ: Asia/Shanghai ports: - - "9202:9202" + - "19202:19202" volumes: # 配置文件 - /docker/ruoyi-gen/logs/:/ruoyi/gen/logs # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-job: image: ruoyi/ruoyi-job:2.4.1 @@ -258,7 +258,7 @@ services: # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-resource: image: ruoyi/ruoyi-resource:2.4.1 @@ -267,14 +267,14 @@ services: # 时区上海 TZ: Asia/Shanghai ports: - - "9204:9204" + - "19204:19204" volumes: # 配置文件 - /docker/ruoyi-resource/logs/:/ruoyi/resource/logs # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" ruoyi-workflow: image: ruoyi/ruoyi-workflow:2.4.1 @@ -283,19 +283,19 @@ services: # 时区上海 TZ: Asia/Shanghai ports: - - "9205:9205" + - "19205:19205" volumes: # 配置文件 - /docker/ruoyi-workflow/logs/:/ruoyi/workflow/logs # skywalking 探针 - /docker/skywalking/agent/:/ruoyi/skywalking/agent privileged: true - network_mode: "host" + network_mode: "xny-cloud" -################################################################################################# -#################################### 以下为扩展根据需求搭建 ######################################### -################################################################################################# + ################################################################################################# + #################################### 以下为扩展根据需求搭建 ######################################### + ################################################################################################# elasticsearch: image: elasticsearch:7.17.6 @@ -313,7 +313,7 @@ services: - /docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins - /docker/elk/elasticsearch/data:/usr/share/elasticsearch/data - /docker/elk/elasticsearch/logs:/usr/share/elasticsearch/logs - network_mode: "host" + network_mode: "xny-cloud" kibana: image: kibana:7.17.6 @@ -330,7 +330,7 @@ services: # SERVER_PUBLICBASEURL: https://kibana.cloud.com volumes: - /docker/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml - network_mode: "host" + network_mode: "xny-cloud" logstash: image: logstash:7.17.6 @@ -342,7 +342,7 @@ services: - /docker/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml depends_on: - elasticsearch - network_mode: "host" + network_mode: "xny-cloud" rmqnamesrv: image: apache/rocketmq:5.2.0 @@ -354,7 +354,7 @@ services: command: sh mqnamesrv volumes: - /docker/rocketmq/namesrv/logs:/home/rocketmq/logs/rocketmqlogs - network_mode: "host" + network_mode: "xny-cloud" rmqbroker1: image: apache/rocketmq:5.2.0 @@ -375,7 +375,7 @@ services: - /docker/rocketmq/broker1/logs:/home/rocketmq/logs/rocketmqlogs - /docker/rocketmq/broker1/store:/home/rocketmq/store privileged: true - network_mode: "host" + network_mode: "xny-cloud" rmqconsole: image: apacherocketmq/rocketmq-dashboard:latest @@ -386,7 +386,7 @@ services: JAVA_OPTS: -Dserver.port=19876 -Drocketmq.namesrv.addr=127.0.0.1:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false depends_on: - rmqnamesrv - network_mode: "host" + network_mode: "xny-cloud" rabbitmq: container_name: rabbitmq @@ -401,7 +401,7 @@ services: volumes: - /docker/rabbitmq/log:/var/log/rabbitmq - /docker/rabbitmq/data:/var/lib/rabbitmq - network_mode: "host" + network_mode: "xny-cloud" zookeeper: image: 'bitnami/zookeeper:3.8.0' @@ -417,7 +417,7 @@ services: ZOO_ENABLE_ADMIN_SERVER: "no" # 自带控制台的端口 ZOO_ADMIN_SERVER_PORT_NUMBER: 8080 - network_mode: "host" + network_mode: "xny-cloud" kafka: image: 'bitnami/kafka:3.6.2' @@ -438,7 +438,7 @@ services: - /docker/kafka/data:/bitnami/kafka/data depends_on: - zookeeper - network_mode: "host" + network_mode: "xny-cloud" kafka-manager: image: sheepkiller/kafka-manager:latest @@ -453,7 +453,7 @@ services: KM_ARGS: -Dhttp.port=19092 depends_on: - kafka - network_mode: "host" + network_mode: "xny-cloud" sky-oap: image: apache/skywalking-oap-server:9.7.0 @@ -470,7 +470,7 @@ services: SW_STORAGE: elasticsearch SW_STORAGE_ES_CLUSTER_NODES: 127.0.0.1:9200 TZ: Asia/Shanghai - network_mode: "host" + network_mode: "xny-cloud" sky-ui: image: apache/skywalking-ui:9.7.0 @@ -483,7 +483,7 @@ services: TZ: Asia/Shanghai depends_on: - sky-oap - network_mode: "host" + network_mode: "xny-cloud" prometheus: image: prom/prometheus:v2.40.1 @@ -492,7 +492,7 @@ services: - "9090:9090" volumes: - /docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - network_mode: "host" + network_mode: "xny-cloud" grafana: image: grafana/grafana:9.2.4 @@ -508,7 +508,7 @@ services: volumes: - /docker/grafana/grafana.ini:/etc/grafana/grafana.ini - /docker/grafana:/var/lib/grafana - network_mode: "host" + network_mode: "xny-cloud" shardingproxy: image: apache/shardingsphere-proxy:5.4.0 @@ -521,4 +521,4 @@ services: - /docker/shardingproxy/ext-lib:/opt/shardingsphere-proxy/ext-lib environment: - JVM_OPTS="-Djava.awt.headless=true" - network_mode: "host" + network_mode: "xny-cloud" diff --git a/script/docker/prometheus/prometheus.yml b/script/docker/prometheus/prometheus.yml index f42001f..f8cae0a 100644 --- a/script/docker/prometheus/prometheus.yml +++ b/script/docker/prometheus/prometheus.yml @@ -47,7 +47,7 @@ scrape_configs: username: ruoyi password: 123456 http_sd_configs: - - url: 'http://127.0.0.1:9100/actuator/prometheus/sd' + - url: 'http://192.168.110.2:19100/actuator/prometheus/sd' # monitor 监控的账号密码 basic_auth: username: ruoyi