47 Commits

Author SHA1 Message Date
3f47b0f008 微调 压缩文件的编解码保持一致 2025-12-23 10:29:40 +08:00
caozehui
cb431b5af1 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	entrance/src/main/resources/application.yml
2025-12-23 10:22:04 +08:00
caozehui
153428b24f 合并qr_branch分支代码 2025-12-22 10:30:56 +08:00
caozehui
d92544f7c4 Merge branch 'qr_branch'
# Conflicts:
#	detection/src/main/java/com/njcn/gather/detection/handler/SocketDevResponseService.java
#	detection/src/main/java/com/njcn/gather/detection/handler/SocketSourceResponseService.java
#	detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java
#	detection/src/main/java/com/njcn/gather/report/service/impl/PqReportServiceImpl.java
#	detection/src/main/java/com/njcn/gather/report/utils/BookmarkUtil.java
#	detection/src/main/java/com/njcn/gather/report/utils/Docx4jUtil.java
#	detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java
#	entrance/src/main/resources/application.yml
2025-12-22 08:52:13 +08:00
caozehui
3f1ae1886a Merge remote-tracking branch 'origin/qr_branch' into qr_branch 2025-12-19 16:17:40 +08:00
caozehui
af4863af65 2楼报告封面调整:装置编码改成装置编号 2025-12-19 16:17:33 +08:00
caozehui
4b7c1259a7 ICD映射上传路径微调 2025-12-16 16:18:02 +08:00
caozehui
de1496389e 微调 2025-12-11 16:19:26 +08:00
79003cd0f4 微调 2025-12-10 18:48:28 +08:00
caozehui
c3443fcc91 切换数据处理原则 2025-12-10 11:15:43 +08:00
caozehui
5105e77823 微调 2025-12-10 09:17:31 +08:00
caozehui
eb068b76a4 报告模板路径调整 2025-12-09 16:18:53 +08:00
9f11f7ec11 河北报告定制化改动 2025-12-02 13:52:07 +08:00
2012221b73 河北报告定制化改动 2025-12-02 13:37:35 +08:00
caozehui
9ab5d42439 微调 2025-12-01 19:14:29 +08:00
7abcaefeb1 增加回路额定电流描述 2025-11-27 20:03:11 +08:00
caozehui
f4df52dd1c 暂态只有a项时,当a相无数据时判断为不符合 2025-11-27 18:36:38 +08:00
db115bb27d 调整电流的小数位 2025-11-27 17:08:49 +08:00
caozehui
68d96e67aa 重新计算、更换误差体系接口调整,cp95处理原则调整、检测结果原始数据调整 2025-11-26 18:33:35 +08:00
3f94012faa 修复数模式的相序校验电流加量问题 2025-11-26 10:34:25 +08:00
41c557118c Merge remote-tracking branch 'origin/qr_branch' into qr_branch 2025-11-26 10:22:15 +08:00
6596a572d6 修复数模式的相序校验电流加量问题 2025-11-26 10:17:33 +08:00
139c7b0651 微调 2025-11-26 08:36:25 +08:00
caozehui
ab236cd34f 微调 2025-11-21 10:09:48 +08:00
caozehui
786bd5d660 报告调整 2025-11-19 13:20:35 +08:00
caozehui
21d2c2b7a7 报告调整 2025-11-19 13:20:17 +08:00
caozehui
48fa4c2390 报告日期格式根据参数动态变化 2025-11-19 10:43:52 +08:00
caozehui
033330b005 微调 2025-11-19 09:35:49 +08:00
caozehui
f81123c3f7 监测点修改同步状态调整、脚本新增福禄克专用字段 2025-11-17 16:32:52 +08:00
caozehui
5539cb2887 微调 2025-11-14 10:16:08 +08:00
caozehui
1df9c8d703 微调 2025-11-13 14:20:50 +08:00
caozehui
1cbed2a620 icd上传映射文件 2025-11-13 08:37:52 +08:00
89667367ea 添加水印 2025-11-12 11:45:21 +08:00
92b95dd86d 微调 2025-11-11 13:18:42 +08:00
caozehui
6b7e38fef6 处理源未知异常 2025-11-10 14:45:23 +08:00
caozehui
f10debe2f2 比对-被检设备导入微调 2025-11-07 15:13:07 +08:00
caozehui
9d15351fba 微调 2025-11-06 09:25:09 +08:00
caozehui
2339a006ec 补充源未知异常推送消息 2025-11-06 08:51:54 +08:00
caozehui
7fd904ab79 系数校准接收数据个数调整 2025-11-05 16:02:53 +08:00
caozehui
61f149b562 系数校准接收数据个数调整 2025-11-05 13:51:47 +08:00
caozehui
40cb153656 报告模板调整 2025-11-03 08:38:57 +08:00
caozehui
f922ee97aa 报告路径,报告名称修改 2025-10-30 09:06:40 +08:00
caozehui
26c5e933f5 微调 2025-10-29 09:01:45 +08:00
caozehui
c7d8fc3168 报告封面微调 2025-10-22 11:05:21 +08:00
caozehui
bb22857fc9 报告微调 2025-10-21 15:42:22 +08:00
caozehui
6ef908ff60 微调 2025-09-03 20:32:14 +08:00
caozehui
7461801657 微调 2025-09-03 16:18:52 +08:00
49 changed files with 1288 additions and 405 deletions

View File

@@ -120,7 +120,7 @@ public class SocketContrastResponseService {
// private SysRegRes contrastRegRes = null;
@Value("${log.homeDir}")
@Value("${report.reportDir}")
private String alignDataFilePath;
public static final Map<String, List<String>> testItemCodeMap = new HashMap() {{
@@ -182,6 +182,8 @@ public class SocketContrastResponseService {
FormalTestManager.pstDataType = null;
FormalTestManager.isPstData = false;
FormalTestManager.isWaveCheck = false;
FormalTestManager.isXu = param.getPhaseCheck() == 1 ? true : false;
// FormalTestManager.isXu = true;
FormalTestManager.nonWaveDataSourceEnum = null;
String[] datasourceIds = FormalTestManager.currentTestPlan.getDatasourceId().split(",");
@@ -219,7 +221,13 @@ public class SocketContrastResponseService {
FormalTestManager.isRemoveSocket = false;
FormalTestManager.waveCheckFlag = false;
FormalTestManager.scheduler = null;
FormalTestManager.scheduledFuture = null;
if (FormalTestManager.scheduledFuture != null) {
FormalTestManager.scheduledFuture.cancel(true);
if (FormalTestManager.scheduler != null) {
FormalTestManager.scheduler.shutdown();
}
FormalTestManager.scheduledFuture = null;
}
HashBiMap<String, String> hashBiMap = HashBiMap.create(param.getPairs());
FormalTestManager.pairsIdMap.clear();
@@ -716,9 +724,14 @@ public class SocketContrastResponseService {
} else if (FormalTestManager.isWaveCheck) {
System.out.println("(仅有录波)模型一致性校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》开始相序校验》》》》》》》》》》》》》》》》》》》》》》》》》》》");
this.sendXu(s);
this.resetTimer();
FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_XUJY;
if (FormalTestManager.isXu) {
this.sendXu(s);
this.resetTimer();
FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_XUJY;
} else {
System.out.println("跳过相序校验!");
this.sendFormalTest(s, param, requestOperateCode, quitOperateCode);
}
}
}
}
@@ -909,9 +922,14 @@ public class SocketContrastResponseService {
this.clearData();
System.out.println("数据对齐校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始相序校验》》》》》》》》》》》》》》》》");
this.sendXu(s);
FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_XUJY;
if (FormalTestManager.isXu) {
System.out.println("数据对齐校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始相序校验》》》》》》》》》》》》》》》》");
this.sendXu(s);
FormalTestManager.currentStep = SourceOperateCodeEnum.YJC_XUJY;
} else {
System.out.println("跳过相序校验!");
this.sendFormalTest(s, param, requestOperateCode, quitOperateCode);
}
this.resetTimer();
}
}
@@ -1035,60 +1053,7 @@ public class SocketContrastResponseService {
webSend.setCode(SourceResponseCodeEnum.ALL_SUCCESS.getCode());//最终成功推送
WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend));
// 后续做正式检测
if (param.getTestItemList().get(2)) {
System.out.println("相序校验成功!》》》》》》》》》》》》》》》》》》》》》》》》》》》》》开始正式检测》》》》》》》》》》》》》》》》");
if (ObjectUtil.isNotNull(FormalTestManager.nonWaveDataSourceEnum)) {
SocketMsg<String> socketMsg = new SocketMsg<>();
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue());
socketMsg.setOperateCode(requestOperateCode.getValue());
DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam();
phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()])));
List<String> allDataType = this.getAllDataType();
FormalTestManager.pstDataType = new ArrayList<>();
if (allDataType.contains(DetectionCodeEnum.AVG_PREFIX.getCode() + DetectionCodeEnum.PST.getCode())) {
FormalTestManager.pstDataType.add(DetectionCodeEnum.AVG_PREFIX.getCode() + DetectionCodeEnum.PST.getCode());
allDataType.remove(DetectionCodeEnum.AVG_PREFIX.getCode() + DetectionCodeEnum.PST.getCode());
}
if (CollUtil.isNotEmpty(allDataType)) {
phaseSequenceParam.setDataType(allDataType);
} else {
if (CollUtil.isNotEmpty(FormalTestManager.pstDataType)) {
FormalTestManager.isPstData = true;
socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_01.getValue());
phaseSequenceParam.setDataType(FormalTestManager.pstDataType);
}
}
phaseSequenceParam.setReadCount(this.getReadCount(this.getTargetCount()));
phaseSequenceParam.setIgnoreCount(0);
socketMsg.setData(JSON.toJSONString(phaseSequenceParam));
FormalTestManager.currentStep = SourceOperateCodeEnum.FORMAL_REAL;
SocketManager.sendMsg(s, JSON.toJSONString(socketMsg));
this.resetTimer();
checkResult = false;
} else if (FormalTestManager.isWaveCheck) {
if (FormalTestManager.statisticsProtocol && quitOperateCode == SourceOperateCodeEnum.QUIT_INIT_02) {
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
}
// 录波数据
CnSocketUtil.contrastSendquit(param.getUserPageId(), quitOperateCode, false);
successComm.clear();
failComm.clear();
FormalTestManager.currentStep = SourceOperateCodeEnum.RECORD_WAVE_STEP1;
// 发送录波指令
this.sendRecordWave(s);
}
} else {
if (FormalTestManager.statisticsProtocol && quitOperateCode == SourceOperateCodeEnum.QUIT_INIT_02) {
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
}
if (FormalTestManager.voltageProtocol) {
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, false);
}
CnSocketUtil.contrastSendquit(param.getUserPageId(), quitOperateCode, false);
FormalTestManager.isTesting = false;
}
this.sendFormalTest(s, param, requestOperateCode, quitOperateCode);
}
} else if (successComm.size() == FormalTestManager.monitorMap.size()) {
this.clearData();
@@ -1174,6 +1139,63 @@ public class SocketContrastResponseService {
}
}
private void sendFormalTest(String s, PreDetectionParam param, SourceOperateCodeEnum requestOperateCode, SourceOperateCodeEnum quitOperateCode) {
// 后续做正式检测
if (param.getTestItemList().get(2)) {
System.out.println("开始正式检测!");
if (ObjectUtil.isNotNull(FormalTestManager.nonWaveDataSourceEnum)) {
SocketMsg<String> socketMsg = new SocketMsg<>();
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue());
socketMsg.setOperateCode(requestOperateCode.getValue());
DevPhaseSequenceParam phaseSequenceParam = new DevPhaseSequenceParam();
phaseSequenceParam.setMoniterIdList(Arrays.asList(FormalTestManager.monitorMap.keySet().toArray(new String[FormalTestManager.monitorMap.size()])));
List<String> allDataType = this.getAllDataType();
FormalTestManager.pstDataType = new ArrayList<>();
if (allDataType.contains(DetectionCodeEnum.AVG_PREFIX.getCode() + DetectionCodeEnum.PST.getCode())) {
FormalTestManager.pstDataType.add(DetectionCodeEnum.AVG_PREFIX.getCode() + DetectionCodeEnum.PST.getCode());
allDataType.remove(DetectionCodeEnum.AVG_PREFIX.getCode() + DetectionCodeEnum.PST.getCode());
}
if (CollUtil.isNotEmpty(allDataType)) {
phaseSequenceParam.setDataType(allDataType);
} else {
if (CollUtil.isNotEmpty(FormalTestManager.pstDataType)) {
FormalTestManager.isPstData = true;
socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_DATA_REQUEST_01.getValue());
phaseSequenceParam.setDataType(FormalTestManager.pstDataType);
}
}
phaseSequenceParam.setReadCount(this.getReadCount(this.getTargetCount()));
phaseSequenceParam.setIgnoreCount(0);
socketMsg.setData(JSON.toJSONString(phaseSequenceParam));
FormalTestManager.currentStep = SourceOperateCodeEnum.FORMAL_REAL;
SocketManager.sendMsg(s, JSON.toJSONString(socketMsg));
this.resetTimer();
checkResult = false;
} else if (FormalTestManager.isWaveCheck) {
if (FormalTestManager.statisticsProtocol && quitOperateCode == SourceOperateCodeEnum.QUIT_INIT_02) {
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
}
// 录波数据
CnSocketUtil.contrastSendquit(param.getUserPageId(), quitOperateCode, false);
successComm.clear();
failComm.clear();
FormalTestManager.currentStep = SourceOperateCodeEnum.RECORD_WAVE_STEP1;
// 发送录波指令
this.sendRecordWave(s);
}
} else {
if (FormalTestManager.statisticsProtocol && quitOperateCode == SourceOperateCodeEnum.QUIT_INIT_02) {
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
}
if (FormalTestManager.voltageProtocol) {
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, false);
}
CnSocketUtil.contrastSendquit(param.getUserPageId(), quitOperateCode, false);
FormalTestManager.isTesting = false;
}
}
/**
* 正式检测
*
@@ -1208,39 +1230,6 @@ public class SocketContrastResponseService {
}
}
this.setScheduler(targetCount, param.getUserPageId(), requestOperateCode, quitOperateCode);
// if (Objects.isNull(FormalTestManager.scheduler)) {
// FormalTestManager.scheduler = Executors.newScheduledThreadPool(1);
// long delay = this.getDelay(targetCount);
// FormalTestManager.scheduledFuture = FormalTestManager.scheduler.schedule(() -> {
// if (!checkResult) {
// System.out.println("正式检测-" + delay + "s内收集数据不完整");
// // 断开与设备的连接,但是不要将Socket移除
// if (FormalTestManager.statisticsProtocol && quitOperateCode == SourceOperateCodeEnum.QUIT_INIT_02) {
// CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
// }
// if (FormalTestManager.voltageProtocol) {
// CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, false);
// }
// CnSocketUtil.contrastSendquit(param.getUserPageId(), quitOperateCode, false);
// FormalTestManager.isTesting = false;
//
// this.clearData();
//
// Collection<String> disjunction = CollectionUtil.disjunction(FormalTestManager.pairsIpMap.keySet(), successPair.keySet());
// // 向前端推送收集数据不完整的配对项
// for (String key : disjunction) {
// webSend.setCode(SourceResponseCodeEnum.FAIL.getCode());
// webSend.setData(MsgUtil.getPairStr(key, FormalTestManager.pairsIpMap.inverse().get(key), FormalTestManager.devNameMapComm) + " 数据收集不完整!");
// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend));
// }
// // 推送最终失败结果
// webSend.setCode(SourceResponseCodeEnum.ALL_FAIL.getCode());//最终错误推送
// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(webSend));
// }
// FormalTestManager.scheduler.shutdown();
// FormalTestManager.scheduler = null;
// }, delay, TimeUnit.SECONDS);
// }
String monitorId1 = devData.getId();
String devMonitorId = monitorId1;
@@ -2127,7 +2116,7 @@ public class SocketContrastResponseService {
});
});
ExcelUtil.saveExcel(alignDataFilePath, "实时数据.xlsx", sheetsList);
ExcelUtil.saveExcel(alignDataFilePath, "对齐数据.xlsx", sheetsList);
}
/**

View File

@@ -439,6 +439,7 @@ public class SocketDevResponseService {
//告诉前端当前项开始了
WebSocketVO<Object> webSocketVO = new WebSocketVO<>();
FormalTestManager.currentIssue = sourceIssues.get(0);
String type = sourceIssues.get(0).getType();
if (ResultUnitEnum.P.getCode().equals(type)) {
sourceIssues.get(0).setType(ResultUnitEnum.V_ABSOLUTELY.getCode());
@@ -612,7 +613,7 @@ public class SocketDevResponseService {
private void assemblyEntity(List<DevData> deList, DevXiNumData.F F, DevXiNumData.GF startF, CoefficientVO coefficientVO, CoefficientVO.DevParameter devParameter) {
//表示接收完成,必须保证3个数
if (deList.size() >= 3) {
if (deList.size() >= 7) {
List<Double> aList = deList.stream().map(it -> it.getSqlData().get(0).getList().getA()).collect(Collectors.toList());
List<Double> bList = deList.stream().map(it -> it.getSqlData().get(0).getList().getB()).collect(Collectors.toList());
List<Double> cList = deList.stream().map(it -> it.getSqlData().get(0).getList().getC()).collect(Collectors.toList());
@@ -687,7 +688,7 @@ public class SocketDevResponseService {
*/
private Double reduceList(List<Double> valList) {
// valList.subList(0, 5).clear();
// valList.subList(valList.size() - 3, valList.size() - 1).clear();
valList.subList(valList.size() - 2, valList.size()).clear();
return valList.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
}
@@ -953,6 +954,7 @@ public class SocketDevResponseService {
} else {
webSocketVO.setRequestId(sourceIssues.get(0).getType() + CnSocketUtil.START_TAG);
}
FormalTestManager.currentIssue = sourceIssues.get(0);
socketMsg.setData(JSON.toJSONString(sourceIssues.get(0)));
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + type);
socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue());
@@ -1210,6 +1212,7 @@ public class SocketDevResponseService {
} else {
webSocketVO.setRequestId(sourceIssues.get(0).getType() + CnSocketUtil.START_TAG);
}
FormalTestManager.currentIssue = sourceIssues.get(0);
socketMsg.setData(JSON.toJSONString(sourceIssues.get(0)));
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + type);
socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue());
@@ -1782,6 +1785,7 @@ public class SocketDevResponseService {
} else {
dataRule = DictDataEnum.SECTION_VALUE;
}
FormalTestManager.currentTestPlan = plan;
String code = dictDataService.getDictDataById(plan.getPattern()).getCode();
FormalTestManager.patternEnum = PatternEnum.getEnum(code);

