From 6fa63a7f3ef0e0981fa7906f3ca1c58860f3bd64 Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Fri, 19 Jul 2024 15:55:40 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/impl/UserReportNormalServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/user/impl/UserReportNormalServiceImpl.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/user/impl/UserReportNormalServiceImpl.java index d9fabedfe..e0e96278c 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/user/impl/UserReportNormalServiceImpl.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/user/impl/UserReportNormalServiceImpl.java @@ -67,7 +67,7 @@ public class UserReportNormalServiceImpl extends ServiceImpl collect = list.stream().filter(x -> Objects.equals(x.getStatus(), BpmTaskStatusEnum.APPROVE.getStatus())) + List collect = list.stream().filter(x -> !Objects.equals(x.getStatus(), BpmTaskStatusEnum.APPROVE.getStatus())) .map(UserReportNormalPO::getId) .collect(Collectors.toList()); if(CollUtil.isNotEmpty(collect)){ From ec051827ac5499d698ef284b9068f07e2e6ba015 Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Mon, 22 Jul 2024 13:53:04 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B2=B3=E5=8C=97=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E6=B5=8B=E8=AF=84=E6=95=B4=E6=94=B9=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../njcn/auth/controller/AuthController.java | 30 ++++++--- .../java/com/njcn/auth/utils/AuthPubUtil.java | 16 ++++- .../njcn/web/service/impl/LogServiceImpl.java | 20 +++--- .../gateway/config/ResourceServerConfig.java | 63 ++++++++++++++++++- .../gateway/utils/WebFluxRequestUtil.java | 52 +++++++++++++++ pqs-gateway/src/main/resources/bootstrap.yml | 16 ++--- .../njcn/system/pojo/param/AuditParam.java | 3 + .../njcn/system/pojo/param/ConfigParam.java | 4 +- .../system/service/impl/AuditServiceImpl.java | 62 +++++++++++------- .../user/pojo/param/PassWordRuleParam.java | 26 +++++--- .../com/njcn/user/pojo/po/UserStrategy.java | 2 + .../user/controller/FunctionController.java | 2 +- .../controller/PassWordRuleController.java | 2 +- .../njcn/user/controller/UserController.java | 4 +- .../service/impl/PassWordRuleServiceImpl.java | 28 +++++---- 15 files changed, 254 insertions(+), 76 deletions(-) create mode 100644 pqs-gateway/src/main/java/com/njcn/gateway/utils/WebFluxRequestUtil.java diff --git a/pqs-auth/src/main/java/com/njcn/auth/controller/AuthController.java b/pqs-auth/src/main/java/com/njcn/auth/controller/AuthController.java index 0e9cdff20..6d5bca43e 100644 --- a/pqs-auth/src/main/java/com/njcn/auth/controller/AuthController.java +++ b/pqs-auth/src/main/java/com/njcn/auth/controller/AuthController.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import com.nimbusds.jose.jwk.JWKSet; import com.nimbusds.jose.jwk.RSAKey; import com.njcn.auth.service.UserTokenService; +import com.njcn.auth.utils.AuthPubUtil; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.constant.OperateType; import com.njcn.common.pojo.constant.SecurityConstants; @@ -47,6 +48,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * @author hongawen @@ -73,7 +75,7 @@ public class AuthController extends BaseController { @ApiIgnore - @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.AUTHENTICATE) + @OperateInfo(info = LogEnum.SYSTEM_SERIOUS, operateType = OperateType.AUTHENTICATE) @ApiOperation("登录认证") @ApiImplicitParams({ @ApiImplicitParam(name = SecurityConstants.GRANT_TYPE, defaultValue = "password", value = "授权模式", required = true), @@ -90,14 +92,7 @@ public class AuthController extends BaseController { public Object postAccessToken(@ApiIgnore Principal principal, @RequestParam @ApiIgnore Map parameters) throws HttpRequestMethodNotSupportedException { String methodDescribe = getMethodDescribe("postAccessToken"); String username = parameters.get(SecurityConstants.USERNAME); - UserStrategy data = passWordRuleFeugnClient.getUserStrategy().getData(); - String onlineUserKey = SecurityConstants.TOKEN_ONLINE_PREFIX; - List onLineUser = (List) redisUtil.getLikeListAllValues(onlineUserKey); - Integer maxNum = data.getMaxNum(); - if((CollectionUtil.isNotEmpty(onLineUser)?onLineUser.size():0)>=maxNum){ - throw new BusinessException(UserResponseEnum.LOGIN_USER_OVERLIMIT); - } String grantType = parameters.get(SecurityConstants.GRANT_TYPE); if (grantType.equalsIgnoreCase(SecurityConstants.GRANT_CAPTCHA) || grantType.equalsIgnoreCase(SecurityConstants.REFRESH_TOKEN_KEY)) { @@ -106,6 +101,24 @@ public class AuthController extends BaseController { //短信方式登录,将手机号赋值为用户名 username = parameters.get(SecurityConstants.PHONE); } + + UserStrategy data = passWordRuleFeugnClient.getUserStrategy().getData(); + String onlineUserKey = SecurityConstants.TOKEN_ONLINE_PREFIX; + List onLineUser = (List) redisUtil.getLikeListAllValues(onlineUserKey); + if(CollectionUtil.isNotEmpty(onLineUser)){ + String finalUsername = username; + onLineUser = onLineUser.stream().filter(item->{ + String login = AuthPubUtil.getLoginByToken(item.getRefreshToken()); + return !login.equals(finalUsername); + }).collect(Collectors.toList()); + } + + Integer maxNum = data.getMaxNum(); + if((CollectionUtil.isNotEmpty(onLineUser)?onLineUser.size():0)>=maxNum){ + throw new BusinessException(UserResponseEnum.LOGIN_USER_OVERLIMIT); + } + + if (grantType.equalsIgnoreCase(SecurityConstants.REFRESH_TOKEN_KEY)) { //如果是刷新token,需要去黑名单校验 userTokenService.judgeRefreshToken(parameters.get(SecurityConstants.REFRESH_TOKEN_KEY)); @@ -125,6 +138,7 @@ public class AuthController extends BaseController { } } + @OperateInfo(info = LogEnum.SYSTEM_SERIOUS, operateType = OperateType.LOGOUT) @ApiOperation("用户登出系统") @DeleteMapping("/logout") public HttpResult logout() { diff --git a/pqs-auth/src/main/java/com/njcn/auth/utils/AuthPubUtil.java b/pqs-auth/src/main/java/com/njcn/auth/utils/AuthPubUtil.java index 3b59ed0db..ccecd44e7 100644 --- a/pqs-auth/src/main/java/com/njcn/auth/utils/AuthPubUtil.java +++ b/pqs-auth/src/main/java/com/njcn/auth/utils/AuthPubUtil.java @@ -1,9 +1,12 @@ package com.njcn.auth.utils; import cn.hutool.core.util.RandomUtil; -import okhttp3.*; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.nimbusds.jose.JWSObject; +import com.njcn.common.pojo.constant.SecurityConstants; +import lombok.SneakyThrows; -import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -28,4 +31,13 @@ public class AuthPubUtil { return String.join("", textList); } + + @SneakyThrows + public static String getLoginByToken(String token){ + JWSObject jwsObject = JWSObject.parse(token); + String payload = jwsObject.getPayload().toString(); + JSONObject jsonObject = JSONUtil.parseObj(payload); + return jsonObject.getStr(SecurityConstants.USER_NAME_KEY); + } + } diff --git a/pqs-common/common-web/src/main/java/com/njcn/web/service/impl/LogServiceImpl.java b/pqs-common/common-web/src/main/java/com/njcn/web/service/impl/LogServiceImpl.java index 93f31a407..1c3b2339a 100644 --- a/pqs-common/common-web/src/main/java/com/njcn/web/service/impl/LogServiceImpl.java +++ b/pqs-common/common-web/src/main/java/com/njcn/web/service/impl/LogServiceImpl.java @@ -84,10 +84,12 @@ public class LogServiceImpl implements ILogService { publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false); //推送审计消息功能 if(severity!=0){ - publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); - //发送邮箱功能 - if(severity==2&&logInfoDTO.getResult()==0){ - publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false); + if(!logInfoDTO.getLoginName().equals(LogInfo.UNKNOWN_USER)){ + publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); + //发送邮箱功能 + if(severity==2&&logInfoDTO.getResult()==0){ + //publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false); + } } } //如果存在设备日志注解,则记录设备日志 @@ -167,10 +169,12 @@ public class LogServiceImpl implements ILogService { private void auditPush(Integer severity, LogInfoDTO logInfoDTO) { //推送审计消息功能 if(severity !=0){ - publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); - //发送邮箱功能 - if(severity ==2&& logInfoDTO.getResult()==0){ - publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false); + if(!logInfoDTO.getLoginName().equals(LogInfo.UNKNOWN_USER)) { + publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); + //发送邮箱功能 + if (severity == 2 && logInfoDTO.getResult() == 0) { + //publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false); + } } } } diff --git a/pqs-gateway/src/main/java/com/njcn/gateway/config/ResourceServerConfig.java b/pqs-gateway/src/main/java/com/njcn/gateway/config/ResourceServerConfig.java index 267b9ab49..b02a7d019 100644 --- a/pqs-gateway/src/main/java/com/njcn/gateway/config/ResourceServerConfig.java +++ b/pqs-gateway/src/main/java/com/njcn/gateway/config/ResourceServerConfig.java @@ -3,10 +3,17 @@ package com.njcn.gateway.config; import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; +import cn.hutool.json.JSONObject; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; +import com.github.tocrhz.mqtt.publisher.MqttPublisher; +import com.njcn.common.pojo.constant.LogInfo; import com.njcn.common.pojo.constant.SecurityConstants; +import com.njcn.common.pojo.dto.LogInfoDTO; +import com.njcn.common.utils.PubUtils; import com.njcn.gateway.enums.GateWayEnum; import com.njcn.gateway.security.AuthorizationManager; import com.njcn.gateway.utils.ResponseUtils; +import com.njcn.gateway.utils.WebFluxRequestUtil; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.springframework.context.annotation.Bean; @@ -14,6 +21,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; @@ -30,6 +38,8 @@ import java.io.InputStream; import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.X509EncodedKeySpec; +import java.time.LocalDateTime; +import java.util.Objects; /** * @author hongawen @@ -44,6 +54,8 @@ public class ResourceServerConfig { private final WhiteListConfig whiteListConfig; + private final MqttPublisher publisher; + @Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { @@ -75,7 +87,31 @@ public class ResourceServerConfig { @Bean ServerAccessDeniedHandler accessDeniedHandler() { return (exchange, denied) -> Mono.defer(() -> Mono.just(exchange.getResponse())) - .flatMap(response -> ResponseUtils.writeErrorInfo(response, GateWayEnum.NO_AUTHORIZATION)); + .flatMap(response -> { + ServerHttpRequest request = exchange.getRequest(); + JSONObject jsonObject = WebFluxRequestUtil.getJwtPayload(request); + String loginName = jsonObject.get("user_name").toString(); + String userName = jsonObject.get("nickname").toString(); + String userIndex = jsonObject.get("userIndex").toString(); + String ip = WebFluxRequestUtil.getRealIp(request); + LogInfoDTO logInfoDTO = new LogInfoDTO( + loginName, + userName, + ip, + "越权访问", + "越权访问", + 0, + "当前用户无该接口访问权限:"+request.getPath().toString(), + 2, + 1, + "", + userIndex, + LocalDateTime.now() + ); + publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false); + publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); + return ResponseUtils.writeErrorInfo(response, GateWayEnum.NO_AUTHORIZATION); + }); } /** @@ -84,7 +120,30 @@ public class ResourceServerConfig { @Bean ServerAuthenticationEntryPoint authenticationEntryPoint() { return (exchange, e) -> Mono.defer(() -> Mono.just(exchange.getResponse())) - .flatMap(response -> ResponseUtils.writeErrorInfo(response, GateWayEnum.ACCESS_TOKEN_EXPIRE_JWT)); + .flatMap(response -> { + ServerHttpRequest request = exchange.getRequest(); + JSONObject jsonObject = WebFluxRequestUtil.getJwtPayload(request); + if(Objects.isNull(jsonObject)){ + String ip = WebFluxRequestUtil.getRealIp(request); + LogInfoDTO logInfoDTO = new LogInfoDTO( + ip, + ip, + ip, + "越权访问", + "越权访问", + 0, + "异常token访问:"+request.getPath().toString(), + 2, + 1, + "", + ip, + LocalDateTime.now() + ); + publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false); + publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); + } + return ResponseUtils.writeErrorInfo(response, GateWayEnum.ACCESS_TOKEN_EXPIRE_JWT); + }); } /** diff --git a/pqs-gateway/src/main/java/com/njcn/gateway/utils/WebFluxRequestUtil.java b/pqs-gateway/src/main/java/com/njcn/gateway/utils/WebFluxRequestUtil.java new file mode 100644 index 000000000..e55927837 --- /dev/null +++ b/pqs-gateway/src/main/java/com/njcn/gateway/utils/WebFluxRequestUtil.java @@ -0,0 +1,52 @@ +package com.njcn.gateway.utils; + + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.nimbusds.jose.JWSObject; +import com.njcn.common.pojo.constant.LogInfo; +import com.njcn.common.pojo.constant.SecurityConstants; +import lombok.extern.slf4j.Slf4j; + +import org.apache.logging.log4j.util.Strings; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.reactive.ServerHttpRequest; + + +@Slf4j +public class WebFluxRequestUtil { + + /** + * HttpServletRequest获取头中存储的IP地址 + */ + public static String getRealIp(ServerHttpRequest request) { + String ip = request.getURI().getHost(); + return StrUtil.isBlank(ip) ? LogInfo.UNKNOWN_IP : ip; + } + + + + + /** + * ServerHttpRequest获取在网关中存储的用户token元信息 + */ + public static JSONObject getJwtPayload(ServerHttpRequest request) { + JSONObject jsonObject = null; + HttpHeaders headers = request.getHeaders(); + try { + if (CollectionUtil.isNotEmpty(headers.get("authorization"))) { + String token = headers.get("authorization").get(0); + token = token.replace(SecurityConstants.AUTHORIZATION_PREFIX, Strings.EMPTY); + JWSObject jwsObject = JWSObject.parse(token); + String payload = jwsObject.getPayload().toString(); + jsonObject = JSONUtil.parseObj(payload); + } + } catch (Exception e) { + log.error("解码网关中心传递的请求头中内容异常,异常为:{}", e.getMessage()); + e.printStackTrace(); + } + return jsonObject; + } +} diff --git a/pqs-gateway/src/main/resources/bootstrap.yml b/pqs-gateway/src/main/resources/bootstrap.yml index f2e7966c3..d01064dc1 100644 --- a/pqs-gateway/src/main/resources/bootstrap.yml +++ b/pqs-gateway/src/main/resources/bootstrap.yml @@ -224,20 +224,20 @@ whitelist: - /system-boot/dictType/dictDataCache - /system-boot/file/** - /system-boot/area/** - - /advance-boot/** - - /device-boot/** + #- /advance-boot/** + #- /device-boot/** #- /system-boot/** #- /harmonic-boot/** #- /energy-boot/** #- /event-boot/** #- /quality-boot/** #- /harmonic-prepare/** - - /process-boot/** - - /bpm-boot/** - - /system-boot/** - - /supervision-boot/** - - /user-boot/** - - /harmonic-boot/** + #- /process-boot/** + #- /bpm-boot/** + #- /system-boot/** + #- /supervision-boot/** + #- /user-boot/** + #- /harmonic-boot/** - /user-boot/user/listAllUserByDeptId - /IndexAnalysis/** mqtt: diff --git a/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/AuditParam.java b/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/AuditParam.java index f3f13ab3b..f257ad71c 100644 --- a/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/AuditParam.java +++ b/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/AuditParam.java @@ -33,6 +33,9 @@ public class AuditParam { @ApiModelProperty("操作类型") private String operateType; + @ApiModelProperty("结果") + private Integer result; + @ApiModelProperty("页码") @NotNull(message = "页码不可为空") @Range(min = 1,message = "页码必须大于0") diff --git a/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/ConfigParam.java b/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/ConfigParam.java index ad012b707..44fafdbac 100644 --- a/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/ConfigParam.java +++ b/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/ConfigParam.java @@ -37,11 +37,11 @@ public class ConfigParam { */ @ApiModelProperty("审计日志大小(MB)") @NotNull(message = "审计日志大小不可为空") - @Min(value = 0,message = "审计日志大小不能小于0") + @Min(value = 1024,message = "审计日志大小不能小于1024M") private BigDecimal logSize; /** - * 审计日志大小 + * 审计日志保留时间 */ @ApiModelProperty("审计日志存储时间(1-6个月,默认3个月)") @Min(value = 1,message = "审计日志保留时间不能小于1") diff --git a/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java b/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java index 57182e17c..1ecd2f648 100644 --- a/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java +++ b/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java @@ -26,6 +26,7 @@ import com.njcn.common.pojo.constant.LogInfo; import com.njcn.common.pojo.constant.OperateType; import com.njcn.common.pojo.constant.SecurityConstants; import com.njcn.common.pojo.dto.UserTokenInfo; +import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.oss.constant.OssPath; import com.njcn.redis.utils.RedisUtil; @@ -34,9 +35,11 @@ import com.njcn.system.excel.UserLogExcel; import com.njcn.system.mapper.AuditMapper; import com.njcn.system.mapper.UserLogMapper; import com.njcn.system.pojo.param.AuditParam; +import com.njcn.system.pojo.po.Config; import com.njcn.system.pojo.po.UserLog; import com.njcn.system.pojo.vo.*; import com.njcn.system.service.AuditService; +import com.njcn.system.service.IConfigService; import com.njcn.user.api.UserFeignClient; import com.njcn.user.pojo.po.User; import lombok.RequiredArgsConstructor; @@ -62,6 +65,8 @@ import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.stream.Collectors; +import static com.njcn.common.pojo.constant.LogInfo.UNKNOWN_USER; + /** * @version 1.0.0 * @author: chenchao @@ -81,28 +86,38 @@ public class AuditServiceImpl extends ServiceImpl implem private final UserFeignClient userFeignClient; @Value("${clear.num}") - private Integer clearHistoryLog; + private Integer clearHistoryLog; + + private IConfigService iConfigService; + @Override public Page getAuditLog(AuditParam auditParam) { List auditLogVOS = new ArrayList<>(); - Page info = this.page(new Page<>(auditParam.getPageNum(), auditParam.getPageSize()), new LambdaQueryWrapper() - .and(StrUtil.isNotBlank(auditParam.getLoginName()), qw -> - //如果Objects.equals(auditParam.getOperateType(), OperateType.AUTHENTICATE)则是用户登陆信息查询页面,loginname可模糊匹配Ip,CreateTime - qw.like(UserLog::getLoginName, auditParam.getLoginName()).or(Objects.equals(auditParam.getOperateType(), OperateType.AUTHENTICATE)).like( - UserLog::getIp, auditParam.getLoginName() - ).or(Objects.equals(auditParam.getOperateType(), OperateType.AUTHENTICATE)).like( - UserLog::getCreateTime, auditParam.getLoginName() - )) - .ne(UserLog::getLoginName, LogInfo.UNKNOWN_USER) - .ne(UserLog::getLoginName, "") - .ne(UserLog::getOperate, LogInfo.UNKNOWN_OPERATE) - .eq(auditParam.getType() != null, UserLog::getType, auditParam.getType()) - .eq(StrUtil.isNotBlank(auditParam.getOperateType()), UserLog::getOperateType, auditParam.getOperateType()) - .ge(StrUtil.isNotBlank(auditParam.getSearchBeginTime()), UserLog::getCreateTime, DateUtil.beginOfDay(DateUtil.parse(auditParam.getSearchBeginTime()))) - .le(StrUtil.isNotBlank(auditParam.getSearchEndTime()), UserLog::getCreateTime, DateUtil.endOfDay(DateUtil.parse(auditParam.getSearchEndTime()))) - .orderByDesc(UserLog::getCreateTime) - ); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper + .between(UserLog::getCreateTime, DateUtil.beginOfDay(DateUtil.parse(auditParam.getSearchBeginTime())), + DateUtil.endOfDay(DateUtil.parse(auditParam.getSearchEndTime()))) + .ne(UserLog::getLoginName,UNKNOWN_USER) + .orderByDesc(UserLog::getCreateTime); + + + if (StrUtil.isNotBlank(auditParam.getLoginName())) { + lambdaQueryWrapper.eq(UserLog::getLoginName, auditParam.getLoginName()); + } + if (StrUtil.isNotBlank(auditParam.getOperateType())) { + lambdaQueryWrapper.eq(UserLog::getOperateType, auditParam.getOperateType()); + } + if (Objects.nonNull(auditParam.getType())) { + lambdaQueryWrapper.eq(UserLog::getType, auditParam.getType()); + } + if (Objects.nonNull(auditParam.getResult())) { + lambdaQueryWrapper.eq(UserLog::getResult, auditParam.getResult()); + } + + + Page info = this.page(new Page<>(auditParam.getPageNum(), auditParam.getPageSize()), lambdaQueryWrapper); + Page page = BeanUtil.copyProperties(info, Page.class); if (CollUtil.isNotEmpty(info.getRecords())) { for (UserLog userLog : info.getRecords()) { @@ -148,8 +163,11 @@ public class AuditServiceImpl extends ServiceImpl implem throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER); } redisUtil.saveByKey("logFileWriter", "1"); + + + Config config = iConfigService.getOne(new LambdaQueryWrapper().eq(Config::getState, DataStateEnum.ENABLE.getCode())); LocalDateTime nowDate = LocalDateTime.now(); - LocalDateTime agoDate = nowDate.minusMonths(6).with(TemporalAdjusters.firstDayOfMonth()); + LocalDateTime agoDate = nowDate.minusMonths(config.getLogTime()).with(TemporalAdjusters.firstDayOfMonth()); String date = agoDate.format(DateTimeFormatter.ISO_LOCAL_DATE); //结束时间 String endTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH_mm_ss").format(nowDate); @@ -258,7 +276,7 @@ public class AuditServiceImpl extends ServiceImpl implem public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }).sheet().doRead(); - if(CollUtil.isNotEmpty(userLogs)){ + if (CollUtil.isNotEmpty(userLogs)) { // 执行批量插入 saveLogsBatch(userLogs, 1500); } @@ -365,13 +383,13 @@ public class AuditServiceImpl extends ServiceImpl implem public LogParamVO saveLogParam() { LogParamVO logParamVO = new LogParamVO(); List userLogs = auditMapper.selectUserLog(); - List loginNameList = userLogs.stream().map(UserLog::getLoginName).distinct().map(temp->{ + List loginNameList = userLogs.stream().map(UserLog::getLoginName).distinct().map(temp -> { ValuePO valuePO = new ValuePO(); valuePO.setValue(temp); return valuePO; }).collect(Collectors.toList()); - List operateTypeList = userLogs.stream().map(UserLog::getOperateType).distinct().map(temp->{ + List operateTypeList = userLogs.stream().map(UserLog::getOperateType).distinct().map(temp -> { ValuePO valuePO = new ValuePO(); valuePO.setValue(temp); return valuePO; diff --git a/pqs-user/user-api/src/main/java/com/njcn/user/pojo/param/PassWordRuleParam.java b/pqs-user/user-api/src/main/java/com/njcn/user/pojo/param/PassWordRuleParam.java index 10fea74fb..46c6c7e7a 100644 --- a/pqs-user/user-api/src/main/java/com/njcn/user/pojo/param/PassWordRuleParam.java +++ b/pqs-user/user-api/src/main/java/com/njcn/user/pojo/param/PassWordRuleParam.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; /** @@ -29,25 +30,34 @@ public class PassWordRuleParam { @NotNull(message = "会话超时时间(分钟)不可为空") private Integer sessionTime; - @ApiModelProperty(name = "minPasswordLength",value = "密码最小长度") - @NotNull(message = "密码最小长度不可为空") - private Integer minPasswordLength; + @ApiModelProperty(name = "sessionRefreshTime",value = "*会话刷新时间(分钟)") + @NotNull(message = "会话刷新时间(分钟)不可为空") + private Integer sessionRefreshTime; @ApiModelProperty(name = "passwordExpirationDays",value = "密码超期天数") @NotNull(message = "密码超期天数不可为空") private Integer passwordExpirationDays; - @ApiModelProperty(name = "mixedCheckFlag",value = "密码符号混合校验(0:否1:是)") - @NotNull(message = "密码符号混合校验不可为空") +/* @ApiModelProperty(name = "mixedCheckFlag",value = "密码符号混合校验(0:否1:是)") + //@NotNull(message = "密码符号混合校验不可为空") private Integer mixedCheckFlag; @ApiModelProperty(name = "doubleCheckFlag",value = "密码重复校验(0:否1:是)") - @NotNull(message = "密码重复校验不可为空") + //@NotNull(message = "密码重复校验不可为空") private Integer doubleCheckFlag; @ApiModelProperty(name = "mixedCheckFlag",value = "密码大小写混合校验(0:否1:是)" ) - @NotNull(message = "密码大小写混合校验不可为空") - private Integer mixedCaseCheckFlag; + //@NotNull(message = "密码大小写混合校验不可为空") + private Integer mixedCaseCheckFlag;*/ + + @ApiModelProperty(name = "maxUseUser",value = "大于0" ) + @NotNull(message = "最大并发用户不可为空") + @Min(value = 1,message = "最大并发数需要大于0") + private Integer maxUseUser; + + @NotNull(message = "账号长时间未登录休眠期(天)") + @Min(value = 1,message = "账号长时间未登录休眠期应大于0") + private Integer sleepDay; } diff --git a/pqs-user/user-api/src/main/java/com/njcn/user/pojo/po/UserStrategy.java b/pqs-user/user-api/src/main/java/com/njcn/user/pojo/po/UserStrategy.java index 381438a73..5a0567cb4 100644 --- a/pqs-user/user-api/src/main/java/com/njcn/user/pojo/po/UserStrategy.java +++ b/pqs-user/user-api/src/main/java/com/njcn/user/pojo/po/UserStrategy.java @@ -68,4 +68,6 @@ public class UserStrategy extends BaseEntity { */ private Integer state; + + } diff --git a/pqs-user/user-boot/src/main/java/com/njcn/user/controller/FunctionController.java b/pqs-user/user-boot/src/main/java/com/njcn/user/controller/FunctionController.java index 6a56b9a5f..33d4f37b2 100644 --- a/pqs-user/user-boot/src/main/java/com/njcn/user/controller/FunctionController.java +++ b/pqs-user/user-boot/src/main/java/com/njcn/user/controller/FunctionController.java @@ -132,7 +132,7 @@ public class FunctionController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS,list,methodDescribe); } - @OperateInfo(operateType = OperateType.UPDATE) + @OperateInfo(operateType = OperateType.UPDATE,info = LogEnum.SYSTEM_MEDIUM) @PostMapping("/assignFunctionByRoleIndexes") @ApiOperation("角色分配菜单") @ApiImplicitParam(name = "roleFunctionComponent", value = "角色信息", required = true) diff --git a/pqs-user/user-boot/src/main/java/com/njcn/user/controller/PassWordRuleController.java b/pqs-user/user-boot/src/main/java/com/njcn/user/controller/PassWordRuleController.java index b44107ff1..ccc16fc61 100644 --- a/pqs-user/user-boot/src/main/java/com/njcn/user/controller/PassWordRuleController.java +++ b/pqs-user/user-boot/src/main/java/com/njcn/user/controller/PassWordRuleController.java @@ -65,7 +65,7 @@ public class PassWordRuleController extends BaseController { } - @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @OperateInfo(info = LogEnum.SYSTEM_SERIOUS) @ApiOperation("解锁超级管理员") @RequestMapping(value = "/unlockRoot", method = RequestMethod.POST) public HttpResult unlockRoot() { diff --git a/pqs-user/user-boot/src/main/java/com/njcn/user/controller/UserController.java b/pqs-user/user-boot/src/main/java/com/njcn/user/controller/UserController.java index d3d8535b5..1d38e4c51 100644 --- a/pqs-user/user-boot/src/main/java/com/njcn/user/controller/UserController.java +++ b/pqs-user/user-boot/src/main/java/com/njcn/user/controller/UserController.java @@ -373,7 +373,7 @@ public class UserController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, publicKey, methodDescribe); } - @OperateInfo(operateType = OperateType.UPDATE) + @OperateInfo(operateType = OperateType.UPDATE,info = LogEnum.SYSTEM_SERIOUS) @PutMapping("/updateUserLoginErrorTimes/{loginName}") @ApiOperation("更新用户登录认证密码错误次数") @ApiImplicitParam(name = "loginName", value = "登录名", required = true) @@ -391,7 +391,7 @@ public class UserController extends BaseController { * * @param password 确认密码 */ - @OperateInfo + @OperateInfo(operateType = OperateType.AUTHENTICATE,info = LogEnum.SYSTEM_SERIOUS) @GetMapping("/passwordConfirm") @ApiOperation("密码二次确认") @ApiImplicitParam(name = "password", value = "确认密码") diff --git a/pqs-user/user-boot/src/main/java/com/njcn/user/service/impl/PassWordRuleServiceImpl.java b/pqs-user/user-boot/src/main/java/com/njcn/user/service/impl/PassWordRuleServiceImpl.java index 837689874..e0b6f238a 100644 --- a/pqs-user/user-boot/src/main/java/com/njcn/user/service/impl/PassWordRuleServiceImpl.java +++ b/pqs-user/user-boot/src/main/java/com/njcn/user/service/impl/PassWordRuleServiceImpl.java @@ -3,8 +3,10 @@ package com.njcn.user.service.impl; import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.redis.utils.RedisUtil; import com.njcn.user.pojo.param.PassWordRuleParam; +import com.njcn.user.pojo.po.AuthClient; import com.njcn.user.pojo.po.User; import com.njcn.user.pojo.po.UserStrategy; +import com.njcn.user.service.IAuthClientService; import com.njcn.user.service.IUserService; import com.njcn.user.service.IUserStrategyService; import com.njcn.user.service.PassWordRuleService; @@ -24,6 +26,8 @@ import org.springframework.transaction.annotation.Transactional; public class PassWordRuleServiceImpl implements PassWordRuleService { private final IUserStrategyService iUserStrategyService; + + private final IAuthClientService iAuthClientService; private final RedisUtil redisUtil; private final IUserService userService; @@ -36,13 +40,14 @@ public class PassWordRuleServiceImpl implements PassWordRuleService { .set(UserStrategy::getLimitPwdTimes,passWordRuleParam.getErrorsCount()) .set(UserStrategy::getLimitPwdDate,passWordRuleParam.getPasswordExpirationDays()) .set(UserStrategy::getLockPwdCheck,passWordRuleParam.getReleaseTime()) - .set(UserStrategy::getLockPwdTime,passWordRuleParam.getSessionTime()).update(); - - redisUtil.saveByKey("mixedCheckFlag",passWordRuleParam.getMixedCheckFlag()); - redisUtil.saveByKey("doubleCheckFlag",passWordRuleParam.getDoubleCheckFlag()); - redisUtil.saveByKey("mixedCaseCheckFlag",passWordRuleParam.getMixedCaseCheckFlag()); - redisUtil.saveByKey("minPasswordLength",passWordRuleParam.getMinPasswordLength()); + .set(UserStrategy::getMaxNum,passWordRuleParam.getMaxUseUser()) + .set(UserStrategy::getSleep,passWordRuleParam.getSleepDay()) + .update(); + iAuthClientService.lambdaUpdate() + .set(AuthClient::getRefreshTokenValidity,passWordRuleParam.getSessionRefreshTime()) + .set(AuthClient::getAccessTokenValidity,passWordRuleParam.getSessionTime()) + .update(); return true; } @@ -53,14 +58,13 @@ public class PassWordRuleServiceImpl implements PassWordRuleService { passWordRuleParam.setErrorsCount(userStrategy.getLimitPwdTimes()); passWordRuleParam.setReleaseTime(userStrategy.getLockPwdCheck()); - passWordRuleParam.setSessionTime(userStrategy.getLockPwdTime()); - passWordRuleParam.setMinPasswordLength((Integer)(redisUtil.getObjectByKey("minPasswordLength"))); passWordRuleParam.setPasswordExpirationDays(userStrategy.getLimitPwdDate()); - passWordRuleParam.setMixedCheckFlag((Integer)(redisUtil.getObjectByKey("mixedCheckFlag"))); - passWordRuleParam.setDoubleCheckFlag((Integer)(redisUtil.getObjectByKey("doubleCheckFlag"))); - passWordRuleParam.setMixedCaseCheckFlag((Integer)(redisUtil.getObjectByKey("mixedCaseCheckFlag"))); - + passWordRuleParam.setMaxUseUser(userStrategy.getMaxNum()); + passWordRuleParam.setSleepDay(userStrategy.getSleep()); + AuthClient authClient = iAuthClientService.lambdaQuery().last(" limit 1").one(); + passWordRuleParam.setSessionTime(authClient.getAccessTokenValidity()); + passWordRuleParam.setSessionRefreshTime(authClient.getRefreshTokenValidity()); return passWordRuleParam; } From 1e79bbdcb04081876913570f1bb0e25d51fb9f90 Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Mon, 22 Jul 2024 14:22:16 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=B2=B3=E5=8C=97=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E6=B5=8B=E8=AF=84=E6=95=B4=E6=94=B9=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/njcn/system/service/impl/AuditServiceImpl.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java b/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java index 1ecd2f648..a5ca80d3f 100644 --- a/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java +++ b/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/AuditServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.TimeInterval; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -88,7 +89,7 @@ public class AuditServiceImpl extends ServiceImpl implem @Value("${clear.num}") private Integer clearHistoryLog; - private IConfigService iConfigService; + private final IConfigService iConfigService; @Override public Page getAuditLog(AuditParam auditParam) { @@ -157,12 +158,13 @@ public class AuditServiceImpl extends ServiceImpl implem @Override public void logFileWriter() { + TimeInterval timeInterval = new TimeInterval(); //限制多次点击 String logFileWriter = redisUtil.getStringByKey("logFileWriter"); if (StrUtil.isNotBlank(logFileWriter) || ObjectUtil.equals(logFileWriter, "1")) { throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER); } - redisUtil.saveByKey("logFileWriter", "1"); + redisUtil.saveByKeyWithExpire("logFileWriter", "1",600L); Config config = iConfigService.getOne(new LambdaQueryWrapper().eq(Config::getState, DataStateEnum.ENABLE.getCode())); @@ -228,6 +230,7 @@ public class AuditServiceImpl extends ServiceImpl implem excelWriter.finish(); } redisUtil.delete("logFileWriter"); + System.out.println("日志备份结束,共花费时间"+timeInterval.intervalSecond()+"S"); } @@ -253,7 +256,7 @@ public class AuditServiceImpl extends ServiceImpl implem if (StrUtil.isNotBlank(logFileWriter) || ObjectUtil.equals(logFileWriter, "1")) { throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER); } - redisUtil.saveByKey("recoverLogFile", "1"); + redisUtil.saveByKeyWithExpire("recoverLogFile", "1",600L); File newFile = getLastFile(); if (FileUtil.isEmpty(newFile)) { throw new BusinessException(AuditLogEnum.NOT_FIND_FILE); From 89ece63f2ef00a336b5a1eb7cd9e826c3fdde89e Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Tue, 23 Jul 2024 14:28:07 +0800 Subject: [PATCH 4/5] =?UTF-8?q?1.=E7=94=B5=E8=83=BD=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E7=9B=91=E6=B5=8B=E9=9C=80=E6=B1=82=E8=B0=83?= =?UTF-8?q?=E6=95=B4=202.=E5=8F=98=E7=94=B5=E7=AB=99=E5=8F=B0=E8=B4=A6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=88=E5=BE=85=E5=AE=8C=E5=96=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pq/mapper/mapping/DeptLineMapper.xml | 3 +- .../njcn/harmonic/pojo/vo/SubstationVo.java | 35 ++++++++++ .../PollutionSubstationController.java | 26 +++++-- .../mapper/RStatLimitRateDMapper.java | 11 +++ .../mapper/mapping/RStatLimitRateDMapper.xml | 28 ++++++++ .../service/PollutionSubstationService.java | 4 ++ .../impl/PollutionSubstationServiceImpl.java | 69 ++++++++++++++++++- .../device/impl/LineWarningServiceImpl.java | 39 ++++++++++- 8 files changed, 206 insertions(+), 9 deletions(-) create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SubstationVo.java diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml index b61a6084f..321905d38 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml @@ -31,7 +31,8 @@ device.com_flag comFlag, 1 as lineType, 0 as type, - lineDetail.monitor_flag as isUpToGrid + lineDetail.monitor_flag as isUpToGrid, + point.name pointName diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SubstationVo.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SubstationVo.java new file mode 100644 index 000000000..ce37d1b94 --- /dev/null +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SubstationVo.java @@ -0,0 +1,35 @@ +package com.njcn.harmonic.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author xy + */ +@Data +public class SubstationVo { + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("变电站名称") + private String substationName; + + @ApiModelProperty("电网侧监测点名称") + private List dwLineList; + + @ApiModelProperty("非电网侧监测点名称") + private List yhLineList; + + @ApiModelProperty("告警频次") + private Double alarmFreq; + + @ApiModelProperty("谐波电压污染告警值") + private Double vPollutionData; + + @ApiModelProperty("谐波电流污染值") + private Double iPollutionData; + +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/PollutionSubstationController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/PollutionSubstationController.java index 031d4bb10..7bdeb2416 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/PollutionSubstationController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/PollutionSubstationController.java @@ -8,22 +8,23 @@ import com.njcn.common.utils.HttpResultUtil; import com.njcn.common.utils.LogUtil; import com.njcn.device.pq.pojo.dto.PollutionLineDTO; import com.njcn.device.pq.pojo.dto.PollutionSubstationDTO; +import com.njcn.device.pq.pojo.param.GridDiagramParam; +import com.njcn.device.pq.pojo.param.RunManageParam; import com.njcn.harmonic.pojo.param.HarmonicPublicParam; import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionVO; +import com.njcn.harmonic.pojo.vo.SubstationVo; import com.njcn.harmonic.service.PollutionSubstationService; import com.njcn.web.controller.BaseController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -100,4 +101,21 @@ public class PollutionSubstationController extends BaseController { List list = pollutionSubstationService.getLineRankTop10(param); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/substationInfo") + @ApiOperation("变电站台账信息(包含稳态数据统计)") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deptIndex", value = "部门id"), + @ApiImplicitParam(name = "searchValue", value = "搜索值"), + @ApiImplicitParam(name = "startTime", value = "开始时间"), + @ApiImplicitParam(name = "endTime", value = "结束时间") + }) + public HttpResult> getSubstationInfo(@RequestParam(value = "deptIndex") String deptIndex, @RequestParam(value = "searchValue") String searchValue, @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) { + String methodDescribe = getMethodDescribe("getSubstationInfo"); + LogUtil.njcnDebug(log, "{},实体参数:{},{}", methodDescribe, deptIndex, searchValue); + List list = pollutionSubstationService.getSubstationInfo(deptIndex,searchValue,startTime,endTime); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatLimitRateDMapper.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatLimitRateDMapper.java index 9688e4aed..d3be9b6af 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatLimitRateDMapper.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatLimitRateDMapper.java @@ -62,4 +62,15 @@ public interface RStatLimitRateDMapper extends BaseMapper { List getAssessTargetRate( @Param("ids") List list, @Param("statTime") String startTime, @Param("endTime") String endTime); + + /** + * 获取监测点的超标次数 + * @param list + * @param startTime + * @param endTime + * @return + */ + List getAllOverTimes( @Param("ids") List list, + @Param("statTime") String startTime, + @Param("endTime") String endTime); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatLimitRateDMapper.xml b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatLimitRateDMapper.xml index 460de929d..65f3634cd 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatLimitRateDMapper.xml +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatLimitRateDMapper.xml @@ -329,4 +329,32 @@ group by my_index + + diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java index 35711f077..0eeb80377 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java @@ -6,6 +6,7 @@ import com.njcn.device.pq.pojo.dto.PollutionGridDiagramDTO; import com.njcn.device.pq.pojo.dto.PollutionLineDTO; import com.njcn.device.pq.pojo.dto.PollutionSubstationDTO; import com.njcn.device.pq.pojo.param.GridDiagramParam; +import com.njcn.device.pq.pojo.param.RunManageParam; import com.njcn.device.pq.pojo.vo.GridDiagramVO; import com.njcn.harmonic.pojo.param.HarmonicPublicParam; import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; @@ -13,6 +14,8 @@ import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.RStatPollutionSubstationM; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionVO; +import com.njcn.harmonic.pojo.vo.SubstationVo; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** @@ -85,4 +88,5 @@ public interface PollutionSubstationService extends IService> getPollutionAlarmList(GridDiagramParam param); + List getSubstationInfo(String deptIndex, String searchValue, String startTime, String endTime); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java index 98d6e44f8..77d9e83c4 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java @@ -1,6 +1,5 @@ package com.njcn.harmonic.service.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; @@ -15,7 +14,9 @@ import com.njcn.common.pojo.constant.BizParamConstant; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.device.biz.commApi.CommTerminalGeneralClient; +import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO; import com.njcn.device.biz.pojo.dto.DeptGetSubStationDTO; +import com.njcn.device.biz.pojo.dto.LineDevGetDTO; import com.njcn.device.biz.pojo.dto.SubGetBase; import com.njcn.device.biz.pojo.param.DeptGetLineParam; import com.njcn.device.pms.api.MonitorClient; @@ -31,6 +32,7 @@ import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.api.SubstationFeignClient; import com.njcn.device.pq.pojo.dto.*; import com.njcn.device.pq.pojo.param.GridDiagramParam; +import com.njcn.device.pq.pojo.po.LineDetail; import com.njcn.device.pq.pojo.vo.GridDiagramVO; import com.njcn.harmonic.constant.Param; import com.njcn.harmonic.mapper.*; @@ -39,14 +41,15 @@ import com.njcn.harmonic.pojo.param.HarmonicPublicParam; import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.*; +import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionVO; +import com.njcn.harmonic.pojo.vo.SubstationVo; import com.njcn.harmonic.service.PollutionSubstationService; import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.enums.DicDataEnum; import com.njcn.user.api.DeptFeignClient; import com.njcn.user.pojo.po.Dept; -import com.njcn.web.factory.PageFactory; import com.njcn.web.utils.RequestUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -58,7 +61,9 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -105,7 +110,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl getSubstationInfo(String deptIndex, String searchValue, String startTime, String endTime) { + List result = new ArrayList<>(); + + DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); + deptGetLineParam.setDeptId(deptIndex); + deptGetLineParam.setLineRunFlag(0); + List list = commTerminalGeneralClient.deptGetLine(deptGetLineParam).getData(); + //获取监测点集合 + Map> lineMap = this.getLineMap(list, searchValue); + List lineList = lineMap.values().stream() + .flatMap(List::stream) + .distinct() + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(lineList)){ + //获取监测点的超标数据 + List limitRateList = rStatLimitRateDMapper.getAllOverTimes(lineList,startTime,endTime); + Map monitorMap = limitRateList.stream().collect(Collectors.toMap(RStatLimitRateDPO::getLineId, Function.identity())); + //todo 获取监测点污染数据 + + //获取监测点详细信息 + List lineDetailList = lineFeignClient.getLineDetail(lineList).getData(); + Map> lineDetailMap = lineDetailList.stream().collect(Collectors.groupingBy(LineDetail::getPowerSubstationName)); + lineDetailMap.forEach((k,v)->{ + AtomicInteger alarmTime = new AtomicInteger(); + SubstationVo vo = new SubstationVo(); + vo.setDeptName(""); + vo.setSubstationName(k); + vo.setDwLineList(v.stream().filter(t->Objects.equals(t.getPowerFlag(),0)).map(LineDetail::getId).collect(Collectors.toList())); + vo.setYhLineList(v.stream().filter(t->Objects.equals(t.getPowerFlag(),1)).map(LineDetail::getId).collect(Collectors.toList())); + v.forEach(item->{ + alarmTime.set(alarmTime.get() + monitorMap.get(item.getId()).getAllTime()); + }); + vo.setAlarmFreq(alarmTime.get() * 1.0 / v.size()); + result.add(vo); + }); + } + return result; + } + + public Map> getLineMap(List list, String searchValue) { + Map> map = new HashMap<>(); + list.forEach(it->{ + Predicate voltageFilter = item -> true; + if (!Objects.isNull(searchValue) && !Objects.equals(searchValue,"")) { + voltageFilter = item -> item.getPointName().contains(searchValue); + } + Predicate combinedFilter = voltageFilter; + map.put(it.getUnitName(),it.getLineBaseList().stream() + .filter(combinedFilter) + .map(LineDevGetDTO::getPointId) + .distinct() + .collect(Collectors.toList())); + }); + return map; + } + + private List addList(List substationMlist) { List info=new ArrayList<>(); Integer num1 = 0; diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java index 9f38ea1c4..ad7db7edb 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java @@ -38,6 +38,7 @@ import com.njcn.supervision.enums.ProblemTypeEnum; import com.njcn.supervision.mapper.device.LineWarningMapper; import com.njcn.supervision.pojo.param.device.OnlineParam; import com.njcn.supervision.pojo.po.device.LineWarning; +import com.njcn.supervision.pojo.po.leaflet.WarningLeaflet; import com.njcn.supervision.pojo.vo.device.LineLimitDetailVo; import com.njcn.supervision.pojo.vo.device.OnlineVo; import com.njcn.supervision.service.device.ILineWarningService; @@ -60,7 +61,10 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -247,10 +251,15 @@ public class LineWarningServiceImpl extends MppServiceImpl allLineWarnings = new ArrayList<>(); + //获取年份 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate date = LocalDate.parse(param.getSearchBeginTime(), formatter); + int year = date.getYear(); + param.setYear(String.valueOf(year)); + param.setNumber(getNumber(year)); //获取部门名称 String deptName = deptFeignClient.getDeptById(param.getDeptId()).getData().getName(); param.setDeptName(deptName); - String inputUrl = "file/warningReport.docx"; String alarmType = param.getType() == 1 ? "预" : "告"; String fileName = "电能["+alarmType+"]"+param.getYear()+"年"+param.getNumber()+"号-"+param.getDeptName()+"地市 电能质量技术监督"+alarmType+"警单.docx"; @@ -800,6 +809,34 @@ public class LineWarningServiceImpl extends MppServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(WarningLeaflet::getState, 1) + .eq(WarningLeaflet::getProblemType, 2) + .between(WarningLeaflet::getCreateTime, firstDayOfYear, lastDayOfYear); + List list = warningLeafletService.list(lambdaQueryWrapper); + if (list.isEmpty()) { + return "1"; + } + // 编译正则表达式,用于匹配文件中的编号 + Pattern pattern = Pattern.compile("年(\\d+)号"); + int maxNumber = 0; + for (WarningLeaflet leaflet : list) { + String filePath = leaflet.getFilePath(); + Matcher matcher = pattern.matcher(filePath); + if (matcher.find()) { + int number = Integer.parseInt(matcher.group(1)); + maxNumber = Math.max(maxNumber, number); + } + } + return String.valueOf(maxNumber + 1); + } + /** * 获取频率偏差-日最大值-最大值 */ From 24e937e331367ebf13a96ad84b95dba6d2cd50ff Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Tue, 23 Jul 2024 16:31:37 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/njcn/auth/service/UserTokenService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pqs-auth/src/main/java/com/njcn/auth/service/UserTokenService.java b/pqs-auth/src/main/java/com/njcn/auth/service/UserTokenService.java index 188df8d45..2d2d73983 100644 --- a/pqs-auth/src/main/java/com/njcn/auth/service/UserTokenService.java +++ b/pqs-auth/src/main/java/com/njcn/auth/service/UserTokenService.java @@ -104,8 +104,8 @@ public class UserTokenService { redisUtil.saveByKeyWithExpire(onlineUserKey, userTokenInfo, refreshLifeTime.plusMinutes(5L).toEpochSecond(ZoneOffset.of("+8")) - LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"))); //记录成功登录后的信息 - LogInfoDTO logInfoDTO = new LogInfoDTO(loginName, nickName, ip, "登录认证", OperateType.AUTHENTICATE, 1, "", 0, 1, generalInfo.getMicroServiceName(), userIndex,LocalDateTime.now()); - publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false); + //LogInfoDTO logInfoDTO = new LogInfoDTO(loginName, nickName, ip, "登录认证", OperateType.AUTHENTICATE, 1, "", 0, 1, generalInfo.getMicroServiceName(), userIndex,LocalDateTime.now()); + //publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false); } /**