From c5d469f6d134a57844cd9f76d12431939bdd24fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=9B=A8=E6=9C=A8c?= <857448963@qq.com>
Date: Wed, 21 Jun 2023 09:13:07 +0800
Subject: [PATCH] =?UTF-8?q?=E9=AB=98=E7=BA=A7=E7=AE=97=E6=B3=95=E6=A8=A1?=
=?UTF-8?q?=E5=9D=97=E6=9A=82=E9=99=8D=E7=BB=BC=E5=90=88=E8=AF=84=E4=BC=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pqs-advance/advance-api/pom.xml | 25 ++++
.../com/njcn/advance/pojo/bo/FinalData.java | 38 +++++
.../com/njcn/advance/pojo/bo/QtIdxArray.java | 30 ++++
.../njcn/advance/pojo/bo/QvvrDataStruct.java | 34 +++++
.../com/njcn/advance/pojo/bo/ZtpgSin.java | 34 +++++
.../njcn/advance/pojo/dto/AdvanceBaseDTO.java | 19 +++
.../njcn/advance/pojo/dto/BalanceInfo.java | 39 ++++++
.../java/com/njcn/advance/pojo/dto/QtIdx.java | 59 ++++++++
.../advance/pojo/param/AdvanceBaseParam.java | 32 +++++
pqs-advance/advance-boot/pom.xml | 28 ++--
...tMain.java => AdvanceBootApplication.java} | 4 +-
.../advance/controller/BalanceController.java | 49 +++++++
.../njcn/advance/mapper/BalanceMapper.java | 30 ++++
.../advance/mapper/mapping/BalanceMapper.xml | 47 +++++++
.../njcn/advance/service/BalanceService.java | 21 +++
.../service/impl/BalanceServiceImpl.java | 105 ++++++++++++++
.../njcn/advance/utils/GetBalanceUtils.java | 131 ++++++++++++++++++
.../njcn/advance/utils/JnaCallBalance.java | 33 +++++
.../njcn/advance/utils/JnaCallDllOrSo.java | 101 ++++++++++++++
.../src/main/resources/libqvvr_cause_dll.so | Bin 0 -> 68544 bytes
.../src/main/resources/libqvvr_dll.so | Bin 0 -> 123496 bytes
.../src/main/resources/libqvvr_pg_dll.so | Bin 0 -> 114976 bytes
.../src/main/resources/qvvr_balance.dll | Bin 0 -> 220672 bytes
.../src/main/resources/qvvr_dll.dll | Bin 0 -> 50176 bytes
.../src/main/resources/qvvr_dll_cause.dll | Bin 0 -> 47104 bytes
.../swagger/config/Knife4jSwaggerConfig.java | 3 +-
.../mapping/RmpEventDetailMapper.xml | 3 +-
27 files changed, 850 insertions(+), 15 deletions(-)
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/FinalData.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QtIdxArray.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QvvrDataStruct.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/ZtpgSin.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/AdvanceBaseDTO.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/BalanceInfo.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/QtIdx.java
create mode 100644 pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/AdvanceBaseParam.java
rename pqs-advance/advance-boot/src/main/java/com/njcn/advance/{AdvanceBootMain.java => AdvanceBootApplication.java} (84%)
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/BalanceController.java
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/BalanceMapper.java
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/BalanceMapper.xml
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/BalanceService.java
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/BalanceServiceImpl.java
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/GetBalanceUtils.java
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallBalance.java
create mode 100644 pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallDllOrSo.java
create mode 100644 pqs-advance/advance-boot/src/main/resources/libqvvr_cause_dll.so
create mode 100644 pqs-advance/advance-boot/src/main/resources/libqvvr_dll.so
create mode 100644 pqs-advance/advance-boot/src/main/resources/libqvvr_pg_dll.so
create mode 100644 pqs-advance/advance-boot/src/main/resources/qvvr_balance.dll
create mode 100644 pqs-advance/advance-boot/src/main/resources/qvvr_dll.dll
create mode 100644 pqs-advance/advance-boot/src/main/resources/qvvr_dll_cause.dll
diff --git a/pqs-advance/advance-api/pom.xml b/pqs-advance/advance-api/pom.xml
index fc0d2c751..efcb1f2d2 100644
--- a/pqs-advance/advance-api/pom.xml
+++ b/pqs-advance/advance-api/pom.xml
@@ -17,4 +17,29 @@
8
+
+
+ com.njcn
+ common-core
+ ${project.version}
+
+
+ com.njcn
+ common-db
+ ${project.version}
+
+
+ com.njcn
+ common-microservice
+ ${project.version}
+
+
+ com.sun.jna
+ jna
+ 3.0.9
+ compile
+
+
+
+
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/FinalData.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/FinalData.java
new file mode 100644
index 000000000..fdabd4e5d
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/FinalData.java
@@ -0,0 +1,38 @@
+package com.njcn.advance.pojo.bo;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+public interface FinalData {
+
+ /**
+ * 暂降事件按开始时间归集门槛10秒
+ */
+ int TIME_THRESHOLD = 10;
+ //分组的最大组数
+ int MAX_GROUP_NUM = 1000;
+ //类别数
+ int MAX_CATA_NUM = 7;
+ //最大事件个数
+ int MAX_EVT_NUM = 1000;
+ //三相故障
+ int QVVR_TYPE_THREE = 9;
+ //故障类型未知
+ int QVVR_TYPE_UNKNOWN = 10;
+ //节点不在网络拓扑中
+ int QVVR_TYPE_OUTOFRANGE = -1;
+ int DATA_INF = -1;
+ int EVT_TYPE_NUM = 6;//故障类型数
+ int MAX_PATH_NUM = 50;//最大路径数
+ int NODE_NUM = -1;//输入节点数
+
+ // 暂降综合评估算法
+ int CLUSER_NUM = 4; // 系统中各监测点分类后的代表节点
+ int MAX_LINE_NUM = 1000; // 监测点最多个数
+ int MAX_STA_NUM = 120; // 支持的子系统个数
+
+
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QtIdxArray.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QtIdxArray.java
new file mode 100644
index 000000000..3ea0613b5
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QtIdxArray.java
@@ -0,0 +1,30 @@
+package com.njcn.advance.pojo.bo;
+
+import com.njcn.advance.pojo.dto.QtIdx;
+import com.sun.jna.Structure;
+
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+public class QtIdxArray extends Structure {
+
+ public QtIdx[] qtIdxs = new QtIdx[FinalData.MAX_LINE_NUM];
+
+ @Override
+ protected List getFieldOrder() {
+ return null;
+ }
+
+ public static class ByReference extends QtIdxArray implements Structure.ByReference {
+
+ }
+
+ public static class ByValue extends QtIdxArray implements Structure.ByValue {
+
+ }
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QvvrDataStruct.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QvvrDataStruct.java
new file mode 100644
index 000000000..6a9ad4d86
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/QvvrDataStruct.java
@@ -0,0 +1,34 @@
+package com.njcn.advance.pojo.bo;
+
+import com.sun.jna.Structure;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+public class QvvrDataStruct extends Structure {
+
+ public int sys_num; // 评估系统数目
+ public QtIdxArray[] line_idx = new QtIdxArray[FinalData.MAX_STA_NUM];// 评估使用,各个系统的各监测点数据
+ public int[] line_num = new int[FinalData.MAX_STA_NUM]; // 单个系统内的监测点数目
+ // 输出
+ public ZtpgSin[] sys_res = new ZtpgSin[FinalData.MAX_STA_NUM]; // 评估结果
+
+ public static class ByReference extends QvvrDataStruct implements Structure.ByReference {
+
+ }
+
+ public static class ByValue extends QvvrDataStruct implements Structure.ByValue {
+
+ }
+
+ @Override
+ protected List getFieldOrder() { // 返回值填入的顺序
+ return Arrays.asList(new String[]{"sys_res"});
+ }
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/ZtpgSin.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/ZtpgSin.java
new file mode 100644
index 000000000..82b3e7711
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/bo/ZtpgSin.java
@@ -0,0 +1,34 @@
+package com.njcn.advance.pojo.bo;
+
+import com.sun.jna.Structure;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+public class ZtpgSin extends Structure {
+
+ public int[] Site_rep = new int[FinalData.CLUSER_NUM]; // 系统中各个监测点分类后的代表节点
+ public int line_num; // 监测点数
+ public float[] CIV = new float[FinalData.MAX_LINE_NUM]; // 最终计算的每个监测点的相对指标得分
+ public int[] L = new int[FinalData.MAX_LINE_NUM]; // 每个监测点得分后的分级
+ public float CI; // 系统的最终评估分
+
+ public static class ByReference extends ZtpgSin implements Structure.ByReference {
+
+ }
+
+ public static class ByValue extends ZtpgSin implements Structure.ByValue {
+
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return Arrays.asList(new String[] { "Site_rep", "line_num", "CIV", "L", "CI" });
+ }
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/AdvanceBaseDTO.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/AdvanceBaseDTO.java
new file mode 100644
index 000000000..05627dc89
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/AdvanceBaseDTO.java
@@ -0,0 +1,19 @@
+package com.njcn.advance.pojo.dto;
+
+import lombok.Data;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+@Data
+public class AdvanceBaseDTO {
+
+ private String lineId;
+
+ private Float valueA;
+
+ private Integer valueB;
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/BalanceInfo.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/BalanceInfo.java
new file mode 100644
index 000000000..798417c2c
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/BalanceInfo.java
@@ -0,0 +1,39 @@
+package com.njcn.advance.pojo.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+@Data
+public class BalanceInfo {
+ private String pointId;
+ private String pointName;
+ private QtIdx qtIdx;
+ private float civ; // 结果
+ private int l; // 分级
+
+ private String areaIndex; // 区域的index
+ private String areaName;// 区域名称
+ private float ci; // 系统最终的评估分
+ private List list; // 监测点的详细信息
+ private int isCount; // 标识是否经过计算,默认为0-未计算,1-计算
+
+
+
+
+ @Data
+ public static class PointInfo {
+ private String pointId;
+ private String pointName;
+ private QtIdx qtIdx;
+ private float civ; // 结果
+ private int l; // 分级
+
+ }
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/QtIdx.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/QtIdx.java
new file mode 100644
index 000000000..f6cba8d7d
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/dto/QtIdx.java
@@ -0,0 +1,59 @@
+package com.njcn.advance.pojo.dto;
+
+import com.sun.jna.Structure;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class QtIdx extends Structure{
+
+ /**
+ * 暂降幅值
+ */
+ public float r_esm;
+
+ /**
+ * sarifi-90
+ */
+ public int sarfi_90;
+
+ /**
+ * sarifi-50
+ */
+ public int sarifi_50;
+
+ /**
+ * 暂降能量
+ */
+ public float r_asei;
+
+ /**
+ * 严重程度
+ */
+ public float r_assi;
+
+ public static class ByReference extends QtIdx implements Structure.ByReference {
+
+ }
+
+ public static class ByValue extends QtIdx implements Structure.ByValue {
+
+ }
+
+ @Override
+ protected List getFieldOrder() {
+ return null;
+ }
+
+
+
+}
diff --git a/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/AdvanceBaseParam.java b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/AdvanceBaseParam.java
new file mode 100644
index 000000000..4b79192c2
--- /dev/null
+++ b/pqs-advance/advance-api/src/main/java/com/njcn/advance/pojo/param/AdvanceBaseParam.java
@@ -0,0 +1,32 @@
+package com.njcn.advance.pojo.param;
+
+import com.njcn.web.pojo.annotation.DateTimeStrValid;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+@Data
+public class AdvanceBaseParam {
+
+ @ApiModelProperty(value = "开始时间")
+ @DateTimeStrValid(message = "开始时间格式出错")
+ @NotBlank(message = "开始时间不可为空")
+ private String startTime;
+
+ @ApiModelProperty(value = "结束时间")
+ @DateTimeStrValid(message = "结束时间格式出错")
+ @NotBlank(message = "结束时间不可为空")
+ private String endTime;
+
+ @ApiModelProperty(value = "部门索引")
+ @NotBlank(message = "部门索引不可为空")
+ private String deptId;
+}
diff --git a/pqs-advance/advance-boot/pom.xml b/pqs-advance/advance-boot/pom.xml
index f3f50d5ac..52c537680 100644
--- a/pqs-advance/advance-boot/pom.xml
+++ b/pqs-advance/advance-boot/pom.xml
@@ -23,11 +23,7 @@
system-api
${project.version}
-
- com.njcn
- common-oss
- ${project.version}
-
+
com.njcn
user-api
@@ -49,18 +45,28 @@
1.0.0
compile
-
- com.squareup.okio
- okio
- 2.8.0
-
+
com.njcn
- common-oss
+ advance-api
1.0.0
compile
+
+ com.njcn
+ event-api
+ 1.0.0
+
+
+
+
+ com.sun.jna
+ jna
+ 3.0.9
+
+
+
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/AdvanceBootMain.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/AdvanceBootApplication.java
similarity index 84%
rename from pqs-advance/advance-boot/src/main/java/com/njcn/advance/AdvanceBootMain.java
rename to pqs-advance/advance-boot/src/main/java/com/njcn/advance/AdvanceBootApplication.java
index 95566c5b4..d04ee0d0c 100644
--- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/AdvanceBootMain.java
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/AdvanceBootApplication.java
@@ -15,8 +15,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@MapperScan("com.njcn.**.mapper")
@EnableFeignClients(basePackages = "com.njcn")
@SpringBootApplication(scanBasePackages = "com.njcn")
-public class AdvanceBootMain {
+public class AdvanceBootApplication {
public static void main(String[] args) {
- SpringApplication.run(AdvanceBootMain.class, args);
+ SpringApplication.run(AdvanceBootApplication.class, args);
}
}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/BalanceController.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/BalanceController.java
new file mode 100644
index 000000000..d5455e8fb
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/BalanceController.java
@@ -0,0 +1,49 @@
+package com.njcn.advance.controller;
+
+import com.njcn.advance.pojo.dto.BalanceInfo;
+import com.njcn.advance.pojo.param.AdvanceBaseParam;
+import com.njcn.advance.service.BalanceService;
+import com.njcn.common.pojo.annotation.OperateInfo;
+import com.njcn.common.pojo.enums.common.LogEnum;
+import com.njcn.common.pojo.enums.response.CommonResponseEnum;
+import com.njcn.common.pojo.response.HttpResult;
+import com.njcn.common.utils.HttpResultUtil;
+import com.njcn.common.utils.PubUtils;
+import com.njcn.web.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+@RestController
+@RequestMapping("balance")
+@Api(tags = "暂降区域评估高级算法")
+@RequiredArgsConstructor
+public class BalanceController extends BaseController {
+
+ private final BalanceService balanceService;
+
+
+ @PostMapping("getBalanceInfo")
+ @OperateInfo(info = LogEnum.BUSINESS_COMMON)
+ @ApiOperation("暂降区域评估")
+ @ApiImplicitParam(name = "advanceBaseParam", value = "查询参数", required = true)
+ public HttpResult> getBalanceInfo(@RequestBody @Validated AdvanceBaseParam advanceBaseParam){
+ String methodDescribe = getMethodDescribe("getBalanceInfo");
+ List balanceInfoList = balanceService.getBalanceInfo(advanceBaseParam);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, balanceInfoList, methodDescribe);
+ }
+}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/BalanceMapper.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/BalanceMapper.java
new file mode 100644
index 000000000..be6ccf606
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/BalanceMapper.java
@@ -0,0 +1,30 @@
+package com.njcn.advance.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.njcn.advance.pojo.dto.AdvanceBaseDTO;
+import com.njcn.event.pojo.po.RmpEventDetailPO;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+public interface BalanceMapper extends BaseMapper {
+
+
+ List getFeatureAmplitude(@Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime, @Param("lineIds")List lineIds);
+
+ List getSarfi(@Param("startTime")LocalDateTime startTime,@Param("endTime")LocalDateTime endTime,@Param("lineIds")List lineIds,@Param("featureAmplitude")Float featureAmplitude);
+
+ List getSarfiSeverity(@Param("startTime")LocalDateTime startTime,@Param("endTime")LocalDateTime endTime,@Param("lineIds")List lineIds,@Param("featureAmplitude")Float featureAmplitude);
+
+
+
+
+}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/BalanceMapper.xml b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/BalanceMapper.xml
new file mode 100644
index 000000000..7e0218023
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/mapper/mapping/BalanceMapper.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/BalanceService.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/BalanceService.java
new file mode 100644
index 000000000..bef5aaf0b
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/BalanceService.java
@@ -0,0 +1,21 @@
+package com.njcn.advance.service;
+
+import com.njcn.advance.pojo.dto.BalanceInfo;
+import com.njcn.advance.pojo.param.AdvanceBaseParam;
+import com.njcn.common.pojo.response.HttpResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+public interface BalanceService {
+
+
+ List getBalanceInfo(AdvanceBaseParam advanceBaseParam);
+}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/BalanceServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/BalanceServiceImpl.java
new file mode 100644
index 000000000..6fedc8971
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/BalanceServiceImpl.java
@@ -0,0 +1,105 @@
+package com.njcn.advance.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.njcn.advance.mapper.BalanceMapper;
+import com.njcn.advance.pojo.dto.AdvanceBaseDTO;
+import com.njcn.advance.pojo.dto.BalanceInfo;
+import com.njcn.advance.pojo.dto.QtIdx;
+import com.njcn.advance.pojo.param.AdvanceBaseParam;
+import com.njcn.advance.service.BalanceService;
+import com.njcn.advance.utils.GetBalanceUtils;
+import com.njcn.common.pojo.dto.SimpleDTO;
+import com.njcn.common.pojo.enums.common.ServerEnum;
+import com.njcn.common.utils.PubUtils;
+import com.njcn.device.pq.api.GeneralDeviceInfoClient;
+import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO;
+import com.njcn.device.pq.pojo.param.DeviceInfoParam;
+import com.njcn.event.pojo.po.RmpEventDetailPO;
+import com.njcn.system.pojo.enums.StatisticsEnum;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections.MapUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/19
+ */
+@Service
+@RequiredArgsConstructor
+public class BalanceServiceImpl implements BalanceService {
+
+ private final GeneralDeviceInfoClient generalDeviceInfoClient;
+
+ private final BalanceMapper balanceMapper;
+
+ private final GetBalanceUtils getBalanceUtils;
+
+
+ @Override
+ public List getBalanceInfo(AdvanceBaseParam advanceBaseParam) {
+ List balanceInfoList = new ArrayList<>();
+
+ DeviceInfoParam deviceInfoParam = new DeviceInfoParam();
+ deviceInfoParam.setDeptIndex(advanceBaseParam.getDeptId());
+ //统计类型
+ SimpleDTO simpleDTO = new SimpleDTO();
+ simpleDTO.setCode(String.valueOf(StatisticsEnum.POWER_NETWORK));
+ deviceInfoParam.setStatisticalType(simpleDTO);
+ deviceInfoParam.setServerName(ServerEnum.EVENT.getName());
+ List generalDeviceDTOList = generalDeviceInfoClient.getPracticalRunDeviceInfo(deviceInfoParam).getData();
+
+ for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) {
+ BalanceInfo balanceInfo = new BalanceInfo();
+ balanceInfo.setAreaIndex(generalDeviceDTO.getIndex());
+ balanceInfo.setAreaName(generalDeviceDTO.getName());
+
+ if (CollUtil.isEmpty(generalDeviceDTO.getLineIndexes())) {
+ balanceInfo.setList(new ArrayList<>());
+ continue;
+ }
+
+ List aList = balanceMapper.getFeatureAmplitude(PubUtils.beginTimeToLocalDateTime(advanceBaseParam.getStartTime()), PubUtils.endTimeToLocalDateTime(advanceBaseParam.getEndTime()), generalDeviceDTO.getLineIndexes());
+ Map map = aList.stream().collect(Collectors.toMap(AdvanceBaseDTO::getLineId, AdvanceBaseDTO::getValueA));
+
+ List a90List = balanceMapper.getSarfi(PubUtils.beginTimeToLocalDateTime(advanceBaseParam.getStartTime()), PubUtils.endTimeToLocalDateTime(advanceBaseParam.getEndTime()), generalDeviceDTO.getLineIndexes(), 90f);
+ Map map90 = a90List.stream().collect(Collectors.toMap(AdvanceBaseDTO::getLineId, AdvanceBaseDTO::getValueB));
+
+ List a50List = balanceMapper.getSarfi(PubUtils.beginTimeToLocalDateTime(advanceBaseParam.getStartTime()), PubUtils.endTimeToLocalDateTime(advanceBaseParam.getEndTime()), generalDeviceDTO.getLineIndexes(), 50f);
+ Map map50 = a50List.stream().collect(Collectors.toMap(AdvanceBaseDTO::getLineId, AdvanceBaseDTO::getValueB));
+
+ List aSeverityList = balanceMapper.getSarfiSeverity(PubUtils.beginTimeToLocalDateTime(advanceBaseParam.getStartTime()), PubUtils.endTimeToLocalDateTime(advanceBaseParam.getEndTime()), generalDeviceDTO.getLineIndexes(), 50f);
+ Map aSeverityListMap = aSeverityList.stream().collect(Collectors.toMap(AdvanceBaseDTO::getLineId, AdvanceBaseDTO::getValueA));
+
+ List listTem = new ArrayList<>();
+ for (String lineId : generalDeviceDTO.getLineIndexes()) {
+
+ BalanceInfo.PointInfo pointInfo = new BalanceInfo.PointInfo();
+ pointInfo.setPointId(lineId);
+
+ QtIdx qtIdx = new QtIdx();
+ qtIdx.r_esm = MapUtils.getFloat(map,lineId,0f);
+ qtIdx.sarfi_90 = MapUtils.getInteger(map90,lineId,0);
+ qtIdx.sarifi_50 = MapUtils.getInteger(map50,lineId,0);
+ qtIdx.r_assi = MapUtils.getInteger(aSeverityListMap,lineId,0);
+ qtIdx.r_asei = MapUtils.getInteger(aSeverityListMap,lineId,0);
+ pointInfo.setQtIdx(qtIdx);
+ listTem.add(pointInfo);
+ }
+ balanceInfo.setList(listTem);
+ balanceInfoList.add(balanceInfo);
+ }
+ // 打包数据传入dll/so计算结果
+ getBalanceUtils.translateData(balanceInfoList);
+ return balanceInfoList;
+ }
+}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/GetBalanceUtils.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/GetBalanceUtils.java
new file mode 100644
index 000000000..196a4d9d4
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/GetBalanceUtils.java
@@ -0,0 +1,131 @@
+package com.njcn.advance.utils;
+
+import com.njcn.advance.pojo.bo.QtIdxArray;
+import com.njcn.advance.pojo.bo.QvvrDataStruct;
+import com.njcn.advance.pojo.dto.BalanceInfo;
+import com.njcn.advance.pojo.dto.QtIdx;
+import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+@Component
+public class GetBalanceUtils {
+
+
+ @Data
+ public static class Sarifi {
+ private Float sarifiValue;
+ private Float time;
+ private Float pt1;
+ private Float pt2;
+ }
+
+
+ public void translateData(List list) {
+ QvvrDataStruct qvvrDataStruct = new QvvrDataStruct();
+
+ // 过滤数据
+ List newList = new ArrayList<>();
+ filterData(list, newList);
+
+ // 如果newList为空则不带入dll计算
+ if (newList.size() > 0) {
+ packageData(newList, qvvrDataStruct);
+ JnaCallDllOrSo jnaCallDll = new JnaCallBalance("qvvr_balance.dll");
+ jnaCallDll.setPath();
+
+ // 计算暂降综合评估
+ try {
+ JnaCallBalance.Balancelibrary INSTANTCE = JnaCallBalance.Balancelibrary.INSTANTCE;
+ INSTANTCE.qvvr_fun_cause(qvvrDataStruct);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+
+ resultPackage(newList, qvvrDataStruct, list);
+ }
+ }
+
+ public void resultPackage(List list, QvvrDataStruct qvvrDataStruct, List list2) {
+ for (int i = 0; i < list.size(); i++) {
+ for (BalanceInfo balanceInfo : list2) {
+ if (balanceInfo.getAreaIndex().equals(list.get(i).getAreaIndex())) {
+ balanceInfo.setCi(qvvrDataStruct.sys_res[i].CI);
+ balanceInfo.setIsCount(1); // 已计算
+ }
+ }
+
+ for (int j = 0; j < list.get(i).getList().size(); j++) {
+ list.get(i).getList().get(j).setCiv(qvvrDataStruct.sys_res[i].CIV[j]); // 设置监测点的评估数据
+ list.get(i).getList().get(j).setL(qvvrDataStruct.sys_res[i].L[j]); // 设置监测点的评估等级
+ }
+ }
+ }
+
+ public void packageData(List list, QvvrDataStruct qvvrDataStruct) {
+ qvvrDataStruct.sys_num = list.size(); // 系统数目
+
+ for (int i = 0; i < qvvrDataStruct.sys_num; i++) {
+ qvvrDataStruct.line_num[i] = list.get(i).getList().size(); // 监测点数目
+ QtIdxArray qtIdxArray = new QtIdxArray();
+
+ for (int j = 0; j < list.get(i).getList().size(); j++) {
+ qtIdxArray.qtIdxs[j] = list.get(i).getList().get(j).getQtIdx(); // 各监测点数据
+ }
+
+ qvvrDataStruct.line_idx[i] = qtIdxArray;
+ }
+ }
+
+ // 过滤掉没有监测点,没有暂降事件的数据
+ private void filterData(List list, List listResult) {
+ for (BalanceInfo balanceInfo : list) {
+ BalanceInfo balanceInfo2 = new BalanceInfo();
+ List list2 = new ArrayList<>();
+
+ if (balanceInfo.getList() == null) {
+ continue;
+ }
+
+ for (int i = 0; i < balanceInfo.getList().size(); i++) {
+ QtIdx qtIdx = balanceInfo.getList().get(i).getQtIdx();
+
+ if (qtIdx == null || qtIdx.sarfi_90 == 0) {
+ continue;
+ }
+
+ list2.add(balanceInfo.getList().get(i));
+ }
+
+ // 发生事件的监测点数目少于4组不带入计算
+ if (list2.size() > 4) {
+ balanceInfo2.setAreaIndex(balanceInfo.getAreaIndex());
+ balanceInfo2.setList(list2);
+ listResult.add(balanceInfo2);
+ }
+ }
+ }
+
+ private BalanceInfo.PointInfo newObj(BalanceInfo.PointInfo info, double v1, int c1, int c2, double v2, double v3) {
+ info.getQtIdx().r_esm = (float) v1;
+ info.getQtIdx().sarfi_90 = c1;
+ info.getQtIdx().sarifi_50 = c2;
+ info.getQtIdx().r_asei = (float) v2;
+ info.getQtIdx().r_assi = (float) v3;
+ return info;
+ }
+
+}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallBalance.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallBalance.java
new file mode 100644
index 000000000..a18548586
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallBalance.java
@@ -0,0 +1,33 @@
+package com.njcn.advance.utils;
+
+import com.njcn.advance.pojo.bo.QvvrDataStruct;
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+public class JnaCallBalance extends JnaCallDllOrSo{
+
+ public static String strpath;
+
+ public JnaCallBalance(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setPath() {
+ JnaCallBalance.strpath = super.getStrpath();
+ }
+
+ public interface Balancelibrary extends Library {
+ // 加载Lib库
+ Balancelibrary INSTANTCE = (Balancelibrary) Native.loadLibrary(JnaCallBalance.strpath, Balancelibrary.class);
+
+ // 定义方法--->与C方法相对应
+ void qvvr_fun_cause(QvvrDataStruct data);
+ }
+}
diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallDllOrSo.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallDllOrSo.java
new file mode 100644
index 000000000..190147b23
--- /dev/null
+++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/utils/JnaCallDllOrSo.java
@@ -0,0 +1,101 @@
+package com.njcn.advance.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+import java.net.URLDecoder;
+
+/**
+ * pqs
+ *
+ * @author cdf
+ * @date 2023/6/20
+ */
+@Slf4j
+public class JnaCallDllOrSo {
+ private String path = "";
+ private String pathDll = "";
+ private String nameDll;
+ public static String jarPath = "";
+
+ public JnaCallDllOrSo(String name) {
+ super();
+ this.nameDll = name;
+
+ try {
+ String os = System.getProperty("os.name"); // 获取当前操作系统的类型
+ int beginIndex = os != null && os.startsWith("Windows") ? 1 : 0;// windows操作系统为1 否则为0
+ if(beginIndex == 0){
+ //linux操作系统
+ this.path = URLDecoder.decode(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8");
+ }else {
+ this.path = URLDecoder.decode(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replaceFirst("/", ""), "UTF-8");
+ }
+
+ } catch (UnsupportedEncodingException e) {
+ log.error(e.getMessage());
+ }
+ if (JnaCallDllOrSo.jarPath.equals("")) {
+ JnaCallDllOrSo.jarPath = this.path.substring(0, this.path.lastIndexOf('/'));
+ }
+ }
+
+ public String packagePath(String path) {
+ return path + "/" + this.nameDll;
+ }
+
+ public boolean judgeFileType() { //判断打包方式是否为jar方式
+ String pathPackage = this.getClass().getPackage().toString().replaceAll("package ", "/");
+ pathPackage = pathPackage.replace('.', '/');
+ this.pathDll = packagePath(path + pathPackage);
+ this.pathDll = path + pathPackage + "/" + this.nameDll;
+
+ return path.endsWith(".jar");//如果dll在jar包内部返回true,否则返回true
+ }
+
+ public boolean exitFile() {//判断dll文件是否存在
+ File file = new File(packagePath(JnaCallDllOrSo.jarPath));
+ return file.exists() || file.isFile();
+ }
+
+ public void copyDll2Path() {//复制jar包中的dll到指定位置
+ InputStream is = this.getClass().getResourceAsStream(nameDll);
+ File file = new File(packagePath(JnaCallDllOrSo.jarPath));
+ byte[] bytes = new byte[1024];
+ int readBytes;
+
+ try {
+ OutputStream os = new FileOutputStream(file);
+ while ((readBytes = is.read(bytes)) != -1) {
+ os.write(bytes, 0, readBytes);
+ }
+ os.close();
+ } catch (FileNotFoundException e) {
+ log.error(e.getMessage());
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ } finally {
+ try {
+ is.close();
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+ }
+ }
+
+ public String getStrpath() {
+ if (judgeFileType()) {
+ if (!exitFile()) {
+ copyDll2Path();
+ }
+
+ return packagePath(JnaCallDllOrSo.jarPath);
+ } else {
+ return this.pathDll;
+ }
+ }
+
+ public void setPath() {
+
+ }
+}
diff --git a/pqs-advance/advance-boot/src/main/resources/libqvvr_cause_dll.so b/pqs-advance/advance-boot/src/main/resources/libqvvr_cause_dll.so
new file mode 100644
index 0000000000000000000000000000000000000000..50773d483e74871b52ed08e1552faba0ce999f44
GIT binary patch
literal 68544
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
literal 0
HcmV?d00001
diff --git a/pqs-advance/advance-boot/src/main/resources/libqvvr_dll.so b/pqs-advance/advance-boot/src/main/resources/libqvvr_dll.so
new file mode 100644
index 0000000000000000000000000000000000000000..b411af51e11129bc7d6f3955f06726569f98f093
GIT binary patch
literal 123496
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