13 Commits

52 changed files with 11354 additions and 4972 deletions

12
pom.xml
View File

@@ -43,7 +43,7 @@
<!-- <middle.server.url>10.95.53.49</middle.server.url>-->
<middle.server.url>192.168.1.103</middle.server.url>
<!--微服务模块发布地址-->
<service.server.url>127.0.0.1</service.server.url>
<service.server.url>192.168.2.130</service.server.url>
<!--docker仓库地址-->
<docker.server.url>192.168.1.22</docker.server.url>
<!--nacos的ip:port-->
@@ -53,9 +53,9 @@
<!--nacos的ip:port-->
<nacos.password>nacos</nacos.password>
<!--服务器发布内容为空-->
<!-- <nacos.namespace></nacos.namespace>-->
<nacos.namespace>hswbpm</nacos.namespace>
<!-- <nacos.namespace>30c701c4-2a94-49d9-82e1-76aa9456573f</nacos.namespace>-->
<nacos.namespace>6fd2d036-f390-46ee-9c9d-d5a5c00e3314</nacos.namespace>
<!-- <nacos.namespace>12b467cc-a7e6-411d-8944-090cbfa09dde</nacos.namespace>-->
<!-- <nacos.namespace>910d0d69-2254-481b-b9f7-7ecf9cb881b0</nacos.namespace>-->
<!-- sentinel:port-->
<sentinel.url>${middle.server.url}:8080</sentinel.url>
@@ -81,6 +81,7 @@
<springcloud.alibaba.version>2.2.7.RELEASE</springcloud.alibaba.version>
<hutool.version>5.8.11</hutool.version>
<knife4j.version>3.0.2</knife4j.version>
<postgresql.version>42.3.8</postgresql.version>
<knife4j.aggregation.version>2.0.8</knife4j.aggregation.version>
<lombok.version>1.18.18</lombok.version>
<mybatis.version>2.1.3</mybatis.version>
@@ -171,6 +172,11 @@
<artifactId>knife4j-spring-ui</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-aggregation-spring-boot-starter</artifactId>

View File

