修改权限逻辑

This commit is contained in:
lcj
2025-09-15 10:57:19 +08:00
parent 1bc2743dc7
commit 70537f34c4
137 changed files with 5988 additions and 426 deletions

View File

@ -71,7 +71,7 @@
<properties> <properties>
<!-- 环境标识,需要与配置文件的名称相对应 --> <!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active> <profiles.active>dev</profiles.active>
<nacos.server>127.0.0.1:8848</nacos.server> <nacos.server>192.168.110.209:18848</nacos.server>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group> <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
<nacos.config.group>DEFAULT_GROUP</nacos.config.group> <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
<nacos.username>nacos</nacos.username> <nacos.username>nacos</nacos.username>
@ -87,7 +87,7 @@
<id>prod</id> <id>prod</id>
<properties> <properties>
<profiles.active>prod</profiles.active> <profiles.active>prod</profiles.active>
<nacos.server>127.0.0.1:8848</nacos.server> <nacos.server>192.168.110.2:18848</nacos.server>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group> <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
<nacos.config.group>DEFAULT_GROUP</nacos.config.group> <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
<nacos.username>nacos</nacos.username> <nacos.username>nacos</nacos.username>

View File

@ -1,6 +1,9 @@
package org.dromara.system.api; 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;
/** /**
* 用户权限处理 * 用户权限处理
@ -15,7 +18,7 @@ public interface RemotePermissionService {
* @param userId 用户id * @param userId 用户id
* @return 角色权限信息 * @return 角色权限信息
*/ */
Set<String> getRolePermission(Long userId); List<SysProjectRolePermissionVo> getRolePermission(Long userId);
/** /**
* 获取菜单数据权限 * 获取菜单数据权限
@ -23,6 +26,6 @@ public interface RemotePermissionService {
* @param userId 用户id * @param userId 用户id
* @return 菜单权限信息 * @return 菜单权限信息
*/ */
Set<String> getMenuPermission(Long userId); List<SysProjectRoleMenuVo> getMenuPermission(Long userId);
} }

View File

@ -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);
}

View File

@ -2,11 +2,12 @@ package org.dromara.system.api.model;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; 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.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 用户信息 * 用户信息
@ -35,6 +36,11 @@ public class LoginUser implements Serializable {
*/ */
private Long deptId; private Long deptId;
/**
* 项目ID
*/
private Long projectId;
/** /**
* 部门类别编码 * 部门类别编码
*/ */
@ -88,12 +94,12 @@ public class LoginUser implements Serializable {
/** /**
* 菜单权限 * 菜单权限
*/ */
private Set<String> menuPermission; private List<SysProjectRoleMenuVo> menuPermission;
/** /**
* 角色权限 * 角色权限
*/ */
private Set<String> rolePermission; private List<SysProjectRolePermissionVo> rolePermission;
/** /**
* 用户名 * 用户名

View File

@ -45,7 +45,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/** /**
* token 控制 * token 控制
@ -99,11 +98,6 @@ public class TokenController {
sysLoginService.checkTenant(loginBody.getTenantId()); sysLoginService.checkTenant(loginBody.getTenantId());
// 登录 // 登录
LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType); 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); return R.ok(loginVo);
} }

View File

@ -137,7 +137,12 @@ public class SysLoginService {
String password = registerBody.getPassword(); String password = registerBody.getPassword();
// 校验用户类型是否存在 // 校验用户类型是否存在
String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); 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("注册失败密码需满足818位包含大小写字母、数字、特殊字符中的至少三种组合");
}
boolean captchaEnabled = captchaProperties.getEnabled(); boolean captchaEnabled = captchaProperties.getEnabled();
// 验证码开关 // 验证码开关
if (captchaEnabled) { if (captchaEnabled) {

View File

@ -1,8 +1,8 @@
package org.dromara.auth.service.impl; package org.dromara.auth.service.impl;
import cn.hutool.crypto.digest.BCrypt;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter; import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.crypto.digest.BCrypt;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; 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.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.api.RemoteProjectService;
import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteClientVo; import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
@ -45,6 +46,9 @@ public class PasswordAuthStrategy implements IAuthStrategy {
@DubboReference @DubboReference
private RemoteUserService remoteUserService; private RemoteUserService remoteUserService;
@DubboReference
private RemoteProjectService remoteProjectService;
@Override @Override
public LoginVo login(String body, RemoteClientVo client) { public LoginVo login(String body, RemoteClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);

View File

@ -1,6 +1,6 @@
# Tomcat # Tomcat
server: server:
port: 9210 port: 19210
# Spring # Spring
spring: spring:

View File

@ -86,4 +86,9 @@ public interface CacheNames {
*/ */
String ONLINE_TOKEN = "online_tokens"; String ONLINE_TOKEN = "online_tokens";
/**
* 项目名称
*/
String PROJECT_NAME = "project_name#30d";
} }

View File

@ -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<String> projectPermissions;
}

View File

@ -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<String> projectRoles;
}

View File

@ -1,6 +1,9 @@
package org.dromara.common.core.service; 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;
/** /**
* 用户权限处理 * 用户权限处理
@ -15,7 +18,7 @@ public interface PermissionService {
* @param userId 用户id * @param userId 用户id
* @return 角色权限信息 * @return 角色权限信息
*/ */
Set<String> getRolePermission(Long userId); List<SysProjectRolePermissionVo> getRolePermission(Long userId);
/** /**
* 获取菜单数据权限 * 获取菜单数据权限
@ -23,6 +26,6 @@ public interface PermissionService {
* @param userId 用户id * @param userId 用户id
* @return 菜单权限信息 * @return 菜单权限信息
*/ */
Set<String> getMenuPermission(Long userId); List<SysProjectRoleMenuVo> getMenuPermission(Long userId);
} }

