1.台账接口调整

2.数据清洗相关功能
This commit is contained in:
2025-03-27 10:09:01 +08:00
parent d2ebf3fca8
commit 7d5672809f
15 changed files with 400 additions and 11 deletions

View File

@@ -97,7 +97,10 @@ public enum DeviceResponseEnum {
LINE_GRADE_INDEX_ERR("A0362","异常等级索引"), LINE_GRADE_INDEX_ERR("A0362","异常等级索引"),
LINE_GRADE_LESS("A0363","监测点等级策略缺失"), LINE_GRADE_LESS("A0363","监测点等级策略缺失"),
FLOW_UPDATE("A0364","默认类型必须存在一个"), FLOW_UPDATE("A0364","默认类型必须存在一个"),
NEWSTATION_IS_BIND_LINE("A0365","已绑定监测点") NEWSTATION_IS_BIND_LINE("A0365","已绑定监测点"),
LINE_USER_EMPTY("A0366","用户侧监测点用户对象名称不可为空"),
LINE_NO_USER_EMPTY("A0367","电网侧监测点无需绑定用户对象")
; ;

View File

@@ -39,7 +39,13 @@ public enum LineBaseEnum {
* 电网标志 * 电网标志
*/ */
POWER_FLAG(0,"电网侧"), POWER_FLAG(0,"电网侧"),
POWER_FLAG_NOT(1,"非电网侧") POWER_FLAG_NOT(1,"非电网侧"),
RUN(0,"在运"),
WAITE_RUN(1,"调试"),
STOP_RUN(2,"停运")
; ;

View File

@@ -124,9 +124,11 @@ public class LineParam {
private String objId; private String objId;
@ApiModelProperty(name = "bigObjType",value = "对象大类") @ApiModelProperty(name = "bigObjType",value = "对象大类")
@NotBlank(message = "对象大类不可为空")
private String bigObjType; private String bigObjType;
@ApiModelProperty(name = "smallObjType",value = "对象小类") @ApiModelProperty(name = "smallObjType",value = "对象小类")
@NotBlank(message = "对象小类不可为空")
private String smallObjType; private String smallObjType;
/** /**

View File

@@ -0,0 +1,22 @@
package com.njcn.device.pq.pojo.param.dataClean;
import com.njcn.web.pojo.param.BaseParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @Author: cdf
* @CreateTime: 2025-03-26
* @Description:
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MonitorBaseParam extends BaseParam {
private String deptId;
private String objType;
}

View File

@@ -0,0 +1,76 @@
package com.njcn.device.pq.pojo.po;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.bo.BaseEntity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
*
* </p>
*
* @author cdf
* @since 2025-03-26
*/
@Getter
@Setter
@TableName("pq_data_verify")
public class DataVerify {
/**
* 监测点id
*/
private String lineId;
/**
* 异常数据时间
*/
private LocalDateTime time;
/**
* 数据类型(最大值max、最小值min、平均值avg、95值cp95)
*/
private String valueType;
/**
* 相别:"A" "B" "C" "ABC" "T"
*/
private String phasicType;
/**
* 指标code
*/
private String indexCode;
/**
* 指标名称
*/
private String indexName;
/**
* 指标表名
*/
private String indexTable;
/**
* 异常值
*/
private BigDecimal abnormalValue;
/**
* 指标上限
*/
private BigDecimal minValue;
/**
* 指标下限
*/
private BigDecimal maxValue;
}

View File

@@ -0,0 +1,17 @@
package com.njcn.device.pq.pojo.vo.dataClean;
import lombok.Data;
/**
* @Author: cdf
* @CreateTime: 2025-03-26
* @Description: 异常测点
*/
@Data
public class VerifyMonitorVO {
private Integer runNum;
private Integer abnormalNum;
}

View File

@@ -0,0 +1,9 @@
package com.njcn.device.pq.controller;
/**
* @Author: cdf
* @CreateTime: 2025-03-26
* @Description: 异常数据清洗
*/
public class AbnormalDataController {
}

View File

@@ -0,0 +1,69 @@
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.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam;
import com.njcn.device.pq.pojo.vo.AlarmStrategyVO;
import com.njcn.device.pq.pojo.vo.dataClean.VerifyMonitorVO;
import com.njcn.device.pq.service.IDataVerifyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
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 com.njcn.web.controller.BaseController;
import java.util.List;
import java.util.Map;
/**
* <p>
* 异常数据功能
* </p>
*
* @author cdf
* @since 2025-03-26
*/
@RestController
@RequestMapping("/dataVerify")
@RequiredArgsConstructor
@Api(tags = "异常数据功能")
public class DataVerifyController extends BaseController {
private final IDataVerifyService iDataVerifyService;
/**
* 获取异常监测点相关信息
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/getMonitorVerifyData")
@ApiOperation("获取异常监测点相关信息")
public HttpResult<VerifyMonitorVO> getMonitorVerifyData(@RequestBody MonitorBaseParam monitorBaseParam){
String methodDescribe = getMethodDescribe("getMonitorVerifyData");
VerifyMonitorVO verifyMonitorVO = iDataVerifyService.getMonitorVerifyData(monitorBaseParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, verifyMonitorVO, methodDescribe);
}
/**
* 获取时间范围异常测点数量
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/getRangeAbnormalMonitor")
@ApiOperation("获取异常监测点相关信息")
public HttpResult<List<Map<String,Object>>> getRangeAbnormalMonitor(@RequestBody MonitorBaseParam monitorBaseParam){
String methodDescribe = getMethodDescribe("getRangeAbnormalMonitor");
List<Map<String,Object>> verifyMonitorVO = iDataVerifyService.getRangeAbnormalMonitor(monitorBaseParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, verifyMonitorVO, methodDescribe);
}
}

View File

@@ -0,0 +1,17 @@
package com.njcn.device.pq.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.device.pq.pojo.po.DataVerify;
/**
* <p>
* Mapper 接口
* </p>
*
* @author cdf
* @since 2025-03-26
*/
public interface DataVerifyMapper extends BaseMapper<DataVerify> {
}

View File

@@ -86,4 +86,9 @@ public interface CommTerminalService {
List<DeptGetSubStationDTO.Info> deptSubStationInfo(DeptGetLineParam deptGetLineParam); List<DeptGetSubStationDTO.Info> deptSubStationInfo(DeptGetLineParam deptGetLineParam);
List<SubGetBase> tagOrIdGetSub(SubstationParam substationParam); List<SubGetBase> tagOrIdGetSub(SubstationParam substationParam);
/**
* 通过部门id获取在运测点
*/
List<String> getRunMonitorByDept(String deptId);
} }

View File

@@ -0,0 +1,27 @@
package com.njcn.device.pq.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam;
import com.njcn.device.pq.pojo.po.DataVerify;
import com.njcn.device.pq.pojo.vo.dataClean.VerifyMonitorVO;
import java.util.List;
import java.util.Map;
/**
* <p>
* 服务类
* </p>
*
* @author cdf
* @since 2025-03-26
*/
public interface IDataVerifyService extends IService<DataVerify> {
VerifyMonitorVO getMonitorVerifyData(MonitorBaseParam monitorBaseParam);
List<Map<String,Object>> getRangeAbnormalMonitor(MonitorBaseParam monitorBaseParam);
}

View File

@@ -9,11 +9,13 @@ import com.njcn.common.utils.EnumUtils;
import com.njcn.device.biz.pojo.dto.*; import com.njcn.device.biz.pojo.dto.*;
import com.njcn.device.biz.pojo.param.DeptGetLineParam; import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.device.biz.pojo.param.SubstationParam; import com.njcn.device.biz.pojo.param.SubstationParam;
import com.njcn.device.pq.enums.LineBaseEnum;
import com.njcn.device.pq.mapper.LineMapper; import com.njcn.device.pq.mapper.LineMapper;
import com.njcn.device.pq.mapper.OverlimitMapper; import com.njcn.device.pq.mapper.OverlimitMapper;
import com.njcn.device.pq.service.CommTerminalService; import com.njcn.device.pq.service.CommTerminalService;
import com.njcn.device.pq.service.DeptLineService; import com.njcn.device.pq.service.DeptLineService;
import com.njcn.redis.utils.RedisUtil; import com.njcn.redis.utils.RedisUtil;
import com.njcn.system.enums.DicDataEnum;
import com.njcn.user.api.DeptFeignClient; import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.dto.DeptDTO; import com.njcn.user.pojo.dto.DeptDTO;
import com.njcn.user.pojo.po.Dept; import com.njcn.user.pojo.po.Dept;
@@ -289,6 +291,13 @@ public class CommTerminalServiceImpl implements CommTerminalService {
return subStationList; return subStationList;
} }
@Override
public List<String> getRunMonitorByDept(String deptId) {
List<String> ids = deptFeignClient.getDepSonIdtByDeptId(deptId).getData();
List<String> monitorIds = deptLineService.getLineByDeptIds(ids,Stream.of(LineBaseEnum.RUN.getCode()).collect(Collectors.toList()),Stream.of(0,1,2).collect(Collectors.toList()));
return monitorIds;
}
private List<Integer> filterDataTypeNew(String serverName) { private List<Integer> filterDataTypeNew(String serverName) {
List<Integer> devType = new ArrayList<>(); List<Integer> devType = new ArrayList<>();

View File

@@ -0,0 +1,95 @@
package com.njcn.device.pq.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.device.pq.mapper.DataVerifyMapper;
import com.njcn.device.pq.mapper.LineMapper;
import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam;
import com.njcn.device.pq.pojo.po.DataVerify;
import com.njcn.device.pq.pojo.vo.dataClean.VerifyMonitorVO;
import com.njcn.device.pq.service.CommTerminalService;
import com.njcn.device.pq.service.IDataVerifyService;
import com.njcn.device.pq.service.LineService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
* 服务实现类
* </p>
*
* @author cdf
* @since 2025-03-26
*/
@Service
@RequiredArgsConstructor
public class DataVerifyServiceImpl extends ServiceImpl<DataVerifyMapper, DataVerify> implements IDataVerifyService {
private final CommTerminalService commTerminalService;
@Override
public VerifyMonitorVO getMonitorVerifyData(MonitorBaseParam monitorBaseParam) {
List<String> monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam.getDeptId());
LambdaQueryWrapper<DataVerify> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.select(DataVerify::getLineId).between(DataVerify::getTime, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())),DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime())))
.in(DataVerify::getLineId,monitorIds).groupBy(DataVerify::getLineId);
List<DataVerify> list = this.list(lambdaQueryWrapper);
VerifyMonitorVO verifyMonitorVO = new VerifyMonitorVO();
verifyMonitorVO.setRunNum(monitorIds.size());
verifyMonitorVO.setAbnormalNum(list.size());
return verifyMonitorVO;
}
@Override
public List<Map<String, Object>> getRangeAbnormalMonitor(MonitorBaseParam monitorBaseParam) {
List<Map<String, Object>> result = new ArrayList<>();
List<String> monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam.getDeptId());
LambdaQueryWrapper<DataVerify> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.between(DataVerify::getTime, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())),DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime())))
.in(DataVerify::getLineId,monitorIds);
List<DataVerify> dataVerifyList = this.list(lambdaQueryWrapper);
DateTime startTime = DateUtil.parse(monitorBaseParam.getSearchBeginTime());
DateTime endTime = DateUtil.parse(monitorBaseParam.getSearchEndTime());
if(startTime.year() == endTime.year() && startTime.month() == endTime.month()){
DateRange ranged = DateUtil.range(DateUtil.parse(monitorBaseParam.getSearchBeginTime()),DateUtil.parse(monitorBaseParam.getSearchEndTime()), DateField.DAY_OF_MONTH);
Map<String,Integer> map = dataVerifyList.stream().collect(Collectors.groupingBy(it->it.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)),
Collectors.mapping(DataVerify::getLineId, Collectors.collectingAndThen(Collectors.toSet(), Set::size))));
for (DateTime dateTime : ranged) {
Map<String, Object> rangeMap = new HashMap<>();
String time = DateUtil.format(dateTime, DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN));
rangeMap.put("time", time);
rangeMap.put("val", map.getOrDefault(time, 0));
result.add(rangeMap);
}
}else {
//不在一个月则展示月数据
DateRange ranged = DateUtil.range(DateUtil.parse(monitorBaseParam.getSearchBeginTime()),DateUtil.parse(monitorBaseParam.getSearchEndTime()), DateField.MONTH);
if(CollUtil.isNotEmpty(dataVerifyList)){
Map<String,Integer> map = dataVerifyList.stream().collect(Collectors.groupingBy(it->it.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN)),
Collectors.mapping(DataVerify::getLineId, Collectors.collectingAndThen(Collectors.toSet(), Set::size))));
for (DateTime dateTime : ranged) {
Map<String, Object> rangeMap = new HashMap<>();
String time = DateUtil.format(dateTime, DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN));
rangeMap.put("time", time);
rangeMap.put("val", map.getOrDefault(time, 0));
result.add(rangeMap);
}
}
}
return result;
}
}

