Merge remote-tracking branch 'origin/master'

# Conflicts:
#	pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/user/impl/UserReportNormalServiceImpl.java
This commit is contained in:
wr
2024-07-24 09:46:55 +08:00
24 changed files with 467 additions and 89 deletions

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import com.nimbusds.jose.jwk.JWKSet; import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.RSAKey; import com.nimbusds.jose.jwk.RSAKey;
import com.njcn.auth.service.UserTokenService; import com.njcn.auth.service.UserTokenService;
import com.njcn.auth.utils.AuthPubUtil;
import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.constant.OperateType; import com.njcn.common.pojo.constant.OperateType;
import com.njcn.common.pojo.constant.SecurityConstants; import com.njcn.common.pojo.constant.SecurityConstants;
@@ -47,6 +48,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* @author hongawen * @author hongawen
@@ -73,7 +75,7 @@ public class AuthController extends BaseController {
@ApiIgnore @ApiIgnore
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.AUTHENTICATE) @OperateInfo(info = LogEnum.SYSTEM_SERIOUS, operateType = OperateType.AUTHENTICATE)
@ApiOperation("登录认证") @ApiOperation("登录认证")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = SecurityConstants.GRANT_TYPE, defaultValue = "password", value = "授权模式", required = true), @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<String, String> parameters) throws HttpRequestMethodNotSupportedException { public Object postAccessToken(@ApiIgnore Principal principal, @RequestParam @ApiIgnore Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
String methodDescribe = getMethodDescribe("postAccessToken"); String methodDescribe = getMethodDescribe("postAccessToken");
String username = parameters.get(SecurityConstants.USERNAME); String username = parameters.get(SecurityConstants.USERNAME);
UserStrategy data = passWordRuleFeugnClient.getUserStrategy().getData();
String onlineUserKey = SecurityConstants.TOKEN_ONLINE_PREFIX;
List<UserTokenInfo> onLineUser = (List<UserTokenInfo>) 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); String grantType = parameters.get(SecurityConstants.GRANT_TYPE);
if (grantType.equalsIgnoreCase(SecurityConstants.GRANT_CAPTCHA) || grantType.equalsIgnoreCase(SecurityConstants.REFRESH_TOKEN_KEY)) { 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); username = parameters.get(SecurityConstants.PHONE);
} }
UserStrategy data = passWordRuleFeugnClient.getUserStrategy().getData();
String onlineUserKey = SecurityConstants.TOKEN_ONLINE_PREFIX;
List<UserTokenInfo> onLineUser = (List<UserTokenInfo>) 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)) { if (grantType.equalsIgnoreCase(SecurityConstants.REFRESH_TOKEN_KEY)) {
//如果是刷新token需要去黑名单校验 //如果是刷新token需要去黑名单校验
userTokenService.judgeRefreshToken(parameters.get(SecurityConstants.REFRESH_TOKEN_KEY)); 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("用户登出系统") @ApiOperation("用户登出系统")
@DeleteMapping("/logout") @DeleteMapping("/logout")
public HttpResult<Object> logout() { public HttpResult<Object> logout() {

View File

@@ -104,8 +104,8 @@ public class UserTokenService {
redisUtil.saveByKeyWithExpire(onlineUserKey, userTokenInfo, refreshLifeTime.plusMinutes(5L).toEpochSecond(ZoneOffset.of("+8")) - LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"))); 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()); //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); //publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false);
} }
/** /**

View File

@@ -1,9 +1,12 @@
package com.njcn.auth.utils; package com.njcn.auth.utils;
import cn.hutool.core.util.RandomUtil; 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.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -28,4 +31,13 @@ public class AuthPubUtil {
return String.join("", textList); 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);
}
} }

View File

@@ -84,10 +84,12 @@ public class LogServiceImpl implements ILogService {
publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false); publisher.send("/userLog", PubUtils.obj2json(logInfoDTO), 2, false);
//推送审计消息功能 //推送审计消息功能
if(severity!=0){ if(severity!=0){
if(!logInfoDTO.getLoginName().equals(LogInfo.UNKNOWN_USER)){
publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false);
//发送邮箱功能 //发送邮箱功能
if(severity==2&&logInfoDTO.getResult()==0){ if(severity==2&&logInfoDTO.getResult()==0){
publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false); //publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false);
}
} }
} }
//如果存在设备日志注解,则记录设备日志 //如果存在设备日志注解,则记录设备日志
@@ -167,10 +169,12 @@ public class LogServiceImpl implements ILogService {
private void auditPush(Integer severity, LogInfoDTO logInfoDTO) { private void auditPush(Integer severity, LogInfoDTO logInfoDTO) {
//推送审计消息功能 //推送审计消息功能
if(severity !=0){ if(severity !=0){
if(!logInfoDTO.getLoginName().equals(LogInfo.UNKNOWN_USER)) {
publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false); publisher.send("/userLogPush", PubUtils.obj2json(logInfoDTO), 2, false);
//发送邮箱功能 //发送邮箱功能
if(severity ==2&& logInfoDTO.getResult()==0){ if (severity == 2 && logInfoDTO.getResult() == 0) {
publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false); //publisher.send("/userLogEmailPush", PubUtils.obj2json(logInfoDTO), 2, false);
}
} }
} }
} }

View File

@@ -31,7 +31,8 @@
device.com_flag comFlag, device.com_flag comFlag,
1 as lineType, 1 as lineType,
0 as type, 0 as type,
lineDetail.monitor_flag as isUpToGrid lineDetail.monitor_flag as isUpToGrid,
point.name pointName
</if> </if>
<!--母线--> <!--母线-->
<if test="type == 2"> <if test="type == 2">

View File

@@ -3,10 +3,17 @@ package com.njcn.gateway.config;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil; 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.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.enums.GateWayEnum;
import com.njcn.gateway.security.AuthorizationManager; import com.njcn.gateway.security.AuthorizationManager;
import com.njcn.gateway.utils.ResponseUtils; import com.njcn.gateway.utils.ResponseUtils;
import com.njcn.gateway.utils.WebFluxRequestUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.springframework.context.annotation.Bean; 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.convert.converter.Converter;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity;
@@ -30,6 +38,8 @@ import java.io.InputStream;
import java.security.KeyFactory; import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey; import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;
import java.time.LocalDateTime;
import java.util.Objects;
/** /**
* @author hongawen * @author hongawen
@@ -44,6 +54,8 @@ public class ResourceServerConfig {
private final WhiteListConfig whiteListConfig; private final WhiteListConfig whiteListConfig;
private final MqttPublisher publisher;
@Bean @Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
@@ -75,7 +87,31 @@ public class ResourceServerConfig {
@Bean @Bean
ServerAccessDeniedHandler accessDeniedHandler() { ServerAccessDeniedHandler accessDeniedHandler() {
return (exchange, denied) -> Mono.defer(() -> Mono.just(exchange.getResponse())) 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 @Bean
ServerAuthenticationEntryPoint authenticationEntryPoint() { ServerAuthenticationEntryPoint authenticationEntryPoint() {
return (exchange, e) -> Mono.defer(() -> Mono.just(exchange.getResponse())) 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);
});
} }
/** /**

View File

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

View File

@@ -224,20 +224,20 @@ whitelist:
- /system-boot/dictType/dictDataCache - /system-boot/dictType/dictDataCache
- /system-boot/file/** - /system-boot/file/**
- /system-boot/area/** - /system-boot/area/**
- /advance-boot/** #- /advance-boot/**
- /device-boot/** #- /device-boot/**
#- /system-boot/** #- /system-boot/**
#- /harmonic-boot/** #- /harmonic-boot/**
#- /energy-boot/** #- /energy-boot/**
#- /event-boot/** #- /event-boot/**
#- /quality-boot/** #- /quality-boot/**
#- /harmonic-prepare/** #- /harmonic-prepare/**
- /process-boot/** #- /process-boot/**
- /bpm-boot/** #- /bpm-boot/**
- /system-boot/** #- /system-boot/**
- /supervision-boot/** #- /supervision-boot/**
- /user-boot/** #- /user-boot/**
- /harmonic-boot/** #- /harmonic-boot/**
- /user-boot/user/listAllUserByDeptId - /user-boot/user/listAllUserByDeptId
- /IndexAnalysis/** - /IndexAnalysis/**
mqtt: mqtt:

View File

@@ -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<String> dwLineList;
@ApiModelProperty("非电网侧监测点名称")
private List<String> yhLineList;
@ApiModelProperty("告警频次")
private Double alarmFreq;
@ApiModelProperty("谐波电压污染告警值")
private Double vPollutionData;
@ApiModelProperty("谐波电流污染值")
private Double iPollutionData;
}

View File

@@ -8,22 +8,23 @@ import com.njcn.common.utils.HttpResultUtil;
import com.njcn.common.utils.LogUtil; import com.njcn.common.utils.LogUtil;
import com.njcn.device.pq.pojo.dto.PollutionLineDTO; import com.njcn.device.pq.pojo.dto.PollutionLineDTO;
import com.njcn.device.pq.pojo.dto.PollutionSubstationDTO; 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.HarmonicPublicParam;
import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam;
import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO;
import com.njcn.harmonic.pojo.vo.PollutionVO; import com.njcn.harmonic.pojo.vo.PollutionVO;
import com.njcn.harmonic.pojo.vo.SubstationVo;
import com.njcn.harmonic.service.PollutionSubstationService; import com.njcn.harmonic.service.PollutionSubstationService;
import com.njcn.web.controller.BaseController; import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
@@ -100,4 +101,21 @@ public class PollutionSubstationController extends BaseController {
List<PollutionLineDTO> list = pollutionSubstationService.getLineRankTop10(param); List<PollutionLineDTO> list = pollutionSubstationService.getLineRankTop10(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); 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<List<SubstationVo>> 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<SubstationVo> list = pollutionSubstationService.getSubstationInfo(deptIndex,searchValue,startTime,endTime);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
} }

View File

@@ -62,4 +62,15 @@ public interface RStatLimitRateDMapper extends BaseMapper<RStatLimitRateDPO> {
List<RStatLimitRateDPO> getAssessTargetRate( @Param("ids") List<String> list, List<RStatLimitRateDPO> getAssessTargetRate( @Param("ids") List<String> list,
@Param("statTime") String startTime, @Param("statTime") String startTime,
@Param("endTime") String endTime); @Param("endTime") String endTime);
/**
* 获取监测点的超标次数
* @param list
* @param startTime
* @param endTime
* @return
*/
List<RStatLimitRateDPO> getAllOverTimes( @Param("ids") List<String> list,
@Param("statTime") String startTime,
@Param("endTime") String endTime);
} }

View File

@@ -329,4 +329,32 @@
group by group by
my_index my_index
</select> </select>
<select id="getAllOverTimes" resultType="com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO">
select
my_index as lineId,
SUM(freq_dev_overtime
+ flicker_overtime
+ voltage_dev_overtime
+ ubalance_overtime
+ uaberrance_overtime
+ i_neg_overtime
+ uharm_2_overtime + uharm_3_overtime + uharm_4_overtime + uharm_5_overtime + uharm_6_overtime + uharm_7_overtime + uharm_8_overtime + uharm_9_overtime + uharm_10_overtime + uharm_11_overtime + uharm_12_overtime + uharm_13_overtime + uharm_14_overtime + uharm_15_overtime + uharm_16_overtime + uharm_17_overtime + uharm_18_overtime + uharm_19_overtime + uharm_20_overtime + uharm_21_overtime + uharm_22_overtime + uharm_23_overtime + uharm_24_overtime + uharm_25_overtime
+ iharm_2_overtime + iharm_3_overtime + iharm_4_overtime + iharm_5_overtime + iharm_6_overtime + iharm_7_overtime + iharm_8_overtime + iharm_9_overtime + iharm_10_overtime + iharm_11_overtime + iharm_12_overtime + iharm_13_overtime + iharm_14_overtime + iharm_15_overtime + iharm_16_overtime + iharm_17_overtime + iharm_18_overtime + iharm_19_overtime + iharm_20_overtime + iharm_21_overtime + iharm_22_overtime + iharm_23_overtime + iharm_24_overtime + iharm_25_overtime
+ inuharm_1_overtime + inuharm_2_overtime + inuharm_3_overtime + inuharm_4_overtime + inuharm_5_overtime + inuharm_6_overtime + inuharm_7_overtime + inuharm_8_overtime + inuharm_9_overtime + inuharm_10_overtime + inuharm_11_overtime + inuharm_12_overtime + inuharm_13_overtime + inuharm_14_overtime + inuharm_15_overtime + inuharm_16_overtime
) as allTime
from
`r_stat_limit_rate_d`
<where>
and time_id between #{startTime} and #{endTime}
<if test=" ids != null and ids.size > 0">
AND my_index IN
<foreach collection='ids' item='item' index="index" open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
</where>
group by
my_index
</select>
</mapper> </mapper>

View File

@@ -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.PollutionLineDTO;
import com.njcn.device.pq.pojo.dto.PollutionSubstationDTO; import com.njcn.device.pq.pojo.dto.PollutionSubstationDTO;
import com.njcn.device.pq.pojo.param.GridDiagramParam; 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.device.pq.pojo.vo.GridDiagramVO;
import com.njcn.harmonic.pojo.param.HarmonicPublicParam; import com.njcn.harmonic.pojo.param.HarmonicPublicParam;
import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; 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.po.RStatPollutionSubstationM;
import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO;
import com.njcn.harmonic.pojo.vo.PollutionVO; 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; import java.util.List;
/** /**
@@ -85,4 +88,5 @@ public interface PollutionSubstationService extends IService<RStatPollutionSubst
List<List<String>> getPollutionAlarmList(GridDiagramParam param); List<List<String>> getPollutionAlarmList(GridDiagramParam param);
List<SubstationVo> getSubstationInfo(String deptIndex, String searchValue, String startTime, String endTime);
} }

View File

@@ -1,6 +1,5 @@
package com.njcn.harmonic.service.impl; package com.njcn.harmonic.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; 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.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.device.biz.commApi.CommTerminalGeneralClient; 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.DeptGetSubStationDTO;
import com.njcn.device.biz.pojo.dto.LineDevGetDTO;
import com.njcn.device.biz.pojo.dto.SubGetBase; import com.njcn.device.biz.pojo.dto.SubGetBase;
import com.njcn.device.biz.pojo.param.DeptGetLineParam; import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.device.pms.api.MonitorClient; 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.api.SubstationFeignClient;
import com.njcn.device.pq.pojo.dto.*; import com.njcn.device.pq.pojo.dto.*;
import com.njcn.device.pq.pojo.param.GridDiagramParam; 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.device.pq.pojo.vo.GridDiagramVO;
import com.njcn.harmonic.constant.Param; import com.njcn.harmonic.constant.Param;
import com.njcn.harmonic.mapper.*; 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.PollutionSubstationQuryParam;
import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam;
import com.njcn.harmonic.pojo.po.*; 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.PollutionSubstationVO;
import com.njcn.harmonic.pojo.vo.PollutionVO; import com.njcn.harmonic.pojo.vo.PollutionVO;
import com.njcn.harmonic.pojo.vo.SubstationVo;
import com.njcn.harmonic.service.PollutionSubstationService; import com.njcn.harmonic.service.PollutionSubstationService;
import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataEnum;
import com.njcn.user.api.DeptFeignClient; import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.po.Dept; import com.njcn.user.pojo.po.Dept;
import com.njcn.web.factory.PageFactory;
import com.njcn.web.utils.RequestUtil; import com.njcn.web.utils.RequestUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -58,7 +61,9 @@ import org.springframework.util.CollectionUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -105,7 +110,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl<RStatPollutionSu
private final CommTerminalGeneralClient commTerminalGeneralClient; private final CommTerminalGeneralClient commTerminalGeneralClient;
private final DicDataFeignClient dicDataFeignClient; private final DicDataFeignClient dicDataFeignClient;
private final RStatLimitRateDMapper rStatLimitRateDMapper;
/** /**
* @param pollutionSubstationQuryParam * @param pollutionSubstationQuryParam
@@ -804,6 +809,64 @@ public class PollutionSubstationServiceImpl extends ServiceImpl<RStatPollutionSu
return info; return info;
} }
@Override
public List<SubstationVo> getSubstationInfo(String deptIndex, String searchValue, String startTime, String endTime) {
List<SubstationVo> result = new ArrayList<>();
DeptGetLineParam deptGetLineParam = new DeptGetLineParam();
deptGetLineParam.setDeptId(deptIndex);
deptGetLineParam.setLineRunFlag(0);
List<DeptGetChildrenMoreDTO> list = commTerminalGeneralClient.deptGetLine(deptGetLineParam).getData();
//获取监测点集合
Map<String,List<String>> lineMap = this.getLineMap(list, searchValue);
List<String> lineList = lineMap.values().stream()
.flatMap(List::stream)
.distinct()
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(lineList)){
//获取监测点的超标数据
List<RStatLimitRateDPO> limitRateList = rStatLimitRateDMapper.getAllOverTimes(lineList,startTime,endTime);
Map<String, RStatLimitRateDPO> monitorMap = limitRateList.stream().collect(Collectors.toMap(RStatLimitRateDPO::getLineId, Function.identity()));
//todo 获取监测点污染数据
//获取监测点详细信息
List<LineDetail> lineDetailList = lineFeignClient.getLineDetail(lineList).getData();
Map<String,List<LineDetail>> 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<String,List<String>> getLineMap(List<DeptGetChildrenMoreDTO> list, String searchValue) {
Map<String,List<String>> map = new HashMap<>();
list.forEach(it->{
Predicate<LineDevGetDTO> voltageFilter = item -> true;
if (!Objects.isNull(searchValue) && !Objects.equals(searchValue,"")) {
voltageFilter = item -> item.getPointName().contains(searchValue);
}
Predicate<LineDevGetDTO> combinedFilter = voltageFilter;
map.put(it.getUnitName(),it.getLineBaseList().stream()
.filter(combinedFilter)
.map(LineDevGetDTO::getPointId)
.distinct()
.collect(Collectors.toList()));
});
return map;
}
private List<String> addList(List<RStatPollutionSubstationM> substationMlist) { private List<String> addList(List<RStatPollutionSubstationM> substationMlist) {
List<String> info=new ArrayList<>(); List<String> info=new ArrayList<>();
Integer num1 = 0; Integer num1 = 0;

View File

@@ -38,6 +38,7 @@ import com.njcn.supervision.enums.ProblemTypeEnum;
import com.njcn.supervision.mapper.device.LineWarningMapper; import com.njcn.supervision.mapper.device.LineWarningMapper;
import com.njcn.supervision.pojo.param.device.OnlineParam; import com.njcn.supervision.pojo.param.device.OnlineParam;
import com.njcn.supervision.pojo.po.device.LineWarning; 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.LineLimitDetailVo;
import com.njcn.supervision.pojo.vo.device.OnlineVo; import com.njcn.supervision.pojo.vo.device.OnlineVo;
import com.njcn.supervision.service.device.ILineWarningService; import com.njcn.supervision.service.device.ILineWarningService;
@@ -60,7 +61,10 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -247,10 +251,15 @@ public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, Li
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void startReport(OnlineParam.ReportParam param) { public void startReport(OnlineParam.ReportParam param) {
List<LineWarning> allLineWarnings = new ArrayList<>(); List<LineWarning> 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(); String deptName = deptFeignClient.getDeptById(param.getDeptId()).getData().getName();
param.setDeptName(deptName); param.setDeptName(deptName);
String inputUrl = "file/warningReport.docx"; String inputUrl = "file/warningReport.docx";
String alarmType = param.getType() == 1 ? "" : ""; String alarmType = param.getType() == 1 ? "" : "";
String fileName = "电能["+alarmType+"]"+param.getYear()+""+param.getNumber()+"号-"+param.getDeptName()+"地市 电能质量技术监督"+alarmType+"警单.docx"; String fileName = "电能["+alarmType+"]"+param.getYear()+""+param.getNumber()+"号-"+param.getDeptName()+"地市 电能质量技术监督"+alarmType+"警单.docx";
@@ -800,6 +809,34 @@ public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, Li
return result; return result;
} }
/**
* 查询库里面的编号
*/
public String getNumber(Integer year) {
LocalDate firstDayOfYear = LocalDate.of(year, 1, 1);
LocalDate lastDayOfYear = LocalDate.of(year + 1, 1, 1).minusDays(1);
LambdaQueryWrapper<WarningLeaflet> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(WarningLeaflet::getState, 1)
.eq(WarningLeaflet::getProblemType, 2)
.between(WarningLeaflet::getCreateTime, firstDayOfYear, lastDayOfYear);
List<WarningLeaflet> 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);
}
/** /**
* 获取频率偏差-日最大值-最大值 * 获取频率偏差-日最大值-最大值
*/ */

View File

@@ -33,6 +33,9 @@ public class AuditParam {
@ApiModelProperty("操作类型") @ApiModelProperty("操作类型")
private String operateType; private String operateType;
@ApiModelProperty("结果")
private Integer result;
@ApiModelProperty("页码") @ApiModelProperty("页码")
@NotNull(message = "页码不可为空") @NotNull(message = "页码不可为空")
@Range(min = 1,message = "页码必须大于0") @Range(min = 1,message = "页码必须大于0")

View File

@@ -37,11 +37,11 @@ public class ConfigParam {
*/ */
@ApiModelProperty("审计日志大小MB") @ApiModelProperty("审计日志大小MB")
@NotNull(message = "审计日志大小不可为空") @NotNull(message = "审计日志大小不可为空")
@Min(value = 0,message = "审计日志大小不能小于0") @Min(value = 1024,message = "审计日志大小不能小于1024M")
private BigDecimal logSize; private BigDecimal logSize;
/** /**
* 审计日志大小 * 审计日志保留时间
*/ */
@ApiModelProperty("审计日志存储时间1-6个月默认3个月") @ApiModelProperty("审计日志存储时间1-6个月默认3个月")
@Min(value = 1,message = "审计日志保留时间不能小于1") @Min(value = 1,message = "审计日志保留时间不能小于1")

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@@ -26,6 +27,7 @@ import com.njcn.common.pojo.constant.LogInfo;
import com.njcn.common.pojo.constant.OperateType; import com.njcn.common.pojo.constant.OperateType;
import com.njcn.common.pojo.constant.SecurityConstants; import com.njcn.common.pojo.constant.SecurityConstants;
import com.njcn.common.pojo.dto.UserTokenInfo; 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.common.pojo.exception.BusinessException;
import com.njcn.oss.constant.OssPath; import com.njcn.oss.constant.OssPath;
import com.njcn.redis.utils.RedisUtil; import com.njcn.redis.utils.RedisUtil;
@@ -34,9 +36,11 @@ import com.njcn.system.excel.UserLogExcel;
import com.njcn.system.mapper.AuditMapper; import com.njcn.system.mapper.AuditMapper;
import com.njcn.system.mapper.UserLogMapper; import com.njcn.system.mapper.UserLogMapper;
import com.njcn.system.pojo.param.AuditParam; 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.po.UserLog;
import com.njcn.system.pojo.vo.*; import com.njcn.system.pojo.vo.*;
import com.njcn.system.service.AuditService; import com.njcn.system.service.AuditService;
import com.njcn.system.service.IConfigService;
import com.njcn.user.api.UserFeignClient; import com.njcn.user.api.UserFeignClient;
import com.njcn.user.pojo.po.User; import com.njcn.user.pojo.po.User;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -62,6 +66,8 @@ import java.time.temporal.TemporalAdjusters;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.njcn.common.pojo.constant.LogInfo.UNKNOWN_USER;
/** /**
* @version 1.0.0 * @version 1.0.0
* @author: chenchao * @author: chenchao
@@ -82,27 +88,37 @@ public class AuditServiceImpl extends ServiceImpl<UserLogMapper, UserLog> implem
@Value("${clear.num}") @Value("${clear.num}")
private Integer clearHistoryLog; private Integer clearHistoryLog;
private final IConfigService iConfigService;
@Override @Override
public Page<AuditLogVO> getAuditLog(AuditParam auditParam) { public Page<AuditLogVO> getAuditLog(AuditParam auditParam) {
List<AuditLogVO> auditLogVOS = new ArrayList<>(); List<AuditLogVO> auditLogVOS = new ArrayList<>();
Page<UserLog> info = this.page(new Page<>(auditParam.getPageNum(), auditParam.getPageSize()), new LambdaQueryWrapper<UserLog>() LambdaQueryWrapper<UserLog> lambdaQueryWrapper = new LambdaQueryWrapper<>();
.and(StrUtil.isNotBlank(auditParam.getLoginName()), qw -> lambdaQueryWrapper
//如果Objects.equals(auditParam.getOperateType(), OperateType.AUTHENTICATE)则是用户登陆信息查询页面loginname可模糊匹配IpCreateTime .between(UserLog::getCreateTime, DateUtil.beginOfDay(DateUtil.parse(auditParam.getSearchBeginTime())),
qw.like(UserLog::getLoginName, auditParam.getLoginName()).or(Objects.equals(auditParam.getOperateType(), OperateType.AUTHENTICATE)).like( DateUtil.endOfDay(DateUtil.parse(auditParam.getSearchEndTime())))
UserLog::getIp, auditParam.getLoginName() .ne(UserLog::getLoginName,UNKNOWN_USER)
).or(Objects.equals(auditParam.getOperateType(), OperateType.AUTHENTICATE)).like( .orderByDesc(UserLog::getCreateTime);
UserLog::getCreateTime, auditParam.getLoginName()
))
.ne(UserLog::getLoginName, LogInfo.UNKNOWN_USER) if (StrUtil.isNotBlank(auditParam.getLoginName())) {
.ne(UserLog::getLoginName, "") lambdaQueryWrapper.eq(UserLog::getLoginName, auditParam.getLoginName());
.ne(UserLog::getOperate, LogInfo.UNKNOWN_OPERATE) }
.eq(auditParam.getType() != null, UserLog::getType, auditParam.getType()) if (StrUtil.isNotBlank(auditParam.getOperateType())) {
.eq(StrUtil.isNotBlank(auditParam.getOperateType()), UserLog::getOperateType, auditParam.getOperateType()) lambdaQueryWrapper.eq(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()))) if (Objects.nonNull(auditParam.getType())) {
.orderByDesc(UserLog::getCreateTime) lambdaQueryWrapper.eq(UserLog::getType, auditParam.getType());
); }
if (Objects.nonNull(auditParam.getResult())) {
lambdaQueryWrapper.eq(UserLog::getResult, auditParam.getResult());
}
Page<UserLog> info = this.page(new Page<>(auditParam.getPageNum(), auditParam.getPageSize()), lambdaQueryWrapper);
Page<AuditLogVO> page = BeanUtil.copyProperties(info, Page.class); Page<AuditLogVO> page = BeanUtil.copyProperties(info, Page.class);
if (CollUtil.isNotEmpty(info.getRecords())) { if (CollUtil.isNotEmpty(info.getRecords())) {
for (UserLog userLog : info.getRecords()) { for (UserLog userLog : info.getRecords()) {
@@ -142,14 +158,18 @@ public class AuditServiceImpl extends ServiceImpl<UserLogMapper, UserLog> implem
@Override @Override
public void logFileWriter() { public void logFileWriter() {
TimeInterval timeInterval = new TimeInterval();
//限制多次点击 //限制多次点击
String logFileWriter = redisUtil.getStringByKey("logFileWriter"); String logFileWriter = redisUtil.getStringByKey("logFileWriter");
if (StrUtil.isNotBlank(logFileWriter) || ObjectUtil.equals(logFileWriter, "1")) { if (StrUtil.isNotBlank(logFileWriter) || ObjectUtil.equals(logFileWriter, "1")) {
throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER); throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER);
} }
redisUtil.saveByKey("logFileWriter", "1"); redisUtil.saveByKeyWithExpire("logFileWriter", "1",600L);
Config config = iConfigService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getState, DataStateEnum.ENABLE.getCode()));
LocalDateTime nowDate = LocalDateTime.now(); 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 date = agoDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
//结束时间 //结束时间
String endTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH_mm_ss").format(nowDate); String endTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH_mm_ss").format(nowDate);
@@ -210,6 +230,7 @@ public class AuditServiceImpl extends ServiceImpl<UserLogMapper, UserLog> implem
excelWriter.finish(); excelWriter.finish();
} }
redisUtil.delete("logFileWriter"); redisUtil.delete("logFileWriter");
System.out.println("日志备份结束,共花费时间"+timeInterval.intervalSecond()+"S");
} }
@@ -235,7 +256,7 @@ public class AuditServiceImpl extends ServiceImpl<UserLogMapper, UserLog> implem
if (StrUtil.isNotBlank(logFileWriter) || ObjectUtil.equals(logFileWriter, "1")) { if (StrUtil.isNotBlank(logFileWriter) || ObjectUtil.equals(logFileWriter, "1")) {
throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER); throw new BusinessException(AuditLogEnum.MULTIPLE_CLICKS_LOGFILEWRITER);
} }
redisUtil.saveByKey("recoverLogFile", "1"); redisUtil.saveByKeyWithExpire("recoverLogFile", "1",600L);
File newFile = getLastFile(); File newFile = getLastFile();
if (FileUtil.isEmpty(newFile)) { if (FileUtil.isEmpty(newFile)) {
throw new BusinessException(AuditLogEnum.NOT_FIND_FILE); throw new BusinessException(AuditLogEnum.NOT_FIND_FILE);
@@ -258,7 +279,7 @@ public class AuditServiceImpl extends ServiceImpl<UserLogMapper, UserLog> implem
public void doAfterAllAnalysed(AnalysisContext analysisContext) { public void doAfterAllAnalysed(AnalysisContext analysisContext) {
} }
}).sheet().doRead(); }).sheet().doRead();
if(CollUtil.isNotEmpty(userLogs)){ if (CollUtil.isNotEmpty(userLogs)) {
// 执行批量插入 // 执行批量插入
saveLogsBatch(userLogs, 1500); saveLogsBatch(userLogs, 1500);
} }
@@ -365,13 +386,13 @@ public class AuditServiceImpl extends ServiceImpl<UserLogMapper, UserLog> implem
public LogParamVO saveLogParam() { public LogParamVO saveLogParam() {
LogParamVO logParamVO = new LogParamVO(); LogParamVO logParamVO = new LogParamVO();
List<UserLog> userLogs = auditMapper.selectUserLog(); List<UserLog> userLogs = auditMapper.selectUserLog();
List<ValuePO> loginNameList = userLogs.stream().map(UserLog::getLoginName).distinct().map(temp->{ List<ValuePO> loginNameList = userLogs.stream().map(UserLog::getLoginName).distinct().map(temp -> {
ValuePO valuePO = new ValuePO(); ValuePO valuePO = new ValuePO();
valuePO.setValue(temp); valuePO.setValue(temp);
return valuePO; return valuePO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
List<ValuePO> operateTypeList = userLogs.stream().map(UserLog::getOperateType).distinct().map(temp->{ List<ValuePO> operateTypeList = userLogs.stream().map(UserLog::getOperateType).distinct().map(temp -> {
ValuePO valuePO = new ValuePO(); ValuePO valuePO = new ValuePO();
valuePO.setValue(temp); valuePO.setValue(temp);
return valuePO; return valuePO;

View File

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
/** /**
@@ -29,25 +30,34 @@ public class PassWordRuleParam {
@NotNull(message = "会话超时时间(分钟)不可为空") @NotNull(message = "会话超时时间(分钟)不可为空")
private Integer sessionTime; private Integer sessionTime;
@ApiModelProperty(name = "minPasswordLength",value = "密码最小长度") @ApiModelProperty(name = "sessionRefreshTime",value = "*会话刷新时间(分钟)")
@NotNull(message = "密码最小长度不可为空") @NotNull(message = "会话刷新时间(分钟)不可为空")
private Integer minPasswordLength; private Integer sessionRefreshTime;
@ApiModelProperty(name = "passwordExpirationDays",value = "密码超期天数") @ApiModelProperty(name = "passwordExpirationDays",value = "密码超期天数")
@NotNull(message = "密码超期天数不可为空") @NotNull(message = "密码超期天数不可为空")
private Integer passwordExpirationDays; private Integer passwordExpirationDays;
@ApiModelProperty(name = "mixedCheckFlag",value = "密码符号混合校验(0:否1是)") /* @ApiModelProperty(name = "mixedCheckFlag",value = "密码符号混合校验(0:否1是)")
@NotNull(message = "密码符号混合校验不可为空") //@NotNull(message = "密码符号混合校验不可为空")
private Integer mixedCheckFlag; private Integer mixedCheckFlag;
@ApiModelProperty(name = "doubleCheckFlag",value = "密码重复校验(0:否1是)") @ApiModelProperty(name = "doubleCheckFlag",value = "密码重复校验(0:否1是)")
@NotNull(message = "密码重复校验不可为空") //@NotNull(message = "密码重复校验不可为空")
private Integer doubleCheckFlag; private Integer doubleCheckFlag;
@ApiModelProperty(name = "mixedCheckFlag",value = "密码大小写混合校验(0:否1是)" ) @ApiModelProperty(name = "mixedCheckFlag",value = "密码大小写混合校验(0:否1是)" )
@NotNull(message = "密码大小写混合校验不可为空") //@NotNull(message = "密码大小写混合校验不可为空")
private Integer mixedCaseCheckFlag; 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;
} }

View File

@@ -68,4 +68,6 @@ public class UserStrategy extends BaseEntity {
*/ */
private Integer state; private Integer state;
} }

View File

@@ -132,7 +132,7 @@ public class FunctionController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS,list,methodDescribe); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS,list,methodDescribe);
} }
@OperateInfo(operateType = OperateType.UPDATE) @OperateInfo(operateType = OperateType.UPDATE,info = LogEnum.SYSTEM_MEDIUM)
@PostMapping("/assignFunctionByRoleIndexes") @PostMapping("/assignFunctionByRoleIndexes")
@ApiOperation("角色分配菜单") @ApiOperation("角色分配菜单")
@ApiImplicitParam(name = "roleFunctionComponent", value = "角色信息", required = true) @ApiImplicitParam(name = "roleFunctionComponent", value = "角色信息", required = true)

View File

@@ -65,7 +65,7 @@ public class PassWordRuleController extends BaseController {
} }
@OperateInfo(info = LogEnum.BUSINESS_COMMON) @OperateInfo(info = LogEnum.SYSTEM_SERIOUS)
@ApiOperation("解锁超级管理员") @ApiOperation("解锁超级管理员")
@RequestMapping(value = "/unlockRoot", method = RequestMethod.POST) @RequestMapping(value = "/unlockRoot", method = RequestMethod.POST)
public HttpResult<Boolean> unlockRoot() { public HttpResult<Boolean> unlockRoot() {

View File

@@ -373,7 +373,7 @@ public class UserController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, publicKey, methodDescribe); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, publicKey, methodDescribe);
} }
@OperateInfo(operateType = OperateType.UPDATE) @OperateInfo(operateType = OperateType.UPDATE,info = LogEnum.SYSTEM_SERIOUS)
@PutMapping("/updateUserLoginErrorTimes/{loginName}") @PutMapping("/updateUserLoginErrorTimes/{loginName}")
@ApiOperation("更新用户登录认证密码错误次数") @ApiOperation("更新用户登录认证密码错误次数")
@ApiImplicitParam(name = "loginName", value = "登录名", required = true) @ApiImplicitParam(name = "loginName", value = "登录名", required = true)
@@ -391,7 +391,7 @@ public class UserController extends BaseController {
* *
* @param password 确认密码 * @param password 确认密码
*/ */
@OperateInfo @OperateInfo(operateType = OperateType.AUTHENTICATE,info = LogEnum.SYSTEM_SERIOUS)
@GetMapping("/passwordConfirm") @GetMapping("/passwordConfirm")
@ApiOperation("密码二次确认") @ApiOperation("密码二次确认")
@ApiImplicitParam(name = "password", value = "确认密码") @ApiImplicitParam(name = "password", value = "确认密码")

View File

@@ -3,8 +3,10 @@ package com.njcn.user.service.impl;
import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.redis.utils.RedisUtil; import com.njcn.redis.utils.RedisUtil;
import com.njcn.user.pojo.param.PassWordRuleParam; 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.User;
import com.njcn.user.pojo.po.UserStrategy; import com.njcn.user.pojo.po.UserStrategy;
import com.njcn.user.service.IAuthClientService;
import com.njcn.user.service.IUserService; import com.njcn.user.service.IUserService;
import com.njcn.user.service.IUserStrategyService; import com.njcn.user.service.IUserStrategyService;
import com.njcn.user.service.PassWordRuleService; import com.njcn.user.service.PassWordRuleService;
@@ -24,6 +26,8 @@ import org.springframework.transaction.annotation.Transactional;
public class PassWordRuleServiceImpl implements PassWordRuleService { public class PassWordRuleServiceImpl implements PassWordRuleService {
private final IUserStrategyService iUserStrategyService; private final IUserStrategyService iUserStrategyService;
private final IAuthClientService iAuthClientService;
private final RedisUtil redisUtil; private final RedisUtil redisUtil;
private final IUserService userService; private final IUserService userService;
@@ -36,13 +40,14 @@ public class PassWordRuleServiceImpl implements PassWordRuleService {
.set(UserStrategy::getLimitPwdTimes,passWordRuleParam.getErrorsCount()) .set(UserStrategy::getLimitPwdTimes,passWordRuleParam.getErrorsCount())
.set(UserStrategy::getLimitPwdDate,passWordRuleParam.getPasswordExpirationDays()) .set(UserStrategy::getLimitPwdDate,passWordRuleParam.getPasswordExpirationDays())
.set(UserStrategy::getLockPwdCheck,passWordRuleParam.getReleaseTime()) .set(UserStrategy::getLockPwdCheck,passWordRuleParam.getReleaseTime())
.set(UserStrategy::getLockPwdTime,passWordRuleParam.getSessionTime()).update(); .set(UserStrategy::getMaxNum,passWordRuleParam.getMaxUseUser())
.set(UserStrategy::getSleep,passWordRuleParam.getSleepDay())
redisUtil.saveByKey("mixedCheckFlag",passWordRuleParam.getMixedCheckFlag()); .update();
redisUtil.saveByKey("doubleCheckFlag",passWordRuleParam.getDoubleCheckFlag());
redisUtil.saveByKey("mixedCaseCheckFlag",passWordRuleParam.getMixedCaseCheckFlag());
redisUtil.saveByKey("minPasswordLength",passWordRuleParam.getMinPasswordLength());
iAuthClientService.lambdaUpdate()
.set(AuthClient::getRefreshTokenValidity,passWordRuleParam.getSessionRefreshTime())
.set(AuthClient::getAccessTokenValidity,passWordRuleParam.getSessionTime())
.update();
return true; return true;
} }
@@ -53,14 +58,13 @@ public class PassWordRuleServiceImpl implements PassWordRuleService {
passWordRuleParam.setErrorsCount(userStrategy.getLimitPwdTimes()); passWordRuleParam.setErrorsCount(userStrategy.getLimitPwdTimes());
passWordRuleParam.setReleaseTime(userStrategy.getLockPwdCheck()); passWordRuleParam.setReleaseTime(userStrategy.getLockPwdCheck());
passWordRuleParam.setSessionTime(userStrategy.getLockPwdTime());
passWordRuleParam.setMinPasswordLength((Integer)(redisUtil.getObjectByKey("minPasswordLength")));
passWordRuleParam.setPasswordExpirationDays(userStrategy.getLimitPwdDate()); passWordRuleParam.setPasswordExpirationDays(userStrategy.getLimitPwdDate());
passWordRuleParam.setMixedCheckFlag((Integer)(redisUtil.getObjectByKey("mixedCheckFlag"))); passWordRuleParam.setMaxUseUser(userStrategy.getMaxNum());
passWordRuleParam.setDoubleCheckFlag((Integer)(redisUtil.getObjectByKey("doubleCheckFlag"))); passWordRuleParam.setSleepDay(userStrategy.getSleep());
passWordRuleParam.setMixedCaseCheckFlag((Integer)(redisUtil.getObjectByKey("mixedCaseCheckFlag")));
AuthClient authClient = iAuthClientService.lambdaQuery().last(" limit 1").one();
passWordRuleParam.setSessionTime(authClient.getAccessTokenValidity());
passWordRuleParam.setSessionRefreshTime(authClient.getRefreshTokenValidity());
return passWordRuleParam; return passWordRuleParam;
} }