View File

@@ -2,6 +2,7 @@ package com.njcn.gather.detection.handler;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum;
import com.njcn.gather.detection.pojo.param.DevPhaseSequenceParam;
@@ -14,7 +15,12 @@ import com.njcn.gather.detection.util.socket.*;
import com.njcn.gather.detection.util.socket.websocket.WebServiceManager;
import com.njcn.gather.device.pojo.vo.PreDetection;
import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.plan.pojo.po.AdPlanSource;
import com.njcn.gather.plan.service.IAdPlanSourceService;
import com.njcn.gather.result.pojo.enums.ResultUnitEnum;
import com.njcn.gather.script.pojo.po.SourceIssue;
import com.njcn.gather.source.pojo.po.SourceInitialize;
import com.njcn.gather.source.service.IPqSourceService;
import com.njcn.gather.system.pojo.enums.DicDataEnum;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -56,6 +62,8 @@ public class SocketSourceResponseService {
* 设备信息服务,提供设备基础信息查询功能
*/
private final IPqDevService iPqDevService;
private final IAdPlanSourceService adPlanSourceService;
private final IPqSourceService pqSourceService;
/**
* Socket连接管理器负责管理设备和源的Socket连接
@@ -334,9 +342,9 @@ public class SocketSourceResponseService {
// 系数校验固定检测项:实时电压有效值和实时电流有效值
phaseSequenceParam.setDataType(Arrays.asList("real$VRMS", "real$IRMS"));
// 读取3次数据用于系数计算
phaseSequenceParam.setReadCount(3);
phaseSequenceParam.setReadCount(7); //3
// 忽略前4次数据等待测量稳定
phaseSequenceParam.setIgnoreCount(4);
phaseSequenceParam.setIgnoreCount(3); //4
socketMsg.setData(JSON.toJSONString(phaseSequenceParam));
SocketManager.sendMsg(s, JSON.toJSONString(socketMsg));
@@ -363,18 +371,32 @@ public class SocketSourceResponseService {
SocketMsg<String> socketMsg = new SocketMsg<>();
switch (dictDataEnumByCode) {
case SUCCESS:
//todo 前端推送收到的消息暂未处理好
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
//开始设备通讯检测(发送设备初始化)
Map<String, List<PreDetection>> map = new HashMap<>(1);
map.put("deviceList", FormalTestManager.devList);
String jsonString = JSON.toJSONString(map);
socketMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue());
socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue());
socketMsg.setData(jsonString);
String json = JSON.toJSONString(socketMsg);
// 使用智能发送工具类,自动管理设备连接
socketManager.smartSendToDevice(param, json);
if (FormalTestManager.unknownError) {
FormalTestManager.unknownError = false;
//重新下发脚本
String type = FormalTestManager.currentIssue.getType();
if (ResultUnitEnum.P.getCode().equals(type)) {
FormalTestManager.currentIssue.setType(ResultUnitEnum.V_ABSOLUTELY.getCode());
}
socketMsg.setOperateCode(SourceOperateCodeEnum.OPER_GATHER.getValue());
socketMsg.setData(JSON.toJSONString(FormalTestManager.currentIssue));
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + type);
SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg));
} else {
//todo 前端推送收到的消息暂未处理好
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
//开始设备通讯检测(发送设备初始化)
Map<String, List<PreDetection>> map = new HashMap<>(1);
map.put("deviceList", FormalTestManager.devList);
String jsonString = JSON.toJSONString(map);
socketMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue());
socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue());
socketMsg.setData(jsonString);
String json = JSON.toJSONString(socketMsg);
// 使用智能发送工具类,自动管理设备连接
socketManager.smartSendToDevice(param, json);
}
break;
case UNPROCESSED_BUSINESS:
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
@@ -570,6 +592,10 @@ public class SocketSourceResponseService {
case UNPROCESSED_BUSINESS:
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
break;
case UNKNOWN_ERROR: //-1源未知异常
CnSocketUtil.quitSendSource(param);
FormalTestManager.unknownError = true;
break;
default:
sendErrorAndQuit(param, socketDataMsg, dictDataEnumByCode);
break;
@@ -601,9 +627,23 @@ public class SocketSourceResponseService {
SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode());
switch (Objects.requireNonNull(dictDataEnumByCode)) {
case SUCCESS:
//通讯校验成功
SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.SOURCE_TAG);
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
if (FormalTestManager.unknownError) {
//获取源初始化参数
AdPlanSource planSource = adPlanSourceService.getOne(new LambdaQueryWrapper<AdPlanSource>().eq(AdPlanSource::getPlanId, param.getPlanId()));
SourceInitialize sourceParam = pqSourceService.getSourceInitializeParam(planSource.getSourceId());
if (ObjectUtil.isNotNull(sourceParam)) {
SocketMsg<String> socketMsg1 = new SocketMsg<>();
socketMsg1.setRequestId(SourceOperateCodeEnum.YJC_YTXJY.getValue());
socketMsg1.setOperateCode(SourceOperateCodeEnum.INIT_GATHER.getValue());
socketMsg1.setData(JSON.toJSONString(sourceParam));
//使用智能发送工具类自动管理与源控程序的socket连接
socketManager.smartSendToSource(param, JSON.toJSONString(socketMsg1));
}
} else {
//通讯校验成功
SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.SOURCE_TAG);
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
}
break;
case UNPROCESSED_BUSINESS:
break;
@@ -653,6 +693,8 @@ public class SocketSourceResponseService {
// 同步更新系数管理器中的设备列表
XiNumberManager.xiDevList = devList;
FormalTestManager.unknownError = false;
FormalTestManager.currentIssue = null;
}
}

View File

@@ -43,4 +43,9 @@ public class ContrastDetectionParam {
private List<Boolean> testItemList;
private String userId;
/**
* 是否进行相许校验
*/
private Integer phaseCheck;
}

View File

@@ -53,4 +53,9 @@ public class DetectionData {
* 误差体系详情ID(比对式使用)
*/
private String errorDtlId;
/**
* 有效组数
*/
private Integer validGroupNum;
}

View File

