diff --git a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/SubGetBase.java b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/SubGetBase.java index 524ab15a9..3042fc9ab 100644 --- a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/SubGetBase.java +++ b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/SubGetBase.java @@ -40,9 +40,19 @@ public class SubGetBase implements Serializable { */ private String orgName; + /** + * 是否上送国网是否是上送国网监测点,0-否 1-是 + */ + private Integer isUpToGrid; + /** * 所有子级监测点信息 */ private List unitChildrenList; + /** + * 所有子级国网监测点信息 + */ + private List gwUnitChildrenList; + } diff --git a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/TerminalGetBase.java b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/TerminalGetBase.java index 9654d58b0..229312f60 100644 --- a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/TerminalGetBase.java +++ b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/TerminalGetBase.java @@ -29,5 +29,7 @@ public class TerminalGetBase { private String subName; private String voltageLevel; + + private Integer monitorFlag; } } diff --git a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/mapper/majornetwork/mapping/MonitorMapper.xml b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/mapper/majornetwork/mapping/MonitorMapper.xml index fcdefdf12..fc3a7eb81 100644 --- a/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/mapper/majornetwork/mapping/MonitorMapper.xml +++ b/pqs-device/pms-device/pms-device-boot/src/main/java/com/njcn/device/pms/mapper/majornetwork/mapping/MonitorMapper.xml @@ -42,6 +42,9 @@ #{item.id} + + AND pms_monitor.Is_Up_To_Grid = #{pmsDeviceInfoParam.upToGrid} + diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/api/DeviceUnitClient.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/api/DeviceUnitClient.java index d1453f562..629515d1f 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/api/DeviceUnitClient.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/api/DeviceUnitClient.java @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** - * 监测点数据完整性 + * 数据单位 * @author cdf * @date 2023/6/7 */ diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/dto/PollutionGridDiagramDTO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/dto/PollutionGridDiagramDTO.java new file mode 100644 index 000000000..0140821b7 --- /dev/null +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/dto/PollutionGridDiagramDTO.java @@ -0,0 +1,24 @@ +package com.njcn.device.pq.pojo.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 类的介绍: + * + * @author xuyang + * @version 1.0.0 + * @createTime 2022/4/25 10:40 + */ +@Data +public class PollutionGridDiagramDTO extends PollutionSubstationDTO{ + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("供电公司") + private String powerCompany; + + @ApiModelProperty("数据") + private Double dataV = 3.14159; + +} diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/GridDiagramParam.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/GridDiagramParam.java new file mode 100644 index 000000000..545b8f1a7 --- /dev/null +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/GridDiagramParam.java @@ -0,0 +1,24 @@ +package com.njcn.device.pq.pojo.param; + +import com.njcn.web.pojo.param.BaseParam; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wr + * @description 冀北电网一张图入参 + * @date 2024/4/16 13:54 + */ +@Data +public class GridDiagramParam extends BaseParam { + + + @ApiModelProperty(value = "单位id") + private String orgId; + + @ApiModelProperty(name="type",value="类型(1年 2季度 3月份 4周 5日)") + private Integer type; + + @ApiModelProperty(name="deviceInfoParam",value="") + private DeviceInfoParam deviceInfoParam; +} diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/TerminalMainQueryParam.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/TerminalMainQueryParam.java index 7fd43c519..af8179a15 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/TerminalMainQueryParam.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/TerminalMainQueryParam.java @@ -26,4 +26,8 @@ public class TerminalMainQueryParam extends BaseParam { private String lineGrade; @ApiModelProperty(name = "装置id") private String devId; + @ApiModelProperty(name = "是否是国网上送监测点 1:是 0:否") + private Integer monitorFlag; + @ApiModelProperty(name = "单位id") + private String orgId; } diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/RStatOnlinerateD.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/RStatOnlinerateD.java index 6fd2e4ae8..d764653fd 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/RStatOnlinerateD.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/RStatOnlinerateD.java @@ -1,5 +1,6 @@ package com.njcn.device.pq.pojo.po; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.github.jeffreyning.mybatisplus.anno.MppMultiId; import com.njcn.db.bo.BaseEntity; @@ -31,6 +32,7 @@ public class RStatOnlinerateD { private Integer onlineMin; private Integer offlineMin; - - + + @TableField(exist = false) + private Float onlineRate; } diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/GridDiagramVO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/GridDiagramVO.java new file mode 100644 index 000000000..bc23179ae --- /dev/null +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/GridDiagramVO.java @@ -0,0 +1,98 @@ +package com.njcn.device.pq.pojo.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author wr + * @description + * @date 2024/4/16 14:55 + */ +@Data +public class GridDiagramVO { + + + @ApiModelProperty(name = "info", value = "全部监测点信息") + private List info; + + @ApiModelProperty(name = "gwInfo", value = "国网监测点信息信息") + private List gwInfo; + + @Data + public static class LineStatistics { + @ApiModelProperty(name = "orgId", value = "单位id") + private String orgId; + + @ApiModelProperty(name = "orgName", value = "单位名称") + private String orgName; + + @ApiModelProperty(name = "data", value = "数据") + private List data; + } + + @Data + public static class LineStatisticsData { + + @ApiModelProperty(name = "num", value = "监测点个数") + private Integer num; + + @ApiModelProperty(name = "num", value = "在线监测点数") + private Integer onLineNum; + + @ApiModelProperty(name = "onLineRate", value = "数据在线率") + private Float onLineRate; + + @ApiModelProperty(name = "integrityRate", value = "数据完整率") + private Float integrityRate; + } + + @Data + public static class StatisticsData { + + @ApiModelProperty(name = "numOne", value = "数据") + private Long numOne; + + @ApiModelProperty(name = "numTwo", value = "数据") + private Long numTwo; + + } + @Data + public static class DeviceData { + + @ApiModelProperty(name = "orgId", value = "单位id") + private String orgId; + + @ApiModelProperty(name = "orgName", value = "单位名称") + private String orgName; + + @ApiModelProperty(name = "devCount", value = "终端数量") + private Long devCount; + + @ApiModelProperty(name = "onlineEvaluate", value = "终端在线率评价") + private Double onlineEvaluate; + + } + + @Data + public static class LineData { + + @ApiModelProperty(name = "orgId", value = "单位id") + private String orgId; + + @ApiModelProperty(name = "orgName", value = "单位名称") + private String orgName; + + @ApiModelProperty(name = "onLineRate", value = "数据在线率") + private Float onLineRate; + + @ApiModelProperty(name = "integrityRate", value = "数据完整率") + private Float integrityRate; + + @ApiModelProperty(name = "outOfStandardRate", value = "超标监测点占比") + private Float outOfStandardRate; + + } +} diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/HalfReportVO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/HalfReportVO.java index cd4f16cb8..2fd624c76 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/HalfReportVO.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/HalfReportVO.java @@ -41,6 +41,9 @@ public class HalfReportVO implements Serializable { @ApiModelProperty("监测点通讯状态") private String comFlag; + @ApiModelProperty("监测点电压等级") + private String voltageScale; + @ApiModelProperty("投运时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime loginTime; diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java index 98adb18a1..f1b69d2e1 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java @@ -128,7 +128,9 @@ public class CommTerminalController extends BaseController { List result = commTerminalService.deptSubStation(deptGetLineParam); log.info("运行时长" + timer.intervalSecond()); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); - } /** + } + + /** * 根据单位获取所有变电站详细信息 * @param deptGetLineParam * @return diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/GridDiagramController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/GridDiagramController.java new file mode 100644 index 000000000..8c877ba6e --- /dev/null +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/GridDiagramController.java @@ -0,0 +1,89 @@ +package com.njcn.device.pq.controller; + +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.exception.BusinessException; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.common.utils.HttpResultUtil; +import com.njcn.device.pq.pojo.param.AlarmStrategyParam; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.param.GridDiagramParam; +import com.njcn.device.pq.pojo.vo.AlarmStrategyVO; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; +import com.njcn.device.pq.service.AlarmStrategyService; +import com.njcn.device.pq.service.GridDiagramService; +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; +import java.util.Map; + + +@Validated +@Slf4j +@RestController +@RequestMapping("/gridDiagram") +@Api(tags = "冀北电网一张图信息展示") +@AllArgsConstructor +public class GridDiagramController extends BaseController { + + private final GridDiagramService gridDiagramService; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramMonitor") + @ApiOperation("监测点统计(总数/在线)") + public HttpResult getGridDiagramMonitor(@RequestBody GridDiagramParam param){ + String methodDescribe = getMethodDescribe("getGridDiagramMonitor"); + GridDiagramVO gridDiagramMonitor = gridDiagramService.getGridDiagramMonitor(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramMonitor, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramDev") + @ApiOperation("终端统计(在运/在线)") + public HttpResult getGridDiagramDev(@RequestBody GridDiagramParam param){ + String methodDescribe = getMethodDescribe("getGridDiagramDev"); + GridDiagramVO gridDiagramMonitor = gridDiagramService.getGridDiagramDev(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramMonitor, methodDescribe); + } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramSubTendency") + @ApiOperation("变电站趋势分析") + public HttpResult> getGridDiagramSubTendency(@RequestBody GridDiagramParam param){ + String methodDescribe = getMethodDescribe("getGridDiagramSubTendency"); + Map gridDiagramDevTendency = gridDiagramService.getGridDiagramDevTendency(param,3); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramDevTendency, methodDescribe); + } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramDevTendency") + @ApiOperation("终端趋势分析") + public HttpResult> getGridDiagramDevTendency(@RequestBody GridDiagramParam param){ + String methodDescribe = getMethodDescribe("getGridDiagramDevTendency"); + Map gridDiagramDevTendency = gridDiagramService.getGridDiagramDevTendency(param,4); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramDevTendency, methodDescribe); + } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramDevData") + @ApiOperation("终端分布统计") + public HttpResult> getGridDiagramDevData(@RequestBody GridDiagramParam param){ + String methodDescribe = getMethodDescribe("getGridDiagramDevData"); + List gridDiagramDevData = gridDiagramService.getGridDiagramDevData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramDevData, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramLineTendency") + @ApiOperation("监测点趋势分析") + public HttpResult> getGridDiagramLineTendency(@RequestBody GridDiagramParam param){ + String methodDescribe = getMethodDescribe("getGridDiagramLineTendency"); + Map gridDiagramDevTendency = gridDiagramService.getGridDiagramDevTendency(param,6); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramDevTendency, methodDescribe); + } +} diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineIntegrityDataController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineIntegrityDataController.java index 1d6bd3383..dc37a052b 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineIntegrityDataController.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineIntegrityDataController.java @@ -83,7 +83,7 @@ public class LineIntegrityDataController extends BaseController { public HttpResult> getIntegrityByLineIds(@RequestBody List lineIds, @RequestParam("startTime")String startTime, @RequestParam("endTime")String endTime) { String methodDescribe = getMethodDescribe("getIntegrityByLineIds"); QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.select("sum(real_time)/sum(due_time) as integrityData","line_index").in("line_index",lineIds).between("time_id",startTime,endTime).groupBy("line_index"); + queryWrapper.select("sum(real_time) as realTime,sum(due_time) as dueTime,sum(real_time)/sum(due_time) as integrityData","line_index").in("line_index",lineIds).between("time_id",startTime,endTime).groupBy("line_index"); List rStatIntegrityDList = irStatIntegrityDService.list(queryWrapper); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rStatIntegrityDList, methodDescribe); } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java index 6a56884c0..d1caa2aeb 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java @@ -514,7 +514,7 @@ public interface LineMapper extends BaseMapper { * @Author: wr * @Date: 2023/8/29 12:50 */ - Page selectHalfReport(Page page,@Param("param") TerminalMainQueryParam param); + Page selectHalfReport(Page page,@Param("param") TerminalMainQueryParam param,@Param("deptIdList") List deptIdList); /** * @Description: 根据监测点id获取监测点信息 diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml index 0ae5b6f45..042b41c15 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml @@ -30,7 +30,8 @@ dev.id devId, device.com_flag comFlag, 1 as lineType, - 0 as type + 0 as type, + lineDetail.Monitor_Flag as isUpToGrid @@ -97,7 +98,8 @@ substation.id ledgerId, substation.name subName, sub.Scale voltageLevel, - point.id lineId + point.id lineId, + lineDetail.Monitor_Flag as monitorFlag from pq_dept_line pq_dept_line inner join pq_line point on pq_dept_line.line_id = point.id inner join pq_line_detail lineDetail on point.id = lineDetail.id diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml index e58f54479..325c9510f 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml @@ -1262,10 +1262,12 @@ select dev_index, + sum(online_min) as onlineMin, + sum(offline_min) as offlineMin, ROUND( sum(online_min)/(sum(online_min) + sum(offline_min))*100,2) as online_rate from r_stat_onlinerate_d diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/GridDiagramService.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/GridDiagramService.java new file mode 100644 index 000000000..0a272a29d --- /dev/null +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/GridDiagramService.java @@ -0,0 +1,51 @@ +package com.njcn.device.pq.service; + + +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.param.GridDiagramParam; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; + +import java.util.List; +import java.util.Map; + +/** + * @author wr + * @description 冀北电网一张图 + * @date 2024/4/16 13:11 + */ +public interface GridDiagramService { + + + /** + * @Description: 监测点统计(在线数/在线率/完整率) + * @param + * @Author: wr + */ + + GridDiagramVO getGridDiagramMonitor(GridDiagramParam param); + + /** + * @Description: 终端统计(在运/在线) + * @param + * @Author: wr + */ + + GridDiagramVO getGridDiagramDev(GridDiagramParam param); + + /** + * @Description: 终端趋势分析 + * @param + * @Author: wr + */ + + Map getGridDiagramDevTendency(GridDiagramParam param,Integer type); + + /** + * @Description: 终端分布统计 + * @param + * @Author: wr + */ + + List getGridDiagramDevData(GridDiagramParam param); + +} diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/LineService.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/LineService.java index 52d628caa..d9a8ee21f 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/LineService.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/LineService.java @@ -1,6 +1,7 @@ package com.njcn.device.pq.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import com.njcn.device.biz.pojo.dto.LineDTO; import com.njcn.device.biz.pojo.dto.LineALLInfoDTO; import com.njcn.device.pq.pojo.dto.PollutionLineDTO; @@ -22,7 +23,7 @@ import java.util.Map; * @date 2022/2/23 * */ -public interface LineService { +public interface LineService extends IService { /** * 获取监测点详情 * @param id 监测点id diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java index 4251425b6..5ae382524 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java @@ -81,7 +81,8 @@ public class CommTerminalServiceImpl implements CommTerminalService { public List deptGetLine(DeptGetLineParam deptGetLineParam) { List result = new ArrayList<>(); List temDept = getDeptChildrenByParent(deptGetLineParam); - Map> map = deptLineService.lineDevGet(filterDataTypeNew(deptGetLineParam.getServerName()),1); + Map deptMap = temDept.stream().collect(Collectors.toMap(DeptGetBase::getUnitId, DeptGetBase::getUnitName)); + Map> map = deptLineService.lineDevGet(filterDataTypeNew(deptGetLineParam.getServerName()),1); temDept.forEach(item -> { DeptGetChildrenMoreDTO deptGetChildrenMoreDTO = new DeptGetChildrenMoreDTO(); deptGetChildrenMoreDTO.setUnitId(item.getUnitId()); @@ -93,6 +94,11 @@ public class CommTerminalServiceImpl implements CommTerminalService { List lineList = new ArrayList<>(); deptIds.forEach(i -> { if (map.containsKey(i)) { + map.get(i).stream().forEach(x->{ + if(deptMap.containsKey(x.getUnitId())){ + x.setUnitName(deptMap.get(x.getUnitId())); + } + }); lineList.addAll(map.get(i)); } }); @@ -216,7 +222,7 @@ public class CommTerminalServiceImpl implements CommTerminalService { List temDept = getDeptChildrenByParent(deptGetLineParam); List anExtends = deptLineService.orgSubStationInfoGet(filterDataTypeNew(deptGetLineParam.getServerName())); Map> orgSub = anExtends.stream().collect(Collectors.groupingBy(TerminalGetBase::getUnitId)); - + Map deptNameMap = temDept.stream().collect(Collectors.toMap(DeptGetBase::getUnitId, DeptGetBase::getUnitName)); temDept.forEach(item -> { DeptGetSubStationDTO.Info deptGetSubStationDTO = new DeptGetSubStationDTO.Info(); deptGetSubStationDTO.setUnitId(item.getUnitId()); @@ -239,8 +245,18 @@ public class CommTerminalServiceImpl implements CommTerminalService { subGetBase.setId(split[0]); subGetBase.setName(split[1]); subGetBase.setVoltageLevel(split[2]); + subGetBase.setOrgId(deptId); + if(deptNameMap.containsKey(deptId)){ + subGetBase.setOrgName(deptNameMap.get(deptId)); + } + //国网监测点 + List gwMonitor = stringListEntry.getValue().stream().filter(x -> 1 == x.getMonitorFlag()) + .map(TerminalGetBase.Extend::getLineId) + .distinct().collect(Collectors.toList()); + subGetBase.setIsUpToGrid(gwMonitor.size() > 0 ? 1 : 0); List monitorIds = stringListEntry.getValue().stream().map(TerminalGetBase.Extend::getLineId).distinct().collect(Collectors.toList()); subGetBase.setUnitChildrenList(monitorIds); + subGetBase.setGwUnitChildrenList(gwMonitor); subList.add(subGetBase); } } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/GridDiagramServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/GridDiagramServiceImpl.java new file mode 100644 index 000000000..463f8eed8 --- /dev/null +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/GridDiagramServiceImpl.java @@ -0,0 +1,398 @@ +package com.njcn.device.pq.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.njcn.common.pojo.dto.SimpleDTO; +import com.njcn.common.pojo.enums.common.DataStateEnum; +import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO; +import com.njcn.device.biz.pojo.dto.LineDevGetDTO; +import com.njcn.device.biz.pojo.param.DeptGetLineParam; +import com.njcn.device.pq.mapper.RStatIntegrityDMapper; +import com.njcn.device.pq.mapper.RStatOnlinerateDMapper; +import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.param.GridDiagramParam; +import com.njcn.device.pq.pojo.po.Device; +import com.njcn.device.pq.pojo.po.Line; +import com.njcn.device.pq.pojo.po.RStatIntegrityD; +import com.njcn.device.pq.pojo.po.RStatOnlinerateD; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; +import com.njcn.device.pq.service.CommTerminalService; +import com.njcn.device.pq.service.GridDiagramService; +import com.njcn.device.pq.service.IDeviceService; +import com.njcn.device.pq.service.LineService; +import com.njcn.system.api.DicDataFeignClient; +import com.njcn.system.enums.DicDataEnum; +import com.njcn.system.enums.DicDataTypeEnum; +import com.njcn.system.pojo.po.DictData; +import com.njcn.user.api.DeptFeignClient; +import com.njcn.user.pojo.po.Dept; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author wr + * @description + * @date 2024/4/16 13:57 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class GridDiagramServiceImpl implements GridDiagramService { + + private final CommTerminalService commTerminalService; + private final DeptFeignClient deptFeignClient; + private final DicDataFeignClient dicDataFeignClient; + private final RStatOnlinerateDMapper onLineRateDMapper; + private final RStatIntegrityDMapper integrityDMapper; + private final IDeviceService deviceService; + private final GeneralDeviceService generalDeviceService; + private final LineService lineService; + + @Override + public GridDiagramVO getGridDiagramMonitor(GridDiagramParam param) { + //获取电压等级 + List dictDataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE_STAND.getCode()).getData(); + + //获取电压等级550 220 110 35 + List voltageIds = dictDataList.stream().filter(item -> Objects.equals(DicDataEnum.DY_500KV.getCode(), item.getCode()) || Objects.equals(DicDataEnum.DY_220KV.getCode(), item.getCode()) || Objects.equals(DicDataEnum.DY_110KV.getCode(), item.getCode()) || Objects.equals(DicDataEnum.DY_35KV.getCode(), item.getCode())).sorted(Comparator.comparing(DictData::getSort).reversed()).map(DictData::getId).collect(Collectors.toList()); + + + GridDiagramVO gridDiagramVO = new GridDiagramVO(); + List info = new ArrayList<>(); + List gwInfo = new ArrayList<>(); + + //获取部门数据关系 + List data = deptFeignClient.getDirectSonSelf(param.getOrgId()).getData(); + DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); + deptGetLineParam.setDeptId(param.getOrgId()); + List deptGetChildrenMoreDTOS = commTerminalService.deptGetLine(deptGetLineParam); + //监测点id集合 + List lineIdsAll = deptGetChildrenMoreDTOS.stream().flatMap(x -> x.getLineBaseList().stream().map(LineDevGetDTO::getPointId)).distinct().collect(Collectors.toList()); + //终端id集合 + List devIdsAll = deptGetChildrenMoreDTOS.stream().flatMap(x -> x.getLineBaseList().stream().map(LineDevGetDTO::getDevId)).distinct().collect(Collectors.toList()); + List onlineRateByDevIds = new ArrayList<>(); + List onIntegrityByIds = new ArrayList<>(); + if (CollUtil.isNotEmpty(lineIdsAll)) { + //监测点完整性 + onIntegrityByIds.addAll(integrityDMapper.selectList(new QueryWrapper().select("sum(real_time) as `realTime`,sum(due_time) as dueTime,line_index as lineIndex").in(CollUtil.isNotEmpty(lineIdsAll), "line_index", lineIdsAll).ge(StrUtil.isNotBlank(param.getSearchBeginTime()), "time_id", DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime()))).le(StrUtil.isNotBlank(param.getSearchEndTime()), "time_id", DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime()))).groupBy("line_index"))); + //终端在线率 + onlineRateByDevIds.addAll(onLineRateDMapper.selectList(new QueryWrapper().select("sum(online_min) as `onlineMin`,sum(offline_min) as offlineMin,dev_index as devIndex").in(CollUtil.isNotEmpty(devIdsAll), "dev_index", devIdsAll).ge(StrUtil.isNotBlank(param.getSearchBeginTime()), "time_id", DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime()))).le(StrUtil.isNotBlank(param.getSearchEndTime()), "time_id", DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime()))).groupBy("dev_index"))); + } + + Map deptLineMap = deptGetChildrenMoreDTOS.stream().collect(Collectors.toMap(DeptGetChildrenMoreDTO::getUnitId, Function.identity())); + GridDiagramVO.LineStatistics lineStatistics; + GridDiagramVO.LineStatistics gwLineStatistics; + for (Dept datum : data) { + if (deptLineMap.containsKey(datum.getId())) { + lineStatistics = new GridDiagramVO.LineStatistics(); + lineStatistics.setOrgId(datum.getId()); + lineStatistics.setOrgName(datum.getName()); + gwLineStatistics = new GridDiagramVO.LineStatistics(); + gwLineStatistics.setOrgId(datum.getId()); + gwLineStatistics.setOrgName(datum.getName()); + List lineBaseList = deptLineMap.get(datum.getId()).getLineBaseList(); + List statisticsData = new ArrayList<>(); + List gwStatisticsData = new ArrayList<>(); + getLineStatisticsData(statisticsData, gwStatisticsData, lineBaseList, voltageIds, onlineRateByDevIds, onIntegrityByIds); + lineStatistics.setData(statisticsData); + gwLineStatistics.setData(gwStatisticsData); + + info.add(lineStatistics); + gwInfo.add(gwLineStatistics); + } + } + gridDiagramVO.setInfo(info); + gridDiagramVO.setGwInfo(gwInfo); + return gridDiagramVO; + } + + /** + * @param statisticsData 全部监测点数据 + * @param gwStatisticsData 国网监测点数据 + * @param lineBaseList 监测点信息 + * @param voltageIds 电压等级 + * @param onlineRateByDevIds 在线率 + * @param onIntegrityByIds 完整率 + * @Description: 在线率,完整率赋值 + * @Author: wr + * @Date: 2024/4/18 15:38 + */ + private void getLineStatisticsData(List statisticsData, List gwStatisticsData, List lineBaseList, List voltageIds, List onlineRateByDevIds, List onIntegrityByIds) { + voltageIds.forEach((key) -> { + statisticsDataList(statisticsData, lineBaseList, key, onlineRateByDevIds, onIntegrityByIds); + gwStatisticsDataList(gwStatisticsData, lineBaseList, key, onlineRateByDevIds, onIntegrityByIds); + }); + statisticsDataOtherList(statisticsData, lineBaseList, onlineRateByDevIds, onIntegrityByIds); + gwStatisticsDataOtherList(gwStatisticsData, lineBaseList, onlineRateByDevIds, onIntegrityByIds); + } + + /** + * @param statisticsData + * @param lineBaseList + * @param value + * @param onlineRateByDevIds + * @param onIntegrityByIds + * @Description: 全部监测点数据赋值 + * @Author: wr + * @Date: 2024/4/18 15:40 + */ + private void statisticsDataList(List statisticsData, List lineBaseList, String value, List onlineRateByDevIds, List onIntegrityByIds) { + //监测点集合 + List lineIds = lineBaseList.stream().filter(x -> value.equals(x.getVoltageLevel())).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + List onLineNumIds = lineBaseList.stream().filter(x -> value.equals(x.getVoltageLevel())&&1==x.getComFlag()).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + //终端id集合 + List devIds = lineBaseList.stream().filter(x -> value.equals(x.getVoltageLevel())).map(LineDevGetDTO::getDevId).distinct().collect(Collectors.toList()); + + GridDiagramVO.LineStatisticsData lineStatisticsData = new GridDiagramVO.LineStatisticsData(); + lineStatisticsData.setNum(lineIds.size()); + lineStatisticsData.setOnLineNum(onLineNumIds.size()); + onLineAndIntegrity(lineIds, onIntegrityByIds, devIds, onlineRateByDevIds, lineStatisticsData); + statisticsData.add(lineStatisticsData); + + } + + private void statisticsDataOtherList(List statisticsData, List lineBaseList, List onlineRateByDevIds, List onIntegrityByIds) { + //终端id集合 + List devIdsAll = lineBaseList.stream().map(LineDevGetDTO::getDevId).distinct().collect(Collectors.toList()); + //监测点集合 + List lineIdsAll = lineBaseList.stream().map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + List onLineNumAll = lineBaseList.stream().filter(x -> 1 == x.getComFlag()).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + + GridDiagramVO.LineStatisticsData lineStatisticsData = new GridDiagramVO.LineStatisticsData(); + lineStatisticsData.setNum(lineIdsAll.size()); + lineStatisticsData.setOnLineNum(onLineNumAll.size()); + onLineAndIntegrity(lineIdsAll, onIntegrityByIds, devIdsAll, onlineRateByDevIds, lineStatisticsData); + statisticsData.add(lineStatisticsData); + } + + + private void gwStatisticsDataList(List statisticsData, List lineBaseList, String value, List onlineRateByDevIds, List onIntegrityByIds) { + //监测点集合 + List lineIds = lineBaseList.stream().filter(x -> value.equals(x.getVoltageLevel())).filter(x -> 1 == x.getIsUpToGrid()).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + List onLineNumIds = lineBaseList.stream().filter(x -> value.equals(x.getVoltageLevel())&&1==x.getComFlag()).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + //终端id集合 + List devIds = lineBaseList.stream().filter(x -> value.equals(x.getVoltageLevel())).filter(x -> 1 == x.getIsUpToGrid()).map(LineDevGetDTO::getDevId).distinct().collect(Collectors.toList()); + + GridDiagramVO.LineStatisticsData lineStatisticsData = new GridDiagramVO.LineStatisticsData(); + lineStatisticsData.setNum(lineIds.size()); + lineStatisticsData.setOnLineNum(onLineNumIds.size()); + onLineAndIntegrity(lineIds, onIntegrityByIds, devIds, onlineRateByDevIds, lineStatisticsData); + statisticsData.add(lineStatisticsData); + } + + private void gwStatisticsDataOtherList(List statisticsData, List lineBaseList, List onlineRateByDevIds, List onIntegrityByIds) { + //终端id集合 + List devIdsAll = lineBaseList.stream().filter(x -> 1 == x.getIsUpToGrid()).map(LineDevGetDTO::getDevId).distinct().collect(Collectors.toList()); + //监测点集合 + List lineIdsAll = lineBaseList.stream().filter(x -> 1 == x.getIsUpToGrid()).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + List onLineNumAll = lineBaseList.stream().filter(x -> 1 == x.getComFlag()&&1 == x.getIsUpToGrid()).map(LineDevGetDTO::getPointId).distinct().collect(Collectors.toList()); + GridDiagramVO.LineStatisticsData lineStatisticsData = new GridDiagramVO.LineStatisticsData(); + lineStatisticsData.setNum(lineIdsAll.size()); + lineStatisticsData.setOnLineNum(onLineNumAll.size()); + onLineAndIntegrity(lineIdsAll, onIntegrityByIds, devIdsAll, onlineRateByDevIds, lineStatisticsData); + statisticsData.add(lineStatisticsData); + } + + private void onLineAndIntegrity(List lineIds, List onIntegrityByIds, List devIds, List onlineRateByDevIds, GridDiagramVO.LineStatisticsData lineStatisticsData) { + //监测完整率 + List integrityDS = onIntegrityByIds.stream().filter(x -> lineIds.contains(x.getLineIndex())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(integrityDS)) { + double realTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getRealTime).sum(); + double dueTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getDueTime).sum(); + lineStatisticsData.setIntegrityRate(NumberUtil.round(realTime * 100 / dueTime, 2).floatValue()); + } else { + lineStatisticsData.setIntegrityRate(0.0f); + } + //终端在线率 + List onlineRateDS = onlineRateByDevIds.stream().filter(x -> devIds.contains(x.getDevIndex())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(onlineRateDS)) { + double onlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOnlineMin).sum(); + double offlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOfflineMin).sum(); + lineStatisticsData.setOnLineRate(NumberUtil.round(onlineTime * 100 / onlineTime + offlineTime, 2).floatValue()); + } else { + lineStatisticsData.setOnLineRate(0.0f); + } + } + + + @Override + public GridDiagramVO getGridDiagramDev(GridDiagramParam param) { + //获取电压等级 + List dictDataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE_STAND.getCode()).getData(); + + //获取电压等级550 220 110 35 + List voltageIds = dictDataList.stream().filter(item -> Objects.equals(DicDataEnum.DY_500KV.getCode(), item.getCode()) || Objects.equals(DicDataEnum.DY_220KV.getCode(), item.getCode()) || Objects.equals(DicDataEnum.DY_110KV.getCode(), item.getCode()) || Objects.equals(DicDataEnum.DY_35KV.getCode(), item.getCode())).sorted(Comparator.comparing(DictData::getSort).reversed()).map(DictData::getId).collect(Collectors.toList()); + + + GridDiagramVO gridDiagramVO = new GridDiagramVO(); + List info = new ArrayList<>(); + List gwInfo = new ArrayList<>(); + + //获取部门数据关系 + List data = deptFeignClient.getDirectSonSelf(param.getOrgId()).getData(); + DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); + deptGetLineParam.setDeptId(param.getOrgId()); + List deptGetChildrenMoreDTOS = commTerminalService.deptGetLine(deptGetLineParam); + + + Map deptLineMap = deptGetChildrenMoreDTOS.stream().collect(Collectors.toMap(DeptGetChildrenMoreDTO::getUnitId, Function.identity())); + GridDiagramVO.LineStatistics lineStatistics; + GridDiagramVO.LineStatistics gwLineStatistics; + for (Dept datum : data) { + if (deptLineMap.containsKey(datum.getId())) { + lineStatistics = new GridDiagramVO.LineStatistics(); + lineStatistics.setOrgId(datum.getId()); + lineStatistics.setOrgName(datum.getName()); + gwLineStatistics = new GridDiagramVO.LineStatistics(); + gwLineStatistics.setOrgId(datum.getId()); + gwLineStatistics.setOrgName(datum.getName()); + List lineBaseList = deptLineMap.get(datum.getId()).getLineBaseList(); + List statisticsData = new ArrayList<>(); + List gwStatisticsData = new ArrayList<>(); + getDevStatisticsData(statisticsData, gwStatisticsData, lineBaseList, voltageIds); + lineStatistics.setData(statisticsData); + gwLineStatistics.setData(gwStatisticsData); + + info.add(lineStatistics); + gwInfo.add(gwLineStatistics); + } + } + gridDiagramVO.setInfo(info); + gridDiagramVO.setGwInfo(gwInfo); + return gridDiagramVO; + } + + @Override + public Map getGridDiagramDevTendency(GridDiagramParam param, Integer type) { + List generalDeviceDTOList = generalDeviceService.getDeviceInfo(param.getDeviceInfoParam(), Stream.of(0).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList())); + Map map = new LinkedHashMap<>(); + DateField dateField; + if (1 == param.getType()) { + dateField = DateField.YEAR; + } else { + dateField = DateField.MONTH; + } + //根据步进单位获取起始日期时间和结束日期时间的时间区间集合 + List dateTimes = DateUtil.rangeToList(DateUtil.parse(param.getSearchBeginTime()), DateUtil.parse(param.getSearchEndTime()), dateField); + List times; + if (4 == type) { + List devIDs = generalDeviceDTOList.stream().flatMap(x -> x.getDeviceIndexes().stream()).distinct().collect(Collectors.toList()); + List list = deviceService.list(new LambdaQueryWrapper().select(Device::getLoginTime).in(CollUtil.isNotEmpty(devIDs), Device::getId, devIDs).eq(Device::getRunFlag, 0)); + times = list.stream().map(x -> Date.from(x.getLoginTime().atStartOfDay(ZoneId.systemDefault()).toInstant())).collect(Collectors.toList()); + } else { + List ids; + if (type == 3) { + ids = generalDeviceDTOList.stream().flatMap(x -> x.getSubIndexes().stream()).distinct().collect(Collectors.toList()); + } else { + ids = generalDeviceDTOList.stream().flatMap(x -> x.getLineIndexes().stream()).distinct().collect(Collectors.toList()); + } + List list = lineService.list(new LambdaQueryWrapper().in(CollUtil.isNotEmpty(ids), Line::getId, ids).eq(Line::getState, DataStateEnum.ENABLE.getCode()).eq(Line::getLevel, type)); + times = list.stream().map(x -> Date.from(x.getCreateTime().atZone(ZoneId.systemDefault()).toInstant())).collect(Collectors.toList()); + } + for (DateTime dateTime : dateTimes) { + if (1 == param.getType()) { + long count = times.stream().filter(x -> DateUtil.isIn(x, DateUtil.beginOfYear(dateTime), DateUtil.endOfYear(dateTime))).count(); + map.put(dateTime.toString().substring(0, 4), count); + } else { + long count = times.stream().filter(x -> DateUtil.isIn(x, DateUtil.beginOfMonth(dateTime), DateUtil.endOfMonth(dateTime))).count(); + map.put(dateTime.toString().substring(0, 7), count); + } + } + return map; + } + + @Override + public List getGridDiagramDevData(GridDiagramParam param) { + // 获取所有数据 + List generalDeviceDTOList = generalDeviceService.getDeviceInfo(param.getDeviceInfoParam(), Stream.of(0).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList())); + List devIDs = generalDeviceDTOList.stream().flatMap(x -> x.getDeviceIndexes().stream()).distinct().collect(Collectors.toList()); + List onlinerateDS = onLineRateDMapper.selectList(new QueryWrapper() + .select("sum(online_min) as `onlineMin`,sum(offline_min) as offlineMin,dev_index as devIndex") + .in(CollUtil.isNotEmpty(devIDs), "dev_index", devIDs) + .ge(StrUtil.isNotBlank(param.getSearchBeginTime()), "time_id", DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime()))) + .le(StrUtil.isNotBlank(param.getSearchEndTime()), "time_id", DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime()))) + .groupBy("dev_index")); + List info=new ArrayList<>(); + GridDiagramVO.DeviceData data; + for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) { + data=new GridDiagramVO.DeviceData(); + data.setOrgId(generalDeviceDTO.getIndex()); + data.setOrgName(generalDeviceDTO.getName()); + data.setDevCount(generalDeviceDTO.getDeviceIndexes().stream().distinct().count()); + List onlineRateDS = onlinerateDS.stream().filter(x -> generalDeviceDTO.getDeviceIndexes().contains(x.getDevIndex())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(onlineRateDS)) { + double onlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOnlineMin).sum(); + double offlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOfflineMin).sum(); + data.setOnlineEvaluate(NumberUtil.round(onlineTime * 100 / onlineTime + offlineTime, 2).doubleValue()); + } else { + data.setOnlineEvaluate(0.0); + } + info.add(data); + } + return info; + } + + + private void getDevStatisticsData(List statisticsData, List gwStatisticsData, List lineBaseList, List voltageIds) { + long countOne = 0; + long countTow = 0; + long gwCountOne = 0; + long gwCountTow = 0; + GridDiagramVO.StatisticsData data; + for (String voltageId : voltageIds) { + for (int i = 0; i < 2; i++) { + data = new GridDiagramVO.StatisticsData(); + int finalI = i; + //todo 0 + long count = lineBaseList.stream().filter(x -> getIsUpToGrid(finalI, x, voltageId)).distinct().count(); + data.setNumOne(count); + long count1 = lineBaseList.stream().filter(x -> getIsUpToGrid(finalI, x, voltageId)).filter(x -> 1 == x.getComFlag()).map(LineDevGetDTO::getDevId).distinct().count(); + data.setNumTwo(count1); + if (i == 0) { + countOne += count; + countTow += count1; + statisticsData.add(data); + } else { + gwCountOne += count; + gwCountTow += count1; + gwStatisticsData.add(data); + } + } + } + data = new GridDiagramVO.StatisticsData(); + data.setNumOne(countOne); + data.setNumTwo(countTow); + statisticsData.add(data); + data = new GridDiagramVO.StatisticsData(); + data.setNumOne(gwCountOne); + data.setNumTwo(gwCountTow); + gwStatisticsData.add(data); + + } + + //在运-在线 + private Boolean getIsUpToGrid(Integer type, LineDevGetDTO lineDevGetDTO, String voltageId) { + //0:全部 1:国网上送监测点 + if (type == 0) { + return voltageId.equals(lineDevGetDTO.getVoltageLevel()); + } else { + return voltageId.equals(lineDevGetDTO.getVoltageLevel()) && 1 == lineDevGetDTO.getIsUpToGrid(); + } + } + +} diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/LineServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/LineServiceImpl.java index 5cb541971..c20a5924e 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/LineServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/LineServiceImpl.java @@ -40,9 +40,12 @@ import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.pojo.po.Area; import com.njcn.system.pojo.po.DictData; +import com.njcn.user.api.DeptFeignClient; +import com.njcn.user.pojo.dto.DeptDTO; import com.njcn.web.pojo.vo.LineDataVO; import com.njcn.web.utils.GeneralUtil; import com.njcn.web.utils.RequestUtil; +import com.njcn.web.utils.WebUtil; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -90,6 +93,7 @@ public class LineServiceImpl extends ServiceImpl implements Li private final PqsCommunicateMapper pqsCommunicateMapper; private final TerminalMaintainMapper terminalMaintainMapper; + private final DeptFeignClient deptFeignClient; @Override public LineDetailDataVO getLineDetailData(String id) { @@ -471,10 +475,15 @@ public class LineServiceImpl extends ServiceImpl implements Li @Override public Page halfReport(TerminalMainQueryParam param) { + List ids=new ArrayList<>(); + if(StrUtil.isNotBlank(param.getOrgId())){ + List data = deptFeignClient.getDeptDescendantIndexes(param.getOrgId(), WebUtil.filterDeptType()).getData(); + ids.addAll(data.stream().map(DeptDTO::getId).collect(Collectors.toList())); + } Page page = new Page<>(param.getPageNum(), param.getPageSize()); param.setSearchBeginTime(DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())).toString()); param.setSearchEndTime(DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())).toString()); - return this.baseMapper.selectHalfReport(page,param); + return this.baseMapper.selectHalfReport(page,param,ids); } @Override diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/StatSubstationBizBaseParam.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/StatSubstationBizBaseParam.java index 6f7d0a425..a21aa2385 100644 --- a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/StatSubstationBizBaseParam.java +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/StatSubstationBizBaseParam.java @@ -15,7 +15,16 @@ import java.util.List; @Data public class StatSubstationBizBaseParam extends StatisticsBizBaseParam { - @ApiModelProperty(value = "ids集合",required = true) - List ids; + @ApiModelProperty(value = "ids集合", required = true) + private List ids; + + @ApiModelProperty(value = "是否是国网监测点信息", required = true) + private Integer isUpToGrid; + + @ApiModelProperty("页码") + private Integer pageNum; + + @ApiModelProperty("页面尺寸") + private Integer pageSize; } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/GridDiagramHarmController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/GridDiagramHarmController.java new file mode 100644 index 000000000..b99139d0a --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/GridDiagramHarmController.java @@ -0,0 +1,78 @@ +package com.njcn.harmonic.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.device.pq.pojo.dto.PollutionGridDiagramDTO; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; +import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; +import com.njcn.harmonic.service.IRMpTargetWarnDService; +import com.njcn.harmonic.service.PollutionSubstationService; +import com.njcn.harmonic.service.majornetwork.RStatLimitService; +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.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; + + +@Validated +@Slf4j +@RestController +@RequestMapping("/gridDiagram") +@Api(tags = "冀北电网一张图信息展示") +@AllArgsConstructor +public class GridDiagramHarmController extends BaseController { + + private final IRMpTargetWarnDService irMpTargetWarnDService; + private final PollutionSubstationService pollutionSubstationService; + private final RStatLimitService rStatLimitService; + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getSubLineGiveAnAlarm") + @ApiOperation("区域变电站下告警监测点数量") + @ApiImplicitParam(name = "param", value = "变电站下监测点是否超标", required = true) + public HttpResult getSubLineGiveAnAlarm(@RequestBody StatSubstationBizBaseParam param) { + String methodDescribe = getMethodDescribe("getSubLineGiveAnAlarm"); + GridDiagramVO subLineGiveAnAlarm = irMpTargetWarnDService.getSubLineGiveAnAlarm(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, subLineGiveAnAlarm, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getPollutionAlarmData") + @ApiOperation("变电站污染告警占比") + public HttpResult getPollutionAlarmData(@RequestBody StatSubstationBizBaseParam param) { + String methodDescribe = getMethodDescribe("getSubLineGiveAnAlarm"); + GridDiagramVO subLineGiveAnAlarm = pollutionSubstationService.getPollutionAlarmData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, subLineGiveAnAlarm, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getPollutionAlarmPageData") + @ApiOperation("变电站详细列表") + public HttpResult> getPollutionAlarmPageData(@RequestBody StatSubstationBizBaseParam param) { + String methodDescribe = getMethodDescribe("getPollutionAlarmPageData"); + Page subLineGiveAnAlarm = pollutionSubstationService.getPollutionAlarmPageData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, subLineGiveAnAlarm, methodDescribe); + } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getGridDiagramLineData") + @ApiOperation("监测点分布统计") + public HttpResult> getGridDiagramLineData(@RequestBody DeviceInfoParam.BusinessParam param) { + String methodDescribe = getMethodDescribe("getGridDiagramLineData"); + List gridDiagramDevData = rStatLimitService.getGridDiagramLineData(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, gridDiagramDevData, methodDescribe); + } +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RMpTargetWarnDMapper.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RMpTargetWarnDMapper.java new file mode 100644 index 000000000..626191042 --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RMpTargetWarnDMapper.java @@ -0,0 +1,16 @@ +package com.njcn.harmonic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO; + +/** + *

