生产单管理更新还原、作废等接口

This commit is contained in:
lym
2024-06-14 17:08:07 +08:00
57 changed files with 549 additions and 416 deletions
@@ -114,4 +114,22 @@ public class ProcessController {
BeanUtils.toBean(list, ProcessRespVO.class));
}
@GetMapping("/select")
@Operation(summary = "查看当前登录用户的组织的工序信息")
@Parameter(name = "userId", description = "当前登录的用户ID", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('manage:process:select')")
public CommonResult<List<ProcessDO>> getUserPage(@Valid @RequestParam("userId") Long userId) {
return success(processService.getUserProcess(userId));
}
}
@@ -1,7 +1,7 @@
package com.cf.imes.module.system.dal.mysql.permission;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.LoginUser;
@@ -12,9 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.springframework.lang.Nullable;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@Mapper
public interface RoleMapper extends BaseMapperX<RoleDO> {
@@ -28,7 +26,7 @@ public interface RoleMapper extends BaseMapperX<RoleDO> {
//如果是超级管理员并且未传organId,就查看自己的的
lambdaQueryWrapperX.inIfPresent(RoleDO::getOrganId,0L,loginUser.getOrganId());
}*/
if(isSupAdmin && !Objects.isNull(reqVO.getOrganId())) {
if(isSupAdmin && ObjectUtil.isNotNull(reqVO.getOrganId())) {
//如果是超级管理员并且传入organId,就查看传入的组织
lambdaQueryWrapperX.eqIfPresent(RoleDO::getOrganId, reqVO.getOrganId());
} else {
@@ -41,7 +39,7 @@ public interface RoleMapper extends BaseMapperX<RoleDO> {
.eqIfPresent(RoleDO::getStatus, reqVO.getStatus())
.betweenIfPresent(RoleDO::getCreateTime, reqVO.getCreateTime())
.ne(RoleDO::getId, 1)
.orderByDesc(RoleDO::getId);
.orderByAsc(RoleDO::getSort);
return selectPage(reqVO, lambdaQueryWrapperX);
}
@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.cf.imes.module.system.controller.admin.process.vo.process.ProcessPageReqVO;
import com.cf.imes.module.system.dal.dataobject.process.ProcessDO;
import com.cf.imes.module.system.dal.dataobject.process.ProcessUserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -50,4 +52,16 @@ public interface ProcessMapper extends BaseMapperX<ProcessDO> {
}
int deleteById(@Param("id") Long id);
default List<ProcessDO> selectProcessList(Long organId,Long userId) {
return selectJoinList(ProcessDO.class, new MPJLambdaWrapperX<ProcessDO>()
.leftJoin(ProcessUserDO.class, ProcessUserDO::getProcessId, ProcessDO::getId)
.eq(ProcessUserDO::getUserId, userId)
.eq(ProcessDO::getOrganId, organId)
.eq(ProcessDO::getIsEnabled,true)
.selectAll(ProcessDO.class)
.orderByDesc(ProcessDO::getId));
}
}
@@ -0,0 +1,15 @@
package com.cf.imes.module.system.dal.redis;
/**
* system redis监听刷新通道名称 常量
*
* @author Gqr
* @since 2024/6/13 14:55
*/
public interface RedisRefreshChannelTopicConstants {
/**
* 刷新权限
*/
String PREMISSION_REFRESH = "PREMISSION_REFRESH";
}
@@ -0,0 +1,31 @@
package com.cf.imes.module.system.dal.redis.listener;
import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisSimpleMessageListener;
import com.cf.imes.framework.security.core.service.SecurityFrameworkService;
import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.stereotype.Component;
/**
* system PREMISSION_REFRESH redis监听器
*
* @author Gqr
* @since 2024/6/13 10:32
*/
@Component
public class SystemPremissionRefreshRedisListener extends AbstractRedisSimpleMessageListener {
@Autowired
private SecurityFrameworkService securityFrameworkService;
public SystemPremissionRefreshRedisListener() {
super.setTopic(new ChannelTopic(RedisRefreshChannelTopicConstants.PREMISSION_REFRESH));
}
@Override
public void onMessage(Message message, byte[] bytes) {
securityFrameworkService.invalidateAll();
}
}
@@ -51,8 +51,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
@Transactional
public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes,Boolean large, Integer dbNo, Integer tableNo, String dataCode, Long organId, String nickname) {
OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId);
// 创建刷新令牌
OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes, large, dbNo, tableNo, dataCode, organId, nickname);
// 填入访问令牌包含的字段
OAuth2AccessTokenDO refreshTokenDO = createOAuth2ReToken(userId, userType, clientDO, scopes, large, dbNo, tableNo, dataCode, organId, nickname);
// 创建访问令牌
return createOAuth2AccessToken(refreshTokenDO, clientDO);
}
@@ -84,23 +85,33 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "刷新令牌已过期");
}
// 创建访问令牌
return createOAuth2AccessToken(refreshTokenDO, clientDO);
// // 创建访问令牌
// return createOAuth2AccessToken(refreshTokenDO, clientDO);
return null;
}
@Override
public OAuth2AccessTokenDO getAccessToken(String accessToken) {
// 优先从 Redis 中获取
OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenRedisDAO.get(accessToken);
if (accessTokenDO != null) {
return accessTokenDO;
}
// // 优先从 Redis 中获取
// OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenRedisDAO.get(accessToken);
// if (accessTokenDO != null) {
// return accessTokenDO;
// }
//
// // 获取不到,从 MySQL 中获取
// accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken);
// // 如果在 MySQL 存在,则往 Redis 中写入
// if (accessTokenDO != null && !DateUtils.isExpired(accessTokenDO.getExpiresTime())) {
// oauth2AccessTokenRedisDAO.set(accessTokenDO);
// }
// 因数据库不在存入缓存数据,所以直接从缓存中获取
// 获取不到,从 MySQL 中获取
accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken);
// 如果在 MySQL 存在,则往 Redis 中写入
if (accessTokenDO != null && !DateUtils.isExpired(accessTokenDO.getExpiresTime())) {
oauth2AccessTokenRedisDAO.set(accessTokenDO);
// 数据库移除令牌存入,所以直接从缓存中获取
OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenRedisDAO.get(accessToken);
if(accessTokenDO != null){
// 有令牌的校验,代表有接口访问,延长令牌的过期时间(30分钟)
oauth2AccessTokenRedisDAO.set(accessTokenDO.setExpiresTime(LocalDateTime.now().plusSeconds(1800)));
}
return accessTokenDO;
}
@@ -111,9 +122,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
if (accessTokenDO == null) {
throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌不存在");
}
if (DateUtils.isExpired(accessTokenDO.getExpiresTime())) {
throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌已过期");
}
// if (DateUtils.isExpired(accessTokenDO.getExpiresTime())) {
// throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌已过期");
// }
return accessTokenDO;
}
@@ -136,7 +147,26 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
return oauth2AccessTokenMapper.selectPage(reqVO);
}
private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
// 填入访问令牌包含的字段
private OAuth2AccessTokenDO createOAuth2ReToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List<String> scopes, Boolean large, Integer dbNo, Integer tableNo, String dataCode, Long organId, String nickname) {
OAuth2AccessTokenDO refreshToken = new OAuth2AccessTokenDO().setRefreshToken(generateRefreshToken())
.setUserId(userId).setUserType(userType)
.setClientId(clientDO.getClientId()).setScopes(scopes)
.setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds()))
.setLarge(large).setDbNo(dbNo).setTableNo(tableNo).setDataCode(dataCode)
.setOrganId(organId).setNickname(nickname);
if (organId != null) {
OrganContextHolder.setOrganId(organId);
}
boolean b = securityFrameworkService.hasAnyRoles(userId,"super_admin");
refreshToken.setIsSupAdmin(b);
// oauth2RefreshTokenMapper.insert(refreshToken);
return refreshToken;
}
// 在Redis中新增Token,除去刷新Token字段
private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2AccessTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken())
.setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType())
.setClientId(clientDO.getClientId()).setScopes(refreshTokenDO.getScopes())
@@ -147,25 +177,13 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
.setNickname(refreshTokenDO.getNickname()).setIsSupAdmin(refreshTokenDO.getIsSupAdmin())
;
//accessTokenDO.setOrganId(OrganContextHolder.getOrganId()); // 手动设置组织编号,避免缓存到 Redis 的时候,无对应的组织编号
oauth2AccessTokenMapper.insert(accessTokenDO);
// oauth2AccessTokenMapper.insert(accessTokenDO);
// 记录到 Redis 中
oauth2AccessTokenRedisDAO.set(accessTokenDO);
return accessTokenDO;
}
private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List<String> scopes, Boolean large, Integer dbNo, Integer tableNo, String dataCode, Long organId, String nickname) {
OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken())
.setUserId(userId).setUserType(userType)
.setClientId(clientDO.getClientId()).setScopes(scopes)
.setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds()))
.setLarge(large).setDbNo(dbNo).setTableNo(tableNo).setDataCode(dataCode)
.setOrganId(organId).setNickname(nickname)
;
boolean b = securityFrameworkService.hasAnyRoles(userId,"super_admin");
refreshToken.setIsSupAdmin(b);
oauth2RefreshTokenMapper.insert(refreshToken);
return refreshToken;
}
private static String generateAccessToken() {
return IdUtil.fastSimpleUUID();
@@ -4,14 +4,12 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.common.enums.CommonStatusEnum;
import com.cf.imes.framework.common.util.collection.CollectionUtils;
import com.cf.imes.framework.datapermission.core.annotation.DataPermission;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.aop.OrganIgnore;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.organ.core.db.OrganBaseDO;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.system.api.permission.dto.DeptDataPermissionRespDTO;
import com.cf.imes.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO;
@@ -22,6 +20,7 @@ import com.cf.imes.module.system.dal.dataobject.permission.UserRoleDO;
import com.cf.imes.module.system.dal.mysql.permission.RoleMenuMapper;
import com.cf.imes.module.system.dal.mysql.permission.UserRoleMapper;
import com.cf.imes.module.system.dal.redis.RedisKeyConstants;
import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants;
import com.cf.imes.module.system.enums.permission.DataScopeEnum;
import com.cf.imes.module.system.service.dept.DeptService;
import com.cf.imes.module.system.service.user.AdminUserService;
@@ -30,14 +29,17 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Suppliers;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -72,6 +74,9 @@ public class PermissionServiceImpl implements PermissionService {
@Resource
private AdminUserService userService;
@Autowired
private RedisTemplate redisTemplate;
@Override
public boolean hasAnyPermissions(Long userId, String... permissions) {
// 如果为空,说明已经有权限
@@ -179,6 +184,16 @@ public class PermissionServiceImpl implements PermissionService {
if (CollUtil.isNotEmpty(deleteMenuIds)) {
roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds);
}
// 角色菜单权限发生修改,通知刷新本地缓存
if (CollectionUtil.isNotEmpty(createMenuIds) || CollectionUtil.isNotEmpty(deleteMenuIds)) {
CompletableFuture.runAsync(() -> {
redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PREMISSION_REFRESH, "");
}).exceptionally(e -> {
log.error("redis message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PREMISSION_REFRESH, e.getMessage());
return null;
});
}
}
@Override
@@ -67,4 +67,5 @@ public interface ProcessService {
*/
List<ProcessDO> getAllProcess();
List<ProcessDO> getUserProcess(Long userId);
}
@@ -189,4 +189,13 @@ public class ProcessServiceImpl implements ProcessService {
}
@Override
public List<ProcessDO> getUserProcess(Long userId) {
// 获取组织id
Long organId = OrganContextHolder.getOrganId();
return processMapper.selectProcessList(organId,userId);
}
}