View File

@ -1,7 +1,10 @@
package org.dromara.common.satoken.core.service; package org.dromara.common.satoken.core.service;
import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpInterface;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; 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.enums.UserType;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.PermissionService; 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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* sa-token 权限管理实现类 * sa-token 权限管理实现类
@ -30,17 +36,21 @@ public class SaPermissionImpl implements StpInterface {
PermissionService permissionService = getPermissionService(); PermissionService permissionService = getPermissionService();
if (ObjectUtil.isNotNull(permissionService)) { if (ObjectUtil.isNotNull(permissionService)) {
List<String> list = StringUtils.splitList(loginId.toString(), ":"); List<String> 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 { } else {
throw new ServiceException("PermissionService 实现类不存在"); throw new ServiceException("PermissionService 实现类不存在");
} }
} }
UserType userType = UserType.getUserType(loginUser.getUserType()); UserType userType = UserType.getUserType(loginUser.getUserType());
if (userType == UserType.APP_USER) { // 系统用户
if (userType == UserType.SYS_USER) {
Long projectId = loginUser.getProjectId();
List<SysProjectRoleMenuVo> menuPermission = loginUser.getMenuPermission();
return getPermissionListByProjectId(menuPermission, projectId);
} else if (userType == UserType.APP_USER) {
// 其他端 自行根据业务编写 // 其他端 自行根据业务编写
} }
// SYS_USER 默认返回权限 return new ArrayList<>();
return new ArrayList<>(loginUser.getMenuPermission());
} }
/** /**
@ -53,17 +63,21 @@ public class SaPermissionImpl implements StpInterface {
PermissionService permissionService = getPermissionService(); PermissionService permissionService = getPermissionService();
if (ObjectUtil.isNotNull(permissionService)) { if (ObjectUtil.isNotNull(permissionService)) {
List<String> list = StringUtils.splitList(loginId.toString(), ":"); List<String> 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 { } else {
throw new ServiceException("PermissionService 实现类不存在"); throw new ServiceException("PermissionService 实现类不存在");
} }
} }
UserType userType = UserType.getUserType(loginUser.getUserType()); UserType userType = UserType.getUserType(loginUser.getUserType());
if (userType == UserType.APP_USER) { // 系统用户
if (userType == UserType.SYS_USER) {
Long projectId = loginUser.getProjectId();
List<SysProjectRolePermissionVo> rolePermission = loginUser.getRolePermission();
return getRoleListByProjectId(rolePermission, projectId);
} else if (userType == UserType.APP_USER) {
// 其他端 自行根据业务编写 // 其他端 自行根据业务编写
} }
// SYS_USER 默认返回权限 return new ArrayList<>();
return new ArrayList<>(loginUser.getRolePermission());
} }
private PermissionService getPermissionService() { private PermissionService getPermissionService() {
@ -74,4 +88,60 @@ public class SaPermissionImpl implements StpInterface {
} }
} }
/**
* 获取菜单权限列表
*
* @param menuPermission 菜单权限
* @param projectId 当前用户所在项目id
* @return 菜单权限列表
*/
private List<String> getPermissionListByProjectId(List<SysProjectRoleMenuVo> menuPermission, Long projectId) {
if (CollUtil.isNotEmpty(menuPermission)) {
if (projectId != null) {
Map<Long, List<SysProjectRoleMenuVo>> 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<Set<String>> 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<String> getRoleListByProjectId(List<SysProjectRolePermissionVo> rolePermission, Long projectId) {
if (CollUtil.isNotEmpty(rolePermission)) {
if (projectId != null) {
Map<Long, List<SysProjectRolePermissionVo>> 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<Set<String>> list = rolePermission.stream().map(SysProjectRolePermissionVo::getProjectRoles).toList();
return list.stream().flatMap(Set::stream).filter(s -> !s.isEmpty()).distinct().toList();
} else {
return new ArrayList<>();
}
}
} }

View File

@ -10,9 +10,11 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants; 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.common.core.enums.UserType;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@ -38,6 +40,7 @@ public class LoginHelper {
public static final String DEPT_NAME_KEY = "deptName"; public static final String DEPT_NAME_KEY = "deptName";
public static final String DEPT_CATEGORY_KEY = "deptCategory"; public static final String DEPT_CATEGORY_KEY = "deptCategory";
public static final String CLIENT_KEY = "clientid"; 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_KEY, loginUser.getDeptId())
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName()) .setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory()) .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
.setExtra(PROJECT_KEY, loginUser.getProjectId())
); );
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
} }
@ -132,6 +136,13 @@ public class LoginHelper {
return Convert.toStr(getExtra(DEPT_CATEGORY_KEY)); return Convert.toStr(getExtra(DEPT_CATEGORY_KEY));
} }
/**
* 获取项目ID
*/
public static Long getProjectId() {
return Convert.toLong(getExtra(PROJECT_KEY));
}
/** /**
* 获取当前 Token 的扩展信息 * 获取当前 Token 的扩展信息
* *
@ -197,7 +208,8 @@ public class LoginHelper {
if (loginUser == null) { if (loginUser == null) {
return false; return false;
} }
return Convert.toBool(isTenantAdmin(loginUser.getRolePermission())); List<SysProjectRolePermissionVo> rolePermission = loginUser.getRolePermission();
return Convert.toBool(isTenantAdmin(rolePermission.getFirst().getProjectRoles()));
} }
/** /**

View File

@ -1,11 +1,13 @@
package org.dromara.common.core.service.impl; package org.dromara.common.core.service.impl;
import org.apache.dubbo.config.annotation.DubboReference; 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.common.core.service.PermissionService;
import org.dromara.system.api.RemotePermissionService; import org.dromara.system.api.RemotePermissionService;
import org.springframework.stereotype.Service; 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; private RemotePermissionService remotePermissionService;
@Override @Override
public Set<String> getRolePermission(Long userId) { public List<SysProjectRolePermissionVo> getRolePermission(Long userId) {
return remotePermissionService.getRolePermission(userId); return remotePermissionService.getRolePermission(userId);
} }
@Override @Override
public Set<String> getMenuPermission(Long userId) { public List<SysProjectRoleMenuVo> getMenuPermission(Long userId) {
return remotePermissionService.getMenuPermission(userId); return remotePermissionService.getMenuPermission(userId);
} }

View File

@ -33,4 +33,9 @@ public interface TransConstant {
*/ */
String OSS_ID_TO_URL = "oss_id_to_url"; String OSS_ID_TO_URL = "oss_id_to_url";
/**
* 项目id转名称
*/
String PROJECT_ID_TO_NAME = "project_id_to_name";
} }

