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 000000000..50773d483
Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/libqvvr_cause_dll.so differ
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 000000000..b411af51e
Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/libqvvr_dll.so differ
diff --git a/pqs-advance/advance-boot/src/main/resources/libqvvr_pg_dll.so b/pqs-advance/advance-boot/src/main/resources/libqvvr_pg_dll.so
new file mode 100644
index 000000000..b3058734d
Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/libqvvr_pg_dll.so differ
diff --git a/pqs-advance/advance-boot/src/main/resources/qvvr_balance.dll b/pqs-advance/advance-boot/src/main/resources/qvvr_balance.dll
new file mode 100644
index 000000000..97efdf160
Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/qvvr_balance.dll differ
diff --git a/pqs-advance/advance-boot/src/main/resources/qvvr_dll.dll b/pqs-advance/advance-boot/src/main/resources/qvvr_dll.dll
new file mode 100644
index 000000000..60d74a998
Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/qvvr_dll.dll differ
diff --git a/pqs-advance/advance-boot/src/main/resources/qvvr_dll_cause.dll b/pqs-advance/advance-boot/src/main/resources/qvvr_dll_cause.dll
new file mode 100644
index 000000000..95328f1aa
Binary files /dev/null and b/pqs-advance/advance-boot/src/main/resources/qvvr_dll_cause.dll differ
diff --git a/pqs-common/common-swagger/src/main/java/com/njcn/swagger/config/Knife4jSwaggerConfig.java b/pqs-common/common-swagger/src/main/java/com/njcn/swagger/config/Knife4jSwaggerConfig.java
index 951c0d2d0..990e2833c 100644
--- a/pqs-common/common-swagger/src/main/java/com/njcn/swagger/config/Knife4jSwaggerConfig.java
+++ b/pqs-common/common-swagger/src/main/java/com/njcn/swagger/config/Knife4jSwaggerConfig.java
@@ -70,7 +70,8 @@ public class Knife4jSwaggerConfig {
"com.njcn.csdevice.controller",
"com.njcn.cswarn.controller",
"com.njcn.csharmonic.controller",
- "com.njcn.cssystem.controller"
+ "com.njcn.cssystem.controller",
+ "com.njcn.advance.controller"
)
.collect(Collectors.toList());
List grantTypes = new ArrayList<>();
diff --git a/pqs-event/event-boot/src/main/java/com/njcn/event/mapper/majornetwork/mapping/RmpEventDetailMapper.xml b/pqs-event/event-boot/src/main/java/com/njcn/event/mapper/majornetwork/mapping/RmpEventDetailMapper.xml
index 5b3923cdf..7cc94c347 100644
--- a/pqs-event/event-boot/src/main/java/com/njcn/event/mapper/majornetwork/mapping/RmpEventDetailMapper.xml
+++ b/pqs-event/event-boot/src/main/java/com/njcn/event/mapper/majornetwork/mapping/RmpEventDetailMapper.xml
@@ -31,6 +31,7 @@
AND DATE_FORMAT(start_time, '%Y-%m-%d') <= DATE_FORMAT(#{endTime}, '%Y-%m-%d')
+ order by start_time desc
@@ -72,4 +73,4 @@
r_mp_event_detail
where event_id=#{id}
-
\ No newline at end of file
+