From 4ee41b833b4608590a871e4a4e69d17d630b6dc0 Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Thu, 3 Jul 2025 08:58:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B2=BB=E7=90=86=E8=AE=BE=E5=A4=87=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=A8=A1=E5=9D=97=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/CsCommunicateFeignClient.java | 20 ++ .../csdevice/api/EquipmentFeignClient.java | 8 + .../csdevice/api/IntegrityFeignClient.java | 23 ++ .../csdevice/api/OnlineRateFeignClient.java | 23 ++ ...CommunicateFeignClientFallbackFactory.java | 40 ++++ .../EquipmentFeignClientFallbackFactory.java | 6 + .../IntegrityClientFallbackFactory.java | 37 ++++ .../onlineRateClientFallbackFactory.java | 37 ++++ .../param/LineCountEvaluateParam.java | 70 ++++++ .../csdevice/pojo/dto/PqsCommunicateDto.java | 24 +++ .../param/CsEquipmentDeliveryQueryParm.java | 3 + .../csdevice/pojo/po/RStatIntegrityD.java | 35 +++ .../csdevice/pojo/po/RStatOnlineRateD.java | 35 +++ .../njcn/csdevice/pojo/vo/EachModuleVO.java | 44 ++++ .../controller/annotation/InsertBean.java | 20 ++ .../controller/annotation/QueryBean.java | 20 ++ .../controller/bean/DynamicBeanProcessor.java | 78 +++++++ .../data/PqsCommunicateController.java | 78 +++++++ .../data/RStatIntegrityDController.java | 60 ++++++ .../data/RStatOnlineRateDController.java | 60 ++++++ .../EquipmentDeliveryController.java | 12 +- .../mapper/RStatIntegrityDMapper.java | 18 ++ .../mapper/RStatOnlineRateDMapper.java | 18 ++ .../service/CsEquipmentDeliveryService.java | 2 + .../service/ICsCommunicateService.java | 38 ++++ .../service/IRStatIntegrityDService.java | 23 ++ .../service/IRStatOnlineRateDService.java | 23 ++ .../impl/CsEquipmentDeliveryServiceImpl.java | 37 +++- .../service/impl/CsLinePOServiceImpl.java | 2 +- .../InfluxdbCsCommunicateServiceImpl.java | 145 +++++++++++++ .../impl/RStatIntegrityDServiceImpl.java | 99 +++++++++ .../impl/RStatOnlineRateDServiceImpl.java | 182 ++++++++++++++++ .../java/com/njcn/csdevice/util/TimeUtil.java | 41 ++++ .../src/main/resources/bootstrap.yml | 5 +- .../src/test/java/com/njcn/AppTest.java | 60 +++++- .../src/test/java/com/njcn/BaseJunitTest.java | 31 +++ .../test/java/com/njcn/DownloadFileTest.java | 123 +++++++++++ .../com/njcn/csharmonic/param/DataParam.java | 6 + .../pojo/dto/DataOnlineRateDto.java | 38 ++++ .../pojo/param/StatisticsDataParam.java | 9 + .../njcn/csharmonic/pojo/po/CsEventPO.java | 2 + .../vo/{LineIntegrityVo.java => DataVo.java} | 2 +- .../csharmonic/pojo/vo/HalfMonthReportVO.java | 53 +++++ .../controller/CsEventController.java | 13 +- .../csharmonic/controller/DataController.java | 21 ++ .../StatisticsDataDataController.java | 33 ++- .../csharmonic/service/CsEventPOService.java | 4 + .../njcn/csharmonic/service/IDataService.java | 9 + .../service/IStatisticsDataDataService.java | 19 +- .../service/impl/CsEventPOServiceImpl.java | 40 +++- .../service/impl/DataServiceImpl.java | 200 +++++++++++++++++- .../impl/StatisticsDataDataServiceImpl.java | 110 ++++++++-- 52 files changed, 2088 insertions(+), 51 deletions(-) create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommunicateFeignClient.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/IntegrityFeignClient.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/OnlineRateFeignClient.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommunicateFeignClientFallbackFactory.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/IntegrityClientFallbackFactory.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/onlineRateClientFallbackFactory.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/param/LineCountEvaluateParam.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/PqsCommunicateDto.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatIntegrityD.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatOnlineRateD.java create mode 100644 cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/EachModuleVO.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/InsertBean.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/QueryBean.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/bean/DynamicBeanProcessor.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/PqsCommunicateController.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatIntegrityDController.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatOnlineRateDController.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatIntegrityDMapper.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatOnlineRateDMapper.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/ICsCommunicateService.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatIntegrityDService.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatOnlineRateDService.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/InfluxdbCsCommunicateServiceImpl.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatIntegrityDServiceImpl.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatOnlineRateDServiceImpl.java create mode 100644 cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/util/TimeUtil.java create mode 100644 cs-device/cs-device-boot/src/test/java/com/njcn/BaseJunitTest.java create mode 100644 cs-device/cs-device-boot/src/test/java/com/njcn/DownloadFileTest.java create mode 100644 cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/dto/DataOnlineRateDto.java rename cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/{LineIntegrityVo.java => DataVo.java} (91%) create mode 100644 cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/HalfMonthReportVO.java diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommunicateFeignClient.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommunicateFeignClient.java new file mode 100644 index 0000000..7b8af61 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommunicateFeignClient.java @@ -0,0 +1,20 @@ +package com.njcn.csdevice.api; + +import com.njcn.common.pojo.constant.ServerInfo; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csdevice.api.fallback.CsCommunicateFeignClientFallbackFactory; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author xy + */ +@FeignClient(value = ServerInfo.CS_DEVICE_BOOT, path = "/pqsCommunicate", fallbackFactory = CsCommunicateFeignClientFallbackFactory.class,contextId = "pqsCommunicate") + +public interface CsCommunicateFeignClient { + + @PostMapping("/insertion") + HttpResult insertion(@RequestBody PqsCommunicateDto pqsCommunicateDto); +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/EquipmentFeignClient.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/EquipmentFeignClient.java index 0a5a1ba..ec5171a 100644 --- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/EquipmentFeignClient.java +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/EquipmentFeignClient.java @@ -1,11 +1,16 @@ package com.njcn.csdevice.api; +import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.constant.ServerInfo; +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.csdevice.api.fallback.EquipmentFeignClientFallbackFactory; import com.njcn.csdevice.pojo.dto.CsEquipmentDeliveryDTO; import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; import com.njcn.csdevice.pojo.vo.CsEquipmentDeliveryVO; +import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -56,4 +61,7 @@ public interface EquipmentFeignClient { @PostMapping("/judgeDevModel") HttpResult judgeDevModel(@RequestParam("nDid") String nDid); + + @PostMapping("/getDevByLineId") + HttpResult getDevByLineId(@RequestParam("lineId") String lineId); } diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/IntegrityFeignClient.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/IntegrityFeignClient.java new file mode 100644 index 0000000..f5226a6 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/IntegrityFeignClient.java @@ -0,0 +1,23 @@ +package com.njcn.csdevice.api; + +import com.njcn.common.pojo.constant.ServerInfo; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csdevice.api.fallback.IntegrityClientFallbackFactory; +import com.njcn.csdevice.pojo.po.RStatIntegrityD; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author xy + */ +@FeignClient(value = ServerInfo.CS_DEVICE_BOOT, path = "/rStatIntegrityD", fallbackFactory = IntegrityClientFallbackFactory.class,contextId = "rStatIntegrityD") +public interface IntegrityFeignClient { + + @PostMapping("/list") + HttpResult> list(@Validated @RequestParam("list") List list, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime); + +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/OnlineRateFeignClient.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/OnlineRateFeignClient.java new file mode 100644 index 0000000..4786b92 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/OnlineRateFeignClient.java @@ -0,0 +1,23 @@ +package com.njcn.csdevice.api; + +import com.njcn.common.pojo.constant.ServerInfo; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csdevice.api.fallback.onlineRateClientFallbackFactory; +import com.njcn.csdevice.pojo.po.RStatOnlineRateD; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author xy + */ +@FeignClient(value = ServerInfo.CS_DEVICE_BOOT, path = "/rStatOnlineRateD", fallbackFactory = onlineRateClientFallbackFactory.class,contextId = "rStatOnlineRateD") +public interface OnlineRateFeignClient { + + @PostMapping("/list") + HttpResult> list(@Validated @RequestParam("list") List list, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime); + +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommunicateFeignClientFallbackFactory.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommunicateFeignClientFallbackFactory.java new file mode 100644 index 0000000..834fa24 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommunicateFeignClientFallbackFactory.java @@ -0,0 +1,40 @@ +package com.njcn.csdevice.api.fallback; + +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csdevice.api.CsCommunicateFeignClient; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import com.njcn.csdevice.utils.CsDeviceEnumUtil; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 类的介绍: + * + * @author xuyang + * @version 1.0.0 + * @createTime 2023/4/10 20:09 + */ +@Slf4j +@Component +public class CsCommunicateFeignClientFallbackFactory implements FallbackFactory { + @Override + public CsCommunicateFeignClient create(Throwable cause) { + //判断抛出异常是否为解码器抛出的业务异常 + Enum exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK; + if (cause.getCause() instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause.getCause(); + exceptionEnum = CsDeviceEnumUtil.getExceptionEnum(businessException.getResult()); + } + Enum finalExceptionEnum = exceptionEnum; + return new CsCommunicateFeignClient() { + @Override + public HttpResult insertion(PqsCommunicateDto pqsCommunicateDto) { + log.error("{}异常,降级处理,异常为:{}","新增记录",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + }; + } +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/EquipmentFeignClientFallbackFactory.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/EquipmentFeignClientFallbackFactory.java index fe80172..f85a479 100644 --- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/EquipmentFeignClientFallbackFactory.java +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/EquipmentFeignClientFallbackFactory.java @@ -83,6 +83,12 @@ public class EquipmentFeignClientFallbackFactory implements FallbackFactory getDevByLineId(String lineId) { + log.error("{}异常,降级处理,异常为:{}","根据监测点id查询装置信息",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } }; } } diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/IntegrityClientFallbackFactory.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/IntegrityClientFallbackFactory.java new file mode 100644 index 0000000..7c15fb0 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/IntegrityClientFallbackFactory.java @@ -0,0 +1,37 @@ +package com.njcn.csdevice.api.fallback; + +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csdevice.api.IntegrityFeignClient; +import com.njcn.csdevice.pojo.po.RStatIntegrityD; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author xy + */ +@Slf4j +@Component +public class IntegrityClientFallbackFactory implements FallbackFactory { + @Override + public IntegrityFeignClient create(Throwable cause) { + //判断抛出异常是否为解码器抛出的业务异常 + Enum exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK; + if (cause.getCause() instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause.getCause(); + } + Enum finalExceptionEnum = exceptionEnum; + return new IntegrityFeignClient() { + + @Override + public HttpResult> list(List list, String startTime, String endTime) { + log.error("{}异常,降级处理,异常为:{}","查询数据异常",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + }; + } +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/onlineRateClientFallbackFactory.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/onlineRateClientFallbackFactory.java new file mode 100644 index 0000000..bc0edb3 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/onlineRateClientFallbackFactory.java @@ -0,0 +1,37 @@ +package com.njcn.csdevice.api.fallback; + +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csdevice.api.OnlineRateFeignClient; +import com.njcn.csdevice.pojo.po.RStatOnlineRateD; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author xy + */ +@Slf4j +@Component +public class onlineRateClientFallbackFactory implements FallbackFactory { + @Override + public OnlineRateFeignClient create(Throwable cause) { + //判断抛出异常是否为解码器抛出的业务异常 + Enum exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK; + if (cause.getCause() instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause.getCause(); + } + Enum finalExceptionEnum = exceptionEnum; + return new OnlineRateFeignClient() { + + @Override + public HttpResult> list(List list, String startTime, String endTime) { + log.error("{}异常,降级处理,异常为:{}","查询数据异常",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + }; + } +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/param/LineCountEvaluateParam.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/param/LineCountEvaluateParam.java new file mode 100644 index 0000000..b32100d --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/param/LineCountEvaluateParam.java @@ -0,0 +1,70 @@ +package com.njcn.csdevice.param; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 监测点有效数值统计数据评估入参 + * + * @author hongawen + * @version 1.0 + * @data 2024/11/6 20:36 + */ +@Data +public class LineCountEvaluateParam implements Serializable { + + /** + * 监测点编号集合 + */ + private List lineId; + + /** + * 表名 + */ + private String tableName; + + /** + * 相别集合 + */ + private List phasicType; + + /** + * 值类型 + */ + private List valueType; + + /** + * 异常数据时间集合 + * Map> key:监测点id value:异常时间集合 + */ + private Map> abnormalTime; + + /** + * 列名 + */ + private String columnName; + + /** + * 最小值 >= + */ + private String ge; + + /** + * 最大值 <= + */ + private String lt; + + /** + * 数据类型 判断获取数据是否排除暂态异常数据 + */ + private Boolean dataType = true; + + private String startTime; + + private String endTime; + + +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/PqsCommunicateDto.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/PqsCommunicateDto.java new file mode 100644 index 0000000..1a026e2 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/PqsCommunicateDto.java @@ -0,0 +1,24 @@ +package com.njcn.csdevice.pojo.dto; + +import lombok.Data; + +import java.io.Serializable; + + +/** + * @Description: + * @Author: wr + * @Date: 2025/3/10 10:01 + */ +@Data +public class PqsCommunicateDto implements Serializable { + + private String time; + + private String devId; + + private String description; + + private Integer type; + +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/CsEquipmentDeliveryQueryParm.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/CsEquipmentDeliveryQueryParm.java index 7377369..6a6aef4 100644 --- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/CsEquipmentDeliveryQueryParm.java +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/CsEquipmentDeliveryQueryParm.java @@ -34,4 +34,7 @@ public class CsEquipmentDeliveryQueryParm extends BaseParam { @ApiModelProperty("运行状态 1:离线 2:在线") private Integer runStatus; + @ApiModelProperty("流程步骤") + private Integer process; + } \ No newline at end of file diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatIntegrityD.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatIntegrityD.java new file mode 100644 index 0000000..ed7842e --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatIntegrityD.java @@ -0,0 +1,35 @@ +package com.njcn.csdevice.pojo.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.github.jeffreyning.mybatisplus.anno.MppMultiId; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDate; + +/** + *

+ * 数据完整性日表 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Data +@TableName("r_stat_integrity_d") +public class RStatIntegrityD implements Serializable { + + private static final long serialVersionUID = 1L; + + @MppMultiId + private LocalDate timeId; + + @MppMultiId + private String lineIndex; + + private Integer dueTime; + + private Integer realTime; + + +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatOnlineRateD.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatOnlineRateD.java new file mode 100644 index 0000000..5e6ba4b --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/RStatOnlineRateD.java @@ -0,0 +1,35 @@ +package com.njcn.csdevice.pojo.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.github.jeffreyning.mybatisplus.anno.MppMultiId; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDate; + +/** + *

+ * 在线率日表 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Data +@TableName("r_stat_onlinerate_d") +public class RStatOnlineRateD implements Serializable { + + private static final long serialVersionUID = 1L; + + @MppMultiId + private LocalDate timeId; + + @MppMultiId + private String devIndex; + + private Integer onlineMin; + + private Integer offlineMin; + + +} diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/EachModuleVO.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/EachModuleVO.java new file mode 100644 index 0000000..c2c7396 --- /dev/null +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/EachModuleVO.java @@ -0,0 +1,44 @@ +package com.njcn.csdevice.pojo.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author xy + */ +@Data +public class EachModuleVO implements Serializable { + + @ApiModelProperty("模块名称") + private String moduleName; + + @ApiModelProperty("模块状态") + private String moduleState; + + List dataList; + + @Data + public static class harmonicVo implements Serializable { + + @ApiModelProperty("稳态数据时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime time; + + @ApiModelProperty("模块状态 0-离线,1-运行,2-停止,3-故障") + private String stateDesc; + + @ApiModelProperty("数据类型 0-稳态数据 1-事件数据 2-主动触发") + private Integer dataType; + + @ApiModelProperty("事件code") + private String eventCode; + + @ApiModelProperty("事件名称") + private String eventName; + } +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/InsertBean.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/InsertBean.java new file mode 100644 index 0000000..d047b7a --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/InsertBean.java @@ -0,0 +1,20 @@ +package com.njcn.csdevice.controller.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * 动态注解类 + * + * @author hongawen + * @version 1.0 + * @data 2024/11/7 11:00 + */ +@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface InsertBean { + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/QueryBean.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/QueryBean.java new file mode 100644 index 0000000..f9032cf --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/annotation/QueryBean.java @@ -0,0 +1,20 @@ +package com.njcn.csdevice.controller.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * 动态注解类 + * + * @author hongawen + * @version 1.0 + * @data 2024/11/7 11:00 + */ +@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface QueryBean { + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/bean/DynamicBeanProcessor.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/bean/DynamicBeanProcessor.java new file mode 100644 index 0000000..aa8415f --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/bean/DynamicBeanProcessor.java @@ -0,0 +1,78 @@ +package com.njcn.csdevice.controller.bean; + + +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.csdevice.controller.annotation.InsertBean; +import com.njcn.csdevice.controller.annotation.QueryBean; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RestController; + +import java.lang.reflect.Field; + +/** + * @author hongawen + * @version 1.0 + * @data 2024/11/7 11:31 + */ +@Component +public class DynamicBeanProcessor implements BeanPostProcessor { + + @Autowired + private ApplicationContext context; + + /** + * 查询配置 + */ + @Value("${data.source.query:Influxdb}") + private String queryParam; + + /** + * 插入配置 + */ + @Value("${data.source.insert:Relation}") + private String insertParam; + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean.getClass().isAnnotationPresent(Controller.class) || bean.getClass().isAnnotationPresent(RestController.class) || bean.getClass().isAnnotationPresent(Service.class)) { + processFields(bean); + } + return bean; + } + + private void processFields(Object bean) { + Field[] fields = bean.getClass().getDeclaredFields(); + for (Field field : fields) { + String beanId; + Class type = field.getType(); + // 判断是否是接口类型,并且是否是注解指定类库 + if (type.isInterface() && (field.isAnnotationPresent(QueryBean.class) || field.isAnnotationPresent(InsertBean.class))) { + String name = type.getName(); + beanId = name.substring(name.lastIndexOf(".") + 2); + if (field.isAnnotationPresent(QueryBean.class)) { + beanId = queryParam + beanId + "Impl"; + } else if (field.isAnnotationPresent(InsertBean.class)) { + beanId = insertParam + beanId + "Impl"; + } + try { + field.setAccessible(true); + field.set(bean, context.getBean(beanId)); + } catch (IllegalAccessException e) { + throw new BusinessException("获取动态实现类失败"); + } + } + } + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/PqsCommunicateController.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/PqsCommunicateController.java new file mode 100644 index 0000000..9e4e0b5 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/PqsCommunicateController.java @@ -0,0 +1,78 @@ +package com.njcn.csdevice.controller.data; + +import com.njcn.common.pojo.annotation.OperateInfo; +import com.njcn.common.pojo.constant.OperateType; +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.csdevice.controller.annotation.QueryBean; +import com.njcn.csdevice.param.LineCountEvaluateParam; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import com.njcn.csdevice.service.ICsCommunicateService; +import com.njcn.web.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +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; + +/** + * @author hongawen + * @version 1.0 + * @data 2024/11/6 19:48 + */ +@Validated +@Slf4j +@Controller +@RestController +@RequestMapping("/pqsCommunicate") +@Api(tags = "获取装置上下线记录") +public class PqsCommunicateController extends BaseController { + + @QueryBean + private ICsCommunicateService pqsCommunicateCvtQuery; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getRawDataLatest") + @ApiOperation("获取取出最新装置数据") + public HttpResult> getRawDataLatest(@RequestBody LineCountEvaluateParam lineParam) { + String methodDescribe = getMethodDescribe("getRawDataLatest"); + List rawData = pqsCommunicateCvtQuery.getRawDataLatest(lineParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rawData, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getRawData") + @ApiOperation("获取原始数据") + public HttpResult> getRawData(@RequestBody LineCountEvaluateParam lineParam) { + String methodDescribe = getMethodDescribe("getRawData"); + List rawData = pqsCommunicateCvtQuery.getRawData(lineParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rawData, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getRawDataEnd") + @ApiOperation("获取是否有当天最后一条数据") + public HttpResult> getRawDataEnd(@RequestBody LineCountEvaluateParam lineParam) { + String methodDescribe = getMethodDescribe("getRawData"); + List rawData = pqsCommunicateCvtQuery.getRawDataEnd(lineParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rawData, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON,operateType = OperateType.ADD) + @PostMapping("/insertion") + @ApiOperation("插入数据") + public HttpResult insertion(@RequestBody PqsCommunicateDto pqsCommunicateDto) { + String methodDescribe = getMethodDescribe("insertion"); + pqsCommunicateCvtQuery.insertion(pqsCommunicateDto); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatIntegrityDController.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatIntegrityDController.java new file mode 100644 index 0000000..1fa9415 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatIntegrityDController.java @@ -0,0 +1,60 @@ +package com.njcn.csdevice.controller.data; + + +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.csdevice.pojo.po.RStatIntegrityD; +import com.njcn.csdevice.service.IRStatIntegrityDService; +import com.njcn.csharmonic.pojo.param.StatisticsDataParam; +import com.njcn.web.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 数据完整性日表 前端控制器 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Slf4j +@RestController +@RequestMapping("/rStatIntegrityD") +@Api(tags = "数据完整性接口") +@AllArgsConstructor +public class RStatIntegrityDController extends BaseController { + + private final IRStatIntegrityDService irStatIntegrityDService; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/add") + @ApiOperation("新增数据完整性(可根据时间段进行补召)") + @ApiImplicitParam(name = "param", value = "参数", required = true) + public HttpResult addData(@RequestBody @Validated StatisticsDataParam param){ + String methodDescribe = getMethodDescribe("addData"); + irStatIntegrityDService.addData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/list") + @ApiOperation("获取数据") + public HttpResult> list(@Validated @RequestParam("list") List list, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime){ + String methodDescribe = getMethodDescribe("list"); + List result = irStatIntegrityDService.getData(list,startTime,endTime); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + +} + diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatOnlineRateDController.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatOnlineRateDController.java new file mode 100644 index 0000000..3104af1 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/data/RStatOnlineRateDController.java @@ -0,0 +1,60 @@ +package com.njcn.csdevice.controller.data; + + +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.csdevice.pojo.po.RStatOnlineRateD; +import com.njcn.csdevice.service.IRStatOnlineRateDService; +import com.njcn.csharmonic.pojo.param.StatisticsDataParam; +import com.njcn.web.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 在线率日表 前端控制器 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Slf4j +@RestController +@RequestMapping("/rStatOnlineRateD") +@Api(tags = "终端在线率接口") +@AllArgsConstructor +public class RStatOnlineRateDController extends BaseController { + + private final IRStatOnlineRateDService rStatOnlineRateDService; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/add") + @ApiOperation("新增终端在线率(可根据时间段进行补召)") + @ApiImplicitParam(name = "param", value = "参数", required = true) + public HttpResult addData(@RequestBody @Validated StatisticsDataParam param){ + String methodDescribe = getMethodDescribe("addData"); + rStatOnlineRateDService.addData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/list") + @ApiOperation("获取数据") + public HttpResult> list(@Validated @RequestParam("list") List list, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime){ + String methodDescribe = getMethodDescribe("list"); + List result = rStatOnlineRateDService.getData(list,startTime,endTime); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + +} + diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/equipment/EquipmentDeliveryController.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/equipment/EquipmentDeliveryController.java index 032e83d..36a4f3b 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/equipment/EquipmentDeliveryController.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/equipment/EquipmentDeliveryController.java @@ -4,14 +4,11 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.njcn.access.utils.MqttUtil; import com.njcn.common.pojo.annotation.OperateInfo; -import com.njcn.common.pojo.dto.DeviceLogDTO; 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.csdevice.constant.DataParam; import com.njcn.csdevice.enums.DeviceOperate; import com.njcn.csdevice.pojo.dto.CsEquipmentDeliveryDTO; import com.njcn.csdevice.pojo.param.*; @@ -342,4 +339,13 @@ public class EquipmentDeliveryController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getDevByLineId") + @ApiOperation("根据监测点id查询装置信息") + public HttpResult getDevByLineId(@RequestParam("lineId") String lineId){ + String methodDescribe = getMethodDescribe("getDevByLineId"); + CsEquipmentDeliveryPO po = csEquipmentDeliveryService.getDevByLineId(lineId); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, po, methodDescribe); + } + } diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatIntegrityDMapper.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatIntegrityDMapper.java new file mode 100644 index 0000000..dea2b56 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatIntegrityDMapper.java @@ -0,0 +1,18 @@ +package com.njcn.csdevice.mapper; + +import com.github.jeffreyning.mybatisplus.base.MppBaseMapper; +import com.njcn.csdevice.pojo.po.RStatIntegrityD; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 数据完整性日表 Mapper 接口 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Mapper +public interface RStatIntegrityDMapper extends MppBaseMapper { + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatOnlineRateDMapper.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatOnlineRateDMapper.java new file mode 100644 index 0000000..b6ff3c4 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/RStatOnlineRateDMapper.java @@ -0,0 +1,18 @@ +package com.njcn.csdevice.mapper; + +import com.github.jeffreyning.mybatisplus.base.MppBaseMapper; +import com.njcn.csdevice.pojo.po.RStatOnlineRateD; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 在线率日表 Mapper 接口 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Mapper +public interface RStatOnlineRateDMapper extends MppBaseMapper { + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/CsEquipmentDeliveryService.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/CsEquipmentDeliveryService.java index c178028..da52cc5 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/CsEquipmentDeliveryService.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/CsEquipmentDeliveryService.java @@ -133,4 +133,6 @@ public interface CsEquipmentDeliveryService extends IService getRawDataLatest(LineCountEvaluateParam lineParam); + + /** + * 获取时间范围数据 + * @param lineParam + * @return + */ + List getRawData(LineCountEvaluateParam lineParam); + + /** + *是否有当天最后一条数据 + * @param lineParam + * @return + */ + List getRawDataEnd(LineCountEvaluateParam lineParam); + + void insertion(PqsCommunicateDto pqsCommunicateDto); +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatIntegrityDService.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatIntegrityDService.java new file mode 100644 index 0000000..ab2fb4b --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatIntegrityDService.java @@ -0,0 +1,23 @@ +package com.njcn.csdevice.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.csdevice.pojo.po.RStatIntegrityD; +import com.njcn.csharmonic.pojo.param.StatisticsDataParam; + +import java.util.List; + +/** + *

+ * 数据完整性日表 服务类 + *

+ * + * @author xy + * @since 2025-06-23 + */ +public interface IRStatIntegrityDService extends IService { + + void addData(StatisticsDataParam param); + + List getData(List list, String startTime, String endTime); + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatOnlineRateDService.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatOnlineRateDService.java new file mode 100644 index 0000000..cbdfa0c --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IRStatOnlineRateDService.java @@ -0,0 +1,23 @@ +package com.njcn.csdevice.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.csdevice.pojo.po.RStatOnlineRateD; +import com.njcn.csharmonic.pojo.param.StatisticsDataParam; + +import java.util.List; + +/** + *

+ * 在线率日表 服务类 + *

+ * + * @author xy + * @since 2025-06-23 + */ +public interface IRStatOnlineRateDService extends IService { + + void addData(StatisticsDataParam param); + + List getData(List list, String startTime, String endTime); + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java index 8ece2fc..56af2d3 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java @@ -19,7 +19,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.njcn.access.api.AskDeviceDataFeignClient; import com.njcn.access.utils.MqttUtil; +import com.njcn.common.pojo.dto.DeviceLogDTO; import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.csdevice.api.CsLogsFeignClient; import com.njcn.csdevice.constant.DataParam; import com.njcn.csdevice.enums.AlgorithmResponseEnum; import com.njcn.csdevice.mapper.CsEquipmentDeliveryMapper; @@ -44,7 +46,6 @@ import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.enums.DicTreeEnum; import com.njcn.system.pojo.po.SysDicTreePO; -import com.njcn.system.pojo.vo.DictTreeVO; import com.njcn.web.factory.PageFactory; import com.njcn.web.utils.RequestUtil; import lombok.RequiredArgsConstructor; @@ -96,6 +97,8 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); @@ -226,10 +229,9 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(CsEquipmentDeliveryPO::getNdid,csEquipmentDeliveryAuditParm.getNdid()) @@ -240,6 +242,11 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl= 1) { throw new BusinessException(AlgorithmResponseEnum.NDID_ERROR); } + + LambdaQueryWrapper lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); + lambdaQueryWrapper2.eq(CsEquipmentDeliveryPO::getId, csEquipmentDeliveryAuditParm.getId()); + CsEquipmentDeliveryPO po = this.baseMapper.selectOne(lambdaQueryWrapper2); + List list = this.lambdaQuery() .ne(CsEquipmentDeliveryPO::getId, csEquipmentDeliveryAuditParm.getId()) .ne(CsEquipmentDeliveryPO::getNdid, csEquipmentDeliveryAuditParm.getNdid()) @@ -251,8 +258,23 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl page = this.baseMapper.page(new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)), queryWrapper); page.getRecords().forEach(item->{ if (!Objects.isNull(item.getQrPath())){ @@ -731,6 +756,12 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl i @Override public List getLinesByDevList(List list) { - return this.lambdaQuery().in(CsLinePO::getDevId,list).eq(CsLinePO::getStatus,1).list(); + return this.lambdaQuery().in(CsLinePO::getDeviceId,list).eq(CsLinePO::getStatus,1).list(); } // /** diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/InfluxdbCsCommunicateServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/InfluxdbCsCommunicateServiceImpl.java new file mode 100644 index 0000000..a9c1792 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/InfluxdbCsCommunicateServiceImpl.java @@ -0,0 +1,145 @@ +package com.njcn.csdevice.service.impl; + +import cn.hutool.core.date.DatePattern; +import com.njcn.csdevice.param.LineCountEvaluateParam; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; +import com.njcn.csdevice.service.CsEquipmentDeliveryService; +import com.njcn.csdevice.service.ICsCommunicateService; +import com.njcn.influx.imapper.PqsCommunicateMapper; +import com.njcn.influx.pojo.dto.StatisticalDataDTO; +import com.njcn.influx.pojo.po.PqsCommunicate; +import com.njcn.influx.query.InfluxQueryWrapper; +import com.njcn.influx.utils.InfluxDbUtils; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.influxdb.InfluxDB; +import org.influxdb.dto.BatchPoints; +import org.influxdb.dto.Point; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.TimeUnit; + + +/** + * @Description: + * @Author: wr + * @Date: 2025/3/7 10:13 + */ +@Slf4j +@Service("InfluxdbCsCommunicateServiceImpl") +@AllArgsConstructor +public class InfluxdbCsCommunicateServiceImpl implements ICsCommunicateService { + + private final InfluxDbUtils influxDbUtils; + private final CsEquipmentDeliveryService csEquipmentDeliveryService; + @Resource + private PqsCommunicateMapper pqsCommunicateMapper; + private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); + + @Override + public List getRawDataLatest(LineCountEvaluateParam lineParam) { + List result = new ArrayList<>(); + InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class); + influxQueryWrapper.regular(PqsCommunicate::getDevId, lineParam.getLineId()) + .select(PqsCommunicate::getTime) + .select(PqsCommunicate::getDevId) + .select(PqsCommunicate::getDescription) + .select(PqsCommunicate::getType) + .timeDesc() + .limit(1); + List list = pqsCommunicateMapper.selectByQueryWrapper(influxQueryWrapper); + list.forEach(item -> { + PqsCommunicateDto dto = new PqsCommunicateDto(); + BeanUtils.copyProperties(item, dto); + dto.setTime(DATE_TIME_FORMATTER.format(item.getTime())); + result.add(dto); + }); + return result; + } + + /** + * @Description: 获取时间段内的数据 + * @Param: + * @return: java.util.List + * @Author: clam + * @Date: 2025/02/24 + */ + @Override + public List getRawData(LineCountEvaluateParam lineParam) { + List result = new ArrayList<>(); + List list = getPqsCommunicateData(lineParam); + list.forEach(item -> { + PqsCommunicateDto dto = new PqsCommunicateDto(); + BeanUtils.copyProperties(item, dto); + dto.setTime(DATE_TIME_FORMATTER.format(item.getTime())); + result.add(dto); + }); + return result; + + } + + @Override + public List getRawDataEnd(LineCountEvaluateParam lineParam) { + List result = new ArrayList<>(); + InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class); + influxQueryWrapper.regular(PqsCommunicate::getDevId, lineParam.getLineId()) + .select(PqsCommunicate::getTime) + .select(PqsCommunicate::getDevId) + .select(PqsCommunicate::getDescription) + .select(PqsCommunicate::getType) + .le(PqsCommunicate::getTime, lineParam.getEndTime()) + .timeDesc() + .limit(1); + List list = pqsCommunicateMapper.selectByQueryWrapper(influxQueryWrapper); + list.forEach(item -> { + PqsCommunicateDto dto = new PqsCommunicateDto(); + BeanUtils.copyProperties(item, dto); + dto.setTime(DATE_TIME_FORMATTER.format(item.getTime())); + result.add(dto); + }); + return result; + } + + @Override + public void insertion(PqsCommunicateDto pqsCommunicateDto) { + //根据NDID获取装置信息 + CsEquipmentDeliveryPO po = csEquipmentDeliveryService.findDevByNDid(pqsCommunicateDto.getDevId()); + InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class); + influxQueryWrapper.eq(PqsCommunicate::getDevId,po.getId()).timeDesc().limit(1); + List pqsCommunicates = pqsCommunicateMapper.selectByQueryWrapper(influxQueryWrapper); + //如果不存数据或者状态不一样则插入数据 + if(CollectionUtils.isEmpty(pqsCommunicates) || !Objects.equals(pqsCommunicates.get(0).getType(),pqsCommunicateDto.getType())){ + Map tags = new HashMap<>(); + tags.put("dev_id",po.getId()); + Map fields = new HashMap<>(); + fields.put("type",pqsCommunicateDto.getType()); + fields.put("description",pqsCommunicateDto.getDescription()); + long time = LocalDateTime.parse(pqsCommunicateDto.getTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + Point point = influxDbUtils.pointBuilder("pqs_communicate", time, TimeUnit.MILLISECONDS, tags, fields); + BatchPoints batchPoints = BatchPoints.database(influxDbUtils.getDbName()).retentionPolicy("").consistency(InfluxDB.ConsistencyLevel.ALL).build(); + batchPoints.point(point); + influxDbUtils.batchInsert(influxDbUtils.getDbName(), "", InfluxDB.ConsistencyLevel.ALL, TimeUnit.MILLISECONDS, Collections.singletonList(batchPoints.lineProtocol())); + } + } + + + public List getPqsCommunicateData(LineCountEvaluateParam lineParam) { + InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(PqsCommunicate.class); + influxQueryWrapper.regular(PqsCommunicate::getDevId, lineParam.getLineId()) + .select(PqsCommunicate::getTime) + .select(PqsCommunicate::getDevId) + .select(PqsCommunicate::getDescription) + .select(PqsCommunicate::getType) + .between(PqsCommunicate::getTime, lineParam.getStartTime(), lineParam.getEndTime()) + .timeAsc(); + return pqsCommunicateMapper.selectByQueryWrapper(influxQueryWrapper); + } +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatIntegrityDServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatIntegrityDServiceImpl.java new file mode 100644 index 0000000..6b01619 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatIntegrityDServiceImpl.java @@ -0,0 +1,99 @@ +package com.njcn.csdevice.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.github.jeffreyning.mybatisplus.service.MppServiceImpl; +import com.njcn.csdevice.api.CsLineFeignClient; +import com.njcn.csdevice.api.EquipmentFeignClient; +import com.njcn.csdevice.mapper.RStatIntegrityDMapper; +import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; +import com.njcn.csdevice.pojo.po.CsLinePO; +import com.njcn.csdevice.pojo.po.RStatIntegrityD; +import com.njcn.csdevice.service.IRStatIntegrityDService; +import com.njcn.csdevice.util.TimeUtil; +import com.njcn.csharmonic.pojo.param.StatisticsDataParam; +import com.njcn.influx.pojo.dto.StatisticalDataDTO; +import com.njcn.influx.service.CommonService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 数据完整性日表 服务实现类 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@DS("sjzx") +@Slf4j +@Service +@RequiredArgsConstructor +public class RStatIntegrityDServiceImpl extends MppServiceImpl implements IRStatIntegrityDService { + + private final EquipmentFeignClient equipmentFeignClient; + private final CsLineFeignClient csLineFeignClient; + private final CommonService commonService; + + @Override + public void addData(StatisticsDataParam param) { + List result = new ArrayList<>(); + //获取库中正常的所有装置 + List devList = equipmentFeignClient.getAll().getData(); + if (CollectionUtil.isNotEmpty(devList)) { + Map devMap = devList.stream().collect(Collectors.toMap(CsEquipmentDeliveryPO::getId, Function.identity())); + //获取所有监测点 + List devIdList = devList.stream().map(CsEquipmentDeliveryPO::getId).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(devIdList)) { + //获取需要计算的时间 + List dateRange = TimeUtil.getDateRangeAsString(param.getStartTime(), param.getEndTime()); + //获取监测点信息 + List csLinePOList = csLineFeignClient.getLinesByDevList(devIdList).getData(); + csLinePOList.forEach(item->{ + //应收数据 + int dueCount = 1440 / item.getLineInterval(); + Integer process = devMap.get(item.getDeviceId()).getProcess(); + for (String time : dateRange) { + StatisticalDataDTO statisticalDataDTO; + RStatIntegrityD data = new RStatIntegrityD(); + //治理监测点 + if (item.getClDid() == 0) { + statisticalDataDTO = commonService.getCounts(item.getLineId(),"apf_data","Apf_Freq","frequency","M","avg",item.getClDid().toString(),process.toString(),time+" 00:00:00",time+" 23:59:59"); + } + //电能质量监测点 + else { + statisticalDataDTO = commonService.getCounts(item.getLineId(),"pqd_data","Pq_Freq","frequency","M","avg",item.getClDid().toString(),process.toString(),time+" 00:00:00",time+" 23:59:59"); + } + data.setTimeId(LocalDate.parse(time, DatePattern.NORM_DATE_FORMATTER)); + data.setLineIndex(item.getLineId()); + data.setDueTime(dueCount); + data.setRealTime(statisticalDataDTO == null || statisticalDataDTO.getFrequency() == null + ? 0 : Integer.parseInt(statisticalDataDTO.getFrequency())); + result.add(data); + } + }); + } + } + if (CollectionUtil.isNotEmpty(result)) { + this.saveOrUpdateBatchByMultiId(result); + } + } + + @Override + public List getData(List list, String startTime, String endTime) { + return this.lambdaQuery() + .in(RStatIntegrityD::getLineIndex,list) + .between(RStatIntegrityD::getTimeId,startTime,endTime) + .list(); + } + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatOnlineRateDServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatOnlineRateDServiceImpl.java new file mode 100644 index 0000000..7b8ce32 --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/RStatOnlineRateDServiceImpl.java @@ -0,0 +1,182 @@ +package com.njcn.csdevice.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.github.jeffreyning.mybatisplus.service.MppServiceImpl; +import com.njcn.csdevice.api.EquipmentFeignClient; +import com.njcn.csdevice.mapper.RStatOnlineRateDMapper; +import com.njcn.csdevice.param.LineCountEvaluateParam; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; +import com.njcn.csdevice.pojo.po.RStatOnlineRateD; +import com.njcn.csdevice.service.ICsCommunicateService; +import com.njcn.csdevice.service.IRStatOnlineRateDService; +import com.njcn.csdevice.util.TimeUtil; +import com.njcn.csharmonic.pojo.param.StatisticsDataParam; +import com.njcn.influx.deprecated.InfluxDBPublicParam; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/** + *

+ * 在线率日表 服务实现类 + *

+ * + * @author xy + * @since 2025-06-23 + */ +@Service +@Slf4j +@AllArgsConstructor +@DS("sjzx") +public class RStatOnlineRateDServiceImpl extends MppServiceImpl implements IRStatOnlineRateDService { + + private final Integer online = 1; + private final EquipmentFeignClient equipmentFeignClient; + private final ICsCommunicateService pqsCommunicateService; + + @Override + public void addData(StatisticsDataParam param) { + List list = new ArrayList<>(); + //获取库中正常的所有装置 + List devList = equipmentFeignClient.getAll().getData(); + if (CollectionUtil.isNotEmpty(devList)) { + //获取需要计算的时间 + List dateRange = TimeUtil.getDateRangeAsString(param.getStartTime(), param.getEndTime()); + for (String time : dateRange) { + List outCommunicateData = new ArrayList<>(); + LineCountEvaluateParam lineParam = new LineCountEvaluateParam(); + lineParam.setStartTime(time + " 00:00:00"); + lineParam.setEndTime(time + " 23:59:59"); + for (CsEquipmentDeliveryPO s : devList) { + lineParam.setLineId(Collections.singletonList(s.getId())); + List data = pqsCommunicateService.getRawDataLatest(lineParam); + if (CollectionUtil.isEmpty(data)) { + PqsCommunicateDto dto = new PqsCommunicateDto(); + dto.setTime(time + " 00:00:00"); + dto.setDevId(s.getId()); + if (s.getRunStatus() == 1) { + dto.setType(0); + dto.setDescription("通讯中断"); + } else if (s.getRunStatus() == 2) { + dto.setType(1); + dto.setDescription("通讯正常"); + } + outCommunicateData.add(dto); + } + outCommunicateData.addAll(data); + } + Date dateOut = DateUtil.parse(time); + for (PqsCommunicateDto pqsCommunicate : outCommunicateData) { + RStatOnlineRateD po = new RStatOnlineRateD(); + Date newDate = DateUtil.parse(pqsCommunicate.getTime()); + lineParam.setLineId(Collections.singletonList(pqsCommunicate.getDevId())); + RStatOnlineRateD onLineRate = onLineMinute(newDate, dateOut, pqsCommunicate.getType(), lineParam); + po.setTimeId(LocalDate.parse(time, DatePattern.NORM_DATE_FORMATTER)); + po.setDevIndex(pqsCommunicate.getDevId()); + po.setOnlineMin(onLineRate.getOnlineMin()); + po.setOfflineMin(onLineRate.getOfflineMin()); + list.add(po); + } + } + } + if (CollectionUtil.isNotEmpty(list)) { + this.saveOrUpdateBatchByMultiId(list,1000); + } + } + + @Override + public List getData(List list, String startTime, String endTime) { + return this.lambdaQuery() + .in(RStatOnlineRateD::getDevIndex,list) + .between(RStatOnlineRateD::getTimeId,startTime,endTime) + .list(); + } + + + /** + * new的时间和当前统计时间 不是/是 同一天 + */ + private RStatOnlineRateD onLineMinute(Date newDate, Date date, Integer type, LineCountEvaluateParam lineParam) { + RStatOnlineRateD onLineRate = new RStatOnlineRateD(); + Integer minute = 0; + /*new的时间和当前统计时间是同一天*/ + if (DateUtil.isSameDay(newDate, date)) { + minute = processData(newDate, date, type, lineParam); + } else { + /*new的时间和当前统计时间不是同一天*/ + Date nowDate = new Date(); + /*数据补招的情况下*/ + if (DateUtil.between(date, nowDate, DateUnit.DAY) > DateUtil.between(newDate, nowDate, DateUnit.DAY)) { + minute = processData(newDate, date, null, lineParam); + } else { + if (online.equals(type)) { + minute = InfluxDBPublicParam.DAY_MINUTE; + } + } + } + onLineRate.setOnlineMin(minute); + onLineRate.setOfflineMin(InfluxDBPublicParam.DAY_MINUTE - minute); + return onLineRate; + } + + private Integer processData(Date newDate, Date date, Integer type,LineCountEvaluateParam lineParam) { + int minute = 0; + List communicateData = pqsCommunicateService.getRawData(lineParam); + /*当前统计时间内存在多条数据*/ + if (communicateData.size() > 1) { + Date lastTime = null; + long onlineTime = 0; + long offlineTime = 0; + for (int i = 0; i < communicateData.size(); i++) { + long differ; + if (i == 0) { + /*首次比较取统计时间*/ + differ = DateUtil.between(date, DateUtil.parse(communicateData.get(i).getTime()), DateUnit.MINUTE); + } else { + /*后续取上一次数据时间*/ + differ = DateUtil.between(lastTime, DateUtil.parse(communicateData.get(i).getTime()), DateUnit.MINUTE); + } + if (online.equals(communicateData.get(i).getType())) { + offlineTime = offlineTime + differ; + } else { + onlineTime = onlineTime + differ; + } + lastTime = DateUtil.parse(communicateData.get(i).getTime()); + } + if (online.equals(communicateData.get(communicateData.size() - 1).getType())) { + minute = InfluxDBPublicParam.DAY_MINUTE - (int) offlineTime; + } else { + minute = (int) onlineTime; + } + } else { + if (type != null) { + /*当前统计时间内仅有一条数据*/ + long differ = DateUtil.between(date, newDate, DateUnit.MINUTE); + if (online.equals(type)) { + minute = InfluxDBPublicParam.DAY_MINUTE - (int) differ; + } + } else { + List communicateDataOld = pqsCommunicateService.getRawDataEnd(lineParam); + if (!communicateDataOld.isEmpty()){ + if (online.equals(communicateDataOld.get(0).getType())){ + minute = InfluxDBPublicParam.DAY_MINUTE; + } + } + } + } + return minute; + } + + +} diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/util/TimeUtil.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/util/TimeUtil.java new file mode 100644 index 0000000..fdb38ad --- /dev/null +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/util/TimeUtil.java @@ -0,0 +1,41 @@ +package com.njcn.csdevice.util; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 类的介绍: + * 二维码工具 + * @author xuyang + * @version 1.0.0 + * @createTime 2023/8/21 13:57 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class TimeUtil { + + public static List getDateRangeAsString(String startDateStr, String endDateStr) { + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 解析为LocalDate对象 + LocalDate startDate = LocalDate.parse(startDateStr, formatter); + LocalDate endDate = LocalDate.parse(endDateStr, formatter); + // 计算天数差 + long numOfDays = ChronoUnit.DAYS.between(startDate, endDate) + 1; + // 生成日期流,格式化为字符串并收集为列表 + return Stream.iterate(startDate, date -> date.plusDays(1)) + .limit(numOfDays) + .map(formatter::format) + .collect(Collectors.toList()); + } +} + diff --git a/cs-device/cs-device-boot/src/main/resources/bootstrap.yml b/cs-device/cs-device-boot/src/main/resources/bootstrap.yml index b551b9d..d37c637 100644 --- a/cs-device/cs-device-boot/src/main/resources/bootstrap.yml +++ b/cs-device/cs-device-boot/src/main/resources/bootstrap.yml @@ -45,7 +45,10 @@ logging: level: root: info - +data: + source: + query: Influxdb + insert: Relation #mybatis配置信息 mybatis-plus: #别名扫描 diff --git a/cs-device/cs-device-boot/src/test/java/com/njcn/AppTest.java b/cs-device/cs-device-boot/src/test/java/com/njcn/AppTest.java index 17c8f16..532d91d 100644 --- a/cs-device/cs-device-boot/src/test/java/com/njcn/AppTest.java +++ b/cs-device/cs-device-boot/src/test/java/com/njcn/AppTest.java @@ -1,14 +1,39 @@ package com.njcn; +import com.njcn.csdevice.CsDeviceBootApplication; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import com.njcn.csdevice.service.DeviceFtpService; +import com.njcn.csdevice.service.ICsCommunicateService; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; import static org.junit.Assert.assertTrue; /** * Unit test for simple App. */ -public class AppTest -{ +@RunWith(SpringRunner.class) +@WebAppConfiguration +@SpringBootTest(classes = CsDeviceBootApplication.class) +@Slf4j +@AllArgsConstructor +public class AppTest{ + + @Autowired + private DeviceFtpService deviceFtpService; + + @Autowired + private ICsCommunicateService csCommunicateService; + + /** * Rigorous Test :-) */ @@ -17,4 +42,35 @@ public class AppTest { assertTrue( true ); } + + + /** + * 测试下载文件 + */ + @SneakyThrows + @Test + public void downloadFileTest() { + String nDid = "00B78D016AB5"; + String name = "/etc/pqs_arm.bin"; + Integer size = 5123552; + String fileCheck = "859E36E8"; + for (int i = 0; i < 10; i++) { + log.info("开始第{}次", i); + deviceFtpService.downloadFile(nDid,name,size,fileCheck); + Thread.sleep(1000 * 60 * 4); + log.info("这是第{}次询问装置,结果为:{}", i, null); + } + } + + @SneakyThrows + @Test + public void writeData() { + PqsCommunicateDto pqsCommunicateDto = new PqsCommunicateDto(); + pqsCommunicateDto.setTime("2024-01-01 00:00:00"); + pqsCommunicateDto.setDevId("da7aa071bf89864bedea8833133676b7"); + pqsCommunicateDto.setType(1); + pqsCommunicateDto.setDescription("通讯连接"); + csCommunicateService.insertion(pqsCommunicateDto); + } + } diff --git a/cs-device/cs-device-boot/src/test/java/com/njcn/BaseJunitTest.java b/cs-device/cs-device-boot/src/test/java/com/njcn/BaseJunitTest.java new file mode 100644 index 0000000..ed2e9cd --- /dev/null +++ b/cs-device/cs-device-boot/src/test/java/com/njcn/BaseJunitTest.java @@ -0,0 +1,31 @@ +package com.njcn; + +import com.njcn.csdevice.CsDeviceBootApplication; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +@RunWith(SpringRunner.class) +@WebAppConfiguration +@SpringBootTest(classes = CsDeviceBootApplication.class) +public class BaseJunitTest { + + public static void main(String[] args) { + double num1 = 123.456; + double num2 = 123.4; + double num3 = 123.0; + + System.out.println(roundToTwoDecimalPlaces(num1)); // 输出: 123.46 + System.out.println(roundToTwoDecimalPlaces(num2)); // 输出: 123.40 + System.out.println(roundToTwoDecimalPlaces(num3)); // 输出: 123.00 + } + + public static double roundToTwoDecimalPlaces(double num) { + // 乘以100,然后四舍五入,再除以100 + return Math.round(num * 100.0) / 100.0; + } +} diff --git a/cs-device/cs-device-boot/src/test/java/com/njcn/DownloadFileTest.java b/cs-device/cs-device-boot/src/test/java/com/njcn/DownloadFileTest.java new file mode 100644 index 0000000..66aca28 --- /dev/null +++ b/cs-device/cs-device-boot/src/test/java/com/njcn/DownloadFileTest.java @@ -0,0 +1,123 @@ +package com.njcn; + +import cn.hutool.core.util.IdUtil; +import com.njcn.csdevice.pojo.dto.PqsCommunicateDto; +import com.njcn.csdevice.service.DeviceFtpService; +import com.njcn.influx.imapper.EvtDataMapper; +import com.njcn.influx.imapper.PqsCommunicateMapper; +import com.njcn.influx.pojo.po.PqsCommunicate; +import com.njcn.influx.pojo.po.cs.EntData; +import com.njcn.oss.constant.OssPath; +import com.njcn.oss.utils.FileStorageUtil; +import lombok.SneakyThrows; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.*; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class DownloadFileTest extends BaseJunitTest{ + + @Autowired + private DeviceFtpService deviceFtpService; + + @Autowired + private FileStorageUtil fileStorageUtil; + @Autowired + private EvtDataMapper evtDataMapper; + @Autowired + private PqsCommunicateMapper pqsCommunicateMapper; + private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); + + /** + * inflxudb写入 + */ + @SneakyThrows + @Test + public void addInfluxdb() { + PqsCommunicateDto pqsCommunicate = new PqsCommunicateDto(); + pqsCommunicate.setTime("2025-06-23 "); + pqsCommunicate.setDevId("da7aa071bf89864bedea8833133676b7"); + pqsCommunicate.setType(1); + pqsCommunicate.setDescription("设备上线"); + } + + /** + * 测试下载文件 + */ + @SneakyThrows + @Test + public void downloadFileTest() { + String nDid = "00B78D016AB3"; + String name = "/etc/pqs_arm.bin"; + Integer size = 5127376; + String fileCheck = "E883C579"; + String filePath = "C:\\Users\\徐扬\\Desktop\\download.txt"; + for (int i = 0; i < 10; i++) { + System.out.println("开始第"+i+"次"); + deviceFtpService.downloadFile(nDid,name,size,fileCheck); + String dataToAppend = LocalDateTime.now() + "开始下载,这是第"+i+"次,结果为:" + null + "\r\n"; + // 第二个参数为 true 表示追加模式 + try (FileWriter fileWriter = new FileWriter(filePath, true)) { + fileWriter.write(dataToAppend); // 写入数据 + System.out.println("数据已成功追加到文件中。"); + } catch (IOException e) { + System.err.println("写入文件时发生错误: " + e.getMessage()); + } + } + } + + @SneakyThrows + @Test + public void moveFile() { + String oldPath = "/db0/cmn/07/min/20240925/line2_avg.bin"; + StringBuilder result = null; + String[] arr = oldPath.split("/"); + for (String s : arr) { + s = s + File.separator; + } + System.out.println("result==:" + result); + } + + public static void main(String[] args) { + String nDid = "00B78D016AB3"; + String oldPath = "/db0/cmn/07/min/20240925/line2_avg.bin"; + String path = getFilePath(oldPath,nDid); + System.out.println("path==:" + path); + } + + private static String getFilePath(String path, String nDid) { + String[] parts = path.split("/"); + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (int i = 3; i < parts.length; i++) { + if (!first) { + sb.append(File.separator); + } + sb.append(parts[i]); + first = false; + } + + return nDid + File.separator + sb.toString(); + } + +// private static String getFilePath(String path, String nDid) { +// path = nDid + "/" + path; +// String[] parts = path.split("/"); +// StringBuilder sb = new StringBuilder(); +// boolean first = true; +// for (int i = 4; i < parts.length; i++) { +// if (!first) { +// sb.append("/"); +// } +// sb.append(parts[i]); +// first = false; +// } +// return sb.toString(); +// } + +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/DataParam.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/DataParam.java index 51ffe21..aaaed54 100644 --- a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/DataParam.java +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/DataParam.java @@ -20,6 +20,9 @@ public class DataParam implements Serializable { @ApiModelProperty("监测点id") private String lineId; + @ApiModelProperty("模块编号") + private Integer clDid; + @ApiModelProperty("指标统计类型") private String targetType; @@ -29,4 +32,7 @@ public class DataParam implements Serializable { @ApiModelProperty("数据来源 0:补召 1:在线监测 ") private Integer dataSource; + @ApiModelProperty("运行状态 1:离线 2:在线") + private Integer comFlag; + } diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/dto/DataOnlineRateDto.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/dto/DataOnlineRateDto.java new file mode 100644 index 0000000..a4f276b --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/dto/DataOnlineRateDto.java @@ -0,0 +1,38 @@ +package com.njcn.csharmonic.pojo.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * @Description: 在线率日表 + */ +@Data +public class DataOnlineRateDto { + + private static final long serialVersionUID = 1L; + + /** + * 在线条数 + */ + private Integer onlineMin; + + /** + * 离线条数 + */ + private Integer offlineMin; + + @EqualsAndHashCode(callSuper = true) + @Data + public static class Detail extends DataOnlineRateDto{ + /** + * 日期 + */ + private String timeId; + + /** + * 装置id + */ + private String devIndex; + } +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/StatisticsDataParam.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/StatisticsDataParam.java index d0a236a..f55ec8d 100644 --- a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/StatisticsDataParam.java +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/StatisticsDataParam.java @@ -1,9 +1,11 @@ package com.njcn.csharmonic.pojo.param; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * @author xy @@ -11,9 +13,16 @@ import java.io.Serializable; @Data public class StatisticsDataParam implements Serializable { + private static final long serialVersionUID = 1L; + @ApiModelProperty("起始时间") + @JsonFormat(pattern = "yyyy-MM-dd") private String startTime; @ApiModelProperty("结束时间") + @JsonFormat(pattern = "yyyy-MM-dd") private String endTime; + + private List idList; + } diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/po/CsEventPO.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/po/CsEventPO.java index c818e3f..61d119b 100644 --- a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/po/CsEventPO.java +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/po/CsEventPO.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import com.njcn.db.bo.BaseEntity; import lombok.Data; import lombok.NoArgsConstructor; @@ -43,6 +44,7 @@ public class CsEventPO extends BaseEntity { /** * 事件时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "start_time") private LocalDateTime startTime; diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/LineIntegrityVo.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/DataVo.java similarity index 91% rename from cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/LineIntegrityVo.java rename to cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/DataVo.java index 5df08ad..82f2040 100644 --- a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/LineIntegrityVo.java +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/DataVo.java @@ -11,7 +11,7 @@ import java.io.Serializable; */ @Data -public class LineIntegrityVo implements Serializable { +public class DataVo implements Serializable { @ApiModelProperty("装置id") private String devId; diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/HalfMonthReportVO.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/HalfMonthReportVO.java new file mode 100644 index 0000000..792ed10 --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/HalfMonthReportVO.java @@ -0,0 +1,53 @@ +package com.njcn.csharmonic.pojo.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author xy + */ +@Data +public class HalfMonthReportVO implements Serializable { + + @ApiModelProperty("工程名称") + private String engineeringName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("设备名称") + private String devName; + + @ApiModelProperty("设备型号") + private String devType; + + @ApiModelProperty("MAC地址") + private String mac; + + @ApiModelProperty("监测点名称") + private String lineName; + + @ApiModelProperty("运行状态") + private String operationalStatus; + + @ApiModelProperty("监测点通讯状态") + private String communicationStatus; + + @ApiModelProperty("投运时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime operationalTime; + + @ApiModelProperty("最新数据时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime latestTime; + + @ApiModelProperty("数据完整性") + private Double integrity; + + @ApiModelProperty("终端在线率") + private Double onlineRate; +} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/CsEventController.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/CsEventController.java index b3edf5a..f94e7dc 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/CsEventController.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/CsEventController.java @@ -9,6 +9,7 @@ import com.njcn.common.utils.HttpResultUtil; import com.njcn.csdevice.pojo.vo.DataGroupEventVO; import com.njcn.csharmonic.param.CsEventUserQueryPage; import com.njcn.csharmonic.param.CsEventUserQueryParam; +import com.njcn.csharmonic.param.DataParam; import com.njcn.csharmonic.pojo.po.CsEventPO; import com.njcn.csharmonic.pojo.vo.CsEventVO; import com.njcn.csharmonic.pojo.vo.EventDetailVO; @@ -23,7 +24,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; -import java.time.LocalDateTime; import java.util.List; /** @@ -91,7 +91,6 @@ public class CsEventController extends BaseController { public void getFileZip(String eventId, HttpServletResponse response) { String methodDescribe = getMethodDescribe("getFileZip"); csEventPOService.getFileZip(eventId,response); - } @OperateInfo(info = LogEnum.BUSINESS_COMMON) @@ -112,4 +111,14 @@ public class CsEventController extends BaseController { CsEventPO po = csEventPOService.lambdaQuery().eq(CsEventPO::getDeviceId,csEventPO.getDeviceId()).eq(CsEventPO::getTag,csEventPO.getTag()).eq(CsEventPO::getStartTime,csEventPO.getStartTime()).one(); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, po, methodDescribe); } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/queryByModelId") + @ApiOperation("获取各模块事件") + public HttpResult> queryByModelId(@RequestBody DataParam param) { + String methodDescribe = getMethodDescribe("queryByModelId"); + List list = csEventPOService.queryByModelId(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + } diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/DataController.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/DataController.java index 5fea0de..c1b4b1f 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/DataController.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/DataController.java @@ -6,6 +6,7 @@ import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; import com.njcn.csdevice.pojo.vo.DataGroupEventVO; +import com.njcn.csdevice.pojo.vo.EachModuleVO; import com.njcn.csdevice.pojo.vo.RecordVo; import com.njcn.csharmonic.param.DataParam; import com.njcn.csharmonic.pojo.vo.RealTimeDataVo; @@ -62,4 +63,24 @@ public class DataController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/allModelData") + @ApiOperation("设备监控-》模块数据") + @ApiImplicitParam(name = "param", value = "参数", required = true) + public HttpResult> allModelData(@RequestBody DataParam param) { + String methodDescribe = getMethodDescribe("allModelData"); + List list = dataService.allModelData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getModuleState") + @ApiOperation("apf-》获取模块状态") + @ApiImplicitParam(name = "id", value = "id", required = true) + public HttpResult> getModuleState(@RequestParam("id") String id) { + String methodDescribe = getMethodDescribe("getModuleState"); + List list = dataService.getModuleState(id); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + } diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/StatisticsDataDataController.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/StatisticsDataDataController.java index 8040b33..cac1994 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/StatisticsDataDataController.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/StatisticsDataDataController.java @@ -6,7 +6,8 @@ import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; import com.njcn.csharmonic.pojo.param.StatisticsDataParam; -import com.njcn.csharmonic.pojo.vo.LineIntegrityVo; +import com.njcn.csharmonic.pojo.vo.DataVo; +import com.njcn.csharmonic.pojo.vo.HalfMonthReportVO; import com.njcn.csharmonic.service.IStatisticsDataDataService; import com.njcn.web.controller.BaseController; import io.swagger.annotations.Api; @@ -34,12 +35,32 @@ public class StatisticsDataDataController extends BaseController { private final IStatisticsDataDataService statisticsDataDataService; @OperateInfo(info = LogEnum.BUSINESS_COMMON) - @PostMapping("/devData") - @ApiOperation("装置数据统计(监测点完整性、装置在线率)") + @PostMapping("/lineIntegrity") + @ApiOperation("监测点数据完整性") @ApiImplicitParam(name = "param", value = "参数", required = true) - public HttpResult> getDevData(@RequestBody StatisticsDataParam param) { - String methodDescribe = getMethodDescribe("getDevData"); - List list = statisticsDataDataService.getDevData(param); + public HttpResult> getLineIntegrity(@RequestBody StatisticsDataParam param) { + String methodDescribe = getMethodDescribe("getLineIntegrity"); + List list = statisticsDataDataService.getLineIntegrity(param); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/devOnlineRate") + @ApiOperation("装置在线率") + @ApiImplicitParam(name = "param", value = "参数", required = true) + public HttpResult> getDevOnlineRate(@RequestBody StatisticsDataParam param) { + String methodDescribe = getMethodDescribe("getDevOnlineRate"); + List list = statisticsDataDataService.getDevOnlineRate(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/halfMonthReport") + @ApiOperation("半月报功能") + @ApiImplicitParam(name = "param", value = "参数", required = true) + public HttpResult> getHalfMonthReport(@RequestBody StatisticsDataParam param) { + String methodDescribe = getMethodDescribe("getHalfMonthReport"); + List result = statisticsDataDataService.getHalfMonthReport(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } } diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/CsEventPOService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/CsEventPOService.java index 9172b84..5058893 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/CsEventPOService.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/CsEventPOService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.njcn.csdevice.pojo.vo.DataGroupEventVO; import com.njcn.csharmonic.param.CsEventUserQueryPage; import com.njcn.csharmonic.param.CsEventUserQueryParam; +import com.njcn.csharmonic.param.DataParam; import com.njcn.csharmonic.pojo.po.CsEventPO; import com.baomidou.mybatisplus.extension.service.IService; import com.njcn.csharmonic.pojo.vo.CsEventVO; @@ -52,4 +53,7 @@ public interface CsEventPOService extends IService{ void getFileZip(String eventId,HttpServletResponse response); List queryEventList(LocalDateTime startDate, LocalDateTime endDate, String lineId); + + List queryByModelId(DataParam param); + } diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IDataService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IDataService.java index 540ec31..fde5c33 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IDataService.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IDataService.java @@ -1,6 +1,7 @@ package com.njcn.csharmonic.service; import com.njcn.csdevice.pojo.vo.DataGroupEventVO; +import com.njcn.csdevice.pojo.vo.EachModuleVO; import com.njcn.csdevice.pojo.vo.RecordVo; import com.njcn.csharmonic.param.DataParam; import com.njcn.csharmonic.pojo.vo.RealTimeDataVo; @@ -29,4 +30,12 @@ public interface IDataService { */ List getEventByItem(String id); + /** + * 获取治理监测点下所有模块的事件数据 + * @param param + */ + List allModelData(DataParam param); + + List getModuleState(String id); + } diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IStatisticsDataDataService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IStatisticsDataDataService.java index afdf538..434090c 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IStatisticsDataDataService.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/IStatisticsDataDataService.java @@ -1,7 +1,8 @@ package com.njcn.csharmonic.service; import com.njcn.csharmonic.pojo.param.StatisticsDataParam; -import com.njcn.csharmonic.pojo.vo.LineIntegrityVo; +import com.njcn.csharmonic.pojo.vo.DataVo; +import com.njcn.csharmonic.pojo.vo.HalfMonthReportVO; import java.util.List; @@ -11,8 +12,20 @@ import java.util.List; public interface IStatisticsDataDataService { /** - * 数据完整性、终端在线率 + * 数据完整性 * @param param */ - List getDevData(StatisticsDataParam param); + List getLineIntegrity(StatisticsDataParam param); + + /** + * 装置在线率 + * @param param + */ + List getDevOnlineRate(StatisticsDataParam param); + + /** + * 治理设备半月报功能 + * @param param + */ + List getHalfMonthReport(StatisticsDataParam param); } diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java index 3ec1e8c..566bfdd 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.csdevice.api.CsLedgerFeignClient; import com.njcn.csdevice.api.CsLineFeignClient; @@ -17,10 +18,14 @@ import com.njcn.csdevice.enums.AlgorithmResponseEnum; import com.njcn.csdevice.pojo.dto.DevDetailDTO; import com.njcn.csdevice.pojo.po.CsLinePO; import com.njcn.csdevice.pojo.vo.DataGroupEventVO; +import com.njcn.csharmonic.mapper.CsEventPOMapper; import com.njcn.csharmonic.param.CsEventUserQueryPage; -import com.njcn.csharmonic.pojo.vo.CsEventVO; import com.njcn.csharmonic.param.CsEventUserQueryParam; +import com.njcn.csharmonic.param.DataParam; +import com.njcn.csharmonic.pojo.po.CsEventPO; +import com.njcn.csharmonic.pojo.vo.CsEventVO; import com.njcn.csharmonic.pojo.vo.EventDetailVO; +import com.njcn.csharmonic.service.CsEventPOService; import com.njcn.csharmonic.service.CsEventUserPOService; import com.njcn.event.file.component.WaveFileComponent; import com.njcn.event.file.component.WavePicComponent; @@ -37,27 +42,22 @@ import com.njcn.system.api.EleEvtFeignClient; import com.njcn.system.api.EpdFeignClient; import com.njcn.system.pojo.po.EleEpdPqd; import com.njcn.system.pojo.po.EleEvtParm; +import com.njcn.web.utils.RequestUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.njcn.csharmonic.mapper.CsEventPOMapper; -import com.njcn.csharmonic.pojo.po.CsEventPO; -import com.njcn.csharmonic.service.CsEventPOService; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.InputStream; import java.net.URLEncoder; import java.time.LocalDateTime; import java.util.*; - - -import java.io.InputStream; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -221,6 +221,30 @@ public class CsEventPOServiceImpl extends ServiceImpl queryByModelId(DataParam param) { + List pos = new ArrayList<>(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(CsEventPO::getLineId,param.getLineId()) + .eq(CsEventPO::getClDid,param.getClDid()) + .between(CsEventPO::getStartTime,param.getStartTime()+" 00:00:00",param.getEndTime()+" 23:59:59") + .orderByDesc(CsEventPO::getStartTime); + //判断当前用户,管理员查看所有告警;普通用户可以查看二级、三级告警(一级看不了) + String userRole = RequestUtil.getUserRole(); + String trimmedString = userRole.substring(1, userRole.length() - 1).replace("\"", ""); + List list = Arrays.asList(trimmedString.split(",")); + if (!list.contains("tourist")) { + pos = this.baseMapper.selectList(lambdaQueryWrapper); + if (list.contains("app_vip_user")) { + pos = pos.stream() + .filter(entity -> entity.getLevel() != 1) + .collect(Collectors.toList()); + } + } + pos = list.contains("tourist") ? new ArrayList<>() : pos; + return pos; + } + /** * @return WaveDataDTO diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java index 9adb943..066a470 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/DataServiceImpl.java @@ -4,33 +4,46 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.nacos.shaded.com.google.gson.Gson; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.tocrhz.mqtt.publisher.MqttPublisher; +import com.njcn.access.api.CsTopicFeignClient; +import com.njcn.access.enums.AccessEnum; +import com.njcn.access.enums.TypeEnum; +import com.njcn.access.pojo.dto.AskDataDto; +import com.njcn.access.pojo.dto.ReqAndResDto; import com.njcn.csdevice.api.CsLineFeignClient; import com.njcn.csdevice.api.EquipmentFeignClient; import com.njcn.csdevice.api.WlRecordFeignClient; import com.njcn.csdevice.pojo.dto.CsEquipmentDeliveryDTO; import com.njcn.csdevice.pojo.param.WlRecordParam; -import com.njcn.csdevice.pojo.param.WlRecordTemplete; import com.njcn.csdevice.pojo.po.CsDataSet; -import com.njcn.csdevice.pojo.po.CsLedger; +import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; import com.njcn.csdevice.pojo.po.CsLinePO; import com.njcn.csdevice.pojo.po.WlRecord; import com.njcn.csdevice.pojo.vo.DataGroupEventVO; +import com.njcn.csdevice.pojo.vo.EachModuleVO; import com.njcn.csdevice.pojo.vo.RecordVo; -import com.njcn.csdevice.utils.DataChangeUtil; -import com.njcn.csharmonic.api.EventFeignClient; import com.njcn.csharmonic.constant.HarmonicConstant; import com.njcn.csharmonic.mapper.CsDataSetMapper; import com.njcn.csharmonic.param.DataParam; +import com.njcn.csharmonic.pojo.po.CsEventPO; import com.njcn.csharmonic.pojo.vo.RealTimeDataVo; import com.njcn.csharmonic.service.CsEventPOService; import com.njcn.csharmonic.service.IDataService; import com.njcn.csharmonic.util.InfluxDbParamUtil; +import com.njcn.influx.pojo.bo.CommonQueryParam; import com.njcn.influx.pojo.dto.EventDataSetDTO; import com.njcn.influx.pojo.dto.StatisticalDataDTO; import com.njcn.influx.service.CommonService; import com.njcn.influx.service.EvtDataService; -import com.njcn.system.api.*; +import com.njcn.redis.pojo.enums.AppRedisKey; +import com.njcn.redis.utils.RedisUtil; +import com.njcn.system.api.CsStatisticalSetFeignClient; +import com.njcn.system.api.DictTreeFeignClient; +import com.njcn.system.api.EleEvtFeignClient; +import com.njcn.system.api.EpdFeignClient; import com.njcn.system.pojo.po.EleEpdPqd; import com.njcn.system.pojo.po.EleEvtParm; import com.njcn.system.pojo.vo.DictTreeVO; @@ -40,6 +53,9 @@ import org.springframework.stereotype.Service; import java.text.DecimalFormat; import java.time.Duration; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -67,6 +83,11 @@ public class DataServiceImpl implements IDataService { private final EvtDataService evtDataService; private final EleEvtFeignClient eleEvtFeignClient; private final EquipmentFeignClient equipmentFeignClient; + private final RedisUtil redisUtil; + private static Integer mid = 1; + private final CsTopicFeignClient csTopicFeignClient; + private final MqttPublisher publisher; + private static final List ONLINE_STATES = Arrays.asList("运行", "停止", "故障"); @Override public List getRealTimeData(DataParam param) { @@ -202,6 +223,175 @@ public class DataServiceImpl implements IDataService { return result; } + @Override + public List allModelData(DataParam param) { + List result = new ArrayList<>(); + //根据监测点查询装置信息 + CsEquipmentDeliveryPO po = equipmentFeignClient.getDevByLineId(param.getLineId()).getData(); + if (ObjectUtil.isNotNull(po.getModuleNumber())) { + + CommonQueryParam commonQueryParam = new CommonQueryParam(); + commonQueryParam.setColumnName("Apf_ModWorkingSts"); + commonQueryParam.setResultName("value"); + commonQueryParam.setTableName("apf_data"); + commonQueryParam.setStartTime(param.getEndTime()+" 00:00:00"); + commonQueryParam.setEndTime(param.getEndTime()+" 23:59:59"); + commonQueryParam.setLineId(param.getLineId()); + commonQueryParam.setDataType("Apf_ModType"); + commonQueryParam.setProcess(Integer.toString(po.getProcess())); + for (int i = 1; i <= po.getModuleNumber(); i++) { + EachModuleVO moduleVO = new EachModuleVO(); + moduleVO.setModuleName("模块"+i); + + List list1 = new ArrayList<>(); + commonQueryParam.setClDid(Integer.toString(i)); + + //获取模块数据 + List dto = commonService.getEachModule(commonQueryParam); + if (CollectionUtil.isNotEmpty(dto)) { + dto.forEach(item->{ + EachModuleVO.harmonicVo vo = new EachModuleVO.harmonicVo(); + vo.setTime(LocalDateTime.ofInstant(item.getTime().minus(8, ChronoUnit.HOURS), ZoneId.systemDefault())); + vo.setStateDesc(channelState(item.getValue())); + vo.setDataType(0); + list1.add(vo); + }); + } else { + moduleVO.setModuleState("离线"); + } + + //获取模块事件 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(CsEventPO::getLineId, param.getLineId()) + .between(CsEventPO::getStartTime,param.getStartTime()+" 00:00:00",param.getEndTime()+" 23:59:59") + .eq(CsEventPO::getClDid,i) + .eq(CsEventPO::getProcess,Integer.toString(po.getProcess())) + .orderByAsc(CsEventPO::getStartTime); + List eventList = csEventPOService.list(lambdaQueryWrapper); + if (CollectionUtil.isNotEmpty(eventList)) { + eventList.forEach(item->{ + EleEpdPqd epdPqd = epdFeignClient.findByName(item.getTag()).getData(); + EachModuleVO.harmonicVo vo = new EachModuleVO.harmonicVo(); + vo.setTime(item.getStartTime()); + vo.setStateDesc(channelState2(item.getTag())); + vo.setEventCode(item.getTag()); + vo.setDataType(1); + if (ObjectUtil.isNotNull(epdPqd)) { + vo.setEventName(epdPqd.getShowName()); + } else { + vo.setEventName(item.getTag()); + } + list1.add(vo); + }); + } + if (CollectionUtil.isNotEmpty(list1)) { + List dataList = list1.stream() + .sorted(Comparator.comparing(EachModuleVO.harmonicVo::getTime)) + .collect(Collectors.toList()); + moduleVO.setDataList(dataList); + EachModuleVO.harmonicVo last = dataList.get(dataList.size() - 1); + if (Objects.equals(last.getDataType(),0)) { + moduleVO.setModuleState(last.getStateDesc()); + } else if (Objects.equals(last.getDataType(),1)) { + moduleVO.setModuleState(Objects.equals(last.getStateDesc(),"Alm_Apf_ModDisConnect") ? "离线" : "运行"); + } + } + result.add(moduleVO); + } + } + return result; + } + + @Override + public List getModuleState(String nDid) { + List result = new ArrayList<>(); + try { + CsEquipmentDeliveryPO po = equipmentFeignClient.findDevByNDid(nDid).getData(); + for (int i = 1; i <= po.getModuleNumber(); i++) { + EachModuleVO moduleVO = new EachModuleVO(); + moduleVO.setModuleName("模块"+i); + Object object = redisUtil.getObjectByKey(AppRedisKey.DEVICE_MID + nDid); + if (!Objects.isNull(object)) { + mid = (Integer) object; + } + ReqAndResDto.Req dto = askApfModuleData(mid,i,i); + String version = csTopicFeignClient.find(nDid).getData(); + publisher.send("/Pfm/DevCmd/" + version + "/" + nDid, new Gson().toJson(dto), 1, false); + Thread.sleep(800); + Object redisUtilObjectByKey = redisUtil.getObjectByKey("ApfRtData:" + mid); + if (ObjectUtil.isNotNull(redisUtilObjectByKey)) { + Double value = Double.parseDouble(redisUtilObjectByKey.toString()); + moduleVO.setModuleState(channelState(value)); + } else { + moduleVO.setModuleState("离线"); + } + mid = mid + 1; + if (mid > 10000) { + mid = 1; + } + redisUtil.saveByKey(AppRedisKey.DEVICE_MID + nDid,mid); + result.add(moduleVO); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return result; + } + + + public ReqAndResDto.Req askApfModuleData(Integer mid, Integer clDId, Integer idx) { + ReqAndResDto.Req reqAndResParam = new ReqAndResDto.Req(); + reqAndResParam.setMid(mid); + reqAndResParam.setPri(AccessEnum.FIRST_CHANNEL.getCode()); + reqAndResParam.setType(Integer.parseInt(TypeEnum.TYPE_6.getCode())); + reqAndResParam.setExpire(-1); + //fixme 目前设备都是直连设备,因此did就是其本身,默认为1,后期涉及网关,此did是需要动态变化的 + reqAndResParam.setDid(1); + AskDataDto askDataDto = new AskDataDto(); + askDataDto.setCldid(clDId); + askDataDto.setDataAttr(1); + askDataDto.setDataType(15); + askDataDto.setOperate(1); + askDataDto.setStartTime(-1); + askDataDto.setEndTime(-1); + askDataDto.setDsNameIdx(idx); + reqAndResParam.setMsg(askDataDto); + return reqAndResParam; + } + + public String channelState(Double value) { + String str; + int val = (int) Math.round(value); + switch (val) { + case 0: + str = "离线"; + break; + case 1: + str = "运行"; + break; + case 2: + str = "运行(停止)"; + break; + case 3: + str = "运行(故障)"; + break; + default: + str = "无状态"; + break; + } + return str; + } + + public String channelState2(String code) { + String str; + if ("Alm_Apf_ModDisConnect".equals(code)) { + str = "离线"; + } else { + str = "运行"; + } + return str; + } + //基础数据 public RealTimeDataVo getBaseData(EleEpdPqd item2, String lineId, String dataLevel, String csDataSetLevel,Double pt, Double ct) { RealTimeDataVo vo = new RealTimeDataVo(); diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java index 88458d2..3526e80 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java @@ -3,20 +3,26 @@ package com.njcn.csharmonic.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.njcn.csdevice.api.CsLineFeignClient; import com.njcn.csdevice.api.EquipmentFeignClient; +import com.njcn.csdevice.api.IntegrityFeignClient; +import com.njcn.csdevice.api.OnlineRateFeignClient; import com.njcn.csdevice.pojo.po.CsEquipmentDeliveryPO; import com.njcn.csdevice.pojo.po.CsLinePO; +import com.njcn.csdevice.pojo.po.RStatIntegrityD; +import com.njcn.csdevice.pojo.po.RStatOnlineRateD; import com.njcn.csharmonic.pojo.param.StatisticsDataParam; -import com.njcn.csharmonic.pojo.vo.LineIntegrityVo; +import com.njcn.csharmonic.pojo.vo.DataVo; +import com.njcn.csharmonic.pojo.vo.HalfMonthReportVO; import com.njcn.csharmonic.service.IStatisticsDataDataService; +import com.njcn.influx.pojo.bo.CommonQueryParam; import com.njcn.influx.pojo.dto.StatisticalDataDTO; import com.njcn.influx.service.CommonService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -30,10 +36,12 @@ public class StatisticsDataDataServiceImpl implements IStatisticsDataDataService private final EquipmentFeignClient equipmentFeignClient; private final CsLineFeignClient csLineFeignClient; private final CommonService commonService; + private final IntegrityFeignClient integrityFeignClient; + private final OnlineRateFeignClient onlineRateFeignClient; @Override - public List getDevData(StatisticsDataParam param) { - List result = new ArrayList<>(); + public List getLineIntegrity(StatisticsDataParam param) { + List result = new ArrayList<>(); //获取库中正常的所有装置 List devList = equipmentFeignClient.getAll().getData(); if (CollectionUtil.isNotEmpty(devList)) { @@ -45,9 +53,9 @@ public class StatisticsDataDataServiceImpl implements IStatisticsDataDataService csLinePOList.forEach(item->{ //应收数据 int dueCount = 1440 / item.getLineInterval(); - LineIntegrityVo vo = new LineIntegrityVo(); + DataVo vo = new DataVo(); StatisticalDataDTO statisticalDataDTO; - Integer process = devMap.get(item.getDevId()).getProcess(); + Integer process = devMap.get(item.getDeviceId()).getProcess(); //治理监测点 if (item.getClDid() == 0) { statisticalDataDTO = commonService.getCounts(item.getLineId(),"apf_data","Apf_Freq","frequency","M","avg",item.getClDid().toString(),process.toString(),param.getStartTime(),param.getEndTime()); @@ -56,19 +64,89 @@ public class StatisticsDataDataServiceImpl implements IStatisticsDataDataService else { statisticalDataDTO = commonService.getCounts(item.getLineId(),"pqd_data","Pq_Freq","frequency","M","avg",item.getClDid().toString(),process.toString(),param.getStartTime(),param.getEndTime()); } - vo.setDevId(item.getDevId()); - vo.setDevName(devMap.get(item.getDevId()).getName()); + vo.setDevId(item.getDeviceId()); + vo.setDevName(devMap.get(item.getDeviceId()).getName()); vo.setLineId(item.getLineId()); vo.setLineName(item.getName()); - if (Objects.isNull(statisticalDataDTO.getFrequency())) { - vo.setLineIntegrity(null); - } else { - vo.setLineIntegrity(Integer.parseInt(statisticalDataDTO.getFrequency()) / dueCount * 100.0); - } + vo.setLineIntegrity( + statisticalDataDTO == null || statisticalDataDTO.getFrequency() == null + ? 0 : Integer.parseInt(statisticalDataDTO.getFrequency()) / dueCount * 100.0 + ); result.add(vo); }); } } return result; } + + @Override + public List getDevOnlineRate(StatisticsDataParam param) { + return Collections.emptyList(); + } + + @Override + public List getHalfMonthReport(StatisticsDataParam param) { + List result = new ArrayList<>(); + //获取装置 + List equipmentDeliveryList = equipmentFeignClient.getAll().getData(); + if (CollectionUtil.isNotEmpty(equipmentDeliveryList)) { + //获取监测点集合 + List devList = equipmentDeliveryList.stream().map(CsEquipmentDeliveryPO::getId).collect(Collectors.toList()); + List csLineList = csLineFeignClient.getLinesByDevList(devList).getData(); + if (CollectionUtil.isNotEmpty(csLineList)) { + Map> devMap = csLineList.stream().collect(Collectors.groupingBy(CsLinePO::getDeviceId)); + List lineList = csLineList.stream().map(CsLinePO::getLineId).collect(Collectors.toList()); + List deviceList = csLineList.stream().map(CsLinePO::getDeviceId).collect(Collectors.toList()); + //获取监测点数据完整性 + List list1 = integrityFeignClient.list(lineList,param.getStartTime(),param.getEndTime()).getData(); + //获取终端在线率 + List list2 = onlineRateFeignClient.list(deviceList,param.getStartTime(),param.getEndTime()).getData(); + equipmentDeliveryList.forEach(dev->{ + List list = devMap.get(dev.getId()); + if (CollectionUtil.isNotEmpty(list)) { + list.forEach(line->{ + HalfMonthReportVO vo = new HalfMonthReportVO(); + vo.setEngineeringName("工程名称"); + vo.setProjectName("项目名称"); + vo.setDevName(dev.getName()); + vo.setDevType(dev.getDevType()); + vo.setMac(dev.getMac()); + vo.setOperationalStatus(dev.getUsageStatus() == 0 ? "停运" : "在运"); + //fixme 先用设备登记时间记作投运时间 + vo.setOperationalTime(dev.getCreateTime()); + vo.setLineName(line.getName()); + vo.setCommunicationStatus(dev.getRunStatus() == 1 ? "离线" : "在线"); + vo.setLatestTime(LocalDateTime.now()); + + List l1 = list1.stream().filter(item -> item.getLineIndex().equals(line.getLineId())).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(l1)) { + double ratio = BigDecimal.valueOf( + l1.stream().mapToDouble(RStatIntegrityD::getRealTime).sum() * 100.0 + ).divide( + BigDecimal.valueOf(l1.stream().mapToDouble(RStatIntegrityD::getDueTime).sum()), + 2, RoundingMode.HALF_UP + ).doubleValue(); + vo.setIntegrity(ratio); + } else { + vo.setIntegrity(0.0); + } + + List l2 = list2.stream().filter(item -> item.getDevIndex().equals(dev.getId())).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(l2)) { + int onlineMin = l2.stream().mapToInt(RStatOnlineRateD::getOnlineMin).sum(); + double ratio = new BigDecimal(onlineMin * 100.0 / (1440 * l2.size())).setScale(2,RoundingMode.HALF_UP).doubleValue(); + vo.setOnlineRate(ratio); + } else { + vo.setOnlineRate(0.0); + } + result.add(vo); + }); + } + }); + //获取最新数据时间 + } + } + return result; + } + }