From 7e130e9eb0965ae02c8b694a2f6c187d1d0090c0 Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Fri, 6 Dec 2024 16:40:24 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=9A=82=E9=99=8D=E4=BA=8B=E4=BB=B6=E5=BD=92?= =?UTF-8?q?=E9=9B=86=E5=8A=9F=E8=83=BD=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/dto/relevent/EntityGroupEvtData.java | 173 ++++++- .../pojo/dto/relevent/EntityLogic.java | 4 +- .../pojo/dto/relevent/EntityMtrans.java | 9 +- .../pojo/dto/relevent/EventAssObj.java | 2 +- .../advance/pojo/dto/relevent/SagEvent.java | 2 +- .../njcn/advance/utils/InstantiateUtil.java | 71 +++ .../EventRelevantAnalysisController.java | 8 + .../eventGui/EventGuiController.java | 25 + .../njcn/advance/mapper/RelevanceMapper.java | 9 + .../advance/mapper/RmpEventAdvanceMapper.java | 2 +- .../mapper/RmpEventDetailAssMapper.java | 2 +- .../mapper/mapping/RelevanceMapper.xml | 14 + .../EventRelevantAnalysisServiceImpl.java | 473 +++++++++++++++--- .../njcn/advance/utils/UtilNormalization.java | 43 +- pqs-gateway/Dockerfile | 15 +- pqs-gateway/src/main/resources/bootstrap.yml | 1 + .../src/main/resources/bootstrap.yml | 10 +- pqs-system/system-boot/Dockerfile | 15 +- 18 files changed, 712 insertions(+), 166 deletions(-) create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/utils/InstantiateUtil.java create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/eventGui/EventGuiController.java create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RelevanceMapper.java create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/RelevanceMapper.xml diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/relevent/EntityGroupEvtData.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/relevent/EntityGroupEvtData.java index c4c888941..30d34ad0a 100644 --- a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/relevent/EntityGroupEvtData.java +++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/relevent/EntityGroupEvtData.java @@ -1,36 +1,17 @@ package com.njcn.advance.pojo.dto.relevent; -import com.njcn.advance.pojo.dto.SagEvent; -import lombok.Data; -@Data + public class EntityGroupEvtData implements Cloneable,Comparable { - - //逻辑节点序号 - private int node; - //事件开始时间时标 - private int start_time; - //类别 - private int cata; - //标注类别 - private int cata2; - //物理节点 - private String nodePhysics; - + private int node;//逻辑节点序号 + private int start_time;//事件开始时间时标 + private int cata;//类别 + private int cata2;//标注类别 + private String nodePhysics; //物理节点 private SagEvent sagEvent; - private String sagReason; - - public Object objClone() { - try { - return clone(); - } catch (CloneNotSupportedException e) { - return new EntityGroupEvtData(null, -1, -1, -1,null,null); - } - } - - public EntityGroupEvtData(String nodePhysics, int start_time, int cata, int cata2, SagEvent sagEvent, String sagReason) { + public EntityGroupEvtData(String nodePhysics, int start_time, int cata, int cata2,SagEvent sagEvent,String sagReason) { this.nodePhysics = nodePhysics; this.start_time = start_time; this.cata = cata; @@ -39,6 +20,144 @@ public class EntityGroupEvtData implements Cloneable,Comparable + *
+     * x.clone() != x
+ * will be true, and that the expression: + *
+ *
+     * x.clone().getClass() == x.getClass()
+ * will be {@code true}, but these are not absolute requirements. + * While it is typically the case that: + *
+ *
+     * x.clone().equals(x)
+ * will be {@code true}, this is not an absolute requirement. + * + * By convention, the returned object should be obtained by calling + * {@code super.clone}. If a class and all of its superclasses (except + * {@code Object}) obey this convention, it will be the case that + * {@code x.clone().getClass() == x.getClass()}. + * + * By convention, the object returned by this method should be independent + * of this object (which is being cloned). To achieve this independence, + * it may be necessary to modify one or more fields of the object returned + * by {@code super.clone} before returning it. Typically, this means + * copying any mutable objects that comprise the internal "deep structure" + * of the object being cloned and replacing the references to these + * objects with references to the copies. If a class contains only + * primitive fields or references to immutable objects, then it is usually + * the case that no fields in the object returned by {@code super.clone} + * need to be modified. + * + * The method {@code clone} for class {@code Object} performs a + * specific cloning operation. First, if the class of this object does + * not implement the interface {@code Cloneable}, then a + * {@code CloneNotSupportedException} is thrown. Note that all arrays + * are considered to implement the interface {@code Cloneable} and that + * the return type of the {@code clone} method of an array type {@code T[]} + * is {@code T[]} where T is any reference or primitive type. + * Otherwise, this method creates a new instance of the class of this + * object and initializes all its fields with exactly the contents of + * the corresponding fields of this object, as if by assignment; the + * contents of the fields are not themselves cloned. Thus, this method + * performs a "shallow copy" of this object, not a "deep copy" operation. + * + * The class {@code Object} does not itself implement the interface + * {@code Cloneable}, so calling the {@code clone} method on an object + * whose class is {@code Object} will result in throwing an + * exception at run time. + * + * @return a clone of this instance. + * @throws CloneNotSupportedException if the object's class does not + * support the {@code Cloneable} interface. Subclasses + * that override the {@code clone} method can also + * throw this exception to indicate that an instance cannot + * be cloned. + * @see Cloneable + */ + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + public Object objClone() { + try { + return clone(); + } catch (CloneNotSupportedException e) { + return new EntityGroupEvtData("-1", -1, -1, -1,null,null); + } + } + + @Override + public String toString() { + return "EntityGroupEvtData{" + + "node=" + node + + ", start_time=" + start_time + + ", cata=" + cata + + ", cata2=" + cata2 + + '}'; + } @Override public int compareTo(EntityGroupEvtData obj) { @@ -50,4 +169,4 @@ public class EntityGroupEvtData implements Cloneable,Comparable { + private static final Logger logger= LoggerFactory.getLogger(InstantiateUtil.class); + + + public byte[] instantiate(E e) { + if (e == null) { + return null; + } + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try { + ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); + objectOutputStream.writeObject(e); + objectOutputStream.close(); + return byteArrayOutputStream.toByteArray(); + + } catch (IOException e1) { + logger.error("发生异常,"+e1.getMessage()); + } + + return null; + } + + public E deInstantiate(byte[] bytes) { + if (bytes == null) { + return null; + } + + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); + try { + ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); + try { + return (E) objectInputStream.readObject(); + } catch (ClassNotFoundException e) { + logger.error("发生异常,"+e.getMessage()); + } + } catch (IOException e) { + logger.error("发生异常,"+e.getMessage()); + } + + return null; + } + + public String stringInstantiate(E e) { //序列化对象的byte[]数组转为字符串(包装类可不调用) + byte[] bytes = instantiate(e); + + if (bytes != null && bytes.length>0 ) { + return Base64.encode(bytes); + } + + return ""; + } + + public byte[] stringDeInstantiate(String str) { //stringInstantiate方法还原为byte[]数组 + if (!StringUtils.isEmpty(str)) { + return Base64.decode(str); + } + return null; + } +} diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/EventRelevantAnalysisController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/EventRelevantAnalysisController.java index 6caccee99..966a6f418 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/EventRelevantAnalysisController.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/EventRelevantAnalysisController.java @@ -188,4 +188,12 @@ public class EventRelevantAnalysisController extends BaseController { boolean flag = eventRelevantAnalysisService.delRelevantLog(id); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, flag, methodDescribe); } + + + + + + + + } diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/eventGui/EventGuiController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/eventGui/EventGuiController.java new file mode 100644 index 000000000..661eb53fc --- /dev/null +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/eventGui/EventGuiController.java @@ -0,0 +1,25 @@ +package com.njcn.advance.controller.eventGui; + + +import com.njcn.common.utils.PubUtils; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.io.DataInputStream; +import java.net.URLDecoder; +import java.time.LocalDateTime; +import java.util.List; + +@RestController +@RequestMapping("process") +@Api(tags = "暂降事件关联分析") +@RequiredArgsConstructor +@Slf4j +public class EventGuiController { + + + +} diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RelevanceMapper.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RelevanceMapper.java new file mode 100644 index 000000000..fe9d93a96 --- /dev/null +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RelevanceMapper.java @@ -0,0 +1,9 @@ +package com.njcn.advance.mapper; + +public interface RelevanceMapper { + + + // 查询监测点的线路ID + String queryLineIdbyPointId(String pointId); + +} diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventAdvanceMapper.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventAdvanceMapper.java index 3b3092793..d29f81bc9 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventAdvanceMapper.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventAdvanceMapper.java @@ -1,7 +1,7 @@ package com.njcn.advance.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.njcn.advance.pojo.dto.SagEvent; + import com.njcn.event.pojo.po.RmpEventDetailPO; import org.apache.ibatis.annotations.Param; diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventDetailAssMapper.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventDetailAssMapper.java index 50a68d4b3..68af15bc9 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventDetailAssMapper.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/RmpEventDetailAssMapper.java @@ -1,7 +1,7 @@ package com.njcn.advance.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.njcn.advance.pojo.dto.SagEvent; + import com.njcn.advance.pojo.dto.relevent.EventAssObj; import com.njcn.event.pojo.po.RmpEventDetailAssPO; import org.apache.ibatis.annotations.Param; diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/RelevanceMapper.xml b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/RelevanceMapper.xml new file mode 100644 index 000000000..b885b69f0 --- /dev/null +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/RelevanceMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java index 54cc0a62a..febeb5e23 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java @@ -5,7 +5,9 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.TimeInterval; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.SerializeUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -15,7 +17,7 @@ import com.njcn.advance.enums.AdvanceResponseEnum; import com.njcn.advance.mapper.RelevantLogMapper; import com.njcn.advance.mapper.RmpEventAdvanceMapper; import com.njcn.advance.mapper.RmpEventDetailAssMapper; -import com.njcn.advance.pojo.dto.SagEvent; + import com.njcn.advance.pojo.dto.relevent.*; import com.njcn.advance.pojo.po.PqsRelevanceLog; import com.njcn.advance.service.EventRelevantAnalysisService; @@ -26,10 +28,12 @@ import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.utils.PubUtils; import com.njcn.device.pq.api.GeneralDeviceInfoClient; import com.njcn.device.pq.api.LineFeignClient; +import com.njcn.device.pq.pojo.po.PqsTflgployass; import com.njcn.device.pq.pojo.vo.AreaLineInfoVO; import com.njcn.event.pojo.po.RmpEventDetailAssPO; import com.njcn.event.pojo.po.RmpEventDetailPO; import com.njcn.event.pojo.vo.AdvanceEventDetailVO; +import com.njcn.redis.utils.RedisUtil; import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataTypeEnum; @@ -40,8 +44,10 @@ import com.njcn.user.pojo.po.User; import com.njcn.web.factory.PageFactory; import com.njcn.web.pojo.param.BaseParam; import com.njcn.web.utils.RequestUtil; +import io.swagger.models.auth.In; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import net.sf.json.JSONObject; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -63,6 +69,8 @@ import java.util.stream.Collectors; @Slf4j public class EventRelevantAnalysisServiceImpl extends ServiceImpl implements EventRelevantAnalysisService { + private final String redisSortKey = "NODESORT"; + private final DicDataFeignClient dicDataFeignClient; @@ -78,6 +86,8 @@ public class EventRelevantAnalysisServiceImpl extends ServiceImpl list3 = new ArrayList<>(baseList); - // 传入的处理事件根据物理隔绝进行分组 - List strategyList = relevantLogMapper.getLogic(); - if (CollectionUtil.isNotEmpty(strategyList)) { - List listSagEvent = new ArrayList<>(); - List listEventAssObj = new ArrayList<>(); + Map entityMtransMap = getNodeInfo(); + Set> setMtrans = entityMtransMap.entrySet(); - Map> strategyToBusBarMap = new HashMap<>(32); + List listSagEvent = new ArrayList<>(); + List listEventAssObj = new ArrayList<>(); - Map mapRedis = new HashMap<>(32); + Map> nodeMap = (Map>)redisUtil.getObjectByKey(redisSortKey); + Set>> nodeSort = nodeMap.entrySet(); - Map> strategyMap = strategyList.stream().collect(Collectors.groupingBy(EntityLogic::getTPIndex)); - strategyMap.forEach((key, list) -> { - List before = list.stream().map(EntityLogic::getNodeBefore).distinct().collect(Collectors.toList()); - List after = list.stream().map(EntityLogic::getNodeNext).distinct().collect(Collectors.toList()); - before.addAll(after); - before = before.stream().distinct().collect(Collectors.toList()); - strategyToBusBarMap.put(key, before); - FinalData.NODE_NUM = before.size(); - EntityMtrans entityMtrans = new EntityMtrans(); - handleEvent.create_matrixcata(list, entityMtrans); + DictData dictData = dicDataFeignClient.getDicDataByNameAndTypeName(DicDataTypeEnum.EVENT_REASON.getName(), DicDataEnum.SHORT_TROUBLE.getName()).getData(); + if (Objects.isNull(dictData)) { + throw new BusinessException(SystemResponseEnum.ADVANCE_REASON); + } - mapRedis.put(key, entityMtrans); - }); + for (Map.Entry> m : nodeSort) { + List list = new ArrayList(); + Set> mapValue = m.getValue().entrySet(); + FinalData.NODE_NUM = m.getValue().size(); - strategyToBusBarMap.forEach((lastKey, lastVal) -> { - int index = 1; - List list = new ArrayList<>(); - for (EntityGroupEvtData entityGroupEvtData : baseList) { - if (lastVal.contains(entityGroupEvtData.getNodePhysics()) && dictData.getId().equals(entityGroupEvtData.getSagReason())) { - entityGroupEvtData.setNode(index++); - list.add(entityGroupEvtData); + for (Map.Entry mm : mapValue) { + for (EntityGroupEvtData groupEvtData : baseList) { + if (groupEvtData.getNodePhysics().equals(mm.getKey()) && dictData.getId().equals(groupEvtData.getSagReason())) { + groupEvtData.setNode(mm.getValue()); + list.add(groupEvtData); } } - baseList.removeIf(entityGroupEvtData -> lastVal.contains(entityGroupEvtData.getNodePhysics()) && dictData.getId().equals(entityGroupEvtData.getSagReason())); + // 筛选不在矩阵中的事件id + list3.removeIf(entityGroupEvtData -> entityGroupEvtData.getNodePhysics().equals(mm.getKey()) && dictData.getId().equals(entityGroupEvtData.getSagReason())); + } + EntityGroupEvtData[] entityGroupEvtData = new EntityGroupEvtData[list.size()]; + Collections.sort(list); + list.toArray(entityGroupEvtData); - EntityGroupEvtData[] entityGroupEvtData = new EntityGroupEvtData[list.size()]; - Collections.sort(list); - list.toArray(entityGroupEvtData); + for (Map.Entry mEntry : setMtrans) { + if (mEntry.getKey().equals(m.getKey())) { - mapRedis.forEach((mKey, mVal) -> { - if (mKey.equals(lastKey)) { - /******************************************************************** - * 算法最多处理1000条数据,超过限制需分批处理 先将数据根据某种方式进行升序/降序排序,然后分段处理 加入循环处理 - *********************************************************************/ - int circulation = entityGroupEvtData.length % FinalData.MAX_EVT_NUM == 0 - ? entityGroupEvtData.length / FinalData.MAX_EVT_NUM - : entityGroupEvtData.length / FinalData.MAX_EVT_NUM + 1; + //算法最多处理1000条数据,超过限制需分批处理 先将数据根据某种方式进行升序/降序排序,然后分段处理 加入循环处理 - for (int i = 0; i < circulation; i++) { - int to; - if (i == circulation - 1) { - to = entityGroupEvtData.length % FinalData.MAX_EVT_NUM > 0 - ? entityGroupEvtData.length - : (i + 1) * FinalData.MAX_EVT_NUM - 1; - } else { - to = (i + 1) * FinalData.MAX_EVT_NUM - 1; - } + int circulation = entityGroupEvtData.length % FinalData.MAX_EVT_NUM == 0 + ? entityGroupEvtData.length / FinalData.MAX_EVT_NUM + : entityGroupEvtData.length / FinalData.MAX_EVT_NUM + 1; - EntityGroupEvtData[] arrayObj = Arrays.copyOfRange(entityGroupEvtData, - i * FinalData.MAX_EVT_NUM, to); - EntityGroupData entityGroupData = handleEvent.translate(arrayObj, mVal); - // 处理分析结果 - handleEvent.show_group_info(entityGroupData, listSagEvent, listEventAssObj, date); + for (int i = 0; i < circulation; i++) { + int to = 0; + + if (i == circulation - 1) { + to = entityGroupEvtData.length % FinalData.MAX_EVT_NUM > 0 + ? entityGroupEvtData.length + : (i + 1) * FinalData.MAX_EVT_NUM - 1; + } else { + to = (i + 1) * FinalData.MAX_EVT_NUM - 1; } + + EntityGroupEvtData[] arrayObj = Arrays.copyOfRange(entityGroupEvtData, + i * FinalData.MAX_EVT_NUM, to); + EntityMtrans entityMtrans = mEntry.getValue(); + EntityGroupData entityGroupData = handleEvent.translate(arrayObj,entityMtrans); + // 处理分析结果 + handleEvent.show_group_info(entityGroupData, listSagEvent, listEventAssObj, date); } - }); - - }); + } + } + } + + + + + + - /****************************************************************************** - * 事件ID不在矩阵中,结果集为基础以时标为标准进行归集处理 注意:三相与(单相/两相)互斥 - *****************************************************************************/ disposeNonStandardData(handleEvent, baseList, listEventAssObj, listSagEvent, date); @@ -216,13 +220,232 @@ public class EventRelevantAnalysisServiceImpl extends ServiceImpl> nodeSort = new HashMap<>(); +// Map entityMtransMap = getNodeInfo(); +// +// +// +// +// +// for (Map.Entry> m : nodeSort) { +// List list = new ArrayList(); +// Set> mapValue = m.getValue().entrySet(); +// FinalData.NODE_NUM = m.getValue().size(); +// +// for (Map.Entry mm : mapValue) { +// for (int i = 0; i < entityGroupEvtDatas.length; i++) { +// if (entityGroupEvtDatas[i].getNodePhysics() == mm.getKey().intValue() && "短路故障".equals(entityGroupEvtDatas[i].getSagReason())) { +// entityGroupEvtDatas[i].setNode(mm.getValue()); +// list.add(entityGroupEvtDatas[i]); +// } +// } +// +// // 筛选不在矩阵中的事件id +// Iterator iterator = list3.iterator(); +// while (iterator.hasNext()) { +// EntityGroupEvtData entityGroupEvtData = iterator.next(); +// +// if (entityGroupEvtData.getNodePhysics() == mm.getKey().intValue() && "短路故障".equals(entityGroupEvtData.getSagReason())) { +// iterator.remove(); +// } +// } +// } +// +// EntityGroupEvtData[] entityGroupEvtData = new EntityGroupEvtData[list.size()]; +// Collections.sort(list); +// list.toArray(entityGroupEvtData); +// +// for (Map.Entry mEntry : setMtrans) { +// if (mEntry.getKey().equals(m.getKey())) { +// *//**//******************************************************************** +// * 算法最多处理1000条数据,超过限制需分批处理 先将数据根据某种方式进行升序/降序排序,然后分段处理 加入循环处理 +// *********************************************************************//**//* +// int circulation = entityGroupEvtData.length % FinalData.MAX_EVT_NUM == 0 +// ? entityGroupEvtData.length / FinalData.MAX_EVT_NUM +// : entityGroupEvtData.length / FinalData.MAX_EVT_NUM + 1; +// +// for (int i = 0; i < circulation; i++) { +// int to = 0; +// +// if (i == circulation - 1) { +// to = entityGroupEvtData.length % FinalData.MAX_EVT_NUM > 0 +// ? entityGroupEvtData.length +// : (i + 1) * FinalData.MAX_EVT_NUM - 1; +// } else { +// to = (i + 1) * FinalData.MAX_EVT_NUM - 1; +// } +// +// EntityGroupEvtData[] arrayObj = Arrays.copyOfRange(entityGroupEvtData, +// i * FinalData.MAX_EVT_NUM, to); +// JSONObject entityMtrans = mEntry.getValue(); +// EntityGroupData entityGroupData = handleEvent.translate(arrayObj, (EntityMtrans) JSONObject.toBean(entityMtrans, EntityMtrans.class)); +// // 处理分析结果 +// handleEvent.show_group_info(entityGroupData, listSagEvent, listEventAssObj, date); +// } +// } +// } +// } +// +// +// DictData dictData = dicDataFeignClient.getDicDataByNameAndTypeName(DicDataTypeEnum.EVENT_REASON.getName(), DicDataEnum.SHORT_TROUBLE.getName()).getData(); +// if (Objects.isNull(dictData)) { +// throw new BusinessException(SystemResponseEnum.ADVANCE_REASON); +// } +// +// +// LocalDateTime date = LocalDateTime.now(); +// HandleEvent handleEvent = new HandleEvent(); +// // 分析的事件进行处理 +// List baseList = handleEvent.getData(startTime, endTime); +// if (CollectionUtil.isEmpty(baseList)) { +// throw new BusinessException("当前时间段暂无可分析事件"); +// } +// +// // 传入的处理事件根据物理隔绝进行分组 +// +// List strategyList = relevantLogMapper.getLogic(); +// +// if (CollectionUtil.isNotEmpty(strategyList)) { +// List listSagEvent = new ArrayList<>(); +// List listEventAssObj = new ArrayList<>(); +// +// Map> strategyToBusBarMap = new HashMap<>(32); +// +// Map mapRedis = new HashMap<>(32); +// +// Map> strategyMap = strategyList.stream().collect(Collectors.groupingBy(EntityLogic::getTPIndex)); +// strategyMap.forEach((key, list) -> { +// List before = list.stream().map(EntityLogic::getNodeBefore).distinct().collect(Collectors.toList()); +// List after = list.stream().map(EntityLogic::getNodeNext).distinct().collect(Collectors.toList()); +// before.addAll(after); +// before = before.stream().distinct().collect(Collectors.toList()); +// strategyToBusBarMap.put(key, before); +// +// FinalData.NODE_NUM = before.size(); +// EntityMtrans entityMtrans = new EntityMtrans(); +// handleEvent.create_matrixcata(list, entityMtrans); +// +// mapRedis.put(key, entityMtrans); +// }); +// +// strategyToBusBarMap.forEach((lastKey, lastVal) -> { +// int index = 1; +// List list = new ArrayList<>(); +// for (EntityGroupEvtData entityGroupEvtData : baseList) { +// if (lastVal.contains(entityGroupEvtData.getNodePhysics()) && dictData.getId().equals(entityGroupEvtData.getSagReason())) { +// entityGroupEvtData.setNode(index++); +// list.add(entityGroupEvtData); +// } +// } +// +// baseList.removeIf(entityGroupEvtData -> lastVal.contains(entityGroupEvtData.getNodePhysics()) && dictData.getId().equals(entityGroupEvtData.getSagReason())); +// +// +// EntityGroupEvtData[] entityGroupEvtData = new EntityGroupEvtData[list.size()]; +// Collections.sort(list); +// list.toArray(entityGroupEvtData); +// +// mapRedis.forEach((mKey, mVal) -> { +// if (mKey.equals(lastKey)) { +// //算法最多处理1000条数据,超过限制需分批处理 先将数据根据某种方式进行升序/降序排序,然后分段处理 加入循环处理 +// int circulation = entityGroupEvtData.length % FinalData.MAX_EVT_NUM == 0 +// ? entityGroupEvtData.length / FinalData.MAX_EVT_NUM +// : entityGroupEvtData.length / FinalData.MAX_EVT_NUM + 1; +// +// for (int i = 0; i < circulation; i++) { +// int to; +// if (i == circulation - 1) { +// to = entityGroupEvtData.length % FinalData.MAX_EVT_NUM > 0 +// ? entityGroupEvtData.length +// : (i + 1) * FinalData.MAX_EVT_NUM - 1; +// } else { +// to = (i + 1) * FinalData.MAX_EVT_NUM - 1; +// } +// +// EntityGroupEvtData[] arrayObj = Arrays.copyOfRange(entityGroupEvtData, +// i * FinalData.MAX_EVT_NUM, to); +// EntityGroupData entityGroupData = handleEvent.translate(arrayObj, mVal); +// // 处理分析结果 +// handleEvent.show_group_info(entityGroupData, listSagEvent, listEventAssObj, date); +// } +// } +// }); +// +// }); +// +// +// +// //事件ID不在矩阵中,结果集为基础以时标为标准进行归集处理 注意:三相与(单相/两相)互斥 +// +// disposeNonStandardData(handleEvent, baseList, listEventAssObj, listSagEvent, date); +// +// +// int listSize = listEventAssObj.size(); +// int toIndex = 1000; +// for (int i = 0; i < listSize; i += 1000) { +// //作用为toIndex最后没有toIndex条数据则剩余几条newList中就装几条 +// if (i + 1000 > listSize) { +// toIndex = listSize - i; +// } +// //分割lst +// List newList = listEventAssObj.subList(i, i + toIndex); +// //写入添加方法,需要写你的新增方法,把newList分切后的数据新增进入数据库。 +// rmpEventDetailAssMapper.insertEventAssData(newList); +// } +// +// List eventUpdateList = new ArrayList<>(); +// for (int i = 0; i < listSagEvent.size(); i++) { +// RmpEventDetailPO rmp = new RmpEventDetailPO(); +// rmp.setEventId(listSagEvent.get(i).getIndexEventDetail()); +// rmp.setEventassIndex(listSagEvent.get(i).getIndexEventAss()); +// rmp.setDealTime(listSagEvent.get(i).getDealTime()); +// eventUpdateList.add(rmp); +// if ((i + 1) % 1000 == 0) { +// this.updateBatchById(eventUpdateList); +// eventUpdateList.clear(); +// } else if (i == listSagEvent.size() - 1) { +// this.updateBatchById(eventUpdateList); +// } +// } +// +// // 增加策略记录 +// String describe = "用户" + RequestUtil.getUserNickname() + "进行了关联分析"; +// PqsRelevanceLog entityPqsRelevance = new PqsRelevanceLog(); +// entityPqsRelevance.setContentDes(describe); +// entityPqsRelevance.setState(DataStateEnum.ENABLE.getCode()); +// entityPqsRelevance.setTimeId(date); +// relevantLogMapper.insert(entityPqsRelevance); +// +// } else { +// throw new BusinessException("当前无变压器策略,请先配置策略"); +// } +// +// log.info("事件关联分析用时:" + timeInterval.interval() / 1000 + "秒"); +// } + + + + + + + @Override public Page querySagEventsPage(BaseParam baseParam) { List lineIds = generalDeviceInfoClient.deptGetRunLineEvent(RequestUtil.getDeptIndex()).getData(); @@ -635,31 +858,116 @@ public class EventRelevantAnalysisServiceImpl extends ServiceImpl getNodeInfo( ) { + Map entityMtranMap = new HashMap<>(32); + + HandleEvent handleEvent = new HandleEvent(); List list = relevantLogMapper.getLogic(); if (CollectionUtil.isNotEmpty(list)) { - Map> tfMap = list.stream().collect(Collectors.groupingBy(EntityLogic::getTPIndex)); - Map> tfBusBarMap = new HashMap<>(32); - Map entityMtranMap = new HashMap<>(32); + Map> map = getLogicInfo(list); + Map> setNodeSort = nodeSort(map); + redisUtil.saveByKeyWithExpire(redisSortKey,setNodeSort,-1L); - tfMap.forEach((key, val) -> { - List tem = new ArrayList<>(); - val.forEach(it -> { - tem.add(it.getNodeBefore()); - tem.add(it.getNodeNext()); - }); - tfBusBarMap.put(key, tem); + setNodeSort.forEach((key, val) -> { + FinalData.NODE_NUM = val.size(); + List listNew = new ArrayList<>(); + + for (EntityLogic entityLogic : list) { + if (entityLogic.getTPIndex().equals(key)) { + entityLogic.setNode_h(val.get(entityLogic.getNodeBefore())); + entityLogic.setNode_l(val.get(entityLogic.getNodeNext())); + listNew.add(entityLogic); + } + } EntityMtrans entityMtrans = new EntityMtrans(); - handleEvent.create_matrixcata(val, entityMtrans); + handleEvent.create_matrixcata(listNew, entityMtrans); entityMtranMap.put(key, entityMtrans); }); - - } + return entityMtranMap; + } + + + /******************************************* + * 增加排序功能并缓存进redis + *******************************************/ + public Map> nodeSort(Map> mapList) { + Set>> sets = mapList.entrySet(); + Map> map = new HashMap<>(); + + for (Map.Entry> m : sets) { + int index = 1; + Map map2 = new HashMap<>(); + + for (String item : m.getValue()) { + map2.put(item, index++); + } + + map.put(m.getKey(), map2); + } + + + return map; + } + + + /** + * 抽取物理隔绝信息与母线的关系并放入map集合中 + * 与getTflgPloyInfo()方法功能类似 + */ + public Map> getLogicInfo(List list) { + if (list.size() > 0) { + Iterator iterator = getAreaInfo(list).iterator(); + Map> map = new HashMap<>(); + + while (iterator.hasNext()) { + List listLogic = new ArrayList<>(); + String areaString = iterator.next(); + + for (EntityLogic entityLogic : list) { + if (entityLogic.getTPIndex().equals(areaString)) { + listLogic.add(entityLogic.getNodeBefore()); + listLogic.add(entityLogic.getNodeNext()); + } + } + + //去除list中重复数据 + Set set = new TreeSet<>(listLogic); + map.put(areaString, new ArrayList<>(set)); + } + + return map; + } + + return null; + } + + + /** + * 获取物理隔绝编码信息 + * 供getInfo()、getLogicInfo()方法使用 + * 先从list数组中去重,然后获取物理隔绝编码 + */ + public Set getAreaInfo(List list) { + Set set = new HashSet(list); + Iterator iterator = set.iterator(); + Set setReturn = new HashSet(); + + while (iterator.hasNext()) { + Object object = iterator.next(); + + if (object instanceof PqsTflgployass) { + setReturn.add(((PqsTflgployass) object).getTpIndex()); + continue; + } + + setReturn.add(((EntityLogic) object).getTPIndex()); + } + + return setReturn; } @@ -697,3 +1005,4 @@ public class EventRelevantAnalysisServiceImpl extends ServiceImpl(); } } + diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/UtilNormalization.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/UtilNormalization.java index 5c03f278d..b3c189075 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/UtilNormalization.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/UtilNormalization.java @@ -4,28 +4,33 @@ package com.njcn.advance.utils; import com.njcn.advance.pojo.dto.relevent.*; public class UtilNormalization { - public static void matrixcata_pro(EntityLogic[] transformer, EntityMtrans entityMtrans, int len) { - int i, j, k, con; - String node1, node2; + public static void matrixcata_pro(EntityLogic[] transformer,EntityMtrans entityMtrans, int len) { + int i, j, k; + int node1, node2, con; int src_node[] = new int[] { 0 }; // 连接方式转化为矩阵形式,行、列表示所有节点 // inf表示两个节点不相连,0表示与自身相连,其他数值表示变压器连接类型 // 将初始矩阵的元素设为inf,对角线元素设为0 for (i = 0; i < FinalData.NODE_NUM; i++) { - for (j = 0; j < FinalData.NODE_NUM; j++) { + for (j = 0; j < FinalData.NODE_NUM; j++) entityMtrans.getMtrans()[i][j] = FinalData.DATA_INF; - } entityMtrans.getMtrans()[i][i] = 0; } - + // 根据transformer设置元素 + for (i = 0; i < len; i++) { + node1 = transformer[i].getNode_h(); + node2 = transformer[i].getNode_l(); + con = transformer[i].getType(); + entityMtrans.getMtrans()[node1 - 1][node2 - 1] = con; + entityMtrans.getMtrans()[node2 - 1][node1 - 1] = con; + } StringBuilder str = new StringBuilder(); for (i = 0; i < FinalData.NODE_NUM; i++) { for (j = 0; j < FinalData.NODE_NUM; j++) { str.append(entityMtrans.getMtrans()[i][j]).append(" "); - if (j == (FinalData.NODE_NUM - 1)) { + if (j == (FinalData.NODE_NUM - 1)) str.append("\r\n"); - } } } @@ -33,60 +38,52 @@ public class UtilNormalization { // Matrixcata模式匹配矩阵,列为节点数,行为总类别数,元素为第一个节点分别是1-6类别情况下其他节点类别情况。 // 元素1,2,3,4,5,6 分别对应 Dc,Cb,Da,Cc,Db,Ca // 设置矩阵第一行元素 - for (i = 0; i < FinalData.NODE_NUM; i++) { + for (i = 0; i < FinalData.NODE_NUM; i++) entityMtrans.getMatrixcata0()[0][i] = 0; - } for (i = 1; i < FinalData.NODE_NUM; i++) { // 路径缓存清空 for (j = 0; j < FinalData.MAX_PATH_NUM; j++) { - for (k = 0; k < (FinalData.NODE_NUM + 1); k++) { + for (k = 0; k < (FinalData.NODE_NUM + 1); k++) entityMtrans.getPossiable_path()[j][k] = 0; - } } entityMtrans.setPath_num(0); // 寻找路径 src_node[0] = 0; findPath(entityMtrans, src_node, i, 0, 1, FinalData.NODE_NUM); - if (entityMtrans.getPath_num() != 0) { + if (entityMtrans.getPath_num() != 0) entityMtrans.getMatrixcata0()[0][i] = entityMtrans.getPossiable_path()[0][FinalData.NODE_NUM]; // 采用第一条路径 - } else { + else entityMtrans.getMatrixcata0()[0][i] = FinalData.DATA_INF; // 找不到路径填大值表示不通 - } } // 构造矩阵其他行元素 for (i = 1; i < FinalData.EVT_TYPE_NUM; i++) { for (j = 0; j < FinalData.NODE_NUM; j++) // EntityGroupData.Matrixcata0[i][j] = // EntityGroupData.Matrixcata0[0][j] + i; - { if (entityMtrans.getMatrixcata0()[0][j] == FinalData.DATA_INF) { entityMtrans.getMatrixcata0()[i][j] = FinalData.DATA_INF; } else { entityMtrans.getMatrixcata0()[i][j] = entityMtrans.getMatrixcata0()[0][j] + i; } - } } // 将数据归类到0-5 for (i = 0; i < FinalData.EVT_TYPE_NUM; i++) { - for (j = 0; j < FinalData.NODE_NUM; j++) { + for (j = 0; j < FinalData.NODE_NUM; j++) entityMtrans.getMatrixcata1()[i][j] = entityMtrans.getMatrixcata0()[i][j] % 6; - } } // 0换成6,将数据归类到1-6 for (i = 0; i < FinalData.EVT_TYPE_NUM; i++) { for (j = 0; j < FinalData.NODE_NUM; j++) { - if (entityMtrans.getMatrixcata1()[i][j] == 0) { + if (entityMtrans.getMatrixcata1()[i][j] == 0) entityMtrans.getMatrixcata1()[i][j] = 6; - } } } str.delete(0, str.length()); for (i = 0; i < FinalData.EVT_TYPE_NUM; i++) { for (j = 0; j < FinalData.NODE_NUM; j++) { str.append(entityMtrans.getMatrixcata1()[i][j]).append(" "); - if (j == (FinalData.NODE_NUM - 1)) { + if (j == (FinalData.NODE_NUM - 1)) str.append("\r\n"); - } } } diff --git a/pqs-gateway/Dockerfile b/pqs-gateway/Dockerfile index 833a98ba7..b40ed2ace 100644 --- a/pqs-gateway/Dockerfile +++ b/pqs-gateway/Dockerfile @@ -1,12 +1,5 @@ -FROM eclipse-temurin:8-jdk-centos7 -MAINTAINER hongawen_13914774158@163.com -ENV JAVA_OPTS="-Xms1024m -Xmx1024m" -# 挂载时区的目录 -VOLUME /usr/share/zoneinfo -# 设置时区为上海 -ENV TZ=Asia/Shanghai -# 设置时区信息 -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +FROM openjdk:8-jdk-alpine ADD target/gateway.jar gateway.jar -ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /gateway.jar -EXPOSE 10215 \ No newline at end of file +ENTRYPOINT ["java","-jar","/gateway.jar"] +EXPOSE 10215 +RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone \ No newline at end of file diff --git a/pqs-gateway/src/main/resources/bootstrap.yml b/pqs-gateway/src/main/resources/bootstrap.yml index 597930b04..500d2be01 100644 --- a/pqs-gateway/src/main/resources/bootstrap.yml +++ b/pqs-gateway/src/main/resources/bootstrap.yml @@ -231,6 +231,7 @@ whitelist: - /bpm-boot/** - /harmonic-boot/comAccess/getComAccessData - /harmonic-boot/harmonic/getHistoryResult + - /event-boot/transient/getTransientAnalyseWave #开始 # - /advance-boot/** # - /device-boot/** diff --git a/pqs-prepare/prepare-boot/src/main/resources/bootstrap.yml b/pqs-prepare/prepare-boot/src/main/resources/bootstrap.yml index b20f2cf9d..1f8418f35 100644 --- a/pqs-prepare/prepare-boot/src/main/resources/bootstrap.yml +++ b/pqs-prepare/prepare-boot/src/main/resources/bootstrap.yml @@ -24,9 +24,13 @@ spring: ip: @service.server.url@ server-addr: @nacos.url@ namespace: @nacos.namespace@ + username: @nacos.username@ + password: @nacos.password@ config: server-addr: @nacos.url@ namespace: @nacos.namespace@ + username: @nacos.username@ + password: @nacos.password@ file-extension: yaml shared-configs: - data-id: share-config.yaml @@ -42,15 +46,17 @@ liteflow: dataId: prepare_liteflow group: DEFAULT_GROUP namespace: @nacos.namespace@ + username: @nacos.username@ + password: @nacos.password@ when-max-wait-time: 600000 print-banner: false #项目日志的配置 logging: - config: http://@nacos.url@/nacos/v1/cs/configs?tenant=@nacos.namespace@&group=DEFAULT_GROUP&dataId=logback.xml + #config: http://@nacos.url@/nacos/v1/cs/configs?tenant=@nacos.namespace@&group=DEFAULT_GROUP&dataId=logback.xml level: - root: error + root: info ##mybatis配置信息 diff --git a/pqs-system/system-boot/Dockerfile b/pqs-system/system-boot/Dockerfile index 2c1194041..eed207d30 100644 --- a/pqs-system/system-boot/Dockerfile +++ b/pqs-system/system-boot/Dockerfile @@ -1,15 +1,8 @@ FROM openjdk:8-jdk-alpine -FROM eclipse-temurin:8-jdk-ubi9-minimal -MAINTAINER hongawen_13914774158@163.com -ENV JAVA_OPTS="-Xms1024m -Xmx1024m" -# 挂载时区的目录 -VOLUME /usr/share/zoneinfo -# 设置时区为上海 -ENV TZ=Asia/Shanghai -# 设置时区信息 -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ADD target/systemboot.jar systemboot.jar ENTRYPOINT ["java","-jar","/systemboot.jar"] -ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /systemboot.jar EXPOSE 10207 -RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone \ No newline at end of file +RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone + +#下面是审计日志备份现场环境缺少字体库 +#RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/* \ No newline at end of file