View File

@ -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<String> {
@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;
}
}

View File

@ -4,3 +4,4 @@ org.dromara.common.translation.core.impl.DictTypeTranslationImpl
org.dromara.common.translation.core.impl.OssUrlTranslationImpl org.dromara.common.translation.core.impl.OssUrlTranslationImpl
org.dromara.common.translation.core.impl.UserNameTranslationImpl org.dromara.common.translation.core.impl.UserNameTranslationImpl
org.dromara.common.translation.core.impl.NicknameTranslationImpl org.dromara.common.translation.core.impl.NicknameTranslationImpl
org.dromara.common.translation.core.impl.ProjectNameTranslationImpl

View File

@ -1,6 +1,6 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds #FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds
#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds
#FROM findepi/graalvm:java17-native #FROM findepi/graalvm:java17-native
LABEL maintainer="Lion Li" LABEL maintainer="Lion Li"
@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/gateway/logs \
WORKDIR /ruoyi/gateway 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} EXPOSE ${SERVER_PORT}

View File

@ -1,6 +1,6 @@
# Tomcat # Tomcat
server: server:
port: 8080 port: 18899
servlet: servlet:
context-path: / context-path: /

View File

@ -1,6 +1,6 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds #FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds
#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds
#FROM findepi/graalvm:java17-native #FROM findepi/graalvm:java17-native
LABEL maintainer="Lion Li" LABEL maintainer="Lion Li"
@ -9,7 +9,7 @@ RUN mkdir -p /ruoyi/gen/logs
WORKDIR /ruoyi/gen 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} EXPOSE ${SERVER_PORT}

View File

@ -1,6 +1,6 @@
# Tomcat # Tomcat
server: server:
port: 9202 port: 19202
# Spring # Spring
spring: spring:

View File

@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/resource/logs \
WORKDIR /ruoyi/resource 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} EXPOSE ${SERVER_PORT}

View File

@ -1,6 +1,6 @@
# Tomcat # Tomcat
server: server:
port: 9204 port: 19204
# Spring # Spring
spring: spring:

View File

@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/system/logs \
WORKDIR /ruoyi/system 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} EXPOSE ${SERVER_PORT}

View File

@ -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;
}

View File

