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 +