diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/ProcessProcessingTypeEnum.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/ProcessProcessingTypeEnum.java index d72fd3a3a..e49cff275 100644 --- a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/ProcessProcessingTypeEnum.java +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/enums/ProcessProcessingTypeEnum.java @@ -9,9 +9,9 @@ import lombok.Getter; public enum ProcessProcessingTypeEnum { - COMPONENTPROCESSING(7L,"组件加工"); + COMPONENTPROCESSING(7,"组件加工"); - private Long number; + private Integer number; private String fabricatedItem; public boolean equals(Integer number) { diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/cache/CacheUtils.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/cache/CacheUtils.java index 7a180960f..40351bd65 100644 --- a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/cache/CacheUtils.java +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/cache/CacheUtils.java @@ -17,13 +17,21 @@ import java.util.concurrent.Executors; public class CacheUtils { public static LoadingCache buildAsyncReloadingCache(Duration duration, CacheLoader loader) { - Executor executor = Executors.newCachedThreadPool( // TODO 晨丰:可能要思考下,未来要不要做成可配置 - TtlExecutors.getDefaultDisableInheritableThreadFactory()); // TTL 保证 ThreadLocal 可以透传 return CacheBuilder.newBuilder() // 只阻塞当前数据加载线程,其他线程返回旧值 .refreshAfterWrite(duration) // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程 - .build(CacheLoader.asyncReloading(loader, executor)); + .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置 } + /** + * 构建同步刷新的 LoadingCache 对象 + * + * @param duration 过期时间 + * @param loader CacheLoader 对象 + * @return LoadingCache 对象 + */ + public static LoadingCache buildCache(Duration duration, CacheLoader loader) { + return CacheBuilder.newBuilder().refreshAfterWrite(duration).build(loader); + } } diff --git a/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/context/OrganContextHolder.java b/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/context/OrganContextHolder.java index 1912f9a3f..62df76118 100644 --- a/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/context/OrganContextHolder.java +++ b/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/context/OrganContextHolder.java @@ -21,6 +21,11 @@ public class OrganContextHolder { */ private static final ThreadLocal IGNORE = new TransmittableThreadLocal<>(); + /** + * 上下文获取不到organid异常提示 + */ + public static final String ORGANID_NOT_EXIST_EXCEPTION = "OrganContextHolder 不存在组织编号!"; + /** * 获得组织编号 * @@ -48,8 +53,7 @@ public class OrganContextHolder { public static Long getRequiredOrganId() { Long organId = getOrganId(); if (organId == null) { - throw new NullPointerException("OrganContextHolder 不存在组织编号!可参考文档:" - + DocumentEnum.ORGAN.getUrl()); + throw new NullPointerException(ORGANID_NOT_EXIST_EXCEPTION); } return organId; } diff --git a/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/security/OrganSecurityWebFilter.java b/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/security/OrganSecurityWebFilter.java index fc54c41d5..64fd51034 100644 --- a/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/security/OrganSecurityWebFilter.java +++ b/cf-framework/cf-spring-boot-starter-biz-organ/src/main/java/com/cf/imes/framework/organ/core/security/OrganSecurityWebFilter.java @@ -1,8 +1,6 @@ package com.cf.imes.framework.organ.core.security; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.cf.imes.framework.common.enums.RpcConstants; import com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.servlet.ServletUtils; @@ -56,18 +54,10 @@ public class OrganSecurityWebFilter extends ApiRequestFilter { this.organFrameworkService = organFrameworkService; } - @Override - protected boolean shouldNotFilter(HttpServletRequest request) { - return super.shouldNotFilter(request) && - !StrUtil.startWithAny(request.getRequestURI(), RpcConstants.RPC_API_PREFIX); // 因为 RPC API 也会透传组织编号 - } - @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { Long organId = WebFrameworkUtils.getOrganId(request); - //Long organId = OrganContextHolder.getOrganId(); - boolean isRpcRequest = WebFrameworkUtils.isRpcRequest(request); // 1. 登陆的用户,校验是否有权限访问该组织,避免越权问题。 LoginUser user = SecurityFrameworkUtils.getLoginUser(); if (user != null) { @@ -76,8 +66,7 @@ public class OrganSecurityWebFilter extends ApiRequestFilter { organId = user.getOrganId(); OrganContextHolder.setOrganId(organId); // 如果传递了组织编号,则进行比对组织编号,避免越权问题 - } else if (!Objects.equals(user.getOrganId(), OrganContextHolder.getOrganId()) - && !isRpcRequest) { // Cloud 特殊逻辑:如果是 RPC 请求,就不校验了。主要考虑,一些场景下,会调用 OrganUtils 去切换组织 + } else if (!Objects.equals(user.getOrganId(), OrganContextHolder.getOrganId())) { // Cloud 特殊逻辑:如果是 RPC 请求,就不校验了。主要考虑,一些场景下,会调用 OrganUtils 去切换组织 log.error("[doFilterInternal][组织({}) User({}/{}) 越权访问组织({}) URL({}/{})]", user.getOrganId(), user.getId(), user.getUserType(), OrganContextHolder.getOrganId(), request.getRequestURI(), request.getMethod()); diff --git a/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/config/ChenfengRedisMQConsumerAutoConfiguration.java b/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/config/ChenfengRedisMQConsumerAutoConfiguration.java index e6d7d5229..9e4239c29 100644 --- a/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/config/ChenfengRedisMQConsumerAutoConfiguration.java +++ b/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/config/ChenfengRedisMQConsumerAutoConfiguration.java @@ -7,6 +7,7 @@ import com.cf.imes.framework.common.enums.DocumentEnum; import com.cf.imes.framework.mq.redis.core.RedisMQTemplate; import com.cf.imes.framework.mq.redis.core.job.RedisPendingMessageResendJob; import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener; +import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisSimpleMessageListener; import com.cf.imes.framework.mq.redis.core.stream.AbstractRedisStreamMessageListener; import com.cf.imes.framework.redis.config.ChenfengRedisAutoConfiguration; import lombok.extern.slf4j.Slf4j; @@ -61,6 +62,26 @@ public class ChenfengRedisMQConsumerAutoConfiguration { return container; } + /** + * 创建 Redis Pub/Sub 广播消费的容器 + */ + @Bean + @ConditionalOnBean(AbstractRedisSimpleMessageListener.class) + public RedisMessageListenerContainer redisDelListenerContainer( + RedisTemplate redisTemplate, List listeners) { + // 创建 RedisMessageListenerContainer 对象 + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + // 设置 RedisConnection 工厂。 + container.setConnectionFactory(redisTemplate.getRequiredConnectionFactory()); + // 添加监听器 + listeners.forEach(listener -> { + container.addMessageListener(listener, listener.getTopic()); + log.info("[redisMessageListenerContainer][注册 ChannelTopic({}) 对应的监听器({})]", + listener.getTopic(), listener.getClass().getName()); + }); + return container; + } + /** * 创建 Redis Stream 重新消费的任务 */ diff --git a/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/core/pubsub/AbstractRedisSimpleMessageListener.java b/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/core/pubsub/AbstractRedisSimpleMessageListener.java new file mode 100644 index 000000000..1f03d3d46 --- /dev/null +++ b/cf-framework/cf-spring-boot-starter-mq/src/main/java/com/cf/imes/framework/mq/redis/core/pubsub/AbstractRedisSimpleMessageListener.java @@ -0,0 +1,22 @@ +package com.cf.imes.framework.mq.redis.core.pubsub; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.listener.ChannelTopic; + +/** + * Redis监听器 + * + * + * @author 晨丰科技 + */ +public abstract class AbstractRedisSimpleMessageListener implements MessageListener { + + /** + * 通道主题 + */ + @Getter + @Setter + private ChannelTopic topic; +} diff --git a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java index 2c156ec61..ce39cd2b0 100644 --- a/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/cf-framework/cf-spring-boot-starter-mybatis/src/main/java/com/cf/imes/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -111,21 +111,29 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { Long organId = null; + /** + * 用户首次密码登陆的时候,不会有token带入,直接捕捉异常抛出即可,组织ID后续会根据用户登录的组织进行填入, + * 这里的组织ID字段填入即使为空也可,后续的请求中都会带有token,再从缓存中获取到 token 数据,再获取组织ID,填入即可 + */ try { // 获取 token 对应的缓存数据,并得到组织 ID OAuth2AccessTokenDO oAuth2AccessTokenDO = get(authorization); organId = oAuth2AccessTokenDO.getOrganId(); + + }catch (Exception e){ } + this.strictUpdateFill(metaObject, "organId", Long.class, organId ); } + // 从请求中获取到 token - public static String obtainAuthorization(HttpServletRequest request, - String headerName, String parameterName) { + private static String obtainAuthorization(HttpServletRequest request, + String headerName, String parameterName) { // 1. 获得 Token。优先级:Header > Parameter String token = request.getHeader(headerName); if (StrUtil.isEmpty(token)) { @@ -141,7 +149,7 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { // 从缓存中获取到缓存的数据 - public OAuth2AccessTokenDO get(String accessToken) { + private OAuth2AccessTokenDO get(String accessToken) { String redisKey = String.format(OAUTH2_ACCESS_TOKEN, accessToken); return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), OAuth2AccessTokenDO.class); } diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/filter/TokenAuthenticationFilter.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/filter/TokenAuthenticationFilter.java index e11ef1707..fe6a24e5b 100644 --- a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/filter/TokenAuthenticationFilter.java +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/filter/TokenAuthenticationFilter.java @@ -15,6 +15,8 @@ import com.cf.imes.module.system.api.oauth2.OAuth2TokenApi; import com.cf.imes.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; import com.cf.imes.module.system.api.permission.PermissionApi; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.filter.OncePerRequestFilter; @@ -33,6 +35,7 @@ import java.nio.charset.StandardCharsets; * @author 晨丰科技 */ @RequiredArgsConstructor +@Slf4j public class TokenAuthenticationFilter extends OncePerRequestFilter { private final SecurityProperties securityProperties; @@ -129,14 +132,17 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { .setOrganId(WebFrameworkUtils.getOrganId(request)); } + @SneakyThrows private LoginUser buildLoginUserByHeader(HttpServletRequest request) { String loginUserStr = request.getHeader(SecurityFrameworkUtils.LOGIN_USER_HEADER); if(StrUtil.isNotEmpty(loginUserStr)) { - LoginUser loginUser = JsonUtils.parseObject(loginUserStr, LoginUser.class); - //CommonResult superAdmin = permissionApi.hasAnyRoles(loginUser.getId(), "super_admin"); - //loginUser.setIsSupAdmin(superAdmin.getCheckedData()); - loginUser.setNickname(URLDecoder.decode(loginUser.getNickname(),StandardCharsets.UTF_8)); - return loginUser; + try { + loginUserStr = URLDecoder.decode(loginUserStr, StandardCharsets.UTF_8.name()); // 解码,解决中文乱码问题 + return JsonUtils.parseObject(loginUserStr, LoginUser.class); + } catch (Exception ex) { + log.error("[buildLoginUserByHeader][解析 LoginUser({}) 发生异常]", loginUserStr, ex); ; + throw ex; + } } return null; } diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/rpc/LoginUserRequestInterceptor.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/rpc/LoginUserRequestInterceptor.java index 4737ec895..c77b94564 100644 --- a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/rpc/LoginUserRequestInterceptor.java +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/rpc/LoginUserRequestInterceptor.java @@ -1,23 +1,37 @@ package com.cf.imes.framework.security.core.rpc; -import com.cf.imes.framework.rpc.core.util.FeignUtils; +import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import feign.RequestInterceptor; import feign.RequestTemplate; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * LoginUser 的 RequestInterceptor 实现类:Feign 请求时,将 {@link LoginUser} 设置到 header 中,继续透传给被调用的服务 * * @author 晨丰科技 */ +@Slf4j public class LoginUserRequestInterceptor implements RequestInterceptor { @Override + @SneakyThrows public void apply(RequestTemplate requestTemplate) { LoginUser user = SecurityFrameworkUtils.getLoginUser(); if (user != null) { - FeignUtils.createJsonHeader(requestTemplate, SecurityFrameworkUtils.LOGIN_USER_HEADER, user); + try { + String userStr = JsonUtils.toJsonString(user); + userStr = URLEncoder.encode(userStr, StandardCharsets.UTF_8.name()); // 编码,避免中文乱码 + requestTemplate.header(SecurityFrameworkUtils.LOGIN_USER_HEADER, userStr); + } catch (Exception ex) { + log.error("[apply][序列化 LoginUser({}) 发生异常]", user, ex); + throw ex; + } } } diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkService.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkService.java index 7072b583b..13b1613cb 100644 --- a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkService.java +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkService.java @@ -23,6 +23,13 @@ public interface SecurityFrameworkService { */ boolean hasAnyPermissions(String... permissions); + /** + * 清空本地缓存 + * + * @param + */ + void invalidateAll(); + /** * 判断是否有角色 * diff --git a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkServiceImpl.java b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkServiceImpl.java index c438c9efe..ec0885c00 100644 --- a/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkServiceImpl.java +++ b/cf-framework/cf-spring-boot-starter-security/src/main/java/com/cf/imes/framework/security/core/service/SecurityFrameworkServiceImpl.java @@ -28,7 +28,7 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { /** * 针对 {@link #hasAnyRoles(String...)} 的缓存 */ - private final LoadingCache>, Boolean> hasAnyRolesCache = CacheUtils.buildAsyncReloadingCache( + private final LoadingCache>, Boolean> hasAnyRolesCache = CacheUtils.buildCache( Duration.ofMinutes(1L), // 过期时间 1 分钟 new CacheLoader>, Boolean>() { @@ -42,7 +42,7 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { /** * 针对 {@link #hasAnyPermissions(String...)} 的缓存 */ - private final LoadingCache>, Boolean> hasAnyPermissionsCache = CacheUtils.buildAsyncReloadingCache( + private final LoadingCache>, Boolean> hasAnyPermissionsCache = CacheUtils.buildCache( Duration.ofMinutes(1L), // 过期时间 1 分钟 new CacheLoader>, Boolean>() { @@ -65,6 +65,11 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { return hasAnyPermissionsCache.get(new KeyValue<>(SecurityFrameworkUtils.getLoginUserId(), Arrays.asList(permissions))); } + @Override + public void invalidateAll() { + hasAnyPermissionsCache.invalidateAll(); + } + @Override public boolean hasRole(String role) { return hasAnyRoles(role); diff --git a/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java b/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java index 65fe68b7a..8da358fce 100644 --- a/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java +++ b/cf-gateway/src/main/java/com/cf/imes/gateway/filter/security/TokenAuthenticationFilter.java @@ -22,11 +22,7 @@ import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.time.Duration; -import java.util.List; import java.util.Objects; import java.util.function.Function; @@ -74,14 +70,6 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered { }); - private final LoadingCache organIdCache = CacheUtils.buildAsyncReloadingCache(Duration.ofMinutes(1L), // 过期时间 1 分钟 - new CacheLoader<>() { - @Override - public Long load(String token) { - return getOrganIdByToken(token).block(); - } - }); - public TokenAuthenticationFilter(ReactorLoadBalancerExchangeFilterFunction lbFunction) { // Q:为什么不使用 OAuth2TokenApi 进行调用? // A1:Spring Cloud OpenFeign 官方未内置 Reactive 的支持 https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#reactive-support @@ -144,17 +132,9 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered { private Mono checkAccessToken(Long organId, String token) { return webClient.get() .uri(OAuth2TokenApi.URL_CHECK, uriBuilder -> uriBuilder.queryParam("accessToken", token).build()) - // .headers(httpHeaders -> WebFrameworkUtils.setOrganIdHeader(organId, httpHeaders)) // 设置组织的 Header .retrieve().bodyToMono(String.class); } - private Mono getOrganIdByToken(String token) { - return webClient.get() - .uri(OAuth2TokenApi.URL_ORGAN, uriBuilder -> uriBuilder.queryParam("accessToken", token).build()) - .retrieve() - .bodyToMono(Long.class); - } - private LoginUser buildUser(String body) { // 处理结果,结果不正确 CommonResult result = JsonUtils.parseObject(body, CHECK_RESULT_TYPE_REFERENCE); @@ -175,7 +155,7 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered { .setOrganId(tokenInfo.getOrganId()).setScopes(tokenInfo.getScopes()) .setLarge(tokenInfo.getLarge()).setDbNo(tokenInfo.getDbNo()).setTableNo(tokenInfo.getTableNo()) .setDataCode(tokenInfo.getDataCode()).setIsSupAdmin(tokenInfo.getIsSupAdmin()) - .setNickname(URLEncoder.encode(tokenInfo.getNickname(), StandardCharsets.UTF_8)); + .setNickname(tokenInfo.getNickname()); } @Override diff --git a/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java b/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java index aeea82db1..897c0a4c6 100644 --- a/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java +++ b/cf-gateway/src/main/java/com/cf/imes/gateway/util/SecurityFrameworkUtils.java @@ -3,10 +3,15 @@ package com.cf.imes.gateway.util; import cn.hutool.core.map.MapUtil; import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.gateway.filter.security.LoginUser; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + /** * 安全服务工具类 * @@ -14,6 +19,7 @@ import org.springframework.web.server.ServerWebExchange; * * @author 晨丰科技 */ +@Slf4j public class SecurityFrameworkUtils { private static final String AUTHORIZATION_HEADER = "Authorization"; @@ -101,8 +107,16 @@ public class SecurityFrameworkUtils { * @param builder 请求 * @param user 用户 */ + @SneakyThrows public static void setLoginUserHeader(ServerHttpRequest.Builder builder, LoginUser user) { - builder.header(LOGIN_USER_HEADER, JsonUtils.toJsonString(user)); + try { + String userStr = JsonUtils.toJsonString(user); + userStr = URLEncoder.encode(userStr, StandardCharsets.UTF_8.name()); // 编码,避免中文乱码 + builder.header(LOGIN_USER_HEADER, userStr); + } catch (Exception ex) { + log.error("[setLoginUserHeader][序列化 user({}) 发生异常]", user, ex); + throw ex; + } builder.header(DATA_CODE, user.getDataCode()); builder.header(ORGAN_ID, user.getOrganId().toString()); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java index 3b043cb29..8d3fbeb3c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/goods/GoodsMapper.java @@ -13,6 +13,8 @@ import org.apache.ibatis.annotations.Mapper; import com.cf.imes.module.executor.controller.admin.goods.vo.*; import org.apache.ibatis.annotations.Param; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + /** * 生产单商品 Mapper * @@ -23,6 +25,7 @@ public interface GoodsMapper extends BaseMapperX { default PageResult selectPage(GoodsPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(GoodsDO::getOrganId,getUserOrganId()) .eqIfPresent(GoodsDO::getOrderId, reqVO.getOrderId()) .eqIfPresent(GoodsDO::getRawGoodsId, reqVO.getRawGoodsId()) .eqIfPresent(GoodsDO::getGoodsId, reqVO.getGoodsId()) @@ -41,10 +44,10 @@ public interface GoodsMapper extends BaseMapperX { } - List selectGoodsList(@Param("orderId") Long orderId); + List selectGoodsList(@Param("orderId") Long orderId,@Param("organId") Long organId); - List selectGoodsListByOrderIds(@Param("orderIds") List orderIds); + List selectGoodsListByOrderIds(@Param("orderIds") List orderIds, @Param("organId") Long organId); // 单个修改删除状态 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/module/ModuleMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/module/ModuleMapper.java index 8a2b28d70..42e718637 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/module/ModuleMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/module/ModuleMapper.java @@ -9,6 +9,8 @@ import com.cf.imes.module.executor.dal.dataobject.module.ModuleDO; import org.apache.ibatis.annotations.Mapper; import com.cf.imes.module.executor.controller.admin.module.vo.*; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + /** * 生产单模块 Mapper * @@ -19,6 +21,7 @@ public interface ModuleMapper extends BaseMapperX { default PageResult selectPage(ModulePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(ModuleDO::getOrganId,getUserOrganId()) .eqIfPresent(ModuleDO::getOrderId, reqVO.getOrderId()) .likeIfPresent(ModuleDO::getName, reqVO.getName()) .eqIfPresent(ModuleDO::getParentId, reqVO.getParentId()) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index 47d0f88c0..56ff376e8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -41,10 +41,10 @@ public interface OrderItemMapper extends BaseMapperX { @Param("deleted") Integer deleted); - List selectPlateList(PlateDetailReqVO reqVO); + List selectPlateList( @Param("reqVO") PlateDetailReqVO reqVO,@Param("organId") Long organId); - PlateDetailRespVO selectPlateNumList(@Param("orderId") Long orderId); + PlateDetailRespVO selectPlateNumList(@Param("orderId") Long orderId,@Param("organId") Long organId); void deleteByPlateId(@Param("deletePlateIds") List deletePlateIds); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java index ccf1efb95..4d4c4b9b6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java @@ -18,6 +18,8 @@ import com.cf.imes.module.executor.controller.admin.orderParts.vo.*; import org.apache.ibatis.annotations.Param; import org.apache.poi.ss.formula.functions.T; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + /** * 生产单配件表 order_parts_{N} Mapper * @@ -28,6 +30,7 @@ public interface OrderPartsMapper extends BaseMapperX { default PageResult selectPage(OrderPartsPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(OrderPartsDO::getOrganId,getUserOrganId()) .eqIfPresent(OrderPartsDO::getOrderId, reqVO.getOrderId()) .eqIfPresent(OrderPartsDO::getGoodsId, reqVO.getGoodsId()) .likeIfPresent(OrderPartsDO::getName, reqVO.getName()) @@ -62,7 +65,7 @@ public interface OrderPartsMapper extends BaseMapperX { return respVO; } - IPage selectProductList(@Param("page") IPage page , @Param("orderId")Long orderId, @Param("roomId")Long roomId , @Param("bodyId")Long bodyId); + IPage selectProductList(@Param("page") IPage page , @Param("orderId")Long orderId, @Param("roomId")Long roomId , @Param("bodyId")Long bodyId,@Param("organId")Long organId); List selectPartDetail(@Param("orderId") Long orderId, @Param("organId") Long organId);// 配件明细 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java index c8a83a1e1..9219e5715 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plan/PlanMapper.java @@ -13,6 +13,9 @@ import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO; import com.cf.imes.module.executor.dal.dataobject.planitem.PlanItemDO; import org.apache.ibatis.annotations.Mapper; import com.cf.imes.module.executor.controller.admin.plan.vo.*; +import org.apache.ibatis.annotations.Param; + +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; /** * 生产单开料排单 Mapper @@ -25,6 +28,7 @@ public interface PlanMapper extends BaseMapperX { default PageResult selectPage(PlanPageReqVO reqVO) { if(StrUtil.isNotBlank(reqVO.getCustomer())) { return selectJoinPage(reqVO, PlanDO.class, new MPJLambdaWrapperX() + .eq(PlanDO::getOrganId,getUserOrganId()) .eqIfPresent(PlanDO::getPlanNo, reqVO.getPlanNo()) .eqIfPresent(PlanDO::getSort, reqVO.getSort()) .eqIfPresent(PlanDO::getType, reqVO.getType()) @@ -47,6 +51,7 @@ public interface PlanMapper extends BaseMapperX { } return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(PlanDO::getOrganId,getUserOrganId()) .eqIfPresent(PlanDO::getPlanNo, reqVO.getPlanNo()) .eqIfPresent(PlanDO::getSort, reqVO.getSort()) .eqIfPresent(PlanDO::getType, reqVO.getType()) @@ -63,7 +68,7 @@ public interface PlanMapper extends BaseMapperX { // .orderByDesc(PlanDO::getId)); } - List selectPlateListByPlanId(Long planId); + List selectPlateListByPlanId(@Param("planId") Long planId, @Param("organId") Long organId); OptimizeParamRespVO getOptimizePlanParam(Long planId); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java index 3f756527d..aab5744d3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/planitem/PlanItemMapper.java @@ -19,5 +19,5 @@ import org.apache.ibatis.annotations.Param; public interface PlanItemMapper extends BaseMapperX { - List selectGoodsList(@Param("planIds") List planIds); + List selectGoodsList(@Param("planIds") List planIds, @Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index ac228e66e..c183561a3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -19,6 +19,8 @@ import org.apache.ibatis.annotations.Mapper; import com.cf.imes.module.executor.controller.admin.plate.vo.*; import org.apache.ibatis.annotations.Param; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + /** * 生产单板件 Mapper * @@ -29,6 +31,7 @@ public interface PlateMapper extends BaseMapperX { default PageResult selectPage(PlatePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(PlateDO::getOrganId,getUserOrganId()) .eqIfPresent(PlateDO::getOrderId, reqVO.getOrderId()) .likeIfPresent(PlateDO::getName, reqVO.getName()) .eqIfPresent(PlateDO::getType, reqVO.getType()) @@ -66,22 +69,24 @@ public interface PlateMapper extends BaseMapperX { } // IPage selectPlatePage(@Param("page") IPage page, @Param("orderId")Long organId, @Param("goodsId") String goodsId); - List selectPlatePage(/*@Param("page") IPage page,*/ @Param("orderId")Long organId/*, @Param("goodsId") String goodsId*/); + List selectPlatePage(/*@Param("page") IPage page,*/ @Param("orderId")Long orderId,@Param("organId") Long organId/*, @Param("goodsId") String goodsId*/); IPage selectPlateByPlanId(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); List selectPlateList(Long planId); - IPage selectProductList(@Param("page") IPage page , @Param("orderId")Long orderId, @Param("roomId")Long roomId , @Param("bodyId")Long bodyId); - Set selectBatchOrderIdsAndGoodsIds(@Param("itemList") List itemList); + IPage selectProductList(@Param("page") IPage page , @Param("orderId")Long orderId, @Param("roomId")Long roomId , @Param("bodyId")Long bodyId,@Param("organId") Long organId); + + + Set selectBatchOrderIdsAndGoodsIds(@Param("itemList") List itemList, @Param("organId") Long organId ); // PlateDetailRespVO selectPlateNumList(PlateDetailReqVO reqVO); - List selectPlateDetialList(@Param("orderId") Long orderId); + List selectPlateDetialList(@Param("orderId") Long orderId,@Param("organId") Long organId); - List selectPlateDetialListByIds(@Param("orderIds") List orderIds); + List selectPlateDetialListByIds(@Param("orderIds") List orderIds,@Param("organId") Long organId); List selectPlateGoodsList(@Param("orderId") Long orderId, @Param("organId") Long organId); // 明细 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/processStep/ProcessStepMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/processStep/ProcessStepMapper.java index 882c5b7a5..e2a00feb7 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/processStep/ProcessStepMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/processStep/ProcessStepMapper.java @@ -11,6 +11,8 @@ import com.cf.imes.module.executor.dal.dataobject.processStep.ProcessStepDO; import org.apache.ibatis.annotations.Mapper; import com.cf.imes.module.executor.controller.admin.processStep.vo.*; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + /** * 生产单工序步骤 Mapper * @@ -22,6 +24,7 @@ public interface ProcessStepMapper extends BaseMapperX { default PageResult selectPage(ProcessStepPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(ProcessStepDO::getOrderId, reqVO.getOrderId()) + .eq(ProcessStepDO::getOrganId,getUserOrganId()) .betweenIfPresent(ProcessStepDO::getFinishTime, reqVO.getFinishTime()) .eqIfPresent(ProcessStepDO::getStatus, reqVO.getStatus()) .eqIfPresent(ProcessStepDO::getType, reqVO.getType()) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/rawgoods/RawGoodsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/rawgoods/RawGoodsMapper.java index 86da65d2c..5fe4974d0 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/rawgoods/RawGoodsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/rawgoods/RawGoodsMapper.java @@ -14,6 +14,8 @@ import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.module.executor.dal.dataobject.rawgoods.RawGoodsDO; import org.apache.ibatis.annotations.Mapper; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + /** * 生产单设计商品表 order_raw_goods_{N} Mapper * @@ -24,6 +26,7 @@ public interface RawGoodsMapper extends BaseMapperX { default PageResult selectPage(RawGoodsPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(RawGoodsDO::getOrganId,getUserOrganId()) .eqIfPresent(RawGoodsDO::getOrderId, reqVO.getOrderId()) .eqIfPresent(RawGoodsDO::getRawGoodsId, reqVO.getRawGoodsId()) .likeIfPresent(RawGoodsDO::getGoodsName, reqVO.getGoodsName()) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java index d068fcf8e..8d8bd2545 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java @@ -13,11 +13,14 @@ import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; + @Mapper public interface RemainPlateMapper extends BaseMapperX { default PageResult selectPage(RemainPlatePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(RemainPlateDO::getOrganId,getUserOrganId()) .eqIfPresent(RemainPlateDO::getPlanId, reqVO.getPlanId()) .eqIfPresent(RemainPlateDO::getInitPlanId, reqVO.getInitPlanId()) .eqIfPresent(RemainPlateDO::getStatus, reqVO.getStatus()) @@ -41,11 +44,14 @@ public interface RemainPlateMapper extends BaseMapperX { default List selectByPlanId(Long planId, Long userOrganId) { return selectList( new LambdaQueryWrapperX() - .eq(RemainPlateDO::getPlanId, planId) - .eq(RemainPlateDO::getOrganId, userOrganId)); + .eq(RemainPlateDO::getOrganId, userOrganId) + .eq(RemainPlateDO::getPlanId, planId)); + + } + // 批量修改删除状态 default int updateOrderDeleted(Collection ids, Integer deleted, Long organId) { return update(new LambdaUpdateWrapper() diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java index 44d93b599..bd7616248 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java @@ -9,6 +9,8 @@ import com.cf.imes.module.executor.service.rawgoods.RawGoodsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; @@ -47,6 +49,7 @@ public class GoodsServiceImpl implements GoodsService { private OrderMapper orderMapper; @Override + @Transactional(rollbackFor = Exception.class) public Boolean createCorrespondsGoods(List createReqVOS) { List longs = new ArrayList<>(); // 校验生产单是否存在 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index d5531c6ef..021c4cded 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -115,7 +115,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { @Override public List getPlateListByPlanId(Long planId) { - return planMapper.selectPlateListByPlanId(planId); + return planMapper.selectPlateListByPlanId(planId,getUserOrganId()); } @Override @@ -324,11 +324,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // .eq(GoodsDO::getOrderId, orderId) // ); - List goodsDOS = goodsMapper.selectGoodsList(orderId); + List goodsDOS = goodsMapper.selectGoodsList(orderId,getUserOrganId()); // PlanDO planDO = planMapper.selectByOrderId(orderId); - List plateDOS = plateMapper.selectPlateDetialList(orderId); + List plateDOS = plateMapper.selectPlateDetialList(orderId,getUserOrganId()); // 造型数据的尺寸长度 @@ -376,9 +376,9 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { // List goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX().in(GoodsDO::getOrderId, orderIds)); - List goodsDOS = goodsMapper.selectGoodsListByOrderIds(orderIds); + List goodsDOS = goodsMapper.selectGoodsListByOrderIds(orderIds,getUserOrganId()); - List plateDOS = plateMapper.selectPlateDetialListByIds(orderIds); + List plateDOS = plateMapper.selectPlateDetialListByIds(orderIds,getUserOrganId()); // 造型数据的尺寸长度 Integer orderModelSize = plateDOS.size(); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderParts/OrderPartsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderParts/OrderPartsServiceImpl.java index 13586b01d..e8239292f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderParts/OrderPartsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/orderParts/OrderPartsServiceImpl.java @@ -29,6 +29,7 @@ import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; /** @@ -108,7 +109,7 @@ public class OrderPartsServiceImpl implements OrderPartsService { @Override public PageResult getPartsPageByTerms(PlateTermsPageReqVO pageReqVO) { PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); - IPage pageRes = orderPartsMapper.selectProductList(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId()); + IPage pageRes = orderPartsMapper.selectProductList(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId(),getUserOrganId()); return new PageResult(pageRes.getRecords(), pageRes.getTotal()); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java index ea9413a5c..bbccc9fe3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plan/PlanServiceImpl.java @@ -1,6 +1,7 @@ package com.cf.imes.module.executor.service.plan; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -50,6 +51,7 @@ import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; /** @@ -104,6 +106,12 @@ public class PlanServiceImpl implements PlanService { String orderNos = itemList.stream().map(i -> i.getOrderId()).distinct().collect(Collectors.toList()).toString(); plan.setOrderNos(orderNos); planMapper.insert(plan); + + // 修改对应的生产单的状态为 生产中 + List orderIds = JSON.parseArray(orderNos).toJavaList(Long.class); + List orderDOS = orderMapper.selectBatchIds(orderIds).stream().map(m -> m.setStatus(3)).collect(Collectors.toList()); + orderMapper.updateBatch(orderDOS); + Long planId = plan.getId(); /* List orderIds = createReqVO.getOrderIds(); if (CollectionUtil.isNotEmpty(orderIds)) { @@ -119,7 +127,7 @@ public class PlanServiceImpl implements PlanService { //List plateIds = createReqVO.getPlateIds(); - Set itemIds = plateMapper.selectBatchOrderIdsAndGoodsIds(itemList); + Set itemIds = plateMapper.selectBatchOrderIdsAndGoodsIds(itemList,getUserOrganId()); if (CollectionUtil.isNotEmpty(itemIds)) { ArrayList planItemDOS = new ArrayList<>(); @@ -189,6 +197,12 @@ public class PlanServiceImpl implements PlanService { planMapper.deleteById(id); /*planOrderMapper.delete(new LambdaQueryWrapperX().eq(PlanOrderDO::getPlanId, id));*/ planItemMapper.delete(new LambdaQueryWrapperX().eq(PlanItemDO::getPlanId, id)); + + // 修改生产单的状态为待排单 + List orderIds = JSON.parseArray(planDO.getOrderNos()).toJavaList(Long.class); + List orderDOS = orderMapper.selectBatchIds(orderIds).stream().map(m -> m.setStatus(2)).collect(Collectors.toList()); + orderMapper.updateBatch(orderDOS); + return Boolean.TRUE; } @@ -211,8 +225,12 @@ public class PlanServiceImpl implements PlanService { .map(e -> e.getOrderId()) .collect(Collectors.toSet());*/ PlanRespVO respVO = BeanUtils.toBean(planDO, PlanRespVO.class); - List goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX().in(GoodsDO::getOrderId, orderIds)); - List plateDOS = plateMapper.selectList(new LambdaQueryWrapperX().in(PlateDO::getGoodsId, goodsDOS.stream().map(GoodsDO::getGoodsId).collect(Collectors.toSet()))); + List goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX() + .eq(GoodsDO::getOrganId,getUserOrganId()) + .in(GoodsDO::getOrderId, orderIds)); + List plateDOS = plateMapper.selectList(new LambdaQueryWrapperX() + .eq(PlateDO::getOrganId,getUserOrganId()) + .in(PlateDO::getGoodsId, goodsDOS.stream().map(GoodsDO::getGoodsId).collect(Collectors.toSet()))); List plateInfoVOS = goodsDOS.stream().map(e -> PlateInfoVO.builder() .material(e.getMaterial()) .width(e.getWidth()) @@ -247,7 +265,7 @@ public class PlanServiceImpl implements PlanService { // // List plateDOS = plateMapper.selectList(new LambdaQueryWrapperX().in(PlateDO::getGoodsId,longs )); - List plateInfoVOS = planItemMapper.selectGoodsList(planIds); + List plateInfoVOS = planItemMapper.selectGoodsList(planIds,getUserOrganId()); PageResult planRespVOPageResult = BeanUtils.toBean(planDOPageResult, PlanRespVO.class); @@ -290,6 +308,8 @@ public class PlanServiceImpl implements PlanService { QueryWrapperX queryWrapperX = new QueryWrapperX<>(); queryWrapperX + .eq("a.organ_id",getUserOrganId()) + .eq("a.status",2) .eqIfPresent("a.id", pageReqVO.getOrderId()) .isNull("opi.item_id") .eqIfPresent("a.customer", pageReqVO.getConsignee()) @@ -321,7 +341,7 @@ public class PlanServiceImpl implements PlanService { List records = orderRespVOCopies.getRecords(); for (OrderRespVOCopy orderRespVOCopy : records) { - List platePages = plateMapper.selectPlatePage(orderRespVOCopy.getOrderId()/*, orderRespVOCopy.getGoodsId()*/); + List platePages = plateMapper.selectPlatePage(orderRespVOCopy.getOrderId(),getUserOrganId()/*, orderRespVOCopy.getGoodsId()*/); orderRespVOCopy.setPlatePages(platePages); } @@ -345,7 +365,7 @@ public class PlanServiceImpl implements PlanService { @Override public List getNotPlanPlateListPage(PlateReqPageVO pageVO) { // PageDTO page = new PageDTO<>(pageVO.getPageNo(), pageVO.getPageSize()); - List pageRes = plateMapper.selectPlatePage(/*page, */pageVO.getOrderId()/*, pageVO.getGoodsId()*/); + List pageRes = plateMapper.selectPlatePage(/*page, */pageVO.getOrderId(),getUserOrganId()/*, pageVO.getGoodsId()*/); return pageRes; } @@ -382,7 +402,9 @@ public class PlanServiceImpl implements PlanService { if (planDO.getStatus().equals(PlanStatusEnum.NEWORDER.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.BOARDHASBEENAPPLIEDFOR.getStatus())) { throw exception(PLAN_NOT_ALLOW_CANCEL); } - Set itemIds = planItemMapper.selectList(new LambdaQueryWrapperX().eq(PlanItemDO::getPlanId, id)) + Set itemIds = planItemMapper.selectList(new LambdaQueryWrapperX() + .eq(PlanItemDO::getOrganId,getUserOrganId()) + .eq(PlanItemDO::getPlanId, id)) .stream().map(PlanItemDO::getItemId) .collect(Collectors.toSet()); plateMapper.update(new LambdaUpdateWrapper().in(PlateDO::getId, itemIds).set(PlateDO::getIsCancel, Boolean.TRUE)); @@ -405,6 +427,7 @@ public class PlanServiceImpl implements PlanService { } queryWrapperX.eq("p.plan_id", vo.getPlanId()) + .eq("a.organ_id",getUserOrganId()) .eqIfPresent("a.is_door", vo.getIsDoor()) .eqIfPresent("a.is_special_shaped", vo.getSpecialShaped()) .eqIfPresent("a.is_sculpt", vo.getSculpt()) @@ -431,6 +454,7 @@ public class PlanServiceImpl implements PlanService { MPJLambdaWrapperX lambdaWrapperX = new MPJLambdaWrapperX<>(); lambdaWrapperX.leftJoin(OrderItemDO.class, OrderItemDO::getOrderId, OrderDO::getId) .leftJoin(PlanItemDO.class, PlanItemDO::getItemId, OrderItemDO::getId) + .eq(PlanItemDO::getOrganId,getUserOrganId()) .eq(PlanItemDO::getPlanId, pageReqVO.getPlanId()); PageResult pageResult = orderMapper.selectJoinPage(pageReqVO, OrderDO.class, lambdaWrapperX); @@ -447,6 +471,7 @@ public class PlanServiceImpl implements PlanService { .selectSum(PlateDO::getArea, "area") .selectCount(PlateDO::getId, "num") .isNotNull(PlanItemDO::getId) + .eq(GoodsDO::getOrganId,getUserOrganId()) .eq(GoodsDO::getOrderId, pageVO.getOrderId()) .groupBy(GoodsDO::getId) ); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java index 5083c2a16..63637b5ef 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java @@ -53,6 +53,7 @@ import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.service.optimizeplan.OptimizePlanService.ORDER_PLATE_MODEL; import static com.cf.imes.module.system.enums.ErrorCodeConstants.PLATE_NOT_EXISTS; @@ -117,14 +118,14 @@ public class PlateServiceImpl implements PlateService { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); // 查询生产单下的大板,余料板,排单状态的信息 - PlateDetailRespVO plateDetailRespVO = orderItemMapper.selectPlateNumList(reqVO.getOrderId()); + PlateDetailRespVO plateDetailRespVO = orderItemMapper.selectPlateNumList(reqVO.getOrderId(),getUserOrganId()); // PlateDetailRespVO plateDetailRespVO = plateMapper.selectPlateNumList(reqVO); plateDetailRespVO.setCompanyId(loginUser.getId()); // PlateRespVO plateRespVO = BeanUtil.toBean(plateDetailRespVO, PlateRespVO.class); // 查询生产单下的板材详细信息 - List plateRespVOS = orderItemMapper.selectPlateList(reqVO); + List plateRespVOS = orderItemMapper.selectPlateList(reqVO,getUserOrganId()); // List plateRespVOS2 = plateRespVOS // .stream() @@ -171,6 +172,7 @@ public class PlateServiceImpl implements PlateService { } @Override + @Transactional(rollbackFor = Exception.class) public void deletePlates(Set ids) { plateMapper.deleteBatchIds(ids); } @@ -184,7 +186,7 @@ public class PlateServiceImpl implements PlateService { @Override public PageResult getPlatePageByTerms(PlateTermsPageReqVO pageReqVO) { PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); - IPage pageRes = plateMapper.selectProductList(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId()); + IPage pageRes = plateMapper.selectProductList(page, pageReqVO.getOrderId(), pageReqVO.getRoomId(), pageReqVO.getBodyId(),getUserOrganId()); return new PageResult(pageRes.getRecords(), pageRes.getTotal()); } @@ -210,6 +212,7 @@ public class PlateServiceImpl implements PlateService { List list = plateMapper.selectJoinList(BodyPlateIdDTO.class, new MPJLambdaWrapperX() .selectAs(PlateDO::getId, "plateId") .leftJoin(OrderItemDO.class, OrderItemDO::getPlateId, PlateDO::getId) + .eq(OrderItemDO::getOrganId,getUserOrganId()) .in(OrderItemDO::getBodyId, bodyIds) .select(OrderItemDO::getBodyId) ); @@ -223,9 +226,7 @@ public class PlateServiceImpl implements PlateService { List>> data = new ArrayList<>(); map.entrySet().forEach(e->{ bodyPlateDetailVOS.add(BodyPlateDetailVO.builder() - // 将造型的数据转换成 抽取后的数据结构 .orderModelList(e.getValue()) -// .orderModelList(e.getValue()) .bodyId(e.getKey()) .build() ); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java index 2fd490833..9b1bea83f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/process/OrderProcessServiceImpl.java @@ -1,6 +1,7 @@ package com.cf.imes.module.executor.service.process; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.cf.imes.framework.common.enums.ProcessProcessingTypeEnum; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO; import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO; @@ -35,6 +36,7 @@ import java.util.ArrayList; import java.util.List; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; /** @@ -104,7 +106,9 @@ public class OrderProcessServiceImpl implements OrderProcessService { .setStatus(false).setProcessinfoId(processRespDTO.getId()).setOrderProcessId(orderProcess.getId()).setFinishTime(null).setSort(INDEX++);// 计划日期没有填写 processStepDOS.add(processStepDO); // 生产单中是否存在加工组,若存在加工组,需要逐条加工组信息写入到生产单工序步骤表 + if (processRespDTO.getType() == ProcessTypeEnum.TYPE_SEVEN.getStatus()) { + List orderGroupDOS = orderGroupMapper.getOrderGroupByOrderId(createReqVO.getOrderId(), SecurityFrameworkUtils.getLoginUser().getOrganId()); if (orderGroupDOS.size() != 0) { // 有加工组 for (int i = 0; i < orderGroupDOS.size(); i++) { @@ -148,6 +152,7 @@ public class OrderProcessServiceImpl implements OrderProcessService { } @Override + @Transactional(rollbackFor = Exception.class) public void updateOrderProcess(OrderProcessSaveReqVO updateReqVO) { // 校验存在 validateOrderProcessExists(updateReqVO.getId()); @@ -157,6 +162,7 @@ public class OrderProcessServiceImpl implements OrderProcessService { } @Override + @Transactional(rollbackFor = Exception.class) public void deleteOrderProcess(Long id) { // 校验存在 validateOrderProcessExists(id); @@ -177,12 +183,12 @@ public class OrderProcessServiceImpl implements OrderProcessService { @Override public OrderProcessDO getOrderProcess(Long orderId) { - return orderProcessMapper.selectOne("order_id", orderId); + return orderProcessMapper.selectOne("order_id", orderId ,"organ_id",getUserOrganId()); } @Override public OrderProcessDO getOrderProcessByProcessGroupId(Long processGroupId) { - return orderProcessMapper.selectOne("group_id", processGroupId); + return orderProcessMapper.selectOne("group_id", processGroupId,"organ_id",getUserOrganId()); } } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/processStep/ProcessStepServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/processStep/ProcessStepServiceImpl.java index 67275153a..73e1370aa 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/processStep/ProcessStepServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/processStep/ProcessStepServiceImpl.java @@ -30,6 +30,7 @@ public class ProcessStepServiceImpl implements ProcessStepService { private ProcessStepMapper processStepMapper; @Override + @Transactional(rollbackFor = Exception.class) public Long createProcessStep(ProcessStepSaveReqVO createReqVO) { // 插入 ProcessStepDO processStep = BeanUtils.toBean(createReqVO, ProcessStepDO.class); @@ -39,6 +40,7 @@ public class ProcessStepServiceImpl implements ProcessStepService { } @Override + @Transactional(rollbackFor = Exception.class) public void updateProcessStep(ProcessStepSaveReqVO updateReqVO) { // 校验存在 validateProcessStepExists(updateReqVO.getId()); @@ -48,6 +50,7 @@ public class ProcessStepServiceImpl implements ProcessStepService { } @Override + @Transactional(rollbackFor = Exception.class) public void deleteProcessStep(Long id) { // 校验存在 validateProcessStepExists(id); diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/rawgoods/RawGoodsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/rawgoods/RawGoodsServiceImpl.java index e4731714c..112f2dc68 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/rawgoods/RawGoodsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/rawgoods/RawGoodsServiceImpl.java @@ -21,6 +21,7 @@ import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.module.executor.dal.mysql.rawgoods.RawGoodsMapper; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.system.enums.ErrorCodeConstants.RAW_GOODS_NOT_EXISTS; /** @@ -100,6 +101,6 @@ public class RawGoodsServiceImpl implements RawGoodsService { @Override public List getRawGoodsByOrder(Long orderId) { - return rawGoodsMapper.selectList(RawGoodsDO::getOrderId, orderId); + return rawGoodsMapper.selectList(RawGoodsDO::getOrderId, orderId,RawGoodsDO::getOrganId,getUserOrganId()); } } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml index 209efc6ba..b521c7cda 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/goods/GoodsMapper.xml @@ -17,8 +17,8 @@ og.*, orp.id as remainId from order_goods og - left join order_remain_plate orp on og.id = orp.goods_id - where og.order_id = #{orderId} + left join order_remain_plate orp on og.id = orp.goods_id and og.organ_id = orp.organ_id + where og.order_id = #{orderId} and og.organ_id = #{organId} @@ -31,8 +31,8 @@ og.*, orp.id as remainId from order_goods og - left join order_remain_plate orp on og.id = orp.goods_id - where og.order_id in + left join order_remain_plate orp on og.id = orp.goods_id and og.organ_id = orp.organ_id + where og.organ_id =#{organId} and og.order_id in #{id} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index 665ce3c1b..5a798746b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -4,12 +4,12 @@ + parameterType="map"> select distinct - op.*, - og.color as color, - og.material as material, - ob.name as bodyName, - ob.room_name as roomName, - oi.id as itemId, - oi.group_id as processGroupId, - og.brand as brand, - (case - when p.texture = '' then '是' - else '否' end ) as hasTexture, - og.height as bigPlateLength, - og.width as bigPlateWidth, - og.spec as spec + op.*, + og.color as color, + og.material as material, + ob.name as bodyName, + ob.room_name as roomName, + oi.id as itemId, + oi.group_id as processGroupId, + og.brand as brand, + (case + when p.texture = '' then '是' + else '否' end ) as hasTexture, + og.height as bigPlateLength, + og.width as bigPlateWidth, + og.spec as spec from order_item oi - join order_plate op on oi.plate_id = op.id - join order_body ob on oi.body_id = ob.id - join order_goods og on op.goods_id = og.id - join plate p on og.goods_id = p.id + join order_plate op on oi.plate_id = op.id and oi.organ_id = op.organ_id + join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id + join order_goods og on op.goods_id = og.id and op.organ_id = og.organ_id + join plate p on og.goods_id = p.id and og.organ_id = p.organ_id - - - AND oi.order_id = #{orderId} + oi.organ_id = #{organId} + + AND oi.order_id = #{reqVO.orderId} - - AND oi.body_id = #{bodyId} + + AND oi.body_id = #{reqVO.bodyId} - - AND oi.plate_id = #{plateId} + + AND oi.plate_id = #{reqVO.plateId} @@ -126,11 +126,11 @@ op.status as planStatus, sum(orp.count )as remainPlateNum from order_item oi - join order_plan_item opi on oi.id = opi.item_id - join order_plan op on opi.plan_id = op.id - left join order_remain_plate orp on orp.plan_id = op.id - join order_goods og on oi.order_id = og.order_id - where oi.order_id = #{orderId} + join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id + join order_plan op on opi.plan_id = op.id and opi.organ_id = op.organ_id + left join order_remain_plate orp on orp.plan_id = op.id and orp.organ_id = op.organ_id + join order_goods og on oi.order_id = og.order_id and oi.organ_id = og.organ_id + where oi.organ_id = #{organId} and oi.order_id = #{orderId} group by planStatus; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml index 2a6efb8e2..98f6fa0ce 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml @@ -7,8 +7,8 @@ SELECT a.id, a.goods_id, a.name, a.material, a.type, a.model, a.spec, a.brand, a.factory, a.unit, a.price, a.is_composite, a.remark, b.num FROM order_parts a - LEFT JOIN order_item b ON a.id = b.parts_id - WHERE b.order_id = #{orderId} + LEFT JOIN order_item b ON a.id = b.parts_id and a.organ_id = b.organ_id + WHERE b.organ_id =#{organId} and b.order_id = #{orderId} AND (#{roomId} IS NULL OR b.room_id = #{roomId}) AND (#{bodyId} IS NULL OR b.body_id = #{bodyId}) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml index 3dc647fc5..20157c759 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plan/PlanMapper.xml @@ -108,14 +108,16 @@ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml index 8ba41281b..c709c7fe1 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/planitem/PlanItemMapper.xml @@ -14,21 +14,25 @@ - - select og.material as material, - og.width as width, - og.height as height, - og.thickness as thickness , - og.color as color, - count(oi.plate_id) as plateNum, - ROUND(og.height * og.width , 2) as area + select distinct + og.material as material, + og.width as width, + og.height as height, + og.thickness as thickness , + og.color as color, + count(oi.plate_id) as plateNum, + ROUND(og.height * og.width , 2) as area + from order_plan_item opi - join order_item oi on opi.item_id = oi.id - join order_goods og on oi.order_id = og.order_id + join order_item oi on opi.item_id = oi.id and opi.organ_id = oi.organ_id + join order_goods og on oi.order_id = og.order_id and oi.organ_id = og.organ_id - where opi.plan_id in + where opi.organ_id = #{organId} + and + opi.plan_id in #{ids} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index 5d0b4856c..9d4a96aba 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -10,12 +10,13 @@ c.goods_name, c.material, c.color, a.goods_id,oi.num,a.is_special_shaped as specialShaped,a.is_sculpt as profiling from order_plate a - LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id - LEFT JOIN `order` b on a.order_id = b.id - LEFT JOIN order_goods c on a.goods_id = c.id - left join order_plan_item opi on oi.id = opi.item_id + LEFT JOIN order_item oi on a.id = oi.plate_id and a.order_id = oi.order_id and a.organ_id = oi.organ_id + LEFT JOIN `order` b on a.order_id = b.id and a.organ_id = b.organ_id + LEFT JOIN order_goods c on a.goods_id = c.id and a.organ_id = c.organ_id + left join order_plan_item opi on oi.id = opi.item_id and oi.organ_id = opi.organ_id - a.is_cancel = 0 + a.organ_id = #{organId} + and a.is_cancel = 0 and opi.item_id is null and a.order_id = #{orderId} @@ -30,9 +31,9 @@ resultType="com.cf.imes.module.executor.controller.admin.plan.vo.PlateResList"> select a.order_id, a.plate_no , a.name as plateName,a.is_special_shaped,a.is_sculpt, e.material, e.color, e.width, e.height, e.thickness, b.room_id, b.body_id from order_plate a - LEFT JOIN order_item b ON a.id = b.plate_id AND a.order_id = b.order_id - LEFT JOIN order_goods e ON e.id = a.goods_id AND e.order_id = a.order_id - LEFT JOIN order_plan_item p ON b.id = p.item_id + LEFT JOIN order_item b ON a.id = b.plate_id AND a.order_id = b.order_id and a.organ_id = b.organ_id + LEFT JOIN order_goods e ON e.id = a.goods_id AND e.order_id = a.order_id and e.organ_id = a.organ_id + LEFT JOIN order_plan_item p ON b.id = p.item_id and b.organ_id = p.organ_id ${ew.customSqlSegment} @@ -53,9 +54,9 @@ a.seal_up, a.seal_down, a.texture, a.hole_face, a.hole_arrange, a.unregular_point_count, a.front_hole_count, a.back_hole_count, a.side_hole_count, a.front_model_count, a.back_model_count, a.remark, c.material, c.color FROM order_plate a - LEFT JOIN order_goods c ON a.goods_id = c.goods_id AND a.order_id = c.order_id - LEFT JOIN order_item b ON a.id = b.plate_id - WHERE b.order_id = #{orderId} + LEFT JOIN order_goods c ON a.goods_id = c.id AND a.order_id = c.order_id and a.organ_id = c.organ_id + LEFT JOIN order_item b ON a.id = b.plate_id and a.organ_id = b.organ_id + WHERE b.organ_id = #{organId} and b.order_id = #{orderId} AND (#{roomId} IS NULL OR b.room_id = #{roomId}) AND (#{bodyId} IS NULL OR b.body_id = #{bodyId}) GROUP BY a.id, c.material, c.color; @@ -63,8 +64,8 @@ @@ -162,12 +163,12 @@ og.name as processGroupName, CASE WHEN op.unregular_point_count = 0 and op.front_hole_count = 0 and op.back_hole_count = 0 and op.side_hole_count = 0 THEN false ELSE true END AS hasHole from order_plate op - left join order_goods ogs on op.goods_id = ogs.id - join order_item oi on op.id = oi.plate_id - join order_body ob on oi.body_id = ob.id - left join order_group og on oi.group_id = og.id + left join order_goods ogs on op.goods_id = ogs.id and op.organ_id = ogs.organ_id + join order_item oi on op.id = oi.plate_id and op.organ_id = oi.organ_id + join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id + left join order_group og on oi.group_id = og.id = oi.organ_id = og.organ_id - where op.order_id in + where op.organ_id = #{organId} and op.order_id in diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/process/ProductionProcessController.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/process/ProductionProcessController.java index 224c62f0b..720125aaa 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/process/ProductionProcessController.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/process/ProductionProcessController.java @@ -7,11 +7,9 @@ import com.cf.imes.module.manage.controller.admin.process.vo.*; import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderModuleVO; import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderPlateRespVO; import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.PlatePageVO; -import com.cf.imes.module.manage.dal.dataobject.process.ProcessDO; import com.cf.imes.module.manage.service.process.ProductionProcessService; import com.cf.imes.module.manage.service.query.ProductionStatusService; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -39,18 +37,6 @@ public class ProductionProcessController { - @GetMapping("/select") - @Operation(summary = "查看当前登录用户的组织的工序信息") - @Parameter(name = "userId", description = "当前登录的用户ID", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('manage:process:select')") - public CommonResult> getUserPage(@Valid @RequestParam("userId") Long userId) { - - return success(productionProcessService.getProcess(userId)); - - - } - - @GetMapping("/page") @Operation(summary = "查看生产工序分页") diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/process/ProcessDO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/process/ProcessDO.java deleted file mode 100644 index e99f6b65e..000000000 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/process/ProcessDO.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.cf.imes.module.manage.dal.dataobject.process; - - -import com.baomidou.mybatisplus.annotation.*; -import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; -import lombok.*; - -@TableName("imes_base.process") -@KeySequence("process_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProcessDO extends BaseDO { - - /** - * 工序 ID - */ - @TableId - private Long id; - /** - * 工序名称 - */ - private String name; - /** - * 计件工资 - */ - private Double pieceRate; - /** - * 计件类型:1 数量 2 长度 3 平方 4 宽 5 高 6 体积 7 生产单金额百分比 - */ - private Integer pieceType; - /** - * 工序类型:0 全部加工 1 开料 2 部件加工 3 异形封边 4 分堆 5 打包 6 出库 7 组件加工 8 板材 - */ - private Integer type; - /** - * 是否推送终端客户:0 否 1 是 - */ - private Boolean isCustom; - /** - * 是否推送经销商:0 否 1 是 - */ - private Boolean isDealer; - /** - * 排序优先级 - */ - private Short sort; - /** - * 小时产量 - */ - private Double hourCapacity; - /** - * 单位 - */ - private String unit; - /** - * 是否启用:0 否 1 是 - */ - private Boolean isEnabled; - /** - * 准备时间 - */ - private Double prepareTime; - /** - * 描述 - */ - private String description; - - /** - * 组织id - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long organId; -} \ No newline at end of file diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/process/ProcessUserDO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/process/ProcessUserDO.java deleted file mode 100644 index 60328a078..000000000 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/dataobject/process/ProcessUserDO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.cf.imes.module.manage.dal.dataobject.process; - - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -@TableName("imes_base.process_user") -@Data -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ProcessUserDO { - - /** - * 工序 ID - */ - @TableId - private Long organId; - - /** - * 工序ID - */ - private Long processId; - /** - * 用户ID - */ - private Long userId; - - -} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/process/ProcessMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/process/ProcessMapper.java deleted file mode 100644 index 5239876a2..000000000 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/process/ProcessMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.cf.imes.module.manage.dal.mysql.process; - - -import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; -import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.cf.imes.framework.mybatis.core.query.MPJLambdaWrapperX; -import com.cf.imes.module.manage.controller.admin.process.vo.UserProcessRespVO; -import com.cf.imes.module.manage.dal.dataobject.process.ProcessDO; -import com.cf.imes.module.manage.dal.dataobject.process.ProcessUserDO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Update; - -import java.util.List; - -/** - * 生产单工序表 order_process_{N} Mapper - * - * @author 晨丰科技 - */ -@Mapper -public interface ProcessMapper extends BaseMapperX { - - - default List selectProcessList(Long organId,Long userId) { - return selectJoinList(ProcessDO.class, new MPJLambdaWrapperX() - .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)); - - - } -} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/process/ProcessUserMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/process/ProcessUserMapper.java deleted file mode 100644 index aafaf9137..000000000 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/process/ProcessUserMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.cf.imes.module.manage.dal.mysql.process; - - -import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; -import com.cf.imes.module.manage.dal.dataobject.process.ProcessUserDO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface ProcessUserMapper extends BaseMapperX { - - -} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java index f13acc38d..43125e88a 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java @@ -37,6 +37,7 @@ import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; +import static com.cf.imes.module.manage.util.search.SearchUtil.insertSeparator; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; @Service @@ -64,11 +65,18 @@ public class PackServiceImpl implements PackService { @Override public PageResult getPackPage(PackPageReqVO pageReqVO) { + pageReqVO.setCustomer(insertSeparator(pageReqVO.getCustomer())); + pageReqVO.setCustomOrderNo(insertSeparator(pageReqVO.getCustomOrderNo())); + pageReqVO.setAddress(insertSeparator(pageReqVO.getAddress())); + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); // 根据生产状态查询生产单号 List collect = productionStatusMapper.selectPackPage(pageReqVO,getUserOrganId()).stream().map(OrderDO::getId).collect(Collectors.toList()); + if(collect.isEmpty()){ + return null; + } // 查询打包首页分页数据信息,包裹数,板件数量信息 IPage packRespVOS = productionStatusMapper.selectOrderPlate(page,collect,getUserOrganId()); diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessService.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessService.java index 2fd03142c..e7bc9edba 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessService.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessService.java @@ -4,15 +4,12 @@ package com.cf.imes.module.manage.service.process; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.manage.controller.admin.process.vo.*; import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderModuleVO; -import com.cf.imes.module.manage.dal.dataobject.process.ProcessDO; import java.util.List; public interface ProductionProcessService { - // 查看组织的工序信息 - List getProcess(Long userId); // 生产工序单分页查询 diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessServiceImpl.java index 21bc7003c..fc261853f 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/process/ProductionProcessServiceImpl.java @@ -1,50 +1,34 @@ package com.cf.imes.module.manage.service.process; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.cf.imes.framework.common.enums.ProcessProcessingTypeEnum; import com.cf.imes.framework.common.enums.ProcessingStatusEnum; -import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.framework.organ.core.context.OrganContextHolder; -import com.cf.imes.module.manage.config.VocieParameters; -import com.cf.imes.module.manage.controller.admin.pack.vo.PackRespVO; import com.cf.imes.module.manage.controller.admin.process.vo.*; import com.cf.imes.module.manage.controller.admin.query.vo.productionStatus.OrderModuleVO; import com.cf.imes.module.manage.dal.dataobject.pack.OrderBodyDO; import com.cf.imes.module.manage.dal.dataobject.process.OrderProcessStepItemNDO; -import com.cf.imes.module.manage.dal.dataobject.process.OrderProcessStepNDO; -import com.cf.imes.module.manage.dal.dataobject.process.ProcessDO; -import com.cf.imes.module.manage.dal.dataobject.query.OrderItemDO; import com.cf.imes.module.manage.dal.mysql.pack.OrderBodyMapper; import com.cf.imes.module.manage.dal.mysql.plate.OrderPlateMapper; import com.cf.imes.module.manage.dal.mysql.process.*; import com.cf.imes.module.manage.dal.mysql.query.OrderItemMapper; -import com.cf.imes.module.manage.util.page.PageHelperUtil; import com.cf.imes.module.system.enums.ErrorCodeConstants; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.io.IOException; import java.util.*; import java.util.stream.Collectors; -import static com.baomidou.mybatisplus.core.toolkit.Wrappers.update; -import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; +import static com.cf.imes.module.manage.util.search.SearchUtil.insertSeparator; /** @@ -65,8 +49,7 @@ public class ProductionProcessServiceImpl implements ProductionProcessService { @Resource private ProcessStepItemMapper processStepItemMapper; - @Resource - private ProcessMapper processMapper; + @Resource @@ -81,15 +64,6 @@ public class ProductionProcessServiceImpl implements ProductionProcessService { - // 查看组织的工序信息 - @Override - public List getProcess(Long userId) { - - // 获取组织id - Long organId = OrganContextHolder.getOrganId(); - return processMapper.selectProcessList(organId,userId); - - } @@ -97,6 +71,11 @@ public class ProductionProcessServiceImpl implements ProductionProcessService { @Override public PageResult getProcessPage(ProcessPageReqVO pageReqVO) { + + pageReqVO.setCustomer(insertSeparator(pageReqVO.getCustomer())); + pageReqVO.setCustomOrderNo(insertSeparator(pageReqVO.getCustomOrderNo())); + pageReqVO.setAddress(insertSeparator(pageReqVO.getAddress())); + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); IPage processRespVOS = processStepMapper.selectOrder(page,pageReqVO,getUserOrganId()); @@ -120,6 +99,9 @@ public class ProductionProcessServiceImpl implements ProductionProcessService { + + + // 修改工序明细表的工序状态 @Override @Transactional(rollbackFor = Exception.class) diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/util/search/SearchUtil.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/util/search/SearchUtil.java new file mode 100644 index 000000000..2730825d8 --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/util/search/SearchUtil.java @@ -0,0 +1,42 @@ +package com.cf.imes.module.manage.util.search; + + + + +/** + * 模糊搜索 工具类 + * + * @author 晨丰科技 + */ +public class SearchUtil { + + /** + * 拼接需要模糊搜索的字符串 + * + * + */ + public static String insertSeparator(String input) { + // 如果输入字符串为空,直接返回空字符串 + if (input == null || input.isEmpty()) { + return input; + } + + // 使用StringBuilder进行字符串拼接 + StringBuilder result = new StringBuilder(); + + // 遍历输入字符串的每个字符 + for (int i = 0; i < input.length(); i++) { + result.append(input.charAt(i)); + // 如果不是最后一个字符,添加分隔符 + if (i < input.length() - 1) { + result.append("%"); + } + } + + // 返回拼接后的字符串 + return result.toString(); + } + + + +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/ProcessStepMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/ProcessStepMapper.xml index ee143a842..7b4cd8322 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/ProcessStepMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/process/ProcessStepMapper.xml @@ -60,10 +60,10 @@ and opsi.status = #{pageReqVO.processStatus} - and o.id = #{pageReqVO.orderId} + and ops.order_id = #{pageReqVO.orderId} - and o.custom_order_no = #{pageReqVO.customOrderNo} + and o.custom_order_no like concat('%', #{pageReqVO.customOrderNo},'%') and o.customer like concat('%',#{pageReqVO.customer},'%') @@ -153,11 +153,11 @@ ops.status as status, ops.manager as manager, ops.finish_time as processDate, - opsi.group_name as groupName, + op.name as groupName, ops.sort from order_process_step ops - join order_process_step_item opsi on ops.id = opsi.process_step_id and ops.organ_id = opsi.organ_id + join order_process op on ops.order_process_id = op.id and ops.organ_id = op.organ_id where ops.order_id = #{orderNo} and ops.organ_id = #{organId} order by ops.sort ; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java index fb59806ce..01bfaba21 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java @@ -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> getUserPage(@Valid @RequestParam("userId") Long userId) { + + return success(processService.getUserProcess(userId)); + + + } + + + + + + } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java index 6bb522ceb..486b92c2c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java @@ -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 { @@ -28,7 +26,7 @@ public interface RoleMapper extends BaseMapperX { //如果是超级管理员并且未传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 { .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) .betweenIfPresent(RoleDO::getCreateTime, reqVO.getCreateTime()) .ne(RoleDO::getId, 1) - .orderByDesc(RoleDO::getId); + .orderByAsc(RoleDO::getSort); return selectPage(reqVO, lambdaQueryWrapperX); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java index 96bdb7216..0a27bc80e 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java @@ -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 { } int deleteById(@Param("id") Long id); + + default List selectProcessList(Long organId,Long userId) { + return selectJoinList(ProcessDO.class, new MPJLambdaWrapperX() + .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)); + + + } } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisRefreshChannelTopicConstants.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisRefreshChannelTopicConstants.java new file mode 100644 index 000000000..89b2dd743 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/RedisRefreshChannelTopicConstants.java @@ -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"; +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/listener/SystemPremissionRefreshRedisListener.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/listener/SystemPremissionRefreshRedisListener.java new file mode 100644 index 000000000..a16cb6023 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/redis/listener/SystemPremissionRefreshRedisListener.java @@ -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(); + } +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java index e2fa178e3..254144e90 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -51,8 +51,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { @Transactional public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List 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 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 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(); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java index 13713855c..f58486c80 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java @@ -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 diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java index 97117a5a5..c053feb95 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessService.java @@ -67,4 +67,5 @@ public interface ProcessService { */ List getAllProcess(); + List getUserProcess(Long userId); } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java index 8edf51ae3..8538521fb 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java @@ -189,4 +189,13 @@ public class ProcessServiceImpl implements ProcessService { } + @Override + public List getUserProcess(Long userId) { + + // 获取组织id + Long organId = OrganContextHolder.getOrganId(); + return processMapper.selectProcessList(organId,userId); + } + + } \ No newline at end of file