@@ -25,6 +25,12 @@ public class SimpleDTO implements Serializable {
@ApiModelProperty(name = "value", value = "数值")
private String value;
/**
* 针对云南曲靖特殊处理的五层树标识符
* 特殊在不显示供电公司,显示(变电站、线路)这两个是部门的名称+母线_监测点的名称
*/
private String deptName;
private Integer sort;
private Integer algoDescribe;

View File

@@ -51,6 +51,10 @@ public interface CommTerminalGeneralClient {
@PostMapping("deptGetLine")
HttpResult<List<DeptGetChildrenMoreDTO>> deptGetLine(@RequestBody @Validated DeptGetLineParam deptGetLineParam);
@PostMapping("deptGetLineInfo")
HttpResult<List<MonitorCommLedgerInfoDTO>> deptGetLineInfo(@RequestBody @Validated DeptGetLineParam deptGetLineParam);
@PostMapping("deptGetAllLine")
HttpResult<List<DeptGetChildrenMoreDTO>> deptGetAllLine(@RequestBody @Validated DeptGetLineParam deptGetLineParam);

View File

@@ -15,6 +15,7 @@ import com.njcn.device.biz.utils.DeviceEnumUtil;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@@ -50,6 +51,13 @@ public class CommTerminalGeneralClientFallbackFactory implements FallbackFactory
throw new BusinessException(finalExceptionEnum);
}
@Override
public HttpResult<List<MonitorCommLedgerInfoDTO>> deptGetLineInfo(DeptGetLineParam deptGetLineParam) {
log.error("{}异常,降级处理,异常为:{}", "根据部门获取监测点信息", throwable.toString());
throw new BusinessException(finalExceptionEnum);
}
@Override
public HttpResult<List<DeptGetChildrenMoreDTO>> deptGetAllLine(DeptGetLineParam deptGetLineParam) {
log.error("{}异常,降级处理,异常为:{}", "根据单位获取all监测点信息", throwable.toString());

View File

@@ -0,0 +1,40 @@
package com.njcn.device.biz.pojo.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @Author: cdf
* @CreateTime: 2026-01-06
* @Description:
*/
@Data
public class MonitorCommLedgerInfoDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String monitorId;
private String monitorName;
private String gdName;
private String bdName;
private String busBarName;
private String voltageLevel;
private String shortCapacity;
private String devCapacity;
private String dealCapacity;
private String standardCapacity;
private Integer timeInterval;
}

View File

@@ -57,8 +57,8 @@ public class COverlimitUtil {
//配网
Float[] iHarmTem = new Float[49];
for (int i = 0; i <= 48; i++) {
iHarmTem[i] = -3.14159f;
//目前只处理了配网II类测点III类测点暂未处理III类测点参考主网
iHarmTem[i] = getHarmTag(i+2,voltageLevel).floatValue();
}
overlimit.buildIHarm(iHarmTem);
overlimit.setINeg(-3.14159f);

View File

@@ -42,6 +42,13 @@ public enum LineBaseEnum {
POWER_FLAG_NOT(1,"非电网侧"),
/**
* 装置系统类型
*/
DEV_DATA_TYPE_ZT(0,"暂态系统装置"),
DEV_DATA_TYPE_WT(1,"稳态系统装置"),
DEV_DATA_TYPE_ALL(2,"全部系统装置")
;

View File

@@ -15,6 +15,7 @@ import com.njcn.device.biz.pojo.po.PqsDeviceUnit;
import com.njcn.device.line.mapper.LineMapper;
import com.njcn.device.line.service.LineService;
import com.njcn.device.line.mapper.LineDetailMapper;
import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO;
import com.njcn.device.pq.service.CommTerminalService;
import com.njcn.device.pq.service.IPqsDeviceUnitService;
import com.njcn.web.controller.BaseController;
@@ -108,6 +109,23 @@ public class CommTerminalController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
/**
* 根据部门id获取部门监测点台账信息
* @param deptGetLineParam
* @return
*/
@PostMapping("deptGetLineInfo")
@ApiOperation("根据部门id获取部门监测点台账信息")
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@ApiImplicitParam(name = "deptGetLineParam", value = "请求体", required = true)
public HttpResult<List<MonitorCommLedgerInfoDTO>> deptGetLineInfo(@RequestBody @Validated DeptGetLineParam deptGetLineParam) {
String methodDescribe = getMethodDescribe("deptGetLineInfo");
List<MonitorCommLedgerInfoDTO> result = commTerminalService.deptGetLineInfo(deptGetLineParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@PostMapping("deptGetAllLine")
@ApiOperation("根据单位获取监测点信息(all line)")
@OperateInfo(info = LogEnum.BUSINESS_COMMON)

View File

@@ -3,8 +3,8 @@ package com.njcn.device.pq.service;
import com.njcn.device.biz.pojo.dto.*;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.device.biz.pojo.param.SubstationParam;
import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO;
import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@@ -40,6 +40,9 @@ public interface CommTerminalService {
*/
List<DeptGetChildrenMoreDTO> deptGetLine(DeptGetLineParam deptGetLineParam);
List<MonitorCommLedgerInfoDTO> deptGetLineInfo(DeptGetLineParam deptGetLineParam);
List<DeptGetChildrenMoreDTO> deptGetAllLine(DeptGetLineParam deptGetLineParam);
List<LineDevGetDTO> deptGetLineByIdList(List<String> monitorIds);

View File

@@ -11,9 +11,10 @@ import com.njcn.common.utils.EnumUtils;
import com.njcn.device.biz.pojo.dto.*;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.device.biz.pojo.param.SubstationParam;
import com.njcn.device.line.mapper.DeptLineMapper;
import com.njcn.device.line.mapper.LineMapper;
import com.njcn.device.line.service.DeptLineService;
import com.njcn.device.pq.enums.RunFlagEnum;
import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO;
import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam;
import com.njcn.device.pq.service.CommTerminalService;
import com.njcn.redis.utils.RedisUtil;
@@ -28,6 +29,8 @@ import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.njcn.device.pq.enums.LineBaseEnum.DEV_DATA_TYPE_ALL;
/**
* pqs
*
@@ -49,6 +52,7 @@ public class CommTerminalServiceImpl implements CommTerminalService {
private final RedisUtil redisUtil;
private final LineMapper lineMapper;
private final DeptLineMapper deptLineMapper;
/**
@@ -59,10 +63,6 @@ public class CommTerminalServiceImpl implements CommTerminalService {
*/
@Override
public List<DeptGetBase> getDeptChildrenByParent(DeptGetLineParam deptGetLineParam) {
/*List<DeptGetBase> redisResult = (List<DeptGetBase>) redisUtil.getObjectByKey(commTerminal + deptGetLineParam.getDeptId());
if (CollectionUtil.isNotEmpty(redisResult)) {
return redisResult;
}*/
List<DeptGetBase> result = new ArrayList<>();
List<DeptDTO> deptDTOList = deptFeignClient.getDeptDescendantIndexes(deptGetLineParam.getDeptId(), Stream.of(0, 1).collect(Collectors.toList())).getData();
deptDTOList.forEach(it -> {
@@ -119,6 +119,13 @@ public class CommTerminalServiceImpl implements CommTerminalService {
return result;
}
@Override
public List<MonitorCommLedgerInfoDTO> deptGetLineInfo(DeptGetLineParam deptGetLineParam) {
List<String> deptIds = deptFeignClient.getDepSonIdtByDeptId(deptGetLineParam.getDeptId()).getData();
List<MonitorCommLedgerInfoDTO> ledgerList = deptLineMapper.getMonitorByDeptIds(Stream.of(DEV_DATA_TYPE_ALL.getCode()).collect(Collectors.toList()),deptIds);
return ledgerList;
}
@Override
public List<DeptGetChildrenMoreDTO> deptGetAllLine(DeptGetLineParam deptGetLineParam) {
List<DeptGetChildrenMoreDTO> result = new ArrayList<>();

View File

@@ -29,6 +29,8 @@ import com.njcn.supervision.pojo.vo.user.UserLedgerVO;
import com.njcn.system.api.AreaFeignClient;
import com.njcn.system.pojo.enums.StatisticsEnum;
import com.njcn.system.pojo.po.Area;
import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.po.Dept;
import com.njcn.web.utils.RequestUtil;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -52,6 +54,8 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
private final LineMapper lineMapper;
private final DeptFeignClient deptFeignClient;
private final LineDetailMapper lineDetailMapper;
private final AreaFeignClient areaFeignClient;
@@ -84,40 +88,40 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
//处理存在用户的台账
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<String> devIds = userLineList.stream().map(it->it.getPids().split(StrUtil.COMMA)[LineBaseEnum.DEVICE_LEVEL.getCode()]).distinct().collect(Collectors.toList());
List<TerminalTree> devUserList = devList.stream().filter(it->devIds.contains(it.getId())).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> 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> subvUserList = subvList.stream().filter(it -> devIds.contains(it.getPid())).collect(Collectors.toList());
List<String> subvUserIds = subvUserList.stream().map(TerminalTree::getId).distinct().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> 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> noBindDevList = devList.stream().filter(it->!devOtherIds.contains(it.getId()) && !devIds.contains(it.getId())).collect(Collectors.toList());
List<TerminalTree> devOtherList = devList.stream().filter(it -> devOtherIds.contains(it.getId())).collect(Collectors.toList());
List<TerminalTree> noBindDevList = devList.stream().filter(it -> !devOtherIds.contains(it.getId()) && !devIds.contains(it.getId())).collect(Collectors.toList());
devOtherList.addAll(noBindDevList);
//电网侧线路
List<TerminalTree> subvOtherList = subvList.stream().filter(it->devOtherIds.contains(it.getPid())).collect(Collectors.toList());
List<TerminalTree> subvOtherList = subvList.stream().filter(it -> devOtherIds.contains(it.getPid())).collect(Collectors.toList());
List<String> otherBusBarIds = subvOtherList.stream().map(TerminalTree::getId).distinct().collect(Collectors.toList());
List<TerminalTree> noBindList = subvList.stream().filter(it->!subvUserIds.contains(it.getId()) && !otherBusBarIds.contains(it.getId())).collect(Collectors.toList());
List<TerminalTree> noBindList = subvList.stream().filter(it -> !subvUserIds.contains(it.getId()) && !otherBusBarIds.contains(it.getId())).collect(Collectors.toList());
subvOtherList.addAll(noBindList);
UserReportParam userReportParam = new UserReportParam();
List<UserLedgerVO> userReportPOList = userLedgerFeignClient.selectUserList(userReportParam).getData();
userReportPOList = userReportPOList.stream().filter(it->StrUtil.isNotBlank(it.getStationId())).collect(Collectors.toList());
Map<String,List<UserLedgerVO>> userMap = userReportPOList.stream().collect(Collectors.groupingBy(UserLedgerVO::getStationId));
userReportPOList = userReportPOList.stream().filter(it -> StrUtil.isNotBlank(it.getStationId())).collect(Collectors.toList());
Map<String, List<UserLedgerVO>> userMap = userReportPOList.stream().collect(Collectors.groupingBy(UserLedgerVO::getStationId));
subvOtherList.forEach(subv -> subv.setChildren(getChildren(subv, otherLineList)));
devOtherList.forEach(dev -> dev.setChildren(getChildren(dev, subvOtherList)));
subList.forEach(sub -> sub.setChildren(specialDealSubChildren(sub, userLineList,devOtherList,subvUserList,devUserList,userMap.get(sub.getId()))));
subList.forEach(sub -> sub.setChildren(specialDealSubChildren(sub, userLineList, devOtherList, subvUserList, devUserList, userMap.get(sub.getId()))));
//subList.forEach(sub -> sub.setChildren(getChildren(sub, devList)));
gdList.forEach(gd -> gd.setChildren(getChildren(gd, subList)));
provinceList.forEach(province -> province.setChildren(getChildren(province, gdList)));
@@ -137,15 +141,15 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
}
private List<TerminalTree> specialDealSubChildren(TerminalTree sub,List<TerminalTree> lineUserList,List<TerminalTree> devOtherList,List<TerminalTree> busBarList,List<TerminalTree> devAllList,List<UserLedgerVO> userReportPOList){
private List<TerminalTree> specialDealSubChildren(TerminalTree sub, List<TerminalTree> lineUserList, List<TerminalTree> devOtherList, List<TerminalTree> busBarList, List<TerminalTree> devAllList, List<UserLedgerVO> userReportPOList) {
List<TerminalTree> list = new ArrayList<>();
//电网侧
List<TerminalTree> devTree = devOtherList.stream().filter(it->it.getPid().equals(sub.getId())).collect(Collectors.toList());
if(CollectionUtil.isNotEmpty(devTree)){
List<TerminalTree> devTree = devOtherList.stream().filter(it -> it.getPid().equals(sub.getId())).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(devTree)) {
list.addAll(devTree);
}
//非电网侧
if(CollUtil.isNotEmpty(userReportPOList)) {
if (CollUtil.isNotEmpty(userReportPOList)) {
Map<String, UserLedgerVO> userLedgerVOMap = userReportPOList.stream().collect(Collectors.toMap(UserLedgerVO::getId, Function.identity()));
List<TerminalTree> userLineList = lineUserList.stream().filter(it -> it.getPids().split(StrUtil.COMMA)[LineBaseEnum.SUB_LEVEL.getCode()].equals(sub.getId())).collect(Collectors.toList());
@@ -190,7 +194,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
});
UserLedgerVO userReportPO = userLedgerVOMap.get(objId);
if(Objects.isNull(userReportPO)){
if (Objects.isNull(userReportPO)) {
System.out.println(map);
}
TerminalTree terminalTree = new TerminalTree();
@@ -209,8 +213,6 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
}
/**
* 5层树排除设备 母线监测点合并
*
@@ -226,78 +228,122 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
if (CollectionUtil.isNotEmpty(generalDeviceDTOList)) {
// 创建集合
List<TerminalTree> taiZhang = new ArrayList<>();
// 获取用户
UserReportParam userReportParam = new UserReportParam();
List<UserLedgerVO> userReportPOList = userLedgerFeignClient.selectUserList(userReportParam).getData();
userReportPOList = userReportPOList.stream().filter(it -> StrUtil.isNotBlank(it.getStationId())).collect(Collectors.toList());
Map<String, UserLedgerVO> userMap = userReportPOList.stream().collect(Collectors.toMap(UserLedgerVO::getId, Function.identity()));
// 遍历集合
for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) {
// 创建实体类
TerminalTree terminalTree = new TerminalTree();
// 判断监测点索引集合状态
if (CollectionUtils.isEmpty(generalDeviceDTO.getLineIndexes())) {
continue;
}
// 通过供电公司索引查询省会
List<TerminalTree> proList = treeMapper.getProvinceList(generalDeviceDTO.getGdIndexes());
// 通过供电公司索引查询供电公司信息
List<TerminalTree> gdList = treeMapper.getGdList(generalDeviceDTO.getGdIndexes());
// 通过供电站索引查询供电站信息
List<TerminalTree> subList = treeMapper.getSubList(generalDeviceDTO.getSubIndexes());
// 通过监测点索引查询监测点信息
List<TerminalTree> lineList = treeMapper.getLineList(generalDeviceDTO.getLineIndexes());
List<TerminalTree> userLineList = lineList.stream().filter(it->StrUtil.isNotBlank(it.getObjId())).collect(Collectors.toList());
List<TerminalTree> otherLineList = lineList.stream().filter(it->StrUtil.isBlank(it.getObjId())).collect(Collectors.toList());
Map<String,List<TerminalTree>> temMap = new HashMap<>();
if(CollUtil.isNotEmpty(userLineList)) {
Map<String, List<TerminalTree>> objMap = userLineList.stream().collect(Collectors.groupingBy(TerminalTree::getObjId));
List<TerminalTree> temList = new ArrayList<>();
objMap.forEach((objId, monitorList) -> {
UserLedgerVO userLedgerVO = userMap.get(objId);
TerminalTree tree = new TerminalTree();
tree.setLevel(LineBaseEnum.USER_LEVEL.getCode());
tree.setPid(userLedgerVO.getStationId());
tree.setId(userLedgerVO.getId());
tree.setChildren(monitorList);
int devSize = (int) monitorList.stream().map(x -> {
// 获取父id字符串通过 逗号 分割 成一个数组
String[] pid = x.getPids().split(StrUtil.COMMA);
return pid[LineBaseEnum.DEVICE_LEVEL.getCode()];
}).distinct().count();
tree.setName(userLedgerVO.getProjectName());
//特殊处理用户层级下面的装置数量临时存到pids字段。
tree.setPids(String.valueOf(devSize));
temList.add(tree);
});
temMap = temList.stream().collect(Collectors.groupingBy(TerminalTree::getPid));
if (StrUtil.isNotBlank(deviceInfoParam.getStatisticalType().getDeptName())) {
// 遍历集合
for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) {
// 创建实体类
TerminalTree terminalTree = new TerminalTree();
terminalTree.setName(generalDeviceDTO.getName());
terminalTree.setId(generalDeviceDTO.getIndex());
terminalTree.setLevel(0);
// 处理子部门
deviceInfoParam.setDeptIndex(generalDeviceDTO.getIndex());
List<GeneralDeviceDTO> generalDeviceDTOsubList = generalDeviceService.getDeviceInfo(deviceInfoParam, Stream.of(0).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList()));
if (CollectionUtil.isNotEmpty(generalDeviceDTOsubList)) {
List<TerminalTree> terminalTreeList = new ArrayList<>();
for (int i = 0; i < generalDeviceDTOsubList.size(); i++) {
GeneralDeviceDTO deviceDTO = generalDeviceDTOsubList.get(i);
TerminalTree terminalSubTree = new TerminalTree();
terminalSubTree.setName(deviceDTO.getName());
terminalSubTree.setId(deviceDTO.getIndex());
terminalSubTree.setPid(generalDeviceDTO.getIndex());
terminalSubTree.setLevel(2);
terminalSubTree.setSort(i);
if(CollectionUtil.isNotEmpty(deviceDTO.getLineIndexes())){
// 处理该部门下的检测点显示
// 通过监测点索引查询监测点信息
List<TerminalTree> lineList = treeMapper.getLineList(deviceDTO.getLineIndexes());
terminalSubTree.setChildren(lineList);
terminalTreeList.add(terminalSubTree);
}
}
terminalTree.setChildren(terminalTreeList);
} else {
if(CollectionUtil.isNotEmpty(generalDeviceDTO.getLineIndexes())){
// 处理该部门下的检测点显示
// 通过监测点索引查询监测点信息
List<TerminalTree> lineList = treeMapper.getLineList(generalDeviceDTO.getLineIndexes());
terminalTree.setChildren(lineList);
}
}
taiZhang.add(terminalTree);
}
} else {
// 获取用户
UserReportParam userReportParam = new UserReportParam();
List<UserLedgerVO> userReportPOList = userLedgerFeignClient.selectUserList(userReportParam).getData();
userReportPOList = userReportPOList.stream().filter(it -> StrUtil.isNotBlank(it.getStationId())).collect(Collectors.toList());
Map<String, UserLedgerVO> userMap = userReportPOList.stream().collect(Collectors.toMap(UserLedgerVO::getId, Function.identity()));
// 遍历集合
for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) {
// 创建实体类
TerminalTree terminalTree = new TerminalTree();
// 判断监测点索引集合状态
if (CollectionUtils.isEmpty(generalDeviceDTO.getLineIndexes())) {
continue;
}
// 通过供电公司索引查询省会
List<TerminalTree> proList = treeMapper.getProvinceList(generalDeviceDTO.getGdIndexes());
// 通过供电公司索引查询供电公司信息
List<TerminalTree> gdList = treeMapper.getGdList(generalDeviceDTO.getGdIndexes());
// 通过供电站索引查询供电站信息
List<TerminalTree> subList = treeMapper.getSubList(generalDeviceDTO.getSubIndexes());
// 通过监测点索引查询监测点信息
List<TerminalTree> lineList = treeMapper.getLineList(generalDeviceDTO.getLineIndexes());
List<TerminalTree> userLineList = lineList.stream().filter(it -> StrUtil.isNotBlank(it.getObjId())).collect(Collectors.toList());
List<TerminalTree> otherLineList = lineList.stream().filter(it -> StrUtil.isBlank(it.getObjId())).collect(Collectors.toList());
Map<String, List<TerminalTree>> temMap = new HashMap<>();
if (CollUtil.isNotEmpty(userLineList)) {
Map<String, List<TerminalTree>> objMap = userLineList.stream().collect(Collectors.groupingBy(TerminalTree::getObjId));
List<TerminalTree> temList = new ArrayList<>();
objMap.forEach((objId, monitorList) -> {
UserLedgerVO userLedgerVO = userMap.get(objId);
TerminalTree tree = new TerminalTree();
tree.setLevel(LineBaseEnum.USER_LEVEL.getCode());
tree.setPid(userLedgerVO.getStationId());
tree.setId(userLedgerVO.getId());
tree.setChildren(monitorList);
int devSize = (int) monitorList.stream().map(x -> {
// 获取父id字符串通过 逗号 分割 成一个数组
String[] pid = x.getPids().split(StrUtil.COMMA);
return pid[LineBaseEnum.DEVICE_LEVEL.getCode()];
}).distinct().count();
tree.setName(userLedgerVO.getProjectName());
//特殊处理用户层级下面的装置数量临时存到pids字段。
tree.setPids(String.valueOf(devSize));
temList.add(tree);
});
temMap = temList.stream().collect(Collectors.groupingBy(TerminalTree::getPid));
}
//处理变电站
dealChildrenData(subList, otherLineList, temMap,true);
//处理变电站
dealChildrenData(subList, otherLineList, temMap, true);
//监测点前面加序号,后面不需要删除下面两行就行
//Integer[] arr = {1};
//subList.forEach(item->item.getChildren().forEach(it->it.setName((arr[0]++ +"_"+it.getName()))));
//处理供电公司
dealChildrenData(gdList, subList, null,false);
//监测点前面加序号,后面不需要删除下面两行就行
//Integer[] arr = {1};
//subList.forEach(item->item.getChildren().forEach(it->it.setName((arr[0]++ +"_"+it.getName()))));
//处理供电公司
dealChildrenData(gdList, subList, null, false);
if (deviceInfoParam.getStatisticalType().getCode().equalsIgnoreCase(StatisticsEnum.POWER_NETWORK.getCode())) {
terminalTree.setChildren(gdList);
} else {
//还需要额外处理省会
dealChildrenData(proList, gdList, null,false);
terminalTree.setChildren(proList);
if (deviceInfoParam.getStatisticalType().getCode().equalsIgnoreCase(StatisticsEnum.POWER_NETWORK.getCode())) {
terminalTree.setChildren(gdList);
} else {
//还需要额外处理省会
dealChildrenData(proList, gdList, null, false);
terminalTree.setChildren(proList);
}
terminalTree.setId(generalDeviceDTO.getIndex());
terminalTree.setName(generalDeviceDTO.getName());
terminalTree.setLevel(0);
taiZhang.add(terminalTree);
}
terminalTree.setId(generalDeviceDTO.getIndex());
terminalTree.setName(generalDeviceDTO.getName());
terminalTree.setLevel(0);
taiZhang.add(terminalTree);
}
return taiZhang;
} else {
@@ -312,7 +358,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
* @param childrenData
* @param isLine
*/
private void dealChildrenData(List<TerminalTree> targetData, List<TerminalTree> childrenData,Map<String,List<TerminalTree>> userLineMap, boolean isLine) {
private void dealChildrenData(List<TerminalTree> targetData, List<TerminalTree> childrenData, Map<String, List<TerminalTree>> userLineMap, boolean isLine) {
// 创建一个map集合用于封装对象
Map<String, List<TerminalTree>> groupLine;
if (isLine) {
@@ -328,7 +374,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
//变电站
targetData.forEach(terminalTree -> {
List<TerminalTree> terminalTrees = new ArrayList<>();
if(groupLine.containsKey(terminalTree.getId())) {
if (groupLine.containsKey(terminalTree.getId())) {
terminalTrees.addAll(groupLine.get(terminalTree.getId()).stream().sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList()));
}
if (isLine) {
@@ -340,13 +386,13 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
}).distinct().count();
int devSize = 0;
if(userLineMap.containsKey(terminalTree.getId())){
if (userLineMap.containsKey(terminalTree.getId())) {
List<TerminalTree> userList = userLineMap.get(terminalTree.getId());
devSize= (int) userList.stream().mapToDouble(it->Integer.parseInt(it.getPids())).sum();
devSize = (int) userList.stream().mapToDouble(it -> Integer.parseInt(it.getPids())).sum();
terminalTrees.addAll(userList);
}
int sumDev = size+devSize;
terminalTree.setName(terminalTree.getName() + "" +sumDev+ "台装置)");
int sumDev = size + devSize;
terminalTree.setName(terminalTree.getName() + "" + sumDev + "台装置)");
terminalTree.setChildren(terminalTrees);
} else {
terminalTree.setChildren(terminalTrees);
@@ -392,7 +438,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
DeviceInfoParam deviceInfoParam = new DeviceInfoParam();
deviceInfoParam.setDeptIndex(RequestUtil.getDeptIndex());
deviceInfoParam.setServerName(ServerEnum.HARMONIC.getName());
List<GeneralDeviceDTO> generalDeviceDTOList = generalDeviceService.getDeviceInfo(deviceInfoParam, Stream.of(0,1).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList()));
List<GeneralDeviceDTO> generalDeviceDTOList = generalDeviceService.getDeviceInfo(deviceInfoParam, Stream.of(0, 1).collect(Collectors.toList()), Stream.of(1).collect(Collectors.toList()));
for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) {
if (CollectionUtil.isEmpty(generalDeviceDTO.getLineIndexes())) {
@@ -472,89 +518,89 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
List<LineDetail> list = lineDetailMapper.selectList(new LambdaQueryWrapper<LineDetail>().in(CollUtil.isNotEmpty(lineIds), LineDetail::getId, lineIds));
Map<String, LineDetail> powerFlagMap = list.stream().collect(Collectors.toMap(LineDetail::getId, Function.identity()));
for (TerminalTree x : lineList) {
if(powerFlagMap.containsKey(x.getId())){
if (powerFlagMap.containsKey(x.getId())) {
x.setPowerFlag(powerFlagMap.get(x.getId()).getPowerFlag());
x.setPowerSubstationName(powerFlagMap.get(x.getId()).getPowerSubstationName());
x.setObjName(powerFlagMap.get(x.getId()).getObjName());
}else{
} else {
x.setPowerFlag(LineBaseEnum.POWER_FLAG.getCode());
}
}
Map<String, List<TerminalTree>> lineObjNameMap = lineList.stream().filter(x -> StrUtil.isNotBlank(x.getPowerSubstationName())).collect(Collectors.groupingBy(TerminalTree::getPowerSubstationName));
Map<String, List<TerminalTree>> lineObjNameMap = lineList.stream().filter(x -> StrUtil.isNotBlank(x.getPowerSubstationName())).collect(Collectors.groupingBy(TerminalTree::getPowerSubstationName));
//组织变电站信息
List<TerminalTree> subInfoList = new ArrayList<>();
List<TerminalTree> subInfoList = new ArrayList<>();
lineObjNameMap.forEach((key, value)->{
lineObjNameMap.forEach((key, value) -> {
List<TerminalTree> terminalTrees = Collections.unmodifiableList(collect1);
//获取变电信息
List<TerminalTree> collect = subList.stream().filter(x -> x.getName().equals(key.replace("±",""))).collect(Collectors.toList());
List<TerminalTree> collect = subList.stream().filter(x -> x.getName().equals(key.replace("±", ""))).collect(Collectors.toList());
//电网侧监测点
List<TerminalTree> powerFlag = value.stream().filter(x -> x.getPowerFlag().equals(LineBaseEnum.POWER_FLAG.getCode())).collect(Collectors.toList());
if(CollUtil.isEmpty(powerFlag)){
if (CollUtil.isEmpty(powerFlag)) {
//解决变电站下没有监测点显示问题(变电站-》终端-》母线)
powerFlag.addAll(collect);
}
List<TerminalTree> subChildren = new ArrayList<>();
TerminalTree recursion = getRecursionChildren(powerFlag, terminalTrees);
if(ObjectUtil.isNotNull(recursion)){
if (ObjectUtil.isNotNull(recursion)) {
subChildren.add(recursion);
}
//非电网侧监测点
List<TerminalTree> powerFlagNot = value.stream().filter(x -> x.getPowerFlag().equals(LineBaseEnum.POWER_FLAG_NOT.getCode())).collect(Collectors.toList());
List<TerminalTree> notSubChildren = new ArrayList<>();
if(CollUtil.isNotEmpty(powerFlagNot)){
if (CollUtil.isNotEmpty(powerFlagNot)) {
Map<String, List<TerminalTree>> objNameMap = powerFlagNot.stream().collect(Collectors.groupingBy(TerminalTree::getObjName));
objNameMap.forEach((objNameKey,objNameValue)->{
objNameMap.forEach((objNameKey, objNameValue) -> {
TerminalTree recursionChildren = getRecursionChildren(objNameValue, terminalTrees);
if(ObjectUtil.isNotNull(recursionChildren)){
if (ObjectUtil.isNotNull(recursionChildren)) {
recursionChildren.setName(objNameKey);
notSubChildren.add(recursionChildren);
}
});
}
if(CollUtil.isNotEmpty(collect)){
if (CollUtil.isNotEmpty(collect)) {
List<TerminalTree> valueList = new ArrayList<>();
TerminalTree sub=new TerminalTree();
TerminalTree sub = new TerminalTree();
sub.setId(collect.get(0).getId());
sub.setName(collect.get(0).getName());
sub.setPid(collect.get(0).getPid());
sub.setSort(0);
sub.setChildren(valueList);
TerminalTree powerTree=new TerminalTree();
TerminalTree powerTree = new TerminalTree();
powerTree.setName("电网侧");
powerTree.setId(collect.get(0).getId());
powerTree.setChildren(subChildren);
valueList.add(powerTree);
TerminalTree notPowerTree=new TerminalTree();
TerminalTree notPowerTree = new TerminalTree();
notPowerTree.setName("非电网侧");
notPowerTree.setChildren(notSubChildren);
valueList.add(notPowerTree);
subInfoList.add(sub);
}else{
} else {
//电网侧变电站能否找到
for (TerminalTree child : subChildren) {
List<TerminalTree> valueList = new ArrayList<>();
List<TerminalTree> exist = subInfoList.stream().filter(x -> x.getId().equals(child.getId())).collect(Collectors.toList());
if(CollUtil.isNotEmpty(exist)){
if (CollUtil.isNotEmpty(exist)) {
//电网侧
List<TerminalTree> children =new ArrayList<>();
List<TerminalTree> children = new ArrayList<>();
children.addAll(exist.get(0).getChildren().get(0).getChildren());
children.add(child);
exist.get(0).getChildren().get(0).setChildren(children);
}else{
TerminalTree sub=new TerminalTree();
} else {
TerminalTree sub = new TerminalTree();
sub.setId(child.getId());
sub.setName(child.getName());
sub.setPid(child.getPid());
sub.setSort(0);
TerminalTree powerTree=new TerminalTree();
TerminalTree powerTree = new TerminalTree();
powerTree.setName("电网侧");
powerTree.setId(child.getId());
powerTree.setChildren(Arrays.asList(child));
@@ -574,7 +620,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
List<TerminalTree> exist = subInfoList.stream().filter(x -> x.getId().equals(child.getId())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(exist)) {
//非电网侧
List<TerminalTree> children =new ArrayList<>();
List<TerminalTree> children = new ArrayList<>();
children.addAll(exist.get(0).getChildren().get(1).getChildren());
children.add(child);
exist.get(0).getChildren().get(1).setChildren(children);
@@ -615,7 +661,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
for (TerminalTree notSub : collect) {
//只显示变电站下有装置的
TerminalTree notSub1 = findParents(collect1, notSub);
if(CollUtil.isNotEmpty(notSub1.getChildren())){
if (CollUtil.isNotEmpty(notSub1.getChildren())) {
List<TerminalTree> valueList = new ArrayList<>();
TerminalTree sub = new TerminalTree();
@@ -638,7 +684,7 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
subInfoList.add(sub);
dw.add(sub);
}
}
}
gdList.forEach(gd -> gd.setChildren(getChildren(gd, subInfoList)));
provinceList.forEach(province -> province.setChildren(getChildren(province, gdList)));
@@ -668,28 +714,26 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
List<TerminalTree> devList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.DEVICE_LEVEL.getCode())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> subvList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.SUB_V_LEVEL.getCode())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> linepowerList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.LINE_LEVEL.getCode())&&item.getPowerFlag() != 1).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> lineNotPowerList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.LINE_LEVEL.getCode())&&item.getPowerFlag() == 1).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> linepowerList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.LINE_LEVEL.getCode()) && item.getPowerFlag() != 1).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> lineNotPowerList = allList.stream().filter(item -> item.getLevel().equals(LineBaseEnum.LINE_LEVEL.getCode()) && item.getPowerFlag() == 1).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
subvList.forEach(subv ->{
if(CollUtil.isEmpty(subv.getChildren())){
subvList.forEach(subv -> {
if (CollUtil.isEmpty(subv.getChildren())) {
subv.setChildren(getRecursionChildren(subv, linepowerList));
}
}
);
);
subvList.forEach(subv -> {
if(CollUtil.isEmpty(subv.getChildren())){
if (CollUtil.isEmpty(subv.getChildren())) {
subv.setChildren(getRecursionChildren(subv, lineNotPowerList));
}
}
);
subvList.stream().filter(x-> ObjUtil.isNull(x.getPowerFlag())).forEach(x->x.setPowerFlag(0));
subvList.stream().filter(x -> ObjUtil.isNull(x.getPowerFlag())).forEach(x -> x.setPowerFlag(0));
devList.forEach(dev -> dev.setChildren(getRecursionChildren(dev, subvList)));
devList.stream().filter(x-> ObjUtil.isNull(x.getPowerFlag())).forEach(x->x.setPowerFlag(0));
devList.stream().filter(x -> ObjUtil.isNull(x.getPowerFlag())).forEach(x -> x.setPowerFlag(0));
subList.forEach(sub -> sub.setChildren(getRecursionChildrenCs(sub, devList)));
@@ -709,36 +753,36 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
*/
public List<TerminalTree> getChildren(TerminalTree item, List<TerminalTree> all) {
List<TerminalTree> collect = all.stream().filter(allItem -> allItem.getPid().equals(item.getId())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
if(CollUtil.isNotEmpty(collect)){
long sortSize = collect.stream().filter(x->ObjUtil.isNotNull(x.getSort())).filter(x -> x.getSort() == 0).count();
if(collect.size()-sortSize/collect.size()>50){
collect.sort(Comparator.comparing(x->x.getName()));
if (CollUtil.isNotEmpty(collect)) {
long sortSize = collect.stream().filter(x -> ObjUtil.isNotNull(x.getSort())).filter(x -> x.getSort() == 0).count();
if (collect.size() - sortSize / collect.size() > 50) {
collect.sort(Comparator.comparing(x -> x.getName()));
}
}
return collect;
}
public List<TerminalTree> getRecursionChildrenCs(TerminalTree item, List<TerminalTree> all){
public List<TerminalTree> getRecursionChildrenCs(TerminalTree item, List<TerminalTree> all) {
List<TerminalTree> collect = all.stream().filter(allItem -> allItem.getPid().equals(item.getId())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> list=new ArrayList<>();
TerminalTree power=new TerminalTree();
List<TerminalTree> list = new ArrayList<>();
TerminalTree power = new TerminalTree();
power.setName("电网侧");
power.setSort(0);
power.setChildren(collect.stream().filter(x -> 1 != x.getPowerFlag()).collect(Collectors.toList()));
list.add(power);
TerminalTree notPower=new TerminalTree();
TerminalTree notPower = new TerminalTree();
notPower.setName("非电网侧");
notPower.setSort(1);
notPower.setChildren(collect.stream().filter(x -> 1 == x.getPowerFlag()).collect(Collectors.toList()));
list.add(notPower);
return list;
}
public List<TerminalTree> getRecursionChildren(TerminalTree item, List<TerminalTree> all){
public List<TerminalTree> getRecursionChildren(TerminalTree item, List<TerminalTree> all) {
List<TerminalTree> list = all.stream().filter(allItem -> allItem.getPid().equals(item.getId())).sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
if(CollUtil.isNotEmpty(list)){
if (CollUtil.isNotEmpty(list)) {
item.setPowerFlag(list.get(0).getPowerFlag());
}
return list;
@@ -746,31 +790,32 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
/**
* 变电站层级增加电网侧和非电网侧电站
*
* @param line 变电站对象
* @param all 检测对象
* @param all 检测对象
* @return
*/
public TerminalTree getRecursionChildren(List<TerminalTree> line, List<TerminalTree> all) {
List<TerminalTree> aa=new ArrayList<>();
List<TerminalTree> aa = new ArrayList<>();
for (TerminalTree lineTree : line) {
findParentsRecursive(lineTree, all,aa);
findParentsRecursive(lineTree, all, aa);
aa.add(lineTree);
}
List<TerminalTree> distinctList =new ArrayList<>(aa.stream().distinct().collect(Collectors.toList()));
List<TerminalTree> distinctList = new ArrayList<>(aa.stream().distinct().collect(Collectors.toList()));
long count = line.stream().filter(x -> !x.getLevel().equals(LineBaseEnum.LINE_LEVEL.getCode())).count();
if(count>0){
if (count > 0) {
aa.addAll(all);
}
List<TerminalTree> lines = aa.stream().distinct().sorted(Comparator.comparing(TerminalTree::getSort)).collect(Collectors.toList());
List<TerminalTree> collect = distinctList.stream().filter(x -> x.getLevel() == LineBaseEnum.SUB_LEVEL.getCode()).collect(Collectors.toList());
if(CollUtil.isNotEmpty(collect)){
if (CollUtil.isNotEmpty(collect)) {
TerminalTree terminalTree = BeanUtil.copyProperties(collect.get(0), TerminalTree.class);
return findParents(lines,terminalTree);
return findParents(lines, terminalTree);
}
return null;
}
private static void findParentsRecursive(TerminalTree tree, List<TerminalTree> all,List<TerminalTree> newParents) {
private static void findParentsRecursive(TerminalTree tree, List<TerminalTree> all, List<TerminalTree> newParents) {
if (tree.getLevel() == LineBaseEnum.SUB_LEVEL.getCode()) {
return;
}
@@ -783,12 +828,12 @@ public class TerminalTreeServiceImpl implements TerminalTreeService {
}
}
private TerminalTree findParents(List<TerminalTree> all,TerminalTree subTree) {
private TerminalTree findParents(List<TerminalTree> all, TerminalTree subTree) {
List<TerminalTree> collect = all.stream().filter(allItem -> allItem.getPid().equals(subTree.getId())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(collect)) {
collect.forEach(treeMap -> {
subTree.setChildren(collect);
findParents( all,treeMap);
findParents(all, treeMap);
});
}
return subTree;

View File

@@ -6,6 +6,7 @@ import com.njcn.device.biz.pojo.dto.LineDevGetDTO;
import com.njcn.device.biz.pojo.dto.SubGetBase;
import com.njcn.device.biz.pojo.dto.TerminalGetBase;
import com.njcn.device.biz.pojo.param.SubstationParam;
import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO;
import com.njcn.device.pq.pojo.po.DeptLine;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -74,6 +75,9 @@ public interface DeptLineMapper extends BaseMapper<DeptLine> {
List<LineDevGetDTO> lineDevGet(@Param("list")List<Integer> devType,@Param("type")Integer type,@Param("lineRunFlag") Integer lineRunFlag);
List<MonitorCommLedgerInfoDTO> getMonitorByDeptIds(@Param("list")List<Integer> devType,@Param("deptIds")List<String> deptIds);
List<LineDevGetDTO> lineDevAllGet(@Param("list")List<Integer> devType,@Param("type")Integer type,@Param("lineRunFlag") Integer lineRunFlag, @Param("lineType") Integer lineType);
List<TerminalGetBase> orgSubStationGet(@Param("list")List<Integer> devType);

View File

@@ -74,6 +74,45 @@
</select>
<select id="getMonitorByDeptIds" resultType="com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO">
select
point.id monitorId,
point.name monitorName,
lineDetail.Time_Interval timeInterval,
lineDetail.Dev_Capacity devCapacity,
lineDetail.Short_Capacity shortCapacity,
lineDetail.Standard_Capacity standardCapacity,
lineDetail.Deal_Capacity dealCapacity,
voltage.name busBarname,
pq_voltage.scale voltageLevel,
bd.name bdName,
gd.name gdName
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
inner join pq_line voltage on point.pid = voltage.id
inner join pq_voltage pq_voltage on voltage.id = pq_voltage.id
inner join pq_line dev on voltage.pid = dev.id
inner join pq_device device on dev.id = device.id
inner join pq_line bd on dev.pid = bd.id
inner join pq_line gd on bd.pid = gd.id
where device.Dev_Model = 1
and point.state = 1
and device.Dev_Data_Type in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
and device.Run_Flag = 0
and pq_dept_line.id in
<foreach collection="deptIds" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
order by point.name asc
</select>
<select id="lineDevAllGet" resultType="com.njcn.device.biz.pojo.dto.LineDevGetDTO">
select
<!--监测点-->

View File

@@ -340,30 +340,30 @@ public class TransientServiceImpl implements TransientService {
// 获取按终端分类的监测点索引集合
List<String> lineList = generalDeviceDTOList.stream().flatMap(dto -> dto.getLineIndexes().stream()).collect(Collectors.toList());
List<TerminalTree> data = deviceTreeClient.getTerminalTree().getData();
if (!CollectionUtils.isEmpty(transientParam.getSubstationIds())) {
List<String> collect = data.stream().map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.filter(temp -> transientParam.getSubstationIds().contains(temp.getId()))
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getId).collect(Collectors.toList());
lineList.retainAll(collect);
}
// if (!CollectionUtils.isEmpty(transientParam.getSubstationIds())) {
// List<String> collect = data.stream().map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .filter(temp -> transientParam.getSubstationIds().contains(temp.getId()))
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getId).collect(Collectors.toList());
// lineList.retainAll(collect);
// }
if (!CollectionUtils.isEmpty(transientParam.getLineIds())) {
List<String> collect1 = data.stream().map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.map(TerminalTree::getChildren).flatMap(Collection::stream)
.filter(temp -> transientParam.getLineIds().contains(temp.getId()))
.map(TerminalTree::getId).collect(Collectors.toList());
lineList.retainAll(collect1);
// List<String> collect1 = data.stream().map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .map(TerminalTree::getChildren).flatMap(Collection::stream)
// .filter(temp -> transientParam.getLineIds().contains(temp.getId()))
// .map(TerminalTree::getId).collect(Collectors.toList());
lineList.retainAll(transientParam.getLineIds());
}
if (CollUtil.isEmpty(lineList)) {
return new Page<>();

View File

@@ -48,13 +48,6 @@ public class IpUtils {
public static String getRealIpAddress(ServerHttpRequest request) {
HttpHeaders headers = request.getHeaders();
String ipAddress = headers.getFirst(HEADER_X_FORWARDED_FOR);
log.info("X-Forwarded-For:"+ipAddress);
ipAddress = headers.getFirst("X-Real-IP");
log.error("X-Real-IP:"+ipAddress);
ipAddress = headers.getFirst("Proxy-Client-IP");
log.error("Proxy-Client-IP:"+ipAddress);
ipAddress = headers.getFirst("REMOTE-HOST");
log.error("REMOTE-HOST:"+ipAddress);
if (StrUtil.isBlankIfStr(ipAddress) || UNKNOWN.equalsIgnoreCase(ipAddress)) {
ipAddress = headers.getFirst(HEADER_PROXY_CLIENT_IP);
}

View File

@@ -56,4 +56,9 @@ public class ReportTemplateDTO {
*/
private String value;
/**
* 针对电压下偏差新增的字段
*/
private String lowValue;
}

View File

@@ -0,0 +1,44 @@
package com.njcn.harmonic.pojo.dto.report;
import lombok.Data;
import java.util.List;
/**
* @Author: cdf
* @CreateTime: 2026-01-06
* @Description: 公共台账
*/
@Data
public class CommReportLedgerDto {
private String deptName;
private String monitorName;
private List<MonitorLedgerInfo> monitorNameList;
@Data
static class MonitorLedgerInfo {
private String monitorName;
private String gdName;
private String bdName;
private String busBarName;
private String voltageLevel;
private String shortCapacity;
private String devCapacity;
private String dealCapacity;
}
}

View File

@@ -0,0 +1,34 @@
package com.njcn.harmonic.pojo.dto.report;
import lombok.Data;
/**
* @Author: cdf
* @CreateTime: 2026-01-07
* @Description:
*/
@Data
public class TableMergeRule {
/** 文档中表格的索引从0开始 */
private Integer tableIndex;
/** 要合并的列索引比如0=第0列 */
private Integer mergeColIndex;
/** 从第几行开始合并从0开始计数比如从第2行开始填2 */
private Integer startRow = 0;
/** 每多少行合并一次比如5=每5行合并一组 */
private Integer mergeRowsPerGroup;
/** 是否启用该规则 */
private boolean enable = true;
// 快捷构造方法(包含起始行)
public static TableMergeRule build(int tableIndex, int mergeColIndex, int startRow, int mergeRowsPerGroup) {
TableMergeRule rule = new TableMergeRule();
rule.setTableIndex(tableIndex);
rule.setMergeColIndex(mergeColIndex);
rule.setStartRow(startRow);
rule.setMergeRowsPerGroup(mergeRowsPerGroup);
rule.setEnable(true);
return rule;
}
}

View File

@@ -0,0 +1,20 @@
package com.njcn.harmonic.pojo.param.report;
import com.njcn.harmonic.pojo.dto.report.CommReportLedgerDto;
import lombok.Data;
/**
* @Author: cdf
* @CreateTime: 2026-01-06
* @Description: 谐波区域报告
*/
@Data
public class AreaHarmReportParam {
private String startTime;
private String endTime;
private String deptId;
}

View File

@@ -2,6 +2,9 @@ package com.njcn.harmonic.pojo.vo;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 类的介绍:
*
@@ -37,24 +40,44 @@ public class OverAreaLimitVO {
* 个数
*/
private Integer frequencyMonitorNumber = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> freqMonitorList = new ArrayList<>();;
/**
* 占比
*/
private Double frequencyBiLi = -1.0;
/**
* 日均超标占比
*/
private Double frequencyDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
private Double frequencyOverDayBiLi = -1.0;
//电压偏差超标情况
/**
* 个数
*/
private Integer voltageMonitorNumber = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> voltageMonitorList = new ArrayList<>();;
/**
* 占比
*/
private Double voltageBiLi = -1.0;
/**
* 日均超标占比
*/
private Double voltageDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
@@ -65,10 +88,19 @@ public class OverAreaLimitVO {
* 个数
*/
private Integer harmonicVoltageMonitorNumber = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> harmonicVoltageMonitorList = new ArrayList<>();
/**
* 占比
*/
private Double harmonicVoltageBiLi = -1.0;
/**
* 日均超标占比
*/
private Double harmonicVoltageDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
@@ -79,10 +111,18 @@ public class OverAreaLimitVO {
* 个数
*/
private Integer harmonicCurrentMonitorNumber = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> harmonicCurrentMonitorList = new ArrayList<>();;
/**
* 占比
*/
private Double harmonicCurrentBiLi = -1.0;
/**
* 日均超标占比
*/
private Double harmonicCurrentDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
@@ -93,10 +133,18 @@ public class OverAreaLimitVO {
* 个数
*/
private Integer threePhaseVoltageMonitorNumber = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> threePhaseVoltageMonitorList = new ArrayList<>();;
/**
* 占比
*/
private Double threePhaseVoltageBiLi = -1.0;
/**
* 日均超标占比
*/
private Double threePhaseVoltageDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
@@ -107,10 +155,18 @@ public class OverAreaLimitVO {
* 个数
*/
private Integer flickerMonitorNumber = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> flickerMonitorList = new ArrayList<>();;
/**
* 占比
*/
private Double flickerBiLi = -1.0;
/**
* 日均超标占比
*/
private Double flickerDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
@@ -125,6 +181,10 @@ public class OverAreaLimitVO {
* 占比
*/
private Double negativeBiLi = -1.0;
/**
* 日均超标占比
*/
private Double negativeDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
@@ -139,8 +199,48 @@ public class OverAreaLimitVO {
* 占比
*/
private Double interHarmonicBiLi = -1.0;
/**
* 日均超标占比
*/
private Double interHarmonicDayAvgBiLi = -1.0;
/**
* 平均超标天数
*/
private Double interHarmonicOverDayBiLi = -1.0;
private List<InnerHarmV> innerHarmVList;
private List<InnerHarmV> innerHarmIList;
@Data
public static class InnerHarmV{
private String name;
//谐波电压超标情况
/**
* 个数
*/
private Integer limitCount = 0;
/**
* 超标监测点集合,区域报告使用
*/
private List<String> limitIdList;
/**
* 占比
*/
private Double limitRate = -1.0;
/**
* 日均超标占比
*/
private Double dayAvg = -1.0;
/**
* 平均超标天数
*/
private Double dayLimit = -1.0;
}
}

View File

@@ -31,4 +31,7 @@ public class OverAreaVO extends DeviceInfoParam.BusinessParam{
@Range(min = 1,message = "条数必须大于0")
private Integer pageSize;
@ApiModelProperty("1.报告标志")
private Integer areaReportFlag;
}

View File

@@ -1,17 +1,20 @@
package com.njcn.harmonic.utils;
import cn.hutool.core.collection.CollUtil;
import com.njcn.harmonic.pojo.dto.report.TableMergeRule;
import com.njcn.oss.constant.OssPath;
import com.njcn.oss.utils.FileStorageUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.Map.Entry;
import java.util.regex.Matcher;
@@ -26,7 +29,13 @@ public class WordUtil2 {
private final FileStorageUtil fileStorageUtil;
public void getWord(String path, Map<String, Object> params, String fileName,List<List<String[]>> tableList, HttpServletResponse response)
// 保留原有getWord方法兼容旧调用无合并规则时直接执行
public void getWord(String path, Map<String, Object> params, String fileName,
List<List<String[]>> tableList, HttpServletResponse response) throws Exception {
this.getWord(path, params, fileName, tableList, null, response);
}
public void getWord(String path, Map<String, Object> params, String fileName,List<List<String[]>> tableList,List<TableMergeRule> mergeRules, HttpServletResponse response)
throws Exception {
path = ClearPathUtil.cleanString(path);
InputStream inStream = null;
@@ -35,20 +44,29 @@ public class WordUtil2 {
try {
inStream = new ClassPathResource(path).getInputStream();;
doc = new CustomXWPFDocument(inStream);
// 替换表格里面的变量
if(CollUtil.isNotEmpty(tableList)){
this.replaceInTable(doc, params,tableList);
}else{
this.replaceInTable(doc, params);
}
// 替换表格里面的变量
this.replaceInPara(doc, params); // 替换文本里面的变量
// 替换文本里面的变量
this.replaceInPara(doc, params);
//新增:执行动态合并规则
if(CollUtil.isNotEmpty(mergeRules)) {
this.dynamicMergeTables(doc, mergeRules);
}
} catch (IOException e) {
e.printStackTrace();
getError("获取报告模板异常,原因为:" + e);
} finally {
if (null != inStream) {
inStream.close();
}
}
try {
ServletOutputStream outputStream = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
@@ -223,6 +241,74 @@ public class WordUtil2 {
}
}
/* public static void processParagraphs(List<XWPFParagraph> paragraphList, Map<String, Object> param,
CustomXWPFDocument doc) {
if (paragraphList != null && !paragraphList.isEmpty()) {
for (XWPFParagraph paragraph : paragraphList) {
// 先获取整个段落的完整文本
String fullText = paragraph.getText();
// 检查是否包含变量
boolean hasVariable = false;
for (String key : param.keySet()) {
if (fullText.contains(key)) {
hasVariable = true;
break;
}
}
if (hasVariable) {
// 进行变量替换
String replacedText = fullText;
boolean hasImage = false;
for (Entry<String, Object> entry : param.entrySet()) {
String key = entry.getKey();
if (replacedText.contains(key)) {
Object value = entry.getValue();
if (value instanceof String) {
replacedText = replacedText.replace(key, value.toString());
} else if (value instanceof Map) {
// 处理图片:需要特殊处理
hasImage = true;
break;
}
}
}
if (!hasImage) {
// 如果没有图片,直接替换整个段落文本
// 清空原有 Runs
List<XWPFRun> runs = paragraph.getRuns();
for (int i = runs.size() - 1; i >= 0; i--) {
paragraph.removeRun(i);
}
// 创建新的 Run
XWPFRun newRun = paragraph.createRun();
newRun.setText(replacedText);
} else {
// 有图片的情况:逐个 Run 处理(保留原逻辑)
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
for (Entry<String, Object> entry : param.entrySet()) {
String key = entry.getKey();
if (text.contains(key)) {
// ... 原图片处理逻辑
}
}
}
}
}
}
}
}
}*/
/**
* 替换段落里面的变量
*
@@ -292,33 +378,6 @@ public class WordUtil2 {
// }
}
/**
* 为表格插入数据,行数不够添加新行
*
* @param table 需要插入数据的表格
* @param tableList 插入数据集合
*/
private static void insertTable(XWPFTable table, List<String[]> tableList) {
//删除占位符行数
table.removeRow(1);
if (CollUtil.isNotEmpty(tableList)) {
// 创建行,根据需要插入的数据添加新行,不处理表头
for (int i = 0; i < tableList.size(); i++) {
XWPFTableRow row = table.createRow();
List<XWPFTableCell> cells = row.getTableCells();
for (int j = 0; j < cells.size(); j++) {
String s = tableList.get(i)[j];
XWPFTableCell cell = cells.get(j);
cell.removeParagraph(0);
XWPFParagraph paragraph = cell.addParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);
// 在段落中添加文本
XWPFRun run = paragraph.createRun();
run.setText(s);
}
}
}
}
/**
* 替换表格里面的变量
@@ -350,6 +409,7 @@ public class WordUtil2 {
}else {
if (CollUtil.isNotEmpty(tableList.get(num))){
insertTable(table, tableList.get(num)); // 插入数据
}
num++;
}
@@ -357,6 +417,53 @@ public class WordUtil2 {
}
}
/**
* 为表格插入数据,行数不够添加新行
*
* @param table 需要插入数据的表格
* @param tableList 插入数据集合
*/
private static void insertTable(XWPFTable table, List<String[]> tableList) {
//删除占位符行数
table.removeRow(1);
if (CollUtil.isNotEmpty(tableList)) {
// 创建行,根据需要插入的数据添加新行,不处理表头
for (int i = 0; i < tableList.size(); i++) {
XWPFTableRow row = table.createRow();
List<XWPFTableCell> cells = row.getTableCells();
String[] rowData = tableList.get(i);
for (int j = 0; j < cells.size(); j++) {
String s = tableList.get(i)[j];
XWPFTableCell cell = cells.get(j);
cell.removeParagraph(0);
XWPFParagraph paragraph = cell.addParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);
// 在段落中添加文本
XWPFRun run = paragraph.createRun();
// 处理普通数据
if (j < rowData.length && !rowData[j].startsWith("merge:")) {
run.setText(rowData[j] == null ? "" : rowData[j]);
}
// 处理合并配置
else if (j < rowData.length && rowData[j].startsWith("merge:")) {
String[] mergeParams = rowData[j].replace("merge:", "").split(",");
int rowMerge = Integer.parseInt(mergeParams[0]);
int colMerge = Integer.parseInt(mergeParams[1]);
// 调用合并方法
setCellMerge(cell, rowMerge, colMerge);
// 清空跨列后续单元格
for (int k = j + 1; k < j + colMerge && k < cells.size(); k++) {
cells.get(k).removeParagraph(0);
}
}
}
}
}
}
/**
* 正则匹配字符串
*
@@ -398,4 +505,144 @@ public class WordUtil2 {
return res;
}
/**
* 适配 POI 4.1.1 的单元格合并核心方法
* @param cell 要合并的单元格
* @param rowMerge 纵向合并行数1=不合并,>1=合并行数)
* @param colMerge 横向合并列数1=不合并,>1=合并列数)
*/
private static void setCellMerge(XWPFTableCell cell, int rowMerge, int colMerge) {
CTTc ctTc = cell.getCTTc();
CTTcPr tcPr = ctTc.getTcPr() == null ? ctTc.addNewTcPr() : ctTc.getTcPr();
tcPr.addNewVAlign().setVal(STVerticalJc.CENTER);
// 1. 横向合并(跨列)- POI 4.1.1 写法
if (colMerge > 1) {
// 直接创建 gridSpan 并设置值
tcPr.addNewGridSpan().setVal(BigInteger.valueOf(colMerge));
}
// 2. 纵向合并(跨行)- POI 4.1.1 写法
if (rowMerge > 1) {
// 起始单元格标记为 RESTART
tcPr.addNewVMerge().setVal(STMerge.RESTART);
}
}
/**
* 适配 POI 4.1.1 的表格单元格合并工具方法
* @param table Word表格对象
* @param rowIndex 行索引从0开始
* @param colIndex 列索引从0开始
* @param mergeRows 跨行数如2表示合并当前行和下一行
* @param mergeCols 跨列数如2表示合并当前列和下一列
*/
public static void mergeTableCell(XWPFTable table, int rowIndex, int colIndex, int mergeRows, int mergeCols) {
// 参数校验
if (table == null || rowIndex < 0 || colIndex < 0 || mergeRows < 1 || mergeCols < 1) {
log.error("表格合并参数无效:行{} 列{} 跨行{} 跨列{}", rowIndex, colIndex, mergeRows, mergeCols);
return;
}
// 获取目标行和单元格
XWPFTableRow targetRow = table.getRow(rowIndex);
if (targetRow == null) {
log.error("指定行不存在:{}", rowIndex);
return;
}
XWPFTableCell targetCell = targetRow.getCell(colIndex);
if (targetCell == null) {
log.error("指定列不存在:{}", colIndex);
return;
}
// 设置起始单元格的合并属性
setCellMerge(targetCell, mergeRows, mergeCols);
// 处理跨行合并的后续单元格(标记为 CONTINUE
for (int i = rowIndex + 1; i < rowIndex + mergeRows; i++) {
XWPFTableRow row = table.getRow(i);
if (row == null) break;
XWPFTableCell cell = row.getCell(colIndex);
if (cell == null) continue;
CTTc ctTc = cell.getCTTc();
CTTcPr tcPr = ctTc.getTcPr() == null ? ctTc.addNewTcPr() : ctTc.getTcPr();
// 后续单元格标记为 CONTINUE
tcPr.addNewVMerge().setVal(STMerge.CONTINUE);
}
// 处理跨列合并的后续单元格(清空并标记为 CONTINUE
for (int j = colIndex + 1; j < colIndex + mergeCols; j++) {
XWPFTableCell cell = targetRow.getCell(j);
if (cell == null) break;
CTTc ctTc = cell.getCTTc();
CTTcPr tcPr = ctTc.getTcPr() == null ? ctTc.addNewTcPr() : ctTc.getTcPr();
tcPr.addNewVMerge().setVal(STMerge.CONTINUE);
// 清空跨列后续单元格的内容
cell.removeParagraph(0);
}
}
// ========== 新增:动态合并核心方法 ==========
/**
* 动态执行多个表格的合并规则
* @param doc Word文档对象
* @param mergeRules 合并规则列表
*/
public void dynamicMergeTables(CustomXWPFDocument doc, List<TableMergeRule> mergeRules) {
// 遍历文档中的所有表格,按规则合并
Iterator<XWPFTable> tableIterator = doc.getTablesIterator();
int currentTableIndex = 0; // 当前遍历到的表格索引从0开始
while (tableIterator.hasNext()) {
XWPFTable table = tableIterator.next();
// 查找当前表格是否有匹配的合并规则
for (TableMergeRule rule : mergeRules) {
if (rule.isEnable() && rule.getTableIndex().equals(currentTableIndex)) {
// 执行该表格的合并规则
mergeTableByRule(table, rule);
break; // 一个表格只执行一条规则,避免重复处理
}
}
currentTableIndex++;
}
}
/**
* 根据单条规则合并指定表格(支持指定起始行)
* @param table 要合并的表格
* @param rule 合并规则
*/
private void mergeTableByRule(XWPFTable table, TableMergeRule rule) {
if (table == null || rule == null || !rule.isEnable()) {
return;
}
int totalRows = table.getRows().size();
int mergeCol = rule.getMergeColIndex();
int startRow = rule.getStartRow(); // 新增:获取指定的起始行
int mergeRowsPerGroup = rule.getMergeRowsPerGroup();
// 参数校验起始行不能大于总行数、行数不足、列索引非法、合并行数小于2
if (startRow >= totalRows || totalRows < 2 || mergeCol < 0 || mergeRowsPerGroup < 2) {
log.warn("表格{}合并规则无效:总行数{} 起始行{} 合并列{} 每组行数{}",
rule.getTableIndex(), totalRows, startRow, mergeCol, mergeRowsPerGroup);
return;
}
// 核心改动从startRow开始每mergeRowsPerGroup行合并一组
for (int currentStart = startRow; currentStart < totalRows; currentStart += mergeRowsPerGroup) {
// 最后一组可能不足N行取实际行数
int actualMergeRows = Math.min(mergeRowsPerGroup, totalRows - currentStart);
// 复用原有mergeTableCell方法执行合并
mergeTableCell(table, currentStart, mergeCol, actualMergeRows, 1);
}
log.info("表格{}合并完成:第{}列 从第{}行开始 每{}行合并一次",
rule.getTableIndex(), mergeCol, startRow, mergeRowsPerGroup);
}
}

View File

@@ -195,18 +195,15 @@ public class ExportModelController extends BaseController {
param.setB(day == 0);
//限值
OverLimitInfo overLimitData = reportService.getOverLimitData(param);
//OverLimitInfo overLimitData = reportService.getOverLimitData(param);
Overlimit overLimit;
if (type == 0) {
overLimit = lineFeignClient.getOverLimitData(param.getLineId()).getData();
} else {
overLimit = monitorClient.getOverLimitData(param.getLineId()).getData();
}
param.setCount(overLimitData.getCount());
overLimitData.setOverLimitRate(Arrays.asList(overLimit));
if (0 == overLimitData.getOverLimitRate().size()) {
if (Objects.isNull(overLimit)) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, "dataFail", methodDescribe);
}
@@ -232,6 +229,9 @@ public class ExportModelController extends BaseController {
} catch (Exception e1) {
log.info("获取报表发生异常,异常是" + e1.getMessage());
}
//上移提前塞入基波电压基波电流
getCurrentRate(param, overLimit);
getVoltageRate(param, overLimit);
// 报告Map
Map<String, Object> reportmap = new HashMap<>(16);
@@ -337,14 +337,14 @@ public class ExportModelController extends BaseController {
**** 三张大表基础数据幅值
***************************************************************/
// 基波电压最大值
reportmap.put("$C" + "V0" + "X" + "_A$", judgeNull(voltage1.getFmaxValue()));
reportmap.put("$C" + "V0" + "X" + "_B$", judgeNull(voltage2.getFmaxValue()));
reportmap.put("$C" + "V0" + "X" + "_C$", judgeNull(voltage3.getFmaxValue()));
reportmap.put("$C" + "V0" + "X" + "_A$", judgeNull(this.listVoltageRate.get(0).getList().get(0).getFmaxValue()));
reportmap.put("$C" + "V0" + "X" + "_B$", judgeNull(this.listVoltageRate.get(0).getList().get(1).getFmaxValue()));
reportmap.put("$C" + "V0" + "X" + "_C$", judgeNull(this.listVoltageRate.get(0).getList().get(2).getFmaxValue()));
// 基波电流最大值
reportmap.put("$C" + "I0" + "X" + "_A$", judgeNull(current1.getFmaxValue()));
reportmap.put("$C" + "I0" + "X" + "_B$", judgeNull(current2.getFmaxValue()));
reportmap.put("$C" + "I0" + "X" + "_C$", judgeNull(current3.getFmaxValue()));
reportmap.put("$C" + "I0" + "X" + "_A$", judgeNull(this.listICurrent.get(0).getList().get(0).getFmaxValue()));
reportmap.put("$C" + "I0" + "X" + "_B$", judgeNull(this.listICurrent.get(0).getList().get(1).getFmaxValue()));
reportmap.put("$C" + "I0" + "X" + "_C$", judgeNull(this.listICurrent.get(0).getList().get(2).getFmaxValue()));
// 基波电压最小值
reportmap.put("$B" + "V0" + "N" + "_A$", judgeNull(voltage1.getMinValue()));
@@ -360,14 +360,14 @@ public class ExportModelController extends BaseController {
**** 三张大表基础数据幅值
***************************************************************/
// 基波电压最小值
reportmap.put("$C" + "V0" + "N" + "_A$", judgeNull(voltage1.getMinValue()));
reportmap.put("$C" + "V0" + "N" + "_B$", judgeNull(voltage2.getMinValue()));
reportmap.put("$C" + "V0" + "N" + "_C$", judgeNull(voltage3.getMinValue()));
reportmap.put("$C" + "V0" + "N" + "_A$", judgeNull(this.listVoltageRate.get(0).getList().get(0).getMinValue()));
reportmap.put("$C" + "V0" + "N" + "_B$", judgeNull(this.listVoltageRate.get(0).getList().get(1).getMinValue()));
reportmap.put("$C" + "V0" + "N" + "_C$", judgeNull(this.listVoltageRate.get(0).getList().get(2).getMinValue()));
// 基波电流最小值
reportmap.put("$C" + "I0" + "N" + "_A$", judgeNull(current1.getMinValue()));
reportmap.put("$C" + "I0" + "N" + "_B$", judgeNull(current2.getMinValue()));
reportmap.put("$C" + "I0" + "N" + "_C$", judgeNull(current3.getMinValue()));
reportmap.put("$C" + "I0" + "N" + "_A$", judgeNull(this.listICurrent.get(0).getList().get(0).getMinValue()));
reportmap.put("$C" + "I0" + "N" + "_B$", judgeNull(this.listICurrent.get(0).getList().get(1).getMinValue()));
reportmap.put("$C" + "I0" + "N" + "_C$", judgeNull(this.listICurrent.get(0).getList().get(2).getMinValue()));
// 基波电压平均值
reportmap.put("$B" + "V0" + "E" + "_A$", judgeNull(voltage1.getMeanValue()));
@@ -383,14 +383,14 @@ public class ExportModelController extends BaseController {
**** 三张大表基础数据幅值
***************************************************************/
// 基波电压平均值
reportmap.put("$C" + "V0" + "E" + "_A$", judgeNull(voltage1.getMeanValue()));
reportmap.put("$C" + "V0" + "E" + "_B$", judgeNull(voltage2.getMeanValue()));
reportmap.put("$C" + "V0" + "E" + "_C$", judgeNull(voltage3.getMeanValue()));
reportmap.put("$C" + "V0" + "E" + "_A$", judgeNull(this.listVoltageRate.get(0).getList().get(0).getMeanValue()));
reportmap.put("$C" + "V0" + "E" + "_B$", judgeNull(this.listVoltageRate.get(0).getList().get(1).getMeanValue()));
reportmap.put("$C" + "V0" + "E" + "_C$", judgeNull(this.listVoltageRate.get(0).getList().get(2).getMeanValue()));
// 基波电流平均值
reportmap.put("$C" + "I0" + "E" + "_A$", judgeNull(current1.getMeanValue()));
reportmap.put("$C" + "I0" + "E" + "_B$", judgeNull(current2.getMeanValue()));
reportmap.put("$C" + "I0" + "E" + "_C$", judgeNull(current3.getMeanValue()));
reportmap.put("$C" + "I0" + "E" + "_A$", judgeNull(this.listICurrent.get(0).getList().get(0).getMeanValue()));
reportmap.put("$C" + "I0" + "E" + "_B$", judgeNull(this.listICurrent.get(0).getList().get(1).getMeanValue()));
reportmap.put("$C" + "I0" + "E" + "_C$", judgeNull(this.listICurrent.get(0).getList().get(2).getMeanValue()));
// 基波电压cp95值
reportmap.put("$B" + "V0" + "%" + "_A$", judgeNull(voltage1.getCp95Value()));
@@ -406,14 +406,14 @@ public class ExportModelController extends BaseController {
**** 三张大表基础数据幅值
***************************************************************/
// 基波电压cp95值
reportmap.put("$C" + "V0" + "%" + "_A$", judgeNull(voltage1.getCp95Value()));
reportmap.put("$C" + "V0" + "%" + "_B$", judgeNull(voltage2.getCp95Value()));
reportmap.put("$C" + "V0" + "%" + "_C$", judgeNull(voltage3.getCp95Value()));
reportmap.put("$C" + "V0" + "%" + "_A$", judgeNull(this.listVoltageRate.get(0).getList().get(0).getCp95Value()));
reportmap.put("$C" + "V0" + "%" + "_B$", judgeNull(this.listVoltageRate.get(0).getList().get(1).getCp95Value()));
reportmap.put("$C" + "V0" + "%" + "_C$", judgeNull(this.listVoltageRate.get(0).getList().get(2).getCp95Value()));
// 基波电流cp95值
reportmap.put("$C" + "I0" + "%" + "_A$", judgeNull(current1.getCp95Value()));
reportmap.put("$C" + "I0" + "%" + "_B$", judgeNull(current2.getCp95Value()));
reportmap.put("$C" + "I0" + "%" + "_C$", judgeNull(current3.getCp95Value()));
reportmap.put("$C" + "I0" + "%" + "_A$", judgeNull(this.listICurrent.get(0).getList().get(0).getCp95Value()));
reportmap.put("$C" + "I0" + "%" + "_B$", judgeNull(this.listICurrent.get(0).getList().get(1).getCp95Value()));
reportmap.put("$C" + "I0" + "%" + "_C$", judgeNull(this.listICurrent.get(0).getList().get(2).getCp95Value()));
// 遍历map中的值
int iCount = 0;
@@ -552,8 +552,8 @@ public class ExportModelController extends BaseController {
getDistortion(param, overLimit);
getFre(param, overLimit);
getThreePhase(param, overLimit);
getVoltageRate(param, overLimit);
getCurrentRate(param, overLimit);
// getVoltageRate(param, overLimit);
// getCurrentRate(param, overLimit);
// 短闪
ReportValue pst1 = this.listFlicker.get(0).getList().get(0);
// 短闪
@@ -624,69 +624,126 @@ public class ExportModelController extends BaseController {
ReportValue vdeviation3 = this.listVdeviation.get(0).getList().get(2);
// 获取电压上下偏差的国标限值
String vdeviationLimit = judgeNull(this.listVdeviation.get(0).getOverLimit());
reportmap.put("$VD_L$", vdeviationLimit);
//电压下偏差
String ldeviationLimit = judgeNull(this.listVdeviation.get(1).getOverLimit());
reportmap.put("$VD_L$",ldeviationLimit+""+ vdeviationLimit);
String strResultVdeviationdata = "";
String tmpstrResultVdeviationdata = "";
String strResultVdeviationdataValue = "";
// 获取电压偏差
String tmpstrMap = "";
reportmap.put("$VDTX_A$", judgeNull(vdeviation1.getFmaxValue()));
reportmap.put("$VDTN_A$", judgeNull(vdeviation1.getMinValue()));
reportmap.put("$VDTE_A$", judgeNull(vdeviation1.getMeanValue()));
reportmap.put("$VDT%_A$", judgeNull(vdeviation1.getCp95Value()));
reportmap.put("$VDTX_B$", judgeNull(vdeviation2.getFmaxValue()));
reportmap.put("$VDTN_B$", judgeNull(vdeviation2.getMinValue()));
reportmap.put("$VDTE_B$", judgeNull(vdeviation2.getMeanValue()));
reportmap.put("$VDT%_B$", judgeNull(vdeviation2.getCp95Value()));
if (pttype != 2) {
reportmap.put("$VDTX_C$", judgeNull(vdeviation3.getFmaxValue()));
reportmap.put("$VDTN_C$", judgeNull(vdeviation3.getMinValue()));
reportmap.put("$VDTE_C$", judgeNull(vdeviation3.getMeanValue()));
reportmap.put("$VDT%_C$", judgeNull(vdeviation3.getCp95Value()));
} else {
reportmap.put("$VDTX_C$", "-");
reportmap.put("$VDTN_C$", "-");
reportmap.put("$VDTE_C$", "-");
reportmap.put("$VDT%_C$", "-");
}
// 获取电压偏差
// 值错误判断
try {
maxValue = Math.abs(Double.parseDouble(vdeviation1.getFmaxValue().toString()));
minValue = Math.abs(Double.parseDouble(vdeviation1.getMinValue().toString()));
aveValue = Math.abs(Double.parseDouble(vdeviation1.getMeanValue().toString()));
cp95Value = Math.abs(Double.parseDouble(vdeviation1.getCp95Value().toString()));
limit = Math.abs(Double.parseDouble(vdeviationLimit));
for (int i = 0; i < 3; i++) {
tmpstrMap = "A";
switch (i) {
case 0:
tmpstrMap = "A";
break;
case 1:
tmpstrMap = "B";
break;
default:
tmpstrMap = "C";
break;
}
ReportValue vdeviation = this.listVdeviation.get(0).getList().get(i);
if(Objects.equals("C",tmpstrMap)&&pttype == 2){
reportmap.put("$VDTX_C$", "-");
reportmap.put("$VDTN_C$", "-");
reportmap.put("$VDTE_C$", "-");
reportmap.put("$VDT%_C$", "-");
continue;
}else {
reportmap.put("$VDTX_" + tmpstrMap + "$", judgeNull(vdeviation.getFmaxValue()));
reportmap.put("$VDTN_" + tmpstrMap + "$", judgeNull(vdeviation.getMinValue()));
reportmap.put("$VDTE_" + tmpstrMap + "$", judgeNull(vdeviation.getMeanValue()));
reportmap.put("$VDT%_" + tmpstrMap + "$", judgeNull(vdeviation.getCp95Value()));
}
// 电压偏差
Double vmaxValue = Double.parseDouble(reportmap.get("$VDTX_" + tmpstrMap + "$").toString());
Double vminValue = Double.parseDouble(reportmap.get("$VDTN_" + tmpstrMap + "$").toString());
Double vaveValue = Double.parseDouble(reportmap.get("$VDTE_" + tmpstrMap + "$").toString());
Double vcp95Value = Double.parseDouble(reportmap.get("$VDT%_" + tmpstrMap + "$").toString());
if("".equals(strResultVdeviationdataValue)){
if (!(vmaxValue >= vminValue && vmaxValue >= vaveValue && vmaxValue >= vcp95Value)) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName
+ "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值2、平均值>=最小值3、95%概率值>=最小值)。";
} else if (vaveValue < vminValue) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName
+ "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值2、平均值>=最小值3、95%概率值>=最小值)。";
} else if (vcp95Value < vminValue) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName
+ "电压偏差数据数据存在异常( 1、最大值>=最小值、平均值、95%概率值2、平均值>=最小值3、95%概率值>=最小值)。";
}
}
if(vmaxValue>Double.valueOf(vdeviationLimit)||vmaxValue<Double.valueOf(ldeviationLimit)){
if (!"".equals(tmpstrResultVdeviationdata)){
tmpstrResultVdeviationdata += "";
tmpstrResultVdeviationdata += tmpstrMap + "相最大值";
}else {
tmpstrResultVdeviationdata += tmpstrMap + "相最大值";
}
}
if(vminValue>Double.valueOf(vdeviationLimit)||vminValue<Double.valueOf(ldeviationLimit)){
if (!"".equals(tmpstrResultVdeviationdata)){
tmpstrResultVdeviationdata += "";
tmpstrResultVdeviationdata += tmpstrMap + "相最小值";
}else {
tmpstrResultVdeviationdata += tmpstrMap + "相最小值";
}
}
if(vaveValue>Double.valueOf(vdeviationLimit)||vaveValue<Double.valueOf(ldeviationLimit)){
if (!"".equals(tmpstrResultVdeviationdata)){
tmpstrResultVdeviationdata += "";
tmpstrResultVdeviationdata += tmpstrMap + "相平均值";
}else {
tmpstrResultVdeviationdata += tmpstrMap + "相平均值";
}
}
if(vcp95Value>Double.valueOf(vdeviationLimit)||vcp95Value<Double.valueOf(ldeviationLimit)){
if (!"".equals(tmpstrResultVdeviationdata)){
tmpstrResultVdeviationdata += "";
tmpstrResultVdeviationdata += tmpstrMap + "相95%概率值";
}else {
tmpstrResultVdeviationdata += tmpstrMap + "相95%概率值";
}
}
}
} catch (Exception e) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName + "电压偏差数据存在异常(不是数值类型)。";
}
if ("".equals(strResultVdeviationdataValue)) {
if (!(maxValue >= minValue && maxValue >= aveValue && maxValue >= cp95Value)) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName
+ "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值2、平均值>=最小值3、95%概率值>=最小值)。";
} else if (aveValue < minValue) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName
+ "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值2、平均值>=最小值3、95%概率值>=最小值)。";
} else if (cp95Value < minValue) {
strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName
+ "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值2、平均值>=最小值3、95%概率值>=最小值)。";
}
}
// 限值判断
if (maxValue > limit) {
if (!"".equals(tmpstrResultVdeviationdata))
tmpstrResultVdeviationdata += "";
tmpstrResultVdeviationdata += tmpstrMap + "";
}
//
// // 限值判断
// if (maxValue > limit) {
// if (!"".equals(tmpstrResultVdeviationdata))
// tmpstrResultVdeviationdata += "、";
// tmpstrResultVdeviationdata += tmpstrMap + "相";
// }
// 假如为空则所有的都满足
if ("".equals(tmpstrResultVdeviationdata)) {
strResultVdeviationdata += "从上表中可以看出" + strLineBaseName + "A、B、C三相电压偏差满足国标限值10%)的要求。";
strResultVdeviationdata += "从上表中可以看出" + strLineBaseName + "A、B、C三相电压偏差满足国标限值"+ldeviationLimit+"%至"+vdeviationLimit+"%)的要求。";
} else {
strAnalysis += tmpstrResultVdeviationdata + "电压偏差不满足国标限值(10%)的要求。";
strAnalysis += tmpstrResultVdeviationdata + "电压偏差不满足国标限值("+vdeviationLimit+")的要求。";
strResultVdeviationdata += "从上表中可以看出" + strLineBaseName + tmpstrResultVdeviationdata
+ "电压偏差不满足国标限值(10%)的要求。";
+ "电压偏差不满足国标限值("+ldeviationLimit+"%至"+vdeviationLimit+"%)的要求。";
}
reportmap.put("$ResultVdeviationdata$", strResultVdeviationdata);
@@ -1553,11 +1610,15 @@ public class ExportModelController extends BaseController {
public void getVdeviation(ReportQueryParam param, Overlimit overLimit) {
List<ReportValue> listVdeviation = reportService.getVdeviation(param);
List<Pass> list = new ArrayList<>();
for (int i = 0; i < 2; i++) {
// for (int i = 0; i < 2; i++) {
Pass pass;
pass = new Pass(overLimit.getVoltageDev(), EnumPass.MAX.getCode());
list.add(pass);
}
Pass pass1;
pass1 = new Pass(overLimit.getUvoltageDev(), EnumPass.MIN.getCode());
list.add(pass1);
// }
this.listVdeviation = new ArrayList<>();
transformData(this.listVdeviation, listVdeviation, list, true);
}

View File

@@ -0,0 +1,64 @@
package com.njcn.harmonic.controller.report;
import cn.hutool.core.date.TimeInterval;
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.harmonic.pojo.dto.FpyReportDTO;
import com.njcn.harmonic.pojo.param.QualifiedReportParam;
import com.njcn.harmonic.pojo.param.report.AreaHarmReportParam;
import com.njcn.harmonic.service.majornetwork.QualifiedReportService;
import com.njcn.harmonic.service.report.AreaHarmonicService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import 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 javax.servlet.http.HttpServletResponse;
/**
* pqs
* 合格率报告
* @author cdf
* @date 2023/5/31
*/
@Slf4j
@RestController
@RequestMapping("/areaHarmonicReport")
@Api(tags = "区域稳态报告")
@RequiredArgsConstructor
public class AreaHarmonicReportController extends BaseController {
private final AreaHarmonicService areaHarmonicService;
/**
* 区域稳态报告
* @author cdf
* @date 2023/6/7
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/areaHarmonicReport")
@ApiOperation("区域稳态报告")
public void areaHarmonicReport(@RequestBody AreaHarmReportParam areaHarmReportParam, HttpServletResponse response) {
TimeInterval timeInterval = new TimeInterval();
String methodDescribe = getMethodDescribe("areaHarmonicReport");
areaHarmonicService.areaHarmonicReport(areaHarmReportParam,response);
log.info("区域稳态报告执行时长:"+timeInterval.interval());
//return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
}

View File

@@ -13,7 +13,7 @@ import com.njcn.harmonic.pojo.po.ExcelRptTemp;
import com.njcn.harmonic.pojo.vo.ReportTemplateVO;
import com.njcn.harmonic.pojo.vo.ReportTreeVO;
import com.njcn.harmonic.pojo.vo.SysDeptTempVO;
import com.njcn.harmonic.service.CustomReportService;
import com.njcn.harmonic.service.report.CustomReportService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;

View File

@@ -7,22 +7,7 @@
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
MAX( CASE WHEN value_type = 'CP95' THEN rms END ) AS cp95Value
FROM
r_stat_data_i_d
<where>
@@ -38,20 +23,6 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
rms DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
@@ -61,22 +32,7 @@
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
rms,
@rankSum := IF( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
MAX( CASE WHEN value_type = 'CP95' THEN rms END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -92,20 +48,6 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
rms DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
@@ -151,7 +93,7 @@
</select>
<select id="getTotalPstCP95Day" resultType="java.lang.Integer">
SELECT
count( plt ) total
count( pst ) total
FROM
r_stat_data_flicker_d
<where>
@@ -172,25 +114,10 @@
<select id="getVVirtualData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
rms_lvr as rms,
@rankSum := IF( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN rms_lvr END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms_lvr END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms_lvr END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN rms_lvr END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -206,47 +133,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
rms_lvr DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<select id="getPowerP" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
p as rms,
@rankSum :=
IF
( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN p END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN p END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN p END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN p END ) AS cp95Value
FROM
r_stat_data_harmpower_p_d
<where>
@@ -262,50 +158,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN
1
WHEN value_type = 'MAX' THEN
2
WHEN value_type = 'MIN' THEN
3
WHEN value_type = 'AVG' THEN
4 ELSE 5
END
),
p DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<select id="getPF" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
pf as rms,
@rankSum :=
IF
( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN pf END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN pf END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN pf END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN pf END ) AS cp95Value
FROM
r_stat_data_harmpower_p_d
<where>
@@ -321,50 +183,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN
1
WHEN value_type = 'MAX' THEN
2
WHEN value_type = 'MIN' THEN
3
WHEN value_type = 'AVG' THEN
4 ELSE 5
END
),
pf DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<select id="getPowerQ" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
q as rms,
@rankSum :=
IF
( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN q END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN q END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN q END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN q END ) AS cp95Value
FROM
r_stat_data_harmpower_q_d
<where>
@@ -380,50 +208,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN
1
WHEN value_type = 'MAX' THEN
2
WHEN value_type = 'MIN' THEN
3
WHEN value_type = 'AVG' THEN
4 ELSE 5
END
),
q DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<select id="getPowerS" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
s as rms,
@rankSum :=
IF
( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN s END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN s END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN s END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN s END ) AS cp95Value
FROM
r_stat_data_harmpower_s_d
<where>
@@ -439,50 +233,17 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN
1
WHEN value_type = 'MAX' THEN
2
WHEN value_type = 'MIN' THEN
3
WHEN value_type = 'AVG' THEN
4 ELSE 5
END
),
s DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<!-- 短闪字段错了-->
<select id="getFlickerData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
plt as rms,
@rankSum :=
IF
( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN pst END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN pst END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN pst END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN pst END ) AS cp95Value
FROM
r_stat_data_flicker_d
<where>
@@ -498,52 +259,19 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN
1
WHEN value_type = 'MAX' THEN
2
WHEN value_type = 'MIN' THEN
3
WHEN value_type = 'AVG' THEN
4 ELSE 5
END
),
plt DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<!-- 长闪表查错了-->
<select id="getLFlickerData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
AVG( CASE WHEN value_type = 'AVG' THEN plt END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN plt END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN plt END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN plt END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
pst as rms,
@rankSum :=
IF
( @CI = phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
FROM
r_stat_data_flicker_d
r_stat_data_plt_d
<where>
phasic_type IN ( 'A', 'B', 'C')
and quality_flag = 0
@@ -557,48 +285,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN
1
WHEN value_type = 'MAX' THEN
2
WHEN value_type = 'MIN' THEN
3
WHEN value_type = 'AVG' THEN
4 ELSE 5
END
),
pst DESC
) AS t1
) a
GROUP BY
phasic_type
</select>
<select id="getUVdeviationData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
vu_dev as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN vu_dev END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN vu_dev END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN vu_dev END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN vu_dev END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -614,45 +310,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
vu_dev DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
<select id="getLVdeviationData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
vl_dev as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN vl_dev END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN vl_dev END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN vl_dev END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN vl_dev END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -668,45 +335,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
vl_dev DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
<select id="getDistortionDataV" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
v_thd as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN v_thd END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN v_thd END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN v_thd END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN v_thd END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -722,45 +360,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
v_thd DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
<select id="getDistortionDataI" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
i_thd as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN i_thd END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN i_thd END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN i_thd END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN i_thd END ) AS cp95Value
FROM
r_stat_data_i_d
<where>
@@ -776,45 +385,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
i_thd DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
<select id="getFrequencyData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
freq as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN freq END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN freq END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN freq END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN freq END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -830,45 +410,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
freq DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
<select id="getDEVFrequencyData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
freq_dev as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN freq_dev END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN freq_dev END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN freq_dev END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN freq_dev END ) AS cp95Value
FROM
r_stat_data_v_d
<where>
@@ -884,45 +435,16 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
freq_dev DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>
<select id="getINegData" resultType="com.njcn.harmonic.pojo.vo.ReportValue">
SELECT
phasic_type AS phaseType,
AVG( CASE WHEN value_type = 'AVG' THEN rms END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN rms END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN rms END ) AS fmaxValue,
MAX( CASE WHEN rankSum = #{param.count} THEN rms END ) AS cp95Value
FROM
(
SELECT
phasic_type,
value_type,
rms,
rankSum
FROM
(
SELECT
phasic_type,
value_type,
i_neg as rms,
@rankSum := IF( @CI := phasic_type, @rankSum + 1, 1 ) AS rankSum,
@CI := phasic_type
AVG( CASE WHEN value_type = 'AVG' THEN i_neg END ) AS meanValue,
MIN( CASE WHEN value_type = 'MIN' THEN i_neg END ) AS minValue,
MAX( CASE WHEN value_type = 'MAX' THEN i_neg END ) AS fmaxValue,
MAX( CASE WHEN value_type = 'CP95' THEN i_neg END ) AS cp95Value
FROM
r_stat_data_i_d
<where>
@@ -938,20 +460,6 @@
and line_id = #{param.lineId}
</if>
</where>
ORDER BY
phasic_type,
(
CASE
WHEN value_type = 'CP95' THEN 1
WHEN value_type = 'MAX' THEN 2
WHEN value_type = 'MIN' THEN 3
WHEN value_type = 'AVG' THEN 4
ELSE 5
END
),
rms DESC
) AS t1
) a
GROUP BY
phasic_type;
</select>

View File

@@ -322,14 +322,14 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
List<UserLedgerVO> userLedgerVOList = userLedgerFeignClient.selectUserList(new UserReportParam()).getData();
Map<String,UserLedgerVO> userLedgerVOMap = userLedgerVOList.stream().collect(Collectors.toMap(UserLedgerVO::getId,Function.identity()));
Map<String, UserLedgerVO> userLedgerVOMap = userLedgerVOList.stream().collect(Collectors.toMap(UserLedgerVO::getId, Function.identity()));
for (OverLimitLineDTO vo : overLimitLineList) {
MonitorOverLimitVO monitorOverLimitVO = new MonitorOverLimitVO();
BeanUtil.copyProperties(vo, monitorOverLimitVO);
MonitorOverLimitVO source = monMap.get(vo.getId()).get(0);
UserLedgerVO userLedgerVO = userLedgerVOMap.getOrDefault(vo.getObjId(),null);
monitorOverLimitVO.setLineObjectName(Objects.nonNull(userLedgerVO)?userLedgerVO.getProjectName():"/");
UserLedgerVO userLedgerVO = userLedgerVOMap.getOrDefault(vo.getObjId(), null);
monitorOverLimitVO.setLineObjectName(Objects.nonNull(userLedgerVO) ? userLedgerVO.getProjectName() : "/");
monitorOverLimitVO.setOverDay(source.getOverDay());
monitorOverLimitVO.setVolDevOverDay(source.getVolDevOverDay());
monitorOverLimitVO.setFreqOverDay(source.getFreqOverDay());
@@ -502,14 +502,28 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
@SuppressWarnings("unchecked")
public OverAreaLimitVO handleAreaData(List<RStatLimitTargetDPO> list, List<String> line, OverAreaVO param) {
int onlineCount = 0, overLineCount = 0, freqCount = 0, voltageCount = 0, ubalanceCount = 0, flickerCount = 0, iNegCount = 0, uharmCount = 0, iharmCount = 0, inuharmCount = 0;
int freqOverDay = 0, voltageOverDay = 0, ubalanceOverDay = 0, flickerOverDay = 0, iNegOverDay = 0, uharmOverDay = 0, iharmOverDay = 0, inuharmOverDay = 0;
OverAreaLimitVO overAreaLimitVO = new OverAreaLimitVO();
Set<String> freqList = new HashSet<>();
Set<String> voltageMonitorList = new HashSet<>();
Set<String> threePhaseVoltageMonitorList = new HashSet<>();
Set<String> flickerMonitorList = new HashSet<>();
Set<String> harmonicVoltageMonitorList = new HashSet<>();
Set<String> harmonicCurrentMonitorList = new HashSet<>();
int threeV = 0, fiveV = 0, sevenV = 0, elevenV = 0, otherV = 0;
Set<String> threeVList = new HashSet<>(), fiveVList = new HashSet<>(), sevenVList = new HashSet<>(), elevenVList = new HashSet<>(), otherVList = new HashSet<>();
int threeI = 0, fiveI = 0, sevenI = 0, elevenI = 0,otherI = 0;
Set<String> threeIList = new HashSet<>(), fiveIList = new HashSet<>(), sevenIList = new HashSet<>(), elevenIList = new HashSet<>(), otherIList = new HashSet<>();
if (!CollectionUtils.isEmpty(list)) {
List<RStatLimitTargetDPO> data = (List<RStatLimitTargetDPO>) getAllData(line, param.getSearchBeginTime(), param.getSearchEndTime(), Param.LIMIT_TARGET);
if (!CollectionUtils.isEmpty(data)) {
onlineCount = data.size();
//在线监测点个数
overAreaLimitVO.setOnlineMonitorNumber(onlineCount);
for (RStatLimitTargetDPO item : data) {
if (item.getFreqDevOvertime() > 0 || item.getVoltageDevOvertime() > 0 || item.getUbalanceOvertime() > 0 || item.getFlickerOvertime() > 0 || item.getINegOvertime() > 0 || item.getUharm2Overtime() > 0 || item.getIharm2Overtime() > 0 || item.getInuharm1Overtime() > 0) {
overLineCount++;
@@ -529,89 +543,382 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
if (item.getINegOvertime() > 0) {
iNegCount++;
}
if (item.getUharm2Overtime() > 0) {
if (vHarmFlag(item)) {
uharmCount++;
}
if (item.getIharm2Overtime() > 0) {
if (iHarmFlag(item)) {
iharmCount++;
}
if (item.getInuharm1Overtime() > 0) {
if (inHarmFlag(item)) {
inuharmCount++;
}
//区域报告
if (Objects.nonNull(param.getAreaReportFlag()) && param.getAreaReportFlag() == 1) {
if (item.getFreqDevOvertime() > 0) {
freqList.add(item.getLineId());
}
if (item.getVoltageDevOvertime() > 0) {
voltageMonitorList.add(item.getLineId());
}
if (item.getUbalanceOvertime() > 0) {
threePhaseVoltageMonitorList.add(item.getLineId());
}
if (item.getFlickerOvertime() > 0) {
flickerMonitorList.add(item.getLineId());
}
if (vHarmFlag(item)) {
harmonicVoltageMonitorList.add(item.getLineId());
}
if (iHarmFlag(item)) {
harmonicCurrentMonitorList.add(item.getLineId());
}
if (item.getUharm3Overtime() > 0) {
threeV++;
threeVList.add(item.getLineId());
}
if (item.getUharm5Overtime() > 0) {
fiveV++;
fiveVList.add(item.getLineId());
}
if (item.getUharm7Overtime() > 0) {
sevenV++;
sevenVList.add(item.getLineId());
}
if (item.getUharm11Overtime() > 0) {
elevenV++;
elevenVList.add(item.getLineId());
}
if (vOtherHarmFlag(item)) {
otherV++;
otherVList.add(item.getLineId());
}
if (item.getIharm3Overtime() > 0) {
threeI++;
threeIList.add(item.getLineId());
}
if (item.getIharm5Overtime() > 0) {
fiveI++;
fiveIList.add(item.getLineId());
}
if (item.getIharm7Overtime() > 0) {
sevenI++;
sevenIList.add(item.getLineId());
}
if (item.getIharm11Overtime() > 0) {
elevenI++;
elevenIList.add(item.getLineId());
}
if (iOtherHarmFlag(item)) {
otherI++;
otherIList.add(item.getLineId());
}
}
}
//超标监测点个数
overAreaLimitVO.setOverLimitMonitorNumber(overLineCount);
//超标监测点数占比
overAreaLimitVO.setOverBiLi(BigDecimal.valueOf(overLineCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
//频率偏差
overAreaLimitVO.setFrequencyMonitorNumber(freqCount);
overAreaLimitVO.setFrequencyBiLi(BigDecimal.valueOf(freqCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setFreqMonitorList(new ArrayList<>(freqList));
//电压偏差
overAreaLimitVO.setVoltageMonitorNumber(voltageCount);
overAreaLimitVO.setVoltageBiLi(BigDecimal.valueOf(voltageCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
//谐波电压
overAreaLimitVO.setHarmonicVoltageMonitorNumber(uharmCount);
overAreaLimitVO.setHarmonicVoltageBiLi(BigDecimal.valueOf(uharmCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
//谐波电流
overAreaLimitVO.setHarmonicCurrentMonitorNumber(iharmCount);
overAreaLimitVO.setHarmonicCurrentBiLi(BigDecimal.valueOf(iharmCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setVoltageMonitorList(new ArrayList<>(voltageMonitorList));
//三相电压不平衡度
overAreaLimitVO.setThreePhaseVoltageMonitorNumber(ubalanceCount);
overAreaLimitVO.setThreePhaseVoltageBiLi(BigDecimal.valueOf(ubalanceCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setThreePhaseVoltageMonitorList(new ArrayList<>(threePhaseVoltageMonitorList));
//闪变
overAreaLimitVO.setFlickerMonitorNumber(flickerCount);
overAreaLimitVO.setFlickerBiLi(BigDecimal.valueOf(flickerCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setFlickerMonitorList(new ArrayList<>(flickerMonitorList));
//负序电流
overAreaLimitVO.setNegativeMonitorNumber(iNegCount);
overAreaLimitVO.setNegativeBiLi(BigDecimal.valueOf(iNegCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
//谐波电压
overAreaLimitVO.setHarmonicVoltageMonitorNumber(uharmCount);
overAreaLimitVO.setHarmonicVoltageBiLi(BigDecimal.valueOf(uharmCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicVoltageMonitorList(new ArrayList<>(harmonicVoltageMonitorList));
//谐波电流
overAreaLimitVO.setHarmonicCurrentMonitorNumber(iharmCount);
overAreaLimitVO.setHarmonicCurrentBiLi(BigDecimal.valueOf(iharmCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicCurrentMonitorList(new ArrayList<>(harmonicCurrentMonitorList));
//间谐波电压
overAreaLimitVO.setInterHarmonicMonitorNumber(inuharmCount);
overAreaLimitVO.setInterHarmonicBiLi(BigDecimal.valueOf(inuharmCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
}
Map<LocalDate, List<RStatLimitTargetDPO>> map = list.stream().collect(Collectors.groupingBy(RStatLimitTargetDPO::getTime));
for (LocalDate key : map.keySet()) {
List<RStatLimitTargetDPO> l = map.get(key);
for (RStatLimitTargetDPO pojo : l) {
if (pojo.getFreqDevOvertime() > 0) {
freqOverDay++;
}
if (pojo.getVoltageDevOvertime() > 0) {
voltageOverDay++;
}
if (pojo.getUbalanceOvertime() > 0) {
ubalanceOverDay++;
}
if (pojo.getFlickerOvertime() > 0) {
flickerOverDay++;
}
if (pojo.getINegOvertime() > 0) {
iNegOverDay++;
}
if (pojo.getUharm2Overtime() > 0) {
uharmOverDay++;
}
if (pojo.getIharm2Overtime() > 0) {
iharmOverDay++;
}
if (pojo.getInuharm2Overtime() > 0) {
inuharmOverDay++;
int freqOverDay = 0, voltageOverDay = 0, ubalanceOverDay = 0, flickerOverDay = 0, iNegOverDay = 0, uharmOverDay = 0, iharmOverDay = 0, inuharmOverDay = 0;
int threeOverV = 0, fiveOverV = 0, sevenOverV = 0, elevenOverV = 0, otherOverV = 0;
int threeOverI = 0, fiveOverI = 0, sevenOverI = 0, elevenOverI = 0, otherOverI = 0;
Map<LocalDate, List<RStatLimitTargetDPO>> map = list.stream().collect(Collectors.groupingBy(RStatLimitTargetDPO::getTime));
List<Double> freqOverOneDayList = new ArrayList<>(), voltageOverOneDayList = new ArrayList<>(), ubalanceOverOneDayList = new ArrayList<>(),
flickerOverOneDayList = new ArrayList<>(), iNegOverOneDayList = new ArrayList<>(), uharmOverOneDayList = new ArrayList<>(),
iharmOverOneDayList = new ArrayList<>(), inuharmOverOneDayList = new ArrayList<>();
List<Double> threeOverOneDayList = new ArrayList<>(), fiveOverOneDayList = new ArrayList<>(), sevenOverOneDayList = new ArrayList<>(), elevenOverOneDayList = new ArrayList<>(), otherOverOneDayList = new ArrayList<>();
List<Double> threeOverOneDayIList = new ArrayList<>(), fiveOverOneDayIList = new ArrayList<>(), sevenOverOneDayIList = new ArrayList<>(), elevenOverOneDayIList = new ArrayList<>(), otherOverOneDayIList = new ArrayList<>();
for (LocalDate key : map.keySet()) {
int freqOverOneDay = 0, voltageOverOneDay = 0, ubalanceOverOneDay = 0, flickerOverOneDay = 0, iNegOverOneDay = 0, uharmOverOneDay = 0, iharmOverOneDay = 0, inuharmOverOneDay = 0;
int threeOneV = 0, fiveOneV = 0, sevenOneV = 0, elevenOneV = 0, otherOneV = 0;
int threeOneI = 0, fiveOneI = 0, sevenOneI = 0, elevenOneI = 0, otherOneI = 0;
List<RStatLimitTargetDPO> l = map.get(key);
for (RStatLimitTargetDPO pojo : l) {
if (pojo.getFreqDevOvertime() > 0) {
freqOverDay++;
freqOverOneDay++;
}
if (pojo.getVoltageDevOvertime() > 0) {
voltageOverDay++;
voltageOverOneDay++;
}
if (pojo.getUbalanceOvertime() > 0) {
ubalanceOverDay++;
ubalanceOverOneDay++;
}
if (pojo.getFlickerOvertime() > 0) {
flickerOverDay++;
flickerOverOneDay++;
}
if (pojo.getINegOvertime() > 0) {
iNegOverDay++;
iNegOverOneDay++;
}
if (vHarmFlag(pojo)) {
uharmOverDay++;
uharmOverOneDay++;
}
if (iHarmFlag(pojo)) {
iharmOverDay++;
iharmOverOneDay++;
}
if (inHarmFlag(pojo)) {
inuharmOverDay++;
inuharmOverOneDay++;
}
//区域报告
if (Objects.nonNull(param.getAreaReportFlag()) && param.getAreaReportFlag() == 1) {
if (pojo.getUharm3Overtime() > 0) {
threeOverV++;
threeOneV++;
}
if (pojo.getUharm5Overtime() > 0) {
fiveOverV++;
fiveOneV++;
}
if (pojo.getUharm7Overtime() > 0) {
sevenOverV++;
sevenOneV++;
}
if (pojo.getUharm11Overtime() > 0) {
elevenOverV++;
elevenOneV++;
}
if (vOtherHarmFlag(pojo)) {
otherOverV++;
otherOneV++;
}
if (pojo.getIharm3Overtime() > 0) {
threeOverI++;
threeOneI++;
}
if (pojo.getIharm5Overtime() > 0) {
fiveOverI++;
fiveOneI++;
}
if (pojo.getIharm7Overtime() > 0) {
sevenOverI++;
sevenOneI++;
}
if (pojo.getIharm11Overtime() > 0) {
elevenOverI++;
elevenOneI++;
}
if (iOtherHarmFlag(pojo)) {
otherOverI++;
otherOneI++;
}
}
}
freqOverOneDayList.add((double) freqOverOneDay / data.size() * 100);
voltageOverOneDayList.add((double) voltageOverOneDay / data.size() * 100);
ubalanceOverOneDayList.add((double) ubalanceOverOneDay / data.size() * 100);
flickerOverOneDayList.add((double) flickerOverOneDay / data.size() * 100);
iNegOverOneDayList.add((double) iNegOverOneDay / data.size() * 100);
uharmOverOneDayList.add((double) uharmOverOneDay / data.size() * 100);
iharmOverOneDayList.add((double) iharmOverOneDay / data.size() * 100);
inuharmOverOneDayList.add((double) inuharmOverOneDay / data.size() * 100);
threeOverOneDayList.add((double) threeOneV / data.size() * 100);
fiveOverOneDayList.add((double) fiveOneV / data.size() * 100);
sevenOverOneDayList.add((double) sevenOneV / data.size() * 100);
elevenOverOneDayList.add((double) elevenOneV / data.size() * 100);
elevenOverOneDayList.add((double) elevenOneV / data.size() * 100);
otherOverOneDayList.add((double) otherOneV / data.size() * 100);
threeOverOneDayIList.add((double) threeOneI / data.size() * 100);
fiveOverOneDayIList.add((double) fiveOneI / data.size() * 100);
sevenOverOneDayIList.add((double) sevenOneI / data.size() * 100);
elevenOverOneDayIList.add((double) elevenOneI / data.size() * 100);
otherOverOneDayIList.add((double) otherOneI / data.size() * 100);
}
}
if (onlineCount != 0) {
overAreaLimitVO.setFrequencyOverDayBiLi(freqCount == 0 ? 0.0 : BigDecimal.valueOf(freqOverDay * 1.0 / freqCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setVoltageOverDayBiLi(voltageCount == 0 ? 0.0 : BigDecimal.valueOf(voltageOverDay * 1.0 / voltageCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setThreePhaseVoltageOverDayBiLi(ubalanceCount == 0 ? 0.0 : BigDecimal.valueOf(ubalanceOverDay * 1.0 / ubalanceCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setFlickerOverDayBiLi(flickerCount == 0 ? 0.0 : BigDecimal.valueOf(flickerOverDay * 1.0 / flickerCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setNegativeOverDayBiLi(iNegCount == 0 ? 0.0 : BigDecimal.valueOf(iNegOverDay * 1.0 / iNegCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicVoltageOverDayBiLi(uharmCount == 0 ? 0.0 : BigDecimal.valueOf(uharmOverDay * 1.0 / uharmCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicCurrentOverDayBiLi(iharmCount == 0 ? 0.0 : BigDecimal.valueOf(iharmOverDay * 1.0 / iharmCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setInterHarmonicOverDayBiLi(inuharmCount == 0 ? 0.0 : BigDecimal.valueOf(inuharmOverDay * 1.0 / inuharmCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
if (onlineCount != 0) {
overAreaLimitVO.setFrequencyDayAvgBiLi(BigDecimal.valueOf(freqOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setVoltageDayAvgBiLi(BigDecimal.valueOf(voltageOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setThreePhaseVoltageDayAvgBiLi(BigDecimal.valueOf(ubalanceOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setFlickerDayAvgBiLi(BigDecimal.valueOf(flickerOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setNegativeDayAvgBiLi(BigDecimal.valueOf(iNegOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicVoltageDayAvgBiLi(BigDecimal.valueOf(uharmOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicCurrentDayAvgBiLi(BigDecimal.valueOf(iharmOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setInterHarmonicDayAvgBiLi(BigDecimal.valueOf(inuharmOverOneDayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setFrequencyOverDayBiLi(freqCount == 0 ? 0.0 : BigDecimal.valueOf(freqOverDay * 1.0 / freqCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setVoltageOverDayBiLi(voltageCount == 0 ? 0.0 : BigDecimal.valueOf(voltageOverDay * 1.0 / voltageCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setThreePhaseVoltageOverDayBiLi(ubalanceCount == 0 ? 0.0 : BigDecimal.valueOf(ubalanceOverDay * 1.0 / ubalanceCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setFlickerOverDayBiLi(flickerCount == 0 ? 0.0 : BigDecimal.valueOf(flickerOverDay * 1.0 / flickerCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setNegativeOverDayBiLi(iNegCount == 0 ? 0.0 : BigDecimal.valueOf(iNegOverDay * 1.0 / iNegCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicVoltageOverDayBiLi(uharmCount == 0 ? 0.0 : BigDecimal.valueOf(uharmOverDay * 1.0 / uharmCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setHarmonicCurrentOverDayBiLi(iharmCount == 0 ? 0.0 : BigDecimal.valueOf(iharmOverDay * 1.0 / iharmCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setInterHarmonicOverDayBiLi(inuharmCount == 0 ? 0.0 : BigDecimal.valueOf(inuharmOverDay * 1.0 / inuharmCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
}
//以下代码只有再区域报告时候会被调用
if (Objects.nonNull(param.getAreaReportFlag()) && param.getAreaReportFlag() == 1) {
List<OverAreaLimitVO.InnerHarmV> innerHarmVList = new ArrayList<>();
innerHarmVList.add(assLimitVO("3",threeVList,threeV,data.size(),threeOverV,threeOverOneDayList));
innerHarmVList.add(assLimitVO("5",fiveVList,fiveV,data.size(),fiveOverV,fiveOverOneDayList));
innerHarmVList.add(assLimitVO("7",sevenVList,sevenV,data.size(),sevenOverV,sevenOverOneDayList));
innerHarmVList.add(assLimitVO("11",elevenVList,elevenV,data.size(),elevenOverV,elevenOverOneDayList));
innerHarmVList.add(assLimitVO("其他",otherVList,otherV,data.size(),otherOverV,otherOverOneDayList));
overAreaLimitVO.setInnerHarmVList(innerHarmVList);
List<OverAreaLimitVO.InnerHarmV> innerHarmIList = new ArrayList<>();
innerHarmIList.add(assLimitVO("3",threeIList,threeI,data.size(),threeOverI,threeOverOneDayIList));
innerHarmIList.add(assLimitVO("5",fiveIList,fiveI,data.size(),fiveOverI,fiveOverOneDayIList));
innerHarmIList.add(assLimitVO("7",sevenIList,sevenI,data.size(),sevenOverI,sevenOverOneDayIList));
innerHarmIList.add(assLimitVO("11",elevenIList,elevenI,data.size(),elevenOverI,elevenOverOneDayIList));
innerHarmIList.add(assLimitVO("其他",otherIList,otherI,data.size(),otherOverI,otherOverOneDayIList));
overAreaLimitVO.setInnerHarmIList(innerHarmIList);
}
}
return overAreaLimitVO;
}
/**
* 对应报告表格一行数据
* @param name
* @param lineIds
* @param limitCount
* @param onlineNum
* @param everydayAllNum
* @param dayList 时间范围 日超标占比集合
* @return
*/
private OverAreaLimitVO.InnerHarmV assLimitVO(String name,Set<String> lineIds,int limitCount,int onlineNum,int everydayAllNum,List<Double> dayList){
OverAreaLimitVO.InnerHarmV inner = new OverAreaLimitVO.InnerHarmV();
inner.setName(name);
inner.setLimitIdList(new ArrayList<>(lineIds));
inner.setLimitCount(limitCount);
inner.setLimitRate(BigDecimal.valueOf(limitCount * 1.0 / onlineNum * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
inner.setDayAvg(BigDecimal.valueOf(dayList.stream().mapToDouble(it -> it).average().orElse(0)).setScale(2, RoundingMode.HALF_UP).doubleValue());
inner.setDayLimit(limitCount == 0 ? 0.0 : BigDecimal.valueOf(everydayAllNum * 1.0 / limitCount).setScale(2, RoundingMode.HALF_UP).doubleValue());
return inner;
}
private boolean vHarmFlag(RStatLimitTargetDPO x) {
int count = x.getUaberranceOvertime() +
x.getUharm2Overtime() + x.getUharm3Overtime() + x.getUharm4Overtime() + x.getUharm5Overtime() +
x.getUharm6Overtime() + x.getUharm7Overtime() + x.getUharm8Overtime() + x.getUharm9Overtime() +
x.getUharm10Overtime() + x.getUharm11Overtime() + x.getUharm12Overtime() + x.getUharm13Overtime() + x.getUharm14Overtime() +
x.getUharm15Overtime() + x.getUharm16Overtime() + x.getUharm17Overtime() + x.getUharm18Overtime() + x.getUharm19Overtime() +
x.getUharm20Overtime() + x.getUharm21Overtime() + x.getUharm22Overtime() + x.getUharm23Overtime() + x.getUharm24Overtime() +
x.getUharm25Overtime();
return count > 0;
}
private boolean vOtherHarmFlag(RStatLimitTargetDPO x) {
int count = x.getUharm2Overtime() + x.getUharm4Overtime() +
x.getUharm6Overtime() + x.getUharm8Overtime() + x.getUharm9Overtime() +
x.getUharm10Overtime() + x.getUharm12Overtime() + x.getUharm13Overtime() + x.getUharm14Overtime() +
x.getUharm15Overtime() + x.getUharm16Overtime() + x.getUharm17Overtime() + x.getUharm18Overtime() + x.getUharm19Overtime() +
x.getUharm20Overtime() + x.getUharm21Overtime() + x.getUharm22Overtime() + x.getUharm23Overtime() + x.getUharm24Overtime() +
x.getUharm25Overtime();
return count > 0;
}
private boolean iHarmFlag(RStatLimitTargetDPO rStatLimitRateDPO) {
int count = rStatLimitRateDPO.getIharm2Overtime() + rStatLimitRateDPO.getIharm3Overtime() + rStatLimitRateDPO.getIharm4Overtime() +
rStatLimitRateDPO.getIharm5Overtime() + rStatLimitRateDPO.getIharm6Overtime() + rStatLimitRateDPO.getIharm7Overtime() +
rStatLimitRateDPO.getIharm8Overtime() + rStatLimitRateDPO.getIharm9Overtime() + rStatLimitRateDPO.getIharm10Overtime() +
rStatLimitRateDPO.getIharm11Overtime() + rStatLimitRateDPO.getIharm12Overtime() + rStatLimitRateDPO.getIharm13Overtime() +
rStatLimitRateDPO.getIharm14Overtime() + rStatLimitRateDPO.getIharm15Overtime() + rStatLimitRateDPO.getIharm16Overtime() +
rStatLimitRateDPO.getIharm17Overtime() + rStatLimitRateDPO.getIharm18Overtime() + rStatLimitRateDPO.getIharm19Overtime() +
rStatLimitRateDPO.getIharm20Overtime() + rStatLimitRateDPO.getIharm21Overtime() + rStatLimitRateDPO.getIharm22Overtime() +
rStatLimitRateDPO.getIharm23Overtime() + rStatLimitRateDPO.getIharm24Overtime() + rStatLimitRateDPO.getIharm25Overtime();
return count > 0;
}
private boolean iOtherHarmFlag(RStatLimitTargetDPO rStatLimitRateDPO) {
int count = rStatLimitRateDPO.getIharm2Overtime() + rStatLimitRateDPO.getIharm4Overtime() + rStatLimitRateDPO.getIharm6Overtime() +
rStatLimitRateDPO.getIharm8Overtime() + rStatLimitRateDPO.getIharm9Overtime() + rStatLimitRateDPO.getIharm10Overtime() +
rStatLimitRateDPO.getIharm12Overtime() + rStatLimitRateDPO.getIharm13Overtime() +
rStatLimitRateDPO.getIharm14Overtime() + rStatLimitRateDPO.getIharm15Overtime() + rStatLimitRateDPO.getIharm16Overtime() +
rStatLimitRateDPO.getIharm17Overtime() + rStatLimitRateDPO.getIharm18Overtime() + rStatLimitRateDPO.getIharm19Overtime() +
rStatLimitRateDPO.getIharm20Overtime() + rStatLimitRateDPO.getIharm21Overtime() + rStatLimitRateDPO.getIharm22Overtime() +
rStatLimitRateDPO.getIharm23Overtime() + rStatLimitRateDPO.getIharm24Overtime() + rStatLimitRateDPO.getIharm25Overtime();
return count > 0;
}
private boolean inHarmFlag(RStatLimitTargetDPO t) {
int count = t.getInuharm1Overtime() + t.getInuharm2Overtime() + t.getInuharm3Overtime() + t.getInuharm4Overtime() + t.getInuharm5Overtime() + t.getInuharm6Overtime() + t.getInuharm7Overtime() + t.getInuharm8Overtime() + t.getInuharm9Overtime() + t.getInuharm10Overtime() + t.getInuharm11Overtime() + t.getInuharm12Overtime() + t.getInuharm13Overtime() + t.getInuharm14Overtime() + t.getInuharm15Overtime() + t.getInuharm16Overtime();
return count > 0;
}
/**
* 功能描述: 处理区域在线监测点数、超标监测点数
*

View File

@@ -212,9 +212,9 @@ public class ReportServiceImpl implements ReportService {
@Override
public List<ReportValue> getVoltageRate(ReportQueryParam param) {
List<ReportValue> list = new ArrayList<>();
//这里获取的是电压有效值不是V1
//获取基波电压幅值单位kV
List<ReportValue> listV = dataV(param, Arrays.asList("A", "B", "C"), 0, 1, true, 5);
List<ReportValue> listV = dataV(param, Arrays.asList("A", "B", "C"), 1, 2, false, 5);
if (CollUtil.isEmpty(listV)) {
RegroupData.regroupData(list, true, true);
@@ -409,20 +409,23 @@ public class ReportServiceImpl implements ReportService {
String cp95 = "CP95";
List<ReportValue> a = new ArrayList<>();
Map<String, List<RStatDataHarmrateVDPO>> collect = harmRateVDPOS.stream().collect(Collectors.groupingBy(RStatDataHarmrateVDPO::getPhaseType));
collect.forEach((key, value) -> {
//格式错误之前数据50A,50B50C,应该是50ABC
for (int i = num; i < size; i++) {
int finalI = i;
collect.forEach((key, value) -> {
Map<String, List<RStatDataHarmrateVDPO>> valueTypeMap = value.stream().collect(Collectors.groupingBy(RStatDataHarmrateVDPO::getValueType));
for (int i = num; i < size; i++) {
ReportValue reportValue = new ReportValue();
String attribute = "";
if (fly) {
if (index == 0) {
attribute = attributeV(i);
attribute = attributeV(finalI);
} else {
attribute = attributeV(index);
}
} else {
attribute = "v" + i;
attribute = "v" + finalI;
}
if (valueTypeMap.containsKey(max)) {
@@ -450,8 +453,9 @@ public class ReportServiceImpl implements ReportService {
reportValue.setCp95Value(cp95Num.get(0).floatValue());
}
a.add(reportValue);
}
});
}
return a;
}
@@ -553,20 +557,23 @@ public class ReportServiceImpl implements ReportService {
String cp95 = "CP95";
List<ReportValue> a = new ArrayList<>();
Map<String, List<RStatDataIDPO>> collect = rStatDataVDS.stream().collect(Collectors.groupingBy(RStatDataIDPO::getPhaseType));
collect.forEach((key, value) -> {
//格式错误之前数据50A,50B50C,应该是50ABC
for (int i = num; i < size; i++) {
int finalI = i;
collect.forEach((key, value) -> {
Map<String, List<RStatDataIDPO>> valueTypeMap = value.stream().collect(Collectors.groupingBy(RStatDataIDPO::getValueType));
for (int i = num; i < size; i++) {
ReportValue reportValue = new ReportValue();
String attribute = "";
if (fly) {
if (index == 0) {
attribute = attributeI(i);
attribute = attributeI(finalI);
} else {
attribute = attributeI(index);
}
} else {
attribute = "i" + i;
attribute = "i" + finalI;
}
if (valueTypeMap.containsKey(max)) {
List<Float> aa = reflectDataI(valueTypeMap.get(max), max, attribute);
@@ -593,8 +600,9 @@ public class ReportServiceImpl implements ReportService {
reportValue.setCp95Value(cp95Num.get(0).floatValue());
}
a.add(reportValue);
}
});
}
return a;
}

View File

@@ -0,0 +1,11 @@
package com.njcn.harmonic.service.report;
import com.njcn.harmonic.pojo.param.report.AreaHarmReportParam;
import javax.servlet.http.HttpServletResponse;
public interface AreaHarmonicService {
void areaHarmonicReport(AreaHarmReportParam areaHarmReportParam, HttpServletResponse response);
}

View File

@@ -1,4 +1,4 @@
package com.njcn.harmonic.service;
package com.njcn.harmonic.service.report;
import com.njcn.harmonic.pojo.param.ReportSearchParam;
import com.njcn.harmonic.pojo.param.ReportTemplateParam;
@@ -6,11 +6,8 @@ import com.njcn.harmonic.pojo.po.ExcelRptTemp;
import com.njcn.harmonic.pojo.vo.ReportTemplateVO;
import com.njcn.harmonic.pojo.vo.ReportTreeVO;
import com.njcn.harmonic.pojo.vo.SysDeptTempVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**

View File

@@ -0,0 +1,783 @@
package com.njcn.harmonic.service.report.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.dto.SimpleDTO;
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.MonitorCommLedgerInfoDTO;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.harmonic.pojo.dto.report.TableMergeRule;
import com.njcn.harmonic.pojo.param.report.AreaHarmReportParam;
import com.njcn.harmonic.pojo.vo.OverAreaLimitVO;
import com.njcn.harmonic.pojo.vo.OverAreaVO;
import com.njcn.harmonic.service.IAnalyzeService;
import com.njcn.harmonic.service.report.AreaHarmonicService;
import com.njcn.harmonic.utils.WordUtil2;
import com.njcn.system.api.DicDataFeignClient;
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 org.springframework.util.Assert;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* @Author: cdf
* @CreateTime: 2026-01-04
* @Description: 区域报告 - 优化版本
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class AreaHarmonicServiceImpl implements AreaHarmonicService {
// 常量定义
private static final String REPORT_TEMPLATE_PATH = "file/areaReportTemplate.docx";
private static final String DEFAULT_PROVIDER_DEPT = "中国电力技术研究院";
private static final String NO_DATA_PLACEHOLDER = "";
private static final String UNKNOWN_VALUE = "/";
// 指标等级阈值
private static final double EXCELLENT_MAX_THRESHOLD = 5.0;
private static final double GOOD_MAX_THRESHOLD = 10.0;
private static final double MEDIUM_MAX_THRESHOLD = 30.0;
// 谐波次数顺序(保持原有顺序)
private static final List<String> HARMONIC_ORDERS = Arrays.asList("3", "5", "7", "11","other");
// 表格索引(保持原有顺序)
private static final int LEDGER_TABLE_INDEX = 1;
private static final int VOLTAGE_DEV_TABLE_INDEX = 3;
private static final int FREQUENCY_TABLE_INDEX = 4;
private static final int VOLTAGE_BALANCE_TABLE_INDEX = 5;
private static final int FLICKER_TABLE_INDEX = 6;
private static final int VOLTAGE_HARMONIC_TABLE_INDEX = 7;
private static final int CURRENT_HARMONIC_TABLE_INDEX = 8;
private final WordUtil2 wordUtil2;
private final DeptFeignClient deptFeignClient;
private final CommTerminalGeneralClient commTerminalGeneralClient;
private final IAnalyzeService iAnalyzeService; // 修正变量名
private final DicDataFeignClient dicDataFeignClient;
@Override
public void areaHarmonicReport(AreaHarmReportParam areaHarmReportParam, HttpServletResponse response) {
try {
Assert.notNull(areaHarmReportParam, "报告参数不能为空");
// 1. 构建报告数据
Map<String, Object> reportData = buildReportData(areaHarmReportParam);
// 2. 构建表格数据
List<List<String[]>> tableList = buildTableData(areaHarmReportParam,reportData);
// 3. 生成Word报告
generateWordReport(reportData, tableList, response);
} catch (Exception e) {
log.error("区域谐波报告生成失败,参数: {}", areaHarmReportParam, e);
throw new BusinessException(CommonResponseEnum.FAIL,"报告生成失败");
}
}
/**
* 构建报告基础数据
*/
private Map<String, Object> buildReportData(AreaHarmReportParam param) {
Map<String, Object> reportData = new HashMap<>(32);
// 部门信息
Dept dept = getDeptInfo(param.getDeptId());
reportData.put("$deptName$", dept.getName());
reportData.put("$provideDept$", DEFAULT_PROVIDER_DEPT);
reportData.put("$TitleTime$", DateUtil.format(new DateTime(), DatePattern.CHINESE_DATE_PATTERN));
// 时间范围
String timeRange = formatTimeRange(param.getStartTime(), param.getEndTime());
reportData.put("$reportRangeTime$", timeRange);
return reportData;
}
/**
* 构建所有表格数据
*/
private List<List<String[]>> buildTableData(AreaHarmReportParam param,Map<String, Object> reportData) {
List<List<String[]>> tableList = new ArrayList<>();
// 添加空行(保持原有结构)
tableList.add(new ArrayList<>());
// 1. 台账表格
List<String[]> ledgerTable = buildLedgerTable(param.getDeptId());
tableList.add(ledgerTable);
// 添加空行(保持原有结构)
tableList.add(new ArrayList<>());
// 2. 电能质量数据表格
List<OverAreaLimitVO> qualityData = getPowerQualityData(param);
if (CollUtil.isNotEmpty(qualityData)) {
// 构建监控点名称映射
Map<String, String> monitorNameMap = buildMonitorNameMap(param.getDeptId());
// 过滤有效数据(在线监控数>0
List<OverAreaLimitVO> validData = qualityData.stream()
.filter(vo -> vo.getOnlineMonitorNumber() != null && vo.getOnlineMonitorNumber() > 0)
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(validData)) {
tableList.add(buildVoltageDeviationTable(validData));
tableList.add(buildFrequencyTable(validData));
tableList.add(buildVoltageBalanceTable(validData));
tableList.add(buildFlickerTable(validData));
tableList.add(buildVoltageHarmonicTable(validData));
tableList.add(buildCurrentHarmonicTable(validData));
// 计算并设置指标数据到临时存储,稍后合并
calculateAndStoreIndicatorData(reportData, validData, monitorNameMap);
}
}
// 添加空行(保持原有结构)
tableList.add(new ArrayList<>());
return tableList;
}
/**
* 构建台账表格
*/
private List<String[]> buildLedgerTable(String deptId) {
List<MonitorCommLedgerInfoDTO> ledgerList = getLedgerInfo(deptId);
if (CollUtil.isEmpty(ledgerList)) {
return new ArrayList<>();
}
// 获取电压等级字典
Map<String, String> voltageLevelMap = getVoltageLevelMap();
return IntStream.range(0, ledgerList.size())
.mapToObj(i -> {
MonitorCommLedgerInfoDTO ledger = ledgerList.get(i);
return new String[]{
String.valueOf(i + 1),
ledger.getMonitorName(),
ledger.getBdName(),
ledger.getBusBarName(),
voltageLevelMap.getOrDefault(ledger.getVoltageLevel(), ""),
ledger.getShortCapacity(),
ledger.getDevCapacity(),
ledger.getDealCapacity()
};
})
.collect(Collectors.toList());
}
/**
* 构建电压偏差表格
*/
private List<String[]> buildVoltageDeviationTable(List<OverAreaLimitVO> dataList) {
return dataList.stream()
.filter(vo -> vo.getOnlineMonitorNumber() != null && vo.getOnlineMonitorNumber() > 0)
.map(vo -> new String[]{
vo.getName(),
vo.getOnlineMonitorNumber().toString(),
vo.getVoltageMonitorNumber().toString(),
vo.getVoltageBiLi().toString(),
vo.getVoltageDayAvgBiLi().toString(),
vo.getVoltageOverDayBiLi().toString()
})
.collect(Collectors.toList());
}
/**
* 构建频率表格
*/
private List<String[]> buildFrequencyTable(List<OverAreaLimitVO> dataList) {
return dataList.stream()
.filter(vo -> vo.getOnlineMonitorNumber() != null && vo.getOnlineMonitorNumber() > 0)
.map(vo -> new String[]{
vo.getName(),
vo.getOnlineMonitorNumber().toString(),
vo.getFrequencyMonitorNumber().toString(),
vo.getFrequencyBiLi().toString(),
vo.getFrequencyDayAvgBiLi().toString(),
vo.getFrequencyOverDayBiLi().toString()
})
.collect(Collectors.toList());
}
/**
* 构建三相电压不平衡度表格
*/
private List<String[]> buildVoltageBalanceTable(List<OverAreaLimitVO> dataList) {
return dataList.stream()
.filter(vo -> vo.getOnlineMonitorNumber() != null && vo.getOnlineMonitorNumber() > 0)
.map(vo -> new String[]{
vo.getName(),
vo.getOnlineMonitorNumber().toString(),
vo.getThreePhaseVoltageMonitorNumber().toString(),
vo.getThreePhaseVoltageBiLi().toString(),
vo.getThreePhaseVoltageDayAvgBiLi().toString(),
vo.getThreePhaseVoltageOverDayBiLi().toString()
})
.collect(Collectors.toList());
}
/**
* 构建闪变表格
*/
private List<String[]> buildFlickerTable(List<OverAreaLimitVO> dataList) {
return dataList.stream()
.filter(vo -> vo.getOnlineMonitorNumber() != null && vo.getOnlineMonitorNumber() > 0)
.map(vo -> new String[]{
vo.getName(),
vo.getOnlineMonitorNumber().toString(),
vo.getFlickerMonitorNumber().toString(),
vo.getFlickerBiLi().toString(),
vo.getFlickerDayAvgBiLi().toString(),
vo.getFlickerOverDayBiLi().toString()
})
.collect(Collectors.toList());
}
/**
* 构建谐波电压表格
*/
private List<String[]> buildVoltageHarmonicTable(List<OverAreaLimitVO> dataList) {
List<String[]> tableData = new ArrayList<>();
for (OverAreaLimitVO vo : dataList) {
if (vo.getOnlineMonitorNumber() == null || vo.getOnlineMonitorNumber() == 0) {
continue;
}
// 添加总行
tableData.add(new String[]{
vo.getName(),
"2~25",
vo.getOnlineMonitorNumber().toString(),
vo.getHarmonicVoltageMonitorNumber().toString(),
vo.getHarmonicVoltageBiLi().toString(),
vo.getHarmonicVoltageDayAvgBiLi().toString(),
vo.getHarmonicVoltageOverDayBiLi().toString()
});
// 添加各次谐波行
if (CollUtil.isNotEmpty(vo.getInnerHarmVList())) {
for (OverAreaLimitVO.InnerHarmV innerHarm : vo.getInnerHarmVList()) {
tableData.add(new String[]{
"",
innerHarm.getName(),
vo.getOnlineMonitorNumber().toString(),
innerHarm.getLimitCount().toString(),
innerHarm.getLimitRate().toString(),
innerHarm.getDayAvg().toString(),
innerHarm.getDayLimit().toString()
});
}
}
}
return tableData;
}
/**
* 构建谐波电流表格
*/
private List<String[]> buildCurrentHarmonicTable(List<OverAreaLimitVO> dataList) {
List<String[]> tableData = new ArrayList<>();
for (OverAreaLimitVO vo : dataList) {
if (vo.getOnlineMonitorNumber() == null || vo.getOnlineMonitorNumber() == 0) {
continue;
}
// 添加总行
tableData.add(new String[]{
vo.getName(),
"2~25",
vo.getOnlineMonitorNumber().toString(),
vo.getHarmonicCurrentMonitorNumber().toString(),
vo.getHarmonicCurrentBiLi().toString(),
vo.getHarmonicVoltageDayAvgBiLi().toString(), // 注意:这里保持原逻辑,使用谐波电压日均值
vo.getHarmonicCurrentOverDayBiLi().toString()
});
// 添加各次谐波行
if (CollUtil.isNotEmpty(vo.getInnerHarmIList())) {
for (OverAreaLimitVO.InnerHarmV innerHarm : vo.getInnerHarmIList()) {
tableData.add(new String[]{
"",
innerHarm.getName(),
vo.getOnlineMonitorNumber().toString(),
innerHarm.getLimitCount().toString(),
innerHarm.getLimitRate().toString(),
innerHarm.getDayAvg().toString(),
innerHarm.getDayLimit().toString()
});
}
}
}
return tableData;
}
/**
* 计算并存储指标数据
*/
private void calculateAndStoreIndicatorData(Map<String, Object> reportData,
List<OverAreaLimitVO> validData,
Map<String, String> monitorNameMap) {
// 电压偏差
processVoltageDeviation(reportData, validData, monitorNameMap);
// 频率偏差
processFrequencyDeviation(reportData, validData, monitorNameMap);
// 三相电压不平衡度
processVoltageBalance(reportData, validData, monitorNameMap);
// 闪变
processFlicker(reportData, validData, monitorNameMap);
// 谐波电压
processVoltageHarmonic(reportData, validData, monitorNameMap);
// 谐波电流
processCurrentHarmonic(reportData, validData, monitorNameMap);
// 生成结论
generateConclusion(reportData);
}
/**
* 处理电压偏差
*/
private void processVoltageDeviation(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
double avgRate = calculateAverage(dataList, OverAreaLimitVO::getVoltageBiLi);
List<String> monitorList = extractMonitorNames(dataList,
vo -> vo.getVoltageMonitorList(), monitorNameMap);
reportData.put("$voltageDevRate$", formatPercentage(avgRate));
reportData.put("$voltageDevMark$", getGrade(avgRate));
reportData.put("$voltageDevLine$", formatMonitorList(monitorList));
}
/**
* 处理频率偏差
*/
private void processFrequencyDeviation(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
double avgRate = calculateAverage(dataList, OverAreaLimitVO::getFrequencyBiLi);
List<String> monitorList = extractMonitorNames(dataList,
vo -> vo.getFreqMonitorList(), monitorNameMap);
reportData.put("$freqRate$", formatPercentage(avgRate));
reportData.put("$freqMark$", getGrade(avgRate));
reportData.put("$freqLine$", formatMonitorList(monitorList));
}
/**
* 处理三相电压不平衡度
*/
private void processVoltageBalance(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
double avgRate = calculateAverage(dataList, OverAreaLimitVO::getThreePhaseVoltageBiLi);
List<String> monitorList = extractMonitorNames(dataList,
vo -> vo.getThreePhaseVoltageMonitorList(), monitorNameMap);
reportData.put("$balanceRate$", formatPercentage(avgRate));
reportData.put("$balanceMark$", getGrade(avgRate));
reportData.put("$balanceLine$", formatMonitorList(monitorList));
}
/**
* 处理闪变
*/
private void processFlicker(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
double avgRate = calculateAverage(dataList, OverAreaLimitVO::getFlickerBiLi);
List<String> monitorList = extractMonitorNames(dataList,
vo -> vo.getFlickerMonitorList(), monitorNameMap);
reportData.put("$flickerRate$", formatPercentage(avgRate));
reportData.put("$flickerMark$", getGrade(avgRate));
reportData.put("$flickerLine$", formatMonitorList(monitorList));
}
/**
* 处理谐波电压
*/
private void processVoltageHarmonic(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
// 总谐波电压
double avgAll = calculateAverage(dataList, OverAreaLimitVO::getHarmonicVoltageBiLi);
List<String> monitorAllList = extractMonitorNames(dataList,
vo -> vo.getHarmonicVoltageMonitorList(), monitorNameMap);
reportData.put("$v_all_Rate$", formatPercentage(avgAll));
reportData.put("$v_all_Mark$", getGrade(avgAll));
reportData.put("$v_all_Line$", formatMonitorList(monitorAllList));
// 各次谐波电压(保持原有顺序)
for (int i = 0; i < HARMONIC_ORDERS.size(); i++) {
final int index = i;
double avgHarmonic = calculateAverageFromInnerList(dataList,
vo -> vo.getInnerHarmVList().get(index).getLimitRate());
List<String> monitorHarmonicList = extractMonitorNamesFromInnerList(dataList,
vo -> vo.getInnerHarmVList().get(index).getLimitIdList(), monitorNameMap);
String harmonicKey = HARMONIC_ORDERS.get(i);
reportData.put("$v_" + harmonicKey + "_Rate$", formatPercentage(avgHarmonic));
reportData.put("$v_" + harmonicKey + "_Mark$", getGrade(avgHarmonic));
reportData.put("$v_" + harmonicKey + "_Line$", formatMonitorList(monitorHarmonicList));
}
}
/**
* 处理谐波电流
*/
private void processCurrentHarmonic(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
// 总谐波电流
double avgAll = calculateAverage(dataList, OverAreaLimitVO::getHarmonicCurrentBiLi);
List<String> monitorAllList = extractMonitorNames(dataList,
vo -> vo.getHarmonicCurrentMonitorList(), monitorNameMap);
reportData.put("$i_all_Rate$", formatPercentage(avgAll));
reportData.put("$i_all_Mark$", getGrade(avgAll));
reportData.put("$i_all_Line$", formatMonitorList(monitorAllList));
// 各次谐波电流(保持原有顺序)
for (int i = 0; i < HARMONIC_ORDERS.size(); i++) {
final int index = i;
double avgHarmonic = calculateAverageFromInnerList(dataList,
vo -> vo.getInnerHarmIList().get(index).getLimitRate());
List<String> monitorHarmonicList = extractMonitorNamesFromInnerList(dataList,
vo -> vo.getInnerHarmIList().get(index).getLimitIdList(), monitorNameMap);
String harmonicKey = HARMONIC_ORDERS.get(i);
reportData.put("$i_" + harmonicKey + "_Rate$", formatPercentage(avgHarmonic));
reportData.put("$i_" + harmonicKey + "_Mark$", getGrade(avgHarmonic));
reportData.put("$i_" + harmonicKey + "_Line$", formatMonitorList(monitorHarmonicList));
}
}
/**
* 生成结论
*/
private void generateConclusion(Map<String, Object> reportData) {
Map<String, String> indicatorScores = new LinkedHashMap<>();
indicatorScores.put("供电电压偏差", reportData.get("$voltageDevMark$").toString());
indicatorScores.put("频率偏差", reportData.get("$freqMark$").toString());
indicatorScores.put("三相电压不平衡度", reportData.get("$balanceMark$").toString());
indicatorScores.put("闪变", reportData.get("$flickerMark$").toString());
indicatorScores.put("谐波电压", reportData.get("$v_all_Mark$").toString());
indicatorScores.put("谐波电流", reportData.get("$i_all_Mark$").toString());
// 按等级分类指标
Map<String, List<String>> categorizedIndicators = categorizeIndicators(indicatorScores);
// 构建结论文本
String conclusion = buildConclusionText(categorizedIndicators);
reportData.put("$conclusion$", conclusion);
}
/**
* 按等级分类指标
*/
private Map<String, List<String>> categorizeIndicators(Map<String, String> indicatorScores) {
Map<String, List<String>> categorized = new LinkedHashMap<>();
categorized.put("优秀", new ArrayList<>());
categorized.put("", new ArrayList<>());
categorized.put("", new ArrayList<>());
categorized.put("", new ArrayList<>());
indicatorScores.forEach((indicator, grade) -> {
if (categorized.containsKey(grade)) {
categorized.get(grade).add(indicator);
}
});
return categorized;
}
/**
* 构建结论文本
*/
private String buildConclusionText(Map<String, List<String>> categorizedIndicators) {
StringBuilder conclusion = new StringBuilder();
List<String> badIndicators = categorizedIndicators.get("");
// 按顺序构建结论
List<Map.Entry<String, List<String>>> entries = new ArrayList<>(categorizedIndicators.entrySet());
for (Map.Entry<String, List<String>> entry : entries) {
List<String> indicators = entry.getValue();
if (CollUtil.isNotEmpty(indicators)) {
if (conclusion.length() > 0) {
conclusion.append("");
}
conclusion.append(String.join("", indicators))
.append("等指标评分为").append(entry.getKey());
}
}
// 添加重点关注提示
if (CollUtil.isNotEmpty(badIndicators)) {
conclusion.append(",需要重点关注该区域")
.append(String.join("", badIndicators))
.append("等指标情况");
}
return conclusion.toString();
}
/**
* 生成Word报告
*/
private void generateWordReport(Map<String, Object> reportData,
List<List<String[]>> tableList,
HttpServletResponse response) {
try {
// 构建表格合并规则
List<TableMergeRule> mergeRules = buildTableMergeRules();
// 生成文件名
String fileName = generateFileName();
// 调用Word工具生成报告
wordUtil2.getWord(REPORT_TEMPLATE_PATH, reportData, fileName,
tableList, mergeRules, response);
} catch (Exception e) {
log.error("Word报告生成失败", e);
throw new BusinessException(CommonResponseEnum.FAIL,"Word报告生成失败");
}
}
/**
* 构建表格合并规则
*/
private List<TableMergeRule> buildTableMergeRules() {
List<TableMergeRule> mergeRules = new ArrayList<>();
// 表格7谐波电压的第0列每6行合并一次对应"单位"列)
mergeRules.add(TableMergeRule.build(VOLTAGE_HARMONIC_TABLE_INDEX, 0, 1, 6));
// 表格8谐波电流的第0列每6行合并一次对应"单位"列)
mergeRules.add(TableMergeRule.build(CURRENT_HARMONIC_TABLE_INDEX, 0, 1, 6));
return mergeRules;
}
/**
* 生成文件名
*/
private String generateFileName() {
return "fileName.docx"; // 保持原有文件名逻辑
}
/**
* 工具方法:计算平均值
*/
private double calculateAverage(List<OverAreaLimitVO> dataList,
Function<OverAreaLimitVO, Double> valueExtractor) {
return dataList.stream()
.map(valueExtractor)
.filter(value -> value != null && value >= 0)
.mapToDouble(Double::doubleValue)
.average()
.orElse(0.0);
}
/**
* 工具方法:从内部列表计算平均值
*/
private double calculateAverageFromInnerList(List<OverAreaLimitVO> dataList,
Function<OverAreaLimitVO, Double> valueExtractor) {
return dataList.stream()
.map(valueExtractor)
.filter(value -> value != null && value >= 0)
.mapToDouble(Double::doubleValue)
.average()
.orElse(0.0);
}
/**
* 工具方法:提取监控点名称
*/
private List<String> extractMonitorNames(List<OverAreaLimitVO> dataList,
Function<OverAreaLimitVO, List<String>> idExtractor,
Map<String, String> idToNameMap) {
return dataList.stream()
.flatMap(vo -> {
List<String> ids = idExtractor.apply(vo);
return ids != null ? ids.stream() : Stream.<String>empty();
})
.distinct()
.map(idToNameMap::get)
.filter(name -> name != null && !name.trim().isEmpty())
.collect(Collectors.toList());
}
/**
* 工具方法:从内部列表提取监控点名称
*/
private List<String> extractMonitorNamesFromInnerList(List<OverAreaLimitVO> dataList,
Function<OverAreaLimitVO, List<String>> idExtractor,
Map<String, String> idToNameMap) {
return dataList.stream()
.flatMap(vo -> {
List<String> ids = idExtractor.apply(vo);
return ids != null ? ids.stream() : Stream.<String>empty();
})
.distinct()
.map(idToNameMap::get)
.filter(name -> name != null && !name.trim().isEmpty())
.collect(Collectors.toList());
}
/**
* 工具方法:格式化百分比
*/
private String formatPercentage(double value) {
if (value < 0) {
return UNKNOWN_VALUE;
}
return BigDecimal.valueOf(value)
.setScale(2, RoundingMode.HALF_UP)
.doubleValue() + "%";
}
/**
* 工具方法:获取等级
*/
private String getGrade(double value) {
if (value < 0) {
return UNKNOWN_VALUE;
} else if (value <= EXCELLENT_MAX_THRESHOLD) {
return "优秀";
} else if (value <= GOOD_MAX_THRESHOLD) {
return "";
} else if (value <= MEDIUM_MAX_THRESHOLD) {
return "";
} else {
return "";
}
}
/**
* 工具方法:格式化时间范围
*/
private String formatTimeRange(String startTime, String endTime) {
try {
String start = DateUtil.format(
DateUtil.beginOfDay(DateUtil.parse(startTime)),
DatePattern.NORM_DATETIME_PATTERN
);
String end = DateUtil.format(
DateUtil.endOfDay(DateUtil.parse(endTime)),
DatePattern.NORM_DATETIME_PATTERN
);
return start + "-" + end;
} catch (Exception e) {
log.error("格式化时间范围失败", e);
return "";
}
}
/**
* 工具方法:格式化监控点列表
*/
private String formatMonitorList(List<String> monitorList) {
if (CollUtil.isEmpty(monitorList)) {
return NO_DATA_PLACEHOLDER;
}
return String.join(",", monitorList);
}
/**
* 获取部门信息
*/
private Dept getDeptInfo(String deptId) {
return deptFeignClient.getDeptById(deptId).getData();
}
/**
* 获取台账信息
*/
private List<MonitorCommLedgerInfoDTO> getLedgerInfo(String deptId) {
DeptGetLineParam param = new DeptGetLineParam();
param.setDeptId(deptId);
return commTerminalGeneralClient.deptGetLineInfo(param).getData();
}
/**
* 获取电压等级字典
*/
private Map<String, String> getVoltageLevelMap() {
List<DictData> dictDataList = dicDataFeignClient
.getDicDataByTypeCode(DicDataTypeEnum.DEV_VOLTAGE_STAND.getCode())
.getData();
return dictDataList.stream()
.collect(Collectors.toMap(DictData::getId, DictData::getName));
}
/**
* 构建监控点名称映射
*/
private Map<String, String> buildMonitorNameMap(String deptId) {
List<MonitorCommLedgerInfoDTO> ledgerList = getLedgerInfo(deptId);
return ledgerList.stream()
.collect(Collectors.toMap(
MonitorCommLedgerInfoDTO::getMonitorId,
MonitorCommLedgerInfoDTO::getMonitorName
));
}
/**
* 获取电能质量数据
*/
private List<OverAreaLimitVO> getPowerQualityData(AreaHarmReportParam param) {
OverAreaVO queryParam = new OverAreaVO();
queryParam.setDeptIndex(param.getDeptId());
queryParam.setPageNum(1);
queryParam.setPageSize(1000);
queryParam.setSearchBeginTime(param.getStartTime());
queryParam.setSearchEndTime(param.getEndTime());
queryParam.setStatisticalType(new SimpleDTO());
queryParam.setAreaReportFlag(1);
Page<OverAreaLimitVO> page = iAnalyzeService.getAreaData(queryParam);
return page.getRecords();
}
}

View File

@@ -1,12 +1,10 @@
package com.njcn.harmonic.service.impl;
package com.njcn.harmonic.service.report.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
@@ -14,20 +12,17 @@ import cn.hutool.json.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.utils.FileUtil;
import com.njcn.csdevice.api.CsCommTerminalFeignClient;
import com.njcn.csdevice.api.WlRecordFeignClient;
import com.njcn.csdevice.pojo.po.WlRecord;
import com.njcn.device.biz.commApi.CommTerminalGeneralClient;
import com.njcn.device.pq.api.DeptLineFeignClient;
import com.njcn.device.pq.api.DeviceUnitClient;
import com.njcn.device.pq.pojo.po.DeptLine;
import com.njcn.device.biz.pojo.po.PqsDeviceUnit;
import com.njcn.harmonic.enums.HarmonicResponseEnum;
import com.njcn.harmonic.mapper.DeptTempMapper;
import com.njcn.harmonic.mapper.EleEpdMapper;
import com.njcn.harmonic.mapper.ExcelRptMapper;
import com.njcn.harmonic.mapper.ExcelRptTempMapper;
import com.njcn.harmonic.pojo.dto.ReportTemplateDTO;
import com.njcn.harmonic.pojo.param.ReportSearchParam;
@@ -35,8 +30,6 @@ import com.njcn.harmonic.pojo.param.ReportTemplateParam;
import com.njcn.harmonic.utils.DataChangeUtil;
import com.njcn.influx.constant.InfluxDbSqlConstant;
import com.njcn.influx.pojo.constant.InfluxDBTableConstant;
import com.njcn.influx.pojo.dto.StatisticalDataDTO;
import com.njcn.influx.service.CommonService;
import com.njcn.influx.utils.InfluxDbUtils;
import com.njcn.oss.enums.OssResponseEnum;
import com.njcn.system.api.DicDataFeignClient;
@@ -44,35 +37,28 @@ import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicDataTypeEnum;
import com.njcn.system.pojo.po.DictData;
import com.njcn.system.pojo.po.EleEpdPqd;
import com.njcn.harmonic.pojo.po.ExcelRpt;
import com.njcn.harmonic.pojo.po.ExcelRptTemp;
import com.njcn.harmonic.pojo.po.SysDeptTemp;
import com.njcn.harmonic.pojo.vo.ReportTemplateVO;
import com.njcn.harmonic.pojo.vo.ReportTreeVO;
import com.njcn.harmonic.pojo.vo.SysDeptTempVO;
import com.njcn.harmonic.service.CustomReportService;
import com.njcn.harmonic.service.report.CustomReportService;
import com.njcn.oss.constant.OssPath;
import com.njcn.oss.utils.FileStorageUtil;
import com.njcn.user.api.DeptFeignClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import sun.reflect.generics.tree.Tree;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -122,6 +108,8 @@ public class CustomReportServiceImpl implements CustomReportService {
private final String STR_TWO = "$";
private final String STR_THREE = "&";
private final String STR_FOUR = "%";
private final String UVOLTAGE_DEV = "UVOLTAGE_DEV";
private final String VOLTAGE_DEV = "VOLTAGE_DEV";
@Override
public void getCustomReport(ReportSearchParam reportSearchParam, HttpServletResponse response) {
@@ -691,7 +679,7 @@ public class CustomReportServiceImpl implements CustomReportService {
* @date 2023/10/20
*/
private void assSqlByMysql(List<ReportTemplateDTO> data, StringBuilder sql, List<ReportTemplateDTO> endList, String method, ReportSearchParam reportSearchParam, Map<String, ReportTemplateDTO> limitMap, Map<String, Float> overLimitMap, Map<String, ReportTemplateDTO> assNoPassMap) {
private void assSqlByMysql(List<ReportTemplateDTO> data, StringBuilder sql, List<ReportTemplateDTO> endList, String method, ReportSearchParam reportSearchParam, Map<String, ReportTemplateDTO> limitMap, Map<String, Float> overLimitMap, Map<String, ReportTemplateDTO> assNoPassMap,List<String> noPhaseList) {
//sql拼接示例select MAX(IHA2) as IHA2 from power_quality_data where Phase = 'A' and LineId='1324564568' and Stat_Method='max' tz('Asia/Shanghai')
if (InfluxDbSqlConstant.CP95.equals(method)) {
for (int i = 0; i < data.size(); i++) {
@@ -763,7 +751,10 @@ public class CustomReportServiceImpl implements CustomReportService {
//频率和频率偏差仅统计T相
if (data.get(0).getTemplateName().equals("freq_dev") || data.get(0).getTemplateName().equals("freq")) {
if (noPhaseList.contains(data.get(0).getTemplateName())) {
if(data.get(0).getTemplateName().equalsIgnoreCase("v_unbalance")){
System.out.println(44);
}
sql.append(InfluxDbSqlConstant.AND)
.append(InfluxDBTableConstant.PHASIC_TYPE)
.append(InfluxDbSqlConstant.EQ)
@@ -783,6 +774,7 @@ public class CustomReportServiceImpl implements CustomReportService {
if (CollUtil.isEmpty(mapList) || Objects.isNull(mapList.get(0))) {
data = data.stream().peek(item -> item.setValue("/")).collect(Collectors.toList());
} else {
//兼容达梦数据库方法
Map<String, Object> map = convertKeysToUpperCase(mapList.get(0));
for (ReportTemplateDTO item : data) {
if (map.containsKey(item.getItemName())) {
@@ -790,10 +782,22 @@ public class CustomReportServiceImpl implements CustomReportService {
item.setValue(String.format("%.3f", v));
if (overLimitMap.containsKey(item.getLimitName())) {
Float tagVal = overLimitMap.get(item.getLimitName());
if (v > tagVal) {
item.setOverLimitFlag(1);
} else {
item.setOverLimitFlag(0);
if(item.getLimitName().equalsIgnoreCase(UVOLTAGE_DEV)){
//对电压偏差特殊处理
Float tagVal_U = overLimitMap.get(UVOLTAGE_DEV);
if (v > tagVal || v<tagVal_U) {
item.setOverLimitFlag(1);
} else {
item.setOverLimitFlag(0);
}
}else {
if (v > tagVal) {
item.setOverLimitFlag(1);
} else {
item.setOverLimitFlag(0);
}
}
}
@@ -803,12 +807,27 @@ public class CustomReportServiceImpl implements CustomReportService {
if (limitMap.containsKey(key)) {
ReportTemplateDTO tem = limitMap.get(key);
double limitVal = Double.parseDouble(tem.getValue());
if (v > limitVal) {
tem.setOverLimitFlag(1);
assNoPassMap.put(key, tem);
} else if (!assNoPassMap.containsKey(key)) {
tem.setOverLimitFlag(0);
assNoPassMap.put(key, tem);
if(VOLTAGE_DEV.equalsIgnoreCase(tem.getLimitName())){
//针对电压偏差特殊处理
double limitLowVal = Double.parseDouble(tem.getLowValue());
if (v > limitVal || v<limitLowVal) {
tem.setOverLimitFlag(1);
assNoPassMap.put(key, tem);
} else if (!assNoPassMap.containsKey(key)) {
tem.setOverLimitFlag(0);
assNoPassMap.put(key, tem);
}
}else {
//其他指标
if (v > limitVal) {
tem.setOverLimitFlag(1);
assNoPassMap.put(key, tem);
} else if (!assNoPassMap.containsKey(key)) {
tem.setOverLimitFlag(0);
assNoPassMap.put(key, tem);
}
}
}
}
@@ -860,6 +879,14 @@ public class CustomReportServiceImpl implements CustomReportService {
throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON);
}
}
//查询不分相别的指标
DictData dictData = dicDataFeignClient.getDicDataByCodeAndType(DicDataEnum.EPD.getCode(), DicDataTypeEnum.CS_DATA_TYPE.getCode()).getData();
if(Objects.isNull(dictData)){
throw new BusinessException(CommonResponseEnum.FAIL,"字典类型模板缺少!");
}
List<EleEpdPqd> temTargetList = eleEpdMapper.selectList(new LambdaQueryWrapper<EleEpdPqd>().eq(EleEpdPqd::getDataType,dictData.getId()).in(EleEpdPqd::getPhase,Arrays.asList("T", "M")));
List<String> noPhaseList = temTargetList.stream().filter(it->StrUtil.isNotBlank(it.getOtherName())).map(it->it.getOtherName().toUpperCase()).collect(Collectors.toList());
//处理指标是否合格
reportLimitList = new LinkedHashSet<>(reportLimitList).stream().sorted(Comparator.comparing(ReportTemplateDTO::getItemName)).collect(Collectors.toList());
Map<String, Float> limitMap = overLimitDeal(reportLimitList, reportSearchParam);
@@ -884,13 +911,13 @@ public class CustomReportServiceImpl implements CustomReportService {
phaseMap.forEach((phaseKey, phaseVal) -> {
StringBuilder sql = new StringBuilder(InfluxDbSqlConstant.SELECT);
if (InfluxDbSqlConstant.MAX.equalsIgnoreCase(valueTypeKey)) {
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.MAX, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap);
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.MAX, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap,noPhaseList);
} else if (InfluxDbSqlConstant.MIN.equalsIgnoreCase(valueTypeKey)) {
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.MIN, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap);
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.MIN, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap,noPhaseList);
} else if (InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(valueTypeKey)) {
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.AVG_WEB, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap);
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.AVG_WEB, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap,noPhaseList);
} else if (InfluxDbSqlConstant.CP95.equalsIgnoreCase(valueTypeKey)) {
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.CP95, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap);
assSqlByMysql(phaseVal, sql, endList, InfluxDbSqlConstant.CP95, reportSearchParam, limitTargetMapX, limitMap, assNoPassMap,noPhaseList);
}
});
@@ -1040,7 +1067,7 @@ public class CustomReportServiceImpl implements CustomReportService {
} else if (vItem.length == 4) {
//$HA[_25]#max#classId$
reportTemplateDTO.setTemplateName(vItem[0].toUpperCase());
reportTemplateDTO.setPhase("M");
reportTemplateDTO.setPhase("T");
reportTemplateDTO.setStatMethod(vItem[1].toUpperCase());
reportTemplateDTO.setResourceId(vItem[2].toUpperCase());
reportTemplateDTO.setLimitName(vItem[3].toUpperCase());
@@ -1048,14 +1075,13 @@ public class CustomReportServiceImpl implements CustomReportService {
reportTemplateDTOList.add(reportTemplateDTO);
} else if (v.charAt(0) == '%' && v.contains(STR_ONE)) {
//封装ReportTemplateDTO
//封装指标结论ReportTemplateDTO
ReportTemplateDTO reportTemplateDTO = new ReportTemplateDTO();
v = v.replace(STR_FOUR, "");
reportTemplateDTO.setItemName(v.toUpperCase());
//根据#分割数据
String[] vItem = v.split(STR_ONE);
if (vItem.length == 3) {
//$HA[_25]#B#max#classId$
reportTemplateDTO.setTemplateName(vItem[0].toUpperCase());
reportTemplateDTO.setStatMethod(vItem[1].toUpperCase());
reportTemplateDTO.setResourceId(vItem[2].toUpperCase());
@@ -1092,11 +1118,13 @@ public class CustomReportServiceImpl implements CustomReportService {
StringBuilder sql = new StringBuilder(InfluxDbSqlConstant.SELECT);
for (int i = 0; i < reportLimitList.size(); i++) {
if (i == reportLimitList.size() - 1) {
sql.append(UVOLTAGE_DEV).append(StrUtil.COMMA);
sql.append(reportLimitList.get(i).getTemplateName()).append(StrUtil.C_SPACE);
} else {
sql.append(reportLimitList.get(i).getTemplateName()).append(StrUtil.COMMA);
}
}
sql.append(InfluxDbSqlConstant.FROM).append(reportLimitList.get(0).getResourceId()).append(InfluxDbSqlConstant.WHERE).append("id ='").append(reportSearchParam.getLineId()).append("'");
limitMap = excelRptTempMapper.dynamicSqlMap(sql.toString());
if (Objects.isNull(limitMap)) {
@@ -1105,6 +1133,10 @@ public class CustomReportServiceImpl implements CustomReportService {
for (ReportTemplateDTO item : reportLimitList) {
if (limitMap.containsKey(item.getTemplateName())) {
if(item.getTemplateName().equalsIgnoreCase(VOLTAGE_DEV)){
item.setLowValue(limitMap.get(UVOLTAGE_DEV).toString());
}
item.setValue(limitMap.get(item.getTemplateName()).toString());
}
}
@@ -1551,13 +1583,18 @@ public class CustomReportServiceImpl implements CustomReportService {
(Map<String, ReportTemplateDTO> assNoPassMap, Map<String, ReportTemplateDTO> limitTargetMapX, List<ReportTemplateDTO> endList) {
assNoPassMap.forEach((key, val) -> {
limitTargetMapX.remove(key);
if ("Voltage_Dev".toUpperCase().equals(val.getTemplateName()) || "Freq_Dev".toUpperCase().equals(val.getTemplateName())) {
if ("Freq_Dev".toUpperCase().equals(val.getTemplateName())) {
val.setValue("±" + val.getValue());
}
String expend = "";
if(Objects.nonNull(val.getLowValue())){
expend = val.getLowValue()+",";
}
if (val.getOverLimitFlag() == 1) {
val.setValue("不合格 (" + val.getValue() + ")");
val.setValue("不合格 (" + expend+val.getValue() + ")");
} else {
val.setValue("合格 (" + val.getValue() + ")");
val.setValue("合格 (" + expend+val.getValue() + ")");
}
endList.add(val);
});
@@ -1613,7 +1650,7 @@ public class CustomReportServiceImpl implements CustomReportService {
} else if (vItem.length == 4) {
//$HA[_25]#max#classId$
reportTemplateDTO.setTemplateName(vItem[0]);
reportTemplateDTO.setPhase("M");
reportTemplateDTO.setPhase("T");
reportTemplateDTO.setStatMethod(vItem[1]);
reportTemplateDTO.setResourceId(vItem[2]);
reportTemplateDTO.setLimitName(vItem[3]);

View File

@@ -166,7 +166,6 @@ public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, Li
Map<String, DictData> targetMap = dataList.stream().collect(Collectors.toMap(DictData::getCode, Function.identity()));
//获取监测点和部门表关系
List<DeptLine> deptLines = deptLineFeignClient.getAllData().getData();
// Map<String, List<DeptLine>> deptLineMap = deptLines.stream().collect(Collectors.groupingBy(DeptLine::getLineId));
Map<String, DeptLine> deptLineMap = deptLines.stream().collect(Collectors.toMap(DeptLine::getLineId, Function.identity()));
//获取监测点按时间统计越限天数
@@ -330,7 +329,8 @@ public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, Li
param.setDeptName(deptName);
String inputUrl = "file/warningReport.docx";
String alarmType = param.getType() == 1 ? "" : "";
String fileName = "电能[" + alarmType + "]" + param.getYear() + "" + param.getNumber() + "号-" + param.getDeptName() + "地市 电能质量技术监督" + alarmType + "警单.docx";
//前端下载有问题将【】改成()
String fileName = "电能(" + alarmType + ")" + param.getYear() + "" + param.getNumber() + "号-" + param.getDeptName() + "地市 电能质量技术监督" + alarmType + "警单.docx";
//获取无数据监测点集合
List<ReportLineInfoVo> list1 = getReportLineInfo(true, param.getIdList(), null, param.getSearchBeginTime(), param.getSearchEndTime(), param.getDeptId(), allLineWarnings);
//获取谐波电压超标监测点集合
@@ -941,7 +941,8 @@ public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, Li
LambdaQueryWrapper<WarningLeaflet> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(WarningLeaflet::getState, 1)
.eq(WarningLeaflet::getProblemType, 2)
.between(WarningLeaflet::getCreateTime, firstDayOfYear, lastDayOfYear);
.like(WarningLeaflet::getFilePath,year);
// .between(WarningLeaflet::getCreateTime, firstDayOfYear, lastDayOfYear);
List<WarningLeaflet> list = warningLeafletService.list(lambdaQueryWrapper);
if (list.isEmpty()) {
return "1";
@@ -960,6 +961,18 @@ public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, Li
return String.valueOf(maxNumber + 1);
}
public static void main(String[] args) {
Pattern pattern = compile("年(\\d+)号");
String filePath = "onlineReport/电能[告]2025年28号-海口地市 电能质量技术监督告警单.docx";
Matcher matcher = pattern.matcher(filePath);
if (matcher.find()) {
int number = Integer.parseInt(matcher.group(1));
System.out.println(number);
}
}
/**
* 获取频率偏差-日最大值-最大值
*/

View File

@@ -173,6 +173,8 @@ public class WarningLeafletServiceImpl extends ServiceImpl<WarningLeafletMapper,
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addFeedback(WarningLeafletParam.WarningLeafletUpdateParam warningLeafletUpdateParam) {

View File

@@ -72,6 +72,7 @@
sys_dict_type sys_dict_type
WHERE sys_dict_data.type_id = sys_dict_type.id
AND sys_dict_type.code = #{dictTypeCode}
and sys_dict_type.state = 1
and sys_dict_data.state = 1
order by sort
</select>

View File

@@ -37,7 +37,7 @@ public class PqDashboardPageServiceImpl extends ServiceImpl<PqDashboardPageMappe
@Override
public Boolean addDashboard(PqDashboardPageParam pqDashboardPageParam) {
PqDashboardPage pqDashboardPage = new PqDashboardPage();
// checkName(pqDashboardPageParam,false);
checkName(pqDashboardPageParam,false);
BeanUtils.copyProperties(pqDashboardPageParam,pqDashboardPage);
//根据前端传递状态赋值
@@ -50,7 +50,7 @@ public class PqDashboardPageServiceImpl extends ServiceImpl<PqDashboardPageMappe
@Override
public Boolean updateDashboard(PqDashboardPageParam.UpdatePqDashboardPageParam updatePqDashboardPageParam) {
PqDashboardPage pqDashboardPage = new PqDashboardPage();
// checkName(updatePqDashboardPageParam,true);
checkName(updatePqDashboardPageParam,true);
BeanUtils.copyProperties(updatePqDashboardPageParam,pqDashboardPage);
this.updateById(pqDashboardPage);
@@ -122,7 +122,8 @@ public class PqDashboardPageServiceImpl extends ServiceImpl<PqDashboardPageMappe
private void checkName(PqDashboardPageParam pqDashboardPageParam, boolean isExcludeSelf) {
LambdaQueryWrapper<PqDashboardPage> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.eq(PqDashboardPage::getPageName, pqDashboardPageParam.getPageName());
.eq(PqDashboardPage::getPageName, pqDashboardPageParam.getPageName())
.eq(PqDashboardPage::getUserId, RequestUtil.getUserIndex());
//更新的时候,需排除当前记录
if (isExcludeSelf) {
if (pqDashboardPageParam instanceof PqDashboardPageParam.UpdatePqDashboardPageParam) {

View File

@@ -52,6 +52,9 @@ public class ComponentDTO implements Serializable {
@ApiModelProperty("时间标识")
private String timeKey;
@ApiModelProperty("组件类型")
private String componentType;
@ApiModelProperty("子级")
List<ComponentDTO> children;

View File

@@ -24,7 +24,6 @@ import java.util.List;
public class ComponentParam {
@ApiModelProperty("资源id")
// @NotBlank(message = UserValidMessage.FUNCTION_ID_NOT_BLANK)
private String functionId;
@ApiModelProperty("节点")
@@ -37,7 +36,6 @@ public class ComponentParam {
private String name;
@ApiModelProperty("功能数组")
// @NotEmpty(message = UserValidMessage.FUNCTION_GROUP_NOT_BLANK)
private List<Integer> functionGroup;
@ApiModelProperty("排序")
@@ -65,6 +63,8 @@ public class ComponentParam {
@NotBlank(message = "系统类型不为空")
private String systemType;
@ApiModelProperty("组件类型")
private String componentType;
/**
* 组件更新操作实体

View File

@@ -0,0 +1,24 @@
package com.njcn.user.pojo.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @author xy
*/
@Data
public class RoleSystemParam implements Serializable {
@ApiModelProperty("角色id")
@NotBlank(message = "角色id不能为空")
private String roleId;
@ApiModelProperty("系统id")
@NotNull(message = "系统id不能为空")
private List<String> systemIds;
}

View File

@@ -75,6 +75,11 @@ public class Component extends BaseEntity {
*/
private String systemType;
/**
* 组件类型
*/
private String componentType;
private String icon;
private String image;

View File

@@ -0,0 +1,37 @@
package com.njcn.user.pojo.po;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author xy
* @since 2026-01-05
*/
@Data
@TableName("sys_role_system")
@Accessors(chain = true)
public class SysRoleSystem implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 角色id
*/
@MppMultiId
private String roleId;
/**
* 系统id
*/
private String systemId;
}

View File

@@ -43,6 +43,9 @@ public class ComponentVO implements Serializable {
@ApiModelProperty("系统类型")
private String systemType;
@ApiModelProperty("组件类型")
private String componentType;
@ApiModelProperty("图标标识")
private String icon;

View File

@@ -0,0 +1,74 @@
package com.njcn.user.controller;
import cn.hutool.core.util.ObjectUtil;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.constant.OperateType;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.user.pojo.param.RoleSystemParam;
import com.njcn.user.pojo.po.SysRoleSystem;
import com.njcn.user.service.ISysRoleSystemService;
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.Arrays;
/**
* <p>
* 前端控制器
* </p>
*
* @author xy
* @since 2026-01-05
*/
@RestController
@RequestMapping("/sysRoleSystem")
@Validated
@Slf4j
@Api(tags = "角色与系统管理")
@AllArgsConstructor
public class SysRoleSystemController extends BaseController {
private final ISysRoleSystemService sysRoleSystemService;
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
@GetMapping("/getSystemByRoleId")
@ApiOperation("根据角色id获取系统信息")
@ApiImplicitParam(name = "id", value = "角色id", required = true)
public HttpResult<RoleSystemParam> getSystemByRoleId(@RequestParam("id") String id) {
String methodDescribe = getMethodDescribe("getSystemByRoleId");
SysRoleSystem sysRoleSystem = sysRoleSystemService.selectByMultiId(
new SysRoleSystem().setRoleId(id)
);
RoleSystemParam result = new RoleSystemParam();
if (ObjectUtil.isNotNull(sysRoleSystem)) {
result.setRoleId(sysRoleSystem.getRoleId());
result.setSystemIds(Arrays.asList(sysRoleSystem.getSystemId().split(",")));
}
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
@PostMapping("/add")
@ApiOperation("新增角色与系统关系")
@ApiImplicitParam(name = "param", value = "新增数据", required = true)
public HttpResult<Boolean> add(@RequestBody @Validated RoleSystemParam param) {
String methodDescribe = getMethodDescribe("add");
SysRoleSystem sysRoleSystem = new SysRoleSystem()
.setRoleId(param.getRoleId())
.setSystemId(String.join(",",param.getSystemIds()));
boolean result = sysRoleSystemService.saveOrUpdateByMultiId(sysRoleSystem);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
}

View File

@@ -0,0 +1,16 @@
package com.njcn.user.mapper;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.user.pojo.po.SysRoleSystem;
/**
* <p>
* Mapper 接口
* </p>
*
* @author xy
* @since 2026-01-05
*/
public interface SysRoleSystemMapper extends MppBaseMapper<SysRoleSystem> {
}

View File

@@ -0,0 +1,16 @@
package com.njcn.user.service;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.user.pojo.po.SysRoleSystem;
/**
* <p>
* 服务类
* </p>
*
* @author xy
* @since 2026-01-05
*/
public interface ISysRoleSystemService extends IMppService<SysRoleSystem> {
}

View File

@@ -54,15 +54,12 @@ public class ComponentServiceImpl extends ServiceImpl<ComponentMapper, Component
checkComponentParam(componentParam, false);
Component component = new Component();
BeanUtil.copyProperties(componentParam, component);
// String functionGroup = componentParam.getFunctionGroup().stream().map(String::valueOf).collect(Collectors.joining(","));
// component.setFunctionGroup(functionGroup);
component.setState(ComponentState.ENABLE);
if (Objects.equals(componentParam.getPid(), FunctionState.FATHER_PID)) {
component.setPids(FunctionState.FATHER_PID);
} else {
Component fatherComponent = this.lambdaQuery().eq(Component::getId, componentParam.getPid()).one();
String pidS = fatherComponent.getPids();
component.setPids(pidS + "," + componentParam.getPid());
component.setPid("1");
component.setPids("0,1");
}
return this.save(component);
}
@@ -80,11 +77,49 @@ public class ComponentServiceImpl extends ServiceImpl<ComponentMapper, Component
checkComponentParam(componentParam, true);
Component component = new Component();
BeanUtil.copyProperties(componentParam, component);
// String functionGroup = componentParam.getFunctionGroup().stream().map(String::valueOf).collect(Collectors.joining(","));
// component.setFunctionGroup(functionGroup);
if (Objects.equals(componentParam.getPid(), FunctionState.FATHER_PID)) {
component.setPids(FunctionState.FATHER_PID);
} else {
component.setPid("1");
component.setPids("0,1");
}
return this.updateById(component);
}
// @Override
// public List<ComponentVO> getComponentTree() {
// List<ComponentVO> list = new ArrayList<>();
// List<ComponentVO> result = new ArrayList<>();
// List<ComponentDTO> componentList = componentMapper.getAllComponent();
// if (!CollectionUtils.isEmpty(componentList)) {
// componentList.forEach(item -> {
// ComponentVO componentVO = new ComponentVO();
// BeanUtil.copyProperties(item, componentVO);
// componentVO.setTimeKeys(StrUtil.split(item.getTimeKey(), ","));
// list.add(componentVO);
// });
// Map<String, List<ComponentVO>> map = list.stream().filter(m -> !Objects.isNull(m.getSystemType())).collect(Collectors.groupingBy(ComponentVO::getSystemType));
// map.forEach((k, v) -> {
// DictData dictData = dicDataFeignClient.getDicDataById(k).getData();
// if (Objects.isNull(dictData)) {
// throw new BusinessException(SystemResponseEnum.SYSTEM_TYPE_EMPTY);
// }
// ComponentVO componentVO = new ComponentVO();
// componentVO.setId(dictData.getId());
// componentVO.setName(dictData.getName());
// componentVO.setSort(dictData.getSort());
// componentVO.setChildren(
// v.stream()
// .filter(fun -> Objects.equals(ComponentState.FATHER_PID, fun.getPid()))
// .peek(funS -> funS.setChildren(getChildCategoryList(funS, v))).sorted(Comparator.comparing(ComponentVO::getSort))
// .collect(Collectors.toList()));
// result.add(componentVO);
// });
// result.sort(Comparator.comparing(ComponentVO::getSort));
// }
// return result;
// }
@Override
public List<ComponentVO> getComponentTree() {
List<ComponentVO> list = new ArrayList<>();
@@ -95,24 +130,35 @@ public class ComponentServiceImpl extends ServiceImpl<ComponentMapper, Component
ComponentVO componentVO = new ComponentVO();
BeanUtil.copyProperties(item, componentVO);
componentVO.setTimeKeys(StrUtil.split(item.getTimeKey(), ","));
// componentVO.setFunctionGroup(Arrays.stream(item.getFunctionGroup().split(",")).map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList()));
list.add(componentVO);
});
Map<String, List<ComponentVO>> map = list.stream().filter(m -> !Objects.isNull(m.getSystemType())).collect(Collectors.groupingBy(ComponentVO::getSystemType));
map.forEach((k, v) -> {
DictData dictData = dicDataFeignClient.getDicDataById(k).getData();
if (Objects.isNull(dictData)) {
throw new BusinessException(SystemResponseEnum.SYSTEM_TYPE_EMPTY);
}
//二层集合
List<ComponentVO> second = list.stream().filter(item -> Objects.equals(item.getPid(), "0")).collect(Collectors.toList());
//三层集合
List<ComponentVO> third = list.stream().filter(item -> Objects.equals(item.getPid(), "1")).collect(Collectors.toList());
Set<String> uniqueValues = list.stream()
.flatMap(obj -> Arrays.stream(obj.getSystemType().split(",")))
.map(String::trim)
.collect(Collectors.toSet());
//根据字典code获取当前所有系统
List<DictData> dictDataList = dicDataFeignClient.getDicDataByTypeCode("System_Type").getData();
dictDataList.forEach(dic->{
//第一层
ComponentVO componentVO = new ComponentVO();
componentVO.setId(dictData.getId());
componentVO.setName(dictData.getName());
componentVO.setSort(dictData.getSort());
componentVO.setChildren(
v.stream()
.filter(fun -> Objects.equals(ComponentState.FATHER_PID, fun.getPid()))
.peek(funS -> funS.setChildren(getChildCategoryList(funS, v))).sorted(Comparator.comparing(ComponentVO::getSort))
.collect(Collectors.toList()));
componentVO.setId(dic.getId());
componentVO.setName(dic.getName());
componentVO.setSort(dic.getSort());
//第二层
if (CollectionUtil.isNotEmpty(second)) {
List<ComponentVO> l2 = second.stream().filter(item2 -> item2.getSystemType().contains(dic.getId())).sorted(Comparator.comparing(ComponentVO::getSort)).collect(Collectors.toList());
componentVO.setChildren(l2);
//第三层
componentVO.getChildren().forEach(item3->{
List<ComponentVO> l3 = third.stream().filter(item4 -> item4.getComponentType().contains(item3.getId())).sorted(Comparator.comparing(ComponentVO::getSort)).collect(Collectors.toList());
item3.setChildren(l3);
});
}
result.add(componentVO);
});
result.sort(Comparator.comparing(ComponentVO::getSort));
@@ -167,13 +213,11 @@ public class ComponentServiceImpl extends ServiceImpl<ComponentMapper, Component
@Override
public List<Component> getFatherComponent(String systemType) {
List<Component> list = new ArrayList<>();
Component component = new Component();
component.setId("0");
component.setName("");
list.add(component);
list.addAll(this.lambdaQuery().eq(Component::getSystemType, systemType).eq(Component::getPid, ComponentState.FATHER_PID).eq(Component::getState, ComponentState.ENABLE).list());
return list;
return new ArrayList<>(this.lambdaQuery()
.eq(Component::getSystemType, systemType)
.eq(Component::getPid, ComponentState.FATHER_PID)
.eq(Component::getState, ComponentState.ENABLE)
.list());
}
/**

View File

@@ -1,12 +1,12 @@
package com.njcn.user.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.hutool.core.bean.BeanUtil;
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.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.user.enums.UserResponseEnum;
@@ -127,11 +127,10 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
@Override
public List<Role> selectRoleDetail(Integer id) {
List<Integer> role = new ArrayList<>();
role.add(RoleType.USER);
role.add(RoleType.APP);
if (Objects.equals(id, RoleType.SUPER_ADMINISTRATOR)) {
role.add(RoleType.ADMINISTRATOR);
} else {
role.add(RoleType.USER);
role.add(RoleType.APP);
}
QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
queryWrapper.ne("sys_role.state", DataStateEnum.DELETED.getCode());

View File

@@ -0,0 +1,20 @@
package com.njcn.user.service.impl;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.user.mapper.SysRoleSystemMapper;
import com.njcn.user.pojo.po.SysRoleSystem;
import com.njcn.user.service.ISysRoleSystemService;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author xy
* @since 2026-01-05
*/
@Service
public class SysRoleSystemServiceImpl extends MppServiceImpl<SysRoleSystemMapper, SysRoleSystem> implements ISysRoleSystemService {
}

View File

@@ -286,13 +286,13 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
if (Objects.equals(UserType.SUPER_ADMINISTRATOR, type)) {
types.addAll(Arrays.asList(UserType.ADMINISTRATOR, UserType.USER, UserType.APP));
}
//业务管理员,展示管理员和web用户
//业务管理员展示web用户
else if (Objects.equals(UserType.ADMINISTRATOR, type) && !roleCodeList.contains("operation_manager")) {
types.addAll(Arrays.asList(UserType.ADMINISTRATOR, UserType.USER));
types.addAll(Arrays.asList(UserType.USER));
}
//运维管理员,展示管理员和App用户
//运维管理员,展示web用户、App用户
else if (Objects.equals(UserType.ADMINISTRATOR, type) && roleCodeList.contains("operation_manager")) {
types.addAll(Arrays.asList(UserType.ADMINISTRATOR, UserType.USER, UserType.APP));
types.addAll(Arrays.asList(UserType.USER, UserType.APP));
}
if (ObjectUtil.isNotNull(queryParam)) {
//查询参数不为空,进行条件填充
@@ -482,7 +482,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
Role roleByCode = roleService.getRoleByCode(AppRoleEnum.MARKET_USER.getCode());
List<UserRole> userRoles = userRoleMapper.selectUserRole(Stream.of(roleByCode.getId()).collect(Collectors.toList()));
List<String> collect = userRoles.stream().map(UserRole::getUserId).collect(Collectors.toList());
return this.listByIds(collect);
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ne(User::getState, UserState.DELETE).in(User::getId, collect);
return this.list(queryWrapper);
}
@Override

12241
pqs.ipr

File diff suppressed because one or more lines are too long

406
pqs.iws
View File

@@ -1,29 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="2448d918-1a26-4571-be80-21a8dfa375ac" name="Default" comment="EventTemplate控制器编写">
<change beforePath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/enums/EventResponseEnum.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/enums/EventResponseEnum.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/EventDictParam.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/EventDictParam.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/EventTemplateParam.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/pojo/param/EventTemplateParam.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/pojo/po/EventTemplate.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-api/src/main/java/com/njcn/system/pojo/po/EventTemplate.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/controller/EventDictController.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/controller/EventDictController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/controller/EventTemplateController.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/controller/EventTemplateController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/mapper/EventTemplateMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/mapper/EventTemplateMapper.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/mapper/mapping/EventTemplateMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/mapper/mapping/EventTemplateMapper.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/EventDictServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/EventDictServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/EventTemplateServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-system/system-boot/src/main/java/com/njcn/system/service/impl/EventTemplateServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs.iws" beforeDir="false" afterPath="$PROJECT_DIR$/pqs.iws" afterDir="false" />
</list>
<list id="8dc99cd4-ae87-448e-8b91-038fd7ebf613" name="no commit" comment="no commit">
<list default="true" id="2448d918-1a26-4571-be80-21a8dfa375ac" name="Default" comment="海南bug修改提交">
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/BpmApplication.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/BpmApplication.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/job/DeviceComflagTasks.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/job/ScheduledTasks.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/job/ScheduledTasks.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/TerminalServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/TerminalServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/LineWarningServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/impl/WarningLeafletServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/leaflet/impl/WarningLeafletServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs.ipr" beforeDir="false" afterPath="$PROJECT_DIR$/pqs.ipr" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pqs.iws" beforeDir="false" afterPath="$PROJECT_DIR$/pqs.iws" afterDir="false" />
</list>
<list id="8dc99cd4-ae87-448e-8b91-038fd7ebf613" name="no commit" comment="no commit" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ChangesViewManager">
<option name="groupingKeys">
<option value="directory" />
<option value="module" />
</option>
</component>
<component name="Commander">
<leftPanel view="Project" />
<rightPanel view="Project" />
@@ -254,28 +258,6 @@
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="LineStatusTrackerManager">
<file path="$PROJECT_DIR$/pqs.iws">
<ranges>
<range start1="2" end1="2" start2="2" end2="5" changelist="8dc99cd4-ae87-448e-8b91-038fd7ebf613" />
<range start1="4" end1="15" start2="7" end2="9" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="16" end1="17" start2="10" end2="12" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="20" end1="21" start2="15" end2="16" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="268" end1="332" start2="263" end2="278" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="550" end1="551" start2="496" end2="497" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="568" end1="579" start2="514" end2="514" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="622" end1="622" start2="557" end2="559" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="636" end1="636" start2="573" end2="577" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="659" end1="659" start2="600" end2="604" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="793" end1="794" start2="738" end2="742" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="809" end1="810" start2="757" end2="807" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="867" end1="871" start2="864" end2="865" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="873" end1="873" start2="867" end2="868" changelist="2448d918-1a26-4571-be80-21a8dfa375ac" />
<range start1="928" end1="933" start2="923" end2="926" changelist="8dc99cd4-ae87-448e-8b91-038fd7ebf613" />
<range start1="937" end1="937" start2="930" end2="933" changelist="8dc99cd4-ae87-448e-8b91-038fd7ebf613" />
</ranges>
</file>
</component>
<component name="LvcsProjectConfiguration">
<option name="ADD_LABEL_ON_PROJECT_OPEN" value="true" />
<option name="ADD_LABEL_ON_PROJECT_COMPILATION" value="true" />
@@ -286,12 +268,15 @@
<option name="ADD_LABEL_ON_UNIT_TEST_PASSED" value="true" />
<option name="ADD_LABEL_ON_UNIT_TEST_FAILED" value="true" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="localRepository" value="D:\AJava\Maven\apache-maven-3.8.6\mvn_repo" />
<option name="mavenHome" value="$PROJECT_DIR$/../../../AJava/Maven/apache-maven-3.8.6" />
<option name="userSettingsFile" value="D:\AJava\Maven\apache-maven-3.8.6\conf\settings.xml" />
<option name="localRepository" value="D:\maven3.6.3\repository" />
<option name="mavenHome" value="Use Maven wrapper" />
<option name="userSettingsFile" value="D:\java\apache-maven-3.3.9\conf\settings.xml" />
</MavenGeneralSettings>
</option>
</component>
@@ -438,32 +423,16 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="ExpandSpringBootJavaOptionsPanel" value="true" />
<property name="GoToClass.includeLibraries" value="false" />
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
<property name="GoToFile.includeJavaFiles" value="false" />
<property name="MemberChooser.copyJavadoc" value="false" />
<property name="MemberChooser.showClasses" value="true" />
<property name="MemberChooser.sorted" value="false" />
<property name="RequestMappingsPanelOrder0" value="0" />
<property name="RequestMappingsPanelOrder1" value="1" />
<property name="RequestMappingsPanelOrder2" value="2" />
<property name="RequestMappingsPanelWidth0" value="75" />
<property name="RequestMappingsPanelWidth1" value="75" />
<property name="RequestMappingsPanelWidth2" value="75" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/../pqs-event/event-boot/src/main/java/com/njcn/event/service/Impl/TransientServiceImpl.java" />
<property name="nodejs_package_manager_path" value="npm" />
<property name="project.structure.last.edited" value="Modules" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="restartRequiresConfirmation" value="false" />
<property name="settings.editor.selected.configurable" value="MavenSettings" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;project.structure.last.edited&quot;: &quot;Project&quot;,
&quot;project.structure.proportion&quot;: &quot;0.0&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.0&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;
}
}</component>
<component name="ReactorSettings">
<option name="notificationShown" value="true" />
</component>
@@ -487,11 +456,13 @@
<component name="RunDashboard">
<option name="configurationTypes">
<set>
<option value="Application" />
<option value="JarApplication" />
<option value="SpringBootApplicationConfigurationType" />
</set>
</option>
</component>
<component name="RunManager" selected="Spring Boot.SystemBootMain">
<component name="RunManager" selected="Application.HarmonicBootApplication">
<configuration default="true" type="Applet" factoryName="Applet">
<module />
<option name="HTML_USED" value="false" />
@@ -499,15 +470,92 @@
<option name="HEIGHT" value="300" />
<option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
</configuration>
<configuration name="DataTest" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="DataTest" />
<module name="common-influxDB" />
<configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<option name="ALTERNATIVE_JRE_PATH" />
<option name="SHORTEN_COMMAND_LINE" value="NONE" />
<option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" />
<option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="DeviceBootApplication" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.njcn.DeviceBootApplication" />
<module name="device-boot" />
<shortenClasspath name="MANIFEST" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.njcn.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="EventBootApplication" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.njcn.event.EventBootApplication" />
<module name="event-boot" />
<shortenClasspath name="MANIFEST" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.njcn.event.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="GatewayMain" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.njcn.gateway.GatewayMain" />
<module name="pqs-gateway" />
<shortenClasspath name="MANIFEST" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.njcn.gateway.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="HarmonicBootApplication" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.njcn.harmonic.HarmonicBootApplication" />
<module name="harmonic-boot" />
<shortenClasspath name="MANIFEST" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.njcn.harmonic.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="SupervisionBootMain" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.njcn.supervision.SupervisionBootMain" />
<module name="supervision-boot" />
<shortenClasspath name="MANIFEST" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.njcn.supervision.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="Application" factoryName="Application">
<shortenClasspath name="MANIFEST" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<method v="2">
<option name="Make" enabled="true" />
@@ -623,32 +671,20 @@
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<option name="ALTERNATIVE_JRE_PATH" />
<option name="SHORTEN_COMMAND_LINE" value="NONE" />
<option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateClassesAndResources" />
<option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<list>
<item itemvalue="Application.DataTest" />
<item itemvalue="Spring Boot.DeviceBootApplication" />
<item itemvalue="Spring Boot.SystemBootMain" />
<item itemvalue="Spring Boot.HarmonicBootApplication" />
<item itemvalue="Spring Boot.AuthApplication" />
<item itemvalue="Spring Boot.JobAdminApplication" />
<item itemvalue="Spring Boot.EventBootApplication" />
<item itemvalue="Spring Boot.EnergyBootApplication" />
<item itemvalue="Spring Boot.QualityBootApplication" />
<item itemvalue="Spring Boot.UserBootApplication" />
<item itemvalue="Spring Boot.JobExecutorApplication" />
<item itemvalue="Spring Boot.GatewayMain" />
<item itemvalue="Application.GatewayMain" />
<item itemvalue="Application.SupervisionBootMain" />
<item itemvalue="Application.HarmonicBootApplication" />
<item itemvalue="Application.EventBootApplication" />
<item itemvalue="Application.DeviceBootApplication" />
</list>
<recent_temporary>
<list>
<item itemvalue="Application.DataTest" />
<item itemvalue="Application.HarmonicBootApplication" />
<item itemvalue="Application.EventBootApplication" />
<item itemvalue="Application.SupervisionBootMain" />
<item itemvalue="Application.DeviceBootApplication" />
<item itemvalue="Application.GatewayMain" />
</list>
</recent_temporary>
</component>
@@ -801,7 +837,42 @@
<option name="project" value="LOCAL" />
<updated>1664284251724</updated>
</task>
<option name="localTasksCounter" value="10" />
<task id="LOCAL-00010" summary="添加海量数据库驱动">
<created>1764050271282</created>
<option name="number" value="00010" />
<option name="presentableId" value="LOCAL-00010" />
<option name="project" value="LOCAL" />
<updated>1764050271282</updated>
</task>
<task id="LOCAL-00011" summary="添加注释">
<created>1765873374234</created>
<option name="number" value="00011" />
<option name="presentableId" value="LOCAL-00011" />
<option name="project" value="LOCAL" />
<updated>1765873374234</updated>
</task>
<task id="LOCAL-00012" summary="海南bug修改提交">
<created>1766461219349</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1766461219349</updated>
</task>
<task id="LOCAL-00013" summary="海南bug修改提交">
<created>1766989590709</created>
<option name="number" value="00013" />
<option name="presentableId" value="LOCAL-00013" />
<option name="project" value="LOCAL" />
<updated>1766989590709</updated>
</task>
<task id="LOCAL-00014" summary="海南bug修改提交">
<created>1766993391650</created>
<option name="number" value="00014" />
<option name="presentableId" value="LOCAL-00014" />
<option name="project" value="LOCAL" />
<updated>1766993391650</updated>
</task>
<option name="localTasksCounter" value="15" />
<servers />
</component>
<component name="TimeTrackingManager">
@@ -861,10 +932,90 @@
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.History.Properties">
<option name="COLUMN_ID_ORDER">
<list>
<option value="Default.Root" />
<option value="Default.Author" />
<option value="Default.Date" />
<option value="Default.Subject" />
<option value="Space.CommitStatus" />
</list>
</option>
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="OPEN_GENERIC_TABS">
<map>
<entry key="1dd2665e-6e1e-474f-8693-738d46c6010c" value="TOOL_WINDOW" />
</map>
</option>
<option name="TAB_STATES">
<map>
<entry key="1dd2665e-6e1e-474f-8693-738d46c6010c">
<value>
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="HEAD" />
</list>
</value>
</entry>
<entry key="structure">
<value>
<list>
<option value="dir:D:/cannengyun/vastbase-version/pqs-vastbase/pqs-system" />
</list>
</value>
</entry>
</map>
</option>
<option name="SHOW_ONLY_AFFECTED_CHANGES" value="true" />
</State>
</value>
</entry>
<entry key="5de75105-e341-4e7d-8c8a-a17350de871f">
<value>
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="HEAD" />
</list>
</value>
</entry>
<entry key="structure">
<value>
<list>
<option value="dir:D:/cannengyun/vastbase-version/pqs-vastbase/pqs-common" />
</list>
</value>
</entry>
</map>
</option>
<option name="SHOW_ONLY_AFFECTED_CHANGES" value="true" />
</State>
</value>
</entry>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="装置在线率调度任务" />
<MESSAGE value="EventTemplate控制器编写" />
<option name="LAST_COMMIT_MESSAGE" value="EventTemplate控制器编写" />
<MESSAGE value="添加海量数据库驱动" />
<MESSAGE value="添加注释" />
<MESSAGE value="海南bug修改提交" />
<option name="LAST_COMMIT_MESSAGE" value="海南bug修改提交" />
</component>
<component name="VssConfiguration">
<CheckoutOptions>
@@ -920,9 +1071,74 @@
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="1" />
<breakpoints>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-auth/src/main/java/com/njcn/auth/config/AuthorizationServerConfig.java</url>
<line>161</line>
<option name="timeStamp" value="1" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-advance/advance-boot/src/main/java/com/njcn/advance/controller/EventRelevantAnalysisController.java</url>
<line>85</line>
<option name="timeStamp" value="3" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/ExportModelController.java</url>
<line>1755</line>
<option name="timeStamp" value="4" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/controller/BpmProcessInstanceController.java</url>
<line>201</line>
<option name="timeStamp" value="5" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java</url>
<line>193</line>
<option name="timeStamp" value="7" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java</url>
<line>203</line>
<option name="timeStamp" value="8" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/strategy/BpmTaskCandidateInvoker.java</url>
<line>105</line>
<option name="timeStamp" value="10" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/strategy/BpmTaskCandidateRoleStrategy.java</url>
<line>36</line>
<option name="timeStamp" value="11" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-bpm/bpm-boot/src/main/java/com/njcn/bpm/strategy/BpmTaskCandidateInvoker.java</url>
<line>75</line>
<option name="timeStamp" value="12" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java</url>
<line>323</line>
<option name="timeStamp" value="14" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-event/event-boot/src/main/java/com/njcn/event/service/majornetwork/Impl/TransientServiceImpl.java</url>
<line>342</line>
<option name="timeStamp" value="15" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/IntegrityController.java</url>
<line>59</line>
<option name="timeStamp" value="16" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/IntegrityServiceImpl.java</url>
<line>166</line>
<option name="timeStamp" value="17" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
<watches-manager />
</component>
<component name="antWorkspaceConfiguration">
<option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />