二次版本提交

This commit is contained in:
hzj
2025-07-29 14:34:53 +08:00
parent 8453b1da95
commit 9d701ad55e
10 changed files with 233 additions and 24 deletions

View File

@@ -4,9 +4,14 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.njcn.gather.event.devcie.mapper.PqLineMapper;
import com.njcn.gather.event.devcie.pojo.po.PqLine;
import com.njcn.gather.event.devcie.pojo.po.PqsDeptsline;
import com.njcn.gather.event.devcie.service.PqsDeptslineService;
import com.njcn.gather.event.transientes.pojo.po.PqsDepts;
import com.njcn.gather.event.transientes.service.PqsDeptsService;
import com.njcn.redis.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@@ -14,6 +19,7 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Description:
@@ -29,20 +35,34 @@ public class PqlineCache {
private PqLineMapper pqLineMapper;
@Autowired
private RedisUtil redisUtil;
@Autowired
private PqsDeptslineService pqsDeptslineService;
@Autowired
private PqsDeptsService pqsDeptsService;
private final static String NAME_KEY = "LineCache:";
@Value("${SYS_TYPE_ZT}")
private String sysTypeZt;
@PostConstruct
public void init() {
log.info("系统启动中。。。加载pqline");
List<PqLine> pqLines = pqLineMapper.selectList(null);
redisUtil.saveByKey("pqLineList",pqLines);
redisUtil.saveByKey(NAME_KEY + StrUtil.DASHED+"pqLineList",pqLines);
List<PqsDepts> list = pqsDeptsService.lambdaQuery().eq(PqsDepts::getState, 1).list();
for (PqsDepts pqsDepts : list) {
List<String> deptAndChildren = pqsDeptsService.findDeptAndChildren(pqsDepts.getDeptsIndex());
List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
List<Integer> deptslineIds = deptslines.stream().map(PqsDeptsline::getLineIndex).collect(Collectors.toList());
redisUtil.saveByKey(NAME_KEY + StrUtil.DASHED+pqsDepts.getDeptsIndex(),deptslineIds);
}
}
@PreDestroy
public void destroy() {
log.info("系统运行结束");
redisUtil.delete("pqLineList");
redisUtil.deleteKeysByString(NAME_KEY);
}
}

View File

@@ -18,12 +18,17 @@
select
PQ_SUBSTATION.sub_index stationId,
PQ_SUBSTATION.name stationName,
PQ_GDINFORMATION.Name gdName
PQ_GDINFORMATION.Name gdName,
PQS_MAP.LATITUDE LATITUDE,
PQS_MAP.LONGITUDE LONGITUDE
from
PQ_SUBSTATION,
PQ_GDINFORMATION
PQ_SUBSTATION left join
PQS_MAP on PQ_SUBSTATION.SUB_INDEX =PQS_MAP.SUB_INDEX
left join
PQ_GDINFORMATION on PQ_SUBSTATION.GD_INDEX =PQ_GDINFORMATION.GD_INDEX
where
PQ_SUBSTATION.GD_INDEX =PQ_GDINFORMATION.GD_INDEX
PQS_MAP.state=1
and PQ_SUBSTATION.SUB_INDEX in
<foreach collection="ids" item="item" open="(" close=")" separator=",">
#{item}

View File

@@ -15,6 +15,8 @@ public class SubstationDTO {
private Integer stationId;
private String stationName;
private String gdName;
private double longitude;
private double latitude;
private Integer runFlag=0;;
}

View File