@ -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<Void> changeUserProject(@NotNull(message = "项目id不能为空")
@PathVariable Long id) {
return toAjax(projectService.changeUserProject(id));
}
/**
* 查询项目列表
*/
@SaCheckPermission("project:project:list")
@GetMapping("/list")
public TableDataInfo<BusProjectVo> list(BusProjectQueryReq req, PageQuery pageQuery) {
return projectService.queryPageList(req, pageQuery);
}
/**
* 查询项目下的子项目列表
*/
@SaCheckPermission("project:project:listSub")
@GetMapping("/list/sub/{id}")
public R<List<BusSubProjectVo>> 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<BusProjectVo> list = projectService.queryList(req);
ExcelUtil.exportExcel(list, "项目", BusProjectVo.class, response);
}
/**
* 获取项目详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:project:query")
@GetMapping("/{id}")
public R<BusProjectVo> 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<Long> 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<Long> 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<Void> 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<Void> uploadTenderFile(@RequestBody BusProjectSaveTenderFileReq req) {
return toAjax(projectService.saveTenderFile(req));
}
/**
* 删除项目
*
* @param ids 主键串
*/
@SaCheckPermission("project:project:remove")
@Log(title = "项目", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(projectService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 查询项目安全天数
*/
@GetMapping("/safetyDay/{id}")
public R<BusProjectSafetyDayVo> getSafetyDay(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(projectService.getSafetyDay(id));
}
}

View File

@ -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<BusProjectFileVo> list(BusProjectFileQueryReq req, PageQuery pageQuery) {
return busProjectFileService.queryPageList(req, pageQuery);
}
/**
* 获取项目文件存储详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectFile:query")
@GetMapping("/{id}")
public R<BusProjectFileVo> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectFileService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -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<BusProjectNewsVo> 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<BusProjectNewsVo> list = busProjectNewsService.queryList(req);
ExcelUtil.exportExcel(list, "项目新闻", BusProjectNewsVo.class, response);
}
/**
* 查询大屏项目新闻列表
*/
@GetMapping("/list/gis")
public R<List<BusProjectNewsGisVo>> listGis(BusProjectNewsGisReq req) {
return R.ok(busProjectNewsService.queryGisList(req));
}
/**
* 获取项目新闻详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectNews:query")
@GetMapping("/{id}")
public R<BusProjectNewsVo> 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<Long> add(@Validated @RequestBody BusProjectNewsCreateReq req) {
return R.ok(busProjectNewsService.insertByBo(req));
}
/**
* 修改项目新闻
*/
@SaCheckPermission("project:projectNews:edit")
@Log(title = "项目新闻", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectNewsService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -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<BusProjectPunchrangeVo> 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<BusProjectPunchrangeVo> list = busProjectPunchrangeService.queryList(bo);
ExcelUtil.exportExcel(list, "项目打卡范围", BusProjectPunchrangeVo.class, response);
}
/**
* 获取项目打卡范围详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectPunchrange:query")
@GetMapping("/{id}")
public R<BusProjectPunchrangeVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectPunchrangeService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -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<BusUserProjectRelevancyVo> list(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) {
return userProjectRelevancyService.queryPageList(req, pageQuery);
}
/**
* 查询登录用户与项目关联列表
*/
@GetMapping("/login/list")
public R<List<BusLoginUserProjectRelevancyVo>> listByLoginUser() {
Long userId = LoginHelper.getUserId();
return R.ok(userProjectRelevancyService.queryListByUserId(userId));
}
/**
* 查询登录用户与项目关联分页
*/
@GetMapping("/login/page")
public TableDataInfo<BusUserProjectRelevancyVo> 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<BusUserProjectRelevancyVo> list = userProjectRelevancyService.queryList(req);
ExcelUtil.exportExcel(list, "系统用户与项目关联", BusUserProjectRelevancyVo.class, response);
}
/**
* 获取用户与项目关联详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectRelevancy:query")
@GetMapping("/{id}")
public R<BusUserProjectRelevancyVo> 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<Long> 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<Boolean> 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<Boolean> removeBatchByProjectList(@RequestBody BusProjectBatchByProjectListReq req) {
Long userId = req.getUserId();
List<Long> projectIdList = req.getProjectIdList();
QueryWrapper<BusUserProjectRelevancy> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", userId).in("project_id", projectIdList);
boolean result = userProjectRelevancyService.remove(wrapper);
/* List<UserProjectRelevancy> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(userProjectRelevancyService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -2,6 +2,7 @@ package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.tree.Tree;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
@ -56,6 +57,15 @@ public class SysDeptController extends BaseController {
return R.ok(depts); return R.ok(depts);
} }
/**
* 根据项目id获取部门树以及岗位列表
*/
@GetMapping("/list/tree")
public R<List<Tree<Long>>> listTreeByProjectId() {
List<Tree<Long>> tree = deptService.buildDeptTree();
return R.ok(tree);
}
/** /**
* 根据部门编号获取详细信息 * 根据部门编号获取详细信息
* *

View File

@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.constant.TenantConstants;
@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 菜单信息 * 菜单信息
@ -42,9 +44,15 @@ public class SysMenuController extends BaseController {
* *
* @return 路由信息 * @return 路由信息
*/ */
@GetMapping("/getRouters") @GetMapping("/getRouters/{projectId}")
public R<List<RouterVo>> getRouters() { public R<List<RouterVo>> getRouters(@NotNull(message = "项目主键不能为空")
List<SysMenu> menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); @PathVariable Long projectId, String menuSource) {
List<SysMenu> 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)); return R.ok(menuService.buildMenus(menus));
} }
@ -94,7 +102,9 @@ public class SysMenuController extends BaseController {
*/ */
@SaCheckPermission("system:menu:query") @SaCheckPermission("system:menu:query")
@GetMapping(value = "/roleMenuTreeselect/{roleId}") @GetMapping(value = "/roleMenuTreeselect/{roleId}")
public R<MenuTreeSelectVo> roleMenuTreeselect(@PathVariable("roleId") Long roleId) { public R<MenuTreeSelectVo> roleMenuTreeselect(@PathVariable("roleId") Long roleId, String menuSource) {
SysMenuBo sysMenuBo = new SysMenuBo();
sysMenuBo.setMenuSource(menuSource);
List<SysMenuVo> menus = menuService.selectMenuList(LoginHelper.getUserId()); List<SysMenuVo> menus = menuService.selectMenuList(LoginHelper.getUserId());
MenuTreeSelectVo selectVo = new MenuTreeSelectVo( MenuTreeSelectVo selectVo = new MenuTreeSelectVo(
menuService.selectMenuListByRoleId(roleId), menuService.selectMenuListByRoleId(roleId),

View File

@ -15,6 +15,7 @@ import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysRoleBo; import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.bo.SysUserBo; 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.SysRoleVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysDeptService;
@ -49,6 +50,15 @@ public class SysRoleController extends BaseController {
return roleService.selectPageRoleList(role, pageQuery); return roleService.selectPageRoleList(role, pageQuery);
} }
/**
* 获取角色信息列表(不分页)
*/
@SaCheckPermission("system:role:list")
@GetMapping("/listNoPage")
public R<List<SysRoleVo>> listNoPage(SysRoleBo role) {
return R.ok(roleService.selectRoleList(role));
}
/** /**
* 导出角色信息列表 * 导出角色信息列表
*/ */
@ -85,6 +95,17 @@ public class SysRoleController extends BaseController {
} else if (!roleService.checkRoleKeyUnique(role)) { } else if (!roleService.checkRoleKeyUnique(role)) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); 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)); return toAjax(roleService.insertRole(role));
} }
@ -103,7 +124,17 @@ public class SysRoleController extends BaseController {
} else if (!roleService.checkRoleKeyUnique(role)) { } else if (!roleService.checkRoleKeyUnique(role)) {
return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); 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) { if (roleService.updateRole(role) > 0) {
roleService.cleanOnlineUserByRole(role.getRoleId()); roleService.cleanOnlineUserByRole(role.getRoleId());
return R.ok(); return R.ok();

View File

@ -1,14 +1,13 @@
package org.dromara.system.controller.system; package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.crypto.digest.BCrypt;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.BCrypt;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils; 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.api.model.LoginUser;
import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysPostBo; 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.bo.SysUserBo;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import org.dromara.system.domain.vo.*; import org.dromara.system.domain.vo.*;
import org.dromara.system.listener.SysUserImportListener; import org.dromara.system.listener.SysUserImportListener;
import org.dromara.system.service.*; import org.dromara.system.service.*;
@ -134,7 +133,7 @@ public class SysUserController extends BaseController {
userService.checkUserDataScope(userId); userService.checkUserDataScope(userId);
SysUserVo sysUser = userService.selectUserById(userId); SysUserVo sysUser = userService.selectUserById(userId);
userInfoVo.setUser(sysUser); userInfoVo.setUser(sysUser);
userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); // userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId));
Long deptId = sysUser.getDeptId(); Long deptId = sysUser.getDeptId();
if (ObjectUtil.isNotNull(deptId)) { if (ObjectUtil.isNotNull(deptId)) {
SysPostBo postBo = new SysPostBo(); SysPostBo postBo = new SysPostBo();
@ -142,11 +141,12 @@ public class SysUserController extends BaseController {
userInfoVo.setPosts(postService.selectPostList(postBo)); userInfoVo.setPosts(postService.selectPostList(postBo));
userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); userInfoVo.setPostIds(postService.selectPostListByUserId(userId));
} }
userInfoVo.setProjectRoles(roleService.selectRoleProjectList(userId));
} }
SysRoleBo roleBo = new SysRoleBo(); /* SysRoleBo roleBo = new SysRoleBo();
roleBo.setStatus(SystemConstants.NORMAL); roleBo.setStatus(SystemConstants.NORMAL);
List<SysRoleVo> roles = roleService.selectRoleList(roleBo); List<SysRoleVo> 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); return R.ok(userInfoVo);
} }
@ -158,8 +158,17 @@ public class SysUserController extends BaseController {
@PostMapping @PostMapping
public R<Void> add(@Validated @RequestBody SysUserBo user) { public R<Void> add(@Validated @RequestBody SysUserBo user) {
deptService.checkDeptDataScope(user.getDeptId()); deptService.checkDeptDataScope(user.getDeptId());
// 去重后的所有 roleId
List<Long> 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)) { if (!userService.checkUserNameUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); 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)) { } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
@ -184,8 +193,17 @@ public class SysUserController extends BaseController {
userService.checkUserAllowed(user.getUserId()); userService.checkUserAllowed(user.getUserId());
userService.checkUserDataScope(user.getUserId()); userService.checkUserDataScope(user.getUserId());
deptService.checkDeptDataScope(user.getDeptId()); deptService.checkDeptDataScope(user.getDeptId());
// 去重后的所有 roleId
List<Long> 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)) { if (!userService.checkUserNameUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); 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)) { } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
@ -269,14 +287,14 @@ public class SysUserController extends BaseController {
* 用户授权角色 * 用户授权角色
* *
* @param userId 用户Id * @param userId 用户Id
* @param roleIds 角色ID串 * @param projectRoles 项目、角色关联列表
*/ */
@SaCheckPermission("system:user:edit") @SaCheckPermission("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.GRANT) @Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole") @PutMapping("/authRole")
public R<Void> insertAuthRole(Long userId, Long[] roleIds) { public R<Void> insertAuthRole(Long userId, List<SysRoleProjectDto> projectRoles) {
userService.checkUserDataScope(userId); userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds); userService.insertUserAuth(userId, projectRoles);
return R.ok(); return R.ok();
} }

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -106,6 +106,11 @@ public class SysMenu extends BaseEntity {
@TableField(exist = false) @TableField(exist = false)
private String parentName; private String parentName;
/**
* 菜单类型(menu_source) 1-web2-app
*/
private String menuSource;
/** /**
* 子菜单 * 子菜单
*/ */

View File

@ -26,6 +26,11 @@ public class SysRole extends TenantEntity {
@TableId(value = "role_id") @TableId(value = "role_id")
private Long roleId; private Long roleId;
/**
* 部门ID
*/
private Long deptId;
/** /**
* 角色名称 * 角色名称
*/ */

View File

@ -26,4 +26,9 @@ public class SysUserRole {
*/ */
private Long roleId; private Long roleId;
/**
* 项目ID
*/
private Long projectId;
} }

View File

@ -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;
}