@@ -809,6 +809,9 @@ public class DetectionServiceImpl {
))
.collect(Collectors.toList());
DetectionData a = setDetectionData(isQualified, dataRule, mag, fData, dur, magErrList, channelTypeAList, TYPE_A, scale);
if (CollUtil.isEmpty(mag.get(TYPE_A))) {
a.setIsData(2);
}
result.setAValue(JSON.toJSONString(a));
result.setTValue(JSON.toJSONString(a));
result.setResultFlag(a.getIsData());
@@ -1567,6 +1570,9 @@ public class DetectionServiceImpl {
private Map<String, Integer> singleMonitorProcessing(List<DevData> devDataList, List<DevData> standardDevDataList, Map<String, String> devIdMapComm, List<String> testItemCodeList, String errorSysId, DictDataEnum dataRule, Integer num, String code, Integer waveNum, DataSourceEnum dataSourceEnum) {
Map<String, Integer> resultMap = new HashMap<>();
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(testItemCodeList)) {
devDataList = devDataList.stream().sorted(Comparator.comparing(DevData::getTime)).collect(Collectors.toList());
standardDevDataList = standardDevDataList.stream().sorted(Comparator.comparing(DevData::getTime)).collect(Collectors.toList());
// 处理谐波数据
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
String[] split1 = devDataList.get(0).getId().split("_");
String devMonitorId = devIdMapComm.get(split1[0]) + "_" + split1[1];
@@ -1654,7 +1660,7 @@ public class DetectionServiceImpl {
resultMap.put(PowerIndexEnum.HSI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
break;
case PST:
resultMap.put(PowerIndexEnum.F.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn , DetectionCodeEnum.PST.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, DataSourceEnum.MINUTE_STATISTICS_AVG));
resultMap.put(PowerIndexEnum.F.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, DetectionCodeEnum.PST.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, DataSourceEnum.MINUTE_STATISTICS_AVG));
break;
case UNKNOWN_ERROR:
break;
@@ -1750,8 +1756,16 @@ public class DetectionServiceImpl {
result.setDataType(DataSourceEnum.WAVE_DATA.getValue());
}
Map<String, List<Double>> validData = this.getValidData(standardDevDataList, desc);
Integer validGroupNum = 0;
if (map.containsKey(TYPE_T)) {
if (ObjectUtil.isNotNull(validData)) {
List<Double> tValidDataList = validData.get(TYPE_T);
validGroupNum = this.getValidGroupNum(tValidDataList, null, errSysDtls, fData, scale, dataRule);
}
List<DetectionData> tList = rangeComparisonList(map.get(TYPE_T).get(0), map.get(TYPE_T).get(1), errSysDtls, fData, scale, dataRule);
this.setValidGroupNum(tList, validGroupNum);
result.setTValue(JSON.toJSONString(tList));
result.setResultFlag(setResultFlag(tList));
} else {
@@ -1768,7 +1782,13 @@ public class DetectionServiceImpl {
phases.add(TYPE_B);
for (String phase : phases) {
if (ObjectUtil.isNotNull(validData)) {
List<Double> validDataList = validData.get(phase);
validGroupNum = this.getValidGroupNum(validDataList, null, errSysDtls, fData, scale, dataRule);
}
List<DetectionData> phaseList = rangeComparisonList(map.get(phase).get(0), map.get(phase).get(1), errSysDtls, fData, scale, dataRule);
this.setValidGroupNum(phaseList, validGroupNum);
resultFlag.addAll(phaseList);
BiConsumer<ContrastNonHarmonicResult, List<DetectionData>> setter = setters.get(phase);
setter.accept(result, phaseList);
@@ -1783,6 +1803,169 @@ public class DetectionServiceImpl {
return StorageUtil.getInteger(resultFlag);
}
private Map<String, List<Double>> getValidData(List<DevData> dev, String desc) {
List<Double> aDev = new ArrayList<>();
List<Double> bDev = new ArrayList<>();
List<Double> cDev = new ArrayList<>();
List<Double> tDev = new ArrayList<>();
for (int i = 0; i < dev.size(); i++) {
List<DevData.SqlDataDTO> devSqlData = dev.get(i).getSqlData();
String finalDesc = desc;
List<DevData.SqlDataDTO.ListDTO> devList = devSqlData.stream().filter(j -> finalDesc.equals(j.getDesc()))
.map(DevData.SqlDataDTO::getList).collect(Collectors.toList());
if (CollUtil.isEmpty(devList)) {
return null;
}
aDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getA()))
.map(x -> x.getA().doubleValue())
.collect(Collectors.toList()));
bDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getB()))
.map(x -> x.getB().doubleValue())
.collect(Collectors.toList()));
cDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getC()))
.map(x -> x.getC().doubleValue())
.collect(Collectors.toList()));
tDev.addAll(devList.stream().filter(x -> ObjectUtil.isNotNull(x.getT()))
.map(x -> x.getT().doubleValue())
.collect(Collectors.toList()));
}
return new HashMap() {
{
put(TYPE_A, aDev);
put(TYPE_B, bDev);
put(TYPE_C, cDev);
put(TYPE_T, tDev);
}
};
}
private Map<String, Map<Double, List<Double>>> getHarmValidData(List<DevData> dev, String fundCode, String harmCode, Integer harmonicFlag) {
// key为相别、value{key为谐波次数value为按数据处理原则处理后的数据}
Map<String, Map<Double, List<Double>>> devMap = new HashMap<>(3);
List<Double> harmNum = new ArrayList<>();
if (1 == harmonicFlag) {
harmNum.addAll(Stream.iterate(0.5, x -> x + 1.0).limit(50).collect(Collectors.toList()));
} else {
harmNum.addAll(Stream.iterate(1.0, x -> x + 1.0).limit(50).collect(Collectors.toList()));
}
for (int i = 0; i < dev.size(); i++) {
List<DevData.SqlDataDTO> devSqlData = dev.get(i).getSqlData();
Optional<DevData.SqlDataDTO> first1 = Optional.empty();
if (CollUtil.isNotEmpty(devSqlData)) {
first1 = devSqlData.stream().filter(j -> fundCode.equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
}
DevData.SqlDataDTO fund1 = null;
if (first1.isPresent()) {
fund1 = first1.get();
}
List<DevData.SqlDataHarmDTO> devHarmList = dev.get(i).getSqlDataHarm().stream().filter(x -> harmCode.equals(x.getDesc())).collect(Collectors.toList());
if (CollUtil.isEmpty(devHarmList)) {
return null;
}
if (CollUtil.isNotEmpty(devHarmList)) {
DevData.SqlDataHarmDTO devHarm = devHarmList.get(0);
if (ObjectUtil.isNotNull(fund1)) {
harmPut(TYPE_A, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getA()), harmonicFlag);
harmPut(TYPE_B, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getB()), harmonicFlag);
harmPut(TYPE_C, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getC()), harmonicFlag);
} else {
harmPut(TYPE_A, devMap, harmNum, devHarm, "1.0", harmonicFlag);
harmPut(TYPE_B, devMap, harmNum, devHarm, "1.0", harmonicFlag);
harmPut(TYPE_C, devMap, harmNum, devHarm, "1.0", harmonicFlag);
}
}
}
return devMap;
}
private Integer getValidGroupNum(List<Double> devDataList, List<Double> U1List, List<PqErrSysDtls> errSysDtls, Double fData, Integer scale, DictDataEnum dataRule) {
int result = 0;
if (dataRule.getCode().equals(DictDataEnum.Own_value.getCode()) || dataRule.getCode().equals(DictDataEnum.SECTION_VALUE.getCode())) {
return 1;
} else {
for (int i = 0; i < devDataList.size(); i++) {
Double U1 = CollUtil.isNotEmpty(U1List) ? U1List.get(i) : null;
Double stdDevData = BigDecimal.valueOf(devDataList.get(i)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
Double devData = BigDecimal.valueOf(devDataList.get(i)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
DetectionData detectionData = new DetectionData();
detectionData.setIsData(ResultEnum.NO_ERROR_SYS.getValue());
//获得误差体系
List<PqErrSysDtls> errSysDtls1 = errSysDtls.stream().filter(x -> rangeComparison(startRadiusEnd(x.getStartValue(), fData, stdDevData, x.getConditionType(), scale),
x.getStartFlag(),
startRadiusEnd(x.getEndValue(), fData, stdDevData, x.getConditionType(), scale),
x.getEndFlag(),
ObjectUtil.isNotNull(U1) ? stdDevData * U1 * 0.01 : stdDevData)).collect(Collectors.toList());
detectionData.setData(devData);
detectionData.setResultData(stdDevData);
if (CollUtil.isNotEmpty(errSysDtls1)) {
result++;
}
}
}
return result;
}
private Map<Double, Integer> getHarmValidGroupNum(Map<Double, List<Double>> devDataMap, List<Double> U1List, List<PqErrSysDtls> errSysDtls, Double fData, Integer scale, DictDataEnum dataRule) {
Map<Double, Integer> resultMap = new HashMap<>();
devDataMap.forEach((harmNum, dataList) -> {
if (dataRule.getCode().equals(DictDataEnum.Own_value.getCode()) || dataRule.getCode().equals(DictDataEnum.SECTION_VALUE.getCode())) {
resultMap.put(harmNum, 1);
} else {
Integer validGroupNum = 0;
for (int i = 0; i < dataList.size(); i++) {
Double U1 = CollUtil.isNotEmpty(U1List) ? U1List.get(i) : null;
Double stdDevData = BigDecimal.valueOf(dataList.get(i)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
Double devData = BigDecimal.valueOf(dataList.get(i)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
DetectionData detectionData = new DetectionData();
detectionData.setIsData(ResultEnum.NO_ERROR_SYS.getValue());
//获得误差体系
List<PqErrSysDtls> errSysDtls1 = errSysDtls.stream().filter(x -> rangeComparison(startRadiusEnd(x.getStartValue(), fData, stdDevData, x.getConditionType(), scale),
x.getStartFlag(),
startRadiusEnd(x.getEndValue(), fData, stdDevData, x.getConditionType(), scale),
x.getEndFlag(),
ObjectUtil.isNotNull(U1) ? stdDevData * U1 * 0.01 : stdDevData)).collect(Collectors.toList());
detectionData.setData(devData);
detectionData.setResultData(stdDevData);
if (CollUtil.isNotEmpty(errSysDtls1)) {
validGroupNum++;
}
}
resultMap.put(harmNum, validGroupNum);
}
});
return resultMap;
}
private void setValidGroupNum(List<DetectionData> tList, Integer validGroupNum) {
tList.forEach(detectionData -> {
detectionData.setValidGroupNum(validGroupNum);
});
}
private void setHarmValidGroupNum(List<DetectionData> integerBooleanA, Map<Double, Integer> harmValidGroupNumA) {
integerBooleanA.forEach(detectionData -> {
Double harmNum = detectionData.getNum();
Integer validGroupNum = harmValidGroupNumA.get(harmNum);
detectionData.setValidGroupNum(validGroupNum);
});
}
/**
* 处理谐波数据
@@ -1869,9 +2052,22 @@ public class DetectionServiceImpl {
result.setDataType(DataSourceEnum.WAVE_DATA.getValue());
}
Map<String, Map<Double, List<Double>>> harmValidData = this.getHarmValidData(standardDevDataList, fundCode, harmCode, harmonicFlag);
List<DetectionData> integerBooleanA = harmRangeComparison(devMap.get(TYPE_A).get(0), devMap.get(TYPE_A).get(1), errSysDtls, type, fData, scale, dataRule);
List<DetectionData> integerBooleanB = harmRangeComparison(devMap.get(TYPE_B).get(0), devMap.get(TYPE_B).get(1), errSysDtls, type, fData, scale, dataRule);
List<DetectionData> integerBooleanC = harmRangeComparison(devMap.get(TYPE_C).get(0), devMap.get(TYPE_C).get(1), errSysDtls, type, fData, scale, dataRule);
Map<String, Map<Double, List<Double>>> U1ListMap = this.getU1ListMap(standardDevDataList, fundCode, harmCode, harmonicFlag);
Map<Double, Integer> harmValidGroupNumA = this.getHarmValidGroupNum(harmValidData.get(TYPE_A), U1ListMap.get(TYPE_A).get(0.0), errSysDtls, fData, scale, dataRule);
this.setHarmValidGroupNum(integerBooleanA, harmValidGroupNumA);
Map<Double, Integer> harmValidGroupNumB = this.getHarmValidGroupNum(harmValidData.get(TYPE_B), U1ListMap.get(TYPE_B).get(0.0), errSysDtls, fData, scale, dataRule);
this.setHarmValidGroupNum(integerBooleanB, harmValidGroupNumB);
Map<Double, Integer> harmValidGroupNumC = this.getHarmValidGroupNum(harmValidData.get(TYPE_C), U1ListMap.get(TYPE_C).get(0.0), errSysDtls, fData, scale, dataRule);
this.setHarmValidGroupNum(integerBooleanC, harmValidGroupNumC);
reflectHarmonic(true, "a", integerBooleanA, result, harmonicFlag);
reflectHarmonic(true, "b", integerBooleanB, result, harmonicFlag);
reflectHarmonic(true, "c", integerBooleanC, result, harmonicFlag);
@@ -1888,6 +2084,59 @@ public class DetectionServiceImpl {
return StorageUtil.getInteger(resultFlag);
}
private Map<String, Map<Double, List<Double>>> getU1ListMap(List<DevData> devDataList, String fundCode, String harmCode, Integer harmonicFlag) {
Map<String, Map<Double, List<Double>>> resultMap = new HashMap<>(3);
// key为相别、value{key为谐波次数value为按数据处理原则处理后的数据}
Map<String, Map<Double, List<Double>>> devMap = new HashMap<>(3);
List<Double> harmNum = new ArrayList<>();
if (1 == harmonicFlag) {
harmNum.addAll(Stream.iterate(0.5, x -> x + 1.0).limit(50).collect(Collectors.toList()));
} else {
harmNum.addAll(Stream.iterate(1.0, x -> x + 1.0).limit(50).collect(Collectors.toList()));
}
for (int i = 0; i < devDataList.size(); i++) {
List<DevData.SqlDataDTO> standardDevSqlData = devDataList.get(i).getSqlData();
Optional<DevData.SqlDataDTO> first1 = Optional.empty();
if (CollUtil.isNotEmpty(standardDevSqlData)) {
first1 = standardDevSqlData.stream().filter(j -> fundCode.equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
}
DevData.SqlDataDTO fund1 = null;
if (first1.isPresent()) {
fund1 = first1.get();
}
List<DevData.SqlDataHarmDTO> devHarmList = devDataList.get(i).getSqlDataHarm().stream().filter(x -> harmCode.equals(x.getDesc())).collect(Collectors.toList());
if (CollUtil.isEmpty(devHarmList)) {
return null;
}
if (CollUtil.isNotEmpty(devHarmList)) {
DevData.SqlDataHarmDTO devHarm = devHarmList.get(0);
if (ObjectUtil.isNotNull(fund1)) {
harmPut(TYPE_A, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getA()), harmonicFlag);
harmPut(TYPE_B, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getB()), harmonicFlag);
harmPut(TYPE_C, devMap, harmNum, devHarm, String.valueOf(fund1.getList().getC()), harmonicFlag);
} else {
harmPut(TYPE_A, devMap, harmNum, devHarm, "1.0", harmonicFlag);
harmPut(TYPE_B, devMap, harmNum, devHarm, "1.0", harmonicFlag);
harmPut(TYPE_C, devMap, harmNum, devHarm, "1.0", harmonicFlag);
}
}
}
resultMap.put(TYPE_A, devMap.get(TYPE_A));
resultMap.put(TYPE_B, devMap.get(TYPE_C));
resultMap.put(TYPE_C, devMap.get(TYPE_C));
return resultMap;
}
/**
* 处理非谐波类取值
@@ -1908,6 +2157,7 @@ public class DetectionServiceImpl {
List<Double> cStandardDev = new ArrayList<>();
List<Double> tDev = new ArrayList<>();
List<Double> tStandardDev = new ArrayList<>();
for (int i = 0; i < dev.size(); i++) {
List<DevData.SqlDataDTO> devSqlData = dev.get(i).getSqlData();
List<DevData.SqlDataDTO> standardDevSqlData = standardDev.get(i).getSqlData();
@@ -1952,66 +2202,66 @@ public class DetectionServiceImpl {
.map(x -> x.getT().doubleValue())
.collect(Collectors.toList()));
}
List<Integer> aIdxs = DetectionUtil.sort(aDev, false);
List<Integer> bIdxs = DetectionUtil.sort(bDev, false);
List<Integer> cIdxs = DetectionUtil.sort(cDev, false);
List<Integer> tIdxs = DetectionUtil.sort(tDev, false);
List<Integer> aIdxs = DetectionUtil.sort(aStandardDev, false);
List<Integer> bIdxs = DetectionUtil.sort(bStandardDev, false);
List<Integer> cIdxs = DetectionUtil.sort(cStandardDev, false);
List<Integer> tIdxs = DetectionUtil.sort(tStandardDev, false);
switch (dataRule) {
case SECTION_VALUE:
if (aDev.size() > 2) {
aDev.remove(aIdxs.get(0));
aDev.remove(aIdxs.get(aIdxs.size() - 1));
List<Double> newArray = DetectionUtil.getNewArray(aStandardDev, aIdxs.subList(1, aIdxs.size() - 1));
aStandardDev.clear();
aStandardDev.addAll(newArray);
if (aStandardDev.size() > 2) {
aStandardDev.remove(0);
aStandardDev.remove(aStandardDev.size() - 1);
List<Double> newArray = DetectionUtil.getNewArray(aDev, aIdxs.subList(1, aIdxs.size() - 1));
aDev.clear();
aDev.addAll(newArray);
}
if (bDev.size() > 2) {
bDev.remove(bIdxs.get(0));
bDev.remove(bIdxs.get(bIdxs.size() - 1));
List<Double> newArray = DetectionUtil.getNewArray(bStandardDev, bIdxs.subList(1, bIdxs.size() - 1));
bStandardDev.clear();
bStandardDev.addAll(newArray);
if (bStandardDev.size() > 2) {
bStandardDev.remove(0);
bStandardDev.remove(bStandardDev.size() - 1);
List<Double> newArray = DetectionUtil.getNewArray(bDev, bIdxs.subList(1, bIdxs.size() - 1));
bDev.clear();
bDev.addAll(newArray);
}
if (cDev.size() > 2) {
cDev.remove(cIdxs.get(0));
cDev.remove(cIdxs.get(cIdxs.size() - 1));
List<Double> newArray = DetectionUtil.getNewArray(cStandardDev, cIdxs.subList(1, cIdxs.size() - 1));
cStandardDev.clear();
cStandardDev.addAll(newArray);
if (cStandardDev.size() > 2) {
cStandardDev.remove(0);
cStandardDev.remove(cStandardDev.size() - 1);
List<Double> newArray = DetectionUtil.getNewArray(cDev, cIdxs.subList(1, cIdxs.size() - 1));
cDev.clear();
cDev.addAll(newArray);
}
if (tDev.size() > 2) {
tDev.remove(tIdxs.get(0));
tDev.remove(tIdxs.get(tIdxs.size() - 1));
List<Double> newArray = DetectionUtil.getNewArray(tStandardDev, tIdxs.subList(1, tIdxs.size() - 1));
tStandardDev.clear();
tStandardDev.addAll(newArray);
if (tStandardDev.size() > 2) {
tStandardDev.remove(0);
tStandardDev.remove(tStandardDev.size() - 1);
List<Double> newArray = DetectionUtil.getNewArray(tDev, tIdxs.subList(1, tIdxs.size() - 1));
tDev.clear();
tDev.addAll(newArray);
}
break;
case CP95_VALUE:
if (CollUtil.isNotEmpty(aDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(aDev);
aDev = Collections.singletonList(aDev.get(cp95Idx));
if (CollUtil.isNotEmpty(aStandardDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(aStandardDev);
aStandardDev = Collections.singletonList(aStandardDev.get(cp95Idx));
aDev = Collections.singletonList(aDev.get(aIdxs.get(cp95Idx)));
}
if (CollUtil.isNotEmpty(bDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(bDev);
bDev = Collections.singletonList(bDev.get(cp95Idx));
if (CollUtil.isNotEmpty(bStandardDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(bStandardDev);
bStandardDev = Collections.singletonList(bStandardDev.get(cp95Idx));
bDev = Collections.singletonList(bDev.get(bIdxs.get(cp95Idx)));
}
if (CollUtil.isNotEmpty(cDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(cDev);
cDev = Collections.singletonList(cDev.get(cp95Idx));
if (CollUtil.isNotEmpty(cStandardDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(cStandardDev);
cStandardDev = Collections.singletonList(cStandardDev.get(cp95Idx));
cDev = Collections.singletonList(cDev.get(cIdxs.get(cp95Idx)));
}
if (CollUtil.isNotEmpty(tDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(tDev);
tDev = Collections.singletonList(tDev.get(cp95Idx));
if (CollUtil.isNotEmpty(tStandardDev)) {
int cp95Idx = DetectionUtil.getCP95Idx(tStandardDev);
tStandardDev = Collections.singletonList(tStandardDev.get(cp95Idx));
tDev = Collections.singletonList(tDev.get(tIdxs.get(cp95Idx)));
}
break;
@@ -2153,18 +2403,18 @@ public class DetectionServiceImpl {
}
}
}
devMap.forEach((typeKey, typeValue) -> {
standardDevMap.forEach((typeKey, typeValue) -> {
typeValue.forEach((key, value) -> {
if (CollUtil.isNotEmpty(value)) {
List<Integer> idx = DetectionUtil.sort(value, false);
switch (dataRule) {
case SECTION_VALUE:
if (value.size() > 2) {
value.remove(idx.get(0));
value.remove(idx.get(idx.size() - 1));
List<Double> newArray = DetectionUtil.getNewArray(standardDevMap.get(typeKey).get(key), idx.subList(1, idx.size() - 1));
standardDevMap.get(typeKey).get(key).clear();
standardDevMap.get(typeKey).get(key).addAll(newArray);
value.remove(0);
value.remove(value.size() - 1);
List<Double> newArray = DetectionUtil.getNewArray(devMap.get(typeKey).get(key), idx.subList(1, idx.size() - 1));
devMap.get(typeKey).get(key).clear();
devMap.get(typeKey).get(key).addAll(newArray);
}
break;
case CP95_VALUE:
@@ -2173,18 +2423,18 @@ public class DetectionServiceImpl {
List<Double> newValue = Collections.singletonList(value.get(cp95Idx));
value.clear();
value.addAll(newValue);
Double standardCP95Data = standardDevMap.get(typeKey).get(key).get(cp95Idx);
standardDevMap.get(typeKey).get(key).clear();
standardDevMap.get(typeKey).get(key).add(standardCP95Data);
Double devCP95Data = devMap.get(typeKey).get(key).get(idx.get(cp95Idx));
devMap.get(typeKey).get(key).clear();
devMap.get(typeKey).get(key).add(devCP95Data);
}
break;
case AVG_VALUE:
List<Double> avgDoubles = DetectionUtil.getAvgDoubles(value);
value.clear();
value.addAll(avgDoubles);
List<Double> standardAvgData = DetectionUtil.getAvgDoubles(standardDevMap.get(typeKey).get(key));
standardDevMap.get(typeKey).get(key).clear();
standardDevMap.get(typeKey).get(key).addAll(standardAvgData);
List<Double> devAvgData = DetectionUtil.getAvgDoubles(devMap.get(typeKey).get(key));
devMap.get(typeKey).get(key).clear();
devMap.get(typeKey).get(key).addAll(devAvgData);
break;
}
}

View File

@@ -76,7 +76,7 @@ public class PreDetectionServiceImpl implements PreDetectionService {
private final IPqScriptCheckDataService iPqScriptCheckDataService;
private final SocketManager socketManager;
@Value("${log.homeDir}")
@Value("${report.reportDir}")
private String alignDataFilePath;
@@ -337,7 +337,7 @@ public class PreDetectionServiceImpl implements PreDetectionService {
@Override
public void exportAlignData() {
String fileName = "实时数据.xlsx";
String fileName = "对齐数据.xlsx";
HttpServletResponse response = HttpServletUtil.getResponse();
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

View File

@@ -10,6 +10,7 @@ import com.njcn.gather.device.pojo.vo.PreDetection;
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
import com.njcn.gather.plan.pojo.po.AdPlan;
import com.njcn.gather.plan.pojo.po.AdPlanTestConfig;
import com.njcn.gather.script.pojo.po.SourceIssue;
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
import java.util.ArrayList;
@@ -195,4 +196,16 @@ public class FormalTestManager {
public static boolean statisticsProtocol;
public static boolean voltageProtocol;
public static boolean unknownError;
/**
* 当前下发的脚本
*/
public static SourceIssue currentIssue;
/**
* 是否进行相序校验
*/
public static boolean isXu;
}

View File

@@ -336,7 +336,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
devLineTestResult.setDeviceName(dev.getDevName());
Integer[] resultFlags = dev.getMonitorList().stream()
.map(monitor -> ResultEnum.NETWORK_TIMEOUT)
.map(monitor -> ResultEnum.NETWORK_TIMEOUT.getValue())
.toArray(Integer[]::new);
devLineTestResult.setChnResult(resultFlags);

View File

@@ -169,4 +169,24 @@ public class PqDevController extends BaseController {
Map<String, List<String>> result = pqDevService.listSelectOptions(pattern);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPLOAD)
@PostMapping(value = "/ttt")
@ApiOperation("批量导入被检设备")
@ApiImplicitParams({
@ApiImplicitParam(name = "file", value = "被检设备数据文件", required = true),
@ApiImplicitParam(name = "patternId", value = "模式id", required = true)
})
public HttpResult ttt(@RequestParam("file") MultipartFile file, @RequestParam("patternId") String patternId, @RequestParam("planId") String planId, @RequestParam(value = "cover", defaultValue = "0") Integer cover, HttpServletResponse response) {
String methodDescribe = getMethodDescribe("ttt");
LogUtil.njcnDebug(log, "{},上传文件为:{}", methodDescribe, file.getOriginalFilename());
boolean fileType = FileUtil.judgeFileIsExcel(file.getOriginalFilename());
if (!fileType) {
throw new BusinessException(CommonResponseEnum.FILE_XLSX_ERROR);
}
if ("null".equals(planId)) {
planId = null;
}
return pqDevService.importDev(file, patternId, planId, response, cover);
}
}

View File

@@ -38,8 +38,8 @@ public class ContrastDevExcel implements Serializable {
@Pattern(regexp = PatternRegex.DEV_NAME_REGEX, message = DetectionValidMessage.NAME_FORMAT_ERROR)
private String name;
@Excel(name = "设备序列号*", width = 20, needMerge = true, orderNum = "5")
@NotBlank(message = DetectionValidMessage.FACTORYNO_NOT_BLANK)
@Excel(name = "设备序列号", width = 20, needMerge = true, orderNum = "5")
// @NotBlank(message = DetectionValidMessage.FACTORYNO_NOT_BLANK)
private String createId;
@Excel(name = "设备类型*", width = 20, needMerge = true, orderNum = "6")
@@ -91,8 +91,8 @@ public class ContrastDevExcel implements Serializable {
@NotNull(message = DetectionValidMessage.INSPECT_DATE_NOT_NULL)
private LocalDate inspectDate;
@Excel(name = "谐波系统设备id*", width = 30, needMerge = true, orderNum = "18")
@NotBlank(message = DetectionValidMessage.HARM_SYS_ID_NOT_BLANK)
@Excel(name = "谐波系统设备id", width = 30, needMerge = true, orderNum = "18")
// @NotBlank(message = DetectionValidMessage.HARM_SYS_ID_NOT_BLANK)
private String harmSysId;
@ExcelCollection(name = "监测点信息", orderNum = "19")

View File

@@ -68,6 +68,7 @@ import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author caozehui
@@ -1340,9 +1341,11 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
if (CollUtil.isNotEmpty(hasList)) {
importPqDev.setId(hasList.get(0).getId());
for (PqMonitorExcel pqMonitorExcel : pqMonitorExcelList) {
PqMonitor pqMonitor = BeanUtil.copyProperties(pqMonitorExcel, PqMonitor.class);
pqMonitor.setDevId(importPqDev.getId());
monitorList.add(pqMonitor);
PqMonitor monitor = BeanUtil.copyProperties(pqMonitorExcel, PqMonitor.class);
monitor.setDevId(importPqDev.getId());
monitor.setPt(pqMonitorExcel.getPt1() + StrUtil.C_COLON + pqMonitorExcel.getPt2());
monitor.setCt(pqMonitorExcel.getCt1() + StrUtil.C_COLON + pqMonitorExcel.getCt2());
monitorList.add(monitor);
}
importPqDev.setMonitorList(monitorList);
finalUpdateDevList.add(importPqDev);
@@ -1366,6 +1369,8 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
for (PqMonitorExcel pqMonitorExcel : pqMonitorExcelList) {
PqMonitor monitor = BeanUtil.copyProperties(pqMonitorExcel, PqMonitor.class);
monitor.setDevId(importPqDev.getId());
monitor.setPt(pqMonitorExcel.getPt1() + StrUtil.C_COLON + pqMonitorExcel.getPt2());
monitor.setCt(pqMonitorExcel.getCt1() + StrUtil.C_COLON + pqMonitorExcel.getCt2());
monitorList.add(monitor);
}
importPqDev.setMonitorList(monitorList);
@@ -1375,6 +1380,8 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
for (PqMonitorExcel pqMonitorExcel : pqMonitorExcelList) {
PqMonitor monitor = BeanUtil.copyProperties(pqMonitorExcel, PqMonitor.class);
monitor.setDevId(importPqDev.getId());
monitor.setPt(pqMonitorExcel.getPt1() + StrUtil.C_COLON + pqMonitorExcel.getPt2());
monitor.setCt(pqMonitorExcel.getCt1() + StrUtil.C_COLON + pqMonitorExcel.getCt2());
monitorList.add(monitor);
}
importPqDev.setMonitorList(monitorList);
@@ -1496,13 +1503,19 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
if (ObjectUtil.isNotNull(dictType)) {
dictDataList = dictDataService.getDictDataByTypeId(dictType.getId());
pullDown = new PullDown();
pullDown.setFirstCol(startCol + 24);
pullDown.setLastCol(startCol + 24);
pullDown.setFirstCol(startCol + 26);
pullDown.setLastCol(startCol + 26);
pullDown.setStrings(dictDataList.stream().map(DictData::getName).collect(Collectors.toList()));
pullDowns.add(pullDown);
}
pullDown = new PullDown();
pullDown.setFirstCol(startCol + 27);
pullDown.setLastCol(startCol + 27);
pullDown.setStrings(Stream.iterate(1, x -> x + 1).limit(10).map(String::valueOf).collect(Collectors.toList()));
pullDowns.add(pullDown);
return pullDowns;
}
@@ -1564,7 +1577,22 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
contrastDevExcels.forEach(contrastDevExcel -> {
List<PqMonitor> monitorList = pqMonitorService.listPqMonitorByDevIds(Collections.singletonList(contrastDevExcel.getId()));
pqMonitorService.visualizeMonitor(monitorList);
List<PqMonitorExcel> pqMonitorExcelList = BeanUtil.copyToList(monitorList, PqMonitorExcel.class);
List<PqMonitorExcel> pqMonitorExcelList = new ArrayList<>();
for (int i = 0; i < monitorList.size(); i++) {
PqMonitor pqMonitor = monitorList.get(i);
PqMonitorExcel pqMonitorExcel = BeanUtil.copyProperties(pqMonitor, PqMonitorExcel.class);
String pt = pqMonitor.getPt();
String[] split1 = pt.split(String.valueOf(StrUtil.C_COLON));
pqMonitorExcel.setPt1(split1[0]);
pqMonitorExcel.setPt2(split1[1]);
String ct = pqMonitor.getCt();
String[] split2 = ct.split(String.valueOf(StrUtil.C_COLON));
pqMonitorExcel.setCt1(split2[0]);
pqMonitorExcel.setCt2(split2[1]);
pqMonitorExcelList.add(pqMonitorExcel);
}
contrastDevExcel.setPqMonitorExcelList(pqMonitorExcelList);
});
}

View File

@@ -60,7 +60,7 @@ public class PqIcdPathController extends BaseController {
@PostMapping("/add")
@ApiOperation("新增icd")
@ApiImplicitParam(name = "param", value = "icd新增参数", required = true)
public HttpResult<Boolean> add(@RequestBody @Validated PqIcdPathParam param) {
public HttpResult<Boolean> add(PqIcdPathParam param) {
String methodDescribe = getMethodDescribe("add");
LogUtil.njcnDebug(log, "{},新增数据为:{}", methodDescribe, param);
@@ -76,7 +76,7 @@ public class PqIcdPathController extends BaseController {
@PostMapping("/update")
@ApiOperation("修改icd")
@ApiImplicitParam(name = "param", value = "icd修改参数", required = true)
public HttpResult<Boolean> update(@RequestBody @Validated PqIcdPathParam.UpdateParam param) {
public HttpResult<Boolean> update(PqIcdPathParam.UpdateParam param) {
String methodDescribe = getMethodDescribe("update");
LogUtil.njcnDebug(log, "{},修改数据为:{}", methodDescribe, param);

View File

@@ -0,0 +1,19 @@
package com.njcn.gather.icd.pojo.enums;
/**
* @author caozehui
* @data 2025-11-11
*/
public enum IcdResponseEnum {
FILE_NOT_NULL("A018001", "映射文件不能为空"),
FILE_TYPE_ERROR("A018002", "映射文件类型错误"),
FILE_SIZE_ERROR("A018003", "映射文件大小超出限制");
private String code;
private String message;
IcdResponseEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@@ -6,6 +6,7 @@ import com.njcn.web.pojo.param.BaseParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@@ -32,6 +33,9 @@ public class PqIcdPathParam {
@ApiModelProperty(value = "角型接线时是否使用相别的指标来进行检测0表示否1表示是", required = true)
private Integer usePhaseIndex;
@ApiModelProperty(value = "映射文件", required = true)
private MultipartFile mappingFile;
/**
* 分页查询实体
*/

View File

@@ -1,5 +1,6 @@
package com.njcn.gather.icd.pojo.po;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njcn.db.mybatisplus.bo.BaseEntity;
import lombok.Data;
@@ -46,5 +47,18 @@ public class PqIcdPath extends BaseEntity implements Serializable {
* 角型接线时是否使用相别的指标来进行检测0表示否1表示是
*/
private Integer usePhaseIndex;
/**
* 映射文件路径
*/
@TableField(exist = false)
private FileVO mappingFile;
@Data
public static class FileVO{
private String name;
private String url;
}
}

View File

@@ -1,5 +1,6 @@
package com.njcn.gather.icd.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -7,17 +8,26 @@ 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.gather.icd.mapper.PqIcdPathMapper;
import com.njcn.gather.icd.pojo.enums.IcdResponseEnum;
import com.njcn.gather.icd.pojo.param.PqIcdPathParam;
import com.njcn.gather.icd.pojo.po.PqIcdPath;
import com.njcn.gather.icd.service.IPqIcdPathService;
import com.njcn.gather.pojo.enums.DetectionResponseEnum;
import com.njcn.gather.report.pojo.enums.ReportResponseEnum;
import com.njcn.web.factory.PageFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
/**
@@ -41,6 +51,13 @@ public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath
.like(StrUtil.isNotBlank(param.getName()), PqIcdPath::getName, param.getName())
.orderByDesc(PqIcdPath::getCreateTime);
Page<PqIcdPath> page = this.page(new Page<>(PageFactory.getPageNum(param), PageFactory.getPageSize(param)), wrapper);
String commInstallPath = this.getCommInstallPath();
page.getRecords().forEach(pqIcdPath -> {
PqIcdPath.FileVO fileVO = new PqIcdPath.FileVO();
fileVO.setUrl(commInstallPath + "\\DeviceControl\\Config\\" + pqIcdPath.getName() + ".txt");
fileVO.setName(pqIcdPath.getName() + ".txt");
pqIcdPath.setMappingFile(fileVO);
});
return page;
}
@@ -52,9 +69,81 @@ public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath
PqIcdPath pqIcdPath = new PqIcdPath();
BeanUtils.copyProperties(param, pqIcdPath);
pqIcdPath.setState(DataStateEnum.ENABLE.getCode());
String commInstallPath = this.getCommInstallPath();
System.out.println("commInstallPath = " + commInstallPath);
long FILE_SIZE_LIMIT = 1 * 1024 * 1024;
MultipartFile mappingFile = param.getMappingFile();
System.out.println("mappingFile = " + ObjectUtil.isNotNull(mappingFile) + " " + !mappingFile.isEmpty());
if (ObjectUtil.isNotNull(mappingFile) && !mappingFile.isEmpty()) {
String mappingFilename = mappingFile.getOriginalFilename();
if (!mappingFilename.endsWith(".txt")) {
throw new BusinessException(IcdResponseEnum.FILE_TYPE_ERROR);
}
if (mappingFile.getSize() > FILE_SIZE_LIMIT) {
throw new BusinessException(IcdResponseEnum.FILE_SIZE_ERROR);
}
try {
// 如果文件存在,则先删除
String mappingFilePath = commInstallPath + "\\DeviceControl\\Config\\" + mappingFilename;
System.out.println("mappingFilePath = " + mappingFilePath);
Path path = Paths.get(mappingFilePath);
File file = path.toFile();
if (file.exists()) {
file.delete();
}
// 保存文件
byte[] bytes = mappingFile.getBytes();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(mappingFilePath));
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();
bufferedOutputStream.close();
System.out.println("File saved successfully");
} catch (IOException e) {
throw new BusinessException(ReportResponseEnum.FILE_UPLOAD_FAILED);
}
} else {
System.out.println("mappingFile is null or empty");
throw new BusinessException(IcdResponseEnum.FILE_NOT_NULL);
}
this.executeRestartCmd(commInstallPath);
return this.save(pqIcdPath);
}
/**
* 执行重启通讯服务脚本
*
* @param commInstallPath
*/
private void executeRestartCmd(String commInstallPath) {
// 以管理员身份运行bat脚本
String batFilePath = commInstallPath + "\\重启所有服务.bat";
try {
Runtime.getRuntime().exec(batFilePath);
} catch (IOException e) {
log.error("重启通讯服务失败", e);
}
}
private String getCommInstallPath() {
String workDir = System.getProperty("user.dir");
// String workDir = "D:\\program\\CN_Gather";
// 获取映射文件存放文件夹
String dirPath = workDir + "\\9100";
int index = workDir.indexOf("\\resources\\extraResources\\java");
if (index != -1) {
dirPath = workDir.substring(0, workDir.indexOf("\\resources\\extraResources\\java")) + "\\9100";
}
return dirPath;
}
@Override
@Transactional
public boolean updateIcd(PqIcdPathParam.UpdateParam param) {
@@ -62,12 +151,60 @@ public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath
this.checkRepeat(param, true);
PqIcdPath pqIcdPath = new PqIcdPath();
BeanUtils.copyProperties(param, pqIcdPath);
String commInstallPath = this.getCommInstallPath();
long FILE_SIZE_LIMIT = 1 * 1024 * 1024;
MultipartFile mappingFile = param.getMappingFile();
if (ObjectUtil.isNotNull(mappingFile) && !mappingFile.isEmpty()) {
String mappingFilename = mappingFile.getOriginalFilename();
if (!mappingFilename.endsWith(".txt")) {
throw new BusinessException(IcdResponseEnum.FILE_TYPE_ERROR);
}
if (mappingFile.getSize() > FILE_SIZE_LIMIT) {
throw new BusinessException(IcdResponseEnum.FILE_SIZE_ERROR);
}
try {
// 如果文件存在,则先删除
String mappingFilePath = commInstallPath + "\\DeviceControl\\Config\\" + mappingFilename;
Path path = Paths.get(mappingFilePath);
File file = path.toFile();
if (file.exists()) {
file.delete();
}
// 保存文件
byte[] bytes = mappingFile.getBytes();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(mappingFilePath));
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();
bufferedOutputStream.close();
} catch (IOException e) {
throw new BusinessException(ReportResponseEnum.FILE_UPLOAD_FAILED);
}
}
this.executeRestartCmd(commInstallPath);
return this.updateById(pqIcdPath);
}
@Override
@Transactional
public boolean deleteIcd(List<String> ids) {
List<PqIcdPath> pqIcdPaths = this.listByIds(ids);
String commInstallPath = this.getCommInstallPath();
pqIcdPaths.forEach(pqIcdPath -> {
String mappingFilePath = commInstallPath + "\\DeviceControl\\Config\\" + pqIcdPath.getName() + ".txt";
Path path = Paths.get(mappingFilePath);
File file = path.toFile();
if (file.exists()) {
file.delete();
}
});
return this.lambdaUpdate().in(PqIcdPath::getId, ids).set(PqIcdPath::getState, DataStateEnum.DELETED.getCode()).update();
}

View File

@@ -14,11 +14,11 @@ import javax.validation.constraints.NotNull;
@Data
public class PqMonitorExcel {
@Excel(name = "谐波系统监测点ID*", width = 20, orderNum = "1")
@NotBlank(message = DetectionValidMessage.MONITOR_ID_NOT_BLANK)
@Excel(name = "谐波系统监测点ID", width = 20, orderNum = "1")
// @NotBlank(message = DetectionValidMessage.MONITOR_ID_NOT_BLANK)
private String harmSysId;
@Excel(name = "所属母线*", width = 20, orderNum = "2")
@Excel(name = "母线名称*", width = 20, orderNum = "2")
@NotBlank(message = DetectionValidMessage.BELONG_LINE_NOT_BLANK)
private String busbar;
@@ -30,19 +30,27 @@ public class PqMonitorExcel {
@NotNull(message = DetectionValidMessage.MONITOR_NUM_NOT_NULL)
private Integer num;
@Excel(name = "PT变比(pt1:pt2)*", width = 20, orderNum = "5")
@Excel(name = "PT一次变比*", width = 20, orderNum = "5")
@NotBlank(message = DetectionValidMessage.PT_NOT_BLANK)
private String pt;
private String pt1;
@Excel(name = "CT变比(ct1:ct2)*", width = 20, orderNum = "6")
@Excel(name = "PT二次变比*", width = 20, orderNum = "6")
@NotBlank(message = DetectionValidMessage.PT_NOT_BLANK)
private String pt2;
@Excel(name = "CT一次变比*", width = 20, orderNum = "7")
@NotBlank(message = DetectionValidMessage.CT_NOT_BLANK)
private String ct;
private String ct1;
@Excel(name = "接线方式*", width = 20, orderNum = "7")
@Excel(name = "CT二次变比*", width = 20, orderNum = "8")
@NotBlank(message = DetectionValidMessage.CT_NOT_BLANK)
private String ct2;
@Excel(name = "接线方式*", width = 20, orderNum = "9")
@NotBlank(message = DetectionValidMessage.CONNECTION_NOT_BLANK)
private String connection;
@Excel(name = "统计间隔*", width = 10, orderNum = "8")
@Excel(name = "统计间隔*", width = 20, orderNum = "10")
@NotNull(message = DetectionValidMessage.STAT_INTERVAL_NOT_NULL)
private Integer statInterval;
}

View File

@@ -118,4 +118,11 @@ public interface IPqMonitorService extends IService<PqMonitor> {
* @return
*/
boolean removeByDevId(String devId);
/**
* 根据被检设备id和监测点编号获取监测点信息
* @param id 被检设备id
* @param monitorNum 监测点编号
*/
PqMonitor getByDevAndNum(String id, int monitorNum);
}

View File

@@ -135,34 +135,38 @@ public class PqMonitorServiceImpl extends ServiceImpl<PqMonitorMapper, PqMonitor
// 同步更新计划的状态
AdPlan plan = this.baseMapper.getPlanByDevId(devId);
List<PqDevSub> devSubList = this.baseMapper.listDevSubByPlanId(plan.getId());
if (ObjectUtil.isNotNull(plan)) {
List<PqDevSub> checkedDevSubList = devSubList.stream().filter(pqDevSub -> pqDevSub.getCheckState() == CheckStateEnum.CHECKED.getValue()).collect(Collectors.toList());
List<PqDevSub> checkingDevSubList = devSubList.stream().filter(pqDevSub -> pqDevSub.getCheckState() == CheckStateEnum.CHECKING.getValue()).collect(Collectors.toList());
if (checkedDevSubList.size() == devSubList.size() && devSubList.size() > 0) {
this.baseMapper.updatePlanCheckState(plan.getId(), CheckStateEnum.CHECKED.getValue());
} else if (checkedDevSubList.size() > 0 || checkingDevSubList.size() > 0) {
this.baseMapper.updatePlanCheckState(plan.getId(), CheckStateEnum.CHECKING.getValue());
} else {
this.baseMapper.updatePlanCheckState(plan.getId(), CheckStateEnum.UNCHECKED.getValue());
}
List<PqDevSub> accordDevSubList = checkedDevSubList.stream().filter(pqDevSub -> pqDevSub.getCheckResult() == CheckResultEnum.ACCORD.getValue()).collect(Collectors.toList());
if (accordDevSubList.size() == checkedDevSubList.size() && checkedDevSubList.size() > 0) {
this.baseMapper.updatePlanCheckResult(plan.getId(), CheckResultEnum.ACCORD.getValue());
} else if (accordDevSubList.size() > 0) {
this.baseMapper.updatePlanCheckResult(plan.getId(), CheckResultEnum.NOT_ACCORD.getValue());
} else {
this.baseMapper.updatePlanCheckResult(plan.getId(), CheckResultEnum.UNCHECKED.getValue());
}
List<PqDevSub> devSubList = this.baseMapper.listDevSubByPlanId(plan.getId());
List<PqDevSub> generatedDevSubList = checkedDevSubList.stream().filter(pqDevSub -> pqDevSub.getReportState() == DevReportStateEnum.GENERATED.getValue()).collect(Collectors.toList());
if (generatedDevSubList.size() == checkedDevSubList.size() && checkedDevSubList.size() > 0) {
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_ALL_GENERATED.getValue());
} else if (generatedDevSubList.size() > 0) {
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_PARTIALLY_GENERATED.getValue());
} else {
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_NOT_GENERATED.getValue());
List<PqDevSub> checkedDevSubList = devSubList.stream().filter(pqDevSub -> pqDevSub.getCheckState() == CheckStateEnum.CHECKED.getValue()).collect(Collectors.toList());
List<PqDevSub> checkingDevSubList = devSubList.stream().filter(pqDevSub -> pqDevSub.getCheckState() == CheckStateEnum.CHECKING.getValue()).collect(Collectors.toList());
if (checkedDevSubList.size() == devSubList.size() && devSubList.size() > 0) {
this.baseMapper.updatePlanCheckState(plan.getId(), CheckStateEnum.CHECKED.getValue());
} else if (checkedDevSubList.size() > 0 || checkingDevSubList.size() > 0) {
this.baseMapper.updatePlanCheckState(plan.getId(), CheckStateEnum.CHECKING.getValue());
} else {
this.baseMapper.updatePlanCheckState(plan.getId(), CheckStateEnum.UNCHECKED.getValue());
}
List<PqDevSub> accordDevSubList = checkedDevSubList.stream().filter(pqDevSub -> pqDevSub.getCheckResult() == CheckResultEnum.ACCORD.getValue()).collect(Collectors.toList());
if (accordDevSubList.size() == checkedDevSubList.size() && checkedDevSubList.size() > 0) {
this.baseMapper.updatePlanCheckResult(plan.getId(), CheckResultEnum.ACCORD.getValue());
} else if (accordDevSubList.size() > 0) {
this.baseMapper.updatePlanCheckResult(plan.getId(), CheckResultEnum.NOT_ACCORD.getValue());
} else {
this.baseMapper.updatePlanCheckResult(plan.getId(), CheckResultEnum.UNCHECKED.getValue());
}
List<PqDevSub> generatedDevSubList = checkedDevSubList.stream().filter(pqDevSub -> pqDevSub.getReportState() == DevReportStateEnum.GENERATED.getValue()).collect(Collectors.toList());
if (generatedDevSubList.size() == checkedDevSubList.size() && checkedDevSubList.size() > 0) {
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_ALL_GENERATED.getValue());
} else if (generatedDevSubList.size() > 0) {
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_PARTIALLY_GENERATED.getValue());
} else {
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_NOT_GENERATED.getValue());
}
}
return this.saveOrUpdateBatch(newMonitorList);
}
@@ -432,4 +436,16 @@ public class PqMonitorServiceImpl extends ServiceImpl<PqMonitorMapper, PqMonitor
wrapper.eq("pq_monitor.Dev_Id", devId);
return this.remove(wrapper);
}
@Override
public PqMonitor getByDevAndNum(String devId, int monitorNum) {
QueryWrapper<PqMonitor> wrapper = new QueryWrapper<>();
wrapper.eq("pq_monitor.Dev_Id", devId)
.eq("pq_monitor.Num", monitorNum);
List<PqMonitor> pqMonitors = this.list(wrapper);
if (CollUtil.isNotEmpty(pqMonitors)) {
return pqMonitors.get(0);
}
return null;
}
}

View File

@@ -554,6 +554,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
child.put("pid", adPlan.getFatherPlanId());
child.put("name", adPlan.getName());
child.put("timeCheck", adPlan.getTimeCheck());
child.put("dataRule", adPlan.getDataRule());
List<PqStandardDev> pqStandardDevs = adPlanStandardDevMapper.listByPlanId(Collections.singletonList(adPlan.getId()));
List<String> devTypeIdList = pqStandardDevs.stream().map(PqStandardDev::getDevType).collect(Collectors.toList());
@@ -1554,8 +1555,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
// 检测脚本
List<Map<String, Object>> maps1 = pqScriptService.listAllPqScript(null);
List<String> scriptNameList = maps1.stream().map(m -> (String) m.get("name")).collect(Collectors.toList());
List<PqScript> pqScriptList = pqScriptService.listAllPqScript(null);
List<String> scriptNameList = pqScriptList.stream().map(m -> m.getName()).collect(Collectors.toList());
pullDown = new PullDown();
pullDown.setFirstCol(3);
pullDown.setLastCol(3);
@@ -1721,8 +1722,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
String zipFileName = URLEncoder.encode(subPlan.getName() + ".zip", "UTF-8");
File zipFile = FileUtil.file(tempDir, zipFileName);
// 先将json文件添加到zip中
ZipUtil.zip(jsonFile.getAbsolutePath(), zipFile.getAbsolutePath());
// 先将json文件添加到zip中使用UTF-8编码
ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, jsonFile);
// 创建一个临时目录存放两个文件
@@ -1744,8 +1745,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
// 重新创建zip文件包含所有文件
ZipUtil.zip(tempZipDir.getAbsolutePath(), zipFile.getAbsolutePath());
// 重新创建zip文件包含所有文件使用UTF-8编码
ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, FileUtil.file(tempZipDir));
// 删除临时目录
FileUtil.del(tempZipDir);
@@ -1779,9 +1780,9 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
File zipFile = FileUtil.file(tempDir, file.getOriginalFilename());
file.transferTo(zipFile);
// 解压zip文件
// 解压zip文件使用UTF-8编码
File unzipDir = FileUtil.mkdir(FileUtil.file(tempDir, "unzip"));
ZipUtil.unzip(zipFile.getAbsolutePath(), unzipDir.getAbsolutePath());
ZipUtil.unzip(zipFile, unzipDir, CharsetUtil.CHARSET_UTF_8);
// 查找解压目录中的json文件
File[] files = unzipDir.listFiles();
@@ -2099,8 +2100,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
}
// 重新创建zip文件包含所有文件
ZipUtil.zip(tempZipDir.getAbsolutePath(), zipFile.getAbsolutePath());
// 重新创建zip文件包含所有文件使用UTF-8编码
ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, FileUtil.file(tempZipDir));
// 删除临时目录
FileUtil.del(tempZipDir);