+ * Mapper 接口 + *

+ * + * @author wr + * @since 2024-04-19 + */ +public interface RMpTargetWarnDMapper extends BaseMapper { + +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatPollutionSubstationMMapper.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatPollutionSubstationMMapper.java index 67afce97b..a5316d332 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatPollutionSubstationMMapper.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatPollutionSubstationMMapper.java @@ -1,10 +1,13 @@ package com.njcn.harmonic.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.njcn.device.pq.pojo.dto.PollutionGridDiagramDTO; import com.njcn.harmonic.pojo.po.RStatPollutionSubstationM; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * Description: @@ -22,4 +25,11 @@ public interface RStatPollutionSubstationMMapper extends BaseMapper selectBySubstationPage(Page page, + @Param("ids") List ids, + @Param("typeMapId") Map typeMapId, + @Param("startTime") String startTime, + @Param("endTime") String endTime + ); } \ No newline at end of file diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RMpTargetWarnDMapper.xml b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RMpTargetWarnDMapper.xml new file mode 100644 index 000000000..5646ac87b --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RMpTargetWarnDMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatPollutionSubstationMMapper.xml b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatPollutionSubstationMMapper.xml index 0ea186a40..23dfd882a 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatPollutionSubstationMMapper.xml +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatPollutionSubstationMMapper.xml @@ -104,4 +104,31 @@
+ \ No newline at end of file diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/IRMpTargetWarnDService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/IRMpTargetWarnDService.java new file mode 100644 index 000000000..eac8ebae8 --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/IRMpTargetWarnDService.java @@ -0,0 +1,23 @@ +package com.njcn.harmonic.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; +import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; +import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO; + +import java.util.Map; + + +/** + *

+ * 服务类 + *

+ * + * @author wr + * @since 2024-04-19 + */ +public interface IRMpTargetWarnDService extends IService { + + + GridDiagramVO getSubLineGiveAnAlarm(StatSubstationBizBaseParam param); +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java index 480b5ce3c..ea91e3174 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/PollutionSubstationService.java @@ -1,10 +1,14 @@ package com.njcn.harmonic.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.device.pq.pojo.dto.PollutionGridDiagramDTO; import com.njcn.device.pq.pojo.dto.PollutionLineDTO; import com.njcn.device.pq.pojo.dto.PollutionSubstationDTO; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; import com.njcn.harmonic.pojo.param.HarmonicPublicParam; import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; +import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.RStatPollutionSubstationM; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionVO; @@ -59,4 +63,21 @@ public interface PollutionSubstationService extends IService getLineRankTop10(HarmonicPublicParam param); + /** + * @Description: 污染告警信息 + * @param param + * @return: java.util.List + * @Author: wr + * @Date: 2024/4/22 11:00 + */ + GridDiagramVO getPollutionAlarmData(StatSubstationBizBaseParam param); + + /** + * @Description: 污染告警信息 + * @param param + * @return: java.util.List + * @Author: wr + * @Date: 2024/4/22 11:00 + */ + Page getPollutionAlarmPageData(StatSubstationBizBaseParam param); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java index ce5d2a085..58370ce57 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java @@ -1,14 +1,23 @@ package com.njcn.harmonic.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.njcn.common.config.GeneralInfo; import com.njcn.common.pojo.constant.BizParamConstant; import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.device.biz.commApi.CommTerminalGeneralClient; +import com.njcn.device.biz.pojo.dto.DeptGetSubStationDTO; +import com.njcn.device.biz.pojo.dto.SubGetBase; +import com.njcn.device.biz.pojo.param.DeptGetLineParam; import com.njcn.device.pms.api.MonitorClient; import com.njcn.device.pms.api.PmsGeneralDeviceInfoClient; import com.njcn.device.pms.api.StatationStatClient; @@ -21,17 +30,22 @@ import com.njcn.device.pq.api.GeneralDeviceInfoClient; import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.api.SubstationFeignClient; import com.njcn.device.pq.pojo.dto.*; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; import com.njcn.harmonic.constant.Param; import com.njcn.harmonic.mapper.*; import com.njcn.harmonic.pojo.dto.PublicDTO; import com.njcn.harmonic.pojo.param.HarmonicPublicParam; import com.njcn.harmonic.pojo.param.PollutionSubstationQuryParam; +import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; import com.njcn.harmonic.pojo.po.*; import com.njcn.harmonic.pojo.vo.PollutionSubstationVO; import com.njcn.harmonic.pojo.vo.PollutionVO; import com.njcn.harmonic.service.PollutionSubstationService; +import com.njcn.system.api.DicDataFeignClient; +import com.njcn.system.enums.DicDataEnum; import com.njcn.user.api.DeptFeignClient; import com.njcn.user.pojo.po.Dept; +import com.njcn.web.factory.PageFactory; import com.njcn.web.utils.RequestUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -88,6 +102,8 @@ public class PollutionSubstationServiceImpl extends ServiceImpl deptGetChildrenMoreDTOS = commTerminalGeneralClient.deptGetSubStationInfo(deptGetLineParam).getData(); + //获取全部变电站信息 + List collect = deptGetChildrenMoreDTOS.stream().flatMap(x -> x.getStationIds().stream()).collect(Collectors.toList()); + //全部变电站 + List subAll = collect.stream().map(SubGetBase::getId).distinct().collect(Collectors.toList()); + //国网变电站 + List subGw = collect.stream().filter(x -> 1==x.getIsUpToGrid()).map(SubGetBase::getId).distinct().collect(Collectors.toList()); + + GridDiagramVO vo=new GridDiagramVO(); + List info = new ArrayList<>(); + List gwInfo = new ArrayList<>(); + if(CollUtil.isNotEmpty(subAll)){ + switch (param.getType()){ + case 1: + List substationYlist = pollutionSubstationYPOMapper.selectList(new LambdaQueryWrapper() + .select(RStatPollutionSubstationYPO::getSubstationId,RStatPollutionSubstationYPO::getValue) + .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationYPO::getSubstationId, subAll) + .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationYPO::getPollutionType, param.getIds()) + .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationYPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) + .le(StrUtil.isNotBlank(param.getEndTime()), RStatPollutionSubstationYPO::getDataDate, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) + ); + info.addAll(substationYlist.stream().map(RStatPollutionSubstationYPO::getValue).collect(Collectors.toList())); + gwInfo.addAll(substationYlist.stream() + .filter(x->subGw.contains(x.getSubstationId())) + .map(RStatPollutionSubstationYPO::getValue).collect(Collectors.toList())); + break; + case 2: + List substationQlist = pollutionSubstationQPOMapper.selectList(new LambdaQueryWrapper() + .select(RStatPollutionSubstationQPO::getSubstationId,RStatPollutionSubstationQPO::getValue) + .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationQPO::getSubstationId, subAll) + .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationQPO::getPollutionType, param.getIds()) + .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationQPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) + .le(StrUtil.isNotBlank(param.getEndTime()), RStatPollutionSubstationQPO::getDataDate, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) + ); + info.addAll(substationQlist.stream().map(RStatPollutionSubstationQPO::getValue).collect(Collectors.toList())); + gwInfo.addAll(substationQlist.stream() + .filter(x->subGw.contains(x.getSubstationId())) + .map(RStatPollutionSubstationQPO::getValue).collect(Collectors.toList())); + break; + case 3: + List substationMlist = pollutionSubstationMMapper.selectList(new LambdaQueryWrapper() + .select(RStatPollutionSubstationM::getSubstationId,RStatPollutionSubstationM::getValue) + .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationM::getSubstationId, subAll) + .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationM::getPollutionType, param.getIds()) + .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationM::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) + .le(StrUtil.isNotBlank(param.getEndTime()), RStatPollutionSubstationM::getDataDate, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) + ); + info.addAll(substationMlist.stream().map(RStatPollutionSubstationM::getValue).collect(Collectors.toList())); + gwInfo.addAll(substationMlist.stream() + .filter(x->subGw.contains(x.getSubstationId())) + .map(RStatPollutionSubstationM::getValue).collect(Collectors.toList())); + break; + case 4: + List substationDlist = pollutionSubstationDPOMapper.selectList(new LambdaQueryWrapper() + .select(RStatPollutionSubstationDPO::getSubstationId,RStatPollutionSubstationDPO::getValue) + .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationDPO::getSubstationId, subAll) + .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationDPO::getPollutionType, param.getIds()) + .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationDPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) + .le(StrUtil.isNotBlank(param.getEndTime()), RStatPollutionSubstationDPO::getDataDate, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) + ); + info.addAll(substationDlist.stream().map(RStatPollutionSubstationDPO::getValue).collect(Collectors.toList())); + gwInfo.addAll(substationDlist.stream() + .filter(x->subGw.contains(x.getSubstationId())) + .map(RStatPollutionSubstationDPO::getValue).collect(Collectors.toList())); + break; + + } + } + vo.setInfo(info); + vo.setGwInfo(gwInfo); + return vo; + } + + @Override + public Page getPollutionAlarmPageData(StatSubstationBizBaseParam param) { + Map map=new HashMap<>(); + map.put("V",dicDataFeignClient.getDicDataByCode(DicDataEnum.V_HARMONIC.getCode()).getData().getId()); + map.put("I",dicDataFeignClient.getDicDataByCode(DicDataEnum.I_ALL.getCode()).getData().getId()); + DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); + deptGetLineParam.setDeptId(param.getId()); + List deptGetChildrenMoreDTOS = commTerminalGeneralClient.deptGetSubStationInfo(deptGetLineParam).getData(); + //获取全部变电站信息 + List collect = deptGetChildrenMoreDTOS.stream().flatMap(x -> x.getStationIds().stream()).collect(Collectors.toList()); + ArrayList substationList = collect.stream().collect(Collectors.collectingAndThen + (Collectors.toCollection(() -> + new TreeSet<>(Comparator.comparing(o -> o.getId()))), ArrayList::new)); + + //根据部门统计有多少干扰源(设备数量) + Map substationMap = substationList.stream().collect(Collectors.toMap(SubGetBase::getId, Function.identity())); + + List subIDS=new ArrayList<>(); + if(0==param.getType()){ + //全部变电站 + subIDS.addAll(collect.stream().map(SubGetBase::getId).distinct().collect(Collectors.toList())); + }else{ + //国网变电站 + subIDS.addAll(collect.stream().filter(x -> 1==x.getIsUpToGrid()).map(SubGetBase::getId).distinct().collect(Collectors.toList())); + } + Page pollutionPage = pollutionSubstationMMapper.selectBySubstationPage(new Page<>(param.getPageNum(), param.getPageSize()) + , subIDS, map, param.getStartTime(), param.getEndTime()); + + List records = pollutionPage.getRecords(); + if(CollUtil.isNotEmpty(records)){ + records.forEach(x->{ + if(substationMap.containsKey(x.getId())){ + SubGetBase subGetBase = substationMap.get(x.getId()); + x.setName(subGetBase.getName()); + x.setPowerCompany(subGetBase.getOrgName()); + x.setVoltageLevel(subGetBase.getVoltageLevel()); + } + }); + } + return pollutionPage; + } + } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/RMpTargetWarnDServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/RMpTargetWarnDServiceImpl.java new file mode 100644 index 000000000..4cb378a65 --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/RMpTargetWarnDServiceImpl.java @@ -0,0 +1,179 @@ +package com.njcn.harmonic.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njcn.device.biz.commApi.CommTerminalGeneralClient; +import com.njcn.device.biz.pojo.dto.DeptGetSubStationDTO; +import com.njcn.device.biz.pojo.dto.SubGetBase; +import com.njcn.device.biz.pojo.param.DeptGetLineParam; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; +import com.njcn.harmonic.mapper.RMpTargetWarnDMapper; +import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam; +import com.njcn.harmonic.pojo.po.RMpTargetWarnDPO; +import com.njcn.harmonic.service.IRMpTargetWarnDService; +import com.njcn.system.api.DicDataFeignClient; +import com.njcn.system.enums.DicDataEnum; +import com.njcn.system.enums.DicDataTypeEnum; +import com.njcn.system.pojo.po.DictData; +import com.njcn.user.api.DeptFeignClient; +import com.njcn.user.pojo.po.Dept; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + *

+ * 服务实现类 + *

+ * + * @author wr + * @since 2024-04-19 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class RMpTargetWarnDServiceImpl extends ServiceImpl implements IRMpTargetWarnDService { + + private final DeptFeignClient deptFeignClient; + private final DicDataFeignClient dicDataFeignClient; + private final CommTerminalGeneralClient commTerminalGeneralClient; + + @Override + public GridDiagramVO getSubLineGiveAnAlarm(StatSubstationBizBaseParam param) { + //获取电压等级 + List dictDataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE_STAND.getCode()).getData(); + + //获取电压等级550 220 110 35 + List voltageIds = dictDataList.stream().filter(item -> + Objects.equals(DicDataEnum.DY_500KV.getCode(), item.getCode()) || + Objects.equals(DicDataEnum.DY_220KV.getCode(), item.getCode()) || + Objects.equals(DicDataEnum.DY_110KV.getCode(), item.getCode()) || + Objects.equals(DicDataEnum.DY_35KV.getCode(), item.getCode()) + ).sorted(Comparator.comparing(DictData::getSort).reversed()).map(DictData::getId).collect(Collectors.toList()); + + + GridDiagramVO gridDiagramVO = new GridDiagramVO(); + List info = new ArrayList<>(); + List gwInfo = new ArrayList<>(); + + //获取部门数据关系 + List data = deptFeignClient.getDirectSonSelf(param.getId()).getData(); + DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); + deptGetLineParam.setDeptId(param.getId()); + List deptGetChildrenMoreDTOS = commTerminalGeneralClient.deptGetSubStationInfo(deptGetLineParam).getData(); + + List lineIDS = deptGetChildrenMoreDTOS.stream() + .flatMap(x -> x.getStationIds().stream().flatMap(l -> l.getUnitChildrenList().stream())) + .collect(Collectors.toList()); + + + List list = this.list(new QueryWrapper() + .select("measurement_point_id,sum(is_warn) as isWarn") + .in(CollUtil.isNotEmpty(lineIDS), "measurement_point_id", lineIDS) + .ge(StrUtil.isNotBlank(param.getStartTime()), "data_date", DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) + .le(StrUtil.isNotBlank(param.getEndTime()), "data_date", DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) + .groupBy("measurement_point_id") + ); + + + + Map deptLineMap = deptGetChildrenMoreDTOS.stream().collect(Collectors.toMap(DeptGetSubStationDTO.Info::getUnitId, Function.identity())); + GridDiagramVO.LineStatistics lineStatistics; + GridDiagramVO.LineStatistics gwLineStatistics; + for (Dept datum : data) { + if (deptLineMap.containsKey(datum.getId())) { + lineStatistics = new GridDiagramVO.LineStatistics(); + lineStatistics.setOrgId(datum.getId()); + lineStatistics.setOrgName(datum.getName()); + gwLineStatistics = new GridDiagramVO.LineStatistics(); + gwLineStatistics.setOrgId(datum.getId()); + gwLineStatistics.setOrgName(datum.getName()); + List subBaseList = deptLineMap.get(datum.getId()).getStationIds(); + List statisticsData = new ArrayList<>(); + List gwStatisticsData = new ArrayList<>(); + getSubStationStatisticsData(statisticsData, gwStatisticsData, subBaseList, voltageIds, list); + lineStatistics.setData(statisticsData); + gwLineStatistics.setData(gwStatisticsData); + + info.add(lineStatistics); + gwInfo.add(gwLineStatistics); + } + } + gridDiagramVO.setInfo(info); + gridDiagramVO.setGwInfo(gwInfo); + return gridDiagramVO; + } + + private void getSubStationStatisticsData(List statisticsData, + List gwStatisticsData, + List subBaseList, + List voltageIds, + List list + ) { + long countOne= 0; + long countTow= 0; + long gwCountOne= 0; + long gwCountTow= 0; + GridDiagramVO.StatisticsData data; + for (String voltageId : voltageIds) { + for (int i = 0; i < 2; i++) { + data=new GridDiagramVO.StatisticsData(); + int finalI = i; + long count = subBaseList.stream() + .filter(x -> getIsUpToGrid(finalI,x,voltageId)) + .distinct() + .count(); + data.setNumOne(count); + + AtomicLong num= new AtomicLong(); + subBaseList.stream().filter(x -> getIsUpToGrid(finalI, x, voltageId)).forEach(x -> { + List line=new ArrayList<>(); + if(finalI==0){ + line.addAll(x.getUnitChildrenList()); + }else{ + line.addAll(x.getGwUnitChildrenList()); + } + int sum = list.stream().filter(d -> line.contains(d.getMeasurementPointId())).mapToInt(RMpTargetWarnDPO::getIsWarn).sum(); + if (sum > 0) { + num.getAndIncrement(); + } + }); + data.setNumTwo(num.get()); + if(i==0){ + countOne+=count; + countTow+=num.get(); + statisticsData.add(data); + }else{ + gwCountOne+=count; + gwCountTow+=num.get(); + gwStatisticsData.add(data); + } + } + } + data=new GridDiagramVO.StatisticsData(); + data.setNumOne(countOne); + data.setNumTwo(countTow); + statisticsData.add(data); + data=new GridDiagramVO.StatisticsData(); + data.setNumOne(gwCountOne); + data.setNumTwo(gwCountTow); + gwStatisticsData.add(data); + + } + private Boolean getIsUpToGrid(Integer type, SubGetBase subGetBase, String voltageId) { + //0:全部 1:国网上送监测点 + if(type == 0){ + return voltageId.equals(subGetBase.getVoltageLevel()); + }else{ + return voltageId.equals(subGetBase.getVoltageLevel()) && 1 == subGetBase.getIsUpToGrid(); + } + } +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/GridDiagramService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/GridDiagramService.java new file mode 100644 index 000000000..b4c9cfc1e --- /dev/null +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/GridDiagramService.java @@ -0,0 +1,17 @@ +package com.njcn.harmonic.service.majornetwork; + +import java.util.List; + +/** + * @author wr + * @description 冀北电网一张图 + * @date 2024/4/16 13:11 + */ +public interface GridDiagramService { + + + + List getGridDiagramList(); + + +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/RStatLimitService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/RStatLimitService.java index 981413632..01d11207b 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/RStatLimitService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/RStatLimitService.java @@ -1,5 +1,7 @@ package com.njcn.harmonic.service.majornetwork; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; import com.njcn.harmonic.pojo.po.day.RStatLimitTargetDPO; @@ -23,5 +25,5 @@ public interface RStatLimitService { List monitorIdsGetLimitTargetInfo(String date, List monitorIds); - + List getGridDiagramLineData(DeviceInfoParam.BusinessParam deviceInfoParam); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java index a1c38a51c..cbc998294 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java @@ -1,6 +1,20 @@ package com.njcn.harmonic.service.majornetwork.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.njcn.device.pq.api.GeneralDeviceInfoClient; +import com.njcn.device.pq.api.LineIntegrityClient; +import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.param.OnlineRateParam; +import com.njcn.device.pq.pojo.po.RStatIntegrityD; +import com.njcn.device.pq.pojo.po.RStatOnlinerateD; +import com.njcn.device.pq.pojo.vo.GridDiagramVO; +import com.njcn.device.pq.pojo.vo.RStatOnlinerateVO; +import com.njcn.device.pq.pojo.vo.TerminalTree; import com.njcn.harmonic.mapper.RStatLimitRateDMapper; import com.njcn.harmonic.mapper.RStatLimitTargetDMapper; import com.njcn.harmonic.mapper.RStatLimitTargetMapper; @@ -10,7 +24,11 @@ import com.njcn.harmonic.service.majornetwork.RStatLimitService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * pqs @@ -22,15 +40,10 @@ import java.util.List; @RequiredArgsConstructor public class RStatLimitServiceImpl implements RStatLimitService { - private final RStatLimitRateDMapper rStatLimitRateDMapper; - private final RStatLimitTargetDMapper rStatLimitTargetDMapper; - - - - - + private final GeneralDeviceInfoClient generalDeviceInfoClient; + private final LineIntegrityClient lineIntegrityClient; @Override public List monitorIdsGetLimitRateInfo(String date, List monitorIds) { @@ -43,4 +56,99 @@ public class RStatLimitServiceImpl implements RStatLimitService { return rStatLimitTargetDMapper.selectList(new LambdaQueryWrapper().in(RStatLimitTargetDPO::getLineId,monitorIds) .eq(RStatLimitTargetDPO::getTime,date).gt(RStatLimitTargetDPO::getAllTime,0)); } + + @Override + public List getGridDiagramLineData(DeviceInfoParam.BusinessParam deviceInfoParam) { + List info=new ArrayList<>(); + + List data = generalDeviceInfoClient.getPracticalRunDeviceInfo(deviceInfoParam).getData(); + List list = data.stream().sorted(Comparator.comparing(x -> x.getLineIndexes().size(),Comparator.reverseOrder())).collect(Collectors.toList()); + //终端总数量 + List devIds = list.stream().flatMap(x -> x.getDeviceIndexes().stream()).distinct().collect(Collectors.toList()); + //监测点总数量 + List lineIds = list.stream().flatMap(x -> x.getLineIndexes().stream()).distinct().collect(Collectors.toList()); + //超标监测点信息 + List limitTargetList = rStatLimitTargetDMapper.selectList(new LambdaQueryWrapper() + .select(RStatLimitTargetDPO::getLineId, RStatLimitTargetDPO::getAllTime, RStatLimitTargetDPO::getFlickerAllTime) + .in(RStatLimitTargetDPO::getLineId, lineIds) + .ge(StrUtil.isNotBlank(deviceInfoParam.getSearchBeginTime()), RStatLimitTargetDPO::getTime, DateUtil.beginOfDay(DateUtil.parse(deviceInfoParam.getSearchBeginTime()))) + .le(StrUtil.isNotBlank(deviceInfoParam.getSearchEndTime()), RStatLimitTargetDPO::getTime, DateUtil.endOfDay(DateUtil.parse(deviceInfoParam.getSearchEndTime())))); + + //终端在线率 + OnlineRateParam param=new OnlineRateParam(); + param.setIds(devIds); + param.setStartTime(deviceInfoParam.getSearchBeginTime()); + param.setEndTime(deviceInfoParam.getSearchEndTime()); + List onlineRateList = generalDeviceInfoClient.getOnlineRateByDevIds(param).getData(); + List integrityList = lineIntegrityClient.getIntegrityByLineIds(lineIds, deviceInfoParam.getSearchBeginTime(), deviceInfoParam.getSearchEndTime()).getData(); + List topList=new ArrayList<>(); + List otherList=new ArrayList<>(); + if(list.size()>4){ + topList.addAll(list.subList(0, 4)); + otherList.addAll(list.subList(4, list.size())); + }else{ + if(list.size()>3){ + topList.addAll(list.subList(0, 3)); + otherList.addAll(list.subList(3, list.size())); + }else{ + if(list.size()>2){ + topList.addAll(list.subList(0, 2)); + otherList.addAll(list.subList(2, list.size())); + }else{ + topList.addAll(list.subList(0, 1)); + otherList.addAll(list.subList(1, list.size())); + } + } + } + GridDiagramVO.LineData lineData; + for (GeneralDeviceDTO dto : topList) { + lineData=new GridDiagramVO.LineData(); + lineData.setOrgId(dto.getIndex()); + lineData.setOrgName(dto.getName()+"("+dto.getLineIndexes().size()+")"); + onLineAndIntegrity(dto.getLineIndexes(), integrityList, dto.getDeviceIndexes(), onlineRateList,limitTargetList, lineData); + info.add(lineData); + } + List otherDevIds = otherList.stream().flatMap(x -> x.getDeviceIndexes().stream()).distinct().collect(Collectors.toList()); + List otherLineIds = otherList.stream().flatMap(x -> x.getLineIndexes().stream()).distinct().collect(Collectors.toList()); + lineData=new GridDiagramVO.LineData(); + lineData.setOrgId("123456"); + lineData.setOrgName("其他("+otherLineIds.size()+")"); + onLineAndIntegrity(otherLineIds, integrityList, otherDevIds, onlineRateList,limitTargetList, lineData); + info.add(lineData); + + + return info; + } + + private void onLineAndIntegrity(List lineIds, List onIntegrityByIds, List devIds, List onlineRateByDevIds,List limitTargetList, GridDiagramVO.LineData lineData) { + //监测完整率 + List integrityDS = onIntegrityByIds.stream().filter(x -> lineIds.contains(x.getLineIndex())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(integrityDS)) { + double realTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getRealTime).sum(); + double dueTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getDueTime).sum(); + lineData.setIntegrityRate(NumberUtil.round(realTime * 100 / dueTime, 2).floatValue()); + } else { + lineData.setIntegrityRate(0.0f); + } + //终端在线率 + List onlineRateDS = onlineRateByDevIds.stream().filter(x -> devIds.contains(x.getDevIndex())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(onlineRateDS)) { + double onlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateVO::getOnlineMin).sum(); + double offlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateVO::getOfflineMin).sum(); + lineData.setOnLineRate(NumberUtil.round(onlineTime * 100 / onlineTime + offlineTime, 2).floatValue()); + } else { + lineData.setOnLineRate(0.0f); + } + //监测点超标占比 + List limitTarget = limitTargetList.stream().filter(x -> lineIds.contains(x.getLineId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(limitTarget)) { + long count = limitTarget.stream() + .filter(x -> x.getAllTime() > 0 || x.getFlickerAllTime() > 0) + .distinct() + .map(RStatLimitTargetDPO::getLineId).count(); + lineData.setOutOfStandardRate(NumberUtil.round(count * 100.0 / limitTarget.size(), 2).floatValue()); + } else { + lineData.setOutOfStandardRate(0.0f); + } + } } diff --git a/pqs-system/system-api/src/main/java/com/njcn/system/enums/DicDataEnum.java b/pqs-system/system-api/src/main/java/com/njcn/system/enums/DicDataEnum.java index e403043b0..6ef6597a1 100644 --- a/pqs-system/system-api/src/main/java/com/njcn/system/enums/DicDataEnum.java +++ b/pqs-system/system-api/src/main/java/com/njcn/system/enums/DicDataEnum.java @@ -576,9 +576,12 @@ public enum DicDataEnum { SPECIAL_USER("专变用户","special_user"),//专变用户 PUBLIC_USER("公变用户","public_user"),// ,公变用户 + /**pms******************************end*/ - - /**pms******************************end*/ + //pq干扰源类型 + PQ_ELE_RAILWAYS("电气化铁路","Ele_Railways"), + PQ_POWER_STATION("光伏电站","Power_Station"), + PQ_WIND_FARMS("风电场","Electrolytic_Load"), ; private final String name;