@@ -210,6 +210,15 @@ public class LargeScreenCountController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo
@PostMapping("/substationCount")
@ApiOperation("变电站统计")
@ApiImplicitParam(name = "largeScreenCountParam", value = "查询参数", required = true)
public HttpResult<List<SubStationCountVO>> substationCount(@RequestBody LargeScreenCountParam largeScreenCountParam) {
String methodDescribe = getMethodDescribe("substationCount");
List<SubStationCountVO> result = largeScreenCountService.substationCount(largeScreenCountParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo
@PostMapping("/regionDevCount")
@@ -224,5 +233,14 @@ public class LargeScreenCountController extends BaseController {
@OperateInfo
@PostMapping("/eventPage")
@ApiOperation("分页查询暂降事件")
@ApiImplicitParam(name = "largeScreenCountParam", value = "查询参数", required = true)
public HttpResult<Page<EventDetailVO>> eventPage(@RequestBody LargeScreenCountParam largeScreenCountParam) {
String methodDescribe = getMethodDescribe("eventPage");
Page<EventDetailVO> result = largeScreenCountService.eventPage(largeScreenCountParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
}

View File

@@ -1,9 +1,12 @@
package com.njcn.gather.event.transientes.pojo.param;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.njcn.web.pojo.param.BaseParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* Description:
* Date: 2025/06/19 下午 3:38【需求编号】
@@ -25,4 +28,8 @@ public class LargeScreenCountParam extends BaseParam {
private Integer eventDeep;
private Integer sendResult;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}

View File

@@ -0,0 +1,23 @@
package com.njcn.gather.event.transientes.pojo.vo;
import lombok.Data;
/**
* Description:
* Date: 2025/07/29 上午 11:03【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Data
public class SubStationCountVO {
private Integer stationId;
private String stationName;
private String gdName;
private double longitude;
private double latitude;
private Integer lineCount;
private Integer eventCount;
}

View File

@@ -36,6 +36,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.authorizeRequests()
//.antMatchers("/cn_authenticate","/ws/**","/accept/testEvent").permitAll() // 允许访问认证接口
.antMatchers("/**").permitAll() // 允许访问认证接口
.antMatchers("/cn_authenticate","/ws/**","/accept/testEvent").permitAll() // 允许访问认证接口
// .antMatchers("/**").permitAll() // 允许访问认证接口
.anyRequest().authenticated()
.and()
.sessionManagement()

View File

@@ -3,6 +3,7 @@ package com.njcn.gather.event.transientes.service;
import com.njcn.gather.event.devcie.pojo.po.PqsDeptsline;
import com.njcn.gather.event.devcie.service.PqsDeptslineService;
import com.njcn.gather.event.transientes.pojo.param.LargeScreenCountParam;
import com.njcn.redis.utils.RedisUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -23,7 +24,7 @@ public class CommGeneralService {
private final PqsDeptslineService pqsDeptslineService;
private final PqsDeptsService pqsDeptsService;
private final RedisUtil redisUtil;
/**
* 根据部门id获取部门所拥有的监测点

View File

@@ -55,5 +55,7 @@ public interface LargeScreenCountService {
List<RegionDevCountVO> regionDevCount(LargeScreenCountParam largeScreenCountParam);
List<SubStationCountVO> substationCount(LargeScreenCountParam largeScreenCountParam);
Page<EventDetailVO> eventPage(LargeScreenCountParam largeScreenCountParam);
}

View File

@@ -14,6 +14,7 @@ import com.github.yulichang.wrapper.segments.Fun;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.gather.event.devcie.config.PqlineCache;
import com.njcn.gather.event.devcie.mapper.PqLineMapper;
import com.njcn.gather.event.devcie.mapper.PqLinedetailMapper;
import com.njcn.gather.event.devcie.pojo.dto.DeviceDTO;
@@ -87,6 +88,7 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService {
private final RedisUtil redisUtil;
@Value("${SYS_TYPE_ZT}")
private String sysTypeZt;
private final static String NAME_KEY = "LineCache:";
private List<Integer> lineIds = new ArrayList<>();
@@ -873,10 +875,10 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService {
@Override
public DeviceCountVO devFlagCount(LargeScreenCountParam largeScreenCountParam) {
DeviceCountVO deviceCountVO = new DeviceCountVO();
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey("pqLineList");
List<String> deptAndChildren = pqsDeptsService.findDeptAndChildren(largeScreenCountParam.getDeptId());
List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
List<Integer> deptslineIds = deptslines.stream().map(PqsDeptsline::getLineIndex).collect(Collectors.toList());
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+"pqLineList");
List<Integer> deptslineIds = (List<Integer>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+largeScreenCountParam.getDeptId());
// List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
// List<Integer> deptslineIds = deptslines.stream().map(PqsDeptsline::getLineIndex).collect(Collectors.toList());
pqLineList = pqLineList.stream().filter(temp->deptslineIds.contains(temp.getLineIndex())).collect(Collectors.toList());
List<Integer> devIndexs = pqLineList.stream().map(PqLine::getDevIndex).collect(Collectors.toList());
@@ -895,10 +897,12 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService {
@Override
public List<DeviceDTO> devDetail(LargeScreenCountParam largeScreenCountParam) {
DeviceCountVO deviceCountVO = new DeviceCountVO();
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey("pqLineList");
List<String> deptAndChildren = pqsDeptsService.findDeptAndChildren(largeScreenCountParam.getDeptId());
List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
List<Integer> deptslineIds = deptslines.stream().map(PqsDeptsline::getLineIndex).collect(Collectors.toList());
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+"pqLineList");
List<Integer> deptslineIds = (List<Integer>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+largeScreenCountParam.getDeptId());
// List<String> deptAndChildren = pqsDeptsService.findDeptAndChildren(largeScreenCountParam.getDeptId());
// List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
// List<Integer> deptslineIds = deptslines.stream().map(PqsDeptsline::getLineIndex).collect(Collectors.toList());
pqLineList = pqLineList.stream().filter(temp->deptslineIds.contains(temp.getLineIndex())).collect(Collectors.toList());
List<Integer> devIndexs = pqLineList.stream().map(PqLine::getDevIndex).collect(Collectors.toList());
@@ -911,26 +915,27 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService {
@Override
public List<RegionDevCountVO> regionDevCount(LargeScreenCountParam largeScreenCountParam) {
List<RegionDevCountVO> result = new ArrayList<>();
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey("pqLineList");
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+"pqLineList");
List<String> deptAndChildren = pqsDeptsService.findDeptAndChildren(largeScreenCountParam.getDeptId());
if(deptAndChildren.size()>1){
deptAndChildren.remove(largeScreenCountParam.getDeptId());
}
List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
List<PqDevice> pqDeviceList = pqDeviceService.lambdaQuery().eq(PqDevice::getDevflag, 0).list();
// List<PqsDeptsline> deptslines = pqsDeptslineService.lambdaQuery().in(PqsDeptsline::getDeptsIndex, deptAndChildren).eq(PqsDeptsline::getSystype, sysTypeZt).list();
List<PqsDepts> list = pqsDeptsService.lambdaQuery().in(PqsDepts::getDeptsIndex, deptAndChildren).eq(PqsDepts::getState, 1).list();
list.forEach(temp->{
RegionDevCountVO regionDevCountVO = new RegionDevCountVO();
regionDevCountVO.setDeptsIndex(temp.getDeptsIndex());
regionDevCountVO.setDeptsname(temp.getDeptsname());
List<Integer> deptslineIds = deptslines.stream().filter(deptsline->Objects.equals(deptsline.getDeptsIndex(),temp.getDeptsIndex())).map(PqsDeptsline::getLineIndex).collect(Collectors.toList());
List<Integer> deptslineIds =(List<Integer>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+temp.getDeptsIndex());
List<PqLine> collect = pqLineList.stream().filter(pqLine -> deptslineIds.contains(pqLine.getLineIndex())).collect(Collectors.toList());
List<Integer> devIndexs = collect.stream().map(PqLine::getDevIndex).collect(Collectors.toList());
List<PqDevice> tempDeviceList = pqDeviceList.stream().filter(pqDevice -> devIndexs.contains(pqDevice.getDevIndex())).collect(Collectors.toList());
//在运总数
List<PqDevice> pqDeviceList = pqDeviceService.lambdaQuery().in(PqDevice::getDevIndex, devIndexs).eq(PqDevice::getDevflag, 0).list();
long onLine = pqDeviceList.stream().filter(pqDevice -> Objects.equals(pqDevice.getStatus(), 1)).count();
long Offline = pqDeviceList.stream().filter(pqDevice -> Objects.equals(pqDevice.getStatus(), 0)).count();
regionDevCountVO.setAllCount(pqDeviceList.size());
long onLine = tempDeviceList.stream().filter(pqDevice -> Objects.equals(pqDevice.getStatus(), 1)).count();
long Offline = tempDeviceList.stream().filter(pqDevice ->Objects.equals(pqDevice.getStatus(), 0)).count();
regionDevCountVO.setAllCount(tempDeviceList.size());
regionDevCountVO.setOnLine((int) onLine);
regionDevCountVO.setOffLine((int) Offline);
@@ -940,6 +945,130 @@ public class LargeScreenCountServiceImpl implements LargeScreenCountService {
}
@Override
public List<SubStationCountVO> substationCount(LargeScreenCountParam largeScreenCountParam) {
LocalDateTime startTime = largeScreenCountParam.getStartTime();
LocalDateTime endTime = largeScreenCountParam.getEndTime();
List<SubStationCountVO> subStationCountVOS = new ArrayList<>();
List<PqLine> pqLineList = (List<PqLine>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+"pqLineList");
List<Integer> deptslineIds = (List<Integer>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+largeScreenCountParam.getDeptId());
pqLineList = pqLineList.stream().filter(temp->deptslineIds.contains(temp.getLineIndex())).collect(Collectors.toList());
List<Integer> subIndexs = pqLineList.stream().map(PqLine::getSubIndex).collect(Collectors.toList());
List<SubstationDTO> substationDTOS = pqSubstationService.queryListByIds(subIndexs);
Map<Integer, SubstationDTO> substationDTOMap= substationDTOS.stream().collect(Collectors.toMap(SubstationDTO::getStationId, Function.identity()));
//查询暂态事件
List<PqsEventdetail> eventdetails = new ArrayList<>();
if(deptslineIds.size()>1000){
List<List<Integer>> listIds = CollUtil.split(deptslineIds,1000);
for(List<Integer> itemIds : listIds){
List<PqsEventdetail> temp = pqsEventdetailService.lambdaQuery()
.between(PqsEventdetail::getTimeid,startTime, endTime)
.in(PqsEventdetail::getWavetype,msgEventConfigService.getEventType())
.in(PqsEventdetail::getLineid,listIds)
.orderByDesc(PqsEventdetail::getTimeid).list()
;
eventdetails.addAll(temp);
}
}else {
List<PqsEventdetail> temp = pqsEventdetailService.lambdaQuery()
.between(PqsEventdetail::getTimeid, startTime, endTime)
.in(PqsEventdetail::getWavetype,msgEventConfigService.getEventType())
.in(PqsEventdetail::getLineid,deptslineIds)
.orderByDesc(PqsEventdetail::getTimeid).list();
eventdetails.addAll(temp);
}
Map<Integer, List<PqLine>> map = pqLineList.stream().collect(Collectors.groupingBy(PqLine::getSubIndex));
map.forEach((k,v)->{
if(substationDTOMap.containsKey(k)){
SubStationCountVO subStationCountVO = new SubStationCountVO();
SubstationDTO substationDTO = substationDTOMap.get(k);
subStationCountVO.setStationId(substationDTO.getStationId());
subStationCountVO.setStationName(substationDTO.getStationName());
subStationCountVO.setGdName(substationDTO.getGdName());
subStationCountVO.setLongitude(substationDTO.getLongitude());
subStationCountVO.setLatitude(substationDTO.getLatitude());
List<Integer> tempLineIds = v.stream().map(PqLine::getLineIndex).collect(Collectors.toList());
subStationCountVO.setLineCount(tempLineIds.size());
List<PqsEventdetail> tempEventList = eventdetails.stream().filter(temp -> tempLineIds.contains(temp.getLineid())).collect(Collectors.toList());
if(CollectionUtils.isEmpty(tempEventList)){
subStationCountVO.setEventCount(0);
}else {
subStationCountVO.setEventCount(tempEventList.size());
}
subStationCountVOS.add(subStationCountVO);
}
});
return subStationCountVOS;
}
@Override
public Page<EventDetailVO> eventPage(LargeScreenCountParam largeScreenCountParam) {
Page<PqsEventdetail> pqsEventdetailPage = new Page<>(largeScreenCountParam.getPageNum(), largeScreenCountParam.getPageSize());
LocalDateTime startTime = largeScreenCountParam.getStartTime();
LocalDateTime endTime = largeScreenCountParam.getEndTime();
List<Integer> deptslineIds = (List<Integer>) redisUtil.getObjectByKey( NAME_KEY+ StrUtil.DASHED+largeScreenCountParam.getDeptId());
List<LedgerBaseInfoDTO> pqLineList = pqLineService.getBaseLineInfo(deptslineIds);
Map<Integer,LedgerBaseInfoDTO> ledgerBaseInfoDTOMap = pqLineList.stream().collect(Collectors.toMap(LedgerBaseInfoDTO::getLineId, Function.identity()));
QueryWrapper<PqsEventdetail> queryWrapper = new QueryWrapper<>();
if (deptslineIds.size()>1000) {
List<List<Integer>> idPartitions = CollUtil.split(deptslineIds,1000);
queryWrapper.lambda()
.between(PqsEventdetail::getTimeid, startTime, endTime)
.in(PqsEventdetail::getWavetype,msgEventConfigService.getEventType())
.and(ew->{
for(List<Integer> pList: idPartitions){
ew.or(w->w.in(PqsEventdetail::getLineid, pList));
}
}).orderByDesc(PqsEventdetail::getTimeid);
} else {
queryWrapper.lambda()
.between(PqsEventdetail::getTimeid, startTime, endTime)
.in(PqsEventdetail::getLineid, deptslineIds)
.in(PqsEventdetail::getWavetype,msgEventConfigService.getEventType())
.orderByDesc(PqsEventdetail::getTimeid);
}
IPage<PqsEventdetail> list = pqsEventdetailService.getBaseMapper().selectPage(pqsEventdetailPage,queryWrapper);
List<EventDetailVO> collect = list.getRecords().stream().map(temp -> {
EventDetailVO eventDetailVO = new EventDetailVO();
eventDetailVO.setEventdetail_index(temp.getEventdetailIndex());
eventDetailVO.setTimeid(temp.getTimeid());
eventDetailVO.setMs(temp.getMs());
eventDetailVO.setWavetype(temp.getWavetype().toString());
eventDetailVO.setPersisttime(BigDecimal.valueOf(temp.getPersisttime() / 1000).setScale(3, RoundingMode.HALF_UP).toString());
eventDetailVO.setEventvalue(temp.getEventvalue());
eventDetailVO.setLookFlag(temp.getLookFlag());
eventDetailVO.setNoticeFlag(temp.getNoticeFlag());
if(ledgerBaseInfoDTOMap.containsKey(temp.getLineid())){
LedgerBaseInfoDTO ledgerBaseInfoDTO = ledgerBaseInfoDTOMap.get(temp.getLineid());
eventDetailVO.setLineid(ledgerBaseInfoDTO.getLineId());
eventDetailVO.setPointname(ledgerBaseInfoDTO.getLineName());
eventDetailVO.setBdname(ledgerBaseInfoDTO.getStationName());
eventDetailVO.setObjName(ledgerBaseInfoDTO.getObjName());
}
return eventDetailVO;
}).collect(Collectors.toList());
Page<EventDetailVO> returnpage = new Page<>(largeScreenCountParam.getPageNum(), largeScreenCountParam.getPageSize());
returnpage.setRecords(collect);
returnpage.setTotal(list.getTotal());
return returnpage;
}
private List<EventDetailVO> change(List<PqsEventdetail> list,List<MsgEventInfo> handleMsg){
List<EventDetailVO> result = new ArrayList<>();
if(CollectionUtils.isEmpty(list)){