View File

@ -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;
}

View File

@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysDept;
import java.util.List;
/** /**
* 部门业务对象 sys_dept * 部门业务对象 sys_dept
* *
@ -33,16 +35,6 @@ public class SysDeptBo extends BaseEntity {
*/ */
private Long projectId; private Long projectId;
/**
* 项目部门项目id
*/
private Long rowProjectId;
/**
* 分包公司ID
*/
private Long contractorId;
/** /**
* 部门名称 * 部门名称
*/ */
@ -96,9 +88,8 @@ public class SysDeptBo extends BaseEntity {
*/ */
@NotBlank(message = "部门类型不能为空") @NotBlank(message = "部门类型不能为空")
private String deptType; private String deptType;
// /**
// * 归属部门id部门树 private List<String> deptTypes;
// */
// private Long belongDeptId;
} }

View File

@ -107,5 +107,10 @@ public class SysMenuBo extends BaseEntity {
*/ */
private String remark; private String remark;
/**
* 菜单类型(menu_source) 1-web2-app
*/
private String menuSource;
} }

View File

@ -28,6 +28,16 @@ public class SysRoleBo extends BaseEntity {
*/ */
private Long roleId; private Long roleId;
/**
* 部门ID
*/
private Long deptId;
/**
* 角色类型 1-web 2-app
*/
private String roleSource;
/** /**
* 角色名称 * 角色名称
*/ */

View File

@ -11,6 +11,9 @@ import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.xss.Xss; import org.dromara.common.core.xss.Xss;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import java.util.List;
/** /**
* 用户信息业务对象 sys_user * 用户信息业务对象 sys_user
@ -98,6 +101,11 @@ public class SysUserBo extends BaseEntity {
*/ */
private Long[] postIds; private Long[] postIds;
/**
* 项目角色关联
*/
private List<SysRoleProjectDto> projectRoles;
/** /**
* 数据权限 当前角色ID * 数据权限 当前角色ID
*/ */

View File

@ -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<Long> projectIdList;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<Punchrange> punchrangeList;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<Long> roleIds;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -6,8 +6,6 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert; 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 org.dromara.system.domain.SysDept;
import java.io.Serial; import java.io.Serial;
@ -50,26 +48,6 @@ public class SysDeptVo implements Serializable {
*/ */
private SysDeptVo parent; private SysDeptVo parent;
/**
* 项目id
*/
private Long projectId;
/**
* 分包公司ID
*/
private Long contractorId;
/**
* 未绑定项目信息
*/
// private List<BusProjectVo> projectList;
//
// /**
// * 未绑定分包信息
// */
// private List<SubContractorVo> contractorList;
/** /**
* 祖级列表 * 祖级列表
*/ */
@ -135,9 +113,9 @@ public class SysDeptVo implements Serializable {
@ExcelProperty(value = "创建时间") @ExcelProperty(value = "创建时间")
private Date createTime; private Date createTime;
// /** /**
// * 子菜单 * 子菜单
// */ */
// private List<SysDept> children = new ArrayList<>(); private List<SysDept> children = new ArrayList<>();
} }

View File

@ -108,6 +108,11 @@ public class SysMenuVo implements Serializable {
*/ */
private Date createTime; private Date createTime;
/**
* 菜单类型(menu_source) 1-web2-app
*/
private String menuSource;
/** /**
* 子菜单 * 子菜单
*/ */

View File

@ -38,18 +38,34 @@ public class SysRoleVo implements Serializable {
@ExcelProperty(value = "角色名称") @ExcelProperty(value = "角色名称")
private String roleName; private String roleName;
/**
* 项目ID
*/
private Long projectId;
/** /**
* 角色权限字符串 * 角色权限字符串
*/ */
@ExcelProperty(value = "角色权限") @ExcelProperty(value = "角色权限")
private String roleKey; private String roleKey;
/**
* 部门ID
*/
@ExcelProperty(value = "部门")
private Long deptId;
/** /**
* 显示顺序 * 显示顺序
*/ */
@ExcelProperty(value = "角色排序") @ExcelProperty(value = "角色排序")
private Integer roleSort; private Integer roleSort;
/**
* 角色类型 1-web 2-app
*/
private String roleSource;
/** /**
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限 * 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/ */

View File

@ -1,6 +1,7 @@
package org.dromara.system.domain.vo; package org.dromara.system.domain.vo;
import lombok.Data; import lombok.Data;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -42,4 +43,9 @@ public class SysUserInfoVo implements Serializable {
*/ */
private List<SysPostVo> posts; private List<SysPostVo> posts;
/**
* 项目角色列表
*/
private List<SysRoleProjectDto> projectRoles;
} }

View File

@ -139,4 +139,9 @@ public class SysUserVo implements Serializable {
*/ */
private Long roleId; private Long roleId;
/**
* 项目组
*/
private List<Long> projectIds;
} }

View File

@ -1,10 +1,12 @@
package org.dromara.system.domain.vo; package org.dromara.system.domain.vo;
import lombok.Data; 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.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Set; import java.util.List;
/** /**
* 登录用户信息 * 登录用户信息
@ -25,11 +27,11 @@ public class UserInfoVo implements Serializable {
/** /**
* 菜单权限 * 菜单权限
*/ */
private Set<String> permissions; private List<SysProjectRoleMenuVo> permissions;
/** /**
* 角色权限 * 角色权限
*/ */
private Set<String> roles; private List<SysProjectRolePermissionVo> roles;
} }

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<BusSubProjectVo> children;
/**
* 打卡范围
*/
private List<Punchrange> punchrangeList;
/**
* go项目id
*/
private Long goId;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -2,11 +2,13 @@ package org.dromara.system.dubbo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService; 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.api.RemotePermissionService;
import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysPermissionService;
import org.springframework.stereotype.Service; 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; private final ISysPermissionService permissionService;
@Override @Override
public Set<String> getRolePermission(Long userId) { public List<SysProjectRolePermissionVo> getRolePermission(Long userId) {
return permissionService.getRolePermission(userId); return permissionService.getRolePermission(userId);
} }
@Override @Override
public Set<String> getMenuPermission(Long userId) { public List<SysProjectRoleMenuVo> getMenuPermission(Long userId) {
return permissionService.getMenuPermission(userId); return permissionService.getMenuPermission(userId);
} }
} }

