diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommTerminalFeignClient.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommTerminalFeignClient.java index 7fd0e9a..b37e938 100644 --- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommTerminalFeignClient.java +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/CsCommTerminalFeignClient.java @@ -22,4 +22,10 @@ public interface CsCommTerminalFeignClient { @GetMapping("lineUnitDetail") HttpResult lineUnitDetail(@RequestParam("lineId") String lineId); + + @PostMapping("getDevIdsByUser") + HttpResult> getDevIdsByUser(@RequestBody String userId); + + @PostMapping("getLineIdsByUser") + HttpResult> getLineIdsByUser(@RequestBody String userId); } diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommTerminalFeignClientFallbackFactory.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommTerminalFeignClientFallbackFactory.java index 5cc865a..1ffd78b 100644 --- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommTerminalFeignClientFallbackFactory.java +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/api/fallback/CsCommTerminalFeignClientFallbackFactory.java @@ -9,6 +9,8 @@ import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.List; + /** * @author xy */ @@ -31,6 +33,18 @@ public class CsCommTerminalFeignClientFallbackFactory implements FallbackFactory log.error("{}异常,降级处理,异常为:{}","查询分组",cause.toString()); throw new BusinessException(finalExceptionEnum); } + + @Override + public HttpResult> getDevIdsByUser(String userId) { + log.error("{}异常,降级处理,异常为:{}","查询分组",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + + @Override + public HttpResult> getLineIdsByUser(String userId) { + log.error("{}异常,降级处理,异常为:{}","查询分组",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } }; } } diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/ledger/CsCommTerminalController.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/ledger/CsCommTerminalController.java index 41c4822..3d483d5 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/ledger/CsCommTerminalController.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/ledger/CsCommTerminalController.java @@ -1,12 +1,18 @@ package com.njcn.csdevice.controller.ledger; +import cn.hutool.core.collection.CollUtil; import com.njcn.common.pojo.annotation.OperateInfo; +import com.njcn.common.pojo.enums.common.DataStateEnum; 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.mapper.PqsDeviceUnitMapper; +import com.njcn.csdevice.pojo.po.CsDeviceUserPO; +import com.njcn.csdevice.pojo.po.CsLinePO; +import com.njcn.csdevice.service.CsDeviceUserPOService; +import com.njcn.csdevice.service.CsLinePOService; import com.njcn.device.biz.pojo.po.PqsDeviceUnit; import com.njcn.web.controller.BaseController; import io.swagger.annotations.Api; @@ -17,7 +23,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** @@ -34,7 +44,57 @@ public class CsCommTerminalController extends BaseController { private final PqsDeviceUnitMapper pqsDeviceUnitMapper; + private final CsDeviceUserPOService csDeviceUserPOService; + private final CsLinePOService csLinePOService; + + /** + * 根据用户获取设备信息 + */ + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getDevIdsByUser") + @ApiOperation("根据监测点id获取数据单位") + @ApiImplicitParam(name = "lineId", value = "实体", required = true) + public HttpResult> getDevIdsByUser(@RequestBody String userId) { + String methodDescribe = getMethodDescribe("getDevIdsByUser"); + List result; + List poList = csDeviceUserPOService.lambdaQuery().select(CsDeviceUserPO::getDeviceId) + .and(w->w.eq(CsDeviceUserPO::getPrimaryUserId,userId).or().eq(CsDeviceUserPO::getSubUserId,userId)) + .eq(CsDeviceUserPO::getStatus, DataStateEnum.ENABLE.getCode()).list(); + if(CollUtil.isNotEmpty(poList)){ + result = poList.stream().map(CsDeviceUserPO::getDeviceId).distinct().collect(Collectors.toList()); + }else { + result = Collections.emptyList(); + } + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + + /** + * 根据用户获取设备信息 + */ + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getLineIdsByUser") + @ApiOperation("根据监测点id获取数据单位") + @ApiImplicitParam(name = "lineId", value = "实体", required = true) + public HttpResult> getLineIdsByUser(@RequestBody String userId) { + String methodDescribe = getMethodDescribe("getLineIdsByUser"); + List devList = csDeviceUserPOService.lambdaQuery().select(CsDeviceUserPO::getDeviceId) + .and(w->w.eq(CsDeviceUserPO::getPrimaryUserId,userId).or().eq(CsDeviceUserPO::getSubUserId,userId)) + .eq(CsDeviceUserPO::getStatus, DataStateEnum.ENABLE.getCode()).list(); + if(CollUtil.isNotEmpty(devList)){ + List devIds = devList.stream().map(CsDeviceUserPO::getDeviceId).distinct().collect(Collectors.toList()); + List poList = csLinePOService.lambdaQuery().select(CsLinePO::getLineId).in(CsLinePO::getDeviceId,devIds) + .eq(CsLinePO::getStatus,DataStateEnum.ENABLE.getCode()).list(); + if(CollUtil.isEmpty(poList)){ + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, Collections.emptyList(), methodDescribe); + }else { + List result = poList.stream().map(CsLinePO::getLineId).distinct().collect(Collectors.toList()); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + }else { + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, Collections.emptyList(), methodDescribe); + } + } /** * 通过监测点获取监测点数据单位 diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/enums/CsEventEnum.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/enums/CsEventEnum.java new file mode 100644 index 0000000..9d8e2ff --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/enums/CsEventEnum.java @@ -0,0 +1,26 @@ +package com.njcn.csharmonic.enums; + +import lombok.Getter; + +@Getter +public enum CsEventEnum { + + EVENT_TYPE(0,"暂态事件"), + HARMONIC_TYPE(1,"稳态事件"), + DEVICE_TYPE(2,"设备事件"), + ALARM_TYPE(3,"告警事件") + + + + ; + + private final Integer code; + + private final String name; + + CsEventEnum(Integer code, String name) { + this.code = code; + this.name = name; + } + +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/enums/CsTransientEnum.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/enums/CsTransientEnum.java new file mode 100644 index 0000000..193157c --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/enums/CsTransientEnum.java @@ -0,0 +1,30 @@ +package com.njcn.csharmonic.enums; + +import lombok.Getter; + +@Getter +public enum CsTransientEnum { + + + + + + + EVT_SYS_DIPSTR("Evt_Sys_DipStr","电压暂降"), + EVT_SYS_INTRSTRr("Evt_Sys_IntrStr","电压中断"), + EVT_SYS_SWLSTR("Evt_Sys_SwlStr","电压暂升"), + TRANSIENT("Transient","录波"), + UN_KNOW("Un_Know","未知") + + + ; + + private final String code; + + private final String name; + + CsTransientEnum(String code, String name) { + this.code = code; + this.name = name; + } +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/EventStatisticParam.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/EventStatisticParam.java new file mode 100644 index 0000000..8572a3c --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/param/EventStatisticParam.java @@ -0,0 +1,29 @@ +package com.njcn.csharmonic.pojo.param; + +import com.njcn.web.pojo.param.BaseParam; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: cdf + * @CreateTime: 2025-11-21 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EventStatisticParam extends BaseParam { + + /** + * 监测点id + */ + @ApiModelProperty("监测点id") + private String lineId; + + /** + * 安装位置 + */ + @ApiModelProperty("字典表:安装位置(负载侧,电网侧, 输出侧)") + private String position; + +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/EventCoordsVO.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/EventCoordsVO.java new file mode 100644 index 0000000..6001651 --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/EventCoordsVO.java @@ -0,0 +1,26 @@ +package com.njcn.csharmonic.pojo.vo.event; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: cdf + * @CreateTime: 2025-11-24 + * @Description: + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EventCoordsVO { + + @ApiModelProperty(name = "x",value = "x轴") + private Integer x; + + @ApiModelProperty(name = "y",value = "y轴") + private Integer y; + + @ApiModelProperty(name = "z",value = "z轴") + private Integer z; +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/EventStatisticVO.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/EventStatisticVO.java new file mode 100644 index 0000000..77691d3 --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/EventStatisticVO.java @@ -0,0 +1,36 @@ +package com.njcn.csharmonic.pojo.vo.event; + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; +import org.apache.ibatis.javassist.runtime.Inner; + +import java.util.List; + +/** + * @Author: cdf + * @CreateTime: 2025-11-20 + * @Description: + */ +@Data +public class EventStatisticVO { + + private String id; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "暂降") + private Integer eventDown = 0; + + @ApiModelProperty(value = "中断") + private Integer eventOff = 0; + + @ApiModelProperty(value = "暂升") + private Integer eventUp = 0; + + @ApiModelProperty(value = "总数") + private Integer allNum = 0; + + +} diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/F47Curve.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/F47Curve.java new file mode 100644 index 0000000..ec573eb --- /dev/null +++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/event/F47Curve.java @@ -0,0 +1,24 @@ +package com.njcn.csharmonic.pojo.vo.event; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author: cdf + * @CreateTime: 2025-11-21 + * @Description: + */ +@Data +public class F47Curve { + + private String id; + + private String tag; + + private BigDecimal persistTime; + + private BigDecimal amplitude; + + +} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/EventOverviewController.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/EventOverviewController.java new file mode 100644 index 0000000..30f343c --- /dev/null +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/EventOverviewController.java @@ -0,0 +1,94 @@ +package com.njcn.csharmonic.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.csharmonic.pojo.param.EventStatisticParam; +import com.njcn.csharmonic.pojo.vo.event.EventCoordsVO; +import com.njcn.csharmonic.pojo.vo.event.EventStatisticVO; +import com.njcn.csharmonic.pojo.vo.event.F47Curve; +import com.njcn.csharmonic.service.event.EventOverviewService; +import com.njcn.web.controller.BaseController; +import com.njcn.web.pojo.param.BaseParam; +import com.njcn.web.utils.RequestUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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: cdf + * @CreateTime: 2025-11-20 + * @Description: 暂降概览 + */ +@Slf4j +@RestController +@RequestMapping("/csevent") +@Api(tags = "暂降概览") +@RequiredArgsConstructor +public class EventOverviewController extends BaseController { + + private final EventOverviewService eventOverviewService; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @ApiOperation("暂降类型分类统计Echart") + @PostMapping("netEventEcharts") + public HttpResult netEventEcharts(@RequestBody EventStatisticParam baseParam){ + String methodDescribe = getMethodDescribe("netEventEcharts"); + EventStatisticVO eventStatisticVO = eventOverviewService.netEventEcharts(baseParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, eventStatisticVO, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @ApiOperation("暂降类型分类统计表格") + @PostMapping("netEventTable") + public HttpResult> netEventTable(@RequestBody EventStatisticParam baseParam){ + String methodDescribe = getMethodDescribe("netEventTable"); + List list = eventOverviewService.netEventTable(baseParam); + + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @ApiOperation("F47曲线") + @PostMapping("f47Curve") + public HttpResult> getF47Curve(@RequestBody EventStatisticParam baseParam){ + String methodDescribe = getMethodDescribe("getF47Curve"); + List list = eventOverviewService.getF47Curve(baseParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @ApiOperation("日历暂降事件详情") + @PostMapping("getEventDate") + public HttpResult> getEventDate(@RequestBody EventStatisticParam baseParam){ + String methodDescribe = getMethodDescribe("getEventDate"); + List list = eventOverviewService.getEventDate(baseParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getEventCoords") + @ApiOperation("获取电压暂态表及密度坐标图") + public HttpResult> getEventCoords(@RequestBody EventStatisticParam baseParam){ + String methodDescribe = getMethodDescribe("getEventCoords"); + List list = eventOverviewService.getEventCoords(baseParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS,list,methodDescribe); + } + + +} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/event/EventOverviewService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/event/EventOverviewService.java new file mode 100644 index 0000000..b0176ab --- /dev/null +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/event/EventOverviewService.java @@ -0,0 +1,31 @@ +package com.njcn.csharmonic.service.event; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.csharmonic.pojo.param.EventStatisticParam; +import com.njcn.csharmonic.pojo.vo.event.EventCoordsVO; +import com.njcn.csharmonic.pojo.vo.event.EventStatisticVO; +import com.njcn.csharmonic.pojo.vo.event.F47Curve; +import com.njcn.web.pojo.param.BaseParam; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * @Author: cdf + * @CreateTime: 2025-11-20 + * @Description: 暂降相关 + */ +public interface EventOverviewService { + + EventStatisticVO netEventEcharts(EventStatisticParam baseParam); + + + List netEventTable(EventStatisticParam baseParam); + + List getF47Curve(EventStatisticParam baseParam); + + List getEventDate(EventStatisticParam baseParam); + + List getEventCoords(EventStatisticParam baseParam); +} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/event/EventOverviewServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/event/EventOverviewServiceImpl.java new file mode 100644 index 0000000..4392fa6 --- /dev/null +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/event/EventOverviewServiceImpl.java @@ -0,0 +1,293 @@ +package com.njcn.csharmonic.service.impl.event; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.*; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.ImmutableMap; +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.csdevice.api.CsLineFeignClient; +import com.njcn.csdevice.pojo.po.CsLinePO; +import com.njcn.csharmonic.enums.CsEventEnum; +import com.njcn.csharmonic.enums.CsTransientEnum; +import com.njcn.csharmonic.pojo.param.EventStatisticParam; +import com.njcn.csharmonic.pojo.po.CsEventPO; +import com.njcn.csharmonic.pojo.vo.event.EventCoordsVO; +import com.njcn.csharmonic.pojo.vo.event.EventStatisticVO; +import com.njcn.csharmonic.pojo.vo.event.F47Curve; +import com.njcn.csharmonic.service.CsEventPOService; +import com.njcn.csharmonic.service.event.EventOverviewService; +import com.njcn.parser.component.WaveFileComponent; +import com.njcn.parser.pojo.dto.WaveDataDTO; +import com.njcn.parser.utils.WaveUtil; +import com.njcn.web.pojo.param.BaseParam; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang.StringUtils; +import org.checkerframework.checker.units.qual.A; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @Author: cdf + * @CreateTime: 2025-11-20 + * @Description: + */ +@Service +@RequiredArgsConstructor +public class EventOverviewServiceImpl implements EventOverviewService { + private static final List EVENT_TAGS = Arrays.asList( + CsTransientEnum.EVT_SYS_DIPSTR.getCode(), + CsTransientEnum.EVT_SYS_INTRSTRr.getCode(), + CsTransientEnum.EVT_SYS_SWLSTR.getCode() + ); + + private final CsEventPOService csEventPOService; + private final CsLineFeignClient csLineFeignClient; + + @Override + public EventStatisticVO netEventEcharts(EventStatisticParam baseParam) { + DateTime start = DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())); + DateTime end = DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())); + + List csEventPOList = csEventPOService.lambdaQuery() + .between(CsEventPO::getStartTime, start, end) + .eq(CsEventPO::getType, CsEventEnum.EVENT_TYPE.getCode()) + .in(CsEventPO::getTag, EVENT_TAGS) + //TODO + .list(); + + EventStatisticVO result = new EventStatisticVO(); + if (CollUtil.isEmpty(csEventPOList)) { + return result; + } + Map eventCountByTag = csEventPOList.stream().collect(Collectors.groupingBy(CsEventPO::getTag, Collectors.counting())); + result.setEventDown(eventCountByTag.getOrDefault(CsTransientEnum.EVT_SYS_DIPSTR.getCode(), 0L).intValue()); + result.setEventOff(eventCountByTag.getOrDefault(CsTransientEnum.EVT_SYS_INTRSTRr.getCode(), 0L).intValue()); + result.setEventUp(eventCountByTag.getOrDefault(CsTransientEnum.EVT_SYS_SWLSTR.getCode(), 0L).intValue()); + result.setAllNum(csEventPOList.size()); + return result; + } + + @Override + public List netEventTable(EventStatisticParam baseParam) { + DateTime start = DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())); + DateTime end = DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())); + + List lineIds = StrUtil.isBlank(baseParam.getSearchValue()) + ? csLineFeignClient.getAllLine().getData() + : Collections.singletonList(baseParam.getSearchValue()); + + List csLinePOList = csLineFeignClient.queryLineById(lineIds).getData(); + if (CollUtil.isEmpty(csLinePOList)) { + return Collections.emptyList(); + } + + List validLineIds = csLinePOList.stream() + .map(CsLinePO::getLineId) + .distinct() + .collect(Collectors.toList()); + + List csEventPOList = csEventPOService.lambdaQuery() + .between(CsEventPO::getStartTime, start, end) + .eq(CsEventPO::getType, CsEventEnum.EVENT_TYPE.getCode()) + .in(CsEventPO::getTag, EVENT_TAGS) + .in(CsEventPO::getLineId, validLineIds) + .list(); + + if (CollUtil.isEmpty(csEventPOList)) { + return csLinePOList.stream() + .map(line -> { + EventStatisticVO vo = new EventStatisticVO(); + vo.setName(line.getName()); + return vo; + }) + .collect(Collectors.toList()); + } + + // 按线路ID和事件类型分组统计 + Map> eventCountByLineAndTag = csEventPOList.stream() + .collect(Collectors.groupingBy( + CsEventPO::getLineId, + Collectors.groupingBy( + CsEventPO::getTag, + Collectors.counting() + ) + )); + + return csLinePOList.stream() + .map(line -> { + EventStatisticVO vo = new EventStatisticVO(); + vo.setName(line.getName()); + + Map lineEvents = eventCountByLineAndTag.getOrDefault(line.getLineId(), Collections.emptyMap()); + vo.setEventDown(lineEvents.getOrDefault(CsTransientEnum.EVT_SYS_DIPSTR.getCode(), 0L).intValue()); + vo.setEventOff(lineEvents.getOrDefault(CsTransientEnum.EVT_SYS_INTRSTRr.getCode(), 0L).intValue()); + vo.setEventUp(lineEvents.getOrDefault(CsTransientEnum.EVT_SYS_SWLSTR.getCode(), 0L).intValue()); + + return vo; + }).sorted(Comparator.comparing(EventStatisticVO::getEventDown, Comparator.reverseOrder()) + .thenComparing(EventStatisticVO::getEventOff, Comparator.reverseOrder()).thenComparing(EventStatisticVO::getEventUp, Comparator.reverseOrder())) + .collect(Collectors.toList()); + } + + @Override + public List getF47Curve(EventStatisticParam baseParam) { + DateTime start = DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())); + DateTime end = DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())); + + List csEventPOList = csEventPOService.lambdaQuery().select(CsEventPO::getId,CsEventPO::getTag,CsEventPO::getPersistTime,CsEventPO::getAmplitude) + .between(CsEventPO::getStartTime, start, end) + .eq(CsEventPO::getType, CsEventEnum.EVENT_TYPE.getCode()) + .in(CsEventPO::getTag, EVENT_TAGS) + //TODO + .list(); + + List f47CurveList = csEventPOList.stream().map(item->{ + F47Curve f47Curve = new F47Curve(); + f47Curve.setId(item.getId()); + f47Curve.setTag(item.getTag()); + f47Curve.setPersistTime(BigDecimal.valueOf(item.getPersistTime())); + f47Curve.setAmplitude(BigDecimal.valueOf(item.getAmplitude())); + return f47Curve; + }).collect(Collectors.toList()); + return f47CurveList; + } + + @Override + public List getEventDate(EventStatisticParam baseParam) { + if(StrUtil.isBlank(baseParam.getSearchBeginTime())){ + throw new BusinessException(CommonResponseEnum.FAIL,"月份不可为空"); + } + DateTime dateTime = DateUtil.parse(baseParam.getSearchBeginTime(), DatePattern.NORM_MONTH_PATTERN); + DateTime start = DateUtil.beginOfMonth(dateTime); + DateTime end = DateUtil.endOfMonth(dateTime); + List rangList = DateUtil.rangeToList(start,end, DateField.DAY_OF_MONTH); + + + List csEventPOList = csEventPOService.lambdaQuery().select(CsEventPO::getId,CsEventPO::getTag,CsEventPO::getStartTime,CsEventPO::getPersistTime,CsEventPO::getAmplitude) + .between(CsEventPO::getStartTime, start, end) + .eq(CsEventPO::getType, CsEventEnum.EVENT_TYPE.getCode()) + .in(CsEventPO::getTag, EVENT_TAGS) + //TODO + .list(); + + if(CollUtil.isEmpty(csEventPOList)){ + return rangList.stream().map(item->{ + EventStatisticVO eventStatisticVO = new EventStatisticVO(); + eventStatisticVO.setName(DateUtil.format(item,DatePattern.NORM_DATE_PATTERN)); + return eventStatisticVO; + }).collect(Collectors.toList()); + } + + Map> map = csEventPOList.stream().collect(Collectors.groupingBy(item-> DateUtil.format(item.getStartTime(),DatePattern.NORM_DATE_PATTERN),Collectors.groupingBy( + CsEventPO::getTag, + Collectors.counting() + ))); + + return rangList.stream().map(item->{ + EventStatisticVO eventStatisticVO = new EventStatisticVO(); + String day = DateUtil.format(item,DatePattern.NORM_DATE_PATTERN); + eventStatisticVO.setName(day); + + Map itemMap = map.getOrDefault(day,Collections.emptyMap()); + eventStatisticVO.setEventDown(itemMap.getOrDefault(CsTransientEnum.EVT_SYS_DIPSTR.getCode(), 0L).intValue()); + eventStatisticVO.setEventOff(itemMap.getOrDefault(CsTransientEnum.EVT_SYS_INTRSTRr.getCode(), 0L).intValue()); + eventStatisticVO.setEventUp(itemMap.getOrDefault(CsTransientEnum.EVT_SYS_SWLSTR.getCode(), 0L).intValue()); + return eventStatisticVO; + }).collect(Collectors.toList()); + } + + @Override + public List getEventCoords(EventStatisticParam baseParam) { + // 初始化结果列表:10行 x 9列(根据原始代码的循环推断) + List result = new ArrayList<>(90); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 9; j++) { + result.add(new EventCoordsVO(i, j, 0)); + } + } + //查询监测点未处理暂态事件 + DateTime start = DateUtil.beginOfDay(DateUtil.parse(baseParam.getSearchBeginTime())); + DateTime end = DateUtil.endOfDay(DateUtil.parse(baseParam.getSearchEndTime())); + List events = csEventPOService.lambdaQuery().select(CsEventPO::getId,CsEventPO::getTag,CsEventPO::getStartTime,CsEventPO::getPersistTime,CsEventPO::getAmplitude) + .between(CsEventPO::getStartTime, start, end) + .eq(CsEventPO::getType, CsEventEnum.EVENT_TYPE.getCode()) + .in(CsEventPO::getTag, EVENT_TAGS) + //TODO + .list(); + + // 定义振幅和持续时间的分类规则 + // 振幅分类规则 + Map amplitudeRanges = ImmutableMap.builder() + .put(0.0, 0) + .put(0.1, 1) + .put(0.2, 2) + .put(0.3, 3) + .put(0.4, 4) + .put(0.5, 5) + .put(0.6, 6) + .put(0.7, 7) + .put(0.8, 8) + .put(0.9, 9) + // 默认分类 + .put(Double.MAX_VALUE, 10) + .build(); + + // 持续时间分类规则 + Map persistTimeRanges = ImmutableMap.builder() + .put(0.0, 0) + .put(0.020, 1) + .put(0.040, 2) + .put(0.060, 3) + .put(0.080, 4) + .put(0.120, 5) + .put(0.200, 6) + .put(0.400, 7) + .put(0.600, 8) + .put(1.200, 9) + .build(); + + // 分类事件 + for (CsEventPO event : events) { + double amplitude = event.getAmplitude(); + double persistTimeSec = event.getPersistTime() / 1000.0; + + // 确定振幅分类 + int amplitudeGroup = getRangeGroup(amplitudeRanges, amplitude); + // 确定持续时间分类(振幅分类作为行,持续时间分类作为列) + int persistTimeGroup = getRangeGroup(persistTimeRanges, persistTimeSec); + + // 计算索引:行 = 振幅分组,列 = 持续时间分组 + int row = amplitudeGroup; + int col = persistTimeGroup; + // 10行 x 9列的网格 + int index = row * 9 + col; + + // 安全更新结果 + if (index >= 0 && index < result.size()) { + EventCoordsVO coordsVO = result.get(index); + coordsVO.setZ(coordsVO.getZ() + 1); + } + } + return result; + } + + /** + * 根据范围映射表获取分组 + */ + private int getRangeGroup(Map ranges, double value) { + for (Map.Entry entry : ranges.entrySet()) { + if (value <= entry.getKey()) { + return entry.getValue(); + } + } + return ranges.size() - 1; // 默认返回最大分组 + } +}