From affeda91d276b336ab56f21b71ad7f40606eb67a Mon Sep 17 00:00:00 2001 From: huangfeng Date: Tue, 19 Nov 2024 13:50:44 +0800 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A061850=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AFFileDirectoryRequest=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iec61850bean/ServerAssociation.java | 53 ++++++------------- 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/beanit/iec61850bean/ServerAssociation.java b/src/main/java/com/beanit/iec61850bean/ServerAssociation.java index 1ddbb95..9c3d23b 100644 --- a/src/main/java/com/beanit/iec61850bean/ServerAssociation.java +++ b/src/main/java/com/beanit/iec61850bean/ServerAssociation.java @@ -21,48 +21,13 @@ import com.beanit.asn1bean.ber.types.BerNull; import com.beanit.asn1bean.ber.types.string.BerVisibleString; import com.beanit.iec61850bean.internal.BerBoolean; import com.beanit.iec61850bean.internal.NamedThreadFactory; -import com.beanit.iec61850bean.internal.mms.asn1.AccessResult; -import com.beanit.iec61850bean.internal.mms.asn1.ConfirmedErrorPDU; -import com.beanit.iec61850bean.internal.mms.asn1.ConfirmedRequestPDU; -import com.beanit.iec61850bean.internal.mms.asn1.ConfirmedResponsePDU; -import com.beanit.iec61850bean.internal.mms.asn1.ConfirmedServiceRequest; -import com.beanit.iec61850bean.internal.mms.asn1.ConfirmedServiceResponse; -import com.beanit.iec61850bean.internal.mms.asn1.Data; -import com.beanit.iec61850bean.internal.mms.asn1.DataAccessError; -import com.beanit.iec61850bean.internal.mms.asn1.DefineNamedVariableListRequest; -import com.beanit.iec61850bean.internal.mms.asn1.DefineNamedVariableListResponse; -import com.beanit.iec61850bean.internal.mms.asn1.DeleteNamedVariableListRequest; -import com.beanit.iec61850bean.internal.mms.asn1.DeleteNamedVariableListResponse; -import com.beanit.iec61850bean.internal.mms.asn1.GetNameListRequest; -import com.beanit.iec61850bean.internal.mms.asn1.GetNameListResponse; +import com.beanit.iec61850bean.internal.mms.asn1.*; import com.beanit.iec61850bean.internal.mms.asn1.GetNameListResponse.ListOfIdentifier; -import com.beanit.iec61850bean.internal.mms.asn1.GetNamedVariableListAttributesResponse; -import com.beanit.iec61850bean.internal.mms.asn1.GetVariableAccessAttributesRequest; -import com.beanit.iec61850bean.internal.mms.asn1.GetVariableAccessAttributesResponse; -import com.beanit.iec61850bean.internal.mms.asn1.Identifier; -import com.beanit.iec61850bean.internal.mms.asn1.InitiateRequestPDU; -import com.beanit.iec61850bean.internal.mms.asn1.InitiateResponsePDU; -import com.beanit.iec61850bean.internal.mms.asn1.Integer16; -import com.beanit.iec61850bean.internal.mms.asn1.Integer32; -import com.beanit.iec61850bean.internal.mms.asn1.Integer8; -import com.beanit.iec61850bean.internal.mms.asn1.MMSpdu; -import com.beanit.iec61850bean.internal.mms.asn1.ObjectName; import com.beanit.iec61850bean.internal.mms.asn1.ObjectName.DomainSpecific; -import com.beanit.iec61850bean.internal.mms.asn1.ParameterSupportOptions; -import com.beanit.iec61850bean.internal.mms.asn1.ReadRequest; -import com.beanit.iec61850bean.internal.mms.asn1.ReadResponse; import com.beanit.iec61850bean.internal.mms.asn1.ReadResponse.ListOfAccessResult; import com.beanit.iec61850bean.internal.mms.asn1.ServiceError.ErrorClass; -import com.beanit.iec61850bean.internal.mms.asn1.ServiceSupportOptions; -import com.beanit.iec61850bean.internal.mms.asn1.TypeDescription; import com.beanit.iec61850bean.internal.mms.asn1.TypeDescription.Structure; import com.beanit.iec61850bean.internal.mms.asn1.TypeDescription.Structure.Components; -import com.beanit.iec61850bean.internal.mms.asn1.TypeSpecification; -import com.beanit.iec61850bean.internal.mms.asn1.Unsigned32; -import com.beanit.iec61850bean.internal.mms.asn1.VariableAccessSpecification; -import com.beanit.iec61850bean.internal.mms.asn1.VariableDefs; -import com.beanit.iec61850bean.internal.mms.asn1.WriteRequest; -import com.beanit.iec61850bean.internal.mms.asn1.WriteResponse; import com.beanit.josistack.AcseAssociation; import com.beanit.josistack.ByteBufferInputStream; import com.beanit.josistack.DecodingException; @@ -353,6 +318,12 @@ final class ServerAssociation { handleDeleteDataSetRequest(confirmedServiceRequest.getDeleteNamedVariableList()); confirmedServiceResponse.setDeleteNamedVariableList(response); + } else if (confirmedServiceRequest.getFileDirectory() != null) { + logger.debug("Got a FileDirectory request"); + FileDirectoryResponse response = + handleFileDirectoryRequest(confirmedServiceRequest.getFileDirectory()); + + confirmedServiceResponse.setFileDirectory(response); } else { throw new ServiceError( ServiceError.FAILED_DUE_TO_COMMUNICATIONS_CONSTRAINT, @@ -618,6 +589,16 @@ final class ServerAssociation { return getNameListResponse; } + private FileDirectoryResponse handleFileDirectoryRequest(FileDirectoryRequest request) { + FileName fileSpecification = request.getFileSpecification(); + String path = fileSpecification.getBerGraphicString().get(0).toString(); + FileDirectoryResponse response = new FileDirectoryResponse(); + FileDirectoryResponse.ListOfDirectoryEntry list = new FileDirectoryResponse.ListOfDirectoryEntry(); + list.getDirectoryEntry(); + response.setListOfDirectoryEntry(list); + return response; + } + /** * GetVariableAccessAttributes (GetDataDefinition/GetDataDirectory) can be called with different * kinds of references. Examples: 1. DGEN1 2. DGEN1$CF 3. DGEN1$CF$GnBlk From bbe6b5d389015b404154bd75fc01da2b43e713c2 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 20 Nov 2024 13:18:02 +0800 Subject: [PATCH 02/16] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=8E=BB=E6=8E=89=E7=A7=92=E5=90=8E=E9=9D=A2=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/xydl/cac/iec/IEDCollectService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index 1a2120f..f5622e5 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -10,6 +10,7 @@ import com.xydl.cac.repository.*; import com.xydl.cac.service.DataService; import com.xydl.cac.service.IedDlRecordService; import com.xydl.cac.socket.WebSocketServer; +import com.xydl.cac.util.DateUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -117,6 +118,8 @@ public class IEDCollectService { String time = iecClient.getValue(paramindexT, fc); log.info("采集到" + fc + " " + paramindexNew + "=" + value + ", t=" + time); time = time.replace("T", " ").replace("Z", "").replace("z", ""); + Date date = DateUtil.parse(time); + time = DateUtil.format(date); _dataService.insertData(rpt.getTablename(), rpt.getEqmid(), time, rpt.getColname(), value); // 更新最新数据缓存 From f10be51ef64fd1b0f4f56bdd3e026dcd9dff68aa Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 20 Nov 2024 13:34:43 +0800 Subject: [PATCH 03/16] =?UTF-8?q?fix:=20=E9=87=87=E9=9B=86=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E9=97=B4+8=E5=B0=8F=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/xydl/cac/iec/IEDCollectService.java | 4 ++++ src/main/java/com/xydl/cac/util/DateUtil.java | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index f5622e5..3e59947 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -119,6 +119,7 @@ public class IEDCollectService { log.info("采集到" + fc + " " + paramindexNew + "=" + value + ", t=" + time); time = time.replace("T", " ").replace("Z", "").replace("z", ""); Date date = DateUtil.parse(time); + date = DateUtil.addHour(date, 8); time = DateUtil.format(date); _dataService.insertData(rpt.getTablename(), rpt.getEqmid(), time, rpt.getColname(), value); @@ -216,6 +217,9 @@ public class IEDCollectService { value = bda.getValueString(); if ("acquisitionTime".equals(colname)) { value = value.replace("T", " ").replace("Z", "").replace("z", ""); + Date date = DateUtil.parse(value); + date = DateUtil.addHour(date, 8); + value = DateUtil.format(date); } updateLastData(eqmid, colname, value, null); } diff --git a/src/main/java/com/xydl/cac/util/DateUtil.java b/src/main/java/com/xydl/cac/util/DateUtil.java index d9f5b1d..1e7338f 100644 --- a/src/main/java/com/xydl/cac/util/DateUtil.java +++ b/src/main/java/com/xydl/cac/util/DateUtil.java @@ -89,6 +89,13 @@ public class DateUtil { return cal.getTime(); } + public static Date addHour(Date date, int n) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(Calendar.HOUR, n); + return cal.getTime(); + } + public static long getDifferenceInDays(Date startDate, Date endDate) { LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); From 2320c11b8b4b32b17f09953c7bd98f0759c86d9d Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 20 Nov 2024 14:44:38 +0800 Subject: [PATCH 04/16] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=BB=8EUTC=E5=88=B0=E5=BD=93=E5=89=8D=E6=97=B6?= =?UTF-8?q?=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xydl/cac/iec/IEDCollectService.java | 10 ++-------- src/main/java/com/xydl/cac/util/DateUtil.java | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index 3e59947..9edaf11 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -117,10 +117,7 @@ public class IEDCollectService { String value = iecClient.getValue(paramindexNew, fc); String time = iecClient.getValue(paramindexT, fc); log.info("采集到" + fc + " " + paramindexNew + "=" + value + ", t=" + time); - time = time.replace("T", " ").replace("Z", "").replace("z", ""); - Date date = DateUtil.parse(time); - date = DateUtil.addHour(date, 8); - time = DateUtil.format(date); + time = DateUtil.fromZoneUTCToLocal(time); _dataService.insertData(rpt.getTablename(), rpt.getEqmid(), time, rpt.getColname(), value); // 更新最新数据缓存 @@ -216,10 +213,7 @@ public class IEDCollectService { String colname = str[1]; value = bda.getValueString(); if ("acquisitionTime".equals(colname)) { - value = value.replace("T", " ").replace("Z", "").replace("z", ""); - Date date = DateUtil.parse(value); - date = DateUtil.addHour(date, 8); - value = DateUtil.format(date); + value = DateUtil.fromZoneUTCToLocal(value); } updateLastData(eqmid, colname, value, null); } diff --git a/src/main/java/com/xydl/cac/util/DateUtil.java b/src/main/java/com/xydl/cac/util/DateUtil.java index 1e7338f..3922930 100644 --- a/src/main/java/com/xydl/cac/util/DateUtil.java +++ b/src/main/java/com/xydl/cac/util/DateUtil.java @@ -2,14 +2,15 @@ package com.xydl.cac.util; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.ZoneId; +import java.time.*; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Calendar; import java.util.Date; public class DateUtil { public final static String defaultDatePattern = "yyyy-MM-dd HH:mm:ss"; + public static DateTimeFormatter defaultFormatter = DateTimeFormatter.ofPattern(defaultDatePattern); /** * 获得默认的 date pattern @@ -102,4 +103,16 @@ public class DateUtil { return ChronoUnit.DAYS.between(startLocalDate, endLocalDate); } + public static String fromZoneUTCToLocal(String str) throws ParseException { + String time = str.replace("T", " ") + .replace("Z", "").replace("z", ""); + Date date = parse(time); + time = format(date); + LocalDateTime localtime = LocalDateTime.parse(time, defaultFormatter); + ZonedDateTime zonedDateTime = localtime.atZone(ZoneOffset.UTC); + ZonedDateTime convertedDateTime = zonedDateTime.withZoneSameInstant(ZoneId.systemDefault()); + String result = convertedDateTime.format(defaultFormatter); + return result; + } + } From 57e1a8acbb672e49c0128a5206f84bb8a8b3aa01 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Thu, 21 Nov 2024 10:30:53 +0800 Subject: [PATCH 05/16] =?UTF-8?q?fix:=20=E4=B8=80=E8=BD=AE=E9=87=87?= =?UTF-8?q?=E9=9B=86=E7=94=A8=E7=9B=B8=E5=90=8C=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xydl/cac/iec/IEDCollectService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index 9edaf11..308c974 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -34,6 +34,7 @@ public class IEDCollectService { BizConfig _bizConfig; String folder = "/record"; + String sameTime; public IEDCollectService(IcdConfigTypeRepository configRepository, IcdConfigTypeAttRepository attRepository, IcdConfigTypeInstRepository instRepository, RptparamindexRepository rptparamindexRepository, @@ -70,6 +71,7 @@ public class IEDCollectService { try { log.info("61850开始采集数据, ied=" + ied.getName() + ", ip=" + ied.getIp() + ", port=" + ied.getPort()); this.connect(); + sameTime = null; if (!CollectionUtils.isEmpty(rptList)) { this.doCollectAndSave(configTypeList, rptList); } @@ -118,6 +120,7 @@ public class IEDCollectService { String time = iecClient.getValue(paramindexT, fc); log.info("采集到" + fc + " " + paramindexNew + "=" + value + ", t=" + time); time = DateUtil.fromZoneUTCToLocal(time); + time = this.makeSameTime(time); _dataService.insertData(rpt.getTablename(), rpt.getEqmid(), time, rpt.getColname(), value); // 更新最新数据缓存 @@ -132,6 +135,17 @@ public class IEDCollectService { StaticVariable.paramRelationMap.put(key, value); } + private String makeSameTime(String time) { + if (sameTime == null) { + sameTime = time; + } else { + if (!sameTime.equals(time)) { + + } + } + return sameTime; + } + private Rptparamindex findRpt(List rptList, String paramindex) { for (Rptparamindex rpt : rptList) { if (rpt.getParamindex().equals(paramindex)) { From 553ac7ddac68fdff7aa89a9cf2db4471264d9e0d Mon Sep 17 00:00:00 2001 From: huangfeng Date: Fri, 22 Nov 2024 13:08:10 +0800 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/xydl/cac/entity/Admin.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/xydl/cac/entity/Admin.java b/src/main/java/com/xydl/cac/entity/Admin.java index 46d6e52..0bf7273 100644 --- a/src/main/java/com/xydl/cac/entity/Admin.java +++ b/src/main/java/com/xydl/cac/entity/Admin.java @@ -35,4 +35,8 @@ public class Admin { @Column(name = "password") private String password; + @ApiModelProperty("菜单配置 1:显示 0:隐藏") + @Column(name = "menus") + private String menus; + } \ No newline at end of file From e2fecd6d8db25ee3a2156684199a8fa59fece663 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 27 Nov 2024 11:11:15 +0800 Subject: [PATCH 07/16] =?UTF-8?q?pert:=20=E4=BC=98=E5=8C=96=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E7=BC=93=E5=AD=98=E6=95=B0=E6=8D=AE=E5=92=8C=E6=B8=85?= =?UTF-8?q?=E7=A9=BA=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xydl/cac/controller/TestController.java | 26 ++++++++++++++++--- .../java/com/xydl/cac/task/CacheTask.java | 11 +++++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/xydl/cac/controller/TestController.java b/src/main/java/com/xydl/cac/controller/TestController.java index 3cc51e8..d0c881d 100644 --- a/src/main/java/com/xydl/cac/controller/TestController.java +++ b/src/main/java/com/xydl/cac/controller/TestController.java @@ -1,6 +1,5 @@ package com.xydl.cac.controller; -import com.xydl.cac.iec.IecClient; import com.xydl.cac.model.Response; import com.xydl.cac.model.StaticVariable; import com.xydl.cac.service.IcdFileConfigService; @@ -40,9 +39,28 @@ public class TestController extends BasicController { webSocketServer.sendMessage(msg, warningId); } - @GetMapping("realTimeMap") - @ApiOperation("实时订阅Map") - public Response> realTimeMap() { + @GetMapping("realTimeClientMap") + @ApiOperation("realTimeClientMap") + public Response realTimeClientMap() { return Response.success(StaticVariable.realTimeClientMap); } + + @GetMapping("paramRelationMap") + @ApiOperation("paramRelationMap") + public Response paramRelationMap() { + return Response.success(StaticVariable.paramRelationMap); + } + + @GetMapping("sensorLastDataMap") + @ApiOperation("sensorLastDataMap") + public Response sensorLastDataMap() { + return Response.success(StaticVariable.sensorLastDataMap); + } + + @GetMapping("clearMap") + @ApiOperation("clearMap") + public void clearMap() { + StaticVariable.sensorLastDataMap.clear(); + StaticVariable.paramRelationMap.clear(); + } } diff --git a/src/main/java/com/xydl/cac/task/CacheTask.java b/src/main/java/com/xydl/cac/task/CacheTask.java index 68b1784..cbca1ca 100644 --- a/src/main/java/com/xydl/cac/task/CacheTask.java +++ b/src/main/java/com/xydl/cac/task/CacheTask.java @@ -17,17 +17,20 @@ public class CacheTask { @Resource WarnRuleService ruleService; - - @Scheduled(cron = "0 0 9 * * ?") - private void clearCache() { + @Scheduled(cron = "0 0 1 * * ?") + private void clearCache1() { StaticVariable.unit_Cache.clear(); StaticVariable.modevType_Cache = null; StaticVariable.jg_Cache = null; StaticVariable.zsb_Cache = null; StaticVariable.rule_Cache.clear(); - StaticVariable.doneWarnMap.clear(); + StaticVariable.paramRelationMap.clear(); } + @Scheduled(cron = "0 30 9 * * ?") + private void clearCache9() { + StaticVariable.doneWarnMap.clear(); + } @Scheduled(initialDelay = 30 * 1000, fixedDelay = 60 * 1000) private void refreshRule() { From 58d933add86ac8e634550b48a343358bb8c4919b Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 27 Nov 2024 13:36:48 +0800 Subject: [PATCH 08/16] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8B=E8=BD=BD=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/xydl/cac/iec/IEDCollectService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index 308c974..f3068c2 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -168,6 +168,9 @@ public class IEDCollectService { if (StringUtils.isBlank(config.getPath())) { return; } + if (!config.getPath().endsWith("/")) { + config.setPath(config.getPath() + "/"); + } if (config.getDevId() == null) { return; } From ff10ba9763ed89b6d93aca42bb4747b198d9539d Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 27 Nov 2024 13:45:32 +0800 Subject: [PATCH 09/16] =?UTF-8?q?perf:=20=E9=87=87=E9=9B=86=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BF=9D=E5=AD=98=E6=BA=90=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/xydl/cac/entity/IedDlRecord.java | 6 +++++- src/main/java/com/xydl/cac/entity/RemoteDownload.java | 4 ++-- src/main/java/com/xydl/cac/iec/IEDCollectService.java | 4 +++- src/main/java/com/xydl/cac/iec/IecClient.java | 8 ++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/xydl/cac/entity/IedDlRecord.java b/src/main/java/com/xydl/cac/entity/IedDlRecord.java index d2f3fe3..7e52967 100644 --- a/src/main/java/com/xydl/cac/entity/IedDlRecord.java +++ b/src/main/java/com/xydl/cac/entity/IedDlRecord.java @@ -30,7 +30,11 @@ public class IedDlRecord { @Column(name = "config_id") private Integer configId; - @ApiModelProperty("路径") + @ApiModelProperty("源路径") + @Column(name = "remote_path") + private String remotePath; + + @ApiModelProperty("本地路径") @Column(name = "path") private String path; diff --git a/src/main/java/com/xydl/cac/entity/RemoteDownload.java b/src/main/java/com/xydl/cac/entity/RemoteDownload.java index 42c04d4..11fbf44 100644 --- a/src/main/java/com/xydl/cac/entity/RemoteDownload.java +++ b/src/main/java/com/xydl/cac/entity/RemoteDownload.java @@ -30,11 +30,11 @@ public class RemoteDownload { @Column(name = "config_id") private Integer configId; - @ApiModelProperty("路径") + @ApiModelProperty("源路径") @Column(name = "remote_path") private String remotePath; - @ApiModelProperty("路径") + @ApiModelProperty("本地路径") @Column(name = "path") private String path; diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index f3068c2..f3eb428 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -185,13 +185,15 @@ public class IEDCollectService { IedDlRecord record = new IedDlRecord(); record.setConfigId(config.getId()); record.setFilename(filename); + record.setRemotePath(config.getPath() + filename); boolean exist = _dlRecordService.exist(record); if (!exist) { String localFilePath = localPath + "/" + filename; - iecClient.getFile(config.getPath(), filename, _bizConfig.getDatapath() + localFilePath, config.getTodel()); + iecClient.getFile(record.getRemotePath(), _bizConfig.getDatapath() + localFilePath, config.getTodel()); record.setPath(_bizConfig.getDataNginxPath() + localFilePath); record.setCreateTime(new Date()); _dlRecordService.add(record); + log.info("采集到" + record.getRemotePath()); } } } diff --git a/src/main/java/com/xydl/cac/iec/IecClient.java b/src/main/java/com/xydl/cac/iec/IecClient.java index 04cc63b..fad99d7 100644 --- a/src/main/java/com/xydl/cac/iec/IecClient.java +++ b/src/main/java/com/xydl/cac/iec/IecClient.java @@ -148,11 +148,11 @@ public class IecClient implements ClientEventListener { return list; } - public void getFile(String remotePath, String filename, String localPath, Integer todel) throws Exception { + public void getFile(String remotePath, String localPath, Integer todel) throws Exception { GetFileAction gfa = new GetFileAction(localPath); - clientAssociation.getFile(remotePath + filename, gfa); + clientAssociation.getFile(remotePath, gfa); if (todel != null && todel == Constants.TRUE) { - clientAssociation.deleteFile(remotePath + filename); + clientAssociation.deleteFile(remotePath); } } @@ -213,7 +213,7 @@ public class IecClient implements ClientEventListener { str = iecClient.getValue("OMDLMONT/SPDC1.MaxDsch.t", "MX"); System.out.println(str); List list = iecClient.listFile("/fdata"); - iecClient.getFile("/fdata/web/comtrade/1/18/6/", "20241021_113736_703_0_0.dat", "/eqmid/20241021_113736_703_0_0.dat", 1); + iecClient.getFile("/fdata/web/comtrade/1/18/6/20241021_113736_703_0_0.dat", "/eqmid/20241021_113736_703_0_0.dat", 1); } catch (Exception ex) { ex.printStackTrace(); From 1d2e50f046c77ff0ff228198ed5991dd857f6da0 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Thu, 28 Nov 2024 09:44:13 +0800 Subject: [PATCH 10/16] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=AE=89=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index b905bd9..33cd6df 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -10,9 +10,9 @@ spring: time-zone: GMT+8 datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/iec104?charset=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000 - username: iec - password: Iec@1043 + url: jdbc:mysql://127.0.0.1:3306/cacdb?charset=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&connectTimeout=60000&socketTimeout=60000 + username: root + password: 123456 data: jdbc: repositories: From dc45bf3d00a36b73b2a70b334c489a191a51d2b5 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Fri, 29 Nov 2024 15:04:06 +0800 Subject: [PATCH 11/16] db: sql --- db/upgrade1128.sql | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 db/upgrade1128.sql diff --git a/db/upgrade1128.sql b/db/upgrade1128.sql new file mode 100644 index 0000000..0ff0ca1 --- /dev/null +++ b/db/upgrade1128.sql @@ -0,0 +1,24 @@ +DROP TABLE IF EXISTS `admin`; +CREATE TABLE `admin` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT COMMENT '管理员id', + `name` varchar(45) NOT NULL COMMENT '管理员名称', + `password` varchar(45) NOT NULL COMMENT '管理员密码', + `menus` varchar(45) DEFAULT NULL COMMENT '菜单配置1:显示 0:隐藏', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; + +LOCK TABLES `admin` WRITE; +INSERT INTO `admin` VALUES (1,'admin','e10adc3949ba59abbe56e057f20f883e','1,1,1,1,1,1,1'); +INSERT INTO `admin` VALUES (2,'user','e10adc3949ba59abbe56e057f20f883e','1,1,1,1,0,0,0'); +UNLOCK TABLES; + +DROP TABLE IF EXISTS `ied_dl_record`; +CREATE TABLE `ied_dl_record` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `config_id` int(11) DEFAULT NULL, + `remote_path` varchar(200) DEFAULT NULL COMMENT '源路径', + `filename` varchar(45) DEFAULT NULL COMMENT '文件名', + `path` varchar(200) DEFAULT NULL COMMENT '本地路径', + `create_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From 9a49f774763f92037a47dff48a0debd63e5865e1 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Mon, 2 Dec 2024 10:16:09 +0800 Subject: [PATCH 12/16] =?UTF-8?q?perf:=20=E4=B8=80=E8=BD=AE=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=97=B6=E9=97=B4=E7=9B=B8=E5=B7=AE3=E7=A7=92?= =?UTF-8?q?=E5=86=85=E7=94=A8=E7=AC=AC=E4=B8=80=E4=B8=AA=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xydl/cac/iec/IEDCollectService.java | 17 +++++++++++------ src/main/java/com/xydl/cac/util/DateUtil.java | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index f3eb428..5e76b04 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -34,7 +34,7 @@ public class IEDCollectService { BizConfig _bizConfig; String folder = "/record"; - String sameTime; + String firstOneTime; public IEDCollectService(IcdConfigTypeRepository configRepository, IcdConfigTypeAttRepository attRepository, IcdConfigTypeInstRepository instRepository, RptparamindexRepository rptparamindexRepository, @@ -71,7 +71,7 @@ public class IEDCollectService { try { log.info("61850开始采集数据, ied=" + ied.getName() + ", ip=" + ied.getIp() + ", port=" + ied.getPort()); this.connect(); - sameTime = null; + firstOneTime = null; if (!CollectionUtils.isEmpty(rptList)) { this.doCollectAndSave(configTypeList, rptList); } @@ -136,14 +136,19 @@ public class IEDCollectService { } private String makeSameTime(String time) { - if (sameTime == null) { - sameTime = time; + if (firstOneTime == null) { + firstOneTime = time; } else { - if (!sameTime.equals(time)) { + if (!firstOneTime.equals(time)) { + long sec = DateUtil.secondDiff(firstOneTime, time); + if (sec >= 0 && sec < 3) { + } else { + return time; + } } } - return sameTime; + return firstOneTime; } private Rptparamindex findRpt(List rptList, String paramindex) { diff --git a/src/main/java/com/xydl/cac/util/DateUtil.java b/src/main/java/com/xydl/cac/util/DateUtil.java index 3922930..d033d15 100644 --- a/src/main/java/com/xydl/cac/util/DateUtil.java +++ b/src/main/java/com/xydl/cac/util/DateUtil.java @@ -115,4 +115,22 @@ public class DateUtil { return result; } + public static long secondDiff(String str1, String str2) { + try { + Date date1 = parse(str1); + Date date2 = parse(str2); + long sec1 = date1.getTime(); + long sec2 = date2.getTime(); + if (sec1 >= sec2) { + long sec = sec1 - sec2; + return sec / 1000; + } else { + long sec = sec2 - sec1; + return sec / 1000; + } + } catch (Exception e) { + return -1; + } + } + } From 0ea6cc68f121ad4ea9f5adc46cb45e6151e8f77a Mon Sep 17 00:00:00 2001 From: huangfeng Date: Mon, 2 Dec 2024 11:02:58 +0800 Subject: [PATCH 13/16] =?UTF-8?q?fix:=20=E6=8C=89=E6=AF=8F=E4=B8=80?= =?UTF-8?q?=E4=B8=AAeqmid=E6=9C=89=E4=B8=80=E4=B8=AA=E6=97=B6=E9=97=B4?= =?UTF-8?q?=EF=BC=8C=E5=A4=9A=E5=B1=9E=E6=80=A7=E7=9B=B8=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xydl/cac/iec/IEDCollectService.java | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index 5e76b04..b16af7d 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -34,7 +34,7 @@ public class IEDCollectService { BizConfig _bizConfig; String folder = "/record"; - String firstOneTime; + HashMap eqmidTimeMap = new HashMap<>(); public IEDCollectService(IcdConfigTypeRepository configRepository, IcdConfigTypeAttRepository attRepository, IcdConfigTypeInstRepository instRepository, RptparamindexRepository rptparamindexRepository, @@ -71,7 +71,7 @@ public class IEDCollectService { try { log.info("61850开始采集数据, ied=" + ied.getName() + ", ip=" + ied.getIp() + ", port=" + ied.getPort()); this.connect(); - firstOneTime = null; + eqmidTimeMap.clear(); if (!CollectionUtils.isEmpty(rptList)) { this.doCollectAndSave(configTypeList, rptList); } @@ -120,7 +120,7 @@ public class IEDCollectService { String time = iecClient.getValue(paramindexT, fc); log.info("采集到" + fc + " " + paramindexNew + "=" + value + ", t=" + time); time = DateUtil.fromZoneUTCToLocal(time); - time = this.makeSameTime(time); + time = this.makeSameTime(rpt.getEqmid(), time); _dataService.insertData(rpt.getTablename(), rpt.getEqmid(), time, rpt.getColname(), value); // 更新最新数据缓存 @@ -135,20 +135,13 @@ public class IEDCollectService { StaticVariable.paramRelationMap.put(key, value); } - private String makeSameTime(String time) { - if (firstOneTime == null) { - firstOneTime = time; - } else { - if (!firstOneTime.equals(time)) { - long sec = DateUtil.secondDiff(firstOneTime, time); - if (sec >= 0 && sec < 3) { - - } else { - return time; - } - } + private String makeSameTime(Integer eqmid, String time) { + String sameTime = eqmidTimeMap.get(eqmid); + if (StringUtils.isBlank(sameTime)) { + sameTime = time; + eqmidTimeMap.put(eqmid, sameTime); } - return firstOneTime; + return sameTime; } private Rptparamindex findRpt(List rptList, String paramindex) { From 2ff458c992883da340648d64605a5825e0deeaba Mon Sep 17 00:00:00 2001 From: huangfeng Date: Tue, 3 Dec 2024 14:17:03 +0800 Subject: [PATCH 14/16] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/xydl/cac/iec/IecClient.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/xydl/cac/iec/IecClient.java b/src/main/java/com/xydl/cac/iec/IecClient.java index fad99d7..025aeca 100644 --- a/src/main/java/com/xydl/cac/iec/IecClient.java +++ b/src/main/java/com/xydl/cac/iec/IecClient.java @@ -3,6 +3,7 @@ package com.xydl.cac.iec; import com.beanit.iec61850bean.*; import com.xydl.cac.entity.IcdIed; import com.xydl.cac.entity.constants.Constants; +import com.xydl.cac.exception.BusinessException; import com.xydl.cac.model.StaticVariable; import com.xydl.cac.socket.WebSocketServer; import lombok.extern.slf4j.Slf4j; @@ -95,6 +96,9 @@ public class IecClient implements ClientEventListener { public String getValue(String paramindex, String fc) throws Exception { FcModelNode node = (FcModelNode) serverModel.findModelNode(paramindex, Fc.valueOf(fc)); + if (node == null) { + throw new BusinessException("icd文件里未找到该节点, " + fc + " " + paramindex); + } clientAssociation.getDataValues(node); if (node instanceof BasicDataAttribute) { String value = ((BasicDataAttribute) node).getValueString(); From cc1e9a75fea755e847f31f9652f4494f27e373d8 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Tue, 3 Dec 2024 16:38:55 +0800 Subject: [PATCH 15/16] =?UTF-8?q?feat:=20=E5=8F=AF=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BB=85=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E5=90=8D=E5=8C=85?= =?UTF-8?q?=E5=90=AB=E7=89=B9=E5=AE=9A=E6=96=87=E5=AD=97=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xydl/cac/entity/IedDlConfig.java | 4 +++ .../com/xydl/cac/iec/IEDCollectService.java | 26 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/xydl/cac/entity/IedDlConfig.java b/src/main/java/com/xydl/cac/entity/IedDlConfig.java index a783753..0c468e3 100644 --- a/src/main/java/com/xydl/cac/entity/IedDlConfig.java +++ b/src/main/java/com/xydl/cac/entity/IedDlConfig.java @@ -40,6 +40,10 @@ public class IedDlConfig { @Column(name = "path") private String path; + @ApiModelProperty("包含名字") + @Column(name = "contain") + private String contain; + @ApiModelProperty("后缀名") @Column(name = "suffix") private String suffix; diff --git a/src/main/java/com/xydl/cac/iec/IEDCollectService.java b/src/main/java/com/xydl/cac/iec/IEDCollectService.java index b16af7d..5d81d77 100644 --- a/src/main/java/com/xydl/cac/iec/IEDCollectService.java +++ b/src/main/java/com/xydl/cac/iec/IEDCollectService.java @@ -178,8 +178,8 @@ public class IEDCollectService { for (FileInformation file : fileList) { String filename = file.getFilename(); if (!filename.endsWith("/")) { - if (StringUtils.isBlank(config.getSuffix()) || - filename.toLowerCase().endsWith(config.getSuffix().toLowerCase())) { + if (matchSuffix(filename, config.getSuffix()) + && matchContain(filename, config.getContain())) { IedDlRecord record = new IedDlRecord(); record.setConfigId(config.getId()); record.setFilename(filename); @@ -207,6 +207,28 @@ public class IEDCollectService { } } + private boolean matchSuffix(String filename, String suffix) { + if (StringUtils.isBlank(suffix)) { + return true; + } else { + if (filename.toLowerCase().endsWith(suffix.toLowerCase())) { + return true; + } + return false; + } + } + + private boolean matchContain(String filename, String contain) { + if (StringUtils.isBlank(contain)) { + return true; + } else { + if (filename.toLowerCase().contains(contain.toLowerCase())) { + return true; + } + return false; + } + } + public static void updateLastData(Integer eqmid, String colname, String value, String time) { HashMap map = StaticVariable.sensorLastDataMap.get(eqmid); if (map == null) { From 2aa628e2146609af61abb18bb7aa706cfd10c644 Mon Sep 17 00:00:00 2001 From: huangfeng Date: Wed, 4 Dec 2024 11:43:00 +0800 Subject: [PATCH 16/16] =?UTF-8?q?db:=20=E5=A2=9E=E5=8A=A0=E5=8C=85?= =?UTF-8?q?=E5=90=AB=E6=96=87=E5=AD=97=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/upgrade1128.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/db/upgrade1128.sql b/db/upgrade1128.sql index 0ff0ca1..07180b1 100644 --- a/db/upgrade1128.sql +++ b/db/upgrade1128.sql @@ -21,4 +21,17 @@ CREATE TABLE `ied_dl_record` ( `path` varchar(200) DEFAULT NULL COMMENT '本地路径', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ied_dl_config`; +CREATE TABLE `ied_dl_config` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ied_id` int(11) DEFAULT NULL, + `dev_id` int(11) DEFAULT NULL COMMENT '装置ID', + `path` varchar(2000) DEFAULT NULL COMMENT '目录', + `contain` varchar(45) DEFAULT NULL COMMENT '包含文字', + `suffix` varchar(45) DEFAULT NULL COMMENT '后缀名', + `todel` int(11) DEFAULT NULL COMMENT '下载后删除', + `active` int(11) DEFAULT NULL COMMENT '0:停用; 1:启用;', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file