View File

@ -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);
}
}

View File

@ -59,6 +59,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
private final SysPostMapper postMapper; private final SysPostMapper postMapper;
private final SysUserRoleMapper userRoleMapper; private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper; private final SysUserPostMapper userPostMapper;
private final IBusUserProjectRelevancyService userProjectRelevancyService;
/** /**
* 通过用户名查询用户信息 * 通过用户名查询用户信息
@ -79,6 +80,14 @@ public class RemoteUserServiceImpl implements RemoteUserService {
} }
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
if (!SystemConstants.SUPER_ADMIN_ID.equals(sysUser.getUserId())) {
List<BusUserProjectRelevancy> list = userProjectRelevancyService.lambdaQuery()
.eq(BusUserProjectRelevancy::getUserId, sysUser.getUserId())
.list();
if (CollUtil.isNotEmpty(list)) {
sysUser.setProjectIds(list.stream().map(BusUserProjectRelevancy::getProjectId).toList());
}
}
return buildLoginUser(sysUser); return buildLoginUser(sysUser);
}); });
} }
@ -266,6 +275,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
loginUser.setTenantId(userVo.getTenantId()); loginUser.setTenantId(userVo.getTenantId());
loginUser.setUserId(userId); loginUser.setUserId(userId);
loginUser.setDeptId(userVo.getDeptId()); loginUser.setDeptId(userVo.getDeptId());
List<Long> projectIds = userVo.getProjectIds();
Long projectId = null;
if (CollUtil.isNotEmpty(projectIds)) {
projectId = projectIds.getFirst();
}
loginUser.setProjectId(projectId);
loginUser.setUsername(userVo.getUserName()); loginUser.setUsername(userVo.getUserName());
loginUser.setNickname(userVo.getNickName()); loginUser.setNickname(userVo.getNickName());
loginUser.setPassword(userVo.getPassword()); loginUser.setPassword(userVo.getPassword());

View File

@ -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<BusProjectFile, BusProjectFileVo> {
}

View File

@ -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<BusProject, BusProjectVo> {
}

View File

@ -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<BusProjectNews, BusProjectNewsVo> {
}

View File

@ -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<BusProjectPunchrange, BusProjectPunchrangeVo> {
}

View File

@ -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<BusUserProjectRelevancy, BusUserProjectRelevancyVo> {
}

View File

@ -3,11 +3,12 @@ package org.dromara.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants; 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.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; import java.util.List;
@ -32,7 +33,7 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
* @param userId 用户ID * @param userId 用户ID
* @return 权限列表 * @return 权限列表
*/ */
List<String> selectMenuPermsByUserId(Long userId); List<ProjectPermsItem> selectMenuPermsByUserId(Long userId);
/** /**
* 根据角色ID查询权限 * 根据角色ID查询权限
@ -62,7 +63,7 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
* @param userId 用户ID * @param userId 用户ID
* @return 菜单列表 * @return 菜单列表
*/ */
List<SysMenu> selectMenuTreeByUserId(Long userId); List<SysMenu> selectMenuTreeByUserId(Long userId, Long projectId);
/** /**
* 根据角色ID查询菜单树信息 * 根据角色ID查询菜单树信息

View File

@ -8,6 +8,7 @@ import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.dto.project.ProjectRolesItem;
import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysRoleVo;
import java.util.List; import java.util.List;
@ -59,4 +60,12 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRole, SysRoleVo> {
*/ */
List<SysRoleVo> selectRolesByUserId(Long userId); List<SysRoleVo> selectRolesByUserId(Long userId);
/**
* 根据用户ID查询角色
*
* @param userId 用户ID
* @return 角色列表
*/
List<ProjectRolesItem> selectProjectRolesByUserId(Long userId);
} }