View File

@@ -479,6 +479,17 @@ public class TerminalBaseServiceImpl extends ServiceImpl<LineMapper, Line> imple
lineDetail.setMonitorFlag(0); lineDetail.setMonitorFlag(0);
} }
if(lineDetail.getPowerFlag() == 1){
//用户侧objId不可为空
if(StrUtil.isBlank(lineDetail.getObjId())){
throw new BusinessException(DeviceResponseEnum.LINE_USER_EMPTY);
}
}else {
if(StrUtil.isNotBlank(lineDetail.getObjId())){
throw new BusinessException(DeviceResponseEnum.LINE_NO_USER_EMPTY);
}
}
lineDetailMapper.insert(lineDetail); lineDetailMapper.insert(lineDetail);
if(StrUtil.isNotBlank(lineDetail.getObjId())){ if(StrUtil.isNotBlank(lineDetail.getObjId())){
userLedgerFeignClient.bindUserStation(lineDetail.getObjId(),subIndex); userLedgerFeignClient.bindUserStation(lineDetail.getObjId(),subIndex);
@@ -802,6 +813,17 @@ public class TerminalBaseServiceImpl extends ServiceImpl<LineMapper, Line> imple
} else { } else {
lineDetail.setMonitorFlag(0); lineDetail.setMonitorFlag(0);
} }
if(lineDetail.getPowerFlag() == 1){
//用户侧objId不可为空
if(StrUtil.isBlank(lineDetail.getObjId())){
throw new BusinessException(DeviceResponseEnum.LINE_USER_EMPTY);
}
}else {
if(StrUtil.isNotBlank(lineDetail.getObjId())){
throw new BusinessException(DeviceResponseEnum.LINE_NO_USER_EMPTY);
}
}
lineDetailMapper.updateById(lineDetail); lineDetailMapper.updateById(lineDetail);
if(StrUtil.isNotBlank(lineDetail.getObjId())){ if(StrUtil.isNotBlank(lineDetail.getObjId())){

View File

@@ -76,7 +76,6 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
*/ */
@Override @Override
public List<TerminalTree> getTerminalTree() { public List<TerminalTree> getTerminalTree() {
List<TerminalTree> taiZhang = new ArrayList<>();
List<TerminalTree> allList = lineMapper.getAllList(); List<TerminalTree> allList = lineMapper.getAllList();
List<TerminalTree> projectList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.PROJECT_LEVEL.getCode())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList()); List<TerminalTree> projectList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.PROJECT_LEVEL.getCode())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> provinceList = lineMapper.getProvinceList(null, 0); List<TerminalTree> provinceList = lineMapper.getProvinceList(null, 0);
@@ -88,22 +87,33 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
//处理存在用户的台账 //处理存在用户的台账
List<TerminalTree> newLineList = lineMapper.getLineAndLineDetail(); List<TerminalTree> newLineList = lineMapper.getLineAndLineDetail();
//用户侧测点
List<TerminalTree> userLineList = newLineList.stream().filter(it->StrUtil.isNotBlank(it.getObjId())).collect(Collectors.toList()); List<TerminalTree> userLineList = newLineList.stream().filter(it->StrUtil.isNotBlank(it.getObjId())).collect(Collectors.toList());
List<TerminalTree> otherLineList = newLineList.stream().filter(it->StrUtil.isBlank(it.getObjId())).collect(Collectors.toList());
//用户侧装置
List<String> devIds = userLineList.stream().map(it->it.getPids().split(StrUtil.COMMA)[LineBaseEnum.DEVICE_LEVEL.getCode()]).distinct().collect(Collectors.toList()); List<String> devIds = userLineList.stream().map(it->it.getPids().split(StrUtil.COMMA)[LineBaseEnum.DEVICE_LEVEL.getCode()]).distinct().collect(Collectors.toList());
List<TerminalTree> subvUserList = subvList.stream().filter(it->devIds.contains(it.getPid())).collect(Collectors.toList());
List<String> busBarIds = subvUserList.stream().map(TerminalTree::getId).distinct().collect(Collectors.toList());
List<TerminalTree> devUserList = devList.stream().filter(it->devIds.contains(it.getId())).collect(Collectors.toList()); List<TerminalTree> devUserList = devList.stream().filter(it->devIds.contains(it.getId())).collect(Collectors.toList());
//用户侧线路
List<TerminalTree> subvUserList = subvList.stream().filter(it->devIds.contains(it.getPid())).collect(Collectors.toList());
//电网侧测点
List<TerminalTree> otherLineList = newLineList.stream().filter(it->StrUtil.isBlank(it.getObjId())).collect(Collectors.toList());
//电网侧装置
List<String> devOtherIds = otherLineList.stream().map(it->it.getPids().split(StrUtil.COMMA)[LineBaseEnum.DEVICE_LEVEL.getCode()]).distinct().collect(Collectors.toList());
List<TerminalTree> devOtherList = devList.stream().filter(it->devOtherIds.contains(it.getId())).collect(Collectors.toList());
//电网侧线路
List<TerminalTree> subvOtherList = subvList.stream().filter(it->devOtherIds.contains(it.getPid())).collect(Collectors.toList());
//其他的台账默认时电网侧台账 //其他的台账默认时电网侧台账
List<TerminalTree> subvOtherList = subvList.stream().filter(it->!busBarIds.contains(it.getId())).collect(Collectors.toList()); /* List<TerminalTree> subvOtherList = subvList.stream().filter(it->!busBarIds.contains(it.getId())).collect(Collectors.toList());
List<TerminalTree> devOtherList = devList.stream().filter(it->!devIds.contains(it.getId())).collect(Collectors.toList()); List<TerminalTree> devOtherList = devList.stream().filter(it->!devIds.contains(it.getId())).collect(Collectors.toList());
*/
UserReportParam userReportParam = new UserReportParam(); UserReportParam userReportParam = new UserReportParam();
List<UserLedgerVO> userReportPOList = userLedgerFeignClient.selectUserList(userReportParam).getData(); List<UserLedgerVO> userReportPOList = userLedgerFeignClient.selectUserList(userReportParam).getData();
userReportPOList = userReportPOList.stream().filter(it->StrUtil.isNotBlank(it.getStationId())).collect(Collectors.toList()); userReportPOList = userReportPOList.stream().filter(it->StrUtil.isNotBlank(it.getStationId())).collect(Collectors.toList());