View File

@@ -39,7 +39,10 @@ public enum BaseReportKeyEnum {
CREATE_DATE("createDate","生产日期"),
TEMPERATURE("temp","温度"),
HUMIDITY("hum","相对湿度"),
DELEGATE("delegate","委托方");
DELEGATE("delegate","委托方"),
CREATEDATE("createDate","出厂日期"),
HW_VERSION("hardwareVersion","硬件版本"),
SW_VERSION("softwareVersion","软件版本");
private String key;

View File

@@ -39,6 +39,8 @@ import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.device.service.IPqDevSubService;
import com.njcn.gather.err.pojo.po.PqErrSys;
import com.njcn.gather.err.service.IPqErrSysService;
import com.njcn.gather.monitor.pojo.po.PqMonitor;
import com.njcn.gather.monitor.service.IPqMonitorService;
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
import com.njcn.gather.plan.pojo.enums.PlanReportStateEnum;
import com.njcn.gather.plan.pojo.po.AdPlan;
@@ -59,6 +61,7 @@ import com.njcn.gather.report.service.IPqReportService;
import com.njcn.gather.result.service.IResultService;
import com.njcn.gather.script.pojo.vo.PqScriptDtlDataVO;
import com.njcn.gather.script.service.IPqScriptDtlsService;
import com.njcn.gather.storage.pojo.param.SingleNonHarmParam;
import com.njcn.gather.storage.pojo.po.SimAndDigHarmonicResult;
import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult;
import com.njcn.gather.storage.service.SimAndDigHarmonicService;
@@ -86,6 +89,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
@@ -113,6 +117,7 @@ import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -162,6 +167,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
@Value("${qr.gcDev.path}")
private String gcDevPath;
@Value("${report.dateFormat}")
private String dateFormat;
private final IPqDevService iPqDevService;
private final PqDevMapper pqDevMapper;
@@ -179,6 +186,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
private final ISysUserService sysUserService;
private final IPqErrSysService pqErrSysService;
private final IAdPlanTestConfigService adPlanTestConfigService;
private final IPqMonitorService pqMonitorService;
@Resource
private RestTemplateUtil restTemplateUtil;
@@ -307,7 +315,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
private void uploadFile(ReportParam reportParam, PqReport pqReport, boolean isAdd) {
MultipartFile baseFile = reportParam.getBaseFile();
MultipartFile detailFile = reportParam.getDetailFile();
String newDir = templatePath + File.separator + reportParam.getName() + File.separator + reportParam.getVersion() + File.separator;
String relativePath = reportParam.getName() + File.separator + reportParam.getVersion() + File.separator;
String newDir = templatePath + File.separator + relativePath;
long FILE_SIZE_LIMIT = 5 * 1024 * 1024;
if (isAdd) {
@@ -326,13 +335,13 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
throw new BusinessException(ReportResponseEnum.FILE_SIZE_ERROR);
}
pqReport.setBasePath(newDir + baseOriginalFilename);
pqReport.setDetailPath(newDir + detailOriginalFilename);
pqReport.setBasePath(relativePath + baseOriginalFilename);
pqReport.setDetailPath(relativePath + detailOriginalFilename);
this.createDirectory(newDir);
this.clearDirectory(newDir);
this.uploadFile(baseFile, pqReport.getBasePath());
this.uploadFile(detailFile, pqReport.getDetailPath());
this.uploadFile(baseFile, newDir + baseOriginalFilename);
this.uploadFile(detailFile, newDir + detailOriginalFilename);
} else {
throw new BusinessException(ReportResponseEnum.FILE_NOT_NULL);
}
@@ -380,34 +389,34 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
//若修改了文件名称、版本号,则需要重命名文件
this.createDirectory(newDir);
if (!oldDir.equals(newDir)) {
if (!oldDir.equals(relativePath)) {
// 文件夹重命名
String oldBasePathStr = oldPqReport.getBasePath();
String baseName = oldBasePathStr.substring(oldBasePathStr.lastIndexOf(File.separator) + 1);
Path oldBasePath = Paths.get(oldBasePathStr);
Path oldBasePath = Paths.get(templatePath + File.separator + oldBasePathStr);
Path newBasePath = Paths.get(newDir + baseName);
pqReport.setBasePath(newDir + baseName);
pqReport.setBasePath(relativePath + baseName);
String oldDetailPathStr = oldPqReport.getDetailPath();
String detailName = oldDetailPathStr.substring(oldDetailPathStr.lastIndexOf(File.separator) + 1);
Path oldDetailPath = Paths.get(oldDetailPathStr);
Path oldDetailPath = Paths.get(templatePath + File.separator + oldDetailPathStr);
Path newDetailPath = Paths.get(newDir + detailName);
pqReport.setDetailPath(newDir + detailName);
pqReport.setDetailPath(relativePath + detailName);
try {
// windows下文件夹名称不区分大小写
if (!oldDir.equalsIgnoreCase(newDir)) {
if (!oldDir.equalsIgnoreCase(relativePath)) {
this.clearDirectory(newDir);
Files.move(oldBasePath, newBasePath);
Files.move(oldDetailPath, newDetailPath);
if (!oldPqReport.getName().equals(reportParam.getName()) && !this.existSameName(pqReport.getId(), oldPqReport.getName())) {
this.recursionDeleteDirectory(templatePath + File.separator + oldPqReport.getName());
} else {
Paths.get(oldDir).toFile().delete();
Paths.get(templatePath + oldDir).toFile().delete();
}
} else {
// 文件夹重命名
Paths.get(oldDir).toFile().renameTo(Paths.get(newDir).toFile());
Paths.get(templatePath + oldDir).toFile().renameTo(Paths.get(newDir).toFile());
}
} catch (IOException e) {
throw new BusinessException(ReportResponseEnum.FILE_RENAME_FAILED);
@@ -415,16 +424,16 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
}
if (!baseFileOriginalFilename.isEmpty()) {
pqReport.setBasePath(newDir + baseFileOriginalFilename);
Paths.get(oldPqReport.getBasePath()).toFile().delete();
pqReport.setBasePath(relativePath + baseFileOriginalFilename);
Paths.get(templatePath + File.separator + oldPqReport.getBasePath()).toFile().delete();
Paths.get(newDir + oldPqReport.getBasePath().substring(oldPqReport.getBasePath().lastIndexOf(File.separator) + 1)).toFile().delete();
this.uploadFile(baseFile, pqReport.getBasePath());
this.uploadFile(baseFile, newDir + baseFileOriginalFilename);
}
if (!detailFileOriginalFilename.isEmpty()) {
pqReport.setDetailPath(newDir + detailFileOriginalFilename);
Paths.get(oldPqReport.getDetailPath()).toFile().delete();
pqReport.setDetailPath(relativePath + detailFileOriginalFilename);
Paths.get(templatePath + File.separator + oldPqReport.getDetailPath()).toFile().delete();
Paths.get(newDir + oldPqReport.getDetailPath().substring(oldPqReport.getDetailPath().lastIndexOf(File.separator) + 1)).toFile().delete();
this.uploadFile(detailFile, pqReport.getDetailPath());
this.uploadFile(detailFile, newDir + detailFileOriginalFilename);
}
}
}
@@ -786,53 +795,63 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
if (Objects.isNull(pqDevVO)) {
throw new BusinessException(ReportResponseEnum.DEVICE_NOT_EXIST);
}
devReportParam.setDevId(devId);
// 获取设备型号
DevType devType = devTypeService.getById(pqDevVO.getDevType());
if (Objects.isNull(devType)) {
throw new BusinessException(ReportResponseEnum.DEVICE_TYPE_NOT_EXIST);
}
PqReport report = this.lambdaQuery().eq(PqReport::getId, plan.getReportTemplateId()).eq(PqReport::getState, DataStateEnum.ENABLE.getCode()).one();
if (Objects.isNull(report)) {
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
}
Path basePath = Paths.get(report.getBasePath());
Path detailPath = Paths.get(report.getDetailPath());
try (InputStream baseInputStream = Files.newInputStream(basePath);
InputStream detailInputStream = Files.newInputStream(detailPath)) {
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
// 获取文档基础部分,并替换占位符
Map<String, String> baseModelDataMap = dealBaseModelContrastData(plan, pqDevVO, devType);
InputStream wordFinishInputStream = wordReportService.replacePlaceholders(baseInputStream, baseModelDataMap);
WordprocessingMLPackage baseModelDocument = WordprocessingMLPackage.load(wordFinishInputStream);
MainDocumentPart baseDocumentPart = baseModelDocument.getMainDocumentPart();
if (CheckStateEnum.CHECKED.getValue().compareTo(pqDevVO.getCheckState()) <= 0) {
devReportParam.setDevId(devId);
// 获取设备型号
DevType devType = devTypeService.getById(pqDevVO.getDevType());
if (Objects.isNull(devType)) {
throw new BusinessException(ReportResponseEnum.DEVICE_TYPE_NOT_EXIST);
}
PqReport report = this.lambdaQuery().eq(PqReport::getId, plan.getReportTemplateId()).eq(PqReport::getState, DataStateEnum.ENABLE.getCode()).one();
if (Objects.isNull(report)) {
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
}
Path basePath = Paths.get(templatePath + File.separator + report.getBasePath());
Path detailPath = Paths.get(templatePath + File.separator + report.getDetailPath());
try (InputStream baseInputStream = Files.newInputStream(basePath);
InputStream detailInputStream = Files.newInputStream(detailPath)) {
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
// 获取文档基础部分,并替换占位符
Map<String, String> baseModelDataMap = dealBaseModelContrastData(plan, pqDevVO, devType);
InputStream wordFinishInputStream = wordReportService.replacePlaceholders(baseInputStream, baseModelDataMap);
WordprocessingMLPackage baseModelDocument = WordprocessingMLPackage.load(wordFinishInputStream);
MainDocumentPart baseDocumentPart = baseModelDocument.getMainDocumentPart();
// 获取数据模版页内容,根据脚本动态组装数据页内容
MainDocumentPart detailDocumentPart = detailModelDocument.getMainDocumentPart();
dealDataModelScatteredByBookmarkByPlanContrast(baseDocumentPart, detailDocumentPart, devReportParam, pqDevVO);
// 保存新的文档
String dirPath = reportPath.concat(File.separator).concat(plan.getName());
// 确保目录存在
ensureDirectoryExists(dirPath);
// 构建文件名cityName_gdName_subName_name.docx
String fileName = String.format("%s_%s_%s_%s.docx",
pqDevVO.getCityName() != null ? pqDevVO.getCityName() : "未知地市",
pqDevVO.getGdName() != null ? pqDevVO.getGdName() : "未知供电公司",
pqDevVO.getSubName() != null ? pqDevVO.getSubName() : "未知电站",
pqDevVO.getName() != null ? pqDevVO.getName() : "未知设备");
Docx4jUtil.cleanBlankPagesAndRedundantPageBreaks(baseModelDocument);
baseModelDocument.save(new File(dirPath.concat(File.separator).concat(fileName)));
this.updateDevAndPlanState(devId, devReportParam.getPlanId());
} catch (NoSuchFileException e) {
String filePath = e.getFile() != null ? e.getFile().replaceAll("\\\\", "/") : "未知文件";
log.error("报告模板文件不存在 - 文件路径: {}", filePath, e);
throw new BusinessException(SystemResponseEnum.FILE_NOT_FOUND);
} catch (IOException e) {
log.error("报告文件读写异常", e);
throw new BusinessException(SystemResponseEnum.FILE_IO_ERROR);
} catch (Exception e) {
log.error(ReportResponseEnum.GENERATE_REPORT_ERROR.getMessage(), e);
throw new BusinessException(ReportResponseEnum.GENERATE_REPORT_ERROR);
// 获取数据模版页内容,根据脚本动态组装数据页内容
MainDocumentPart detailDocumentPart = detailModelDocument.getMainDocumentPart();
dealDataModelScatteredByBookmarkByPlanContrast(baseDocumentPart, detailDocumentPart, devReportParam, pqDevVO);
// 保存新的文档
String dirPath = reportPath.concat(File.separator).concat(plan.getName());
// 确保目录存在
ensureDirectoryExists(dirPath);
// 构建文件名cityName_gdName_subName_name.docx
String fileName = String.format("%s_%s_%s_%s.docx",
pqDevVO.getCityName() != null ? pqDevVO.getCityName() : "未知地市",
pqDevVO.getGdName() != null ? pqDevVO.getGdName() : "未知供电公司",
pqDevVO.getSubName() != null ? pqDevVO.getSubName() : "未知电站",
pqDevVO.getName() != null ? pqDevVO.getName() : "未知设备");
// 判断是否需要在报告上输出水印
String leader = baseModelDataMap.get(BaseReportKeyEnum.AUDIT_BY.getKey());
String loginName = RequestUtil.getLoginNameByToken();
SysUser user = sysUserService.getUserByLoginName(loginName);
if (!leader.equals(user.getName())) {
log.info("当前用户不是审核人,添加非正式水印");
Docx4jUtil.addWatermarkToDocument(baseModelDocument, "非正式");
}
Docx4jUtil.cleanBlankPagesAndRedundantPageBreaks(baseModelDocument);
baseModelDocument.save(new File(dirPath.concat(File.separator).concat(fileName)));
this.updateDevAndPlanState(devId, devReportParam.getPlanId());
} catch (NoSuchFileException e) {
String filePath = e.getFile() != null ? e.getFile().replaceAll("\\\\", "/") : "未知文件";
log.error("报告模板文件不存在 - 文件路径: {}", filePath, e);
throw new BusinessException(SystemResponseEnum.FILE_NOT_FOUND);
} catch (IOException e) {
log.error("报告文件读写异常", e);
throw new BusinessException(SystemResponseEnum.FILE_IO_ERROR);
} catch (Exception e) {
log.error(ReportResponseEnum.GENERATE_REPORT_ERROR.getMessage(), e);
throw new BusinessException(ReportResponseEnum.GENERATE_REPORT_ERROR);
}
}
});
@@ -864,8 +883,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
if (Objects.isNull(report)) {
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
}
Path basePath = Paths.get(report.getBasePath());
Path detailPath = Paths.get(report.getDetailPath());
Path basePath = Paths.get(templatePath + File.separator + report.getBasePath());
Path detailPath = Paths.get(templatePath + File.separator + report.getDetailPath());
try (InputStream baseInputStream = Files.newInputStream(basePath);
InputStream detailInputStream = Files.newInputStream(detailPath)) {
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
@@ -1154,10 +1173,11 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
Integer monitorNum = next.getKey();
// 线路下的指标数据
List<ContrastTestResult> contrastTestResults = next.getValue();
PqMonitor pqMonitor = pqMonitorService.getByDevAndNum(pqDevVO.getId(), monitorNum);
// 插入回路号前,先换个页
todoInsertList.add(Docx4jUtil.createPageBreakParagraph());
// 回路标题
todoInsertList.add(getContrastLineTitle(contentMap, monitorNum, stepIndex, factory));
todoInsertList.add(getContrastLineTitle(contentMap, monitorNum, stepIndex, factory, pqDevVO));
int scriptIndex = 1;
for (ContrastTestResult contrastTestResult : contrastTestResults) {
// 比如电压 V
@@ -1168,7 +1188,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
// 根据code获取对应需要填充的内容
List<Docx4jUtil.HeadingContent> tempContent = contentMap.get(scriptCode);
// 需要区分下谐波类和非谐波类
List<Object> tempList = fillContentInTemplateContrast(tempContent, factory, contrastTestResult);
List<Object> tempList = fillContentInTemplateContrast(tempContent, factory, contrastTestResult, pqMonitor);
todoInsertList.addAll(tempList);
scriptIndex++;
}
@@ -1586,18 +1606,37 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
// 获取现有行的样式
Tr existingRow = (Tr) tbl.getContent().get(rows.size() - 1);
// 获取现有样式
TrPr trPr = existingRow.getTrPr();
JAXBElement<Tc> element = (JAXBElement<Tc>) existingRow.getContent().get(0);
TcPr tcPr = element.getValue().getTcPr();
TblWidth cellWidth = factory.createTblWidth();
cellWidth.setType("dxa");
cellWidth.setW(BigInteger.valueOf(5000 / tableKeys.size()));
tcPr.setTcW(cellWidth);
// 获取每个单元格的TcPr保留各单元格独立的边框设置
List<TcPr> tcPrList = new ArrayList<>();
RPr templateRPr = null;
for (Object cellObj : existingRow.getContent()) {
if (cellObj instanceof JAXBElement) {
JAXBElement<Tc> cellElement = (JAXBElement<Tc>) cellObj;
Tc templateCell = cellElement.getValue();
TcPr tcPr = templateCell.getTcPr();
// 设置单元格宽度
if (tcPr == null) {
tcPr = factory.createTcPr();
}
TblWidth cellWidth = factory.createTblWidth();
cellWidth.setType("dxa");
cellWidth.setW(BigInteger.valueOf(5000 / tableKeys.size()));
tcPr.setTcW(cellWidth);
tcPrList.add(tcPr);
// 从第一个单元格获取字体样式
if (templateRPr == null && !templateCell.getContent().isEmpty() && templateCell.getContent().get(0) instanceof P) {
P templateP = (P) templateCell.getContent().get(0);
templateRPr = Docx4jUtil.getTcPrFromParagraph(templateP);
}
}
}
tbl.getContent().remove(existingRow);
// 迭代增加行,需要填充的表格keys在tableKeys集合中
for (Map<String, String> stringStringMap : dataList) {
Tr newRow = Docx4jUtil.createCustomRow(factory, stringStringMap, tableKeys, trPr, tcPr, true);
Tr newRow = Docx4jUtil.createCustomRow(factory, stringStringMap, tableKeys, trPr, tcPrList, templateRPr, true);
tbl.getContent().add(newRow);
}
} else {
@@ -1624,7 +1663,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
*
* @return
*/
private List<Object> fillContentInTemplateContrast(List<Docx4jUtil.HeadingContent> tempContent, ObjectFactory factory, ContrastTestResult contrastTestResult) {
private List<Object> fillContentInTemplateContrast(List<Docx4jUtil.HeadingContent> tempContent, ObjectFactory factory, ContrastTestResult contrastTestResult, PqMonitor pqMonitor) {
List<Object> todoInsertList = new ArrayList<>();
Docx4jUtil.HeadingContent headingContent = tempContent.get(0);
List<String> tableKeys = Docx4jUtil.getTableFillKeys(tempContent);
@@ -1738,9 +1777,47 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
// 纵向表格暂不考虑
}
// 如果存在特殊说明,在表格后添加一个段落
if (StrUtil.isNotBlank(contrastTestResult.getSpecialCase())) {
P specialCaseP = Docx4jUtil.createSpecialCaseParagraph(factory, contrastTestResult.getSpecialCase());
StringBuilder description = new StringBuilder();
if (contrastTestResult.getScriptCode().equalsIgnoreCase("I")) {
// 获取该通道的额定电流
String ct = pqMonitor.getCt();
// 理论上ct是 xxx:xxx的格式。比如10:1100:5
if (ct.indexOf(":") > 0) {
String[] ctArray = ct.split(":");
description.append("注:当前回路额定电流为:").append(ctArray[1]).append("A。");
}
} else if (contrastTestResult.getScriptCode().equalsIgnoreCase("V")) {
// 获取该通道的额定电压
String pt = pqMonitor.getPt();
// 理论上pt是 xxx:xxx的格式。比如380:38010000:100
if (pt.indexOf(":") > 0) {
String[] ptArray = pt.split(":");
// 电压需要特殊处理下,处理为相电压值
String voltage = ptArray[1];
if (voltage.equalsIgnoreCase("100")) {
voltage = "57.74";
} else if (voltage.equalsIgnoreCase("380")) {
voltage = "220";
} else {
// 其他场景下就除以根号3
double result = Double.parseDouble(voltage) / Math.sqrt(3);
voltage = doubleRound(2, result);
}
description.append("注:当前回路额定电流为:").append(voltage).append("V。");
}
}
// 如果存在特殊说明,在表格后添加一个段落 如果有电压和电流需要把额定电压和电流标注进来 pqMonitor
if (StrUtil.isNotBlank(contrastTestResult.getSpecialCase()) || StrUtil.isNotBlank(description.toString())) {
P specialCaseP;
if (StrUtil.isNotBlank(description.toString())) {
if (StrUtil.isNotBlank(contrastTestResult.getSpecialCase())) {
description.append(contrastTestResult.getSpecialCase().replace("注:", ""));
}
specialCaseP = Docx4jUtil.createSpecialCaseParagraph(factory, description.toString());
} else {
specialCaseP = Docx4jUtil.createSpecialCaseParagraph(factory, contrastTestResult.getSpecialCase());
}
todoInsertList.add(specialCaseP);
}
}
@@ -1948,6 +2025,18 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
baseModelMap.put(BaseReportKeyEnum.DEV_TYPE.getKey(), devType.getName());
// 检测员
baseModelMap.put(BaseReportKeyEnum.INSPECTOR.getKey(), pqDevVO.getCheckBy() + "");
baseModelMap.put(BaseReportKeyEnum.INSPECTOR.getKey(), pqDevVO.getCheckBy() + "");
String datePattern = DatePattern.NORM_DATE_PATTERN;
if (DatePattern.CHINESE_DATE_PATTERN.equals(dateFormat)) {
datePattern = DatePattern.CHINESE_DATE_PATTERN;
}
// 出厂日期
baseModelMap.put(BaseReportKeyEnum.CREATEDATE.getKey(), pqDevVO.getCreateDate().format(DateTimeFormatter.ofPattern(datePattern)));
// 硬件版本
baseModelMap.put(BaseReportKeyEnum.HW_VERSION.getKey(), StrUtil.isNotBlank(pqDevVO.getHardwareVersion()) ? pqDevVO.getHardwareVersion() : StrUtil.EMPTY);
// 软件版本
baseModelMap.put(BaseReportKeyEnum.SW_VERSION.getKey(), StrUtil.isNotBlank(pqDevVO.getSoftwareVersion()) ? pqDevVO.getSoftwareVersion() : StrUtil.EMPTY);
// 调试日期
if (pqDevVO.getCheckTime() != null) {
baseModelMap.put(BaseReportKeyEnum.TEST_DATE.getKey(), DateUtil.format(pqDevVO.getCheckTime(), DatePattern.CHINESE_DATE_PATTERN));
@@ -2016,7 +2105,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
// 委托方
String delegate = pqDevVO.getDelegate();
if (StrUtil.isNotBlank(delegate)) {
DictData delegateDictData = dictDataService.getDictDataById(pqDevVO.getManufacturer());
DictData delegateDictData = dictDataService.getDictDataById(pqDevVO.getDelegate());
if (ObjectUtil.isNotNull(delegateDictData)) {
baseModelMap.put(BaseReportKeyEnum.DELEGATE.getKey(), delegateDictData.getName());
} else {
@@ -2088,7 +2177,19 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
private void dealDataModel(List<InputStream> wordFileInputStreams, DevReportParam devReportParam, PqDevVO pqDevVO) throws Exception {
Integer devChns = pqDevVO.getDevChns();
for (int i = 1; i <= devChns; i++) {
ClassPathResource resource = new ClassPathResource("/model/report_table.docx");
String path = "/model/report_table.docx";
DevType devType = devTypeService.getById(pqDevVO.getDevType());
if (devType.getName().equals("PQ-COM")) {
path = "/model/report_table - PQ-COM.docx";
}
ClassPathResource resource = new ClassPathResource(path);
XWPFDocument dataModelDocumentTemp = new XWPFDocument(resource.getInputStream());
SingleNonHarmParam singleNonHarmParam = new SingleNonHarmParam();
singleNonHarmParam.setPlanCode(devReportParam.getPlanCode());
singleNonHarmParam.setDevId(pqDevVO.getId());
singleNonHarmParam.setChannelNo(i);
// 获取数据
Map<String, String> dataModelMap = new HashMap<>(16);
// 读取模板文件中的占位符
@@ -2106,11 +2207,20 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
List<SimAndDigHarmonicResult> adHarmonicResultList = adHarmonicService.listAllResultData(devReportParam.getScriptId(), devReportParam.getPlanCode(), devReportParam.getDevId() + "_" + i);
// 填充数据
int finalI = i;
indexKeysMap.forEach((index, keys) -> {
String s1 = keys.stream().findFirst().get();
// 谐波类
if (DetectionCodeEnum.V2_50.getCode().equals(s1) || DetectionCodeEnum.I2_50.getCode().equals(s1) || DetectionCodeEnum.SV_1_49.getCode().equals(s1) || DetectionCodeEnum.SI_1_49.getCode().equals(s1)) {
fillMapValueHarm(adHarmonicResultList, dataModelMap, keys, index);
// 查找一下U1
double u1 = 57.74;
List<SimAndDigHarmonicResult> rawData = adHarmonicService.listAllRawData(devReportParam.getScriptId(), devReportParam.getPlanCode(), devReportParam.getDevId() + "_" + finalI);
SimAndDigHarmonicResult adHarmonicResult = rawData.stream().filter(obj -> obj.getAdType().equals(DetectionCodeEnum.V2_50.getCode())).sorted((obj1, obj2) -> obj2.getTimeId().compareTo(obj1.getTimeId())).findFirst().orElse(null);
if (ObjectUtil.isNotNull(adHarmonicResult)) {
String aValue1 = adHarmonicResult.getAValue1();
u1 = Double.parseDouble(aValue1);
}
fillMapValueHarm(adHarmonicResultList, dataModelMap, keys, index, u1);
} else {
// 非谐波类
if (DetectionCodeEnum.V_UNBAN.getCode().equals(s1) || DetectionCodeEnum.FREQ.getCode().equals(s1)) {
@@ -2178,14 +2288,14 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
* @param keys key
* @param index index
*/
private void fillMapValueHarm(List<SimAndDigHarmonicResult> allHarmonicResultList, Map<String, String> dataModelMap, Set<String> keys, String index) {
private void fillMapValueHarm(List<SimAndDigHarmonicResult> allHarmonicResultList, Map<String, String> dataModelMap, Set<String> keys, String index, double baseValue) {
keys.forEach(key -> {
List<SimAndDigHarmonicResult> resultList = allHarmonicResultList.stream().filter(obj -> obj.getAdType().equals(key) && obj.getSort().toString().equals(index)).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(resultList)) {
SimAndDigHarmonicResult adHarmonicResult = resultList.get(0);
if (Objects.nonNull(adHarmonicResult)) {
if (DetectionCodeEnum.V2_50.getCode().equals(key) || DetectionCodeEnum.SV_1_49.getCode().equals(key)) {
fillHarm(dataModelMap, adHarmonicResult, index, key, 57.74, 100);
fillHarm(dataModelMap, adHarmonicResult, index, key, baseValue, 100);
}
if (DetectionCodeEnum.I2_50.getCode().equals(key) || DetectionCodeEnum.SI_1_49.getCode().equals(key)) {
fillHarm(dataModelMap, adHarmonicResult, index, key, 1, 1);
@@ -2392,16 +2502,21 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
/**
* 创建回路标题到报告中
*/
private P getContrastLineTitle(Map<String, List<Docx4jUtil.HeadingContent>> contentMap, int monitorNum, int index, ObjectFactory factory) {
private P getContrastLineTitle(Map<String, List<Docx4jUtil.HeadingContent>> contentMap, int monitorNum, int index, ObjectFactory factory, PqDevVO pqDevVO) {
PqMonitor pqMonitor = pqMonitorService.getByDevAndNum(pqDevVO.getId(), monitorNum);
String monitorInfoName = "";
if (StrUtil.isNotBlank(pqDevVO.getSubName()) && Objects.nonNull(pqMonitor)) {
monitorInfoName = "(" + pqDevVO.getSubName() + "-" + pqMonitor.getName() + ")";
}
List<Docx4jUtil.HeadingContent> headingContents = contentMap.get(PowerIndexEnum.LINE_TITLE.getKey());
// 如果contentMap中有指定内容创建大纲级别为2的标题
if (CollUtil.isNotEmpty(headingContents)) {
return Docx4jUtil.createTitle(factory, 2, index + ".测量回路" + monitorNum,
return Docx4jUtil.createTitle(factory, 2, index + ".测量回路" + monitorNum + monitorInfoName,
"SimSun", 30, true);
}
// 没有模板配置时,创建默认样式段落
P titleParagraph = factory.createP();
Docx4jUtil.createTitle(factory, titleParagraph, "测量回路" + monitorNum,
Docx4jUtil.createTitle(factory, titleParagraph, "测量回路" + monitorNum + monitorInfoName,
28, true);
return titleParagraph;
}

View File

@@ -2,6 +2,7 @@ package com.njcn.gather.result.pojo.param;
import com.njcn.common.pojo.constant.PatternRegex;
import com.njcn.gather.pojo.constant.DetectionValidMessage;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -74,6 +75,8 @@ public class ResultParam {
// 模式id
private String patternId;
private String code;
}
@Data
@@ -100,5 +103,11 @@ public class ResultParam {
@ApiModelProperty(value = "模式Id", required = true)
private String patternId;
@ApiModelProperty(value = "通道号", required = true)
private String chnNum;
@ApiModelProperty(value = "数据处理原则", required = true)
private String dataRuleId;
}
}

View File

@@ -146,11 +146,11 @@ public class ResultServiceImpl implements IResultService {
formContentVO.setErrorSysId(plan.getErrorSysId());
String scriptId = null;
if (ObjectUtil.isNotNull(plan)) {
formContentVO.setDataRule(plan.getDataRule());
scriptId = plan.getScriptId();
adPlanService.visualize(Collections.singletonList(plan));
formContentVO.setScriptName(plan.getScriptId());
}
formContentVO.setScriptName(plan.getScriptId());
formContentVO.setDataRule(plan.getDataRule());
formContentVO.setDeviceName(pqDevService.getById(queryParam.getDeviceId()).getName());
List<Map<String, String>> chnList = new ArrayList<>();
@@ -983,10 +983,10 @@ public class ResultServiceImpl implements IResultService {
DictData dictData = dictDataService.getDictDataById(param.getPatternId());
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
this.createTempResultTable(param.getCode() + "_temp", true);
this.contrastCalculateResult(param.getPlanId(), param.getCode() + "_temp", param.getErrorSysId(), param.getDeviceId());
this.contrastCalculateResult(param.getPlanId(), param.getCode() + "_temp", param.getErrorSysId(), param.getDeviceId(), false, param.getDataRuleId());
} else {
this.createTempResultTable(param.getCode() + "_temp", false);
this.simAndDigCalculateResult(param.getPlanId(), param.getScriptId(), param.getCode() + "_temp", param.getErrorSysId(), param.getDeviceId());
this.simAndDigCalculateResult(param.getPlanId(), param.getScriptId(), param.getCode() + "_temp", param.getErrorSysId(), param.getDeviceId(), param.getDataRuleId());
}
}
@@ -1000,9 +1000,9 @@ public class ResultServiceImpl implements IResultService {
public void reCalculate(ResultParam.ChangeErrorSystemParam param) {
DictData dictData = dictDataService.getDictDataById(param.getPatternId());
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
this.contrastCalculateResult(param.getPlanId(), param.getCode(), param.getErrorSysId(), param.getDeviceId());
this.contrastCalculateResult(param.getPlanId(), param.getCode(), param.getErrorSysId(), param.getDeviceId(), true, param.getDataRuleId());
} else {
this.simAndDigCalculateResult(param.getPlanId(), param.getScriptId(), param.getCode(), param.getErrorSysId(), param.getDeviceId());
this.simAndDigCalculateResult(param.getPlanId(), param.getScriptId(), param.getCode(), param.getErrorSysId(), param.getDeviceId(), param.getDataRuleId());
}
}
@@ -1533,8 +1533,7 @@ public class ResultServiceImpl implements IResultService {
AdPlan plan = adPlanService.getById(queryParam.getPlanId());
PqDev dev = pqDevService.getById(queryParam.getDeviceId());
DictData dictData = dictDataService.getById(plan.getDataRule());
formContentVO.setDataRule(dictData.getName());
formContentVO.setDataRule(plan.getDataRule());
formContentVO.setDeviceName(dev.getName());
formContentVO.setErrorSysId(plan.getErrorSysId());
@@ -1581,8 +1580,6 @@ public class ResultServiceImpl implements IResultService {
public ContrastResultVO getContrastResult(ResultParam.QueryParam queryParam) {
ContrastResultVO contrastResultVO = new ContrastResultVO();
AdPlan plan = adPlanService.getById(queryParam.getPlanId());
List<DictTree> dictTreeList = dictTreeService.getDictTreeById(Collections.singletonList(queryParam.getScriptType()));
List<String> fatherIdList = dictTreeList.stream().map(DictTree::getId).collect(Collectors.toList());
@@ -1604,8 +1601,8 @@ public class ResultServiceImpl implements IResultService {
}
}
contrastResultVO.setResultMap(this.getResultMap(dictTree, adTypeList, queryParam.getDeviceId() + CnSocketUtil.SPLIT_TAG + queryParam.getChnNum(), unit, queryParam.getNum(), queryParam.getWaveNum(), queryParam.getIsWave(), String.valueOf(plan.getCode())));
contrastResultVO.setRawDataMap(this.getRawDataMap(dictTree, adTypeList, queryParam.getDeviceId() + CnSocketUtil.SPLIT_TAG + queryParam.getChnNum(), unit, queryParam.getNum(), queryParam.getWaveNum(), queryParam.getIsWave(), String.valueOf(plan.getCode()), contrastResultVO.getResultMap().keySet().stream().collect(Collectors.toList())));
contrastResultVO.setResultMap(this.getResultMap(dictTree, adTypeList, queryParam.getDeviceId() + CnSocketUtil.SPLIT_TAG + queryParam.getChnNum(), unit, queryParam.getNum(), queryParam.getWaveNum(), queryParam.getIsWave(), queryParam.getCode()));
contrastResultVO.setRawDataMap(this.getRawDataMap(dictTree, adTypeList, queryParam.getDeviceId() + CnSocketUtil.SPLIT_TAG + queryParam.getChnNum(), unit, queryParam.getNum(), queryParam.getWaveNum(), queryParam.getIsWave(), queryParam.getCode(), contrastResultVO.getResultMap().keySet().stream().collect(Collectors.toList())));
return contrastResultVO;
}
@@ -2872,23 +2869,23 @@ public class ResultServiceImpl implements IResultService {
for (int i = 0; i < devNonHarmonicRawDataList.size(); i++) {
AlignDataVO.RawData rawDataVO = new AlignDataVO.RawData();
rawDataVO.setUnit(unit);
ContrastNonHarmonicResult contrastNonHarmonicResult = devNonHarmonicRawDataList.get(i);
rawDataVO.setTimeDev(contrastNonHarmonicResult.getTimeId().format(dtf));
ContrastNonHarmonicResult contrastNonHarmonicResultDev = devNonHarmonicRawDataList.get(i);
rawDataVO.setTimeDev(contrastNonHarmonicResultDev.getTimeId().format(dtf));
rawDataVO.setUbDev(getValue(contrastNonHarmonicResult.getBValue()));
rawDataVO.setUtDev(getValue(contrastNonHarmonicResult.getTValue()));
rawDataVO.setUbDev(getValue(contrastNonHarmonicResultDev.getBValue()));
rawDataVO.setUtDev(getValue(contrastNonHarmonicResultDev.getTValue()));
contrastNonHarmonicResult = stdDevNonHarmonicRawDataList.get(i);
rawDataVO.setTimeStdDev(contrastNonHarmonicResult.getTimeId().format(dtf));
ContrastNonHarmonicResult contrastNonHarmonicResultStdDev = stdDevNonHarmonicRawDataList.get(i);
rawDataVO.setTimeStdDev(contrastNonHarmonicResultStdDev.getTimeId().format(dtf));
if (!DicDataEnum.IMBV.getCode().equals(dictTree.getCode()) && !DicDataEnum.IMBA.getCode().equals(dictTree.getCode())) {
rawDataVO.setUaDev(getValue(contrastNonHarmonicResult.getAValue()));
rawDataVO.setUcDev(getValue(contrastNonHarmonicResult.getCValue()));
rawDataVO.setUaStdDev(getValue(contrastNonHarmonicResult.getAValue()));
rawDataVO.setUcStdDev(getValue(contrastNonHarmonicResult.getCValue()));
rawDataVO.setUaDev(getValue(contrastNonHarmonicResultDev.getAValue()));
rawDataVO.setUcDev(getValue(contrastNonHarmonicResultDev.getCValue()));
rawDataVO.setUaStdDev(getValue(contrastNonHarmonicResultStdDev.getAValue()));
rawDataVO.setUcStdDev(getValue(contrastNonHarmonicResultStdDev.getCValue()));
}
rawDataVO.setUbStdDev(getValue(contrastNonHarmonicResult.getBValue()));
rawDataVO.setUtStdDev(getValue(contrastNonHarmonicResult.getTValue()));
rawDataVO.setUbStdDev(getValue(contrastNonHarmonicResultStdDev.getBValue()));
rawDataVO.setUtStdDev(getValue(contrastNonHarmonicResultStdDev.getTValue()));
rawDataVOList.add(rawDataVO);
}
@@ -3067,7 +3064,7 @@ public class ResultServiceImpl implements IResultService {
* @param errorSysId
* @param devId
*/
private void simAndDigCalculateResult(String planId, String scriptId, String code, String errorSysId, String devId) {
private void simAndDigCalculateResult(String planId, String scriptId, String code, String errorSysId, String devId, String dataRuleId) {
String oldCode = code.replace("_temp", "");
PreDetectionParam param = new PreDetectionParam();
param.setCode(code);
@@ -3085,8 +3082,8 @@ public class ResultServiceImpl implements IResultService {
// } else {
// dataRule = DictDataEnum.SECTION_VALUE;
// }
AdPlan plan = adPlanService.getById(planId);
DictData dictData = dictDataService.getDictDataById(plan.getDataRule());
// AdPlan plan = adPlanService.getById(planId);
DictData dictData = dictDataService.getDictDataById(dataRuleId);
if (ObjectUtil.isNotNull(dictData)) {
dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode());
} else {
@@ -3144,8 +3141,9 @@ public class ResultServiceImpl implements IResultService {
* @param code
* @param errorSysId
* @param deviceId
* @param updateResult
*/
private void contrastCalculateResult(String planId, String code, String errorSysId, String deviceId) {
private void contrastCalculateResult(String planId, String code, String errorSysId, String deviceId, boolean updateResult, String dataRuleId) {
String oldCode = code.replace("_temp", "");
Map<String, String> devIdMapComm = new HashMap<>();
@@ -3188,24 +3186,29 @@ public class ResultServiceImpl implements IResultService {
}
DictDataEnum dataRule;
DictData dictData = dictDataService.getDictDataById(plan.getDataRule());
DictData dictData = dictDataService.getDictDataById(dataRuleId);
if (ObjectUtil.isNotNull(dictData)) {
dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode());
} else {
dataRule = DictDataEnum.SECTION_VALUE;
}
pqMonitorService.lambdaUpdate().set(PqMonitor::getRecordedResult, null)
.set(PqMonitor::getRealtimeNum, null)
.set(PqMonitor::getRecordedResult, null)
.set(PqMonitor::getRecordedNum, null)
.set(PqMonitor::getStatisticsResult, null)
.set(PqMonitor::getStatisticsNum, null)
.set(PqMonitor::getResultType, null)
.set(PqMonitor::getQualifiedNum, 0)
.eq(PqMonitor::getDevId, deviceId)
.eq(PqMonitor::getCheckFlag, 1)
.update();
if (updateResult) {
pqMonitorService.lambdaUpdate().set(PqMonitor::getRecordedResult, null)
.set(PqMonitor::getRealtimeNum, null)
.set(PqMonitor::getRecordedResult, null)
.set(PqMonitor::getRecordedNum, null)
.set(PqMonitor::getStatisticsResult, null)
.set(PqMonitor::getStatisticsNum, null)
.set(PqMonitor::getResultType, null)
.set(PqMonitor::getQualifiedNum, 0)
.eq(PqMonitor::getDevId, deviceId)
//.eq(PqMonitor::getNum, Integer.parseInt(chnNum))
.eq(PqMonitor::getCheckFlag, 1)
.update();
}
//String monitorId = deviceId + CnSocketUtil.SPLIT_TAG + chnNum;
List<AdPair> adPairList = adPairService.listByDevIds(Arrays.asList(deviceId));
Map<Integer, List<AdPair>> numAdPairsMap = adPairList.stream().collect(Collectors.groupingBy(AdPair::getNum, Collectors.toList()));
@@ -3225,42 +3228,40 @@ public class ResultServiceImpl implements IResultService {
numMap.put(devMonitorId, num);
numMap.put(adPair.getStdDevMonitorId(), num);
devIdMapComm.put(standardDev.getIp(), standardDev.getId());
});
List<ContrastNonHarmonicResult> devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, null, false, null, 0, deviceId, null);
List<ContrastNonHarmonicResult> stdDevNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, null, false, null, 1, deviceId, null);
List<ContrastHarmonicResult> devHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, null, false, null, 0, deviceId, null);
List<ContrastHarmonicResult> stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, null, false, null, 1, deviceId, null);
List<ContrastNonHarmonicResult> devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, null, false, null, 0, devMonitorId, null);
List<ContrastNonHarmonicResult> stdDevNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, null, false, null, 1, devMonitorId, null);
List<ContrastHarmonicResult> devHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, null, false, null, 0, devMonitorId, null);
List<ContrastHarmonicResult> stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, null, false, null, 1, devMonitorId, null);
List<DevData> devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
List<DevData> standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
List<DevData> devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
List<DevData> standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
if (CollUtil.isNotEmpty(devData) && CollUtil.isNotEmpty(standardDevData)) {
detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, code, null, finalNonWaveDataSourceEnum);
if (CollUtil.isNotEmpty(devData) && CollUtil.isNotEmpty(standardDevData)) {
detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, code, null, finalNonWaveDataSourceEnum);
parsId.forEach((devMonitorId, stdDevMonitorId) -> {
String[] split = devMonitorId.split(CnSocketUtil.SPLIT_TAG);
pqMonitorService.updateMonitorResult(devMonitorId, null, finalNonWaveDataSourceEnum, num, null, oldCode);
pqDevService.updateResult(split[0], null);
});
}
if (updateResult) {
pqMonitorService.updateMonitorResult(devMonitorId, null, finalNonWaveDataSourceEnum, num, null, oldCode);
pqDevService.updateResult(split1[0], null);
}
}
AdPlanTestConfig adPlanTestConfig = adPlanTestConfigService.getByPlanId(planId);
for (int i = 1; i <= adPlanTestConfig.getWaveRecord(); i++) {
devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, deviceId, null);
stdDevNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, deviceId, null);
devHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, deviceId, null);
stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, deviceId, null);
AdPlanTestConfig adPlanTestConfig = adPlanTestConfigService.getByPlanId(planId);
for (int i = 1; i <= adPlanTestConfig.getWaveRecord(); i++) {
devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, devMonitorId, null);
stdDevNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, devMonitorId, null);
devHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, devMonitorId, null);
stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, devMonitorId, null);
devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, oldCode, i, DataSourceEnum.WAVE_DATA);
}
devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, oldCode, i, DataSourceEnum.WAVE_DATA);
}
parsId.forEach((devMonitorId, stdDevMonitorId) -> {
String[] split = devMonitorId.split(CnSocketUtil.SPLIT_TAG);
pqMonitorService.updateMonitorResult(devMonitorId, null, WAVE_DATA, num, adPlanTestConfig.getWaveRecord(), oldCode);
pqDevService.updateResult(split[0], null);
if (updateResult) {
pqMonitorService.updateMonitorResult(devMonitorId, null, WAVE_DATA, num, adPlanTestConfig.getWaveRecord(), oldCode);
pqDevService.updateResult(split1[0], null);
}
});
});
}
@@ -3604,7 +3605,7 @@ public class ResultServiceImpl implements IResultService {
return 4;
// 保留3位小数
case "I": // 电流
return 3;
return 5;
// 保留4位小数
case "IMBV": // 电压不平衡度
case "IMBA": // 电流不平衡度

View File

@@ -126,10 +126,10 @@ public class PqScriptController extends BaseController {
@GetMapping("/getAll")
@ApiOperation("获取指定模式下的所有检测脚本")
@ApiImplicitParam(name = "patternId", value = "模式Id", required = true)
public HttpResult<List<Map<String, Object>>> getAllPqScript(@RequestParam("patternId") String patternId) {
public HttpResult<List<PqScript>> getAllPqScript(@RequestParam("patternId") String patternId) {
String methodDescribe = getMethodDescribe("getAllPqScript");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, patternId);
List<Map<String, Object>> result = pqScriptService.listAllPqScript(patternId);
List<PqScript> result = pqScriptService.listAllPqScript(patternId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}

View File

@@ -72,6 +72,9 @@ public class PqScriptParam {
@Max(value = 20, message = DetectionValidMessage.SCRIPT_CURR_FORMAT_ERROR)
private Double ratedCurr;
@ApiModelProperty("是否为Fluke专用脚本")
private Integer fluke;
@Data
@EqualsAndHashCode(callSuper = true)

View File

@@ -73,6 +73,11 @@ public class PqScript extends BaseEntity implements Serializable {
*/
private Double ratedCurr;
/**
* 是否为福禄克专用脚本。0-否 1-是
*/
private Integer fluke;
/**
* 状态0-删除 1-正常
*/

View File

@@ -68,7 +68,7 @@ public interface IPqScriptService extends IService<PqScript> {
* @param patternId 模式id
* @return 检测脚本列表
*/
List<Map<String, Object>> listAllPqScript(String patternId);
List<PqScript> listAllPqScript(String patternId);
/**
* 根据脚本名称查询脚本

View File

@@ -13,6 +13,7 @@ import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum;
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
import com.njcn.gather.device.pojo.enums.CommonEnum;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.plan.mapper.AdPlanMapper;
import com.njcn.gather.plan.pojo.po.AdPlan;
@@ -959,6 +960,22 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
queryWrapper.eq(PqScriptDtls::getScriptIndex, -1)
.eq(PqScriptDtls::getEnable, 1);
pqScriptDtls = this.list(queryWrapper);
// 相序校验中电流需加量需要依据企标10650.2中章节5.5.3的描述过载能力2 倍额定电流连续10 倍额定电流持续 1 s。
// 考虑到有可能存在1A的额定电流本处做特殊处理加量分别为额定电流的0.2/0.4/0.6的标幺乘积加量
// 电压暂不做处理原因1、电压的企标描述过载能力为4倍空间较大2、额定电压比如57.74V为浮点数,存在不确定小数位,避免引起算术误差;
// 1. 获取额定电流,前端已做限制,相同额定电流才能一起检测
String deviceId = param.getDevIds().get(0);
PqDevVO pqDev = pqDevService.getPqDevById(deviceId);
String devTypeId = pqDev.getDevType();
DevType devType = devTypeService.getById(devTypeId);
Double devCurr = devType.getDevCurr();
for (int i = 0; i < pqScriptDtls.size(); i++) {
PqScriptDtls scriptDtls = pqScriptDtls.get(i);
// 注意此处scriptDtls.getValue() < 1.0,考虑到有些已经投入运行的地方,可能没有改库,避免不必要的异常
if(scriptDtls.getValueType().equalsIgnoreCase("CUR") && scriptDtls.getValue() < 1.0){
scriptDtls.setValue(devCurr * scriptDtls.getValue());
}
}
} else if (param.getIsPhaseSequence().equals(CommonEnum.COEFFICIENT_TEST.getValue())) {
//系数
queryWrapper.in(PqScriptDtls::getScriptIndex, param.getIndexList())

View File

@@ -112,15 +112,15 @@ public class PqScriptServiceImpl extends ServiceImpl<PqScriptMapper, PqScript> i
}
@Override
public List<Map<String, Object>> listAllPqScript(String patternId) {
public List<PqScript> listAllPqScript(String patternId) {
List<PqScript> pqScriptList = this.lambdaQuery().eq(StrUtil.isNotBlank(patternId), PqScript::getPattern, patternId).eq(PqScript::getState, DataStateEnum.ENABLE.getCode()).list();
List<Map<String, Object>> result = pqScriptList.stream().map(pqScript -> {
Map<String, Object> map = new HashMap<>();
map.put("id", pqScript.getId());
map.put("name", pqScript.getName());
return map;
}).collect(Collectors.toList());
return result;
// List<Map<String, Object>> result = pqScriptList.stream().map(pqScript -> {
// Map<String, Object> map = new HashMap<>();
// map.put("id", pqScript.getId());
// map.put("name", pqScript.getName());
// return map;
// }).collect(Collectors.toList());
return pqScriptList;
}
@Override
@@ -139,7 +139,7 @@ public class PqScriptServiceImpl extends ServiceImpl<PqScriptMapper, PqScript> i
wrapper.eq("state", DataStateEnum.ENABLE.getCode());
wrapper.eq("name", param.getName());
if (isExcludeSelf) {
if(param instanceof PqScriptParam.UpdateParam){
if (param instanceof PqScriptParam.UpdateParam) {
wrapper.ne("id", ((PqScriptParam.UpdateParam) param).getId());
}
}

View File

@@ -9,7 +9,7 @@ spring:
# url: jdbc:mysql://192.168.1.24:13306/pqs91002?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
# username: root
# password: njcnpqs
url: jdbc:mysql://localhost:13306/pqs9100w?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
url: jdbc:mysql://192.168.1.24:13306/pqs9100_nx?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
username: root
password: njcnpqs
#初始化建立物理连接的个数、最小、最大连接数
@@ -85,6 +85,7 @@ log:
report:
template: D:\template
reportDir: D:\report
dateFormat: yyyy年MM月dd日
data:
homeDir: D:\data
qr:

View File

@@ -5,7 +5,7 @@
<!-- 直接使用固定配置避免Spring配置解析时机问题 -->
<property name="log.projectName" value="entrance"/>
<property name="logCommonLevel" value="info"/>
<property name="logHomeDir" value="D:\logs"/>
<property name="logHomeDir" value="${logHomeDir:-D:\logs}"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex"

View File

@@ -25,10 +25,10 @@ public class AnalysisServiceStreamTest {
private ICompareWaveService compareWaveServiceImpl;
// 测试文件路径 - 请根据实际情况修改
private static final String SOURCE_CFG_PATH = "C:\\Users\\Administrator\\Desktop\\wavedata\\192.168.1.200\\PQ_PQLD1_000020_20251017_140358_193.cfg";
private static final String SOURCE_DAT_PATH = "C:\\Users\\Administrator\\Desktop\\wavedata\\192.168.1.200\\PQ_PQLD1_000020_20251017_140358_193.dat";
private static final String TARGET_CFG_PATH = "C:\\Users\\Administrator\\Desktop\\wavedata\\192.168.1.168\\PQ_PQLD1_000018_20251017_140357_625.cfg";
private static final String TARGET_DAT_PATH = "C:\\Users\\Administrator\\Desktop\\wavedata\\192.168.1.168\\PQ_PQLD1_000018_20251017_140357_625.dat";
private static final String SOURCE_CFG_PATH = "C:\\Users\\Administrator\\Desktop\\wave\\192.168.1.241\\PQ_PQLD2_000177_20251028_112422_833.cfg";
private static final String SOURCE_DAT_PATH = "C:\\Users\\Administrator\\Desktop\\wave\\192.168.1.241\\PQ_PQLD2_000177_20251028_112422_833.dat";
private static final String TARGET_CFG_PATH = "C:\\Users\\Administrator\\Desktop\\wave\\192.168.1.242\\PQ_PQLD2_000238_20251028_112422_518.cfg";
private static final String TARGET_DAT_PATH = "C:\\Users\\Administrator\\Desktop\\wave\\192.168.1.242\\PQ_PQLD2_000238_20251028_112422_518.dat";
// private static final String SOURCE_CFG_PATH = "F:\\hatch\\wavecompare\\数据比对\\统计数据1\\B码\\217\\PQMonitor_PQM1_000006_20200430_115517_889.cfg";

1
license.key Normal file
View File

@@ -0,0 +1 @@
AoNUHvLQag9nPPxWDsf5EwwBqifh5wnoFjrU01w+kIA7TPdRl0AQDBSA3IU7AY28Liubt6Rl8CsDtxEDrz8L5m0FqQrmZ1TmIJtZWbBR16NxXRgf8izM5JurYEY6ZbjU021yCu0fitxB0DJZ8LB8zfUDsV1MFGHl+yPjh4ZQrYDffID4rk/mRe/EE6F7bS19upStSOnQxVQVJSXwCVVHgsuFXqiuagM21OmxpYNjqaPnvAKoHRXTTxXn9BrSgZBocxuHB/IE+a0a+Q2eQo4RZa2IQpneEA/QIKEqezqsABxmM33duQ4eKt17hAttISV1J0R1cKpwZ4tYuSoHCuMONA==

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
@@ -27,6 +28,7 @@ import java.util.Map;
* @version 1.0
* @data 2025/3/26 13:47
*/
@Slf4j
public class Docx4jUtil {
/**
@@ -434,7 +436,93 @@ public class Docx4jUtil {
}
/**
* 根据已知信息创建新
* 根据已知信息创建新
*
* @param factory 工厂
* @param valueMap 数据
* @param tableKeys keys
* @param trPr 行样式
* @param tcPrList 每个单元格的样式列表(用于保留各单元格独立的边框设置)
* @param templateRPr 模板中的字体样式可为null为null时使用默认宋体10号
* @param centerFlag 是否居中
*/
public static Tr createCustomRow(ObjectFactory factory, Map<String, String> valueMap, List<String> tableKeys, TrPr trPr, List<TcPr> tcPrList, RPr templateRPr, boolean centerFlag) {
Tr row = factory.createTr();
for (int i = 0; i < tableKeys.size(); i++) {
String tableKey = tableKeys.get(i);
Tc cell = factory.createTc();
P paragraph = factory.createP();
R run = factory.createR();
String value = valueMap.get(tableKey);
Text text = factory.createText();
text.setValue(value);
run.getContent().add(text);
paragraph.getContent().add(run);
// 从模板复制字体样式
RPr rPr = factory.createRPr();
if (templateRPr != null) {
// 复制字体
if (templateRPr.getRFonts() != null) {
RFonts rFonts = factory.createRFonts();
rFonts.setEastAsia(templateRPr.getRFonts().getEastAsia());
rFonts.setAscii(templateRPr.getRFonts().getAscii());
rFonts.setHAnsi(templateRPr.getRFonts().getHAnsi());
rPr.setRFonts(rFonts);
}
// 复制字号
if (templateRPr.getSz() != null) {
HpsMeasure sz = factory.createHpsMeasure();
sz.setVal(templateRPr.getSz().getVal());
rPr.setSz(sz);
}
if (templateRPr.getSzCs() != null) {
HpsMeasure szCs = factory.createHpsMeasure();
szCs.setVal(templateRPr.getSzCs().getVal());
rPr.setSzCs(szCs);
}
} else {
// 默认使用宋体10号
RFonts rFonts = factory.createRFonts();
rFonts.setEastAsia("宋体");
rFonts.setAscii("宋体");
rFonts.setHAnsi("宋体");
rPr.setRFonts(rFonts);
HpsMeasure sz = factory.createHpsMeasure();
sz.setVal(new BigInteger("20"));
rPr.setSz(sz);
}
// 设置段落居中
if (centerFlag) {
PPr pPr = factory.createPPr();
Jc jc = factory.createJc();
jc.setVal(JcEnumeration.CENTER);
pPr.setJc(jc);
paragraph.setPPr(pPr);
}
// 不合格标红
if (value != null && value.equals("不合格")) {
Color color = factory.createColor();
color.setVal("FF0000");
rPr.setColor(color);
}
run.setRPr(rPr);
cell.getContent().add(paragraph);
// 使用对应位置的单元格样式(保留边框设置)
if (tcPrList != null && i < tcPrList.size()) {
cell.setTcPr(tcPrList.get(i));
}
row.getContent().add(cell);
row.setTrPr(trPr);
}
return row;
}
/**
* 根据已知信息创建新行
*
* @param factory 工厂
* @param valueMap 数据
@@ -2139,5 +2227,83 @@ public class Docx4jUtil {
return specialCaseP;
}
/**
* 为Word文档添加水印
* 使用页眉方式但设置页眉高度为0确保不影响文档结构
*
* @param wordPackage Word文档包
* @param watermarkText 水印文字(如:"非正式"
* @throws Exception 添加水印失败时抛出异常
*/
public static void addWatermarkToDocument(WordprocessingMLPackage wordPackage, String watermarkText) throws Exception {
try {
MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();
ObjectFactory factory = new ObjectFactory();
// 创建页眉部分
org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart headerPart =
new org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart();
// 将页眉部分添加到文档并获取关系ID
org.docx4j.relationships.Relationship relationship = mainDocumentPart.addTargetPart(headerPart);
// 创建页眉对象
org.docx4j.wml.Hdr hdr = factory.createHdr();
// 创建段落
P paragraph = factory.createP();
// 创建Run
R run = factory.createR();
// 使用VML textbox方式创建水印文本绝对定位显示在页面中部
String vmlString = String.format(
"<w:pict xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " +
"xmlns:v=\"urn:schemas-microsoft-com:vml\">" +
"<v:shape style=\"position:absolute;left:0;text-align:center;margin-left:0;margin-top:0;" +
"width:500pt;height:200pt;z-index:-251658240;" +
"mso-position-horizontal:center;mso-position-horizontal-relative:page;" +
"mso-position-vertical:center;mso-position-vertical-relative:page\" " +
"fillcolor=\"none\" stroked=\"f\">" +
"<v:textbox style=\"mso-fit-shape-to-text:t\">" +
"<w:txbxContent>" +
"<w:p><w:pPr><w:jc w:val=\"center\"/></w:pPr>" +
"<w:r><w:rPr>" +
"<w:color w:val=\"D8D8D8\"/>" +
"<w:sz w:val=\"240\"/>" +
"<w:szCs w:val=\"240\"/>" +
"<w:rFonts w:ascii=\"微软雅黑\" w:eastAsia=\"微软雅黑\" w:hAnsi=\"微软雅黑\"/>" +
"</w:rPr><w:t>%s</w:t></w:r></w:p>" +
"</w:txbxContent></v:textbox>" +
"</v:shape></w:pict>", watermarkText);
// 解析VML并添加到Run
Object vmlObject = XmlUtils.unmarshalString(vmlString);
run.getContent().add(vmlObject);
paragraph.getContent().add(run);
hdr.getContent().add(paragraph);
headerPart.setJaxbElement(hdr);
// 获取或创建节属性SectPr
SectPr sectPr = mainDocumentPart.getJaxbElement().getBody().getSectPr();
if (sectPr == null) {
sectPr = factory.createSectPr();
mainDocumentPart.getJaxbElement().getBody().setSectPr(sectPr);
}
// 创建页眉引用并关联到节属性
org.docx4j.wml.HeaderReference headerReference = factory.createHeaderReference();
headerReference.setId(relationship.getId());
headerReference.setType(org.docx4j.wml.HdrFtrRef.DEFAULT);
sectPr.getEGHdrFtrReferences().add(headerReference);
log.info("成功添加水印:{}", watermarkText);
} catch (Exception e) {
log.error("添加水印失败:{}", e.getMessage(), e);
throw new Exception("添加水印失败:" + e.getMessage(), e);
}
}
}