View File

@ -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<BusProjectFile> {
/**
* 查询项目文件存储
*
* @param id 主键
* @return 项目文件存储
*/
BusProjectFileVo queryById(Long id);
/**
* 分页查询项目文件存储列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目文件存储分页列表
*/
TableDataInfo<BusProjectFileVo> queryPageList(BusProjectFileQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的项目文件存储列表
*
* @param req 查询条件
* @return 项目文件存储列表
*/
List<BusProjectFileVo> queryList(BusProjectFileQueryReq req);
/**
* 修改项目文件存储
*
* @param req 项目文件存储
* @return 是否修改成功
*/
Boolean updateByBo(BusProjectFileUpdateReq req);
/**
* 校验并批量删除项目文件存储信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取项目文件存储视图对象
*
* @param projectFile 项目文件存储对象
* @return 项目文件存储视图对象
*/
BusProjectFileVo getVo(BusProjectFile projectFile);
/**
* 获取项目文件存储查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusProjectFile> buildQueryWrapper(BusProjectFileQueryReq req);
/**
* 获取项目文件存储分页对象视图
*
* @param projectFilePage 项目文件存储分页对象
* @return 项目文件存储分页对象视图
*/
Page<BusProjectFileVo> getVoPage(Page<BusProjectFile> projectFilePage);
}

View File

@ -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<BusProjectNews> {
/**
* 查询项目新闻
*
* @param id 主键
* @return 项目新闻
*/
BusProjectNewsVo queryById(Long id);
/**
* 分页查询项目新闻列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目新闻分页列表
*/
TableDataInfo<BusProjectNewsVo> queryPageList(BusProjectNewsQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的项目新闻列表
*
* @param req 查询条件
* @return 项目新闻列表
*/
List<BusProjectNewsVo> queryList(BusProjectNewsQueryReq req);
/**
* 查询大屏项目新闻列表
*
* @param req 列表查询条件
* @return 大屏项目新闻列表
*/
List<BusProjectNewsGisVo> queryGisList(BusProjectNewsGisReq req);
/**
* 根据项目id查询项目新闻列表
*
* @param projectId 项目id
* @return 项目新闻列表
*/
List<BusProjectNewsVo> 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<Long> ids, Boolean isValid);
/**
* 获取项目新闻存储视图对象
*
* @param projectNews 项目新闻存储对象
* @return 项目新闻存储视图对象
*/
BusProjectNewsVo getVo(BusProjectNews projectNews);
/**
* 获取项目新闻存储查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusProjectNews> buildQueryWrapper(BusProjectNewsQueryReq req);
/**
* 获取项目新闻存储分页对象视图
*
* @param projectNewsPage 项目新闻存储分页对象
* @return 项目新闻存储分页对象视图
*/
Page<BusProjectNewsVo> getVoPage(Page<BusProjectNews> projectNewsPage);
/**
* 获取项目新闻存储列表视图对象
*
* @param projectNewsList 项目新闻存储列表对象
* @return 项目新闻存储列表视图对象
*/
List<BusProjectNewsVo> getVoList(List<BusProjectNews> projectNewsList);
}

View File

@ -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<BusProjectPunchrange> {
/**
* 查询项目打卡范围
*
* @param id 主键
* @return 项目打卡范围
*/
BusProjectPunchrangeVo queryById(Long id);
/**
* 分页查询项目打卡范围列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 项目打卡范围分页列表
*/
TableDataInfo<BusProjectPunchrangeVo> queryPageList(BusProjectPunchrangeBo bo, PageQuery pageQuery);
/**
* 查询符合条件的项目打卡范围列表
*
* @param bo 查询条件
* @return 项目打卡范围列表
*/
List<BusProjectPunchrangeVo> 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<Long> ids, Boolean isValid);
}

View File

@ -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<BusProject> {
/**
* 查询项目
*
* @param id 主键
* @return 项目
*/
BusProjectVo queryById(Long id);
/**
* 分页查询项目列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目分页列表
*/
TableDataInfo<BusProjectVo> queryPageList(BusProjectQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的项目列表
*
* @param req 查询条件
* @return 项目列表
*/
List<BusProjectVo> queryList(BusProjectQueryReq req);
/**
* 查询项目下的子项目列表
*
* @param id 父项目id
* @return 项目下的子项目列表
*/
List<BusSubProjectVo> 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<Long> ids, Boolean isValid);
/**
* 获取项目视图对象
*
* @param project 项目对象
* @return 项目视图对象
*/
BusProjectVo getVo(BusProject project);
/**
* 获取项目查询条件封装(不查询子项目)
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusProject> buildQueryWrapper(BusProjectQueryReq req);
/**
* 获取项目分页对象视图
*
* @param projectPage 项目分页对象
* @return 项目分页对象视图
*/
Page<BusProjectVo> getVoPage(Page<BusProject> projectPage);
/**
* 校验用户是否拥有操作项目的权限
*
* @param projectId 项目id
* @param userId 需要鉴权的用户id
*/
void validAuth(Long projectId, Long userId);
/**
* 校验用户是否拥有操作项目的权限
*
* @param projectIdList 项目id列表
* @param userId 需要鉴权的用户id
*/
void validAuth(Collection<Long> projectIdList, Long userId);
/**
* 获取项目安全天数
*
* @param id 项目id
* @return 安全天数
*/
BusProjectSafetyDayVo getSafetyDay(Long id);
/**
* 获取项目地址信息
*
* @return 项目地址信息列表
*/
List<BusProjectGisVo> getGisList();
/**
* 改变项目所属用户
*
* @param id 项目id
* @return 是否成功
*/
Boolean changeUserProject(Long id);
BusProjectVo selectById(Long projectId);
List<BusProjectVo> selectProjectVoList();
/**
* 通过项目ID查询项目名称
*
* @param projectId 项目ID
* @return 项目名称
*/
String getProjectNameById(Long projectId);
}

View File

@ -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<BusUserProjectRelevancy> {
/**
* 查询系统用户与项目关联
*
* @param id 主键
* @return 系统用户与项目关联
*/
BusUserProjectRelevancyVo queryById(Long id);
/**
* 分页查询系统用户与项目关联列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 系统用户与项目关联分页列表
*/
TableDataInfo<BusUserProjectRelevancyVo> queryPageList(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的系统用户与项目关联列表
*
* @param req 查询条件
* @return 系统用户与项目关联列表
*/
List<BusUserProjectRelevancyVo> queryList(BusUserProjectRelevancyQueryReq req);
/**
* 新增系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 新增关联id
*/
Long insertByBo(BusUserProjectRelevancyCreateReq req);
/**
* 批量新增用户和项目关联
*
* @param projectId 项目ID
* @param userIdList 用户ID列表
* @param userType 用户类型
*/
void saveBatchByUserList(Long projectId, List<Long> userIdList, String userType);
/**
* 批量新增用户和项目关联
*
* @param projectIdList 项目ID列表
* @param userId 用户ID
* @param userType 用户类型
*/
void saveBatchByProjectList(List<Long> projectIdList, Long userId, String userType);
/**
* 修改系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 是否修改成功
*/
Boolean updateByBo(BusUserProjectRelevancyUpdateReq req);
/**
* 校验并批量删除系统用户与项目关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据用户ID删除系统用户与项目关联
*
* @param userId 用户ID
*/
void deleteByUserId(Long userId);
/**
* 根据项目ID和用户ID列表删除系统用户与项目关联
*
* @param oldProjectId 项目ID
* @param userIds 用户ID列表
*/
void deleteByProjectAndUserIds(Long oldProjectId, List<Long> userIds);
/**
* 获取当前登录用户项目列表
*
* @param userId 登录用户ID
* @return 当前登录用户项目列表
*/
List<BusLoginUserProjectRelevancyVo> queryListByUserId(Long userId);
/**
* 获取当前登录用户项目分页
*
* @param userId 登录用户ID
* @param req 分页查询条件
* @param pageQuery 分页参数
* @return 当前登录用户项目分页
*/
TableDataInfo<BusUserProjectRelevancyVo> 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<BusUserProjectRelevancy> buildQueryWrapper(BusUserProjectRelevancyQueryReq req);
/**
* 获取系统用户与项目关联分页视图
*
* @param userProjectRelevancyPage 系统用户与项目关联分页
* @return 系统用户与项目关联分页视图
*/
Page<BusUserProjectRelevancyVo> getVoPage(Page<BusUserProjectRelevancy> userProjectRelevancyPage);
}

Some files were not shown because too many files have changed in this diff Show More