Compare commits
69 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de83f98845 | ||
|
|
061b65be1b | ||
|
|
694a99a96f | ||
| befe5abe0c | |||
| 46ec9923a7 | |||
|
|
d2388576a9 | ||
|
|
7f21049d0f | ||
|
|
49ca27d994 | ||
| 3cb4a46a16 | |||
|
|
13677f21d9 | ||
|
|
a1941a375b | ||
|
|
9dc8ecd873 | ||
|
|
7c6c103f17 | ||
|
|
b113788e54 | ||
|
|
599edde008 | ||
|
|
cc0b685c66 | ||
|
|
29b0a4f966 | ||
|
|
c651b18e72 | ||
|
|
6fd180b4d4 | ||
|
|
282f9cf4eb | ||
|
|
1cfea7fd6c | ||
|
|
251e302e59 | ||
|
|
873e920add | ||
|
|
fd7c6ada6b | ||
|
|
c148bddfc9 | ||
|
|
f0857b7c46 | ||
| 9b1c6f61e6 | |||
|
|
3f72c52cdc | ||
|
|
ef757c52ea | ||
|
|
4110a835c8 | ||
|
|
e78ce544e3 | ||
|
|
c10d54e79a | ||
|
|
2796558040 | ||
|
|
920a808729 | ||
|
|
8e24ac4b71 | ||
|
|
3eb2736edb | ||
|
|
8c3eba9224 | ||
|
|
6288aa565e | ||
|
|
0fa7ec91c4 | ||
|
|
fdb4b7060a | ||
| 3f47b0f008 | |||
|
|
cb431b5af1 | ||
|
|
153428b24f | ||
|
|
d92544f7c4 | ||
|
|
3f1ae1886a | ||
|
|
af4863af65 | ||
|
|
4b7c1259a7 | ||
|
|
de1496389e | ||
| 79003cd0f4 | |||
|
|
c3443fcc91 | ||
|
|
5105e77823 | ||
|
|
eb068b76a4 | ||
| 2012221b73 | |||
|
|
f4df52dd1c | ||
| 41c557118c | |||
| 6596a572d6 | |||
|
|
786bd5d660 | ||
|
|
21d2c2b7a7 | ||
|
|
48fa4c2390 | ||
|
|
9d15351fba | ||
|
|
2339a006ec | ||
|
|
7fd904ab79 | ||
|
|
40cb153656 | ||
|
|
f922ee97aa | ||
|
|
26c5e933f5 | ||
|
|
c7d8fc3168 | ||
|
|
bb22857fc9 | ||
|
|
6ef908ff60 | ||
|
|
7461801657 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -48,3 +48,8 @@ rebel.xml
|
|||||||
/.fastRequest/collections/Root/Default Group/directory.json
|
/.fastRequest/collections/Root/Default Group/directory.json
|
||||||
/.fastRequest/collections/Root/directory.json
|
/.fastRequest/collections/Root/directory.json
|
||||||
/.fastRequest/config/fastRequestCurrentProjectConfig.json
|
/.fastRequest/config/fastRequestCurrentProjectConfig.json
|
||||||
|
|
||||||
|
# 个人工作文档,不与团队共享
|
||||||
|
CLAUDE.md
|
||||||
|
docs/
|
||||||
|
data/
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,27 @@
|
|||||||
package com.njcn.gather.detection.controller;
|
package com.njcn.gather.detection.controller;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.njcn.common.pojo.annotation.OperateInfo;
|
import com.njcn.common.pojo.annotation.OperateInfo;
|
||||||
import com.njcn.common.pojo.constant.OperateType;
|
import com.njcn.common.pojo.constant.OperateType;
|
||||||
import com.njcn.common.pojo.enums.common.LogEnum;
|
import com.njcn.common.pojo.enums.common.LogEnum;
|
||||||
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
|
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
|
||||||
import com.njcn.common.pojo.response.HttpResult;
|
import com.njcn.common.pojo.response.HttpResult;
|
||||||
import com.njcn.common.utils.LogUtil;
|
import com.njcn.common.utils.LogUtil;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLock;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager.AcquireResult;
|
||||||
|
import com.njcn.gather.detection.pojo.enums.DetectionResponseEnum;
|
||||||
import com.njcn.gather.detection.pojo.param.ContrastDetectionParam;
|
import com.njcn.gather.detection.pojo.param.ContrastDetectionParam;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
import com.njcn.gather.detection.pojo.param.SimulateDetectionParam;
|
import com.njcn.gather.detection.pojo.param.SimulateDetectionParam;
|
||||||
|
import com.njcn.gather.detection.pojo.vo.DetectionLockHolderVO;
|
||||||
import com.njcn.gather.detection.service.PreDetectionService;
|
import com.njcn.gather.detection.service.PreDetectionService;
|
||||||
|
import com.njcn.gather.detection.util.socket.FormalTestManager;
|
||||||
|
import com.njcn.gather.user.user.pojo.po.SysUser;
|
||||||
|
import com.njcn.gather.user.user.service.ISysUserService;
|
||||||
import com.njcn.web.controller.BaseController;
|
import com.njcn.web.controller.BaseController;
|
||||||
import com.njcn.web.utils.HttpResultUtil;
|
import com.njcn.web.utils.HttpResultUtil;
|
||||||
|
import com.njcn.web.utils.RequestUtil;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@@ -32,6 +42,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
public class PreDetectionController extends BaseController {
|
public class PreDetectionController extends BaseController {
|
||||||
|
|
||||||
private final PreDetectionService preDetectionService;
|
private final PreDetectionService preDetectionService;
|
||||||
|
private final ISysUserService sysUserService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始检测通用入口
|
* 开始检测通用入口
|
||||||
@@ -42,10 +53,27 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("开始检测")
|
@ApiOperation("开始检测")
|
||||||
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
||||||
public HttpResult<String> startPreTest(@RequestBody @Validated PreDetectionParam param) {
|
public HttpResult<?> startPreTest(@RequestBody @Validated PreDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("startPreTest");
|
String methodDescribe = getMethodDescribe("startPreTest");
|
||||||
preDetectionService.sourceCommunicationCheck(param);
|
HttpResult<DetectionLockHolderVO> busy = tryAcquireLock(param.getUserPageId());
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
|
// 同步阶段抛异常时回滚锁(PLAN_AND_SOURCE_NOT / SOURCE_INFO_NOT 等业务异常会被全局处理器吞掉,
|
||||||
|
// 锁会卡在用户手上直到 4 小时超时,故需 finally 兜底)
|
||||||
|
boolean keepLock = false;
|
||||||
|
try {
|
||||||
|
// 重置 FormalTestManager 暂停计数残留,避免上次暂停残留计数误触发 R4
|
||||||
|
FormalTestManager.stopTime = 0;
|
||||||
|
FormalTestManager.hasStopFlag = false;
|
||||||
|
preDetectionService.sourceCommunicationCheck(param);
|
||||||
|
keepLock = true;
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
|
} finally {
|
||||||
|
if (!keepLock) {
|
||||||
|
releaseLockSelf("START_PRE_SYNC_FAILED");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -59,8 +87,12 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("源通讯校验")
|
@ApiOperation("源通讯校验")
|
||||||
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
||||||
public HttpResult<String> ytxCheckSimulate(@RequestBody @Validated SimulateDetectionParam param) {
|
public HttpResult<?> ytxCheckSimulate(@RequestBody @Validated SimulateDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("ytxCheckSimulate");
|
String methodDescribe = getMethodDescribe("ytxCheckSimulate");
|
||||||
|
HttpResult<DetectionLockHolderVO> busy = requireFreeOrSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
preDetectionService.ytxCheckSimulate(param);
|
preDetectionService.ytxCheckSimulate(param);
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
@@ -72,8 +104,12 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("启动")
|
@ApiOperation("启动")
|
||||||
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
||||||
public HttpResult<String> startTestSimulate(@RequestBody @Validated SimulateDetectionParam param) {
|
public HttpResult<?> startTestSimulate(@RequestBody @Validated SimulateDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("startTestSimulate");
|
String methodDescribe = getMethodDescribe("startTestSimulate");
|
||||||
|
HttpResult<DetectionLockHolderVO> busy = requireHolderSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
preDetectionService.sendScript(param);
|
preDetectionService.sendScript(param);
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
@@ -85,9 +121,18 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("停止")
|
@ApiOperation("停止")
|
||||||
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
||||||
public HttpResult<String> closeSimulateTest(@RequestBody @Validated SimulateDetectionParam param) {
|
public HttpResult<?> closeSimulateTest(@RequestBody @Validated SimulateDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("closeSimulateTest");
|
String methodDescribe = getMethodDescribe("closeSimulateTest");
|
||||||
preDetectionService.closeTestSimulate(param);
|
HttpResult<DetectionLockHolderVO> busy = requireHolderSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
preDetectionService.closeTestSimulate(param);
|
||||||
|
} finally {
|
||||||
|
// 即使业务异常也要释放锁,避免锁残留导致他人无法接手
|
||||||
|
releaseLockSelf("USER_STOP");
|
||||||
|
}
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,8 +144,12 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("系数校验")
|
@ApiOperation("系数校验")
|
||||||
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
||||||
public HttpResult<String> coefficientCheck(@RequestBody PreDetectionParam param) {
|
public HttpResult<?> coefficientCheck(@RequestBody PreDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("coefficientCheck");
|
String methodDescribe = getMethodDescribe("coefficientCheck");
|
||||||
|
HttpResult<DetectionLockHolderVO> busy = requireHolderSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
preDetectionService.coefficientCheck(param);
|
preDetectionService.coefficientCheck(param);
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
@@ -113,8 +162,13 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("暂停检测")
|
@ApiOperation("暂停检测")
|
||||||
@ApiImplicitParam(name = "param", value = "参数", required = true)
|
@ApiImplicitParam(name = "param", value = "参数", required = true)
|
||||||
public HttpResult<String> temStopTest() {
|
public HttpResult<?> temStopTest() {
|
||||||
String methodDescribe = getMethodDescribe("temStopTest");
|
String methodDescribe = getMethodDescribe("temStopTest");
|
||||||
|
HttpResult<DetectionLockHolderVO> busy = requireHolderSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
|
// 暂停保持锁(spec §2.3),不释放
|
||||||
preDetectionService.temStopTest();
|
preDetectionService.temStopTest();
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
@@ -126,8 +180,12 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("重新开始检测")
|
@ApiOperation("重新开始检测")
|
||||||
@ApiImplicitParam(name = "param", value = "参数", required = true)
|
@ApiImplicitParam(name = "param", value = "参数", required = true)
|
||||||
public HttpResult<String> restartTemTest(@RequestBody PreDetectionParam param) {
|
public HttpResult<?> restartTemTest(@RequestBody PreDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("restartTemTest");
|
String methodDescribe = getMethodDescribe("restartTemTest");
|
||||||
|
HttpResult<DetectionLockHolderVO> busy = requireHolderSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
preDetectionService.restartTemTest(param);
|
preDetectionService.restartTemTest(param);
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
}
|
}
|
||||||
@@ -140,10 +198,26 @@ public class PreDetectionController extends BaseController {
|
|||||||
@OperateInfo
|
@OperateInfo
|
||||||
@ApiOperation("开始比对检测")
|
@ApiOperation("开始比对检测")
|
||||||
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
@ApiImplicitParam(name = "param", value = "查询参数", required = true)
|
||||||
public HttpResult<String> startContrastTest(@RequestBody @Validated ContrastDetectionParam param) {
|
public HttpResult<?> startContrastTest(@RequestBody @Validated ContrastDetectionParam param) {
|
||||||
String methodDescribe = getMethodDescribe("startContrastTest");
|
String methodDescribe = getMethodDescribe("startContrastTest");
|
||||||
preDetectionService.startContrastTest(param);
|
// ContrastDetectionParam 无 userPageId 字段,用 loginName 作为会话标识(与 WS 会话 key 一致)
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
HttpResult<DetectionLockHolderVO> busy = tryAcquireLock(param.getLoginName());
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
|
// 同步阶段抛异常时回滚锁,理由同 startPreTest
|
||||||
|
boolean keepLock = false;
|
||||||
|
try {
|
||||||
|
FormalTestManager.stopTime = 0;
|
||||||
|
FormalTestManager.hasStopFlag = false;
|
||||||
|
preDetectionService.startContrastTest(param);
|
||||||
|
keepLock = true;
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
|
} finally {
|
||||||
|
if (!keepLock) {
|
||||||
|
releaseLockSelf("START_CONTRAST_SYNC_FAILED");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -155,4 +229,105 @@ public class PreDetectionController extends BaseController {
|
|||||||
LogUtil.njcnDebug(log, "{}", methodDescribe);
|
LogUtil.njcnDebug(log, "{}", methodDescribe);
|
||||||
preDetectionService.exportAlignData();
|
preDetectionService.exportAlignData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
|
||||||
|
@GetMapping("/canCoefficient")
|
||||||
|
@ApiOperation("比对模式是否能够进行系数校验")
|
||||||
|
public HttpResult<Boolean> canCoefficient() {
|
||||||
|
String methodDescribe = getMethodDescribe("canCoefficient");
|
||||||
|
LogUtil.njcnDebug(log, "{}", methodDescribe);
|
||||||
|
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, preDetectionService.getCanCoefficient(), methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
|
||||||
|
@GetMapping("/startCoefficient")
|
||||||
|
@ApiOperation("比对模式开启系数校验")
|
||||||
|
public HttpResult<?> startCoefficient() {
|
||||||
|
String methodDescribe = getMethodDescribe("startCoefficient");
|
||||||
|
LogUtil.njcnDebug(log, "{}", methodDescribe);
|
||||||
|
HttpResult<DetectionLockHolderVO> busy = requireHolderSelf();
|
||||||
|
if (busy != null) {
|
||||||
|
return busy;
|
||||||
|
}
|
||||||
|
preDetectionService.startCoefficient();
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============ 检测互斥锁辅助方法 ============
|
||||||
|
|
||||||
|
/** 抢锁入口(startPreTest / startContrastTest 用)。
|
||||||
|
* 抢到→null;被他人持有或竞态失败→返回 busy 响应;
|
||||||
|
* 使用方:拿到非 null 返回值直接 return 给上层。 */
|
||||||
|
private HttpResult<DetectionLockHolderVO> tryAcquireLock(String userPageId) {
|
||||||
|
String userId = RequestUtil.getUserId();
|
||||||
|
AcquireResult r = DetectionLockManager.getInstance()
|
||||||
|
.tryAcquire(userId, resolveDisplayName(userId), userPageId);
|
||||||
|
if (r.isOk()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return HttpResultUtil.assembleResult(
|
||||||
|
DetectionResponseEnum.DETECTION_BUSY.getCode(),
|
||||||
|
r.getHolder(),
|
||||||
|
DetectionResponseEnum.DETECTION_BUSY.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 中间接口校验:要求当前 holder == 自己。
|
||||||
|
* 空闲 → 返回 busy data=null("请先开始检测"语义);
|
||||||
|
* 他人持有 → 返回 busy + holder;
|
||||||
|
* 自己持有 → 返回 null(放行)。 */
|
||||||
|
private HttpResult<DetectionLockHolderVO> requireHolderSelf() {
|
||||||
|
DetectionLock cur = DetectionLockManager.getInstance().getCurrent();
|
||||||
|
String me = RequestUtil.getUserId();
|
||||||
|
if (cur != null && me.equals(cur.getUserId())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
DetectionLockHolderVO holder = cur == null ? null : DetectionLockManager.toHolderVO(cur);
|
||||||
|
return HttpResultUtil.assembleResult(
|
||||||
|
DetectionResponseEnum.DETECTION_BUSY.getCode(),
|
||||||
|
holder,
|
||||||
|
DetectionResponseEnum.DETECTION_BUSY.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 辅助接口规则(ytxCheckSimulate):锁空闲 → 放行;他人持有 → busy;自己持有 → 放行。 */
|
||||||
|
private HttpResult<DetectionLockHolderVO> requireFreeOrSelf() {
|
||||||
|
DetectionLock cur = DetectionLockManager.getInstance().getCurrent();
|
||||||
|
if (cur == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String me = RequestUtil.getUserId();
|
||||||
|
if (me.equals(cur.getUserId())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return HttpResultUtil.assembleResult(
|
||||||
|
DetectionResponseEnum.DETECTION_BUSY.getCode(),
|
||||||
|
DetectionLockManager.toHolderVO(cur),
|
||||||
|
DetectionResponseEnum.DETECTION_BUSY.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 释放锁(用户主动终止)。 */
|
||||||
|
private void releaseLockSelf(String reason) {
|
||||||
|
DetectionLockManager.getInstance().releaseIfHeldBy(RequestUtil.getUserId(), reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 解析展示给前端的用户名(昵称优先,loginName 兜底,避免 BUSY 弹窗显示 "unknown user")。 */
|
||||||
|
private String resolveDisplayName(String userId) {
|
||||||
|
if (StrUtil.isBlank(userId)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
SysUser user = sysUserService.getById(userId);
|
||||||
|
if (user != null && StrUtil.isNotBlank(user.getName())) {
|
||||||
|
return user.getName();
|
||||||
|
}
|
||||||
|
if (user != null && StrUtil.isNotBlank(user.getLoginName())) {
|
||||||
|
return user.getLoginName();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("解析检测锁持有者昵称失败,userId={}", userId, e);
|
||||||
|
}
|
||||||
|
// 最终兜底:用 token 里的 loginName,不要返回 "unknown user"
|
||||||
|
String loginName = RequestUtil.getLoginNameByToken();
|
||||||
|
return StrUtil.isNotBlank(loginName) ? loginName : userId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||||
import com.google.common.collect.HashBiMap;
|
import com.google.common.collect.HashBiMap;
|
||||||
|
import com.njcn.common.pojo.enums.common.DataStateEnum;
|
||||||
import com.njcn.common.pojo.exception.BusinessException;
|
import com.njcn.common.pojo.exception.BusinessException;
|
||||||
|
import com.njcn.gather.detection.pojo.dto.DevXiNumData;
|
||||||
import com.njcn.gather.detection.pojo.dto.WaveCommandDTO;
|
import com.njcn.gather.detection.pojo.dto.WaveCommandDTO;
|
||||||
import com.njcn.gather.detection.pojo.dto.WaveResultDTO;
|
import com.njcn.gather.detection.pojo.dto.WaveResultDTO;
|
||||||
import com.njcn.gather.detection.pojo.enums.*;
|
import com.njcn.gather.detection.pojo.enums.*;
|
||||||
@@ -24,15 +26,17 @@ import com.njcn.gather.detection.pojo.vo.*;
|
|||||||
import com.njcn.gather.detection.service.IAdPariService;
|
import com.njcn.gather.detection.service.IAdPariService;
|
||||||
import com.njcn.gather.detection.service.impl.DetectionServiceImpl;
|
import com.njcn.gather.detection.service.impl.DetectionServiceImpl;
|
||||||
import com.njcn.gather.detection.util.DetectionUtil;
|
import com.njcn.gather.detection.util.DetectionUtil;
|
||||||
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
import com.njcn.gather.detection.util.socket.*;
|
||||||
import com.njcn.gather.detection.util.socket.FormalTestManager;
|
|
||||||
import com.njcn.gather.detection.util.socket.MsgUtil;
|
|
||||||
import com.njcn.gather.detection.util.socket.SocketManager;
|
|
||||||
import com.njcn.gather.detection.util.socket.websocket.WebServiceManager;
|
import com.njcn.gather.detection.util.socket.websocket.WebServiceManager;
|
||||||
import com.njcn.gather.device.pojo.enums.PatternEnum;
|
import com.njcn.gather.device.pojo.enums.PatternEnum;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGain;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGainRecord;
|
||||||
import com.njcn.gather.device.pojo.vo.PreDetection;
|
import com.njcn.gather.device.pojo.vo.PreDetection;
|
||||||
import com.njcn.gather.device.service.IPqDevService;
|
import com.njcn.gather.device.service.IPqDevService;
|
||||||
|
import com.njcn.gather.device.service.IPqStandardDevGainRecordService;
|
||||||
|
import com.njcn.gather.device.service.IPqStandardDevGainService;
|
||||||
import com.njcn.gather.device.service.IPqStandardDevService;
|
import com.njcn.gather.device.service.IPqStandardDevService;
|
||||||
|
import com.njcn.gather.monitor.pojo.po.PqMonitor;
|
||||||
import com.njcn.gather.monitor.service.IPqMonitorService;
|
import com.njcn.gather.monitor.service.IPqMonitorService;
|
||||||
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
|
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
|
||||||
import com.njcn.gather.plan.service.IAdPlanService;
|
import com.njcn.gather.plan.service.IAdPlanService;
|
||||||
@@ -42,6 +46,7 @@ import com.njcn.gather.storage.pojo.po.ContrastNonHarmonicResult;
|
|||||||
import com.njcn.gather.storage.service.DetectionDataDealService;
|
import com.njcn.gather.storage.service.DetectionDataDealService;
|
||||||
import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
|
import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
|
||||||
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
||||||
|
import com.njcn.gather.system.config.PathConfig;
|
||||||
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
||||||
@@ -53,7 +58,6 @@ import com.njcn.gather.tools.comtrade.comparewave.service.ICompareWaveService;
|
|||||||
import com.njcn.gather.util.StorageUtil;
|
import com.njcn.gather.util.StorageUtil;
|
||||||
import com.njcn.web.utils.ExcelUtil;
|
import com.njcn.web.utils.ExcelUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
@@ -62,6 +66,7 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
@@ -92,6 +97,8 @@ public class SocketContrastResponseService {
|
|||||||
private final IAdPariService adPairService;
|
private final IAdPariService adPairService;
|
||||||
private final ICompareWaveService compareWaveService;
|
private final ICompareWaveService compareWaveService;
|
||||||
private final IAdPlanTestConfigService adPlanTestConfigService;
|
private final IAdPlanTestConfigService adPlanTestConfigService;
|
||||||
|
private final IPqStandardDevGainService pqStandardDevGainService;
|
||||||
|
private final IPqStandardDevGainRecordService pqStandardDevGainRecordService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -120,8 +127,9 @@ public class SocketContrastResponseService {
|
|||||||
// private SysRegRes contrastRegRes = null;
|
// private SysRegRes contrastRegRes = null;
|
||||||
|
|
||||||
|
|
||||||
@Value("${log.homeDir}")
|
// @Value("${report.reportDir}")
|
||||||
private String alignDataFilePath;
|
// private String alignDataFilePath;
|
||||||
|
private final PathConfig pathConfig;
|
||||||
|
|
||||||
public static final Map<String, List<String>> testItemCodeMap = new HashMap() {{
|
public static final Map<String, List<String>> testItemCodeMap = new HashMap() {{
|
||||||
put("FREQ", Arrays.asList(DetectionCodeEnum.FREQ.getCode()));
|
put("FREQ", Arrays.asList(DetectionCodeEnum.FREQ.getCode()));
|
||||||
@@ -182,9 +190,10 @@ public class SocketContrastResponseService {
|
|||||||
FormalTestManager.pstDataType = null;
|
FormalTestManager.pstDataType = null;
|
||||||
FormalTestManager.isPstData = false;
|
FormalTestManager.isPstData = false;
|
||||||
FormalTestManager.isWaveCheck = false;
|
FormalTestManager.isWaveCheck = false;
|
||||||
// FormalTestManager.isXu = param.getPhaseCheck() == 1 ? true : false;
|
FormalTestManager.isXu = param.getPhaseCheck() == 1 ? true : false;
|
||||||
FormalTestManager.isXu = true;
|
// FormalTestManager.isXu = true;
|
||||||
FormalTestManager.nonWaveDataSourceEnum = null;
|
FormalTestManager.nonWaveDataSourceEnum = null;
|
||||||
|
DetectionServiceImpl.vAndIResultMap = new HashMap<>();
|
||||||
|
|
||||||
String[] datasourceIds = FormalTestManager.currentTestPlan.getDatasourceId().split(",");
|
String[] datasourceIds = FormalTestManager.currentTestPlan.getDatasourceId().split(",");
|
||||||
for (String datasourceId : datasourceIds) {
|
for (String datasourceId : datasourceIds) {
|
||||||
@@ -377,6 +386,10 @@ public class SocketContrastResponseService {
|
|||||||
case RECORD_WAVE_STEP1:
|
case RECORD_WAVE_STEP1:
|
||||||
this.recordWave(param, socketDataMsg);
|
this.recordWave(param, socketDataMsg);
|
||||||
break;
|
break;
|
||||||
|
//系数校验
|
||||||
|
case Coefficient_Check:
|
||||||
|
this.coefficient(param, socketDataMsg);
|
||||||
|
break;
|
||||||
//退出关闭
|
//退出关闭
|
||||||
case QUITE:
|
case QUITE:
|
||||||
quitDeal(socketDataMsg, param);
|
quitDeal(socketDataMsg, param);
|
||||||
@@ -1230,39 +1243,6 @@ public class SocketContrastResponseService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.setScheduler(targetCount, param.getUserPageId(), requestOperateCode, quitOperateCode);
|
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 monitorId1 = devData.getId();
|
||||||
String devMonitorId = monitorId1;
|
String devMonitorId = monitorId1;
|
||||||
@@ -1438,6 +1418,28 @@ public class SocketContrastResponseService {
|
|||||||
pqDevService.updateResult(id1.split(CnSocketUtil.SPLIT_TAG)[0], param.getUserId());
|
pqDevService.updateResult(id1.split(CnSocketUtil.SPLIT_TAG)[0], param.getUserId());
|
||||||
});
|
});
|
||||||
FormalTestManager.isTesting = false;
|
FormalTestManager.isTesting = false;
|
||||||
|
|
||||||
|
if (CollUtil.isNotEmpty(DetectionServiceImpl.vAndIResultMap)) {
|
||||||
|
// 是否进行系数校准
|
||||||
|
//万一录波了这里就进不来了,但是在误差处理的时候DetectionServiceImpl.vAndIResultMap该集合会保留不符合的结果
|
||||||
|
|
||||||
|
XiNumberManager.xiDevList.clear();
|
||||||
|
XiNumberManager.devXiNumDataMap.clear();
|
||||||
|
List<String> stdIpList = DetectionServiceImpl.vAndIResultMap.values().stream().map(DetectionServiceImpl.VAndIResult::getIp).collect(Collectors.toList());
|
||||||
|
XiNumberManager.xiDevList = FormalTestManager.standardDevList.stream().filter(d -> stdIpList.contains(d.getDevIP())).collect(Collectors.toList());
|
||||||
|
// 逐一设备向通讯模块要原始系数
|
||||||
|
SocketMsg<String> socketMsg = new SocketMsg<>();
|
||||||
|
socketMsg.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue());
|
||||||
|
socketMsg.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$01.getValue());
|
||||||
|
PreDetection preDetection = XiNumberManager.xiDevList.get(0);
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("devIP", preDetection.getDevIP());
|
||||||
|
map.put("chnNum", preDetection.getDevChns());
|
||||||
|
socketMsg.setData(JSON.toJSONString(map));
|
||||||
|
SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG, JSON.toJSONString(socketMsg));
|
||||||
|
|
||||||
|
FormalTestManager.currentStep = SourceOperateCodeEnum.Coefficient_Check;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 配对关系入库
|
// 配对关系入库
|
||||||
@@ -1715,6 +1717,160 @@ public class SocketContrastResponseService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void coefficient(PreDetectionParam param, SocketDataMsg socketDataMsg) {
|
||||||
|
SourceOperateCodeEnum sourceOperateCodeEnum = SourceOperateCodeEnum.getDictDataEnumByCode(socketDataMsg.getOperateCode());
|
||||||
|
SourceResponseCodeEnum dictDataEnumByCode = SourceResponseCodeEnum.getDictDataEnumByCode(socketDataMsg.getCode());
|
||||||
|
SocketMsg<String> xiSocket = new SocketMsg<>();
|
||||||
|
xiSocket.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue());
|
||||||
|
|
||||||
|
switch (Objects.requireNonNull(sourceOperateCodeEnum)) {
|
||||||
|
case DATA_CHNFACTOR$01:
|
||||||
|
//获取系数
|
||||||
|
switch (Objects.requireNonNull(dictDataEnumByCode)) {
|
||||||
|
case SUCCESS:
|
||||||
|
if (CollUtil.isNotEmpty(XiNumberManager.xiDevList)) {
|
||||||
|
List<DevXiNumData.GF> gfList = JSON.parseArray(socketDataMsg.getData(), DevXiNumData.GF.class);
|
||||||
|
DevXiNumData devXiNumData = new DevXiNumData();
|
||||||
|
String ip = XiNumberManager.xiDevList.get(0).getDevIP();
|
||||||
|
devXiNumData.setDevIP(ip);
|
||||||
|
//String stdMonitorId = DetectionServiceImpl.vAndIResultMap.keySet().stream().filter(key -> key.contains(ip)).findFirst().get();
|
||||||
|
|
||||||
|
List<PqStandardDevGain> pqStandardDevGainList = new ArrayList<>();
|
||||||
|
List<PqStandardDevGainRecord> recordList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < gfList.size(); i++) {
|
||||||
|
DevXiNumData.GF gf = gfList.get(i);
|
||||||
|
String stdDevMonitorId = FormalTestManager.devIdMapComm.get(ip) + CnSocketUtil.SPLIT_TAG + (gf.getUMonitorPoint() + 1);
|
||||||
|
String devMonitorId = FormalTestManager.pairsIdMap.inverse().get(stdDevMonitorId);
|
||||||
|
PqStandardDevGain pqStandardDevGain = new PqStandardDevGain();
|
||||||
|
pqStandardDevGain.setStdDevMonitorId(stdDevMonitorId);
|
||||||
|
|
||||||
|
DevXiNumData.F f = gf.getF();
|
||||||
|
pqStandardDevGain.setUaGain(f.getUa_gain());
|
||||||
|
pqStandardDevGain.setUbGain(f.getUb_gain());
|
||||||
|
pqStandardDevGain.setUcGain(f.getUc_gain());
|
||||||
|
pqStandardDevGain.setU0Gain(f.getU0_gain());
|
||||||
|
pqStandardDevGain.setIaGain(f.getIa_gain());
|
||||||
|
pqStandardDevGain.setIbGain(f.getIb_gain());
|
||||||
|
pqStandardDevGain.setIcGain(f.getIc_gain());
|
||||||
|
pqStandardDevGain.setI0Gain(f.getI0_gain());
|
||||||
|
pqStandardDevGain.setUabGain(f.getUab_gain());
|
||||||
|
pqStandardDevGain.setUbcGain(f.getUbc_gain());
|
||||||
|
pqStandardDevGain.setUcaGain(f.getUca_gain());
|
||||||
|
pqStandardDevGain.setState(DataStateEnum.ENABLE.getCode());
|
||||||
|
pqStandardDevGainList.add(pqStandardDevGain);
|
||||||
|
DetectionServiceImpl.VAndIResult vAndIResult = DetectionServiceImpl.vAndIResultMap.get(ip + CnSocketUtil.SPLIT_TAG + (gf.getUMonitorPoint() + 1));
|
||||||
|
if (ObjectUtil.isNotNull(vAndIResult)) {
|
||||||
|
int maxNum = pqStandardDevGainRecordService.getMaxNum(stdDevMonitorId, devMonitorId);
|
||||||
|
PqStandardDevGainRecord record = new PqStandardDevGainRecord();
|
||||||
|
record.setStdDevMonitorId(stdDevMonitorId);
|
||||||
|
record.setDevMonitorId(devMonitorId);
|
||||||
|
record.setNum(maxNum + 1);
|
||||||
|
recordList.add(record);
|
||||||
|
updateGfList(f, vAndIResult, stdDevMonitorId, maxNum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xiSocket.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$02.getValue());
|
||||||
|
devXiNumData.setGf(gfList);
|
||||||
|
xiSocket.setData(JSON.toJSONString(devXiNumData));
|
||||||
|
SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG, JSON.toJSONString(xiSocket));
|
||||||
|
|
||||||
|
// 原始系数入库
|
||||||
|
pqStandardDevGainService.add(pqStandardDevGainList);
|
||||||
|
pqStandardDevGainRecordService.addOrUpdate(recordList);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UNPROCESSED_BUSINESS:
|
||||||
|
break;
|
||||||
|
case NORMAL_RESPONSE:
|
||||||
|
break;
|
||||||
|
case DATA_RESOLVE:
|
||||||
|
break;
|
||||||
|
case COMMUNICATION_ERR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case DATA_CHNFACTOR$02:
|
||||||
|
//系数下发后的响应
|
||||||
|
switch (Objects.requireNonNull(dictDataEnumByCode)) {
|
||||||
|
case SUCCESS:
|
||||||
|
//单台装置系数下发后,需要删除集合中存在的当前装置
|
||||||
|
XiNumberManager.xiDevList.remove(0);
|
||||||
|
//继续下发每台装置系数,只到集合为空
|
||||||
|
if (CollUtil.isNotEmpty(XiNumberManager.xiDevList)) {
|
||||||
|
xiSocket.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$01.getValue());
|
||||||
|
xiSocket.setData(JSON.toJSONString(XiNumberManager.devXiNumDataMap.get(XiNumberManager.xiDevList.get(0))));
|
||||||
|
PreDetection preDetection = XiNumberManager.xiDevList.get(0);
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("devIP", preDetection.getDevIP());
|
||||||
|
map.put("chnNum", preDetection.getDevChns());
|
||||||
|
xiSocket.setData(JSON.toJSONString(map));
|
||||||
|
SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG, JSON.toJSONString(xiSocket));
|
||||||
|
} else {
|
||||||
|
//{"requestId":"Coefficient_Check","operateCode":"DATA_CHNFACTOR$02","data":"end","code":10200}
|
||||||
|
// 通知前端全部下发系数完成
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UNPROCESSED_BUSINESS:
|
||||||
|
break;
|
||||||
|
case NORMAL_RESPONSE:
|
||||||
|
break;
|
||||||
|
case DATA_RESOLVE:
|
||||||
|
//quitSend(param);
|
||||||
|
break;
|
||||||
|
case COMMUNICATION_ERR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// case DEV_DATA_REQUEST_02:
|
||||||
|
// //实时采集申请
|
||||||
|
// String data = socketDataMsg.getData();
|
||||||
|
// DevData devData = JSON.parseObject(data, DevData.class);
|
||||||
|
// if (ObjectUtil.isNotNull(dictDataEnumByCode)) {
|
||||||
|
// switch (dictDataEnumByCode) {
|
||||||
|
// case SUCCESS:
|
||||||
|
// if (devData.getResult()) {
|
||||||
|
// FormalTestManager.realDataXiList.add(devData);
|
||||||
|
// successComm.add(devData.getId());
|
||||||
|
// System.out.println(successComm.size() + " ==" + FormalTestManager.monitorIdListComm.size() + "FormalTestManager.realDataXiList:" + FormalTestManager.realDataXiList.size() + "当前步骤" + XiNumberManager.stepNumber);
|
||||||
|
// if (successComm.size() == FormalTestManager.monitorIdListComm.size()) {
|
||||||
|
// processData(param, xiSocket);
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// System.out.println("系数校准抛除数据" + devData);
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// case UNPROCESSED_BUSINESS:
|
||||||
|
// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(socketDataMsg));
|
||||||
|
// break;
|
||||||
|
// case NORMAL_RESPONSE:
|
||||||
|
// if (devData.getResult()) {
|
||||||
|
// FormalTestManager.realDataXiList.add(devData);
|
||||||
|
// } else {
|
||||||
|
// System.out.println("系数校准抛除数据" + devData);
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// xiSocket.setRequestId(socketDataMsg.getRequestId());
|
||||||
|
// xiSocket.setOperateCode(socketDataMsg.getOperateCode());
|
||||||
|
// xiSocket.setData(dictDataEnumByCode.getMessage());
|
||||||
|
// WebServiceManager.sendMsg(param.getUserPageId(), JSON.toJSONString(xiSocket));
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
default:
|
||||||
|
WebServiceManager.sendUnknownErrorMessage(param.getUserPageId());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退出检测返回
|
* 退出检测返回
|
||||||
@@ -1889,13 +2045,13 @@ public class SocketContrastResponseService {
|
|||||||
*/
|
*/
|
||||||
private Integer getTargetCount() {
|
private Integer getTargetCount() {
|
||||||
if (FormalTestManager.isPstData) {
|
if (FormalTestManager.isPstData) {
|
||||||
return FormalTestManager.curretntTestPlanConfig.getFlicker();
|
return FormalTestManager.curretntTestPlanConfig.getFlicker() * 2;
|
||||||
}
|
}
|
||||||
if (ObjectUtil.isNotNull(FormalTestManager.nonWaveDataSourceEnum)) {
|
if (ObjectUtil.isNotNull(FormalTestManager.nonWaveDataSourceEnum)) {
|
||||||
if (FormalTestManager.nonWaveDataSourceEnum == DataSourceEnum.REAL_DATA) {
|
if (FormalTestManager.nonWaveDataSourceEnum == DataSourceEnum.REAL_DATA) {
|
||||||
return FormalTestManager.curretntTestPlanConfig.getRealTime();
|
return FormalTestManager.curretntTestPlanConfig.getRealTime() * 2;
|
||||||
} else {
|
} else {
|
||||||
return FormalTestManager.curretntTestPlanConfig.getStatistics();
|
return FormalTestManager.curretntTestPlanConfig.getStatistics() * 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1981,8 +2137,13 @@ public class SocketContrastResponseService {
|
|||||||
isStar = true;
|
isStar = true;
|
||||||
isDelta = false;
|
isDelta = false;
|
||||||
} else {
|
} else {
|
||||||
isStar = false;
|
if (DetectionCodeEnum.STAR.getCode().equals(monitorListDTO.getConnection())) {
|
||||||
isDelta = true;
|
isStar = true;
|
||||||
|
isDelta = false;
|
||||||
|
} else {
|
||||||
|
isStar = false;
|
||||||
|
isDelta = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2085,8 +2246,13 @@ public class SocketContrastResponseService {
|
|||||||
isStar = true;
|
isStar = true;
|
||||||
isDelta = false;
|
isDelta = false;
|
||||||
} else {
|
} else {
|
||||||
isStar = false;
|
if (DetectionCodeEnum.STAR.getCode().equals(monitorListDTO.getConnection())) {
|
||||||
isDelta = true;
|
isStar = true;
|
||||||
|
isDelta = false;
|
||||||
|
} else {
|
||||||
|
isStar = false;
|
||||||
|
isDelta = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2149,7 +2315,7 @@ public class SocketContrastResponseService {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
ExcelUtil.saveExcel(alignDataFilePath, "实时数据.xlsx", sheetsList);
|
ExcelUtil.saveExcel(pathConfig.getDataPath(), "对齐数据.xlsx", sheetsList);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2306,8 +2472,13 @@ public class SocketContrastResponseService {
|
|||||||
isStar = true;
|
isStar = true;
|
||||||
isDelta = false;
|
isDelta = false;
|
||||||
} else {
|
} else {
|
||||||
isStar = false;
|
if (DetectionCodeEnum.STAR.getCode().equals(monitorListDTO.getConnection())) {
|
||||||
isDelta = true;
|
isStar = true;
|
||||||
|
isDelta = false;
|
||||||
|
} else {
|
||||||
|
isStar = false;
|
||||||
|
isDelta = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2625,18 +2796,30 @@ public class SocketContrastResponseService {
|
|||||||
devInfo = pqDevService.getDevInfo(Collections.singletonList(devId));
|
devInfo = pqDevService.getDevInfo(Collections.singletonList(devId));
|
||||||
}
|
}
|
||||||
Integer usePhaseIndex = devInfo.get(0).getUsePhaseIndex();
|
Integer usePhaseIndex = devInfo.get(0).getUsePhaseIndex();
|
||||||
|
|
||||||
List<String> allDesc = data.getSqlData().stream().map(x -> x.getDesc()).collect(Collectors.toList());
|
List<String> allDesc = data.getSqlData().stream().map(x -> x.getDesc()).collect(Collectors.toList());
|
||||||
allDesc.addAll(data.getSqlDataHarm().stream().map(x -> x.getDesc()).collect(Collectors.toList()));
|
allDesc.addAll(data.getSqlDataHarm().stream().map(x -> x.getDesc()).collect(Collectors.toList()));
|
||||||
|
|
||||||
|
String bzDevId = devId;
|
||||||
|
if (isStdDev) {
|
||||||
|
String s = FormalTestManager.pairsIdMap.inverse().get(devId + CnSocketUtil.SPLIT_TAG + splitArr[1]);
|
||||||
|
bzDevId = s.split(CnSocketUtil.SPLIT_TAG)[0];
|
||||||
|
}
|
||||||
|
PqMonitor monitor = pqMonitorService.getByDevIdAndNum(bzDevId, Integer.parseInt(splitArr[1]));
|
||||||
|
DictData dictData = dictDataService.getById(monitor.getConnection());
|
||||||
for (DevData.SqlDataDTO sqlDataDTO : data.getSqlData()) {
|
for (DevData.SqlDataDTO sqlDataDTO : data.getSqlData()) {
|
||||||
if (usePhaseIndex.equals(1)) {
|
if (usePhaseIndex.equals(1)) {
|
||||||
if (DetectionCodeEnum.PVRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PU1.getCode().equals(sqlDataDTO.getDesc())) {
|
if (DetectionCodeEnum.PVRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PU1.getCode().equals(sqlDataDTO.getDesc())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (DetectionCodeEnum.VRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.U1.getCode().equals(sqlDataDTO.getDesc())) {
|
if (DetectionCodeEnum.STAR.getCode().equals(dictData.getCode())) {
|
||||||
continue;
|
if (DetectionCodeEnum.PVRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PU1.getCode().equals(sqlDataDTO.getDesc())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((DetectionCodeEnum.VRMS.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.U1.getCode().equals(sqlDataDTO.getDesc()))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2684,8 +2867,14 @@ public class SocketContrastResponseService {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (DetectionCodeEnum.V2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.SV_1_49.getCode().equals(sqlDataDTO.getDesc())) {
|
if (DetectionCodeEnum.STAR.getCode().equals(dictData.getCode())) {
|
||||||
continue;
|
if (DetectionCodeEnum.PV2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.PSV_1_49.getCode().equals(sqlDataDTO.getDesc())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (DetectionCodeEnum.V2_50.getCode().equals(sqlDataDTO.getDesc()) || DetectionCodeEnum.SV_1_49.getCode().equals(sqlDataDTO.getDesc())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3322,4 +3511,46 @@ public class SocketContrastResponseService {
|
|||||||
devData.setSqlDataHarm(sqlDataHarmDTOS);
|
devData.setSqlDataHarm(sqlDataHarmDTOS);
|
||||||
return devData;
|
return devData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改通道系数
|
||||||
|
*
|
||||||
|
* @param f
|
||||||
|
*/
|
||||||
|
private void updateGfList(DevXiNumData.F f, DetectionServiceImpl.VAndIResult vAndIResult, String stdDevMonitorId, int maxNum) {
|
||||||
|
DevXiNumData.F originF = BeanUtil.copyProperties(f, DevXiNumData.F.class);
|
||||||
|
if (maxNum != 0) {
|
||||||
|
PqStandardDevGain pqStandardDevGain = pqStandardDevGainService.get(stdDevMonitorId);
|
||||||
|
originF.setUa_gain(pqStandardDevGain.getUaGain());
|
||||||
|
originF.setUb_gain(pqStandardDevGain.getUbGain());
|
||||||
|
originF.setUc_gain(pqStandardDevGain.getUcGain());
|
||||||
|
originF.setU0_gain(pqStandardDevGain.getU0Gain());
|
||||||
|
originF.setIa_gain(pqStandardDevGain.getIaGain());
|
||||||
|
originF.setIb_gain(pqStandardDevGain.getIbGain());
|
||||||
|
originF.setIc_gain(pqStandardDevGain.getIcGain());
|
||||||
|
originF.setI0_gain(pqStandardDevGain.getI0Gain());
|
||||||
|
originF.setUab_gain(pqStandardDevGain.getUabGain());
|
||||||
|
originF.setUbc_gain(pqStandardDevGain.getUbcGain());
|
||||||
|
originF.setUca_gain(pqStandardDevGain.getUcaGain());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vAndIResult.getVa() && NumberUtil.isIn(BigDecimal.valueOf(vAndIResult.getVaXi() * 10000), BigDecimal.valueOf(originF.getUa_gain() * 0.95), BigDecimal.valueOf(originF.getUa_gain() * 1.05))) {
|
||||||
|
f.setUa_gain(BigDecimal.valueOf(f.getUa_gain()).multiply(BigDecimal.valueOf(vAndIResult.getVaXi())).setScale(0, RoundingMode.HALF_UP).intValue());
|
||||||
|
}
|
||||||
|
if (vAndIResult.getVb() && NumberUtil.isIn(BigDecimal.valueOf(vAndIResult.getVbXi() * 10000), BigDecimal.valueOf(originF.getUb_gain() * 0.95), BigDecimal.valueOf(originF.getUb_gain() * 1.05))) {
|
||||||
|
f.setUb_gain(BigDecimal.valueOf(f.getUb_gain()).multiply(BigDecimal.valueOf(vAndIResult.getVbXi())).setScale(0, RoundingMode.HALF_UP).intValue());
|
||||||
|
}
|
||||||
|
if (vAndIResult.getVc() && NumberUtil.isIn(BigDecimal.valueOf(vAndIResult.getVcXi() * 10000), BigDecimal.valueOf(originF.getUc_gain() * 0.95), BigDecimal.valueOf(originF.getUc_gain() * 1.05))) {
|
||||||
|
f.setUc_gain(BigDecimal.valueOf(f.getUc_gain()).multiply(BigDecimal.valueOf(vAndIResult.getVcXi())).setScale(0, RoundingMode.HALF_UP).intValue());
|
||||||
|
}
|
||||||
|
if (vAndIResult.getIa() && NumberUtil.isIn(BigDecimal.valueOf(vAndIResult.getIaXi() * 10000), BigDecimal.valueOf(originF.getIa_gain() * 0.95), BigDecimal.valueOf(originF.getIa_gain() * 1.05))) {
|
||||||
|
f.setIa_gain(BigDecimal.valueOf(f.getIa_gain()).multiply(BigDecimal.valueOf(vAndIResult.getIaXi())).setScale(0, RoundingMode.HALF_UP).intValue());
|
||||||
|
}
|
||||||
|
if (vAndIResult.getIb() && NumberUtil.isIn(BigDecimal.valueOf(vAndIResult.getIbXi() * 10000), BigDecimal.valueOf(originF.getIb_gain() * 0.95), BigDecimal.valueOf(originF.getIb_gain() * 1.05))) {
|
||||||
|
f.setIb_gain(BigDecimal.valueOf(f.getIb_gain()).multiply(BigDecimal.valueOf(vAndIResult.getIbXi())).setScale(0, RoundingMode.HALF_UP).intValue());
|
||||||
|
}
|
||||||
|
if (vAndIResult.getIc() && NumberUtil.isIn(BigDecimal.valueOf(vAndIResult.getIcXi() * 10000), BigDecimal.valueOf(originF.getIc_gain() * 0.95), BigDecimal.valueOf(originF.getIc_gain() * 1.05))) {
|
||||||
|
f.setIc_gain(BigDecimal.valueOf(f.getIc_gain()).multiply(BigDecimal.valueOf(vAndIResult.getIcXi())).setScale(0, RoundingMode.HALF_UP).intValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.dto.DevXiNumData;
|
import com.njcn.gather.detection.pojo.dto.DevXiNumData;
|
||||||
import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.DetectionCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
||||||
@@ -33,6 +34,8 @@ import com.njcn.gather.script.pojo.param.PqScriptIssueParam;
|
|||||||
import com.njcn.gather.script.pojo.po.SourceIssue;
|
import com.njcn.gather.script.pojo.po.SourceIssue;
|
||||||
import com.njcn.gather.script.service.IPqScriptCheckDataService;
|
import com.njcn.gather.script.service.IPqScriptCheckDataService;
|
||||||
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
||||||
|
import com.njcn.gather.source.pojo.po.PqSource;
|
||||||
|
import com.njcn.gather.source.service.IPqSourceService;
|
||||||
import com.njcn.gather.storage.pojo.param.StorageParam;
|
import com.njcn.gather.storage.pojo.param.StorageParam;
|
||||||
import com.njcn.gather.storage.pojo.po.SimAndDigHarmonicResult;
|
import com.njcn.gather.storage.pojo.po.SimAndDigHarmonicResult;
|
||||||
import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult;
|
import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult;
|
||||||
@@ -76,6 +79,7 @@ public class SocketDevResponseService {
|
|||||||
private final SimAndDigHarmonicService adHarmonicService;
|
private final SimAndDigHarmonicService adHarmonicService;
|
||||||
private final IAdPlanService adPlanService;
|
private final IAdPlanService adPlanService;
|
||||||
private final IDictDataService dictDataService;
|
private final IDictDataService dictDataService;
|
||||||
|
private final IPqSourceService pqSourceService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 存储的装置相序数据
|
* 存储的装置相序数据
|
||||||
@@ -391,6 +395,7 @@ public class SocketDevResponseService {
|
|||||||
if (param.getTestItemList().get(2)) {
|
if (param.getTestItemList().get(2)) {
|
||||||
//如果后续做正式检测
|
//如果后续做正式检测
|
||||||
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
|
issueParam.setSourceId(param.getSourceName());
|
||||||
issueParam.setPlanId(param.getPlanId());
|
issueParam.setPlanId(param.getPlanId());
|
||||||
issueParam.setSourceId(param.getSourceId());
|
issueParam.setSourceId(param.getSourceId());
|
||||||
issueParam.setDevIds(param.getDevIds());
|
issueParam.setDevIds(param.getDevIds());
|
||||||
@@ -894,7 +899,7 @@ public class SocketDevResponseService {
|
|||||||
//开始下源控制脚本
|
//开始下源控制脚本
|
||||||
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
issueParam.setPlanId(param.getPlanId());
|
issueParam.setPlanId(param.getPlanId());
|
||||||
issueParam.setSourceId(param.getSourceId());
|
issueParam.setSourceId(param.getSourceName());
|
||||||
issueParam.setDevIds(param.getDevIds());
|
issueParam.setDevIds(param.getDevIds());
|
||||||
issueParam.setScriptId(param.getScriptId());
|
issueParam.setScriptId(param.getScriptId());
|
||||||
|
|
||||||
@@ -1162,8 +1167,8 @@ public class SocketDevResponseService {
|
|||||||
} else if (param.getTestItemList().get(2)) {
|
} else if (param.getTestItemList().get(2)) {
|
||||||
// 后续做正式检测
|
// 后续做正式检测
|
||||||
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
|
issueParam.setSourceId(param.getSourceName());
|
||||||
issueParam.setPlanId(param.getPlanId());
|
issueParam.setPlanId(param.getPlanId());
|
||||||
issueParam.setSourceId(param.getSourceId());
|
|
||||||
issueParam.setDevIds(param.getDevIds());
|
issueParam.setDevIds(param.getDevIds());
|
||||||
issueParam.setScriptId(param.getScriptId());
|
issueParam.setScriptId(param.getScriptId());
|
||||||
|
|
||||||
@@ -1374,8 +1379,11 @@ public class SocketDevResponseService {
|
|||||||
checkDataParam.setIsValueTypeName(false);
|
checkDataParam.setIsValueTypeName(false);
|
||||||
List<String> valueType = iPqScriptCheckDataService.getValueType(checkDataParam);
|
List<String> valueType = iPqScriptCheckDataService.getValueType(checkDataParam);
|
||||||
|
|
||||||
iPqDevService.updateResult(param.getDevIds(), valueType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity());
|
iPqDevService.updateResult(param.getDevIds(), valueType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity(), true);
|
||||||
CnSocketUtil.quitSend(param);
|
CnSocketUtil.quitSend(param);
|
||||||
|
// 数模式检测全部小项完成 → 释放锁,避免用户必须点"停止"才能让出
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "DEV_TEST_FINISHED");
|
||||||
}
|
}
|
||||||
successComm.clear();
|
successComm.clear();
|
||||||
FormalTestManager.realDataXiList.clear();
|
FormalTestManager.realDataXiList.clear();
|
||||||
@@ -1795,6 +1803,94 @@ public class SocketDevResponseService {
|
|||||||
if (param.getTestItemList().get(1)) {
|
if (param.getTestItemList().get(1)) {
|
||||||
initXiManager(param);
|
initXiManager(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FormalTestManager.overload = getOverloadResult(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取过载测试结果
|
||||||
|
*
|
||||||
|
* @return 如果检测到电压过载,overload=1;如果检测到电流过载,overload=2;如果检测到电压&&电流过载,overload=3;反之,overload=4
|
||||||
|
*/
|
||||||
|
private int getOverloadResult(PreDetectionParam param) {
|
||||||
|
PqSource pqSource = pqSourceService.getPqSourceById(param.getSourceId());
|
||||||
|
BigDecimal maxVoltage = pqSource.getMaxVoltage();
|
||||||
|
BigDecimal maxCurrent = pqSource.getMaxCurrent();
|
||||||
|
|
||||||
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
|
issueParam.setSourceId(pqSource.getName());
|
||||||
|
issueParam.setPlanId(param.getPlanId());
|
||||||
|
issueParam.setDevIds(param.getDevIds());
|
||||||
|
issueParam.setScriptId(param.getScriptId());
|
||||||
|
issueParam.setIsPhaseSequence(CommonEnum.FORMAL_TEST.getValue());
|
||||||
|
List<SourceIssue> sourceIssues = pqScriptDtlsService.listSourceIssue(issueParam);
|
||||||
|
|
||||||
|
for (int i = 0; i < sourceIssues.size(); i++) {
|
||||||
|
SourceIssue sourceIssue = sourceIssues.get(i);
|
||||||
|
List<SourceIssue.ChannelListDTO> channelList = sourceIssue.getChannelList();
|
||||||
|
for (int j = 0; j < channelList.size(); j++) {
|
||||||
|
SourceIssue.ChannelListDTO channelListDTO = channelList.get(j);
|
||||||
|
Double fAmp = channelListDTO.getFAmp();
|
||||||
|
String channelType = channelListDTO.getChannelType();
|
||||||
|
|
||||||
|
if (ObjectUtil.isNotNull(fAmp)) {
|
||||||
|
if (channelType.contains("U")) {
|
||||||
|
// 电压判断
|
||||||
|
if (maxVoltage.compareTo(BigDecimal.valueOf(fAmp)) < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 电流判断
|
||||||
|
if (maxCurrent.compareTo(BigDecimal.valueOf(fAmp)) < 0) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 暂态判断
|
||||||
|
if (channelListDTO.getDipFlag()) {
|
||||||
|
SourceIssue.ChannelListDTO.DipDataDTO dipData = channelListDTO.getDipData();
|
||||||
|
if (ObjectUtil.isNotNull(dipData)) {
|
||||||
|
Double fTransValue = dipData.getFTransValue();
|
||||||
|
if (ObjectUtil.isNotNull(fTransValue) && ObjectUtil.isNotNull(fAmp)) {
|
||||||
|
if (maxVoltage.compareTo(BigDecimal.valueOf(fTransValue / 100).max(BigDecimal.valueOf(fAmp))) < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 谐波判断
|
||||||
|
if (channelListDTO.getHarmFlag()) {
|
||||||
|
List<SourceIssue.ChannelListDTO.HarmModel> harmList = channelListDTO.getHarmList();
|
||||||
|
double sum = harmList.stream().map(harmModel -> harmModel.getFAmp() * harmModel.getFAmp() / 10000).mapToDouble(x -> x).sum();
|
||||||
|
if (channelType.contains("U")) {
|
||||||
|
if (maxVoltage.compareTo(BigDecimal.valueOf(Math.sqrt(1 + sum) * fAmp)) < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (maxCurrent.compareTo(BigDecimal.valueOf(Math.sqrt(1 + sum) * fAmp)) < 0) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 间谐波判断
|
||||||
|
if (channelListDTO.getInHarmFlag()) {
|
||||||
|
List<SourceIssue.ChannelListDTO.InharmModel> inharmList = channelListDTO.getInharmList();
|
||||||
|
double sum = inharmList.stream().map(harmModel -> harmModel.getFAmp() * harmModel.getFAmp() / 10000).mapToDouble(x -> x).sum();
|
||||||
|
if (channelType.contains("U")) {
|
||||||
|
if (maxVoltage.compareTo(BigDecimal.valueOf(Math.sqrt(1 + sum) * fAmp)) < 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (maxCurrent.compareTo(BigDecimal.valueOf(Math.sqrt(1 + sum) * fAmp)) < 0) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
//初始化系数校验参数
|
//初始化系数校验参数
|
||||||
@@ -1816,8 +1912,8 @@ public class SocketDevResponseService {
|
|||||||
XiNumberManager.devParameterList.add(devParameterSmall);
|
XiNumberManager.devParameterList.add(devParameterSmall);
|
||||||
|
|
||||||
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
|
issueParam.setSourceId(param.getSourceName());
|
||||||
issueParam.setPlanId(param.getPlanId());
|
issueParam.setPlanId(param.getPlanId());
|
||||||
issueParam.setSourceId(param.getSourceId());
|
|
||||||
issueParam.setDevIds(param.getDevIds());
|
issueParam.setDevIds(param.getDevIds());
|
||||||
issueParam.setScriptId(param.getScriptId());
|
issueParam.setScriptId(param.getScriptId());
|
||||||
issueParam.setIsPhaseSequence(CommonEnum.COEFFICIENT_TEST.getValue());
|
issueParam.setIsPhaseSequence(CommonEnum.COEFFICIENT_TEST.getValue());
|
||||||
|
|||||||
@@ -384,18 +384,27 @@ public class SocketSourceResponseService {
|
|||||||
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + type);
|
socketMsg.setRequestId(SourceOperateCodeEnum.FORMAL_REAL.getValue() + CnSocketUtil.STEP_TAG + type);
|
||||||
SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg));
|
SocketManager.sendMsg(param.getUserPageId() + CnSocketUtil.SOURCE_TAG, JSON.toJSONString(socketMsg));
|
||||||
} else {
|
} else {
|
||||||
//todo 前端推送收到的消息暂未处理好
|
// 推送过载测试结果
|
||||||
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
|
SocketDataMsg overloadSocketDataMsg = new SocketDataMsg();
|
||||||
//开始设备通讯检测(发送设备初始化)
|
overloadSocketDataMsg.setRequestId("overloadTest");
|
||||||
Map<String, List<PreDetection>> map = new HashMap<>(1);
|
overloadSocketDataMsg.setCode(FormalTestManager.overload);
|
||||||
map.put("deviceList", FormalTestManager.devList);
|
sendWebSocketMessage(param.getUserPageId(), overloadSocketDataMsg);
|
||||||
String jsonString = JSON.toJSONString(map);
|
if (FormalTestManager.overload != 4) {
|
||||||
socketMsg.setRequestId(SourceOperateCodeEnum.YJC_SBTXJY.getValue());
|
CnSocketUtil.quitSendSource(param);
|
||||||
socketMsg.setOperateCode(SourceOperateCodeEnum.DEV_INIT_GATHER_01.getValue());
|
} else {
|
||||||
socketMsg.setData(jsonString);
|
//todo 前端推送收到的消息暂未处理好
|
||||||
String json = JSON.toJSONString(socketMsg);
|
sendWebSocketMessage(param.getUserPageId(), socketDataMsg);
|
||||||
// 使用智能发送工具类,自动管理设备连接
|
//开始设备通讯检测(发送设备初始化)
|
||||||
socketManager.smartSendToDevice(param, json);
|
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;
|
break;
|
||||||
case UNPROCESSED_BUSINESS:
|
case UNPROCESSED_BUSINESS:
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.njcn.gather.detection.lock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测互斥锁对象(不可变)。
|
||||||
|
* 字段含义见 docs/superpowers/specs/2026-05-28-单用户检测互斥-design.md §2.1
|
||||||
|
*/
|
||||||
|
public final class DetectionLock {
|
||||||
|
|
||||||
|
private final String userId;
|
||||||
|
private final String userName;
|
||||||
|
private final String userPageId;
|
||||||
|
private final long acquireTime;
|
||||||
|
private final long expireAt;
|
||||||
|
|
||||||
|
public DetectionLock(String userId, String userName, String userPageId,
|
||||||
|
long acquireTime, long expireAt) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.userName = userName;
|
||||||
|
this.userPageId = userPageId;
|
||||||
|
this.acquireTime = acquireTime;
|
||||||
|
this.expireAt = expireAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId() { return userId; }
|
||||||
|
public String getUserName() { return userName; }
|
||||||
|
public String getUserPageId() { return userPageId; }
|
||||||
|
public long getAcquireTime() { return acquireTime; }
|
||||||
|
public long getExpireAt() { return expireAt; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
package com.njcn.gather.detection.lock;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import com.njcn.gather.detection.pojo.vo.DetectionLockHolderVO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测互斥锁管理器(进程内单例)。
|
||||||
|
* 详细设计:docs/superpowers/specs/2026-05-28-单用户检测互斥-design.md
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public final class DetectionLockManager {
|
||||||
|
|
||||||
|
private static final long LOCK_MAX_HOLD_MS = TimeUnit.HOURS.toMillis(4);
|
||||||
|
|
||||||
|
private static final DetectionLockManager INSTANCE = new DetectionLockManager();
|
||||||
|
|
||||||
|
public static DetectionLockManager getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final AtomicReference<DetectionLock> current = new AtomicReference<>(null);
|
||||||
|
|
||||||
|
private DetectionLockManager() {}
|
||||||
|
|
||||||
|
/** 抢锁。同账号视为重入(刷新 page/expireAt)。 */
|
||||||
|
public AcquireResult tryAcquire(String userId, String userName, String userPageId) {
|
||||||
|
for (int attempt = 0; attempt < 2; attempt++) {
|
||||||
|
DetectionLock cur = current.get();
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
// 空闲 或 绝对超时已过 → 直接抢
|
||||||
|
if (cur == null || now > cur.getExpireAt()) {
|
||||||
|
DetectionLock fresh = new DetectionLock(userId, userName, userPageId, now, now + LOCK_MAX_HOLD_MS);
|
||||||
|
if (current.compareAndSet(cur, fresh)) {
|
||||||
|
log.info("DetectionLock acquired by userId={}, userName={}, userPageId={}", userId, userName, userPageId);
|
||||||
|
return AcquireResult.ok();
|
||||||
|
}
|
||||||
|
continue; // CAS 失败重试
|
||||||
|
}
|
||||||
|
// 同账号重入 → 刷新
|
||||||
|
if (userId.equals(cur.getUserId())) {
|
||||||
|
DetectionLock refreshed = new DetectionLock(userId, userName, userPageId, now, now + LOCK_MAX_HOLD_MS);
|
||||||
|
if (current.compareAndSet(cur, refreshed)) {
|
||||||
|
log.debug("DetectionLock reentered by userId={}, new userPageId={}", userId, userPageId);
|
||||||
|
return AcquireResult.ok();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 被他人持有
|
||||||
|
return AcquireResult.busy(toHolderVO(cur));
|
||||||
|
}
|
||||||
|
// 两次 CAS 都失败属于罕见高并发场景:绝不返回 ok()(那样会让调用方误以为持锁)。
|
||||||
|
// 返回 busy,data 可能为 null(锁刚被释放);调用方/前端按"请重试"处理。
|
||||||
|
DetectionLock cur = current.get();
|
||||||
|
return AcquireResult.busy(cur == null ? null : toHolderVO(cur));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 仅当 holder.userId == userId 才释放(幂等)。
|
||||||
|
* 循环终止性:每轮 CAS 失败意味着 current 被其他线程改写;
|
||||||
|
* 下一轮 get 后 cur 可能变成 null 或不再匹配 userId,命中前置 return 退出。
|
||||||
|
* 唯一可能继续的情况是另一线程把它换成了同 userId 的新 lock,下一轮 CAS 会再次尝试;
|
||||||
|
* 最坏情况下 CAS 成功,仍然终止。 */
|
||||||
|
public void releaseIfHeldBy(String userId, String reason) {
|
||||||
|
while (true) {
|
||||||
|
DetectionLock cur = current.get();
|
||||||
|
if (cur == null || !cur.getUserId().equals(userId)) return;
|
||||||
|
if (current.compareAndSet(cur, null)) {
|
||||||
|
log.info("DetectionLock released, reason={}, userId={}", reason, userId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 仅当 holder.userPageId == userPageId 才释放(幂等)。终止性同 releaseIfHeldBy。 */
|
||||||
|
public void releaseIfMatchPage(String userPageId, String reason) {
|
||||||
|
while (true) {
|
||||||
|
DetectionLock cur = current.get();
|
||||||
|
if (cur == null || !cur.getUserPageId().equals(userPageId)) return;
|
||||||
|
if (current.compareAndSet(cur, null)) {
|
||||||
|
log.info("DetectionLock released, reason={}, userPageId={}", reason, userPageId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 管理员强制释放,不校验 holder。 */
|
||||||
|
public void forceRelease(String operatorUserId, String reason) {
|
||||||
|
DetectionLock cur = current.getAndSet(null);
|
||||||
|
if (cur != null) {
|
||||||
|
log.warn("DetectionLock force-released by operator={}, victim userId={}, reason={}",
|
||||||
|
operatorUserId, cur.getUserId(), reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 返回当前 holder 快照;返回 null 表示空闲。 */
|
||||||
|
public DetectionLock getCurrent() {
|
||||||
|
DetectionLock cur = current.get();
|
||||||
|
// 顺手做惰性超时回收(spec R5)
|
||||||
|
if (cur != null && System.currentTimeMillis() > cur.getExpireAt()) {
|
||||||
|
current.compareAndSet(cur, null);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 把 DetectionLock 转成给前端的 VO。 */
|
||||||
|
public static DetectionLockHolderVO toHolderVO(DetectionLock lock) {
|
||||||
|
DetectionLockHolderVO vo = new DetectionLockHolderVO();
|
||||||
|
vo.setHolderUserId(lock.getUserId());
|
||||||
|
vo.setHolderUserName(lock.getUserName());
|
||||||
|
vo.setAcquireTime(new Date(lock.getAcquireTime()));
|
||||||
|
vo.setExpireAt(new Date(lock.getExpireAt()));
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 抢锁结果。 */
|
||||||
|
public static final class AcquireResult {
|
||||||
|
private final boolean ok;
|
||||||
|
private final DetectionLockHolderVO holder;
|
||||||
|
|
||||||
|
private AcquireResult(boolean ok, DetectionLockHolderVO holder) {
|
||||||
|
this.ok = ok;
|
||||||
|
this.holder = holder;
|
||||||
|
}
|
||||||
|
public static AcquireResult ok() { return new AcquireResult(true, null); }
|
||||||
|
public static AcquireResult busy(DetectionLockHolderVO holder) { return new AcquireResult(false, holder); }
|
||||||
|
public boolean isOk() { return ok; }
|
||||||
|
public DetectionLockHolderVO getHolder() { return holder; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,8 @@ public enum DetectionResponseEnum {
|
|||||||
|
|
||||||
|
|
||||||
SCRIPT_CHECK_DATA_NOT_EXIST("A020040","测试脚本项暂无配置" ),
|
SCRIPT_CHECK_DATA_NOT_EXIST("A020040","测试脚本项暂无配置" ),
|
||||||
EXCEED_MAX_TIME("A020041","检测次数超出最大限制!" );
|
EXCEED_MAX_TIME("A020041","检测次数超出最大限制!" ),
|
||||||
|
DETECTION_BUSY("A020042", "检测进行中");
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String message;
|
private final String message;
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ public class PreDetectionParam {
|
|||||||
*/
|
*/
|
||||||
private String sourceId;
|
private String sourceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 源名称
|
||||||
|
*/
|
||||||
|
private String sourceName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 所属误差体系
|
* 所属误差体系
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.njcn.gather.detection.pojo.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测锁持有者信息,用于在抢锁失败响应中返回给前端。
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DetectionLockHolderVO {
|
||||||
|
|
||||||
|
private String holderUserId;
|
||||||
|
private String holderUserName;
|
||||||
|
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||||
|
private Date acquireTime;
|
||||||
|
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||||
|
private Date expireAt;
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import com.njcn.gather.detection.pojo.param.ContrastDetectionParam;
|
|||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
import com.njcn.gather.detection.pojo.param.SimulateDetectionParam;
|
import com.njcn.gather.detection.pojo.param.SimulateDetectionParam;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
@@ -63,4 +64,8 @@ public interface PreDetectionService {
|
|||||||
* 导出实时数据对齐过程中的数据
|
* 导出实时数据对齐过程中的数据
|
||||||
*/
|
*/
|
||||||
void exportAlignData();
|
void exportAlignData();
|
||||||
|
|
||||||
|
boolean getCanCoefficient();
|
||||||
|
|
||||||
|
void startCoefficient();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,10 @@ import com.njcn.gather.detection.pojo.vo.DetectionData;
|
|||||||
import com.njcn.gather.detection.pojo.vo.DevLineTestResult;
|
import com.njcn.gather.detection.pojo.vo.DevLineTestResult;
|
||||||
import com.njcn.gather.detection.util.DetectionUtil;
|
import com.njcn.gather.detection.util.DetectionUtil;
|
||||||
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
||||||
|
import com.njcn.gather.detection.util.socket.FormalTestManager;
|
||||||
import com.njcn.gather.device.pojo.vo.PreDetection;
|
import com.njcn.gather.device.pojo.vo.PreDetection;
|
||||||
import com.njcn.gather.device.service.IPqDevService;
|
import com.njcn.gather.device.service.IPqDevService;
|
||||||
|
import com.njcn.gather.device.service.IPqStandardDevGainRecordService;
|
||||||
import com.njcn.gather.err.pojo.param.PqErrSysParam;
|
import com.njcn.gather.err.pojo.param.PqErrSysParam;
|
||||||
import com.njcn.gather.err.pojo.po.PqErrSysDtls;
|
import com.njcn.gather.err.pojo.po.PqErrSysDtls;
|
||||||
import com.njcn.gather.err.pojo.vo.ErrDtlsCheckDataVO;
|
import com.njcn.gather.err.pojo.vo.ErrDtlsCheckDataVO;
|
||||||
@@ -36,7 +38,10 @@ import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
|
|||||||
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
||||||
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
||||||
import com.njcn.gather.util.StorageUtil;
|
import com.njcn.gather.util.StorageUtil;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.log4j.Log4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@@ -56,6 +61,7 @@ import java.util.stream.Stream;
|
|||||||
* @description
|
* @description
|
||||||
* @date 2024/12/20 13:52
|
* @date 2024/12/20 13:52
|
||||||
*/
|
*/
|
||||||
|
@Log4j
|
||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class DetectionServiceImpl {
|
public class DetectionServiceImpl {
|
||||||
@@ -66,6 +72,7 @@ public class DetectionServiceImpl {
|
|||||||
private final ISysTestConfigService sysTestConfigService;
|
private final ISysTestConfigService sysTestConfigService;
|
||||||
private final IPqMonitorService pqMonitorService;
|
private final IPqMonitorService pqMonitorService;
|
||||||
private final IPqDevService pqDevService;
|
private final IPqDevService pqDevService;
|
||||||
|
private final IPqStandardDevGainRecordService pqStandardDevGainRecordService;
|
||||||
|
|
||||||
public static final String TYPE_A = "A";
|
public static final String TYPE_A = "A";
|
||||||
public static final String TYPE_B = "B";
|
public static final String TYPE_B = "B";
|
||||||
@@ -82,6 +89,44 @@ public class DetectionServiceImpl {
|
|||||||
private static final Integer INHARMONIC_FLAG = 1;
|
private static final Integer INHARMONIC_FLAG = 1;
|
||||||
private static final Integer HARMONIC_FLAG = 2;
|
private static final Integer HARMONIC_FLAG = 2;
|
||||||
|
|
||||||
|
// @Value("${error.removeCount:14}")
|
||||||
|
// private Integer removeErrorValueCount;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class VAndIResult {
|
||||||
|
private String ip;
|
||||||
|
private Integer chnNum;
|
||||||
|
private Boolean va;
|
||||||
|
private Boolean vb;
|
||||||
|
private Boolean vc;
|
||||||
|
private Boolean ia;
|
||||||
|
private Boolean ib;
|
||||||
|
private Boolean ic;
|
||||||
|
private Double vaXi;
|
||||||
|
private Double vbXi;
|
||||||
|
private Double vcXi;
|
||||||
|
private Double iaXi;
|
||||||
|
private Double ibXi;
|
||||||
|
private Double icXi;
|
||||||
|
// 皮尔逊相关系数
|
||||||
|
private BigDecimal pearsonCorrelationCoefficientVa;
|
||||||
|
private BigDecimal pearsonCorrelationCoefficientVb;
|
||||||
|
private BigDecimal pearsonCorrelationCoefficientVc;
|
||||||
|
private BigDecimal pearsonCorrelationCoefficientIa;
|
||||||
|
private BigDecimal pearsonCorrelationCoefficientIb;
|
||||||
|
private BigDecimal pearsonCorrelationCoefficientIc;
|
||||||
|
// 比值一致性 CV 系数
|
||||||
|
private BigDecimal cVCoefficientVa;
|
||||||
|
private BigDecimal cVCoefficientVb;
|
||||||
|
private BigDecimal cVCoefficientVc;
|
||||||
|
private BigDecimal cVCoefficientIa;
|
||||||
|
private BigDecimal cVCoefficientIb;
|
||||||
|
private BigDecimal cVCoefficientIc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, VAndIResult> vAndIResultMap = null;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始处理指标类型
|
* 开始处理指标类型
|
||||||
@@ -401,7 +446,9 @@ public class DetectionServiceImpl {
|
|||||||
fData = sourceIssue.getFFreq();
|
fData = sourceIssue.getFFreq();
|
||||||
}
|
}
|
||||||
if (P.equals(type)) {
|
if (P.equals(type)) {
|
||||||
fData = sourceIssue.getFUn() * sourceIssue.getFIn();
|
fData = sourceIssue.getFUn() * sourceIssue.getFIn() * 0.01;
|
||||||
|
Double finalFData = fData;
|
||||||
|
errDtlsCheckData.stream().forEach(x -> x.setValue(x.getValue() * finalFData));
|
||||||
}
|
}
|
||||||
SimAndDigNonHarmonicResult result = new SimAndDigNonHarmonicResult();
|
SimAndDigNonHarmonicResult result = new SimAndDigNonHarmonicResult();
|
||||||
String[] split = dev.get(0).getId().split("_");
|
String[] split = dev.get(0).getId().split("_");
|
||||||
@@ -809,6 +856,9 @@ public class DetectionServiceImpl {
|
|||||||
))
|
))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
DetectionData a = setDetectionData(isQualified, dataRule, mag, fData, dur, magErrList, channelTypeAList, TYPE_A, scale);
|
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.setAValue(JSON.toJSONString(a));
|
||||||
result.setTValue(JSON.toJSONString(a));
|
result.setTValue(JSON.toJSONString(a));
|
||||||
result.setResultFlag(a.getIsData());
|
result.setResultFlag(a.getIsData());
|
||||||
@@ -1569,6 +1619,23 @@ public class DetectionServiceImpl {
|
|||||||
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(testItemCodeList)) {
|
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(testItemCodeList)) {
|
||||||
devDataList = devDataList.stream().sorted(Comparator.comparing(DevData::getTime)).collect(Collectors.toList());
|
devDataList = devDataList.stream().sorted(Comparator.comparing(DevData::getTime)).collect(Collectors.toList());
|
||||||
standardDevDataList = standardDevDataList.stream().sorted(Comparator.comparing(DevData::getTime)).collect(Collectors.toList());
|
standardDevDataList = standardDevDataList.stream().sorted(Comparator.comparing(DevData::getTime)).collect(Collectors.toList());
|
||||||
|
|
||||||
|
boolean isRemoveMaxElement = ObjectUtil.isNotNull(waveNum) ? false : true;
|
||||||
|
// List<Double> freqStdDevData = standardDevDataList.stream().flatMap(standardDevData -> standardDevData.getSqlData().stream())
|
||||||
|
// .filter(sqlDataDTO -> DetectionCodeEnum.FREQ.getCode().equals(sqlDataDTO.getDesc()))
|
||||||
|
// .map(sqlDataDTO -> sqlDataDTO.getList().getT()).collect(Collectors.toList());
|
||||||
|
|
||||||
|
// Double maxFreq = CollUtil.isNotEmpty(freqStdDevData) ? CollUtil.max(freqStdDevData) : null;
|
||||||
|
// Double minFreq = CollUtil.isNotEmpty(freqStdDevData) ? CollUtil.min(freqStdDevData) : null;
|
||||||
|
|
||||||
|
// if (maxFreq != null && minFreq != null) {
|
||||||
|
// isRemoveMaxElement = DictDataEnum.AVG_VALUE.equals(dataRule);
|
||||||
|
// double freqErrorValue = maxFreq - minFreq;
|
||||||
|
// if (NumberUtil.isGreaterOrEqual(BigDecimal.valueOf(freqErrorValue), BigDecimal.valueOf(0.02))) {
|
||||||
|
// isRemoveMaxElement = isRemoveMaxElement && true;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// 处理谐波数据
|
// 处理谐波数据
|
||||||
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
||||||
String[] split1 = devDataList.get(0).getId().split("_");
|
String[] split1 = devDataList.get(0).getId().split("_");
|
||||||
@@ -1615,12 +1682,12 @@ public class DetectionServiceImpl {
|
|||||||
// sqlData.setList(listDTO);
|
// sqlData.setList(listDTO);
|
||||||
// }));
|
// }));
|
||||||
// }
|
// }
|
||||||
resultMap.put(PowerIndexEnum.FREQ.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fHz, DetectionCodeEnum.FREQ.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.FREQ.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fHz, DetectionCodeEnum.FREQ.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case VRMS:
|
case VRMS:
|
||||||
case PVRMS:
|
case PVRMS:
|
||||||
// 如果是角型接法且存在角型接法的一些指标,则不进行使用角型接线的指标。反之,则使用相别的指标。
|
// 如果是角型接法且存在角型接法的一些指标,则不进行使用角型接线的指标。反之,则使用相别的指标。
|
||||||
resultMap.put(PowerIndexEnum.V.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, (isDelta && isExitDelta ? DetectionCodeEnum.PVRMS.getCode() : DetectionCodeEnum.VRMS.getCode()), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.V.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fUn, (isDelta && isExitDelta ? DetectionCodeEnum.PVRMS.getCode() : DetectionCodeEnum.VRMS.getCode()), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case IRMS:
|
case IRMS:
|
||||||
// if (ObjectUtil.isNotNull(waveNum) && (waveNum.equals(2) || waveNum.equals(5))) {
|
// if (ObjectUtil.isNotNull(waveNum) && (waveNum.equals(2) || waveNum.equals(5))) {
|
||||||
@@ -1631,33 +1698,33 @@ public class DetectionServiceImpl {
|
|||||||
// sqlData.setList(listDTO);
|
// sqlData.setList(listDTO);
|
||||||
// }));
|
// }));
|
||||||
// }
|
// }
|
||||||
resultMap.put(PowerIndexEnum.I.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fIn, DetectionCodeEnum.IRMS.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.I.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, true, fIn, DetectionCodeEnum.IRMS.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case V_UNBAN:
|
case V_UNBAN:
|
||||||
resultMap.put(PowerIndexEnum.IMBV.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fUn, DetectionCodeEnum.V_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.IMBV.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fUn, DetectionCodeEnum.V_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case I_UNBAN:
|
case I_UNBAN:
|
||||||
resultMap.put(PowerIndexEnum.IMBA.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fIn, DetectionCodeEnum.I_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.IMBA.getKey(), isQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, false, fIn, DetectionCodeEnum.I_UNBAN.getCode(), dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case V2_50:
|
case V2_50:
|
||||||
case PV2_50:
|
case PV2_50:
|
||||||
resultMap.put(PowerIndexEnum.HV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.HV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case I2_50:
|
case I2_50:
|
||||||
resultMap.put(PowerIndexEnum.HI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.HI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case P2_50:
|
case P2_50:
|
||||||
resultMap.put(PowerIndexEnum.HP.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, HP, fUn * fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.HP.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, HP, fUn * fIn, HARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case SV_1_49:
|
case SV_1_49:
|
||||||
case PSV_1_49:
|
case PSV_1_49:
|
||||||
resultMap.put(PowerIndexEnum.HSV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.HSV.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, U, fUn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case SI_1_49:
|
case SI_1_49:
|
||||||
resultMap.put(PowerIndexEnum.HSI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum));
|
resultMap.put(PowerIndexEnum.HSI.getKey(), isHarmQualified(devDataList, standardDevDataList, devIdMapComm, pqErrSysDtls, I, fIn, INHARMONIC_FLAG, isDelta && isExitDelta, dataRule, num, code, oneConfig.getScale(), waveNum, dataSourceEnum, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case PST:
|
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, isRemoveMaxElement));
|
||||||
break;
|
break;
|
||||||
case UNKNOWN_ERROR:
|
case UNKNOWN_ERROR:
|
||||||
break;
|
break;
|
||||||
@@ -1731,22 +1798,29 @@ public class DetectionServiceImpl {
|
|||||||
String code,
|
String code,
|
||||||
Integer scale,
|
Integer scale,
|
||||||
Integer waveNum,
|
Integer waveNum,
|
||||||
DataSourceEnum dataSourceEnum) {
|
DataSourceEnum dataSourceEnum,
|
||||||
|
boolean isRemoveMaxElement) {
|
||||||
List<ContrastNonHarmonicResult> info = new ArrayList<>();
|
List<ContrastNonHarmonicResult> info = new ArrayList<>();
|
||||||
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) {
|
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) {
|
||||||
|
|
||||||
Map<String, List<List<Double>>> map = devListMap(devDataList, standardDevDataList, desc, dataRule);
|
Map<String, List<List<Double>>> phaseValueList = this.getPhaseValueList(devDataList, standardDevDataList, desc);
|
||||||
|
Map<String, List<List<Double>>> map = devListMap(phaseValueList, dataRule, isRemoveMaxElement);
|
||||||
if (ObjectUtil.isNull(map)) {
|
if (ObjectUtil.isNull(map)) {
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
ContrastNonHarmonicResult result = new ContrastNonHarmonicResult();
|
ContrastNonHarmonicResult result = new ContrastNonHarmonicResult();
|
||||||
result.setWaveNum(waveNum);
|
result.setWaveNum(waveNum);
|
||||||
|
|
||||||
String[] split1 = devDataList.get(0).getId().split(CnSocketUtil.SPLIT_TAG);
|
String devId = devDataList.get(0).getId();
|
||||||
String[] split2 = standardDevDataList.get(0).getId().split(CnSocketUtil.SPLIT_TAG);
|
String stdId = standardDevDataList.get(0).getId();
|
||||||
|
|
||||||
|
String[] split1 = devId.split(CnSocketUtil.SPLIT_TAG);
|
||||||
|
String[] split2 = stdId.split(CnSocketUtil.SPLIT_TAG);
|
||||||
result.setNum(num);
|
result.setNum(num);
|
||||||
result.setDevMonitorId(devIdMapComm.get(split1[0]) + "_" + split1[1]);
|
String devMonitorId = devIdMapComm.get(split1[0]) + "_" + split1[1];
|
||||||
result.setStdDevMonitorId(devIdMapComm.get(split2[0]) + "_" + split2[1]);
|
result.setDevMonitorId(devMonitorId);
|
||||||
|
String stdDevMonitorId = devIdMapComm.get(split2[0]) + "_" + split2[1];
|
||||||
|
result.setStdDevMonitorId(stdDevMonitorId);
|
||||||
result.setAdType(errSysDtls.get(0).getScriptType());
|
result.setAdType(errSysDtls.get(0).getScriptType());
|
||||||
result.setDataType(dataSourceEnum.getValue());
|
result.setDataType(dataSourceEnum.getValue());
|
||||||
if (ObjectUtil.isNotNull(waveNum)) {
|
if (ObjectUtil.isNotNull(waveNum)) {
|
||||||
@@ -1787,6 +1861,78 @@ public class DetectionServiceImpl {
|
|||||||
List<DetectionData> phaseList = rangeComparisonList(map.get(phase).get(0), map.get(phase).get(1), 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);
|
this.setValidGroupNum(phaseList, validGroupNum);
|
||||||
resultFlag.addAll(phaseList);
|
resultFlag.addAll(phaseList);
|
||||||
|
if (FormalTestManager.isTesting && ObjectUtil.isNull(waveNum)) { //只有“正式检测并且不是录波数据”的时候才能进入这段代码,重新计算、切换误差体系额操作不会进入这段代码,提升效率。
|
||||||
|
// if (true) { //只有“正式检测并且不是录波数据”的时候才能进入这段代码,重新计算、切换误差体系额操作不会进入这段代码,提升效率。
|
||||||
|
if (DetectionCodeEnum.PVRMS.getCode().equals(desc) || DetectionCodeEnum.VRMS.getCode().equals(desc) || DetectionCodeEnum.IRMS.getCode().equals(desc)) {
|
||||||
|
Integer phaseResultFlag = setResultFlag(phaseList);
|
||||||
|
boolean b = phaseResultFlag == 2 ? true : false;
|
||||||
|
|
||||||
|
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
|
||||||
|
if (b && oneConfig.getCoefficient() == 1) {
|
||||||
|
BigDecimal pearsonCorrelationCoefficient = DetectionUtil.getPearsonCorrelationCoefficient(phaseValueList.get(phase).get(0), phaseValueList.get(phase).get(1));
|
||||||
|
if (NumberUtil.isGreaterOrEqual(pearsonCorrelationCoefficient, BigDecimal.valueOf(0.8))) {
|
||||||
|
BigDecimal cvCoefficient = DetectionUtil.getCvCoefficient(phaseValueList.get(phase).get(0), phaseValueList.get(phase).get(1));
|
||||||
|
if (NumberUtil.isLess(cvCoefficient, BigDecimal.valueOf(0.05))) {
|
||||||
|
int maxNum = pqStandardDevGainRecordService.getMaxNum(stdDevMonitorId, devMonitorId);
|
||||||
|
// 如果没有超出次数限制
|
||||||
|
if (maxNum + 1 <= 5) {
|
||||||
|
VAndIResult vAndIResult = vAndIResultMap.getOrDefault(stdId, new VAndIResult(split2[0], Integer.valueOf(split2[1]), false, false, false, false, false, false,
|
||||||
|
1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||||
|
BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO,
|
||||||
|
BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.2)));
|
||||||
|
|
||||||
|
Double newXi = DetectionUtil.getNewXi(map.get(phase).get(0), map.get(phase).get(1));
|
||||||
|
switch (phase) {
|
||||||
|
case TYPE_A:
|
||||||
|
if (DetectionCodeEnum.IRMS.getCode().equals(desc)) {
|
||||||
|
vAndIResult.setIa(b);
|
||||||
|
vAndIResult.setIaXi(newXi);
|
||||||
|
vAndIResult.setPearsonCorrelationCoefficientIa(pearsonCorrelationCoefficient);
|
||||||
|
vAndIResult.setCVCoefficientIa(cvCoefficient);
|
||||||
|
} else {
|
||||||
|
vAndIResult.setVa(b);
|
||||||
|
vAndIResult.setVaXi(newXi);
|
||||||
|
vAndIResult.setPearsonCorrelationCoefficientVa(pearsonCorrelationCoefficient);
|
||||||
|
vAndIResult.setCVCoefficientVa(cvCoefficient);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_B:
|
||||||
|
if (DetectionCodeEnum.IRMS.getCode().equals(desc)) {
|
||||||
|
vAndIResult.setIb(b);
|
||||||
|
vAndIResult.setIbXi(newXi);
|
||||||
|
vAndIResult.setPearsonCorrelationCoefficientIb(pearsonCorrelationCoefficient);
|
||||||
|
vAndIResult.setCVCoefficientIb(cvCoefficient);
|
||||||
|
} else {
|
||||||
|
vAndIResult.setVb(b);
|
||||||
|
vAndIResult.setVbXi(newXi);
|
||||||
|
vAndIResult.setPearsonCorrelationCoefficientVb(pearsonCorrelationCoefficient);
|
||||||
|
vAndIResult.setCVCoefficientVb(cvCoefficient);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TYPE_C:
|
||||||
|
if (DetectionCodeEnum.IRMS.getCode().equals(desc)) {
|
||||||
|
vAndIResult.setIc(b);
|
||||||
|
vAndIResult.setIcXi(newXi);
|
||||||
|
vAndIResult.setPearsonCorrelationCoefficientIc(pearsonCorrelationCoefficient);
|
||||||
|
vAndIResult.setCVCoefficientIc(cvCoefficient);
|
||||||
|
} else {
|
||||||
|
vAndIResult.setVc(b);
|
||||||
|
vAndIResult.setVcXi(newXi);
|
||||||
|
vAndIResult.setPearsonCorrelationCoefficientVc(pearsonCorrelationCoefficient);
|
||||||
|
vAndIResult.setCVCoefficientVc(cvCoefficient);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vAndIResultMap.put(stdId, vAndIResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BiConsumer<ContrastNonHarmonicResult, List<DetectionData>> setter = setters.get(phase);
|
BiConsumer<ContrastNonHarmonicResult, List<DetectionData>> setter = setters.get(phase);
|
||||||
setter.accept(result, phaseList);
|
setter.accept(result, phaseList);
|
||||||
}
|
}
|
||||||
@@ -1996,7 +2142,8 @@ public class DetectionServiceImpl {
|
|||||||
String code,
|
String code,
|
||||||
Integer scale,
|
Integer scale,
|
||||||
Integer waveNum,
|
Integer waveNum,
|
||||||
DataSourceEnum dataSourceEnum) {
|
DataSourceEnum dataSourceEnum,
|
||||||
|
boolean isRemoveMaxElement) {
|
||||||
List<ContrastHarmonicResult> info = new ArrayList<>();
|
List<ContrastHarmonicResult> info = new ArrayList<>();
|
||||||
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) {
|
if (CollUtil.isNotEmpty(devDataList) && CollUtil.isNotEmpty(standardDevDataList) && CollUtil.isNotEmpty(errSysDtls)) {
|
||||||
String fundCode = "";
|
String fundCode = "";
|
||||||
@@ -2031,7 +2178,7 @@ public class DetectionServiceImpl {
|
|||||||
harmCode = DetectionCodeEnum.P2_50.getCode();
|
harmCode = DetectionCodeEnum.P2_50.getCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, List<Map<Double, List<Double>>>> devMap = devHarmListMap(devDataList, standardDevDataList, fundCode, harmCode, harmonicFlag, dataRule);
|
Map<String, List<Map<Double, List<Double>>>> devMap = devHarmListMap(devDataList, standardDevDataList, fundCode, harmCode, harmonicFlag, dataRule, isRemoveMaxElement);
|
||||||
if (ObjectUtil.isNull(devMap)) {
|
if (ObjectUtil.isNull(devMap)) {
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
@@ -2138,14 +2285,285 @@ public class DetectionServiceImpl {
|
|||||||
/**
|
/**
|
||||||
* 处理非谐波类取值
|
* 处理非谐波类取值
|
||||||
*
|
*
|
||||||
* @param dev 被检设备原始数据
|
* @param dataRule 数据处理原则
|
||||||
* @param standardDev 与之对齐的标准设备原始数据
|
|
||||||
* @param desc 检测项
|
|
||||||
* @param dataRule 数据处理原则
|
|
||||||
*/
|
*/
|
||||||
public Map<String, List<List<Double>>> devListMap(List<DevData> dev, List<DevData> standardDev, String desc, DictDataEnum dataRule) {
|
public Map<String, List<List<Double>>> devListMap(Map<String, List<List<Double>>> phaseValueList, DictDataEnum dataRule, boolean isRemoveMaxElement) {
|
||||||
Map<String, List<List<Double>>> resultMap = new HashMap<>(3);
|
Map<String, List<List<Double>>> resultMap = new HashMap<>(3);
|
||||||
|
|
||||||
|
List<Double> aDev = new ArrayList<>();
|
||||||
|
List<Double> aStandardDev = new ArrayList<>();
|
||||||
|
|
||||||
|
if (phaseValueList.containsKey(TYPE_A)) {
|
||||||
|
if (phaseValueList.get(TYPE_A).size() >= 1) {
|
||||||
|
aDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_A).get(0), Double.class));
|
||||||
|
aStandardDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_A).get(1), Double.class));
|
||||||
|
} else {
|
||||||
|
log.error("数据异常,phaseValueList.get(TYPE_A).size()=" + phaseValueList.get(TYPE_A).size());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.equals("数据异常,phaseValueList.containsKey(TYPE_A)=" + phaseValueList.containsKey(TYPE_A));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Double> bDev = new ArrayList<>();
|
||||||
|
List<Double> bStandardDev = new ArrayList<>();
|
||||||
|
|
||||||
|
if (phaseValueList.containsKey(TYPE_B)) {
|
||||||
|
if (phaseValueList.get(TYPE_B).size() >= 1) {
|
||||||
|
bDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_B).get(0), Double.class));
|
||||||
|
bStandardDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_B).get(1), Double.class));
|
||||||
|
} else {
|
||||||
|
log.error("数据异常,phaseValueList.get(TYPE_B).size()=" + phaseValueList.get(TYPE_B).size());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.equals("数据异常,phaseValueList.containsKey(TYPE_B)=" + phaseValueList.containsKey(TYPE_B));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Double> cDev = new ArrayList<>();
|
||||||
|
List<Double> cStandardDev = new ArrayList<>();
|
||||||
|
if (phaseValueList.containsKey(TYPE_C)) {
|
||||||
|
if (phaseValueList.get(TYPE_C).size() >= 1) {
|
||||||
|
cDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_C).get(0), Double.class));
|
||||||
|
cStandardDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_C).get(1), Double.class));
|
||||||
|
} else {
|
||||||
|
log.error("数据异常,phaseValueList.get(TYPE_C).size()=" + phaseValueList.get(TYPE_C).size());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.equals("数据异常,phaseValueList.containsKey(TYPE_C)=" + phaseValueList.containsKey(TYPE_C));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Double> tDev = new ArrayList<>();
|
||||||
|
List<Double> tStandardDev = new ArrayList<>();
|
||||||
|
if (phaseValueList.containsKey(TYPE_T)) {
|
||||||
|
if (phaseValueList.get(TYPE_T).size() >= 1) {
|
||||||
|
tDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_T).get(0), Double.class));
|
||||||
|
tStandardDev.addAll(BeanUtil.copyToList(phaseValueList.get(TYPE_T).get(1), Double.class));
|
||||||
|
} else {
|
||||||
|
log.error("数据异常,phaseValueList.get(TYPE_T).size()=" + phaseValueList.get(TYPE_T).size());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.equals("数据异常,phaseValueList.containsKey(TYPE_T)=" + phaseValueList.containsKey(TYPE_T));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isRemoveMaxElement) {
|
||||||
|
List<Double> aErrorValueList = new ArrayList<>();
|
||||||
|
List<Double> bErrorValueList = new ArrayList<>();
|
||||||
|
List<Double> cErrorValueList = new ArrayList<>();
|
||||||
|
List<Double> tErrorValueList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < aStandardDev.size(); i++) {
|
||||||
|
aErrorValueList.add(Math.abs(aStandardDev.get(i) - aDev.get(i)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < bStandardDev.size(); i++) {
|
||||||
|
bErrorValueList.add(Math.abs(bStandardDev.get(i) - bDev.get(i)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < cStandardDev.size(); i++) {
|
||||||
|
cErrorValueList.add(Math.abs(cStandardDev.get(i) - cDev.get(i)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < tStandardDev.size(); i++) {
|
||||||
|
tErrorValueList.add(Math.abs(tStandardDev.get(i) - tDev.get(i)));
|
||||||
|
}
|
||||||
|
List<Integer> aErrorValueIdxs = DetectionUtil.sort(aErrorValueList, false);
|
||||||
|
List<Integer> bErrorValueIdxs = DetectionUtil.sort(bErrorValueList, false);
|
||||||
|
List<Integer> cErrorValueIdxs = DetectionUtil.sort(cErrorValueList, false);
|
||||||
|
List<Integer> tErrorValueIdxs = DetectionUtil.sort(tErrorValueList, false);
|
||||||
|
|
||||||
|
int removeCount = aErrorValueIdxs.size() / 2;
|
||||||
|
List<Double> newArray = DetectionUtil.getNewArray(aStandardDev, aErrorValueIdxs.subList(removeCount, aErrorValueIdxs.size()));
|
||||||
|
aStandardDev.clear();
|
||||||
|
aStandardDev.addAll(newArray);
|
||||||
|
newArray = DetectionUtil.getNewArray(aDev, aErrorValueIdxs.subList(removeCount, aErrorValueIdxs.size()));
|
||||||
|
aDev.clear();
|
||||||
|
aDev.addAll(newArray);
|
||||||
|
|
||||||
|
removeCount = bErrorValueIdxs.size() / 2;
|
||||||
|
newArray = DetectionUtil.getNewArray(bStandardDev, bErrorValueIdxs.subList(removeCount, bErrorValueIdxs.size()));
|
||||||
|
bStandardDev.clear();
|
||||||
|
bStandardDev.addAll(newArray);
|
||||||
|
newArray = DetectionUtil.getNewArray(bDev, bErrorValueIdxs.subList(removeCount, bErrorValueIdxs.size()));
|
||||||
|
bDev.clear();
|
||||||
|
bDev.addAll(newArray);
|
||||||
|
|
||||||
|
removeCount = cErrorValueIdxs.size() / 2;
|
||||||
|
newArray = DetectionUtil.getNewArray(cStandardDev, cErrorValueIdxs.subList(removeCount, cErrorValueIdxs.size()));
|
||||||
|
cStandardDev.clear();
|
||||||
|
cStandardDev.addAll(newArray);
|
||||||
|
newArray = DetectionUtil.getNewArray(cDev, cErrorValueIdxs.subList(removeCount, cErrorValueIdxs.size()));
|
||||||
|
cDev.clear();
|
||||||
|
cDev.addAll(newArray);
|
||||||
|
|
||||||
|
removeCount = tErrorValueIdxs.size() / 2;
|
||||||
|
newArray = DetectionUtil.getNewArray(tStandardDev, tErrorValueIdxs.subList(removeCount, tErrorValueIdxs.size()));
|
||||||
|
tStandardDev.clear();
|
||||||
|
tStandardDev.addAll(newArray);
|
||||||
|
newArray = DetectionUtil.getNewArray(tDev, tErrorValueIdxs.subList(removeCount, tErrorValueIdxs.size()));
|
||||||
|
tDev.clear();
|
||||||
|
tDev.addAll(newArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (dataRule) {
|
||||||
|
case SECTION_VALUE: {
|
||||||
|
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);
|
||||||
|
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 (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 (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 (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: {
|
||||||
|
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);
|
||||||
|
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(bStandardDev)) {
|
||||||
|
int cp95Idx = DetectionUtil.getCP95Idx(bStandardDev);
|
||||||
|
bStandardDev = Collections.singletonList(bStandardDev.get(cp95Idx));
|
||||||
|
bDev = Collections.singletonList(bDev.get(bIdxs.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(tStandardDev)) {
|
||||||
|
int cp95Idx = DetectionUtil.getCP95Idx(tStandardDev);
|
||||||
|
tStandardDev = Collections.singletonList(tStandardDev.get(cp95Idx));
|
||||||
|
tDev = Collections.singletonList(tDev.get(tIdxs.get(cp95Idx)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AVG_VALUE:
|
||||||
|
aDev = DetectionUtil.getAvgDoubles(aDev);
|
||||||
|
bDev = DetectionUtil.getAvgDoubles(bDev);
|
||||||
|
cDev = DetectionUtil.getAvgDoubles(cDev);
|
||||||
|
tDev = DetectionUtil.getAvgDoubles(tDev);
|
||||||
|
|
||||||
|
aStandardDev = DetectionUtil.getAvgDoubles(aStandardDev);
|
||||||
|
bStandardDev = DetectionUtil.getAvgDoubles(bStandardDev);
|
||||||
|
cStandardDev = DetectionUtil.getAvgDoubles(cStandardDev);
|
||||||
|
tStandardDev = DetectionUtil.getAvgDoubles(tStandardDev);
|
||||||
|
break;
|
||||||
|
case Own_value:
|
||||||
|
break;
|
||||||
|
case AT_WILL_VALUE:
|
||||||
|
if (isRemoveMaxElement) {
|
||||||
|
if (CollUtil.isNotEmpty(aStandardDev) && CollUtil.isNotEmpty(aDev)) {
|
||||||
|
aStandardDev = aStandardDev.subList(aStandardDev.size() - 1, aStandardDev.size());
|
||||||
|
aDev = aDev.subList(aDev.size() - 1, aDev.size());
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(bStandardDev) && CollUtil.isNotEmpty(bDev)) {
|
||||||
|
bStandardDev = bStandardDev.subList(bStandardDev.size() - 1, bStandardDev.size());
|
||||||
|
bDev = bDev.subList(bDev.size() - 1, bDev.size());
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(cStandardDev) && CollUtil.isNotEmpty(cDev)) {
|
||||||
|
cStandardDev = cStandardDev.subList(cStandardDev.size() - 1, cStandardDev.size());
|
||||||
|
cDev = cDev.subList(cDev.size() - 1, cDev.size());
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(tStandardDev) && CollUtil.isNotEmpty(tDev)) {
|
||||||
|
tStandardDev = tStandardDev.subList(tStandardDev.size() - 1, tStandardDev.size());
|
||||||
|
tDev = tDev.subList(tDev.size() - 1, tDev.size());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
List<Double> aErrorValueList = new ArrayList<>();
|
||||||
|
List<Double> bErrorValueList = new ArrayList<>();
|
||||||
|
List<Double> cErrorValueList = new ArrayList<>();
|
||||||
|
List<Double> tErrorValueList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < aStandardDev.size(); i++) {
|
||||||
|
aErrorValueList.add(Math.abs(aStandardDev.get(i) - aDev.get(i)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < bStandardDev.size(); i++) {
|
||||||
|
bErrorValueList.add(Math.abs(bStandardDev.get(i) - bDev.get(i)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < cStandardDev.size(); i++) {
|
||||||
|
cErrorValueList.add(Math.abs(cStandardDev.get(i) - cDev.get(i)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < tStandardDev.size(); i++) {
|
||||||
|
tErrorValueList.add(Math.abs(tStandardDev.get(i) - tDev.get(i)));
|
||||||
|
}
|
||||||
|
List<Integer> aErrorValueIdxs = DetectionUtil.sort(aErrorValueList, true);
|
||||||
|
List<Integer> bErrorValueIdxs = DetectionUtil.sort(bErrorValueList, true);
|
||||||
|
List<Integer> cErrorValueIdxs = DetectionUtil.sort(cErrorValueList, true);
|
||||||
|
List<Integer> tErrorValueIdxs = DetectionUtil.sort(tErrorValueList, true);
|
||||||
|
|
||||||
|
if (CollUtil.isNotEmpty(aStandardDev) && CollUtil.isNotEmpty(aDev)) {
|
||||||
|
Double v = aStandardDev.get(aErrorValueIdxs.get(0));
|
||||||
|
aStandardDev.clear();
|
||||||
|
aStandardDev.add(v);
|
||||||
|
v = aDev.get(aErrorValueIdxs.get(0));
|
||||||
|
aDev.clear();
|
||||||
|
aDev.add(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CollUtil.isNotEmpty(bStandardDev) && CollUtil.isNotEmpty(bDev)) {
|
||||||
|
Double v = bStandardDev.get(bErrorValueIdxs.get(0));
|
||||||
|
bStandardDev.clear();
|
||||||
|
bStandardDev.add(v);
|
||||||
|
v = bDev.get(bErrorValueIdxs.get(0));
|
||||||
|
bDev.clear();
|
||||||
|
bDev.add(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CollUtil.isNotEmpty(cStandardDev) && CollUtil.isNotEmpty(cDev)) {
|
||||||
|
Double v = cStandardDev.get(cErrorValueIdxs.get(0));
|
||||||
|
cStandardDev.clear();
|
||||||
|
cStandardDev.add(v);
|
||||||
|
v = cDev.get(cErrorValueIdxs.get(0));
|
||||||
|
cDev.clear();
|
||||||
|
cDev.add(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CollUtil.isNotEmpty(tStandardDev) && CollUtil.isNotEmpty(tDev)) {
|
||||||
|
Double v = tStandardDev.get(tErrorValueIdxs.get(0));
|
||||||
|
tStandardDev.clear();
|
||||||
|
tStandardDev.add(v);
|
||||||
|
v = tDev.get(tErrorValueIdxs.get(0));
|
||||||
|
tDev.clear();
|
||||||
|
tDev.add(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
resultMap.put(TYPE_A, Arrays.asList(aDev, aStandardDev));
|
||||||
|
resultMap.put(TYPE_B, Arrays.asList(bDev, bStandardDev));
|
||||||
|
resultMap.put(TYPE_C, Arrays.asList(cDev, cStandardDev));
|
||||||
|
if (CollUtil.isNotEmpty(tDev)) {
|
||||||
|
resultMap.put(TYPE_T, Arrays.asList(tDev, tStandardDev));
|
||||||
|
}
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, List<List<Double>>> getPhaseValueList(List<DevData> dev, List<DevData> standardDev, String desc) {
|
||||||
|
Map<String, List<List<Double>>> resultMap = new HashMap<>(3);
|
||||||
List<Double> aDev = new ArrayList<>();
|
List<Double> aDev = new ArrayList<>();
|
||||||
List<Double> aStandardDev = new ArrayList<>();
|
List<Double> aStandardDev = new ArrayList<>();
|
||||||
List<Double> bDev = new ArrayList<>();
|
List<Double> bDev = new ArrayList<>();
|
||||||
@@ -2199,87 +2617,12 @@ public class DetectionServiceImpl {
|
|||||||
.map(x -> x.getT().doubleValue())
|
.map(x -> x.getT().doubleValue())
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
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 (aStandardDev.size() > 2) {
|
|
||||||
aStandardDev.remove(aIdxs.get(0));
|
|
||||||
aStandardDev.remove(aIdxs.get(aIdxs.size() - 1));
|
|
||||||
List<Double> newArray = DetectionUtil.getNewArray(aDev, aIdxs.subList(1, aIdxs.size() - 1));
|
|
||||||
aDev.clear();
|
|
||||||
aDev.addAll(newArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bStandardDev.size() > 2) {
|
|
||||||
bStandardDev.remove(bIdxs.get(0));
|
|
||||||
bStandardDev.remove(bIdxs.get(bIdxs.size() - 1));
|
|
||||||
List<Double> newArray = DetectionUtil.getNewArray(bDev, bIdxs.subList(1, bIdxs.size() - 1));
|
|
||||||
bDev.clear();
|
|
||||||
bDev.addAll(newArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cStandardDev.size() > 2) {
|
|
||||||
cStandardDev.remove(cIdxs.get(0));
|
|
||||||
cStandardDev.remove(cIdxs.get(cIdxs.size() - 1));
|
|
||||||
List<Double> newArray = DetectionUtil.getNewArray(cDev, cIdxs.subList(1, cIdxs.size() - 1));
|
|
||||||
cDev.clear();
|
|
||||||
cDev.addAll(newArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tStandardDev.size() > 2) {
|
|
||||||
tStandardDev.remove(tIdxs.get(0));
|
|
||||||
tStandardDev.remove(tIdxs.get(tIdxs.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(aStandardDev)) {
|
|
||||||
int cp95Idx = DetectionUtil.getCP95Idx(aStandardDev);
|
|
||||||
aStandardDev = Collections.singletonList(aStandardDev.get(cp95Idx));
|
|
||||||
aDev = Collections.singletonList(aDev.get(aIdxs.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(cStandardDev)) {
|
|
||||||
int cp95Idx = DetectionUtil.getCP95Idx(cStandardDev);
|
|
||||||
cStandardDev = Collections.singletonList(cStandardDev.get(cp95Idx));
|
|
||||||
cDev = Collections.singletonList(cDev.get(cIdxs.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;
|
|
||||||
case AVG_VALUE:
|
|
||||||
aDev = DetectionUtil.getAvgDoubles(aDev);
|
|
||||||
bDev = DetectionUtil.getAvgDoubles(bDev);
|
|
||||||
cDev = DetectionUtil.getAvgDoubles(cDev);
|
|
||||||
tDev = DetectionUtil.getAvgDoubles(tDev);
|
|
||||||
|
|
||||||
aStandardDev = DetectionUtil.getAvgDoubles(aStandardDev);
|
|
||||||
bStandardDev = DetectionUtil.getAvgDoubles(bStandardDev);
|
|
||||||
cStandardDev = DetectionUtil.getAvgDoubles(cStandardDev);
|
|
||||||
tStandardDev = DetectionUtil.getAvgDoubles(tStandardDev);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
resultMap.put(TYPE_A, Arrays.asList(aDev, aStandardDev));
|
resultMap.put(TYPE_A, Arrays.asList(aDev, aStandardDev));
|
||||||
resultMap.put(TYPE_B, Arrays.asList(bDev, bStandardDev));
|
resultMap.put(TYPE_B, Arrays.asList(bDev, bStandardDev));
|
||||||
resultMap.put(TYPE_C, Arrays.asList(cDev, cStandardDev));
|
resultMap.put(TYPE_C, Arrays.asList(cDev, cStandardDev));
|
||||||
if (CollUtil.isNotEmpty(tDev)) {
|
resultMap.put(TYPE_T, Arrays.asList(tDev, tStandardDev));
|
||||||
resultMap.put(TYPE_T, Arrays.asList(tDev, tStandardDev));
|
|
||||||
}
|
|
||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2299,8 +2642,7 @@ public class DetectionServiceImpl {
|
|||||||
String fundCode,
|
String fundCode,
|
||||||
String harmCode,
|
String harmCode,
|
||||||
Integer harmonicFlag,
|
Integer harmonicFlag,
|
||||||
DictDataEnum dataRule) {
|
DictDataEnum dataRule, boolean isRemoveMaxElement) {
|
||||||
System.out.println("aaa" + dev.size() + " " + standardDev.size());
|
|
||||||
Map<String, List<Map<Double, List<Double>>>> resultMap = new HashMap<>(3);
|
Map<String, List<Map<Double, List<Double>>>> resultMap = new HashMap<>(3);
|
||||||
|
|
||||||
// key为相别、value{key为谐波次数,value为按数据处理原则处理后的数据}
|
// key为相别、value{key为谐波次数,value为按数据处理原则处理后的数据}
|
||||||
@@ -2325,27 +2667,6 @@ public class DetectionServiceImpl {
|
|||||||
first1 = devSqlData.stream().filter(j -> fundCode.equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
first1 = devSqlData.stream().filter(j -> fundCode.equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
||||||
first2 = standardDevSqlData.stream().filter(j -> fundCode.equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
first2 = standardDevSqlData.stream().filter(j -> fundCode.equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
||||||
}
|
}
|
||||||
// // 如果角型接法中,不存在线电压谐波电压基波有效值,则取相电压谐波电压基波有效值进行计算
|
|
||||||
// if (!first1.isPresent()) {
|
|
||||||
// if (DetectionCodeEnum.PU1.getCode().equals(fundCode)) {
|
|
||||||
// first1 = devSqlData.stream().filter(j -> DetectionCodeEnum.U1.getCode().equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// // 防止出现有PU1而没有PV2_50、SV_1_49的情况
|
|
||||||
// if ((DetectionCodeEnum.PV2_50.getCode().equals(harmCode) || DetectionCodeEnum.PSV_1_49.getCode().equals(harmCode)) && DetectionCodeEnum.PU1.getCode().equals(fundCode)) {
|
|
||||||
// first1 = devSqlData.stream().filter(j -> DetectionCodeEnum.U1.getCode().equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (!first2.isPresent()) {
|
|
||||||
// if (DetectionCodeEnum.PU1.getCode().equals(fundCode)) {
|
|
||||||
// first2 = devSqlData.stream().filter(j -> DetectionCodeEnum.U1.getCode().equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// // 防止出现有PU1而没有PV2_50、SV_1_49的情况
|
|
||||||
// if ((DetectionCodeEnum.PV2_50.getCode().equals(harmCode) || DetectionCodeEnum.PSV_1_49.getCode().equals(harmCode)) && DetectionCodeEnum.PU1.getCode().equals(fundCode)) {
|
|
||||||
// first2 = devSqlData.stream().filter(j -> DetectionCodeEnum.U1.getCode().equals(j.getDesc())).collect(Collectors.toList()).stream().findFirst();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
DevData.SqlDataDTO fund1 = null;
|
DevData.SqlDataDTO fund1 = null;
|
||||||
DevData.SqlDataDTO fund2 = null;
|
DevData.SqlDataDTO fund2 = null;
|
||||||
@@ -2362,23 +2683,6 @@ public class DetectionServiceImpl {
|
|||||||
if (CollUtil.isEmpty(devHarmList) || CollUtil.isEmpty(stdDevHarmList)) {
|
if (CollUtil.isEmpty(devHarmList) || CollUtil.isEmpty(stdDevHarmList)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// // 如果角型接法中,不存在线电压谐波电压含有率,则取相电压谐波电压含有率进行计算
|
|
||||||
// if (CollUtil.isEmpty(devHarmList)) {
|
|
||||||
// if (DetectionCodeEnum.PV2_50.getCode().equals(harmCode)) {
|
|
||||||
// devHarmList = dev.get(i).getSqlDataHarm().stream().filter(x -> DetectionCodeEnum.V2_50.getCode().equals(x.getDesc())).collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
// if (DetectionCodeEnum.PSV_1_49.getCode().equals(harmCode)) {
|
|
||||||
// devHarmList = dev.get(i).getSqlDataHarm().stream().filter(x -> DetectionCodeEnum.SV_1_49.getCode().equals(x.getDesc())).collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (CollUtil.isEmpty(stdDevHarmList)) {
|
|
||||||
// if (DetectionCodeEnum.PV2_50.getCode().equals(harmCode)) {
|
|
||||||
// stdDevHarmList = standardDev.get(i).getSqlDataHarm().stream().filter(x -> DetectionCodeEnum.V2_50.getCode().equals(x.getDesc())).collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
// if (DetectionCodeEnum.PSV_1_49.getCode().equals(harmCode)) {
|
|
||||||
// stdDevHarmList = standardDev.get(i).getSqlDataHarm().stream().filter(x -> DetectionCodeEnum.SV_1_49.getCode().equals(x.getDesc())).collect(Collectors.toList());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (CollUtil.isNotEmpty(devHarmList) && CollUtil.isNotEmpty(stdDevHarmList)) {
|
if (CollUtil.isNotEmpty(devHarmList) && CollUtil.isNotEmpty(stdDevHarmList)) {
|
||||||
DevData.SqlDataHarmDTO devHarm = devHarmList.get(0);
|
DevData.SqlDataHarmDTO devHarm = devHarmList.get(0);
|
||||||
@@ -2400,38 +2704,87 @@ public class DetectionServiceImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
standardDevMap.forEach((typeKey, typeValue) -> {
|
standardDevMap.forEach((phase, harmonicMap) -> {
|
||||||
typeValue.forEach((key, value) -> {
|
harmonicMap.forEach((harmonicNum, value) -> {
|
||||||
|
List<Double> devPhaseHarmData = devMap.get(phase).get(harmonicNum);
|
||||||
|
if (isRemoveMaxElement) {
|
||||||
|
List<Double> errorValueList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < value.size(); i++) {
|
||||||
|
errorValueList.add(Math.abs(value.get(i) - devPhaseHarmData.get(i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> idxErrorValueList = DetectionUtil.sort(errorValueList, false);
|
||||||
|
int removeCount = idxErrorValueList.size() / 2;
|
||||||
|
List<Double> newArray = DetectionUtil.getNewArray(value, idxErrorValueList.subList(removeCount, idxErrorValueList.size()));
|
||||||
|
value.clear();
|
||||||
|
value.addAll(newArray);
|
||||||
|
newArray = DetectionUtil.getNewArray(devPhaseHarmData, idxErrorValueList.subList(removeCount, idxErrorValueList.size()));
|
||||||
|
devPhaseHarmData.clear();
|
||||||
|
devPhaseHarmData.addAll(newArray);
|
||||||
|
}
|
||||||
|
|
||||||
if (CollUtil.isNotEmpty(value)) {
|
if (CollUtil.isNotEmpty(value)) {
|
||||||
List<Integer> idx = DetectionUtil.sort(value, false);
|
|
||||||
switch (dataRule) {
|
switch (dataRule) {
|
||||||
case SECTION_VALUE:
|
case SECTION_VALUE: {
|
||||||
|
List<Integer> idx = DetectionUtil.sort(value, false);
|
||||||
if (value.size() > 2) {
|
if (value.size() > 2) {
|
||||||
value.remove(idx.get(0));
|
value.remove(0);
|
||||||
value.remove(idx.get(idx.size() - 1));
|
value.remove(value.size() - 1);
|
||||||
List<Double> newArray = DetectionUtil.getNewArray(devMap.get(typeKey).get(key), idx.subList(1, idx.size() - 1));
|
List<Double> newArray = DetectionUtil.getNewArray(devPhaseHarmData, idx.subList(1, idx.size() - 1));
|
||||||
devMap.get(typeKey).get(key).clear();
|
devPhaseHarmData.clear();
|
||||||
devMap.get(typeKey).get(key).addAll(newArray);
|
devPhaseHarmData.addAll(newArray);
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
|
break;
|
||||||
case CP95_VALUE:
|
case CP95_VALUE:
|
||||||
if (CollUtil.isNotEmpty(value)) {
|
if (CollUtil.isNotEmpty(value)) {
|
||||||
|
List<Integer> idx = DetectionUtil.sort(value, false);
|
||||||
int cp95Idx = DetectionUtil.getCP95Idx(value);
|
int cp95Idx = DetectionUtil.getCP95Idx(value);
|
||||||
List<Double> newValue = Collections.singletonList(value.get(cp95Idx));
|
List<Double> newValue = Collections.singletonList(value.get(cp95Idx));
|
||||||
value.clear();
|
value.clear();
|
||||||
value.addAll(newValue);
|
value.addAll(newValue);
|
||||||
Double devCP95Data = devMap.get(typeKey).get(key).get(idx.get(cp95Idx));
|
Double devCP95Data = devPhaseHarmData.get(idx.get(cp95Idx));
|
||||||
devMap.get(typeKey).get(key).clear();
|
devPhaseHarmData.clear();
|
||||||
devMap.get(typeKey).get(key).add(devCP95Data);
|
devPhaseHarmData.add(devCP95Data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AVG_VALUE:
|
case AVG_VALUE:
|
||||||
List<Double> avgDoubles = DetectionUtil.getAvgDoubles(value);
|
List<Double> avgDoubles = DetectionUtil.getAvgDoubles(value);
|
||||||
value.clear();
|
value.clear();
|
||||||
value.addAll(avgDoubles);
|
value.addAll(avgDoubles);
|
||||||
List<Double> devAvgData = DetectionUtil.getAvgDoubles(devMap.get(typeKey).get(key));
|
List<Double> devAvgData = DetectionUtil.getAvgDoubles(devMap.get(phase).get(harmonicNum));
|
||||||
devMap.get(typeKey).get(key).clear();
|
devPhaseHarmData.clear();
|
||||||
devMap.get(typeKey).get(key).addAll(devAvgData);
|
devPhaseHarmData.addAll(devAvgData);
|
||||||
|
break;
|
||||||
|
case Own_value:
|
||||||
|
break;
|
||||||
|
case AT_WILL_VALUE:
|
||||||
|
if (isRemoveMaxElement) {
|
||||||
|
if (CollUtil.isNotEmpty(value)) {
|
||||||
|
Double v = value.get(value.size() - 1);
|
||||||
|
value.clear();
|
||||||
|
value.add(v);
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(devPhaseHarmData)) {
|
||||||
|
Double v = devPhaseHarmData.get(devPhaseHarmData.size() - 1);
|
||||||
|
devPhaseHarmData.clear();
|
||||||
|
devPhaseHarmData.add(v);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
List<Double> errorValueList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < value.size(); i++) {
|
||||||
|
errorValueList.add(Math.abs(value.get(i) - devPhaseHarmData.get(i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Integer> idxErrorValueList = DetectionUtil.sort(errorValueList, true);
|
||||||
|
Double v = value.get(idxErrorValueList.get(0));
|
||||||
|
value.clear();
|
||||||
|
value.add(v);
|
||||||
|
v = devPhaseHarmData.get(idxErrorValueList.get(0));
|
||||||
|
devPhaseHarmData.clear();
|
||||||
|
devPhaseHarmData.add(v);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import com.njcn.gather.detection.util.business.DetectionCommunicateUtil;
|
|||||||
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
||||||
import com.njcn.gather.detection.util.socket.FormalTestManager;
|
import com.njcn.gather.detection.util.socket.FormalTestManager;
|
||||||
import com.njcn.gather.detection.util.socket.SocketManager;
|
import com.njcn.gather.detection.util.socket.SocketManager;
|
||||||
|
import com.njcn.gather.detection.util.socket.XiNumberManager;
|
||||||
|
import com.njcn.gather.detection.util.socket.cilent.NettyContrastClientHandler;
|
||||||
import com.njcn.gather.detection.util.socket.websocket.WebServiceManager;
|
import com.njcn.gather.detection.util.socket.websocket.WebServiceManager;
|
||||||
import com.njcn.gather.device.pojo.po.PqDev;
|
import com.njcn.gather.device.pojo.po.PqDev;
|
||||||
import com.njcn.gather.device.pojo.vo.PreDetection;
|
import com.njcn.gather.device.pojo.vo.PreDetection;
|
||||||
@@ -38,6 +40,8 @@ import com.njcn.gather.script.service.IPqScriptCheckDataService;
|
|||||||
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
||||||
import com.njcn.gather.source.pojo.po.SourceInitialize;
|
import com.njcn.gather.source.pojo.po.SourceInitialize;
|
||||||
import com.njcn.gather.source.service.IPqSourceService;
|
import com.njcn.gather.source.service.IPqSourceService;
|
||||||
|
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
||||||
|
import com.njcn.gather.system.config.PathConfig;
|
||||||
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
||||||
import com.njcn.gather.system.dictionary.service.IDictDataService;
|
import com.njcn.gather.system.dictionary.service.IDictDataService;
|
||||||
import com.njcn.web.utils.HttpServletUtil;
|
import com.njcn.web.utils.HttpServletUtil;
|
||||||
@@ -50,6 +54,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import javax.servlet.ServletOutputStream;
|
import javax.servlet.ServletOutputStream;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -75,9 +80,12 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
private final SocketContrastResponseService socketContrastResponseService;
|
private final SocketContrastResponseService socketContrastResponseService;
|
||||||
private final IPqScriptCheckDataService iPqScriptCheckDataService;
|
private final IPqScriptCheckDataService iPqScriptCheckDataService;
|
||||||
private final SocketManager socketManager;
|
private final SocketManager socketManager;
|
||||||
|
private final ISysTestConfigService sysTestConfigService;
|
||||||
|
|
||||||
@Value("${log.homeDir}")
|
|
||||||
private String alignDataFilePath;
|
// @Value("${report.reportDir}")
|
||||||
|
// private String alignDataFilePath;
|
||||||
|
private final PathConfig pathConfig;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -130,6 +138,7 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
);
|
);
|
||||||
if (ObjectUtil.isNotNull(planSource)) {
|
if (ObjectUtil.isNotNull(planSource)) {
|
||||||
SourceInitialize sourceParam = pqSourceService.getSourceInitializeParam(planSource.getSourceId());
|
SourceInitialize sourceParam = pqSourceService.getSourceInitializeParam(planSource.getSourceId());
|
||||||
|
param.setSourceName(sourceParam.getSourceId());
|
||||||
if (ObjectUtil.isNotNull(sourceParam)) {
|
if (ObjectUtil.isNotNull(sourceParam)) {
|
||||||
//开始组装socket报文请求头
|
//开始组装socket报文请求头
|
||||||
socketDevResponseService.initList(param);
|
socketDevResponseService.initList(param);
|
||||||
@@ -176,6 +185,7 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
if (ObjectUtil.isNotNull(planSource)) {
|
if (ObjectUtil.isNotNull(planSource)) {
|
||||||
//获取源初始化参数
|
//获取源初始化参数
|
||||||
SourceInitialize sourceParam = pqSourceService.getSourceInitializeParam(planSource.getSourceId());
|
SourceInitialize sourceParam = pqSourceService.getSourceInitializeParam(planSource.getSourceId());
|
||||||
|
param.setSourceName(sourceParam.getSourceId());
|
||||||
if (ObjectUtil.isNotNull(sourceParam)) {
|
if (ObjectUtil.isNotNull(sourceParam)) {
|
||||||
//开始组装socket报文请求头
|
//开始组装socket报文请求头
|
||||||
socketDevResponseService.initList(param);
|
socketDevResponseService.initList(param);
|
||||||
@@ -238,6 +248,8 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
FormalTestManager.stopFlag = false;
|
FormalTestManager.stopFlag = false;
|
||||||
socketDevResponseService.initRestart();
|
socketDevResponseService.initRestart();
|
||||||
List<SourceIssue> sourceIssueList = SocketManager.getSourceList();
|
List<SourceIssue> sourceIssueList = SocketManager.getSourceList();
|
||||||
|
SourceInitialize sourceInitialize = pqSourceService.getSourceInitializeParam(param.getSourceId());
|
||||||
|
param.setSourceName(sourceInitialize.getSourceId());
|
||||||
if (CollUtil.isNotEmpty(sourceIssueList)) {
|
if (CollUtil.isNotEmpty(sourceIssueList)) {
|
||||||
SourceIssue sourceIssues = SocketManager.getSourceList().get(0);
|
SourceIssue sourceIssues = SocketManager.getSourceList().get(0);
|
||||||
SocketMsg<String> xuMsg = new SocketMsg<>();
|
SocketMsg<String> xuMsg = new SocketMsg<>();
|
||||||
@@ -253,7 +265,7 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
checkDataParam.setIsValueTypeName(false);
|
checkDataParam.setIsValueTypeName(false);
|
||||||
List<String> adType = iPqScriptCheckDataService.getValueType(checkDataParam);
|
List<String> adType = iPqScriptCheckDataService.getValueType(checkDataParam);
|
||||||
|
|
||||||
iPqDevService.updateResult(param.getDevIds(), adType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity());
|
iPqDevService.updateResult(param.getDevIds(), adType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity(), true);
|
||||||
CnSocketUtil.quitSend(param);
|
CnSocketUtil.quitSend(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +296,8 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
}
|
}
|
||||||
//组装源控制脚本
|
//组装源控制脚本
|
||||||
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
issueParam.setSourceId(param.getSourceId());
|
SourceInitialize sourceInitialize = pqSourceService.getSourceInitializeParam(param.getSourceId());
|
||||||
|
issueParam.setSourceId(sourceInitialize.getSourceId());
|
||||||
issueParam.setScriptId(param.getScriptId());
|
issueParam.setScriptId(param.getScriptId());
|
||||||
issueParam.setType(1);
|
issueParam.setType(1);
|
||||||
issueParam.setIsPhaseSequence(SourceOperateCodeEnum.SIMULATE_TEST.getValue());
|
issueParam.setIsPhaseSequence(SourceOperateCodeEnum.SIMULATE_TEST.getValue());
|
||||||
@@ -337,13 +350,13 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exportAlignData() {
|
public void exportAlignData() {
|
||||||
String fileName = "实时数据.xlsx";
|
String fileName = "对齐数据.xlsx";
|
||||||
HttpServletResponse response = HttpServletUtil.getResponse();
|
HttpServletResponse response = HttpServletUtil.getResponse();
|
||||||
response.reset();
|
response.reset();
|
||||||
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
|
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
|
||||||
response.setContentType("application/octet-stream;charset=UTF-8");
|
response.setContentType("application/octet-stream;charset=UTF-8");
|
||||||
try {
|
try {
|
||||||
InputStream inputStream = new FileInputStream(alignDataFilePath + "\\" + fileName);
|
InputStream inputStream = new FileInputStream(pathConfig.getDataPath() + File.separator + fileName);
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int len = 0;
|
int len = 0;
|
||||||
ServletOutputStream outputStream = response.getOutputStream();
|
ServletOutputStream outputStream = response.getOutputStream();
|
||||||
@@ -358,6 +371,36 @@ public class PreDetectionServiceImpl implements PreDetectionService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getCanCoefficient() {
|
||||||
|
return CollUtil.isNotEmpty(DetectionServiceImpl.vAndIResultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startCoefficient() {
|
||||||
|
if (CollUtil.isNotEmpty(DetectionServiceImpl.vAndIResultMap)) {
|
||||||
|
// 是否进行系数校准
|
||||||
|
//万一录波了这里就进不来了,但是在误差处理的时候DetectionServiceImpl.vAndIResultMap该集合会保留不符合的结果
|
||||||
|
|
||||||
|
XiNumberManager.xiDevList.clear();
|
||||||
|
XiNumberManager.devXiNumDataMap.clear();
|
||||||
|
List<String> stdIpList = DetectionServiceImpl.vAndIResultMap.values().stream().map(DetectionServiceImpl.VAndIResult::getIp).collect(Collectors.toList());
|
||||||
|
XiNumberManager.xiDevList = FormalTestManager.standardDevList.stream().filter(d -> stdIpList.contains(d.getDevIP())).collect(Collectors.toList());
|
||||||
|
// 逐一设备向通讯模块要原始系数
|
||||||
|
SocketMsg<String> socketMsg = new SocketMsg<>();
|
||||||
|
socketMsg.setRequestId(SourceOperateCodeEnum.Coefficient_Check.getValue());
|
||||||
|
socketMsg.setOperateCode(SourceOperateCodeEnum.DATA_CHNFACTOR$01.getValue());
|
||||||
|
PreDetection preDetection = XiNumberManager.xiDevList.get(0);
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("devIP", preDetection.getDevIP());
|
||||||
|
map.put("chnNum", preDetection.getDevChns());
|
||||||
|
socketMsg.setData(JSON.toJSONString(map));
|
||||||
|
SocketManager.sendMsg(NettyContrastClientHandler.param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG, JSON.toJSONString(socketMsg));
|
||||||
|
|
||||||
|
FormalTestManager.currentStep = SourceOperateCodeEnum.Coefficient_Check;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 比对式-与通信模块进行连接
|
* 比对式-与通信模块进行连接
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.njcn.gather.detection.util;
|
package com.njcn.gather.detection.util;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.njcn.gather.detection.pojo.po.DevData;
|
import com.njcn.gather.detection.pojo.po.DevData;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -421,7 +422,7 @@ public class DetectionUtil {
|
|||||||
}
|
}
|
||||||
return newList;
|
return newList;
|
||||||
}
|
}
|
||||||
return null;
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -437,4 +438,94 @@ public class DetectionUtil {
|
|||||||
System.out.println(" 文件大小: " + file.length() + " bytes");
|
System.out.println(" 文件大小: " + file.length() + " bytes");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取皮尔逊系数
|
||||||
|
*
|
||||||
|
* <p>相关系数绝对值|r|所代表的相关强度</p>
|
||||||
|
* <ul>
|
||||||
|
* <li>0.8 - 1.0:极强相关</li>
|
||||||
|
* <li>0.6 - 0.8:强相关</li>
|
||||||
|
* <li>0.4 - 0.6:中等程度相关</li>
|
||||||
|
* <li>0.2 - 0.4:弱相关</li>
|
||||||
|
* <li>0.0 - 0.2:极弱相关或无相关</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static BigDecimal getPearsonCorrelationCoefficient(List<Double> x, List<Double> y) {
|
||||||
|
Double xAvg = x.parallelStream().mapToDouble(Double::doubleValue).average().orElse(0.0);
|
||||||
|
Double yAvg = y.parallelStream().mapToDouble(Double::doubleValue).average().orElse(0.0);
|
||||||
|
|
||||||
|
// 协方差求和
|
||||||
|
BigDecimal covarianceSum = BigDecimal.ZERO;
|
||||||
|
// x的方差
|
||||||
|
BigDecimal varianceX = BigDecimal.ZERO;
|
||||||
|
// y的方差
|
||||||
|
BigDecimal varianceY = BigDecimal.ZERO;
|
||||||
|
for (int i = 0; i < x.size(); i++) {
|
||||||
|
covarianceSum = covarianceSum.add(BigDecimal.valueOf((x.get(i) - xAvg) * (y.get(i) - yAvg)));
|
||||||
|
varianceX = varianceX.add(BigDecimal.valueOf(Math.pow(x.get(i) - xAvg, 2)));
|
||||||
|
varianceY = varianceY.add(BigDecimal.valueOf(Math.pow(y.get(i) - yAvg, 2)));
|
||||||
|
}
|
||||||
|
BigDecimal fm = BigDecimal.valueOf(Math.sqrt(varianceX.doubleValue()) * Math.sqrt(varianceY.doubleValue()));
|
||||||
|
if (NumberUtil.equals(fm.doubleValue(), BigDecimal.ZERO.doubleValue())) {
|
||||||
|
if (NumberUtil.equals(covarianceSum, BigDecimal.ZERO)) {
|
||||||
|
return BigDecimal.valueOf(1.0);
|
||||||
|
} else {
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return BigDecimal.valueOf(Math.abs(covarianceSum.divide(fm, 8, BigDecimal.ROUND_HALF_UP).doubleValue())); //相关系数
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比值一致性,获取CV系数
|
||||||
|
*
|
||||||
|
* <p>一致性等级</p>
|
||||||
|
* <ul>
|
||||||
|
* <li>CV<1%:非常优秀</li>
|
||||||
|
* <li>1%≤CV<5%:优良</li>
|
||||||
|
* <li>5%≤CV<10%:良好</li>
|
||||||
|
* <li>10%≤CV<20%:中等</li>
|
||||||
|
* <li>20%≤CV:较差</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static BigDecimal getCvCoefficient(List<Double> x, List<Double> y) {
|
||||||
|
List<BigDecimal> ratioList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < x.size(); i++) {
|
||||||
|
ratioList.add(BigDecimal.valueOf(x.get(i) / y.get(i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
BigDecimal avg = BigDecimal.valueOf(ratioList.parallelStream().mapToDouble(BigDecimal::doubleValue).average().orElse(0.0));
|
||||||
|
BigDecimal variance = BigDecimal.valueOf(
|
||||||
|
ratioList.parallelStream().mapToDouble(BigDecimal::doubleValue)
|
||||||
|
.map(v -> Math.pow(v - avg.doubleValue(), 2)).average().orElse(0.0));
|
||||||
|
|
||||||
|
return BigDecimal.valueOf(Math.sqrt(variance.doubleValue()) / avg.doubleValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算新的系数
|
||||||
|
*
|
||||||
|
* @param devList
|
||||||
|
* @param stdDevList
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Double getNewXi(List<Double> devList, List<Double> stdDevList) {
|
||||||
|
ArrayList<Double> xiList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < stdDevList.size(); i++) {
|
||||||
|
if (!stdDevList.get(i).equals(0)) {
|
||||||
|
BigDecimal bigDecimalDev = BigDecimal.valueOf(devList.get(i));
|
||||||
|
BigDecimal bigDecimalStdDev = BigDecimal.valueOf(stdDevList.get(i));
|
||||||
|
xiList.add((bigDecimalDev.subtract(bigDecimalStdDev)).divide(BigDecimal.valueOf(2.0).multiply(bigDecimalDev), 8, BigDecimal.ROUND_HALF_UP).doubleValue() + 1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return xiList.stream().mapToDouble(Double::doubleValue).average().orElse(1.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class CnSocketUtil {
|
|||||||
socketMsg.setRequestId(SourceOperateCodeEnum.QUITE_SOURCE.getValue());
|
socketMsg.setRequestId(SourceOperateCodeEnum.QUITE_SOURCE.getValue());
|
||||||
socketMsg.setOperateCode(SourceOperateCodeEnum.CLOSE_GATHER.getValue());
|
socketMsg.setOperateCode(SourceOperateCodeEnum.CLOSE_GATHER.getValue());
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put("sourceId", param.getSourceId());
|
jsonObject.put("sourceId", param.getSourceName());
|
||||||
socketMsg.setData(jsonObject.toJSONString());
|
socketMsg.setData(jsonObject.toJSONString());
|
||||||
SocketManager.sendMsg(param.getUserPageId() + SOURCE_TAG, JSON.toJSONString(socketMsg));
|
SocketManager.sendMsg(param.getUserPageId() + SOURCE_TAG, JSON.toJSONString(socketMsg));
|
||||||
WebServiceManager.removePreDetectionParam(param.getUserPageId());
|
WebServiceManager.removePreDetectionParam(param.getUserPageId());
|
||||||
|
|||||||
@@ -208,4 +208,9 @@ public class FormalTestManager {
|
|||||||
* 是否进行相序校验
|
* 是否进行相序校验
|
||||||
*/
|
*/
|
||||||
public static boolean isXu;
|
public static boolean isXu;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 过载信息,如果检测到电压过载,overload=1;如果检测到电流过载,overload=2;如果检测到电压&&电流过载,overload=3;反之,overload=4
|
||||||
|
*/
|
||||||
|
public static int overload;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.njcn.gather.detection.handler.SocketContrastResponseService;
|
import com.njcn.gather.detection.handler.SocketContrastResponseService;
|
||||||
import com.njcn.gather.detection.handler.SocketDevResponseService;
|
import com.njcn.gather.detection.handler.SocketDevResponseService;
|
||||||
import com.njcn.gather.detection.handler.SocketSourceResponseService;
|
import com.njcn.gather.detection.handler.SocketSourceResponseService;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.param.ContrastDetectionParam;
|
import com.njcn.gather.detection.pojo.param.ContrastDetectionParam;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
@@ -349,7 +350,7 @@ public class NettyClient {
|
|||||||
NioEventLoopGroup group, String msg) {
|
NioEventLoopGroup group, String msg) {
|
||||||
channelFuture.addListener((ChannelFutureListener) ch -> {
|
channelFuture.addListener((ChannelFutureListener) ch -> {
|
||||||
if (!ch.isSuccess()) {
|
if (!ch.isSuccess()) {
|
||||||
onConnectionFailure(handler, group);
|
onConnectionFailure(param, handler, group);
|
||||||
} else {
|
} else {
|
||||||
onConnectionSuccess(channelFuture, param, handler, group, msg);
|
onConnectionSuccess(channelFuture, param, handler, group, msg);
|
||||||
}
|
}
|
||||||
@@ -358,15 +359,24 @@ public class NettyClient {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 连接失败处理
|
* 连接失败处理
|
||||||
* 输出失败信息并优雅关闭事件循环组
|
* 输出失败信息、优雅关闭事件循环组、通知前端、释放检测锁
|
||||||
*
|
*
|
||||||
|
* @param param 检测参数,用于定位锁与前端通知
|
||||||
* @param handler 业务处理器,用于区分设备类型
|
* @param handler 业务处理器,用于区分设备类型
|
||||||
* @param group 事件循环组
|
* @param group 事件循环组
|
||||||
*/
|
*/
|
||||||
private static void onConnectionFailure(SimpleChannelInboundHandler<String> handler, NioEventLoopGroup group) {
|
private static void onConnectionFailure(PreDetectionParam param,
|
||||||
|
SimpleChannelInboundHandler<String> handler, NioEventLoopGroup group) {
|
||||||
String deviceType = getDeviceType(handler);
|
String deviceType = getDeviceType(handler);
|
||||||
log.info("连接{}服务端失败...", deviceType);
|
log.info("连接{}服务端失败...", deviceType);
|
||||||
group.shutdownGracefully();
|
group.shutdownGracefully();
|
||||||
|
// 异步建连失败时前端原本静默,补一次通知避免用户黑屏等待
|
||||||
|
notifyFrontendError(param, handler);
|
||||||
|
// 释放检测锁:抢锁后由 controller 异步发起的建连若失败,无法走 controller 兜底
|
||||||
|
if (param != null && param.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "ASYNC_CONNECT_FAILED");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -455,6 +465,12 @@ public class NettyClient {
|
|||||||
|
|
||||||
// 通过WebSocket通知前端页面
|
// 通过WebSocket通知前端页面
|
||||||
notifyFrontendError(param, handler);
|
notifyFrontendError(param, handler);
|
||||||
|
|
||||||
|
// 释放检测锁,理由同 onConnectionFailure
|
||||||
|
if (param != null && param.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "ASYNC_CONNECT_EXCEPTION");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.njcn.gather.detection.util.socket.cilent;
|
|||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.njcn.gather.detection.handler.SocketContrastResponseService;
|
import com.njcn.gather.detection.handler.SocketContrastResponseService;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceResponseCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
@@ -68,6 +69,11 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler<Stri
|
|||||||
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
|
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_01, false);
|
||||||
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false);
|
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false);
|
||||||
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, true);
|
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, true);
|
||||||
|
// 业务消息处理异常 → 释放检测锁
|
||||||
|
if (param != null && param.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "CONTRAST_READ_EXCEPTION");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,6 +82,11 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler<Stri
|
|||||||
System.out.println("与通信模块端断线");
|
System.out.println("与通信模块端断线");
|
||||||
ctx.close();
|
ctx.close();
|
||||||
SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG);
|
SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.CONTRAST_DEV_TAG);
|
||||||
|
// 比对通信模块主动断开 → 本次检测视为结束,释放检测锁
|
||||||
|
if (param != null && param.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "CONTRAST_CHANNEL_INACTIVE");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -150,11 +161,18 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler<Stri
|
|||||||
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false);
|
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_02, false);
|
||||||
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, true);
|
CnSocketUtil.contrastSendquit(param.getUserPageId(), SourceOperateCodeEnum.QUIT_INIT_03, true);
|
||||||
ctx.close();
|
ctx.close();
|
||||||
|
// 比对通道异常 → 释放检测锁
|
||||||
|
if (param != null && param.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "CONTRAST_EXCEPTION");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接收数据超时处理
|
* 接收数据超时处理
|
||||||
|
* 比对模式读超时(10 分钟 Pst / 1 分钟实时 / 动态统计)都汇到这里,
|
||||||
|
* 推前端的同时一并释放检测锁(避免锁卡到 4 小时绝对超时)。
|
||||||
*/
|
*/
|
||||||
private void timeoutSend(SourceOperateCodeEnum sourceOperateCodeEnum) {
|
private void timeoutSend(SourceOperateCodeEnum sourceOperateCodeEnum) {
|
||||||
System.out.println("超时处理-----》" + "统计数据已超时----------------关闭");
|
System.out.println("超时处理-----》" + "统计数据已超时----------------关闭");
|
||||||
@@ -164,6 +182,11 @@ public class NettyContrastClientHandler extends SimpleChannelInboundHandler<Stri
|
|||||||
webSend.setData(sourceOperateCodeEnum.getMsg() + SourceResponseCodeEnum.RECEIVE_DATA_TIME_OUT.getMessage());
|
webSend.setData(sourceOperateCodeEnum.getMsg() + SourceResponseCodeEnum.RECEIVE_DATA_TIME_OUT.getMessage());
|
||||||
webSend.setCode(SourceResponseCodeEnum.RECEIVE_DATA_TIME_OUT.getCode());
|
webSend.setCode(SourceResponseCodeEnum.RECEIVE_DATA_TIME_OUT.getCode());
|
||||||
WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0));
|
WebServiceManager.sendMsg(param.getUserPageId(), MsgUtil.msgToWebData(webSend, FormalTestManager.devNameMapComm, 0));
|
||||||
|
// 比对模式读超时终态 → 释放检测锁
|
||||||
|
if (param != null && param.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "CONTRAST_IDLE_TIMEOUT");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package com.njcn.gather.detection.util.socket.cilent;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.njcn.gather.detection.handler.SocketDevResponseService;
|
import com.njcn.gather.detection.handler.SocketDevResponseService;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLock;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.enums.ResultEnum;
|
import com.njcn.gather.detection.pojo.enums.ResultEnum;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
@@ -115,6 +117,9 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
ctx.close();
|
ctx.close();
|
||||||
SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.DEV_TAG);
|
SocketManager.removeUser(param.getUserPageId() + CnSocketUtil.DEV_TAG);
|
||||||
CnSocketUtil.quitSendSource(param);
|
CnSocketUtil.quitSendSource(param);
|
||||||
|
// 设备主动断开 → 本次检测视为结束,释放检测锁
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "DEV_CHANNEL_INACTIVE");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -132,6 +137,9 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("处理服务端消息异常", e);
|
log.error("处理服务端消息异常", e);
|
||||||
CnSocketUtil.quitSend(param);
|
CnSocketUtil.quitSend(param);
|
||||||
|
// 业务消息处理异常 → 退出并释放检测锁
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "DEV_READ_EXCEPTION");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,6 +195,9 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
CnSocketUtil.quitSendSource(param);
|
CnSocketUtil.quitSendSource(param);
|
||||||
socketResponseService.backCheckState(param);
|
socketResponseService.backCheckState(param);
|
||||||
ctx.close();
|
ctx.close();
|
||||||
|
// 通道异常 → 释放检测锁
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "DEV_EXCEPTION");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -231,6 +242,9 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
CnSocketUtil.quitSend(param);
|
CnSocketUtil.quitSend(param);
|
||||||
WebServiceManager.sendDetectionErrorMessage(param.getUserPageId(), SourceOperateCodeEnum.SOCKET_TIMEOUT);
|
WebServiceManager.sendDetectionErrorMessage(param.getUserPageId(), SourceOperateCodeEnum.SOCKET_TIMEOUT);
|
||||||
socketResponseService.backCheckState(param);
|
socketResponseService.backCheckState(param);
|
||||||
|
// 常规步骤读超时兜底 → 释放检测锁
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "DEV_READ_TIMEOUT");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,6 +258,14 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
if (FormalTestManager.stopTime > STOP_TIMEOUT) {
|
if (FormalTestManager.stopTime > STOP_TIMEOUT) {
|
||||||
CnSocketUtil.quitSend(param);
|
CnSocketUtil.quitSend(param);
|
||||||
WebServiceManager.sendDetectionErrorMessage(param.getUserPageId(), SourceOperateCodeEnum.FORMAL_REAL.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT);
|
WebServiceManager.sendDetectionErrorMessage(param.getUserPageId(), SourceOperateCodeEnum.FORMAL_REAL.getValue(), SourceOperateCodeEnum.STOP_TIMEOUT);
|
||||||
|
// R4 释放:暂停 10 分钟超时视同放弃本次检测
|
||||||
|
DetectionLock cur = DetectionLockManager.getInstance().getCurrent();
|
||||||
|
if (cur != null) {
|
||||||
|
DetectionLockManager.getInstance().releaseIfHeldBy(cur.getUserId(), "PAUSE_TIMEOUT");
|
||||||
|
}
|
||||||
|
// 重置 FormalTestManager 状态,避免下次进入误判
|
||||||
|
FormalTestManager.stopTime = 0;
|
||||||
|
FormalTestManager.hasStopFlag = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,6 +324,9 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
CnSocketUtil.quitSend(param);
|
CnSocketUtil.quitSend(param);
|
||||||
timeoutSend(sourceIssue);
|
timeoutSend(sourceIssue);
|
||||||
socketResponseService.backCheckState(param);
|
socketResponseService.backCheckState(param);
|
||||||
|
// 单项检测超时本质等于整轮中止(已 quitSend),释放检测锁
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(param.getUserPageId(), "DEV_ITEM_TIMEOUT");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -336,7 +361,7 @@ public class NettyDevClientHandler extends SimpleChannelInboundHandler<String> {
|
|||||||
devLineTestResult.setDeviceName(dev.getDevName());
|
devLineTestResult.setDeviceName(dev.getDevName());
|
||||||
|
|
||||||
Integer[] resultFlags = dev.getMonitorList().stream()
|
Integer[] resultFlags = dev.getMonitorList().stream()
|
||||||
.map(monitor -> ResultEnum.NETWORK_TIMEOUT)
|
.map(monitor -> ResultEnum.NETWORK_TIMEOUT.getValue())
|
||||||
.toArray(Integer[]::new);
|
.toArray(Integer[]::new);
|
||||||
devLineTestResult.setChnResult(resultFlags);
|
devLineTestResult.setChnResult(resultFlags);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.njcn.gather.detection.util.socket.cilent;
|
package com.njcn.gather.detection.util.socket.cilent;
|
||||||
|
|
||||||
import com.njcn.gather.detection.handler.SocketSourceResponseService;
|
import com.njcn.gather.detection.handler.SocketSourceResponseService;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
||||||
@@ -70,6 +71,9 @@ public class NettySourceClientHandler extends SimpleChannelInboundHandler<String
|
|||||||
// 从Socket管理器中移除用户通道映射
|
// 从Socket管理器中移除用户通道映射
|
||||||
if (webUser != null && StrUtil.isNotBlank(userId)) {
|
if (webUser != null && StrUtil.isNotBlank(userId)) {
|
||||||
SocketManager.removeUser(userId + CnSocketUtil.SOURCE_TAG);
|
SocketManager.removeUser(userId + CnSocketUtil.SOURCE_TAG);
|
||||||
|
// 源端主动断开 → 本次检测视为结束,释放检测锁
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(userId, "SOURCE_CHANNEL_INACTIVE");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,6 +99,11 @@ public class NettySourceClientHandler extends SimpleChannelInboundHandler<String
|
|||||||
log.error("源设备消息处理异常, userId: {}, message: {}", userId, msg, e);
|
log.error("源设备消息处理异常, userId: {}, message: {}", userId, msg, e);
|
||||||
// 发生异常时退出发送,避免后续问题
|
// 发生异常时退出发送,避免后续问题
|
||||||
CnSocketUtil.quitSend(webUser);
|
CnSocketUtil.quitSend(webUser);
|
||||||
|
// 业务消息处理异常 → 释放检测锁
|
||||||
|
if (StrUtil.isNotBlank(userId)) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(userId, "SOURCE_READ_EXCEPTION");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,6 +145,13 @@ public class NettySourceClientHandler extends SimpleChannelInboundHandler<String
|
|||||||
|
|
||||||
// 发生异常时关闭通道
|
// 发生异常时关闭通道
|
||||||
ctx.close();
|
ctx.close();
|
||||||
|
|
||||||
|
// 源通道异常 → 释放检测锁
|
||||||
|
String userIdForRelease = webUser != null ? webUser.getUserPageId() : null;
|
||||||
|
if (StrUtil.isNotBlank(userIdForRelease)) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(userIdForRelease, "SOURCE_EXCEPTION");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.njcn.gather.detection.util.socket.websocket;
|
package com.njcn.gather.detection.util.socket.websocket;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
import com.njcn.gather.detection.pojo.vo.WebSocketVO;
|
import com.njcn.gather.detection.pojo.vo.WebSocketVO;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
||||||
@@ -296,6 +297,8 @@ public class WebServiceManager {
|
|||||||
webSocketVO.setData(errorType.getMsg());
|
webSocketVO.setData(errorType.getMsg());
|
||||||
webSocketVO.setOperateCode(errorType.getValue());
|
webSocketVO.setOperateCode(errorType.getValue());
|
||||||
sendMessage(userId, webSocketVO);
|
sendMessage(userId, webSocketVO);
|
||||||
|
// 守门员:错误推送即视为本次检测终态,释放检测锁(幂等,与显式释放点叠加双保险)
|
||||||
|
releaseLockOnTerminal(userId, errorType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -313,6 +316,25 @@ public class WebServiceManager {
|
|||||||
webSocketVO.setData(errorType.getMsg());
|
webSocketVO.setData(errorType.getMsg());
|
||||||
webSocketVO.setOperateCode(errorType.getValue());
|
webSocketVO.setOperateCode(errorType.getValue());
|
||||||
sendMessage(userId, webSocketVO);
|
sendMessage(userId, webSocketVO);
|
||||||
|
// 守门员:理由同上
|
||||||
|
releaseLockOnTerminal(userId, errorType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 守门员释放锁
|
||||||
|
* <p>覆盖业务回调里所有走 {@code sendDetectionErrorMessage} 的失败路径,
|
||||||
|
* 等价于在 detection/handler 全目录的错误终态点显式释放。与各 Netty handler
|
||||||
|
* 内的显式释放幂等叠加,形成双保险。</p>
|
||||||
|
*
|
||||||
|
* <p>注:业务"正常完成"路径不走此方法(数模式 formalDeal 已在 Phase 1 显式释放;
|
||||||
|
* 比对模式正常完成走 sendMsg 推 ERROR_FLOW_END,依赖 WS 断开后心跳超时兜底)。</p>
|
||||||
|
*/
|
||||||
|
private static void releaseLockOnTerminal(String userId, SourceOperateCodeEnum errorType) {
|
||||||
|
if (userId == null || userId.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(userId, "WS_ERROR_PUSH:" + errorType.name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.njcn.gather.detection.util.socket.websocket;
|
package com.njcn.gather.detection.util.socket.websocket;
|
||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.njcn.gather.detection.lock.DetectionLockManager;
|
||||||
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
import com.njcn.gather.detection.pojo.enums.SourceOperateCodeEnum;
|
||||||
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
import com.njcn.gather.detection.pojo.param.PreDetectionParam;
|
||||||
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
import com.njcn.gather.detection.util.socket.CnSocketUtil;
|
||||||
@@ -414,6 +415,11 @@ public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketF
|
|||||||
}
|
}
|
||||||
// 清理完成后移除该用户的检测参数
|
// 清理完成后移除该用户的检测参数
|
||||||
WebServiceManager.removePreDetectionParam(userId);
|
WebServiceManager.removePreDetectionParam(userId);
|
||||||
|
// R3 释放:WS 断开 / 客户端关页面 / 心跳超时后顺手释放检测锁
|
||||||
|
if (preDetectionParam.getUserPageId() != null) {
|
||||||
|
DetectionLockManager.getInstance()
|
||||||
|
.releaseIfMatchPage(preDetectionParam.getUserPageId(), "WS_DISCONNECTED");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("清理Socket连接时发生异常,userId: {}", userId, e);
|
log.error("清理Socket连接时发生异常,userId: {}", userId, e);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.njcn.common.pojo.response.HttpResult;
|
|||||||
import com.njcn.common.utils.LogUtil;
|
import com.njcn.common.utils.LogUtil;
|
||||||
import com.njcn.gather.device.pojo.param.PqStandardDevParam;
|
import com.njcn.gather.device.pojo.param.PqStandardDevParam;
|
||||||
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
||||||
|
import com.njcn.gather.device.pojo.vo.PqStandardDevVO;
|
||||||
import com.njcn.gather.device.service.IPqStandardDevService;
|
import com.njcn.gather.device.service.IPqStandardDevService;
|
||||||
import com.njcn.web.controller.BaseController;
|
import com.njcn.web.controller.BaseController;
|
||||||
import com.njcn.web.utils.FileUtil;
|
import com.njcn.web.utils.FileUtil;
|
||||||
@@ -55,10 +56,10 @@ public class PqStandardDevController extends BaseController {
|
|||||||
@GetMapping("/getById")
|
@GetMapping("/getById")
|
||||||
@ApiOperation("根据id查询标准设备")
|
@ApiOperation("根据id查询标准设备")
|
||||||
@ApiImplicitParam(name = "id", value = "标准设备id", required = true)
|
@ApiImplicitParam(name = "id", value = "标准设备id", required = true)
|
||||||
public HttpResult<PqStandardDev> getById(@RequestParam("id") String id) {
|
public HttpResult<PqStandardDevVO> getById(@RequestParam("id") String id) {
|
||||||
String methodDescribe = getMethodDescribe("getById");
|
String methodDescribe = getMethodDescribe("getById");
|
||||||
LogUtil.njcnDebug(log, "{},查询ID为:{}", methodDescribe, id);
|
LogUtil.njcnDebug(log, "{},查询ID为:{}", methodDescribe, id);
|
||||||
PqStandardDev result = pqStandardDevService.getPqStandardDevById(id);
|
PqStandardDevVO result = pqStandardDevService.getPqStandardDevById(id);
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.njcn.gather.device.mapper;
|
||||||
|
|
||||||
|
import com.github.yulichang.base.MPJBaseMapper;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-12
|
||||||
|
*/
|
||||||
|
public interface PqStandardDevGainMapper extends MPJBaseMapper<PqStandardDevGain> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.njcn.gather.device.mapper;
|
||||||
|
|
||||||
|
import com.github.yulichang.base.MPJBaseMapper;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGainRecord;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-15
|
||||||
|
*/
|
||||||
|
public interface PqStandardDevGainRecordMapper extends MPJBaseMapper<PqStandardDevGainRecord> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.njcn.gather.device.mapper.PqStandardDevGainMapper">
|
||||||
|
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.njcn.gather.device.mapper.PqStandardDevGainRecordMapper">
|
||||||
|
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package com.njcn.gather.device.pojo.po;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.njcn.db.mybatisplus.bo.BaseEntity;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-12
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("pq_standard_dev_gain")
|
||||||
|
public class PqStandardDevGain extends BaseEntity implements Serializable {
|
||||||
|
private static final long serialVersionUID = -46280767885558804L;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标准设备Id_通道号
|
||||||
|
*/
|
||||||
|
@TableId
|
||||||
|
private String stdDevMonitorId;
|
||||||
|
|
||||||
|
private Integer uaGain;
|
||||||
|
|
||||||
|
private Integer ubGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer ucGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer u0Gain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer iaGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer ibGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer icGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer i0Gain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer uabGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer ubcGain;
|
||||||
|
|
||||||
|
|
||||||
|
private Integer ucaGain;
|
||||||
|
|
||||||
|
private Integer state;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package com.njcn.gather.device.pojo.po;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.njcn.db.mybatisplus.bo.BaseEntity;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("pq_standard_dev_gain_record")
|
||||||
|
public class PqStandardDevGainRecord implements Serializable {
|
||||||
|
private static final long serialVersionUID = 477276215572686991L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标准设备监测点id,由设备id_通道号组成
|
||||||
|
*/
|
||||||
|
private String stdDevMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 被检设备监测点id,由设备id_通道号组成
|
||||||
|
*/
|
||||||
|
private String devMonitorId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系数下发次数
|
||||||
|
*/
|
||||||
|
private Integer num;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.njcn.gather.device.pojo.vo;
|
||||||
|
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGain;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @data 2026-01-19
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class PqStandardDevVO extends PqStandardDev {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通道系数
|
||||||
|
*/
|
||||||
|
List<PqStandardDevGain> gainList;
|
||||||
|
}
|
||||||
@@ -115,9 +115,10 @@ public interface IPqDevService extends IService<PqDev> {
|
|||||||
* @param userId
|
* @param userId
|
||||||
* @param temperature
|
* @param temperature
|
||||||
* @param humidity
|
* @param humidity
|
||||||
|
* @param updateCheckNum 是否更新检测次数
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
boolean updateResult(List<String> ids, List<String> adType, String code, String userId, Float temperature, Float humidity);
|
boolean updateResult(List<String> ids, List<String> adType, String code, String userId, Float temperature, Float humidity, boolean updateCheckNum);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 比对式-修改设备状态
|
* 比对式-修改设备状态
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.njcn.gather.device.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGainRecord;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-15
|
||||||
|
*/
|
||||||
|
public interface IPqStandardDevGainRecordService extends IService<PqStandardDevGainRecord> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取最大下发系数的次数
|
||||||
|
*
|
||||||
|
* @param stdDevMonitorId
|
||||||
|
* @param devMonitorId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int getMaxNum(String stdDevMonitorId, String devMonitorId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量新增或更新记录
|
||||||
|
* @param recordList
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean addOrUpdate(List<PqStandardDevGainRecord> recordList);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.njcn.gather.device.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGain;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-12
|
||||||
|
*/
|
||||||
|
public interface IPqStandardDevGainService extends IService<PqStandardDevGain> {
|
||||||
|
|
||||||
|
boolean add(List<PqStandardDevGain> pqStandardDevGainList);
|
||||||
|
|
||||||
|
PqStandardDevGain get(String stdDevMonitorId);
|
||||||
|
|
||||||
|
List<PqStandardDevGain> list(String stdDevId);
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.njcn.gather.device.pojo.param.PqStandardDevParam;
|
import com.njcn.gather.device.pojo.param.PqStandardDevParam;
|
||||||
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
||||||
|
import com.njcn.gather.device.pojo.vo.PqStandardDevVO;
|
||||||
import com.njcn.gather.device.pojo.vo.PreDetection;
|
import com.njcn.gather.device.pojo.vo.PreDetection;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
@@ -30,7 +31,7 @@ public interface IPqStandardDevService extends IService<PqStandardDev> {
|
|||||||
* @param id 设备id
|
* @param id 设备id
|
||||||
* @return 设备对象
|
* @return 设备对象
|
||||||
*/
|
*/
|
||||||
PqStandardDev getPqStandardDevById(String id);
|
PqStandardDevVO getPqStandardDevById(String id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增标准设备
|
* 新增标准设备
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ import com.njcn.gather.monitor.pojo.po.PqMonitor;
|
|||||||
import com.njcn.gather.monitor.pojo.vo.PqMonitorExcel;
|
import com.njcn.gather.monitor.pojo.vo.PqMonitorExcel;
|
||||||
import com.njcn.gather.monitor.service.IPqMonitorService;
|
import com.njcn.gather.monitor.service.IPqMonitorService;
|
||||||
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
|
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
|
||||||
|
import com.njcn.gather.plan.mapper.AdPlanMapper;
|
||||||
|
import com.njcn.gather.plan.pojo.po.AdPlan;
|
||||||
|
import com.njcn.gather.plan.service.IPqDevCheckHistoryService;
|
||||||
import com.njcn.gather.pojo.enums.DetectionResponseEnum;
|
import com.njcn.gather.pojo.enums.DetectionResponseEnum;
|
||||||
import com.njcn.gather.storage.service.DetectionDataDealService;
|
import com.njcn.gather.storage.service.DetectionDataDealService;
|
||||||
import com.njcn.gather.system.cfg.pojo.enums.SceneEnum;
|
import com.njcn.gather.system.cfg.pojo.enums.SceneEnum;
|
||||||
@@ -87,6 +90,8 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
|
|||||||
private final IDictTypeService dictTypeService;
|
private final IDictTypeService dictTypeService;
|
||||||
private final ISysUserService userService;
|
private final ISysUserService userService;
|
||||||
private final IPqDevSubService pqDevSubService;
|
private final IPqDevSubService pqDevSubService;
|
||||||
|
private final AdPlanMapper adPlanMapper;
|
||||||
|
private final IPqDevCheckHistoryService pqDevCheckHistoryService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<PqDevVO> listPqDevs(PqDevParam.QueryParam queryParam) {
|
public Page<PqDevVO> listPqDevs(PqDevParam.QueryParam queryParam) {
|
||||||
@@ -483,7 +488,7 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean updateResult(List<String> ids, List<String> adType, String code, String userId, Float temperature, Float humidity) {
|
public boolean updateResult(List<String> ids, List<String> adType, String code, String userId, Float temperature, Float humidity, boolean updateCheckNum) {
|
||||||
if (CollUtil.isNotEmpty(ids)) {
|
if (CollUtil.isNotEmpty(ids)) {
|
||||||
|
|
||||||
SysTestConfig config = sysTestConfigService.getOneConfig();
|
SysTestConfig config = sysTestConfigService.getOneConfig();
|
||||||
@@ -515,13 +520,18 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
|
|||||||
checkState = CheckStateEnum.DOCUMENTED.getValue();
|
checkState = CheckStateEnum.DOCUMENTED.getValue();
|
||||||
i = pqDevVo.getRecheckNum();
|
i = pqDevVo.getRecheckNum();
|
||||||
} else {
|
} else {
|
||||||
checkState = CheckStateEnum.CHECKED.getValue();
|
checkState = pqDevVo.getCheckState() == CheckStateEnum.DOCUMENTED.getValue() ? CheckStateEnum.DOCUMENTED.getValue() : CheckStateEnum.CHECKED.getValue();
|
||||||
i = pqDevVo.getRecheckNum() + 1;
|
if (updateCheckNum) {
|
||||||
|
i = pqDevVo.getRecheckNum() + 1;
|
||||||
|
} else {
|
||||||
|
i = pqDevVo.getRecheckNum();
|
||||||
|
}
|
||||||
wrapper.set(PqDevSub::getReportState, DevReportStateEnum.NOT_GENERATED.getValue());
|
wrapper.set(PqDevSub::getReportState, DevReportStateEnum.NOT_GENERATED.getValue());
|
||||||
}
|
}
|
||||||
wrapper.set(PqDevSub::getRecheckNum, i)
|
wrapper.set(PqDevSub::getRecheckNum, i)
|
||||||
.set(PqDevSub::getCheckState, checkState);
|
.set(PqDevSub::getCheckState, checkState);
|
||||||
pqDevSubService.update(wrapper);
|
pqDevSubService.update(wrapper);
|
||||||
|
saveCheckHistory(pqDevVo, i, checkState, userId);
|
||||||
|
|
||||||
PqDevParam.QueryParam param = new PqDevParam.QueryParam();
|
PqDevParam.QueryParam param = new PqDevParam.QueryParam();
|
||||||
param.setPlanIdList(Arrays.asList(pqDevVo.getPlanId()));
|
param.setPlanIdList(Arrays.asList(pqDevVo.getPlanId()));
|
||||||
@@ -587,6 +597,7 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
|
|||||||
w.set(PqDevSub::getReportState, DevReportStateEnum.NOT_GENERATED.getValue());
|
w.set(PqDevSub::getReportState, DevReportStateEnum.NOT_GENERATED.getValue());
|
||||||
}
|
}
|
||||||
w.update();
|
w.update();
|
||||||
|
saveCheckHistory(devId, userId);
|
||||||
|
|
||||||
PqDevParam.QueryParam param = new PqDevParam.QueryParam();
|
PqDevParam.QueryParam param = new PqDevParam.QueryParam();
|
||||||
String planId = dev.getPlanId();
|
String planId = dev.getPlanId();
|
||||||
@@ -622,6 +633,37 @@ public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void saveCheckHistory(PqDevVO pqDevVo, Integer recheckNum, Integer checkState, String userId) {
|
||||||
|
if (ObjectUtil.isNull(pqDevVo)
|
||||||
|
|| (!CheckStateEnum.CHECKED.getValue().equals(checkState) && !CheckStateEnum.DOCUMENTED.getValue().equals(checkState))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AdPlan plan = adPlanMapper.selectById(pqDevVo.getPlanId());
|
||||||
|
if (ObjectUtil.isNull(plan)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pqDevVo.setRecheckNum(recheckNum);
|
||||||
|
pqDevVo.setCheckBy(userId);
|
||||||
|
pqDevVo.setCheckTime(LocalDateTime.now());
|
||||||
|
pqDevCheckHistoryService.saveOrUpdateDeviceHistory(plan, pqDevVo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveCheckHistory(String devId, String userId) {
|
||||||
|
PqDevVO pqDevVo = this.baseMapper.selectByDevId(devId);
|
||||||
|
if (ObjectUtil.isNull(pqDevVo)
|
||||||
|
|| (!CheckStateEnum.CHECKED.getValue().equals(pqDevVo.getCheckState()) && !CheckStateEnum.DOCUMENTED.getValue().equals(pqDevVo.getCheckState()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AdPlan plan = adPlanMapper.selectById(pqDevVo.getPlanId());
|
||||||
|
if (ObjectUtil.isNull(plan)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(pqDevVo.getCheckBy())) {
|
||||||
|
pqDevVo.setCheckBy(userId);
|
||||||
|
}
|
||||||
|
pqDevCheckHistoryService.saveOrUpdateDeviceHistory(plan, pqDevVo);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updatePqDevReportState(String devId, int reportState) {
|
public void updatePqDevReportState(String devId, int reportState) {
|
||||||
LambdaUpdateWrapper<PqDevSub> updateWrapper = new LambdaUpdateWrapper<>();
|
LambdaUpdateWrapper<PqDevSub> updateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.njcn.gather.device.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.njcn.gather.device.mapper.PqStandardDevGainRecordMapper;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGainRecord;
|
||||||
|
import com.njcn.gather.device.service.IPqStandardDevGainRecordService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-15
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class PqStandardDevGainRecordServiceImpl extends ServiceImpl<PqStandardDevGainRecordMapper, PqStandardDevGainRecord> implements IPqStandardDevGainRecordService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxNum(String stdDevMonitorId, String devMonitorId) {
|
||||||
|
return this.lambdaQuery().eq(PqStandardDevGainRecord::getStdDevMonitorId, stdDevMonitorId)
|
||||||
|
.eq(PqStandardDevGainRecord::getDevMonitorId, devMonitorId)
|
||||||
|
.list().stream().mapToInt(PqStandardDevGainRecord::getNum).max().orElse(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addOrUpdate(List<PqStandardDevGainRecord> recordList) {
|
||||||
|
recordList.forEach(record -> {
|
||||||
|
List<PqStandardDevGainRecord> list = this.lambdaQuery().eq(PqStandardDevGainRecord::getStdDevMonitorId, record.getStdDevMonitorId())
|
||||||
|
.eq(PqStandardDevGainRecord::getDevMonitorId, record.getDevMonitorId()).list();
|
||||||
|
if (CollectionUtil.isNotEmpty(list)) {
|
||||||
|
this.lambdaUpdate().eq(PqStandardDevGainRecord::getStdDevMonitorId, record.getStdDevMonitorId())
|
||||||
|
.eq(PqStandardDevGainRecord::getDevMonitorId, record.getDevMonitorId())
|
||||||
|
.set(PqStandardDevGainRecord::getNum, record.getNum()).update();
|
||||||
|
} else {
|
||||||
|
this.save(record);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.njcn.gather.device.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.njcn.gather.device.mapper.PqStandardDevGainMapper;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGain;
|
||||||
|
import com.njcn.gather.device.service.IPqStandardDevGainService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @date 2026-01-12
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class PqStandardDevGainServiceImpl extends ServiceImpl<PqStandardDevGainMapper, PqStandardDevGain> implements IPqStandardDevGainService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean add(List<PqStandardDevGain> pqStandardDevGainList) {
|
||||||
|
log.info("add PqStandardDevGainList: {}", pqStandardDevGainList.size());
|
||||||
|
List<String> stdMonitorIdList = pqStandardDevGainList.stream().map(PqStandardDevGain::getStdDevMonitorId).distinct().collect(Collectors.toList());
|
||||||
|
List<String> existingStdMonitorIdList = this.listByIds(stdMonitorIdList).stream().map(PqStandardDevGain::getStdDevMonitorId).collect(Collectors.toList());
|
||||||
|
|
||||||
|
pqStandardDevGainList = pqStandardDevGainList.stream().filter(pqStandardDevGain -> !existingStdMonitorIdList.contains(pqStandardDevGain.getStdDevMonitorId())).collect(Collectors.toList());
|
||||||
|
return this.saveBatch(pqStandardDevGainList);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PqStandardDevGain get(String stdDevMonitorId) {
|
||||||
|
return this.lambdaQuery().eq(PqStandardDevGain::getStdDevMonitorId, stdDevMonitorId).one();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PqStandardDevGain> list(String stdDevId) {
|
||||||
|
return this.lambdaQuery().likeRight(PqStandardDevGain::getStdDevMonitorId, stdDevId).orderByAsc(PqStandardDevGain::getStdDevMonitorId).list();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,8 +19,11 @@ import com.njcn.common.utils.EncryptionUtil;
|
|||||||
import com.njcn.gather.device.mapper.PqStandardDevMapper;
|
import com.njcn.gather.device.mapper.PqStandardDevMapper;
|
||||||
import com.njcn.gather.device.pojo.param.PqStandardDevParam;
|
import com.njcn.gather.device.pojo.param.PqStandardDevParam;
|
||||||
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
import com.njcn.gather.device.pojo.po.PqStandardDev;
|
||||||
|
import com.njcn.gather.device.pojo.po.PqStandardDevGain;
|
||||||
import com.njcn.gather.device.pojo.vo.PqStandardDevExcel;
|
import com.njcn.gather.device.pojo.vo.PqStandardDevExcel;
|
||||||
|
import com.njcn.gather.device.pojo.vo.PqStandardDevVO;
|
||||||
import com.njcn.gather.device.pojo.vo.PreDetection;
|
import com.njcn.gather.device.pojo.vo.PreDetection;
|
||||||
|
import com.njcn.gather.device.service.IPqStandardDevGainService;
|
||||||
import com.njcn.gather.device.service.IPqStandardDevService;
|
import com.njcn.gather.device.service.IPqStandardDevService;
|
||||||
import com.njcn.gather.plan.mapper.AdPlanStandardDevMapper;
|
import com.njcn.gather.plan.mapper.AdPlanStandardDevMapper;
|
||||||
import com.njcn.gather.plan.service.IAdPlanStandardDevService;
|
import com.njcn.gather.plan.service.IAdPlanStandardDevService;
|
||||||
@@ -58,8 +61,7 @@ public class PqStandardDevServiceImpl extends ServiceImpl<PqStandardDevMapper, P
|
|||||||
private final IDevTypeService devTypeService;
|
private final IDevTypeService devTypeService;
|
||||||
private final IDictDataService dictDataService;
|
private final IDictDataService dictDataService;
|
||||||
private final IDictTypeService dictTypeService;
|
private final IDictTypeService dictTypeService;
|
||||||
private final AdPlanStandardDevMapper adPlanStandardDevMapper;
|
private final IPqStandardDevGainService pqStandardDevGainService;
|
||||||
private final IAdPlanStandardDevService adPlanStandardDevService;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<PqStandardDev> listPqStandardDevs(PqStandardDevParam.QueryParam queryParam) {
|
public Page<PqStandardDev> listPqStandardDevs(PqStandardDevParam.QueryParam queryParam) {
|
||||||
@@ -73,13 +75,17 @@ public class PqStandardDevServiceImpl extends ServiceImpl<PqStandardDevMapper, P
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PqStandardDev getPqStandardDevById(String id) {
|
public PqStandardDevVO getPqStandardDevById(String id) {
|
||||||
PqStandardDev standardDev = this.getById(id);
|
PqStandardDev standardDev = this.getById(id);
|
||||||
|
PqStandardDevVO pqStandardDevVO = BeanUtil.copyProperties(standardDev, PqStandardDevVO.class);
|
||||||
if (standardDev.getEncryptionFlag() == 1) {
|
if (standardDev.getEncryptionFlag() == 1) {
|
||||||
standardDev.setSeries(EncryptionUtil.decoderString(1, standardDev.getSeries()));
|
pqStandardDevVO.setSeries(EncryptionUtil.decoderString(1, standardDev.getSeries()));
|
||||||
standardDev.setDevKey(EncryptionUtil.decoderString(1, standardDev.getDevKey()));
|
pqStandardDevVO.setDevKey(EncryptionUtil.decoderString(1, standardDev.getDevKey()));
|
||||||
}
|
}
|
||||||
return standardDev;
|
|
||||||
|
List<PqStandardDevGain> gainList = pqStandardDevGainService.list(id);
|
||||||
|
pqStandardDevVO.setGainList(gainList);
|
||||||
|
return pqStandardDevVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -137,6 +137,10 @@ public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath
|
|||||||
// String workDir = "D:\\program\\CN_Gather";
|
// String workDir = "D:\\program\\CN_Gather";
|
||||||
// 获取映射文件存放文件夹
|
// 获取映射文件存放文件夹
|
||||||
String dirPath = workDir + "\\9100";
|
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;
|
return dirPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,6 +194,17 @@ public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath
|
|||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public boolean deleteIcd(List<String> ids) {
|
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();
|
return this.lambdaUpdate().in(PqIcdPath::getId, ids).set(PqIcdPath::getState, DataStateEnum.DELETED.getCode()).update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,8 +121,8 @@ public interface IPqMonitorService extends IService<PqMonitor> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据被检设备id和监测点编号获取监测点信息
|
* 根据被检设备id和监测点编号获取监测点信息
|
||||||
* @param id 被检设备id
|
* @param devId 设备id
|
||||||
* @param monitorNum 监测点编号
|
* @param monitorNum 监测点编号
|
||||||
*/
|
*/
|
||||||
PqMonitor getByDevAndNum(String id, int monitorNum);
|
PqMonitor getByDevIdAndNum(String devId, int monitorNum);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ public class PqMonitorServiceImpl extends ServiceImpl<PqMonitorMapper, PqMonitor
|
|||||||
if (ObjectUtil.isNotNull(pqMonitor)) {
|
if (ObjectUtil.isNotNull(pqMonitor)) {
|
||||||
BeanUtil.copyProperties(monitorList.get(0), pqMonitor, "id", "realtimeResult", "statisticsResult", "recordedResult", "realtimeNum", "statisticsNum", "recordedNum", "resultType", "qualifiedNum");
|
BeanUtil.copyProperties(monitorList.get(0), pqMonitor, "id", "realtimeResult", "statisticsResult", "recordedResult", "realtimeNum", "statisticsNum", "recordedNum", "resultType", "qualifiedNum");
|
||||||
newMonitorList.add(pqMonitor);
|
newMonitorList.add(pqMonitor);
|
||||||
|
existedMonitorList.remove(pqMonitor);
|
||||||
} else {
|
} else {
|
||||||
newMonitorList.addAll(monitorList);
|
newMonitorList.addAll(monitorList);
|
||||||
}
|
}
|
||||||
@@ -168,6 +169,7 @@ public class PqMonitorServiceImpl extends ServiceImpl<PqMonitorMapper, PqMonitor
|
|||||||
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_NOT_GENERATED.getValue());
|
this.baseMapper.updatePlanReportRState(plan.getId(), PlanReportStateEnum.REPORT_STATE_NOT_GENERATED.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.removeByIds(existedMonitorList.stream().map(PqMonitor::getId).collect(Collectors.toList()));
|
||||||
return this.saveOrUpdateBatch(newMonitorList);
|
return this.saveOrUpdateBatch(newMonitorList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +440,7 @@ public class PqMonitorServiceImpl extends ServiceImpl<PqMonitorMapper, PqMonitor
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PqMonitor getByDevAndNum(String devId, int monitorNum) {
|
public PqMonitor getByDevIdAndNum(String devId, int monitorNum) {
|
||||||
QueryWrapper<PqMonitor> wrapper = new QueryWrapper<>();
|
QueryWrapper<PqMonitor> wrapper = new QueryWrapper<>();
|
||||||
wrapper.eq("pq_monitor.Dev_Id", devId)
|
wrapper.eq("pq_monitor.Dev_Id", devId)
|
||||||
.eq("pq_monitor.Num", monitorNum);
|
.eq("pq_monitor.Num", monitorNum);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.njcn.gather.device.service.IPqDevService;
|
|||||||
import com.njcn.gather.plan.pojo.param.AdPlanParam;
|
import com.njcn.gather.plan.pojo.param.AdPlanParam;
|
||||||
import com.njcn.gather.plan.pojo.po.AdPlan;
|
import com.njcn.gather.plan.pojo.po.AdPlan;
|
||||||
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
|
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
|
||||||
|
import com.njcn.gather.plan.pojo.vo.PlanStatisticsVO;
|
||||||
import com.njcn.gather.plan.service.AsyncPlanHandler;
|
import com.njcn.gather.plan.service.AsyncPlanHandler;
|
||||||
import com.njcn.gather.plan.service.IAdPlanService;
|
import com.njcn.gather.plan.service.IAdPlanService;
|
||||||
import com.njcn.gather.type.pojo.po.DevType;
|
import com.njcn.gather.type.pojo.po.DevType;
|
||||||
@@ -198,6 +199,17 @@ public class AdPlanController extends BaseController {
|
|||||||
adPlanService.analyse(ids);
|
adPlanService.analyse(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
|
||||||
|
@PostMapping("/statistics")
|
||||||
|
@ApiOperation("检测计划统计")
|
||||||
|
@ApiImplicitParam(name = "param", value = "检测计划统计参数", required = true)
|
||||||
|
public HttpResult<PlanStatisticsVO> statistics(@RequestBody @Validated AdPlanParam.StatisticsParam param) {
|
||||||
|
String methodDescribe = getMethodDescribe("statistics");
|
||||||
|
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, param);
|
||||||
|
PlanStatisticsVO result = adPlanService.statistics(param);
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
|
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
|
||||||
@PostMapping("/listByPlanId")
|
@PostMapping("/listByPlanId")
|
||||||
@ApiOperation("查询出所有已绑定的设备")
|
@ApiOperation("查询出所有已绑定的设备")
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.njcn.gather.plan.mapper;
|
||||||
|
|
||||||
|
import com.github.yulichang.base.MPJBaseMapper;
|
||||||
|
import com.njcn.gather.plan.pojo.po.PqDevCheckHistory;
|
||||||
|
import com.njcn.gather.plan.pojo.vo.PlanStatisticsItemVO;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface PqDevCheckHistoryMapper extends MPJBaseMapper<PqDevCheckHistory> {
|
||||||
|
|
||||||
|
List<PlanStatisticsItemVO> listItemDistributions(@Param("planId") String planId,
|
||||||
|
@Param("manufacturer") String manufacturer,
|
||||||
|
@Param("devType") String devType);
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.njcn.gather.plan.mapper.PqDevCheckHistoryMapper">
|
||||||
|
|
||||||
|
<select id="listItemDistributions" resultType="com.njcn.gather.plan.pojo.vo.PlanStatisticsItemVO">
|
||||||
|
SELECT
|
||||||
|
Item_Id AS itemId,
|
||||||
|
Item_Name AS itemName,
|
||||||
|
SUM(CASE WHEN Result = 0 THEN 1 ELSE 0 END) AS unqualifiedCount
|
||||||
|
FROM pq_dev_check_history
|
||||||
|
<where>
|
||||||
|
State = 1
|
||||||
|
AND Plan_Id = #{planId}
|
||||||
|
<if test="manufacturer != null and manufacturer != ''">
|
||||||
|
AND Manufacturer = #{manufacturer}
|
||||||
|
</if>
|
||||||
|
<if test="devType != null and devType != ''">
|
||||||
|
AND Dev_Type = #{devType}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
GROUP BY Item_Id, Item_Name
|
||||||
|
ORDER BY unqualifiedCount DESC, Item_Name ASC
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
@@ -130,4 +130,17 @@ public class AdPlanParam {
|
|||||||
private String patternId;
|
private String patternId;
|
||||||
private String scriptType;
|
private String scriptType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class StatisticsParam {
|
||||||
|
@ApiModelProperty(value = "检测计划ID", required = true)
|
||||||
|
@NotBlank(message = DetectionValidMessage.PLAN_ID_NOT_BLANK)
|
||||||
|
private String planId;
|
||||||
|
|
||||||
|
@ApiModelProperty("设备厂家")
|
||||||
|
private String manufacturer;
|
||||||
|
|
||||||
|
@ApiModelProperty("设备类型")
|
||||||
|
private String devType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.njcn.gather.plan.pojo.po;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@TableName("pq_dev_check_history")
|
||||||
|
public class PqDevCheckHistory {
|
||||||
|
|
||||||
|
@TableId(value = "Id", type = IdType.ASSIGN_UUID)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@TableField("Plan_Id")
|
||||||
|
private String planId;
|
||||||
|
|
||||||
|
@TableField("Dev_Id")
|
||||||
|
private String devId;
|
||||||
|
|
||||||
|
@TableField("Dev_Type")
|
||||||
|
private String devType;
|
||||||
|
|
||||||
|
@TableField("Manufacturer")
|
||||||
|
private String manufacturer;
|
||||||
|
|
||||||
|
@TableField("ReCheck_Num")
|
||||||
|
private Integer recheckNum;
|
||||||
|
|
||||||
|
@TableField("Item_Id")
|
||||||
|
private String itemId;
|
||||||
|
|
||||||
|
@TableField("Item_Name")
|
||||||
|
private String itemName;
|
||||||
|
|
||||||
|
@TableField("Result")
|
||||||
|
private Integer result;
|
||||||
|
|
||||||
|
@TableField("Check_Time")
|
||||||
|
private LocalDateTime checkTime;
|
||||||
|
|
||||||
|
@TableField("State")
|
||||||
|
private Integer state;
|
||||||
|
|
||||||
|
@TableField("Create_By")
|
||||||
|
private String createBy;
|
||||||
|
|
||||||
|
@TableField(value = "Create_Time", fill = FieldFill.INSERT)
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@TableField("Update_By")
|
||||||
|
private String updateBy;
|
||||||
|
|
||||||
|
@TableField(value = "Update_Time", fill = FieldFill.UPDATE)
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.njcn.gather.plan.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测计划单个检测大项柱状图统计结果。
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class PlanStatisticsItemVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测大项ID。
|
||||||
|
*/
|
||||||
|
private String itemId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测大项名称。
|
||||||
|
*/
|
||||||
|
private String itemName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不合格次数。
|
||||||
|
*/
|
||||||
|
private Integer unqualifiedCount;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.njcn.gather.plan.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class PlanStatisticsOptionVO {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package com.njcn.gather.plan.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测计划统计结果。
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class PlanStatisticsVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测计划ID。
|
||||||
|
*/
|
||||||
|
private String planId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测计划名称。
|
||||||
|
*/
|
||||||
|
private String planName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有设备检测次数之和。
|
||||||
|
*/
|
||||||
|
private Integer totalCheckCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已检设备总数。
|
||||||
|
*/
|
||||||
|
private Integer checkedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未检设备总数。
|
||||||
|
*/
|
||||||
|
private Integer uncheckedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一次检测合格的设备数量。
|
||||||
|
*/
|
||||||
|
private Integer firstQualifiedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第二次检测后合格的设备数量。
|
||||||
|
*/
|
||||||
|
private Integer secondQualifiedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第三次及以上检测后合格的设备数量。
|
||||||
|
*/
|
||||||
|
private Integer thirdOrMoreQualifiedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最终合格的设备数量。
|
||||||
|
*/
|
||||||
|
private Integer qualifiedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最终不合格的设备数量。
|
||||||
|
*/
|
||||||
|
private Integer unqualifiedDeviceCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存在不合格结果的检测项数量。
|
||||||
|
*/
|
||||||
|
private Integer unqualifiedItemCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 一次合格率,百分制。
|
||||||
|
*/
|
||||||
|
private BigDecimal firstPassRate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 二次合格率,百分制。
|
||||||
|
*/
|
||||||
|
private BigDecimal secondPassRate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 三次及以上合格率,百分制。
|
||||||
|
*/
|
||||||
|
private BigDecimal thirdOrMorePassRate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不合格率,百分制。
|
||||||
|
*/
|
||||||
|
private BigDecimal unqualifiedRate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测项分布。
|
||||||
|
*/
|
||||||
|
private List<PlanStatisticsItemVO> itemDistributions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备厂家筛选项。
|
||||||
|
*/
|
||||||
|
private List<PlanStatisticsOptionVO> manufacturerOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型筛选项。
|
||||||
|
*/
|
||||||
|
private List<PlanStatisticsOptionVO> devTypeOptions;
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ import com.njcn.gather.monitor.service.IPqMonitorService;
|
|||||||
import com.njcn.gather.plan.pojo.po.AdPlan;
|
import com.njcn.gather.plan.pojo.po.AdPlan;
|
||||||
import com.njcn.gather.plan.pojo.vo.AdPlanCheckDataVO;
|
import com.njcn.gather.plan.pojo.vo.AdPlanCheckDataVO;
|
||||||
import com.njcn.gather.plan.service.util.BatchFileReader;
|
import com.njcn.gather.plan.service.util.BatchFileReader;
|
||||||
|
import com.njcn.gather.system.config.PathConfig;
|
||||||
import com.njcn.gather.system.config.handler.NonWebAutoFillValueHandler;
|
import com.njcn.gather.system.config.handler.NonWebAutoFillValueHandler;
|
||||||
import com.njcn.gather.tools.report.model.constant.ReportConstant;
|
import com.njcn.gather.tools.report.model.constant.ReportConstant;
|
||||||
import com.njcn.gather.type.pojo.po.DevType;
|
import com.njcn.gather.type.pojo.po.DevType;
|
||||||
@@ -64,11 +65,11 @@ public class AsyncPlanHandler {
|
|||||||
|
|
||||||
private final JdbcTemplate jdbcTemplate;
|
private final JdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
private final PathConfig pathConfig;
|
||||||
@Value("${report.reportDir}")
|
// @Value("${report.reportDir}")
|
||||||
private String reportPath;
|
// private String reportPath;
|
||||||
@Value("${data.homeDir}")
|
// @Value("${data.homeDir}")
|
||||||
private String dataPath;
|
// private String dataPath;
|
||||||
|
|
||||||
private static final int BATCH_SIZE = 10000;
|
private static final int BATCH_SIZE = 10000;
|
||||||
private static final int FINAL_STEP = 85;
|
private static final int FINAL_STEP = 85;
|
||||||
@@ -199,13 +200,13 @@ public class AsyncPlanHandler {
|
|||||||
|
|
||||||
// 创建 ZIP 文件
|
// 创建 ZIP 文件
|
||||||
String zipFileName = plan.getName() + "_检测数据包.zip";
|
String zipFileName = plan.getName() + "_检测数据包.zip";
|
||||||
File zipFile = FileUtil.file(dataPath + File.separator + TEST_DATA_DIR + File.separator, zipFileName);
|
File zipFile = FileUtil.file(pathConfig.getDataPath() + File.separator + TEST_DATA_DIR + File.separator, zipFileName);
|
||||||
|
|
||||||
// 添加检测报告文件
|
// 添加检测报告文件
|
||||||
if (ObjectUtil.isNotNull(report) && report.equals(1)) {
|
if (ObjectUtil.isNotNull(report) && report.equals(1)) {
|
||||||
for (PqDev dev : devList) {
|
for (PqDev dev : devList) {
|
||||||
DevType devType = devTypeService.getById(dev.getDevType());
|
DevType devType = devTypeService.getById(dev.getDevType());
|
||||||
String dirPath = reportPath.concat(File.separator).concat(devType.getName());
|
String dirPath = pathConfig.getReportPath().concat(File.separator).concat(devType.getName());
|
||||||
File reportFile = new File(dirPath.concat(File.separator).concat(dev.getCreateId()).concat(ReportConstant.DOCX));
|
File reportFile = new File(dirPath.concat(File.separator).concat(dev.getCreateId()).concat(ReportConstant.DOCX));
|
||||||
// 如果reportFile存在,则将reportFile中的文件添加到已有的zip文件中
|
// 如果reportFile存在,则将reportFile中的文件添加到已有的zip文件中
|
||||||
if (FileUtil.exist(reportFile)) {
|
if (FileUtil.exist(reportFile)) {
|
||||||
@@ -344,7 +345,7 @@ public class AsyncPlanHandler {
|
|||||||
for (File docx : docxFiles) {
|
for (File docx : docxFiles) {
|
||||||
for (PqDev dev : devList) {
|
for (PqDev dev : devList) {
|
||||||
DevType devType = devTypeService.getById(dev.getDevType());
|
DevType devType = devTypeService.getById(dev.getDevType());
|
||||||
String dirPath = reportPath.concat(File.separator).concat(devType.getName());
|
String dirPath = pathConfig.getReportPath().concat(File.separator).concat(devType.getName());
|
||||||
File reportFile = new File(dirPath.concat(File.separator).concat(dev.getCreateId()).concat(ReportConstant.DOCX));
|
File reportFile = new File(dirPath.concat(File.separator).concat(dev.getCreateId()).concat(ReportConstant.DOCX));
|
||||||
// 文件名匹配,复制到对应目录下
|
// 文件名匹配,复制到对应目录下
|
||||||
if (docx.getName().equals(reportFile.getName())) {
|
if (docx.getName().equals(reportFile.getName())) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.njcn.gather.device.pojo.po.PqStandardDev;
|
|||||||
import com.njcn.gather.plan.pojo.param.AdPlanParam;
|
import com.njcn.gather.plan.pojo.param.AdPlanParam;
|
||||||
import com.njcn.gather.plan.pojo.po.AdPlan;
|
import com.njcn.gather.plan.pojo.po.AdPlan;
|
||||||
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
|
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
|
||||||
|
import com.njcn.gather.plan.pojo.vo.PlanStatisticsVO;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
@@ -105,6 +106,14 @@ public interface IAdPlanService extends IService<AdPlan> {
|
|||||||
*/
|
*/
|
||||||
void analyse(List<String> ids);
|
void analyse(List<String> ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计检测计划结果。
|
||||||
|
*
|
||||||
|
* @param planId 检测计划ID
|
||||||
|
* @return 检测计划统计结果
|
||||||
|
*/
|
||||||
|
PlanStatisticsVO statistics(AdPlanParam.StatisticsParam param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出检测计划数据
|
* 导出检测计划数据
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.njcn.gather.plan.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.njcn.gather.device.pojo.vo.PqDevVO;
|
||||||
|
import com.njcn.gather.plan.pojo.po.AdPlan;
|
||||||
|
import com.njcn.gather.plan.pojo.po.PqDevCheckHistory;
|
||||||
|
import com.njcn.gather.plan.pojo.vo.PlanStatisticsItemVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface IPqDevCheckHistoryService extends IService<PqDevCheckHistory> {
|
||||||
|
|
||||||
|
void saveOrUpdateDeviceHistory(AdPlan plan, PqDevVO device);
|
||||||
|
|
||||||
|
void backfillPlanHistoryIfEmpty(AdPlan plan, List<PqDevVO> checkedDevices);
|
||||||
|
|
||||||
|
List<PlanStatisticsItemVO> listItemDistributions(String planId, String manufacturer, String devType);
|
||||||
|
}
|
||||||
@@ -59,6 +59,7 @@ import com.njcn.gather.plan.service.IAdPlanService;
|
|||||||
import com.njcn.gather.plan.service.IAdPlanSourceService;
|
import com.njcn.gather.plan.service.IAdPlanSourceService;
|
||||||
import com.njcn.gather.plan.service.IAdPlanStandardDevService;
|
import com.njcn.gather.plan.service.IAdPlanStandardDevService;
|
||||||
import com.njcn.gather.plan.service.IAdPlanTestConfigService;
|
import com.njcn.gather.plan.service.IAdPlanTestConfigService;
|
||||||
|
import com.njcn.gather.plan.service.IPqDevCheckHistoryService;
|
||||||
import com.njcn.gather.pojo.enums.DetectionResponseEnum;
|
import com.njcn.gather.pojo.enums.DetectionResponseEnum;
|
||||||
import com.njcn.gather.report.pojo.po.PqReport;
|
import com.njcn.gather.report.pojo.po.PqReport;
|
||||||
import com.njcn.gather.report.service.IPqReportService;
|
import com.njcn.gather.report.service.IPqReportService;
|
||||||
@@ -69,11 +70,14 @@ import com.njcn.gather.script.service.IPqScriptService;
|
|||||||
import com.njcn.gather.source.pojo.po.PqSource;
|
import com.njcn.gather.source.pojo.po.PqSource;
|
||||||
import com.njcn.gather.source.service.IPqSourceService;
|
import com.njcn.gather.source.service.IPqSourceService;
|
||||||
import com.njcn.gather.storage.pojo.param.StorageParam;
|
import com.njcn.gather.storage.pojo.param.StorageParam;
|
||||||
|
import com.njcn.gather.storage.pojo.po.SimAndDigBaseResult;
|
||||||
import com.njcn.gather.storage.service.SimAndDigHarmonicService;
|
import com.njcn.gather.storage.service.SimAndDigHarmonicService;
|
||||||
|
import com.njcn.gather.storage.service.SimAndDigNonHarmonicService;
|
||||||
import com.njcn.gather.storage.service.TableGenService;
|
import com.njcn.gather.storage.service.TableGenService;
|
||||||
import com.njcn.gather.system.cfg.pojo.enums.SceneEnum;
|
import com.njcn.gather.system.cfg.pojo.enums.SceneEnum;
|
||||||
import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
|
import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
|
||||||
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
||||||
|
import com.njcn.gather.system.config.PathConfig;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictType;
|
import com.njcn.gather.system.dictionary.pojo.po.DictType;
|
||||||
@@ -107,6 +111,8 @@ import javax.servlet.ServletOutputStream;
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -133,6 +139,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
private final IDevTypeService devTypeService;
|
private final IDevTypeService devTypeService;
|
||||||
private final IDictTypeService dictTypeService;
|
private final IDictTypeService dictTypeService;
|
||||||
private final SimAndDigHarmonicService adHarmonicService;
|
private final SimAndDigHarmonicService adHarmonicService;
|
||||||
|
private final SimAndDigNonHarmonicService adNonHarmonicService;
|
||||||
private final PqDevMapper pqDevMapper;
|
private final PqDevMapper pqDevMapper;
|
||||||
private final IPqDevSubService pqDevSubService;
|
private final IPqDevSubService pqDevSubService;
|
||||||
private final IAdPlanStandardDevService adPlanStandardDevService;
|
private final IAdPlanStandardDevService adPlanStandardDevService;
|
||||||
@@ -145,10 +152,12 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
private final IAdPariService adPairService;
|
private final IAdPariService adPairService;
|
||||||
private final IAdPlanTestConfigService adPlanTestConfigService;
|
private final IAdPlanTestConfigService adPlanTestConfigService;
|
||||||
private final ISysUserService sysUserService;
|
private final ISysUserService sysUserService;
|
||||||
|
private final IPqDevCheckHistoryService pqDevCheckHistoryService;
|
||||||
|
|
||||||
private final JdbcTemplate jdbcTemplate;
|
private final JdbcTemplate jdbcTemplate;
|
||||||
@Value("${report.reportDir}")
|
// @Value("${report.reportDir}")
|
||||||
private String reportPath;
|
// private String reportPath;
|
||||||
|
private final PathConfig pathConfig;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam) {
|
public List<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam) {
|
||||||
@@ -554,6 +563,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
child.put("pid", adPlan.getFatherPlanId());
|
child.put("pid", adPlan.getFatherPlanId());
|
||||||
child.put("name", adPlan.getName());
|
child.put("name", adPlan.getName());
|
||||||
child.put("timeCheck", adPlan.getTimeCheck());
|
child.put("timeCheck", adPlan.getTimeCheck());
|
||||||
|
child.put("dataRule", adPlan.getDataRule());
|
||||||
|
child.put("testState", adPlan.getTestState());
|
||||||
|
|
||||||
List<PqStandardDev> pqStandardDevs = adPlanStandardDevMapper.listByPlanId(Collections.singletonList(adPlan.getId()));
|
List<PqStandardDev> pqStandardDevs = adPlanStandardDevMapper.listByPlanId(Collections.singletonList(adPlan.getId()));
|
||||||
List<String> devTypeIdList = pqStandardDevs.stream().map(PqStandardDev::getDevType).collect(Collectors.toList());
|
List<String> devTypeIdList = pqStandardDevs.stream().map(PqStandardDev::getDevType).collect(Collectors.toList());
|
||||||
@@ -808,6 +819,290 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlanStatisticsVO statistics(AdPlanParam.StatisticsParam param) {
|
||||||
|
String planId = param.getPlanId();
|
||||||
|
AdPlan plan = this.getById(planId);
|
||||||
|
if (ObjectUtil.isNull(plan)) {
|
||||||
|
throw new BusinessException(DetectionResponseEnum.PLAN_NOT_EXIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PqDevVO> allPlanDevices = listPlanDevices(plan.getId(), null, null);
|
||||||
|
List<PqDevVO> planDevices = filterPlanDevices(allPlanDevices, param.getManufacturer(), param.getDevType());
|
||||||
|
List<PqDevVO> checkedDevices = planDevices.stream()
|
||||||
|
.filter(this::isCheckedDevice)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
PlanStatisticsVO statistics = new PlanStatisticsVO();
|
||||||
|
statistics.setPlanId(plan.getId());
|
||||||
|
statistics.setPlanName(plan.getName());
|
||||||
|
statistics.setManufacturerOptions(buildManufacturerOptions(allPlanDevices, param.getDevType()));
|
||||||
|
statistics.setDevTypeOptions(buildDevTypeOptions(allPlanDevices, param.getManufacturer()));
|
||||||
|
statistics.setUncheckedDeviceCount(planDevices.size() - checkedDevices.size());
|
||||||
|
statistics.setCheckedDeviceCount(checkedDevices.size());
|
||||||
|
statistics.setTotalCheckCount(checkedDevices.stream().mapToInt(dev -> defaultZero(dev.getRecheckNum())).sum());
|
||||||
|
|
||||||
|
int firstQualifiedCount = (int) checkedDevices.stream()
|
||||||
|
.filter(dev -> Objects.equals(dev.getRecheckNum(), 1))
|
||||||
|
.filter(dev -> Objects.equals(dev.getCheckResult(), CheckResultEnum.ACCORD.getValue()))
|
||||||
|
.count();
|
||||||
|
int secondQualifiedCount = (int) checkedDevices.stream()
|
||||||
|
.filter(dev -> Objects.equals(dev.getRecheckNum(), 2))
|
||||||
|
.filter(dev -> Objects.equals(dev.getCheckResult(), CheckResultEnum.ACCORD.getValue()))
|
||||||
|
.count();
|
||||||
|
int thirdOrMoreQualifiedCount = (int) checkedDevices.stream()
|
||||||
|
.filter(dev -> defaultZero(dev.getRecheckNum()) >= 3)
|
||||||
|
.filter(dev -> Objects.equals(dev.getCheckResult(), CheckResultEnum.ACCORD.getValue()))
|
||||||
|
.count();
|
||||||
|
int unqualifiedDeviceCount = (int) checkedDevices.stream()
|
||||||
|
.filter(dev -> Objects.equals(dev.getCheckResult(), CheckResultEnum.NOT_ACCORD.getValue()))
|
||||||
|
.count();
|
||||||
|
|
||||||
|
statistics.setFirstQualifiedDeviceCount(firstQualifiedCount);
|
||||||
|
statistics.setSecondQualifiedDeviceCount(secondQualifiedCount);
|
||||||
|
statistics.setThirdOrMoreQualifiedDeviceCount(thirdOrMoreQualifiedCount);
|
||||||
|
statistics.setQualifiedDeviceCount(firstQualifiedCount + secondQualifiedCount + thirdOrMoreQualifiedCount);
|
||||||
|
statistics.setUnqualifiedDeviceCount(unqualifiedDeviceCount);
|
||||||
|
statistics.setFirstPassRate(rate(firstQualifiedCount, checkedDevices.size()));
|
||||||
|
statistics.setSecondPassRate(rate(secondQualifiedCount, checkedDevices.size()));
|
||||||
|
statistics.setThirdOrMorePassRate(rate(thirdOrMoreQualifiedCount, checkedDevices.size()));
|
||||||
|
statistics.setUnqualifiedRate(rate(unqualifiedDeviceCount, checkedDevices.size()));
|
||||||
|
|
||||||
|
pqDevCheckHistoryService.backfillPlanHistoryIfEmpty(plan, checkedDevices);
|
||||||
|
List<PlanStatisticsItemVO> itemDistributions = pqDevCheckHistoryService.listItemDistributions(plan.getId(), param.getManufacturer(), param.getDevType());
|
||||||
|
statistics.setItemDistributions(itemDistributions);
|
||||||
|
statistics.setUnqualifiedItemCount(itemDistributions.stream()
|
||||||
|
.mapToInt(item -> defaultZero(item.getUnqualifiedCount()))
|
||||||
|
.sum());
|
||||||
|
return statistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<PqDevVO> listPlanDevices(String planId, String manufacturer, String devType) {
|
||||||
|
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
|
||||||
|
queryParam.setPlanIdList(Collections.singletonList(planId));
|
||||||
|
List<PqDevVO> pqDevVOList = pqDevMapper.selectByQueryParam(queryParam);
|
||||||
|
if (CollUtil.isEmpty(pqDevVOList)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return filterPlanDevices(pqDevVOList, manufacturer, devType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<PqDevVO> filterPlanDevices(List<PqDevVO> devices, String manufacturer, String devType) {
|
||||||
|
if (CollUtil.isEmpty(devices)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
return devices.stream()
|
||||||
|
.filter(dev -> StrUtil.isBlank(manufacturer) || Objects.equals(dev.getManufacturer(), manufacturer))
|
||||||
|
.filter(dev -> StrUtil.isBlank(devType) || Objects.equals(dev.getDevType(), devType))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<PlanStatisticsOptionVO> buildManufacturerOptions(List<PqDevVO> devices, String devType) {
|
||||||
|
if (CollUtil.isEmpty(devices)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<String> ids = devices.stream()
|
||||||
|
.filter(dev -> StrUtil.isBlank(devType) || Objects.equals(dev.getDevType(), devType))
|
||||||
|
.map(PqDevVO::getManufacturer)
|
||||||
|
.filter(StrUtil::isNotBlank)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Map<String, String> nameMap = ids.isEmpty()
|
||||||
|
? Collections.emptyMap()
|
||||||
|
: dictDataService.listByIds(ids).stream()
|
||||||
|
.collect(Collectors.toMap(DictData::getId, DictData::getName, (left, right) -> left));
|
||||||
|
return ids.stream()
|
||||||
|
.map(id -> new PlanStatisticsOptionVO(id, nameMap.getOrDefault(id, id)))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<PlanStatisticsOptionVO> buildDevTypeOptions(List<PqDevVO> devices, String manufacturer) {
|
||||||
|
if (CollUtil.isEmpty(devices)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<String> ids = devices.stream()
|
||||||
|
.filter(dev -> StrUtil.isBlank(manufacturer) || Objects.equals(dev.getManufacturer(), manufacturer))
|
||||||
|
.map(PqDevVO::getDevType)
|
||||||
|
.filter(StrUtil::isNotBlank)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Map<String, String> nameMap = ids.isEmpty()
|
||||||
|
? Collections.emptyMap()
|
||||||
|
: devTypeService.listByIds(ids).stream()
|
||||||
|
.collect(Collectors.toMap(DevType::getId, DevType::getName, (left, right) -> left));
|
||||||
|
return ids.stream()
|
||||||
|
.map(id -> new PlanStatisticsOptionVO(id, nameMap.getOrDefault(id, id)))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCheckedDevice(PqDevVO dev) {
|
||||||
|
return (Objects.equals(dev.getCheckState(), CheckStateEnum.CHECKED.getValue())
|
||||||
|
|| Objects.equals(dev.getCheckState(), CheckStateEnum.DOCUMENTED.getValue()))
|
||||||
|
&& !Objects.equals(dev.getCheckResult(), CheckResultEnum.UNCHECKED.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<PlanStatisticsItemVO> buildItemDistributions(AdPlan plan, List<PqDevVO> checkedDevices) {
|
||||||
|
if (CollUtil.isEmpty(checkedDevices) || StrUtil.isBlank(plan.getScriptId()) || ObjectUtil.isNull(plan.getCode())) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Integer, ScriptItemInfo> scriptItemInfoMap = getScriptItemInfoMap(plan.getScriptId());
|
||||||
|
if (CollUtil.isEmpty(scriptItemInfoMap)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, PlanStatisticsItemAccumulator> itemAccumulatorMap = new TreeMap<>();
|
||||||
|
for (PqDevVO device : checkedDevices) {
|
||||||
|
List<SimAndDigBaseResult> deviceResultList = new ArrayList<>();
|
||||||
|
deviceResultList.addAll(adNonHarmonicService.listSimAndDigBaseResult(plan.getScriptId(), plan.getCode() + "", device.getId()));
|
||||||
|
deviceResultList.addAll(adHarmonicService.listAllResultData(plan.getScriptId(), plan.getCode() + "", device.getId()));
|
||||||
|
if (CollUtil.isEmpty(deviceResultList)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, List<SimAndDigBaseResult>> deviceItemResultMap = deviceResultList.stream()
|
||||||
|
.filter(result -> ObjectUtil.isNotNull(result.getSort()))
|
||||||
|
.map(result -> new AbstractMap.SimpleEntry<>(scriptItemInfoMap.get(result.getSort()), result))
|
||||||
|
.filter(entry -> ObjectUtil.isNotNull(entry.getKey()))
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
entry -> entry.getKey().getItemId(),
|
||||||
|
TreeMap::new,
|
||||||
|
Collectors.mapping(Map.Entry::getValue, Collectors.toList())
|
||||||
|
));
|
||||||
|
|
||||||
|
deviceItemResultMap.forEach((itemId, results) -> {
|
||||||
|
boolean hasUnqualified = results.stream().anyMatch(result -> isUnqualifiedResultFlag(result.getResultFlag()));
|
||||||
|
boolean hasQualified = results.stream().anyMatch(result -> Objects.equals(result.getResultFlag(), 1));
|
||||||
|
if (!hasUnqualified && !hasQualified) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptItemInfo itemInfo = scriptItemInfoMap.get(results.get(0).getSort());
|
||||||
|
PlanStatisticsItemAccumulator accumulator = itemAccumulatorMap.computeIfAbsent(
|
||||||
|
itemId,
|
||||||
|
key -> new PlanStatisticsItemAccumulator(itemId, itemInfo.getItemName())
|
||||||
|
);
|
||||||
|
accumulator.totalCount++;
|
||||||
|
if (hasUnqualified) {
|
||||||
|
accumulator.unqualifiedCount++;
|
||||||
|
} else {
|
||||||
|
accumulator.qualifiedCount++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemAccumulatorMap.values().stream()
|
||||||
|
.map(PlanStatisticsItemAccumulator::toVO)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, ScriptItemInfo> getScriptItemInfoMap(String scriptId) {
|
||||||
|
List<PqScriptDtls> scriptDtlsList = pqScriptDtlsService.list(new LambdaQueryWrapper<PqScriptDtls>()
|
||||||
|
.eq(PqScriptDtls::getScriptId, scriptId)
|
||||||
|
.ne(PqScriptDtls::getScriptIndex, -1)
|
||||||
|
.eq(PqScriptDtls::getEnable, DataStateEnum.ENABLE.getCode())
|
||||||
|
);
|
||||||
|
if (CollUtil.isEmpty(scriptDtlsList)) {
|
||||||
|
return Collections.emptyMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> scriptTypeIds = scriptDtlsList.stream()
|
||||||
|
.map(PqScriptDtls::getScriptType)
|
||||||
|
.filter(StrUtil::isNotBlank)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Map<String, DictTree> dictTreeMap = Collections.emptyMap();
|
||||||
|
if (CollUtil.isNotEmpty(scriptTypeIds)) {
|
||||||
|
dictTreeMap = dictTreeService.getDictTreeById(scriptTypeIds).stream()
|
||||||
|
.collect(Collectors.toMap(DictTree::getId, dictTree -> dictTree, (left, right) -> left));
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, DictTree> finalDictTreeMap = dictTreeMap;
|
||||||
|
return scriptDtlsList.stream()
|
||||||
|
.collect(Collectors.groupingBy(PqScriptDtls::getScriptIndex, TreeMap::new, Collectors.toList()))
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
Map.Entry::getKey,
|
||||||
|
entry -> resolveScriptItemInfo(entry.getKey(), entry.getValue(), finalDictTreeMap),
|
||||||
|
(left, right) -> left,
|
||||||
|
TreeMap::new
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScriptItemInfo resolveScriptItemInfo(Integer sort, List<PqScriptDtls> dtlsList, Map<String, DictTree> dictTreeMap) {
|
||||||
|
if (CollUtil.isEmpty(dtlsList)) {
|
||||||
|
return new ScriptItemInfo(String.valueOf(sort), "检测项" + sort);
|
||||||
|
}
|
||||||
|
PqScriptDtls first = dtlsList.get(0);
|
||||||
|
DictTree dictTree = dictTreeMap.get(first.getScriptType());
|
||||||
|
if (ObjectUtil.isNotNull(dictTree) && StrUtil.isNotBlank(dictTree.getName())) {
|
||||||
|
return new ScriptItemInfo(dictTree.getId(), dictTree.getName());
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(first.getScriptType())) {
|
||||||
|
return new ScriptItemInfo(first.getScriptType(), "检测项" + sort);
|
||||||
|
}
|
||||||
|
return new ScriptItemInfo(String.valueOf(sort), "检测项" + sort);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUnqualifiedResultFlag(Integer resultFlag) {
|
||||||
|
return ObjectUtil.isNotNull(resultFlag)
|
||||||
|
&& !Objects.equals(resultFlag, 1)
|
||||||
|
&& !Objects.equals(resultFlag, 4)
|
||||||
|
&& !Objects.equals(resultFlag, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer defaultZero(Integer value) {
|
||||||
|
return ObjectUtil.isNull(value) ? 0 : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BigDecimal rate(Integer numerator, Integer denominator) {
|
||||||
|
if (ObjectUtil.isNull(denominator) || denominator == 0) {
|
||||||
|
return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
return BigDecimal.valueOf(defaultZero(numerator))
|
||||||
|
.multiply(BigDecimal.valueOf(100))
|
||||||
|
.divide(BigDecimal.valueOf(denominator), 2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PlanStatisticsItemAccumulator {
|
||||||
|
private final String itemId;
|
||||||
|
private final String itemName;
|
||||||
|
private int totalCount;
|
||||||
|
private int qualifiedCount;
|
||||||
|
private int unqualifiedCount;
|
||||||
|
|
||||||
|
private PlanStatisticsItemAccumulator(String itemId, String itemName) {
|
||||||
|
this.itemId = itemId;
|
||||||
|
this.itemName = itemName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PlanStatisticsItemVO toVO() {
|
||||||
|
PlanStatisticsItemVO itemVO = new PlanStatisticsItemVO();
|
||||||
|
itemVO.setItemId(itemId);
|
||||||
|
itemVO.setItemName(itemName);
|
||||||
|
itemVO.setUnqualifiedCount(unqualifiedCount);
|
||||||
|
return itemVO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ScriptItemInfo {
|
||||||
|
private final String itemId;
|
||||||
|
private final String itemName;
|
||||||
|
|
||||||
|
private ScriptItemInfo(String itemId, String itemName) {
|
||||||
|
this.itemId = itemId;
|
||||||
|
this.itemName = itemName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getItemId() {
|
||||||
|
return itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getItemName() {
|
||||||
|
return itemName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exportPlan(AdPlanParam.QueryParam queryParam) {
|
public void exportPlan(AdPlanParam.QueryParam queryParam) {
|
||||||
DictData dictData = dictDataService.getDictDataById(queryParam.getPatternId());
|
DictData dictData = dictDataService.getDictDataById(queryParam.getPatternId());
|
||||||
@@ -1264,7 +1559,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
for (int i = 1; i <= maxTime; i++) {
|
for (int i = 1; i <= maxTime; i++) {
|
||||||
row2[i] = i + "次检测";
|
row2[i] = i + "次检测";
|
||||||
int tempI = i;
|
int tempI = i;
|
||||||
List<PqDevVO> tempDevList = devList.stream().filter(dev -> dev.getRecheckNum() <= tempI).collect(Collectors.toList());
|
List<PqDevVO> tempDevList = devList.stream().filter(dev -> dev.getRecheckNum() == tempI).collect(Collectors.toList());
|
||||||
long passCount = tempDevList.stream().filter(dev -> dev.getCheckResult() == CheckResultEnum.ACCORD.getValue()).count();
|
long passCount = tempDevList.stream().filter(dev -> dev.getCheckResult() == CheckResultEnum.ACCORD.getValue()).count();
|
||||||
row3[i] = passCount + "";
|
row3[i] = passCount + "";
|
||||||
row4[i] = total + "";
|
row4[i] = total + "";
|
||||||
@@ -1721,8 +2016,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
String zipFileName = URLEncoder.encode(subPlan.getName() + ".zip", "UTF-8");
|
String zipFileName = URLEncoder.encode(subPlan.getName() + ".zip", "UTF-8");
|
||||||
File zipFile = FileUtil.file(tempDir, zipFileName);
|
File zipFile = FileUtil.file(tempDir, zipFileName);
|
||||||
|
|
||||||
// 先将json文件添加到zip中
|
// 先将json文件添加到zip中(使用UTF-8编码)
|
||||||
ZipUtil.zip(jsonFile.getAbsolutePath(), zipFile.getAbsolutePath());
|
ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, jsonFile);
|
||||||
|
|
||||||
|
|
||||||
// 创建一个临时目录存放两个文件
|
// 创建一个临时目录存放两个文件
|
||||||
@@ -1744,8 +2039,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 重新创建zip文件,包含所有文件
|
// 重新创建zip文件,包含所有文件,使用UTF-8编码
|
||||||
ZipUtil.zip(tempZipDir.getAbsolutePath(), zipFile.getAbsolutePath());
|
ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, FileUtil.file(tempZipDir));
|
||||||
|
|
||||||
// 删除临时目录
|
// 删除临时目录
|
||||||
FileUtil.del(tempZipDir);
|
FileUtil.del(tempZipDir);
|
||||||
@@ -1779,9 +2074,9 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
File zipFile = FileUtil.file(tempDir, file.getOriginalFilename());
|
File zipFile = FileUtil.file(tempDir, file.getOriginalFilename());
|
||||||
file.transferTo(zipFile);
|
file.transferTo(zipFile);
|
||||||
|
|
||||||
// 解压zip文件
|
// 解压zip文件,使用UTF-8编码
|
||||||
File unzipDir = FileUtil.mkdir(FileUtil.file(tempDir, "unzip"));
|
File unzipDir = FileUtil.mkdir(FileUtil.file(tempDir, "unzip"));
|
||||||
ZipUtil.unzip(zipFile.getAbsolutePath(), unzipDir.getAbsolutePath());
|
ZipUtil.unzip(zipFile, unzipDir, CharsetUtil.CHARSET_UTF_8);
|
||||||
|
|
||||||
// 查找解压目录中的json文件
|
// 查找解压目录中的json文件
|
||||||
File[] files = unzipDir.listFiles();
|
File[] files = unzipDir.listFiles();
|
||||||
@@ -2088,7 +2383,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
if (ObjectUtil.isNotNull(report) && report.equals(1)) {
|
if (ObjectUtil.isNotNull(report) && report.equals(1)) {
|
||||||
for (PqDev dev : devList) {
|
for (PqDev dev : devList) {
|
||||||
DevType devType = devTypeService.getById(dev.getDevType());
|
DevType devType = devTypeService.getById(dev.getDevType());
|
||||||
String dirPath = reportPath.concat(File.separator).concat(devType.getName());
|
String dirPath = pathConfig.getReportPath().concat(File.separator).concat(devType.getName());
|
||||||
File reportFile = new File(dirPath.concat(File.separator).concat(dev.getCreateId()).concat(ReportConstant.DOCX));
|
File reportFile = new File(dirPath.concat(File.separator).concat(dev.getCreateId()).concat(ReportConstant.DOCX));
|
||||||
// 如果reportFile存在,则将reportFile中的文件添加到已有的zip文件中
|
// 如果reportFile存在,则将reportFile中的文件添加到已有的zip文件中
|
||||||
if (FileUtil.exist(reportFile)) {
|
if (FileUtil.exist(reportFile)) {
|
||||||
@@ -2099,8 +2394,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重新创建zip文件,包含所有文件
|
// 重新创建zip文件,包含所有文件,使用UTF-8编码
|
||||||
ZipUtil.zip(tempZipDir.getAbsolutePath(), zipFile.getAbsolutePath());
|
ZipUtil.zip(zipFile, CharsetUtil.CHARSET_UTF_8, false, FileUtil.file(tempZipDir));
|
||||||
|
|
||||||
// 删除临时目录
|
// 删除临时目录
|
||||||
FileUtil.del(tempZipDir);
|
FileUtil.del(tempZipDir);
|
||||||
|
|||||||
@@ -0,0 +1,220 @@
|
|||||||
|
package com.njcn.gather.plan.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
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.service.impl.ServiceImpl;
|
||||||
|
import com.njcn.common.pojo.enums.common.DataStateEnum;
|
||||||
|
import com.njcn.gather.device.pojo.vo.PqDevVO;
|
||||||
|
import com.njcn.gather.plan.mapper.PqDevCheckHistoryMapper;
|
||||||
|
import com.njcn.gather.plan.pojo.po.AdPlan;
|
||||||
|
import com.njcn.gather.plan.pojo.po.PqDevCheckHistory;
|
||||||
|
import com.njcn.gather.plan.pojo.vo.PlanStatisticsItemVO;
|
||||||
|
import com.njcn.gather.plan.service.IPqDevCheckHistoryService;
|
||||||
|
import com.njcn.gather.script.mapper.PqScriptDtlsMapper;
|
||||||
|
import com.njcn.gather.script.pojo.po.PqScriptDtls;
|
||||||
|
import com.njcn.gather.storage.pojo.po.SimAndDigBaseResult;
|
||||||
|
import com.njcn.gather.storage.service.SimAndDigHarmonicService;
|
||||||
|
import com.njcn.gather.storage.service.SimAndDigNonHarmonicService;
|
||||||
|
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
||||||
|
import com.njcn.gather.system.dictionary.service.IDictTreeService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.AbstractMap;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class PqDevCheckHistoryServiceImpl extends ServiceImpl<PqDevCheckHistoryMapper, PqDevCheckHistory> implements IPqDevCheckHistoryService {
|
||||||
|
|
||||||
|
private final SimAndDigNonHarmonicService adNonHarmonicService;
|
||||||
|
private final SimAndDigHarmonicService adHarmonicService;
|
||||||
|
private final PqScriptDtlsMapper pqScriptDtlsMapper;
|
||||||
|
private final IDictTreeService dictTreeService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void saveOrUpdateDeviceHistory(AdPlan plan, PqDevVO device) {
|
||||||
|
if (ObjectUtil.isNull(plan)
|
||||||
|
|| ObjectUtil.isNull(device)
|
||||||
|
|| StrUtil.isBlank(plan.getScriptId())
|
||||||
|
|| ObjectUtil.isNull(plan.getCode())
|
||||||
|
|| StrUtil.isBlank(device.getId())
|
||||||
|
|| ObjectUtil.isNull(device.getRecheckNum())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Integer, ScriptItemInfo> scriptItemInfoMap = getScriptItemInfoMap(plan.getScriptId());
|
||||||
|
if (CollUtil.isEmpty(scriptItemInfoMap)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<SimAndDigBaseResult> resultList = new ArrayList<>();
|
||||||
|
resultList.addAll(adNonHarmonicService.listSimAndDigBaseResult(plan.getScriptId(), plan.getCode() + "", device.getId()));
|
||||||
|
resultList.addAll(adHarmonicService.listAllResultData(plan.getScriptId(), plan.getCode() + "", device.getId()));
|
||||||
|
if (CollUtil.isEmpty(resultList)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, List<SimAndDigBaseResult>> itemResultMap = resultList.stream()
|
||||||
|
.filter(result -> ObjectUtil.isNotNull(result.getSort()))
|
||||||
|
.map(result -> new AbstractMap.SimpleEntry<>(scriptItemInfoMap.get(result.getSort()), result))
|
||||||
|
.filter(entry -> ObjectUtil.isNotNull(entry.getKey()))
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
entry -> entry.getKey().getItemId(),
|
||||||
|
TreeMap::new,
|
||||||
|
Collectors.mapping(Map.Entry::getValue, Collectors.toList())
|
||||||
|
));
|
||||||
|
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
itemResultMap.forEach((itemId, results) -> {
|
||||||
|
boolean hasUnqualified = results.stream().anyMatch(result -> isUnqualifiedResultFlag(result.getResultFlag()));
|
||||||
|
boolean hasQualified = results.stream().anyMatch(result -> Objects.equals(result.getResultFlag(), 1));
|
||||||
|
if (!hasUnqualified && !hasQualified) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptItemInfo itemInfo = scriptItemInfoMap.get(results.get(0).getSort());
|
||||||
|
PqDevCheckHistory history = this.getOne(new LambdaQueryWrapper<PqDevCheckHistory>()
|
||||||
|
.eq(PqDevCheckHistory::getPlanId, plan.getId())
|
||||||
|
.eq(PqDevCheckHistory::getDevId, device.getId())
|
||||||
|
.eq(PqDevCheckHistory::getRecheckNum, device.getRecheckNum())
|
||||||
|
.eq(PqDevCheckHistory::getItemId, itemId)
|
||||||
|
.last("LIMIT 1"));
|
||||||
|
|
||||||
|
if (ObjectUtil.isNull(history)) {
|
||||||
|
history = new PqDevCheckHistory();
|
||||||
|
history.setId(UUID.randomUUID().toString().replaceAll("-", ""));
|
||||||
|
history.setPlanId(plan.getId());
|
||||||
|
history.setDevId(device.getId());
|
||||||
|
history.setRecheckNum(device.getRecheckNum());
|
||||||
|
history.setItemId(itemId);
|
||||||
|
history.setCreateBy(device.getCheckBy());
|
||||||
|
history.setCreateTime(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
history.setDevType(device.getDevType());
|
||||||
|
history.setManufacturer(device.getManufacturer());
|
||||||
|
history.setItemName(itemInfo.getItemName());
|
||||||
|
history.setResult(hasUnqualified ? 0 : 1);
|
||||||
|
history.setCheckTime(ObjectUtil.isNotNull(device.getCheckTime()) ? device.getCheckTime() : now);
|
||||||
|
history.setState(DataStateEnum.ENABLE.getCode());
|
||||||
|
history.setUpdateBy(device.getCheckBy());
|
||||||
|
history.setUpdateTime(now);
|
||||||
|
this.saveOrUpdate(history);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void backfillPlanHistoryIfEmpty(AdPlan plan, List<PqDevVO> checkedDevices) {
|
||||||
|
if (ObjectUtil.isNull(plan) || CollUtil.isEmpty(checkedDevices)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
long historyCount = this.count(new LambdaQueryWrapper<PqDevCheckHistory>()
|
||||||
|
.eq(PqDevCheckHistory::getPlanId, plan.getId())
|
||||||
|
.eq(PqDevCheckHistory::getState, DataStateEnum.ENABLE.getCode()));
|
||||||
|
if (historyCount > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
checkedDevices.forEach(device -> saveOrUpdateDeviceHistory(plan, device));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PlanStatisticsItemVO> listItemDistributions(String planId, String manufacturer, String devType) {
|
||||||
|
List<PlanStatisticsItemVO> itemDistributions = this.baseMapper.listItemDistributions(planId, manufacturer, devType);
|
||||||
|
if (CollUtil.isEmpty(itemDistributions)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
itemDistributions.forEach(item -> item.setUnqualifiedCount(defaultZero(item.getUnqualifiedCount())));
|
||||||
|
return itemDistributions;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, ScriptItemInfo> getScriptItemInfoMap(String scriptId) {
|
||||||
|
List<PqScriptDtls> scriptDtlsList = pqScriptDtlsMapper.selectList(new LambdaQueryWrapper<PqScriptDtls>()
|
||||||
|
.eq(PqScriptDtls::getScriptId, scriptId)
|
||||||
|
.ne(PqScriptDtls::getScriptIndex, -1)
|
||||||
|
.eq(PqScriptDtls::getEnable, DataStateEnum.ENABLE.getCode())
|
||||||
|
);
|
||||||
|
if (CollUtil.isEmpty(scriptDtlsList)) {
|
||||||
|
return Collections.emptyMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> scriptTypeIds = scriptDtlsList.stream()
|
||||||
|
.map(PqScriptDtls::getScriptType)
|
||||||
|
.filter(StrUtil::isNotBlank)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Map<String, DictTree> dictTreeMap = Collections.emptyMap();
|
||||||
|
if (CollUtil.isNotEmpty(scriptTypeIds)) {
|
||||||
|
dictTreeMap = dictTreeService.getDictTreeById(scriptTypeIds).stream()
|
||||||
|
.collect(Collectors.toMap(DictTree::getId, dictTree -> dictTree, (left, right) -> left));
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, DictTree> finalDictTreeMap = dictTreeMap;
|
||||||
|
return scriptDtlsList.stream()
|
||||||
|
.collect(Collectors.groupingBy(PqScriptDtls::getScriptIndex, TreeMap::new, Collectors.toList()))
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
Map.Entry::getKey,
|
||||||
|
entry -> resolveScriptItemInfo(entry.getKey(), entry.getValue(), finalDictTreeMap),
|
||||||
|
(left, right) -> left,
|
||||||
|
TreeMap::new
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScriptItemInfo resolveScriptItemInfo(Integer sort, List<PqScriptDtls> dtlsList, Map<String, DictTree> dictTreeMap) {
|
||||||
|
if (CollUtil.isEmpty(dtlsList)) {
|
||||||
|
return new ScriptItemInfo(String.valueOf(sort), "检测项" + sort);
|
||||||
|
}
|
||||||
|
PqScriptDtls first = dtlsList.get(0);
|
||||||
|
DictTree dictTree = dictTreeMap.get(first.getScriptType());
|
||||||
|
if (ObjectUtil.isNotNull(dictTree) && StrUtil.isNotBlank(dictTree.getName())) {
|
||||||
|
return new ScriptItemInfo(dictTree.getId(), dictTree.getName());
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(first.getScriptType())) {
|
||||||
|
return new ScriptItemInfo(first.getScriptType(), "检测项" + sort);
|
||||||
|
}
|
||||||
|
return new ScriptItemInfo(String.valueOf(sort), "检测项" + sort);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUnqualifiedResultFlag(Integer resultFlag) {
|
||||||
|
return ObjectUtil.isNotNull(resultFlag)
|
||||||
|
&& !Objects.equals(resultFlag, 1)
|
||||||
|
&& !Objects.equals(resultFlag, 4)
|
||||||
|
&& !Objects.equals(resultFlag, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer defaultZero(Integer value) {
|
||||||
|
return ObjectUtil.isNull(value) ? 0 : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ScriptItemInfo {
|
||||||
|
private final String itemId;
|
||||||
|
private final String itemName;
|
||||||
|
|
||||||
|
private ScriptItemInfo(String itemId, String itemName) {
|
||||||
|
this.itemId = itemId;
|
||||||
|
this.itemName = itemName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getItemId() {
|
||||||
|
return itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getItemName() {
|
||||||
|
return itemName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,7 +39,10 @@ public enum BaseReportKeyEnum {
|
|||||||
CREATE_DATE("createDate","生产日期"),
|
CREATE_DATE("createDate","生产日期"),
|
||||||
TEMPERATURE("temp","温度"),
|
TEMPERATURE("temp","温度"),
|
||||||
HUMIDITY("hum","相对湿度"),
|
HUMIDITY("hum","相对湿度"),
|
||||||
DELEGATE("delegate","委托方");
|
DELEGATE("delegate","委托方"),
|
||||||
|
CREATEDATE("createDate","出厂日期"),
|
||||||
|
HW_VERSION("hardwareVersion","硬件版本"),
|
||||||
|
SW_VERSION("softwareVersion","软件版本");
|
||||||
|
|
||||||
private String key;
|
private String key;
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public enum BookmarkEnum {
|
|||||||
|
|
||||||
private String desc;
|
private String desc;
|
||||||
|
|
||||||
|
/** 书签处理顺序:1=数据项,2=结果信息,3=目录信息;由 dealDataModelScatteredByBookmark 排序时使用 */
|
||||||
private Integer sort;
|
private Integer sort;
|
||||||
|
|
||||||
BookmarkEnum(String key, String desc, Integer sort) {
|
BookmarkEnum(String key, String desc, Integer sort) {
|
||||||
|
|||||||
@@ -61,21 +61,20 @@ import com.njcn.gather.report.service.IPqReportService;
|
|||||||
import com.njcn.gather.result.service.IResultService;
|
import com.njcn.gather.result.service.IResultService;
|
||||||
import com.njcn.gather.script.pojo.vo.PqScriptDtlDataVO;
|
import com.njcn.gather.script.pojo.vo.PqScriptDtlDataVO;
|
||||||
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
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.SimAndDigHarmonicResult;
|
||||||
import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult;
|
import com.njcn.gather.storage.pojo.po.SimAndDigNonHarmonicResult;
|
||||||
import com.njcn.gather.storage.service.SimAndDigHarmonicService;
|
import com.njcn.gather.storage.service.SimAndDigHarmonicService;
|
||||||
import com.njcn.gather.storage.service.SimAndDigNonHarmonicService;
|
import com.njcn.gather.storage.service.SimAndDigNonHarmonicService;
|
||||||
import com.njcn.gather.system.cfg.pojo.enums.SceneEnum;
|
import com.njcn.gather.system.cfg.pojo.enums.SceneEnum;
|
||||||
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
|
||||||
|
import com.njcn.gather.system.config.PathConfig;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
||||||
import com.njcn.gather.system.dictionary.service.IDictDataService;
|
import com.njcn.gather.system.dictionary.service.IDictDataService;
|
||||||
import com.njcn.gather.system.pojo.enums.SystemResponseEnum;
|
import com.njcn.gather.system.pojo.enums.SystemResponseEnum;
|
||||||
import com.njcn.gather.tools.report.model.constant.ReportConstant;
|
import com.njcn.gather.tools.report.model.constant.ReportConstant;
|
||||||
import com.njcn.gather.tools.report.service.IWordReportService;
|
import com.njcn.gather.tools.report.service.IWordReportService;
|
||||||
import com.njcn.gather.tools.report.util.BookmarkUtil;
|
import com.njcn.gather.tools.report.util.*;
|
||||||
import com.njcn.gather.tools.report.util.Docx4jUtil;
|
|
||||||
import com.njcn.gather.tools.report.util.DocxMergeUtil;
|
|
||||||
import com.njcn.gather.tools.report.util.WordDocumentUtil;
|
|
||||||
import com.njcn.gather.type.pojo.po.DevType;
|
import com.njcn.gather.type.pojo.po.DevType;
|
||||||
import com.njcn.gather.type.service.IDevTypeService;
|
import com.njcn.gather.type.service.IDevTypeService;
|
||||||
import com.njcn.gather.user.user.pojo.po.SysUser;
|
import com.njcn.gather.user.user.pojo.po.SysUser;
|
||||||
@@ -88,6 +87,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPClient;
|
||||||
import org.apache.commons.net.ftp.FTPReply;
|
import org.apache.commons.net.ftp.FTPReply;
|
||||||
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||||
import org.docx4j.jaxb.Context;
|
import org.docx4j.jaxb.Context;
|
||||||
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
|
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
|
||||||
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
|
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
|
||||||
@@ -115,6 +115,7 @@ import java.nio.file.NoSuchFileException;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
@@ -130,13 +131,24 @@ import java.util.stream.Collectors;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> implements IPqReportService {
|
public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> implements IPqReportService {
|
||||||
|
|
||||||
@Value("${report.template:D:\\template}")
|
/**
|
||||||
private String templatePath;
|
* resultMap 内部协议:当 dealDataLine 跑完一轮但未采集到任何有效合格性数据时,
|
||||||
|
* 在 resultMap 中塞入这个 key 作为"已尝试且无数据"的哨兵,避免后续 TEST_RESULT_*
|
||||||
@Value("${report.reportDir:D:\\report}")
|
* 分支的 fallback 重复调用 dealDataLine 浪费资源;同时 dealTestResultLine 检测到
|
||||||
private String reportPath;
|
* 此 key 存在时跳过结论表生成。
|
||||||
|
* <p>
|
||||||
|
* 故意使用明显非业务字符串,避免与任何 PqScriptDtls.scriptCode / PowerIndexEnum
|
||||||
|
* 的真实业务取值撞车。
|
||||||
|
*/
|
||||||
|
private static final String RESULT_MAP_NO_DATA_FLAG = "__internal_no_data__";
|
||||||
|
|
||||||
|
// @Value("${report.template:D:\\template}")
|
||||||
|
// private String templatePath;
|
||||||
|
//
|
||||||
|
// @Value("${report.reportDir:D:\\report}")
|
||||||
|
// private String reportPath;
|
||||||
|
private final PathConfig pathConfig;
|
||||||
|
|
||||||
@Value("${qr.cloud}")
|
@Value("${qr.cloud}")
|
||||||
private String cloudUrl;
|
private String cloudUrl;
|
||||||
|
|
||||||
@@ -164,6 +176,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
@Value("${qr.gcDev.path}")
|
@Value("${qr.gcDev.path}")
|
||||||
private String gcDevPath;
|
private String gcDevPath;
|
||||||
|
|
||||||
|
@Value("${report.dateFormat}")
|
||||||
|
private String dateFormat;
|
||||||
|
|
||||||
private final IPqDevService iPqDevService;
|
private final IPqDevService iPqDevService;
|
||||||
private final PqDevMapper pqDevMapper;
|
private final PqDevMapper pqDevMapper;
|
||||||
@@ -310,7 +324,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
private void uploadFile(ReportParam reportParam, PqReport pqReport, boolean isAdd) {
|
private void uploadFile(ReportParam reportParam, PqReport pqReport, boolean isAdd) {
|
||||||
MultipartFile baseFile = reportParam.getBaseFile();
|
MultipartFile baseFile = reportParam.getBaseFile();
|
||||||
MultipartFile detailFile = reportParam.getDetailFile();
|
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 = pathConfig.getReportTemplatePath() + File.separator + relativePath;
|
||||||
|
|
||||||
long FILE_SIZE_LIMIT = 5 * 1024 * 1024;
|
long FILE_SIZE_LIMIT = 5 * 1024 * 1024;
|
||||||
if (isAdd) {
|
if (isAdd) {
|
||||||
@@ -329,13 +344,13 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
throw new BusinessException(ReportResponseEnum.FILE_SIZE_ERROR);
|
throw new BusinessException(ReportResponseEnum.FILE_SIZE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
pqReport.setBasePath(newDir + baseOriginalFilename);
|
pqReport.setBasePath(relativePath + baseOriginalFilename);
|
||||||
pqReport.setDetailPath(newDir + detailOriginalFilename);
|
pqReport.setDetailPath(relativePath + detailOriginalFilename);
|
||||||
|
|
||||||
this.createDirectory(newDir);
|
this.createDirectory(newDir);
|
||||||
this.clearDirectory(newDir);
|
this.clearDirectory(newDir);
|
||||||
this.uploadFile(baseFile, pqReport.getBasePath());
|
this.uploadFile(baseFile, newDir + baseOriginalFilename);
|
||||||
this.uploadFile(detailFile, pqReport.getDetailPath());
|
this.uploadFile(detailFile, newDir + detailOriginalFilename);
|
||||||
} else {
|
} else {
|
||||||
throw new BusinessException(ReportResponseEnum.FILE_NOT_NULL);
|
throw new BusinessException(ReportResponseEnum.FILE_NOT_NULL);
|
||||||
}
|
}
|
||||||
@@ -383,34 +398,34 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
|
|
||||||
//若修改了文件名称、版本号,则需要重命名文件
|
//若修改了文件名称、版本号,则需要重命名文件
|
||||||
this.createDirectory(newDir);
|
this.createDirectory(newDir);
|
||||||
if (!oldDir.equals(newDir)) {
|
if (!oldDir.equals(relativePath)) {
|
||||||
// 文件夹重命名
|
// 文件夹重命名
|
||||||
String oldBasePathStr = oldPqReport.getBasePath();
|
String oldBasePathStr = oldPqReport.getBasePath();
|
||||||
String baseName = oldBasePathStr.substring(oldBasePathStr.lastIndexOf(File.separator) + 1);
|
String baseName = oldBasePathStr.substring(oldBasePathStr.lastIndexOf(File.separator) + 1);
|
||||||
Path oldBasePath = Paths.get(oldBasePathStr);
|
Path oldBasePath = Paths.get(pathConfig.getReportTemplatePath() + File.separator + oldBasePathStr);
|
||||||
Path newBasePath = Paths.get(newDir + baseName);
|
Path newBasePath = Paths.get(newDir + baseName);
|
||||||
pqReport.setBasePath(newDir + baseName);
|
pqReport.setBasePath(relativePath + baseName);
|
||||||
|
|
||||||
String oldDetailPathStr = oldPqReport.getDetailPath();
|
String oldDetailPathStr = oldPqReport.getDetailPath();
|
||||||
String detailName = oldDetailPathStr.substring(oldDetailPathStr.lastIndexOf(File.separator) + 1);
|
String detailName = oldDetailPathStr.substring(oldDetailPathStr.lastIndexOf(File.separator) + 1);
|
||||||
Path oldDetailPath = Paths.get(oldDetailPathStr);
|
Path oldDetailPath = Paths.get(pathConfig.getReportTemplatePath() + File.separator + oldDetailPathStr);
|
||||||
Path newDetailPath = Paths.get(newDir + detailName);
|
Path newDetailPath = Paths.get(newDir + detailName);
|
||||||
pqReport.setDetailPath(newDir + detailName);
|
pqReport.setDetailPath(relativePath + detailName);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// windows下文件夹名称不区分大小写
|
// windows下文件夹名称不区分大小写
|
||||||
if (!oldDir.equalsIgnoreCase(newDir)) {
|
if (!oldDir.equalsIgnoreCase(relativePath)) {
|
||||||
this.clearDirectory(newDir);
|
this.clearDirectory(newDir);
|
||||||
Files.move(oldBasePath, newBasePath);
|
Files.move(oldBasePath, newBasePath);
|
||||||
Files.move(oldDetailPath, newDetailPath);
|
Files.move(oldDetailPath, newDetailPath);
|
||||||
if (!oldPqReport.getName().equals(reportParam.getName()) && !this.existSameName(pqReport.getId(), oldPqReport.getName())) {
|
if (!oldPqReport.getName().equals(reportParam.getName()) && !this.existSameName(pqReport.getId(), oldPqReport.getName())) {
|
||||||
this.recursionDeleteDirectory(templatePath + File.separator + oldPqReport.getName());
|
this.recursionDeleteDirectory(pathConfig.getReportTemplatePath() + File.separator + oldPqReport.getName());
|
||||||
} else {
|
} else {
|
||||||
Paths.get(oldDir).toFile().delete();
|
Paths.get(pathConfig.getReportTemplatePath() + oldDir).toFile().delete();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 文件夹重命名
|
// 文件夹重命名
|
||||||
Paths.get(oldDir).toFile().renameTo(Paths.get(newDir).toFile());
|
Paths.get(pathConfig.getReportTemplatePath() + oldDir).toFile().renameTo(Paths.get(newDir).toFile());
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new BusinessException(ReportResponseEnum.FILE_RENAME_FAILED);
|
throw new BusinessException(ReportResponseEnum.FILE_RENAME_FAILED);
|
||||||
@@ -418,16 +433,16 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!baseFileOriginalFilename.isEmpty()) {
|
if (!baseFileOriginalFilename.isEmpty()) {
|
||||||
pqReport.setBasePath(newDir + baseFileOriginalFilename);
|
pqReport.setBasePath(relativePath + baseFileOriginalFilename);
|
||||||
Paths.get(oldPqReport.getBasePath()).toFile().delete();
|
Paths.get(pathConfig.getReportTemplatePath() + File.separator + oldPqReport.getBasePath()).toFile().delete();
|
||||||
Paths.get(newDir + oldPqReport.getBasePath().substring(oldPqReport.getBasePath().lastIndexOf(File.separator) + 1)).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()) {
|
if (!detailFileOriginalFilename.isEmpty()) {
|
||||||
pqReport.setDetailPath(newDir + detailFileOriginalFilename);
|
pqReport.setDetailPath(relativePath + detailFileOriginalFilename);
|
||||||
Paths.get(oldPqReport.getDetailPath()).toFile().delete();
|
Paths.get(pathConfig.getReportTemplatePath() + File.separator + oldPqReport.getDetailPath()).toFile().delete();
|
||||||
Paths.get(newDir + oldPqReport.getDetailPath().substring(oldPqReport.getDetailPath().lastIndexOf(File.separator) + 1)).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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -510,7 +525,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
private void deleteFile(List<String> ids) {
|
private void deleteFile(List<String> ids) {
|
||||||
List<PqReport> pqReports = this.listByIds(ids);
|
List<PqReport> pqReports = this.listByIds(ids);
|
||||||
for (PqReport pqReport : pqReports) {
|
for (PqReport pqReport : pqReports) {
|
||||||
String uploadDir = templatePath + File.separator + pqReport.getName() + File.separator + pqReport.getVersion() + File.separator;
|
String uploadDir = pathConfig.getReportTemplatePath() + File.separator + pqReport.getName() + File.separator + pqReport.getVersion() + File.separator;
|
||||||
Path uploadPath = Paths.get(uploadDir);
|
Path uploadPath = Paths.get(uploadDir);
|
||||||
if (Files.exists(uploadPath)) {
|
if (Files.exists(uploadPath)) {
|
||||||
//清空目录下的文件
|
//清空目录下的文件
|
||||||
@@ -522,7 +537,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file1.delete();
|
file1.delete();
|
||||||
String dir = templatePath + File.separator + pqReport.getName() + File.separator;
|
String dir = pathConfig.getReportTemplatePath() + File.separator + pqReport.getName() + File.separator;
|
||||||
Path dirPath = Paths.get(dir);
|
Path dirPath = Paths.get(dir);
|
||||||
File dirFile = dirPath.toFile();
|
File dirFile = dirPath.toFile();
|
||||||
File[] fileArr2 = dirFile.listFiles();
|
File[] fileArr2 = dirFile.listFiles();
|
||||||
@@ -577,6 +592,11 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
/**
|
/**
|
||||||
* 根据设备类型生成报告
|
* 根据设备类型生成报告
|
||||||
* 注:该方法目前仅支持楼下出厂检测场景,属于模板占位符替换方式,后期可能会有调整
|
* 注:该方法目前仅支持楼下出厂检测场景,属于模板占位符替换方式,后期可能会有调整
|
||||||
|
* <p>
|
||||||
|
* 批量语义:采用"任一设备失败则整批中断"——forEach 循环内任一设备抛 BusinessException
|
||||||
|
* 会终止整个循环,已生成的报告文件保留,中断之后的设备不再处理;失败原因通过异常抛给
|
||||||
|
* 调用方,调用方应提示用户修复问题后重新发起批量。此为有意保留的批量原子语义,
|
||||||
|
* 而非待修复缺陷。
|
||||||
*
|
*
|
||||||
* @param devReportParam 被检设备信息
|
* @param devReportParam 被检设备信息
|
||||||
*/
|
*/
|
||||||
@@ -611,8 +631,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
InputStream finalWordStream = DocxMergeUtil.mergeDocuments(wordFileInputStreams);
|
InputStream finalWordStream = DocxMergeUtil.mergeDocuments(wordFileInputStreams);
|
||||||
// 处理需要输出的目录地址 基础路径+设备类型+装置编号.docx
|
// 处理需要输出的目录地址 基础路径+设备类型+装置编号.docx
|
||||||
// 最终文件输出的路径
|
// 最终文件输出的路径
|
||||||
// String dirPath = reportPath.concat(File.separator).concat(devType.getName());
|
// String dirPath = pathConfig.getReportPath().concat(File.separator).concat(devType.getName());
|
||||||
String dirPath = reportPath;
|
String dirPath = pathConfig.getReportPath();
|
||||||
// 确保目录存在
|
// 确保目录存在
|
||||||
ensureDirectoryExists(dirPath);
|
ensureDirectoryExists(dirPath);
|
||||||
String reportFullPath = dirPath.concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
String reportFullPath = dirPath.concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
||||||
@@ -777,6 +797,11 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
/**
|
/**
|
||||||
* 需要支持批量生成,如果用户选择批量生成,则默认都采用测试数据的第一个合格,如果
|
* 需要支持批量生成,如果用户选择批量生成,则默认都采用测试数据的第一个合格,如果
|
||||||
* 比对模式下生成检测报告,实际后期需要根据用户选择的检测数据或者某次波形数据生成报告
|
* 比对模式下生成检测报告,实际后期需要根据用户选择的检测数据或者某次波形数据生成报告
|
||||||
|
* <p>
|
||||||
|
* 批量语义:采用"任一设备失败则整批中断"——forEach 循环内任一设备抛 BusinessException
|
||||||
|
* 会终止整个循环,已生成的报告文件保留,中断之后的设备不再处理;失败原因通过异常抛给
|
||||||
|
* 调用方,调用方应提示用户修复问题后重新发起批量。此为有意保留的批量原子语义,
|
||||||
|
* 而非待修复缺陷。
|
||||||
*
|
*
|
||||||
* @param plan 计划信息
|
* @param plan 计划信息
|
||||||
* @param devReportParam 设备信息
|
* @param devReportParam 设备信息
|
||||||
@@ -800,8 +825,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
if (Objects.isNull(report)) {
|
if (Objects.isNull(report)) {
|
||||||
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
|
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
|
||||||
}
|
}
|
||||||
Path basePath = Paths.get(report.getBasePath());
|
Path basePath = Paths.get(pathConfig.getReportTemplatePath() + File.separator + report.getBasePath());
|
||||||
Path detailPath = Paths.get(report.getDetailPath());
|
Path detailPath = Paths.get(pathConfig.getReportTemplatePath() + File.separator + report.getDetailPath());
|
||||||
try (InputStream baseInputStream = Files.newInputStream(basePath);
|
try (InputStream baseInputStream = Files.newInputStream(basePath);
|
||||||
InputStream detailInputStream = Files.newInputStream(detailPath)) {
|
InputStream detailInputStream = Files.newInputStream(detailPath)) {
|
||||||
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
|
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
|
||||||
@@ -815,7 +840,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
MainDocumentPart detailDocumentPart = detailModelDocument.getMainDocumentPart();
|
MainDocumentPart detailDocumentPart = detailModelDocument.getMainDocumentPart();
|
||||||
dealDataModelScatteredByBookmarkByPlanContrast(baseDocumentPart, detailDocumentPart, devReportParam, pqDevVO);
|
dealDataModelScatteredByBookmarkByPlanContrast(baseDocumentPart, detailDocumentPart, devReportParam, pqDevVO);
|
||||||
// 保存新的文档
|
// 保存新的文档
|
||||||
String dirPath = reportPath.concat(File.separator).concat(plan.getName());
|
String dirPath = pathConfig.getReportPath().concat(File.separator).concat(FilePathSanitizer.toSafeFileName(plan.getName()));
|
||||||
// 确保目录存在
|
// 确保目录存在
|
||||||
ensureDirectoryExists(dirPath);
|
ensureDirectoryExists(dirPath);
|
||||||
// 构建文件名:cityName_gdName_subName_name.docx
|
// 构建文件名:cityName_gdName_subName_name.docx
|
||||||
@@ -855,6 +880,11 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
/**
|
/**
|
||||||
* 根据计划绑定的报告模板生成报告
|
* 根据计划绑定的报告模板生成报告
|
||||||
* 注:该方法目前属于同用信息占位符替换,数据页为面向对象动态填充拼凑方式
|
* 注:该方法目前属于同用信息占位符替换,数据页为面向对象动态填充拼凑方式
|
||||||
|
* <p>
|
||||||
|
* 批量语义:采用"任一设备失败则整批中断"——forEach 循环内任一设备抛 BusinessException
|
||||||
|
* 会终止整个循环,已生成的报告文件保留,中断之后的设备不再处理;失败原因通过异常抛给
|
||||||
|
* 调用方,调用方应提示用户修复问题后重新发起批量。此为有意保留的批量原子语义,
|
||||||
|
* 而非待修复缺陷。
|
||||||
*
|
*
|
||||||
* @param plan 计划信息
|
* @param plan 计划信息
|
||||||
* @param devReportParam 设备信息
|
* @param devReportParam 设备信息
|
||||||
@@ -877,8 +907,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
if (Objects.isNull(report)) {
|
if (Objects.isNull(report)) {
|
||||||
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
|
throw new BusinessException(ReportResponseEnum.REPORT_TEMPLATE_NOT_EXIST);
|
||||||
}
|
}
|
||||||
Path basePath = Paths.get(report.getBasePath());
|
Path basePath = Paths.get(pathConfig.getReportTemplatePath() + File.separator + report.getBasePath());
|
||||||
Path detailPath = Paths.get(report.getDetailPath());
|
Path detailPath = Paths.get(pathConfig.getReportTemplatePath() + File.separator + report.getDetailPath());
|
||||||
try (InputStream baseInputStream = Files.newInputStream(basePath);
|
try (InputStream baseInputStream = Files.newInputStream(basePath);
|
||||||
InputStream detailInputStream = Files.newInputStream(detailPath)) {
|
InputStream detailInputStream = Files.newInputStream(detailPath)) {
|
||||||
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
|
WordprocessingMLPackage detailModelDocument = WordprocessingMLPackage.load(detailInputStream);
|
||||||
@@ -893,7 +923,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
dealDataModelScatteredByBookmark(baseDocumentPart, detailDocumentPart, devReportParam, pqDevVO);
|
dealDataModelScatteredByBookmark(baseDocumentPart, detailDocumentPart, devReportParam, pqDevVO);
|
||||||
|
|
||||||
// 保存新的文档
|
// 保存新的文档
|
||||||
String dirPath = reportPath.concat(File.separator).concat(devType.getName());
|
String dirPath = pathConfig.getReportPath().concat(File.separator).concat(FilePathSanitizer.toSafeFileName(devType.getName()));
|
||||||
// 确保目录存在
|
// 确保目录存在
|
||||||
ensureDirectoryExists(dirPath);
|
ensureDirectoryExists(dirPath);
|
||||||
baseModelDocument.save(new File(dirPath.concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX)));
|
baseModelDocument.save(new File(dirPath.concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX)));
|
||||||
@@ -944,9 +974,9 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
* 1、数据项
|
* 1、数据项
|
||||||
* 2、结果信息
|
* 2、结果信息
|
||||||
* 3、目录信息
|
* 3、目录信息
|
||||||
* 所以要先先获取的书签进行操作排序
|
* 按 BookmarkEnum.sort 字段排序,避免依赖枚举常量声明顺序
|
||||||
* */
|
* */
|
||||||
Collections.sort(bookmarkEnums);
|
bookmarkEnums.sort(Comparator.comparingInt(BookmarkEnum::getSort).thenComparingInt(Enum::ordinal));
|
||||||
List<Object> todoInsertList;
|
List<Object> todoInsertList;
|
||||||
BookmarkUtil.BookmarkInfo bookmarkInfo;
|
BookmarkUtil.BookmarkInfo bookmarkInfo;
|
||||||
Map<Integer/*回路号*/, List<ContrastTestResult>> resultMap = null;
|
Map<Integer/*回路号*/, List<ContrastTestResult>> resultMap = null;
|
||||||
@@ -1167,7 +1197,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
Integer monitorNum = next.getKey();
|
Integer monitorNum = next.getKey();
|
||||||
// 线路下的指标数据
|
// 线路下的指标数据
|
||||||
List<ContrastTestResult> contrastTestResults = next.getValue();
|
List<ContrastTestResult> contrastTestResults = next.getValue();
|
||||||
PqMonitor pqMonitor = pqMonitorService.getByDevAndNum(pqDevVO.getId(), monitorNum);
|
PqMonitor pqMonitor = pqMonitorService.getByDevIdAndNum(pqDevVO.getId(), monitorNum);
|
||||||
// 插入回路号前,先换个页
|
// 插入回路号前,先换个页
|
||||||
todoInsertList.add(Docx4jUtil.createPageBreakParagraph());
|
todoInsertList.add(Docx4jUtil.createPageBreakParagraph());
|
||||||
// 回路标题
|
// 回路标题
|
||||||
@@ -1224,9 +1254,9 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
* 1、数据项
|
* 1、数据项
|
||||||
* 2、结果信息
|
* 2、结果信息
|
||||||
* 3、目录信息
|
* 3、目录信息
|
||||||
* 所以要先先获取的书签进行操作排序
|
* 按 BookmarkEnum.sort 字段排序,避免依赖枚举常量声明顺序
|
||||||
* */
|
* */
|
||||||
Collections.sort(bookmarkEnums);
|
bookmarkEnums.sort(Comparator.comparingInt(BookmarkEnum::getSort).thenComparingInt(Enum::ordinal));
|
||||||
// 定义个结果,以便存在结果信息的书签
|
// 定义个结果,以便存在结果信息的书签
|
||||||
Map<String/*指标名称*/, List<Boolean/*以回路的顺序填充结果*/>> resultMap = new HashMap<>();
|
Map<String/*指标名称*/, List<Boolean/*以回路的顺序填充结果*/>> resultMap = new HashMap<>();
|
||||||
List<Object> todoInsertList;
|
List<Object> todoInsertList;
|
||||||
@@ -1275,7 +1305,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
if (CollUtil.isEmpty(resultMap)) {
|
if (CollUtil.isEmpty(resultMap)) {
|
||||||
dealDataLine(baseDocumentPart, devReportParam, pqDevVO, resultMap);
|
dealDataLine(baseDocumentPart, devReportParam, pqDevVO, resultMap);
|
||||||
}
|
}
|
||||||
bookmarkInfo = BookmarkUtil.getBookmarkInfo(BookmarkEnum.TEST_RESULT_LINE.getKey(), bookmarks);
|
bookmarkInfo = BookmarkUtil.getBookmarkInfo(BookmarkEnum.TEST_RESULT_DETAIL.getKey(), bookmarks);
|
||||||
todoInsertList = dealTestResultLine(devReportParam, resultMap, DocAnchorEnum.TEST_RESULT_DETAIL);
|
todoInsertList = dealTestResultLine(devReportParam, resultMap, DocAnchorEnum.TEST_RESULT_DETAIL);
|
||||||
if (Objects.nonNull(bookmarkInfo) && CollectionUtil.isNotEmpty(todoInsertList)) {
|
if (Objects.nonNull(bookmarkInfo) && CollectionUtil.isNotEmpty(todoInsertList)) {
|
||||||
BookmarkUtil.insertElement(bookmarkInfo, todoInsertList);
|
BookmarkUtil.insertElement(bookmarkInfo, todoInsertList);
|
||||||
@@ -1300,8 +1330,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
*/
|
*/
|
||||||
private List<Object> dealTestResultLine(DevReportParam devReportParam, Map<String, List<Boolean>> resultMap, DocAnchorEnum docAnchorEnum) {
|
private List<Object> dealTestResultLine(DevReportParam devReportParam, Map<String, List<Boolean>> resultMap, DocAnchorEnum docAnchorEnum) {
|
||||||
List<Object> todoInsertList = new ArrayList<>();
|
List<Object> todoInsertList = new ArrayList<>();
|
||||||
// 先判断数据有没有,如果没有,则不处理
|
// 先判断数据有没有,如果没有,则不处理(哨兵协议详见 RESULT_MAP_NO_DATA_FLAG 注释)
|
||||||
if (CollUtil.isEmpty(resultMap.get(PowerIndexEnum.UNKNOWN.getKey()))) {
|
if (!resultMap.containsKey(RESULT_MAP_NO_DATA_FLAG)) {
|
||||||
ObjectFactory factory = Context.getWmlObjectFactory();
|
ObjectFactory factory = Context.getWmlObjectFactory();
|
||||||
// 源文档的内容
|
// 源文档的内容
|
||||||
// 创建表格(示例为3列,列数可任意调整)
|
// 创建表格(示例为3列,列数可任意调整)
|
||||||
@@ -1390,13 +1420,27 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理以回路为维度的数据项,书签占位符的方式
|
* 以回路维度处理数据项,并填充 resultMap(指标合格性结论)。
|
||||||
|
* <p>
|
||||||
|
* 本方法承担双重职责:
|
||||||
|
* <ol>
|
||||||
|
* <li><b>返回值</b>:根据 modelPart 中的 H5 分组表格模板,灌入实测数据后生成可插入文档的元素列表;</li>
|
||||||
|
* <li><b>副作用</b>:把每个指标在各回路上的合格性写入 resultMap,供后续 dealTestResultLine 构造结论表使用。</li>
|
||||||
|
* </ol>
|
||||||
|
* 调用约定(务必区分以下两条路径,避免误解形参用途):
|
||||||
|
* <ul>
|
||||||
|
* <li><b>常规路径</b>(DATA_LINE 分支):modelPart 传 detail 文档(数据页模板池),返回值会被插入 DATA_LINE 书签锚点。</li>
|
||||||
|
* <li><b>fallback 路径</b>(TEST_RESULT_* 分支且 resultMap 为空时):modelPart 允许传 base 文档(封面页);此时模板池为空,返回值无业务意义,调用方应丢弃,仅借此触发 resultMap 计算。</li>
|
||||||
|
* </ul>
|
||||||
|
* 因此 modelPart 命名保持中性,不要改回 detailXxx 等带语义偏向的名字。
|
||||||
*
|
*
|
||||||
* @param detailModelDocument 数据项模板
|
* @param modelPart 文档模板部分;常规传 detail 文档,fallback 仅需算 resultMap 时可传 base 文档
|
||||||
* @param devReportParam 测试报告参数
|
* @param devReportParam 测试报告参数
|
||||||
* @param pqDevVO 被检设备
|
* @param pqDevVO 被检设备
|
||||||
|
* @param resultMap 结果性数据集合(被本方法写入;fallback 路径正是借此计算)
|
||||||
|
* @return 待插入文档的元素列表;fallback 路径下应被调用方丢弃
|
||||||
*/
|
*/
|
||||||
private List<Object> dealDataLine(MainDocumentPart detailModelDocument, DevReportParam devReportParam, PqDevVO pqDevVO, Map<String, List<Boolean>> resultMap) {
|
private List<Object> dealDataLine(MainDocumentPart modelPart, DevReportParam devReportParam, PqDevVO pqDevVO, Map<String, List<Boolean>> resultMap) {
|
||||||
List<Object> todoInsertList = new ArrayList<>();
|
List<Object> todoInsertList = new ArrayList<>();
|
||||||
// 以回路维度处理数据项
|
// 以回路维度处理数据项
|
||||||
Integer devChns = pqDevVO.getDevChns();
|
Integer devChns = pqDevVO.getDevChns();
|
||||||
@@ -1404,8 +1448,8 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
// 读取该计划的检测大项组装数据内容
|
// 读取该计划的检测大项组装数据内容
|
||||||
List<PqScriptDtlDataVO> pqScriptDtlsList = pqScriptDtlsService.getScriptDtlsDataList(devReportParam.getScriptId());
|
List<PqScriptDtlDataVO> pqScriptDtlsList = pqScriptDtlsService.getScriptDtlsDataList(devReportParam.getScriptId());
|
||||||
Map<String, List<PqScriptDtlDataVO>> scriptMap = pqScriptDtlsList.stream().collect(Collectors.groupingBy(PqScriptDtlDataVO::getScriptCode, LinkedHashMap::new, Collectors.toList()));
|
Map<String, List<PqScriptDtlDataVO>> scriptMap = pqScriptDtlsList.stream().collect(Collectors.groupingBy(PqScriptDtlDataVO::getScriptCode, LinkedHashMap::new, Collectors.toList()));
|
||||||
List<Object> allContent = detailModelDocument.getContent();
|
List<Object> allContent = modelPart.getContent();
|
||||||
List<Docx4jUtil.HeadingContent> headingContents = Docx4jUtil.extractHeading5Contents(allContent, detailModelDocument);
|
List<Docx4jUtil.HeadingContent> headingContents = Docx4jUtil.extractHeading5Contents(allContent, modelPart);
|
||||||
Map<String, List<Docx4jUtil.HeadingContent>> contentMap = headingContents.stream().collect(Collectors.groupingBy(Docx4jUtil.HeadingContent::getHeadingText, Collectors.toList()));
|
Map<String, List<Docx4jUtil.HeadingContent>> contentMap = headingContents.stream().collect(Collectors.groupingBy(Docx4jUtil.HeadingContent::getHeadingText, Collectors.toList()));
|
||||||
for (int i = 0; i < devChns; i++) {
|
for (int i = 0; i < devChns; i++) {
|
||||||
// 回路标题
|
// 回路标题
|
||||||
@@ -1473,9 +1517,11 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 如果经过一顿处理后,结果性数据集合还是空,塞个特殊数据进去,避免嵌套循环
|
// 经过一轮处理仍未采集到任何合格性数据时,塞入哨兵:
|
||||||
|
// 一是让后续 TEST_RESULT_* 分支的 fallback 看到 resultMap 非空而跳过重复调用本方法,
|
||||||
|
// 二是供 dealTestResultLine 据此跳过结论表生成(哨兵协议详见 RESULT_MAP_NO_DATA_FLAG 注释)。
|
||||||
if (CollUtil.isEmpty(resultMap)) {
|
if (CollUtil.isEmpty(resultMap)) {
|
||||||
resultMap.put(PowerIndexEnum.UNKNOWN.getKey(), Collections.singletonList(false));
|
resultMap.put(RESULT_MAP_NO_DATA_FLAG, Collections.singletonList(false));
|
||||||
}
|
}
|
||||||
return todoInsertList;
|
return todoInsertList;
|
||||||
}
|
}
|
||||||
@@ -1888,7 +1934,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
|
|
||||||
if (SceneEnum.LEAVE_FACTORY_TEST.getValue().equals(currrentScene)) {
|
if (SceneEnum.LEAVE_FACTORY_TEST.getValue().equals(currrentScene)) {
|
||||||
// 出厂测试场景
|
// 出厂测试场景
|
||||||
filePath = reportPath.concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
filePath = pathConfig.getReportPath().concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
||||||
downloadFileName = pqDevVO.getCreateId() + ReportConstant.DOCX;
|
downloadFileName = pqDevVO.getCreateId() + ReportConstant.DOCX;
|
||||||
} else if (plan != null) {
|
} else if (plan != null) {
|
||||||
// 根据计划模式确定路径结构
|
// 根据计划模式确定路径结构
|
||||||
@@ -1900,16 +1946,16 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
pqDevVO.getGdName() != null ? pqDevVO.getGdName() : "未知供电公司",
|
pqDevVO.getGdName() != null ? pqDevVO.getGdName() : "未知供电公司",
|
||||||
pqDevVO.getSubName() != null ? pqDevVO.getSubName() : "未知电站",
|
pqDevVO.getSubName() != null ? pqDevVO.getSubName() : "未知电站",
|
||||||
pqDevVO.getName() != null ? pqDevVO.getName() : "未知设备");
|
pqDevVO.getName() != null ? pqDevVO.getName() : "未知设备");
|
||||||
filePath = reportPath.concat(File.separator).concat(plan.getName()).concat(File.separator).concat(fileName);
|
filePath = pathConfig.getReportPath().concat(File.separator).concat(FilePathSanitizer.toSafeFileName(plan.getName())).concat(File.separator).concat(fileName);
|
||||||
downloadFileName = fileName;
|
downloadFileName = fileName;
|
||||||
} else {
|
} else {
|
||||||
// 数字/模拟模式:使用原来的路径结构
|
// 数字/模拟模式:使用原来的路径结构
|
||||||
filePath = reportPath.concat(File.separator).concat(devType.getName()).concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
filePath = pathConfig.getReportPath().concat(File.separator).concat(FilePathSanitizer.toSafeFileName(devType.getName())).concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
||||||
downloadFileName = pqDevVO.getCreateId() + ReportConstant.DOCX;
|
downloadFileName = pqDevVO.getCreateId() + ReportConstant.DOCX;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 兜底:使用旧的路径结构
|
// 兜底:使用旧的路径结构
|
||||||
filePath = reportPath.concat(File.separator).concat(devType.getName()).concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
filePath = pathConfig.getReportPath().concat(File.separator).concat(FilePathSanitizer.toSafeFileName(devType.getName())).concat(File.separator).concat(pqDevVO.getCreateId()).concat(ReportConstant.DOCX);
|
||||||
downloadFileName = pqDevVO.getCreateId() + ReportConstant.DOCX;
|
downloadFileName = pqDevVO.getCreateId() + ReportConstant.DOCX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2019,6 +2065,18 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
baseModelMap.put(BaseReportKeyEnum.DEV_TYPE.getKey(), devType.getName());
|
baseModelMap.put(BaseReportKeyEnum.DEV_TYPE.getKey(), devType.getName());
|
||||||
// 检测员
|
// 检测员
|
||||||
baseModelMap.put(BaseReportKeyEnum.INSPECTOR.getKey(), pqDevVO.getCheckBy() + "");
|
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) {
|
if (pqDevVO.getCheckTime() != null) {
|
||||||
baseModelMap.put(BaseReportKeyEnum.TEST_DATE.getKey(), DateUtil.format(pqDevVO.getCheckTime(), DatePattern.CHINESE_DATE_PATTERN));
|
baseModelMap.put(BaseReportKeyEnum.TEST_DATE.getKey(), DateUtil.format(pqDevVO.getCheckTime(), DatePattern.CHINESE_DATE_PATTERN));
|
||||||
@@ -2159,7 +2217,19 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
private void dealDataModel(List<InputStream> wordFileInputStreams, DevReportParam devReportParam, PqDevVO pqDevVO) throws Exception {
|
private void dealDataModel(List<InputStream> wordFileInputStreams, DevReportParam devReportParam, PqDevVO pqDevVO) throws Exception {
|
||||||
Integer devChns = pqDevVO.getDevChns();
|
Integer devChns = pqDevVO.getDevChns();
|
||||||
for (int i = 1; i <= devChns; i++) {
|
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);
|
Map<String, String> dataModelMap = new HashMap<>(16);
|
||||||
// 读取模板文件中的占位符
|
// 读取模板文件中的占位符
|
||||||
@@ -2177,11 +2247,20 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
List<SimAndDigHarmonicResult> adHarmonicResultList = adHarmonicService.listAllResultData(devReportParam.getScriptId(), devReportParam.getPlanCode(), devReportParam.getDevId() + "_" + i);
|
List<SimAndDigHarmonicResult> adHarmonicResultList = adHarmonicService.listAllResultData(devReportParam.getScriptId(), devReportParam.getPlanCode(), devReportParam.getDevId() + "_" + i);
|
||||||
|
|
||||||
// 填充数据
|
// 填充数据
|
||||||
|
int finalI = i;
|
||||||
indexKeysMap.forEach((index, keys) -> {
|
indexKeysMap.forEach((index, keys) -> {
|
||||||
String s1 = keys.stream().findFirst().get();
|
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)) {
|
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 {
|
} else {
|
||||||
// 非谐波类
|
// 非谐波类
|
||||||
if (DetectionCodeEnum.V_UNBAN.getCode().equals(s1) || DetectionCodeEnum.FREQ.getCode().equals(s1)) {
|
if (DetectionCodeEnum.V_UNBAN.getCode().equals(s1) || DetectionCodeEnum.FREQ.getCode().equals(s1)) {
|
||||||
@@ -2249,14 +2328,14 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
* @param keys key
|
* @param keys key
|
||||||
* @param index index
|
* @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 -> {
|
keys.forEach(key -> {
|
||||||
List<SimAndDigHarmonicResult> resultList = allHarmonicResultList.stream().filter(obj -> obj.getAdType().equals(key) && obj.getSort().toString().equals(index)).collect(Collectors.toList());
|
List<SimAndDigHarmonicResult> resultList = allHarmonicResultList.stream().filter(obj -> obj.getAdType().equals(key) && obj.getSort().toString().equals(index)).collect(Collectors.toList());
|
||||||
if (CollectionUtil.isNotEmpty(resultList)) {
|
if (CollectionUtil.isNotEmpty(resultList)) {
|
||||||
SimAndDigHarmonicResult adHarmonicResult = resultList.get(0);
|
SimAndDigHarmonicResult adHarmonicResult = resultList.get(0);
|
||||||
if (Objects.nonNull(adHarmonicResult)) {
|
if (Objects.nonNull(adHarmonicResult)) {
|
||||||
if (DetectionCodeEnum.V2_50.getCode().equals(key) || DetectionCodeEnum.SV_1_49.getCode().equals(key)) {
|
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)) {
|
if (DetectionCodeEnum.I2_50.getCode().equals(key) || DetectionCodeEnum.SI_1_49.getCode().equals(key)) {
|
||||||
fillHarm(dataModelMap, adHarmonicResult, index, key, 1, 1);
|
fillHarm(dataModelMap, adHarmonicResult, index, key, 1, 1);
|
||||||
@@ -2404,7 +2483,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info("找到{}台设备需要上传报告", devices.size());
|
log.info("找到{}台设备需要上传报告", devices.size());
|
||||||
String dirPath = reportPath;
|
String dirPath = pathConfig.getReportPath();
|
||||||
// 确保目录存在
|
// 确保目录存在
|
||||||
ensureDirectoryExists(dirPath);
|
ensureDirectoryExists(dirPath);
|
||||||
// 异步批量上传每台设备的报告
|
// 异步批量上传每台设备的报告
|
||||||
@@ -2464,7 +2543,7 @@ public class PqReportServiceImpl extends ServiceImpl<PqReportMapper, PqReport> i
|
|||||||
* 创建回路标题到报告中
|
* 创建回路标题到报告中
|
||||||
*/
|
*/
|
||||||
private P getContrastLineTitle(Map<String, List<Docx4jUtil.HeadingContent>> contentMap, int monitorNum, int index, ObjectFactory factory, PqDevVO pqDevVO) {
|
private P getContrastLineTitle(Map<String, List<Docx4jUtil.HeadingContent>> contentMap, int monitorNum, int index, ObjectFactory factory, PqDevVO pqDevVO) {
|
||||||
PqMonitor pqMonitor = pqMonitorService.getByDevAndNum(pqDevVO.getId(), monitorNum);
|
PqMonitor pqMonitor = pqMonitorService.getByDevIdAndNum(pqDevVO.getId(), monitorNum);
|
||||||
String monitorInfoName = "";
|
String monitorInfoName = "";
|
||||||
if (StrUtil.isNotBlank(pqDevVO.getSubName()) && Objects.nonNull(pqMonitor)) {
|
if (StrUtil.isNotBlank(pqDevVO.getSubName()) && Objects.nonNull(pqMonitor)) {
|
||||||
monitorInfoName = "(" + pqDevVO.getSubName() + "-" + pqMonitor.getName() + ")";
|
monitorInfoName = "(" + pqDevVO.getSubName() + "-" + pqMonitor.getName() + ")";
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ public class ResultController extends BaseController {
|
|||||||
String methodDescribe = getMethodDescribe("getCheckItem");
|
String methodDescribe = getMethodDescribe("getCheckItem");
|
||||||
|
|
||||||
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, monitorQueryParam);
|
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, monitorQueryParam);
|
||||||
List<ContrastTestItemVO> result = resultService.getCheckItem(monitorQueryParam.getPlanId(), monitorQueryParam.getDevId(), monitorQueryParam.getChnNum(), monitorQueryParam.getNum());
|
List<ContrastTestItemVO> result = resultService.getCheckItem(monitorQueryParam.getPlanId(), monitorQueryParam.getDevId(), monitorQueryParam.getChnNum(), monitorQueryParam.getNum(), monitorQueryParam.getCode());
|
||||||
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,4 +17,6 @@ public class MonitorQueryParam {
|
|||||||
private Integer waveNum;
|
private Integer waveNum;
|
||||||
|
|
||||||
private String planId;
|
private String planId;
|
||||||
|
|
||||||
|
private String code;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ public class ResultParam {
|
|||||||
|
|
||||||
// 模式id
|
// 模式id
|
||||||
private String patternId;
|
private String patternId;
|
||||||
|
|
||||||
|
private String code;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -104,5 +106,8 @@ public class ResultParam {
|
|||||||
|
|
||||||
@ApiModelProperty(value = "通道号", required = true)
|
@ApiModelProperty(value = "通道号", required = true)
|
||||||
private String chnNum;
|
private String chnNum;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "数据处理原则", required = true)
|
||||||
|
private String dataRuleId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,9 +123,10 @@ public interface IResultService {
|
|||||||
* @param devId
|
* @param devId
|
||||||
* @param chnNum
|
* @param chnNum
|
||||||
* @param num
|
* @param num
|
||||||
|
* @param code
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<ContrastTestItemVO> getCheckItem(String planId, String devId, String chnNum, Integer num);
|
List<ContrastTestItemVO> getCheckItem(String planId, String devId, String chnNum, Integer num,String code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取设备比对式结果,用于出比对检测的报告
|
* 获取设备比对式结果,用于出比对检测的报告
|
||||||
|
|||||||
@@ -146,11 +146,11 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
formContentVO.setErrorSysId(plan.getErrorSysId());
|
formContentVO.setErrorSysId(plan.getErrorSysId());
|
||||||
String scriptId = null;
|
String scriptId = null;
|
||||||
if (ObjectUtil.isNotNull(plan)) {
|
if (ObjectUtil.isNotNull(plan)) {
|
||||||
|
formContentVO.setDataRule(plan.getDataRule());
|
||||||
scriptId = plan.getScriptId();
|
scriptId = plan.getScriptId();
|
||||||
adPlanService.visualize(Collections.singletonList(plan));
|
adPlanService.visualize(Collections.singletonList(plan));
|
||||||
|
formContentVO.setScriptName(plan.getScriptId());
|
||||||
}
|
}
|
||||||
formContentVO.setScriptName(plan.getScriptId());
|
|
||||||
formContentVO.setDataRule(plan.getDataRule());
|
|
||||||
formContentVO.setDeviceName(pqDevService.getById(queryParam.getDeviceId()).getName());
|
formContentVO.setDeviceName(pqDevService.getById(queryParam.getDeviceId()).getName());
|
||||||
|
|
||||||
List<Map<String, String>> chnList = new ArrayList<>();
|
List<Map<String, String>> chnList = new ArrayList<>();
|
||||||
@@ -341,10 +341,19 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
private void dipScriptTypeName(List<PqScriptDtls> subValue, List<TreeDataVO> subTypeList, Map<Integer, Set<Integer>> finalResultMap, Boolean isValueType, String name, Integer start, Integer end) {
|
private void dipScriptTypeName(List<PqScriptDtls> subValue, List<TreeDataVO> subTypeList, Map<Integer, Set<Integer>> finalResultMap, Boolean isValueType, String name, Integer start, Integer end) {
|
||||||
List<TreeDataVO> info = new ArrayList<>();
|
List<TreeDataVO> info = new ArrayList<>();
|
||||||
List<PqScriptDtls> dip = subValue.stream()
|
List<PqScriptDtls> dip = subValue.stream()
|
||||||
.filter(x -> "Dip".equals(x.getValueType()) && "A".equals(x.getPhase()))
|
// .filter(x -> "Dip".equals(x.getValueType()) && "A".equals(x.getPhase()))
|
||||||
|
.filter(x -> "Dip".equals(x.getValueType()))
|
||||||
.filter(x -> x.getTransValue() >= start && x.getTransValue() <= end)
|
.filter(x -> x.getTransValue() >= start && x.getTransValue() <= end)
|
||||||
.sorted(Comparator.comparing(PqScriptDtls::getScriptIndex))
|
.sorted(Comparator.comparing(PqScriptDtls::getScriptIndex))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
LinkedHashMap<Integer, List<PqScriptDtls>> idxDipMap = dip.stream().collect(Collectors.groupingBy(d -> d.getScriptIndex(), LinkedHashMap::new, Collectors.toList()));
|
||||||
|
|
||||||
|
dip.clear();
|
||||||
|
idxDipMap.forEach((idx, scriptDtlList) -> {
|
||||||
|
scriptDtlList.sort(Comparator.comparing(PqScriptDtls::getPhase));
|
||||||
|
dip.add(scriptDtlList.get(0));
|
||||||
|
});
|
||||||
|
|
||||||
TreeDataVO vo = new TreeDataVO();
|
TreeDataVO vo = new TreeDataVO();
|
||||||
vo.setScriptTypeName(name);
|
vo.setScriptTypeName(name);
|
||||||
vo.setScriptTypeCode("Base_" + start + "_" + end);
|
vo.setScriptTypeCode("Base_" + start + "_" + end);
|
||||||
@@ -983,10 +992,10 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
DictData dictData = dictDataService.getDictDataById(param.getPatternId());
|
DictData dictData = dictDataService.getDictDataById(param.getPatternId());
|
||||||
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
|
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
|
||||||
this.createTempResultTable(param.getCode() + "_temp", true);
|
this.createTempResultTable(param.getCode() + "_temp", true);
|
||||||
this.contrastCalculateResult(param.getPlanId(), param.getCode() + "_temp", param.getErrorSysId(), param.getDeviceId(), param.getChnNum());
|
this.contrastCalculateResult(param.getPlanId(), param.getCode() + "_temp", param.getErrorSysId(), param.getDeviceId(), false, param.getDataRuleId());
|
||||||
} else {
|
} else {
|
||||||
this.createTempResultTable(param.getCode() + "_temp", false);
|
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 +1009,9 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
public void reCalculate(ResultParam.ChangeErrorSystemParam param) {
|
public void reCalculate(ResultParam.ChangeErrorSystemParam param) {
|
||||||
DictData dictData = dictDataService.getDictDataById(param.getPatternId());
|
DictData dictData = dictDataService.getDictDataById(param.getPatternId());
|
||||||
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
|
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
|
||||||
this.contrastCalculateResult(param.getPlanId(), param.getCode(), param.getErrorSysId(), param.getDeviceId(), param.getChnNum());
|
this.contrastCalculateResult(param.getPlanId(), param.getCode(), param.getErrorSysId(), param.getDeviceId(), true, param.getDataRuleId());
|
||||||
} else {
|
} 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 +1542,7 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
|
|
||||||
AdPlan plan = adPlanService.getById(queryParam.getPlanId());
|
AdPlan plan = adPlanService.getById(queryParam.getPlanId());
|
||||||
PqDev dev = pqDevService.getById(queryParam.getDeviceId());
|
PqDev dev = pqDevService.getById(queryParam.getDeviceId());
|
||||||
DictData dictData = dictDataService.getById(plan.getDataRule());
|
formContentVO.setDataRule(plan.getDataRule());
|
||||||
formContentVO.setDataRule(dictData.getName());
|
|
||||||
formContentVO.setDeviceName(dev.getName());
|
formContentVO.setDeviceName(dev.getName());
|
||||||
formContentVO.setErrorSysId(plan.getErrorSysId());
|
formContentVO.setErrorSysId(plan.getErrorSysId());
|
||||||
|
|
||||||
@@ -1581,8 +1589,6 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
public ContrastResultVO getContrastResult(ResultParam.QueryParam queryParam) {
|
public ContrastResultVO getContrastResult(ResultParam.QueryParam queryParam) {
|
||||||
ContrastResultVO contrastResultVO = new ContrastResultVO();
|
ContrastResultVO contrastResultVO = new ContrastResultVO();
|
||||||
|
|
||||||
AdPlan plan = adPlanService.getById(queryParam.getPlanId());
|
|
||||||
|
|
||||||
List<DictTree> dictTreeList = dictTreeService.getDictTreeById(Collections.singletonList(queryParam.getScriptType()));
|
List<DictTree> dictTreeList = dictTreeService.getDictTreeById(Collections.singletonList(queryParam.getScriptType()));
|
||||||
|
|
||||||
List<String> fatherIdList = dictTreeList.stream().map(DictTree::getId).collect(Collectors.toList());
|
List<String> fatherIdList = dictTreeList.stream().map(DictTree::getId).collect(Collectors.toList());
|
||||||
@@ -1604,8 +1610,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.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(), String.valueOf(plan.getCode()), contrastResultVO.getResultMap().keySet().stream().collect(Collectors.toList())));
|
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;
|
return contrastResultVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1886,10 +1892,10 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ContrastTestItemVO> getCheckItem(String planId, String devId, String chnNum, Integer num) {
|
public List<ContrastTestItemVO> getCheckItem(String planId, String devId, String chnNum, Integer num, String code) {
|
||||||
// PqDev dev = pqDevService.getById(devId);
|
// PqDev dev = pqDevService.getById(devId);
|
||||||
AdPlan plan = adPlanService.getById(planId);
|
AdPlan plan = adPlanService.getById(planId);
|
||||||
String code = String.valueOf(plan.getCode());
|
// String code = String.valueOf(plan.getCode());
|
||||||
|
|
||||||
String monitorId = devId + CnSocketUtil.SPLIT_TAG + chnNum;
|
String monitorId = devId + CnSocketUtil.SPLIT_TAG + chnNum;
|
||||||
|
|
||||||
@@ -3067,7 +3073,7 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
* @param errorSysId
|
* @param errorSysId
|
||||||
* @param devId
|
* @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", "");
|
String oldCode = code.replace("_temp", "");
|
||||||
PreDetectionParam param = new PreDetectionParam();
|
PreDetectionParam param = new PreDetectionParam();
|
||||||
param.setCode(code);
|
param.setCode(code);
|
||||||
@@ -3085,8 +3091,8 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
// } else {
|
// } else {
|
||||||
// dataRule = DictDataEnum.SECTION_VALUE;
|
// dataRule = DictDataEnum.SECTION_VALUE;
|
||||||
// }
|
// }
|
||||||
AdPlan plan = adPlanService.getById(planId);
|
// AdPlan plan = adPlanService.getById(planId);
|
||||||
DictData dictData = dictDataService.getDictDataById(plan.getDataRule());
|
DictData dictData = dictDataService.getDictDataById(dataRuleId);
|
||||||
if (ObjectUtil.isNotNull(dictData)) {
|
if (ObjectUtil.isNotNull(dictData)) {
|
||||||
dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode());
|
dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode());
|
||||||
} else {
|
} else {
|
||||||
@@ -3134,7 +3140,7 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
checkDataParam.setIsValueTypeName(false);
|
checkDataParam.setIsValueTypeName(false);
|
||||||
List<String> valueType = iPqScriptCheckDataService.getValueType(checkDataParam);
|
List<String> valueType = iPqScriptCheckDataService.getValueType(checkDataParam);
|
||||||
|
|
||||||
iPqDevService.updateResult(param.getDevIds(), valueType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity());
|
iPqDevService.updateResult(param.getDevIds(), valueType, param.getCode(), param.getUserId(), param.getTemperature(), param.getHumidity(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3144,9 +3150,9 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
* @param code
|
* @param code
|
||||||
* @param errorSysId
|
* @param errorSysId
|
||||||
* @param deviceId
|
* @param deviceId
|
||||||
* @param chnNum
|
* @param updateResult
|
||||||
*/
|
*/
|
||||||
private void contrastCalculateResult(String planId, String code, String errorSysId, String deviceId, String chnNum) {
|
private void contrastCalculateResult(String planId, String code, String errorSysId, String deviceId, boolean updateResult, String dataRuleId) {
|
||||||
String oldCode = code.replace("_temp", "");
|
String oldCode = code.replace("_temp", "");
|
||||||
|
|
||||||
Map<String, String> devIdMapComm = new HashMap<>();
|
Map<String, String> devIdMapComm = new HashMap<>();
|
||||||
@@ -3189,35 +3195,38 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DictDataEnum dataRule;
|
DictDataEnum dataRule;
|
||||||
DictData dictData = dictDataService.getDictDataById(plan.getDataRule());
|
DictData dictData = dictDataService.getDictDataById(dataRuleId);
|
||||||
if (ObjectUtil.isNotNull(dictData)) {
|
if (ObjectUtil.isNotNull(dictData)) {
|
||||||
dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode());
|
dataRule = DictDataEnum.getDictDataEnumByCode(dictData.getCode());
|
||||||
} else {
|
} else {
|
||||||
dataRule = DictDataEnum.SECTION_VALUE;
|
dataRule = DictDataEnum.SECTION_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
pqMonitorService.lambdaUpdate().set(PqMonitor::getRecordedResult, null)
|
if (updateResult) {
|
||||||
.set(PqMonitor::getRealtimeNum, null)
|
pqMonitorService.lambdaUpdate().set(PqMonitor::getRecordedResult, null)
|
||||||
.set(PqMonitor::getRecordedResult, null)
|
.set(PqMonitor::getRealtimeNum, null)
|
||||||
.set(PqMonitor::getRecordedNum, null)
|
.set(PqMonitor::getRecordedResult, null)
|
||||||
.set(PqMonitor::getStatisticsResult, null)
|
.set(PqMonitor::getRecordedNum, null)
|
||||||
.set(PqMonitor::getStatisticsNum, null)
|
.set(PqMonitor::getStatisticsResult, null)
|
||||||
.set(PqMonitor::getResultType, null)
|
.set(PqMonitor::getStatisticsNum, null)
|
||||||
.set(PqMonitor::getQualifiedNum, 0)
|
.set(PqMonitor::getResultType, null)
|
||||||
.eq(PqMonitor::getDevId, deviceId)
|
.set(PqMonitor::getQualifiedNum, 0)
|
||||||
.eq(PqMonitor::getNum, Integer.parseInt(chnNum))
|
.eq(PqMonitor::getDevId, deviceId)
|
||||||
.eq(PqMonitor::getCheckFlag, 1)
|
// .eq(PqMonitor::getNum, Integer.parseInt(chnNum))
|
||||||
.update();
|
.eq(PqMonitor::getCheckFlag, 1)
|
||||||
String monitorId = deviceId + CnSocketUtil.SPLIT_TAG + chnNum;
|
.update();
|
||||||
List<AdPair> adPairList = adPairService.listByDevIds(Arrays.asList(monitorId));
|
}
|
||||||
|
|
||||||
|
// 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()));
|
Map<Integer, List<AdPair>> numAdPairsMap = adPairList.stream().collect(Collectors.groupingBy(AdPair::getNum, Collectors.toList()));
|
||||||
|
|
||||||
numAdPairsMap.forEach((num, pairList) -> {
|
numAdPairsMap.forEach((num, pairList) -> {
|
||||||
BiMap<String, String> parsIp = HashBiMap.create();
|
|
||||||
BiMap<String, String> parsId = HashBiMap.create();
|
|
||||||
Map<String, Integer> numMap = new HashMap<>();
|
Map<String, Integer> numMap = new HashMap<>();
|
||||||
Map<String, List<AdPair>> devMonitroIdMap = pairList.stream().collect(Collectors.groupingBy(AdPair::getDevMonitorId, Collectors.toList()));
|
Map<String, List<AdPair>> devMonitroIdMap = pairList.stream().collect(Collectors.groupingBy(AdPair::getDevMonitorId, Collectors.toList()));
|
||||||
devMonitroIdMap.forEach((devMonitorId, pairList1) -> {
|
devMonitroIdMap.forEach((devMonitorId, pairList1) -> {
|
||||||
|
BiMap<String, String> parsIp = HashBiMap.create();
|
||||||
|
BiMap<String, String> parsId = HashBiMap.create();
|
||||||
String[] split1 = devMonitorId.split(CnSocketUtil.SPLIT_TAG);
|
String[] split1 = devMonitorId.split(CnSocketUtil.SPLIT_TAG);
|
||||||
AdPair adPair = pairList1.get(0);
|
AdPair adPair = pairList1.get(0);
|
||||||
String[] split2 = adPair.getStdDevMonitorId().split(CnSocketUtil.SPLIT_TAG);
|
String[] split2 = adPair.getStdDevMonitorId().split(CnSocketUtil.SPLIT_TAG);
|
||||||
@@ -3228,42 +3237,40 @@ public class ResultServiceImpl implements IResultService {
|
|||||||
numMap.put(devMonitorId, num);
|
numMap.put(devMonitorId, num);
|
||||||
numMap.put(adPair.getStdDevMonitorId(), num);
|
numMap.put(adPair.getStdDevMonitorId(), num);
|
||||||
devIdMapComm.put(standardDev.getIp(), standardDev.getId());
|
devIdMapComm.put(standardDev.getIp(), standardDev.getId());
|
||||||
});
|
|
||||||
|
|
||||||
List<ContrastNonHarmonicResult> devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, null, false, null, 0, monitorId, 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, monitorId, 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, monitorId, 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, monitorId, null);
|
List<ContrastHarmonicResult> stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, null, false, null, 1, devMonitorId, null);
|
||||||
|
|
||||||
List<DevData> devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
|
List<DevData> devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
|
||||||
List<DevData> standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
|
List<DevData> standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
|
||||||
|
|
||||||
if (CollUtil.isNotEmpty(devData) && CollUtil.isNotEmpty(standardDevData)) {
|
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);
|
detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, code, null, finalNonWaveDataSourceEnum);
|
||||||
|
|
||||||
parsId.forEach((devMonitorId, stdDevMonitorId) -> {
|
if (updateResult) {
|
||||||
String[] split = devMonitorId.split(CnSocketUtil.SPLIT_TAG);
|
pqMonitorService.updateMonitorResult(devMonitorId, null, finalNonWaveDataSourceEnum, num, null, oldCode);
|
||||||
pqMonitorService.updateMonitorResult(devMonitorId, null, finalNonWaveDataSourceEnum, num, null, oldCode);
|
pqDevService.updateResult(split1[0], null);
|
||||||
pqDevService.updateResult(split[0], null);
|
}
|
||||||
});
|
}
|
||||||
}
|
|
||||||
|
|
||||||
AdPlanTestConfig adPlanTestConfig = adPlanTestConfigService.getByPlanId(planId);
|
AdPlanTestConfig adPlanTestConfig = adPlanTestConfigService.getByPlanId(planId);
|
||||||
for (int i = 1; i <= adPlanTestConfig.getWaveRecord(); i++) {
|
for (int i = 1; i <= adPlanTestConfig.getWaveRecord(); i++) {
|
||||||
devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, monitorId, null);
|
devNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, devMonitorId, null);
|
||||||
stdDevNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, monitorId, null);
|
stdDevNonHarmonicRawDataList = contrastNonHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, devMonitorId, null);
|
||||||
devHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, monitorId, null);
|
devHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 0, devMonitorId, null);
|
||||||
stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, monitorId, null);
|
stdDevHarmonicRawDataList = contrastHarmonicService.listAllRawData(oldCode, num, i, true, null, 1, devMonitorId, null);
|
||||||
|
|
||||||
devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
|
devData = contrastToList(devNonHarmonicRawDataList, devHarmonicRawDataList, testItemMap, 0);
|
||||||
standardDevData = contrastToList(stdDevNonHarmonicRawDataList, stdDevHarmonicRawDataList, testItemMap, 1);
|
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);
|
detectionServiceImpl.processing(devData, standardDevData, parsIp, devIdMapComm, testItemMap.keySet().stream().collect(Collectors.toList()), errorSysId, dataRule, numMap, oldCode, i, DataSourceEnum.WAVE_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
parsId.forEach((devMonitorId, stdDevMonitorId) -> {
|
if (updateResult) {
|
||||||
String[] split = devMonitorId.split(CnSocketUtil.SPLIT_TAG);
|
pqMonitorService.updateMonitorResult(devMonitorId, null, WAVE_DATA, num, adPlanTestConfig.getWaveRecord(), oldCode);
|
||||||
pqMonitorService.updateMonitorResult(devMonitorId, null, WAVE_DATA, num, adPlanTestConfig.getWaveRecord(), oldCode);
|
pqDevService.updateResult(split1[0], null);
|
||||||
pqDevService.updateResult(split[0], null);
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,18 @@ public class PqScriptDtls implements Serializable {
|
|||||||
@TableField("RetainTime")
|
@TableField("RetainTime")
|
||||||
private Double retainTime;
|
private Double retainTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 暂态前延时间(S)
|
||||||
|
*/
|
||||||
|
@TableField("FPreTime")
|
||||||
|
private Double fPreTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 暂态后延时间(S)
|
||||||
|
*/
|
||||||
|
@TableField("FAfterTime")
|
||||||
|
private Double fAfterTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 变动频度(次/min)
|
* 变动频度(次/min)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import com.njcn.gather.script.service.IPqScriptCheckDataService;
|
|||||||
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
import com.njcn.gather.script.service.IPqScriptDtlsService;
|
||||||
import com.njcn.gather.script.util.ScriptDtlsDesc;
|
import com.njcn.gather.script.util.ScriptDtlsDesc;
|
||||||
import com.njcn.gather.script.util.ThreePhaseUnbalance;
|
import com.njcn.gather.script.util.ThreePhaseUnbalance;
|
||||||
|
import com.njcn.gather.source.service.IPqSourceService;
|
||||||
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
import com.njcn.gather.system.dictionary.pojo.po.DictTree;
|
||||||
import com.njcn.gather.system.dictionary.service.IDictTreeService;
|
import com.njcn.gather.system.dictionary.service.IDictTreeService;
|
||||||
import com.njcn.gather.system.pojo.enums.DicDataEnum;
|
import com.njcn.gather.system.pojo.enums.DicDataEnum;
|
||||||
@@ -68,20 +69,17 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
private final static String INHARM_I = "InHarm_I";
|
private final static String INHARM_I = "InHarm_I";
|
||||||
private final static String DIP = "Dip";
|
private final static String DIP = "Dip";
|
||||||
private final static String FLICKER = "Flicker";
|
private final static String FLICKER = "Flicker";
|
||||||
@Value("${Dip.fPreTime}")
|
// @Value("${Dip.fPreTime}")
|
||||||
private Double fPreTime;
|
// private Double fPreTime;
|
||||||
@Value("${Dip.fRampIn}")
|
@Value("${Dip.fRampIn}")
|
||||||
private Double fRampIn;
|
private Double fRampIn;
|
||||||
@Value("${Dip.fRampOut}")
|
@Value("${Dip.fRampOut}")
|
||||||
private Double fRampOut;
|
private Double fRampOut;
|
||||||
@Value("${Dip.fAfterTime}")
|
// @Value("${Dip.fAfterTime}")
|
||||||
private Double fAfterTime;
|
// private Double fAfterTime;
|
||||||
@Value("${Flicker.waveFluType}")
|
private static final String waveFluType = "SQU";
|
||||||
private String waveFluType;
|
private static final String waveType = "CPM";
|
||||||
@Value("${Flicker.waveType}")
|
private static final Double fDutyCycle = 50.0;
|
||||||
private String waveType;
|
|
||||||
@Value("${Flicker.fDutyCycle}")
|
|
||||||
private Double fDutyCycle;
|
|
||||||
|
|
||||||
|
|
||||||
private final IPqDevService pqDevService;
|
private final IPqDevService pqDevService;
|
||||||
@@ -91,6 +89,7 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
private final IDevTypeService devTypeService;
|
private final IDevTypeService devTypeService;
|
||||||
private final IDictTreeService dictTreeService;
|
private final IDictTreeService dictTreeService;
|
||||||
private final AdPlanMapper adPlanMapper;
|
private final AdPlanMapper adPlanMapper;
|
||||||
|
private final IPqSourceService pqSourceService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -385,6 +384,8 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
dip.setPhase(phase);
|
dip.setPhase(phase);
|
||||||
dip.setTransValue(dipData.getFTransValue());
|
dip.setTransValue(dipData.getFTransValue());
|
||||||
dip.setRetainTime(dipData.getRetainTime());
|
dip.setRetainTime(dipData.getRetainTime());
|
||||||
|
dip.setFPreTime(dipData.getFPreTime());
|
||||||
|
dip.setFAfterTime(dipData.getFAfterTime());
|
||||||
info.add(dip);
|
info.add(dip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -420,7 +421,7 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PqScriptDtlsParam.CheckData> scriptDtlsCheckDataList(PqScriptDtlsParam sourceIssue) {
|
public List<PqScriptDtlsParam.CheckData> scriptDtlsCheckDataList(PqScriptDtlsParam sourceIssue) {
|
||||||
Boolean valueType = pqScriptMapper.selectScriptIsValueType(sourceIssue.getScriptId());
|
// Boolean valueType = pqScriptMapper.selectScriptIsValueType(sourceIssue.getScriptId());
|
||||||
|
|
||||||
List<PqScriptDtlsParam.CheckData> info = new ArrayList<>();
|
List<PqScriptDtlsParam.CheckData> info = new ArrayList<>();
|
||||||
//获取所有下拉值情况
|
//获取所有下拉值情况
|
||||||
@@ -628,9 +629,9 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
checkData.setErrorFlag(channelListDTO.getErrorFlag());
|
checkData.setErrorFlag(channelListDTO.getErrorFlag());
|
||||||
checkData.setEnable(channelListDTO.getEnable());
|
checkData.setEnable(channelListDTO.getEnable());
|
||||||
//电压*电流*cos(电压角度-电流角度)
|
//电压*电流*cos(电压角度-电流角度)
|
||||||
checkData.setValue(channelI.get(0).getFAmp() * listDTO.getFAmp() / 10000 * Math.cos((listDTO.getFPhase() - channelI.get(0).getFPhase()) * Math.PI / 180));
|
checkData.setValue(channelI.get(0).getFAmp() * listDTO.getFAmp() / 100 * Math.cos((listDTO.getFPhase() - channelI.get(0).getFPhase()) * Math.PI / 180));
|
||||||
// if (valueType) {
|
// if (valueType) {
|
||||||
checkData.setValue(checkData.getValue() * 57.74 * 5);
|
// checkData.setValue(checkData.getValue() * 57.74 * 5);
|
||||||
// }
|
// }
|
||||||
setCheck(info, checkData, channelListDTO, checkArchive, listDTO);
|
setCheck(info, checkData, channelListDTO, checkArchive, listDTO);
|
||||||
}
|
}
|
||||||
@@ -651,9 +652,9 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
checkData.setErrorFlag(channelListDTO.getErrorFlag());
|
checkData.setErrorFlag(channelListDTO.getErrorFlag());
|
||||||
checkData.setEnable(channelListDTO.getEnable());
|
checkData.setEnable(channelListDTO.getEnable());
|
||||||
//电压*电流*cos(电压角度-电流角度)
|
//电压*电流*cos(电压角度-电流角度)
|
||||||
checkData.setValue(channelI.get(0).getFAmp() * listDTO.getFAmp() / 10000 * Math.sin((listDTO.getFPhase() - channelI.get(0).getFPhase()) * Math.PI / 180));
|
checkData.setValue(channelI.get(0).getFAmp() * listDTO.getFAmp() / 100 * Math.sin((listDTO.getFPhase() - channelI.get(0).getFPhase()) * Math.PI / 180));
|
||||||
// if (valueType) {
|
// if (valueType) {
|
||||||
checkData.setValue(checkData.getValue() * 57.74 * 5);
|
// checkData.setValue(checkData.getValue() * 57.74 * 5);
|
||||||
// }
|
// }
|
||||||
setCheck(info, checkData, channelListDTO, checkArchive, listDTO);
|
setCheck(info, checkData, channelListDTO, checkArchive, listDTO);
|
||||||
}
|
}
|
||||||
@@ -674,9 +675,9 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
checkData.setErrorFlag(channelListDTO.getErrorFlag());
|
checkData.setErrorFlag(channelListDTO.getErrorFlag());
|
||||||
checkData.setEnable(channelListDTO.getEnable());
|
checkData.setEnable(channelListDTO.getEnable());
|
||||||
//电压*电流*cos(电压角度-电流角度)
|
//电压*电流*cos(电压角度-电流角度)
|
||||||
checkData.setValue(channelI.get(0).getFAmp() * listDTO.getFAmp() / 10000);
|
checkData.setValue(channelI.get(0).getFAmp() * listDTO.getFAmp() / 100);
|
||||||
// if (valueType) {
|
// if (valueType) {
|
||||||
checkData.setValue(checkData.getValue() * 57.74 * 5);
|
// checkData.setValue(checkData.getValue() * 57.74 * 5);
|
||||||
// }
|
// }
|
||||||
setCheck(info, checkData, channelListDTO, checkArchive, listDTO);
|
setCheck(info, checkData, channelListDTO, checkArchive, listDTO);
|
||||||
}
|
}
|
||||||
@@ -779,7 +780,7 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
@Override
|
@Override
|
||||||
public Set<String> getScriptToIcdCheckInfo(PreDetectionParam param) {
|
public Set<String> getScriptToIcdCheckInfo(PreDetectionParam param) {
|
||||||
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
PqScriptIssueParam issueParam = new PqScriptIssueParam();
|
||||||
issueParam.setSourceId(param.getSourceId());
|
issueParam.setSourceId(param.getSourceName());
|
||||||
issueParam.setDevIds(param.getDevIds());
|
issueParam.setDevIds(param.getDevIds());
|
||||||
issueParam.setScriptId(param.getScriptId());
|
issueParam.setScriptId(param.getScriptId());
|
||||||
issueParam.setIsPhaseSequence(CommonEnum.FORMAL_TEST.getValue());
|
issueParam.setIsPhaseSequence(CommonEnum.FORMAL_TEST.getValue());
|
||||||
@@ -972,7 +973,7 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
for (int i = 0; i < pqScriptDtls.size(); i++) {
|
for (int i = 0; i < pqScriptDtls.size(); i++) {
|
||||||
PqScriptDtls scriptDtls = pqScriptDtls.get(i);
|
PqScriptDtls scriptDtls = pqScriptDtls.get(i);
|
||||||
// 注意此处scriptDtls.getValue() < 1.0,考虑到有些已经投入运行的地方,可能没有改库,避免不必要的异常
|
// 注意此处scriptDtls.getValue() < 1.0,考虑到有些已经投入运行的地方,可能没有改库,避免不必要的异常
|
||||||
if(scriptDtls.getValueType().equalsIgnoreCase("CUR") && scriptDtls.getValue() < 1.0){
|
if (scriptDtls.getValueType().equalsIgnoreCase("CUR") && scriptDtls.getValue() < 1.0) {
|
||||||
scriptDtls.setValue(devCurr * scriptDtls.getValue());
|
scriptDtls.setValue(devCurr * scriptDtls.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1054,18 +1055,25 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
dipDataDTO.setFTransValue(0.0);
|
dipDataDTO.setFTransValue(0.0);
|
||||||
dipDataDTO.setFRetainTime(0.0);
|
dipDataDTO.setFRetainTime(0.0);
|
||||||
|
|
||||||
dipDataDTO.setFPreTime(fPreTime);
|
// dipDataDTO.setFPreTime(fPreTime);
|
||||||
dipDataDTO.setFRampIn(fRampIn);
|
dipDataDTO.setFRampIn(fRampIn);
|
||||||
dipDataDTO.setFRampOut(fRampOut);
|
dipDataDTO.setFRampOut(fRampOut);
|
||||||
dipDataDTO.setFAfterTime(fAfterTime);
|
// dipDataDTO.setFAfterTime(fAfterTime);
|
||||||
|
|
||||||
|
|
||||||
channelListDTO.setDipData(dipDataDTO);
|
channelListDTO.setDipData(dipDataDTO);
|
||||||
//闪变数据
|
//闪变数据
|
||||||
SourceIssue.ChannelListDTO.FlickerDataDTO flickerDataDTO = new SourceIssue.ChannelListDTO.FlickerDataDTO();
|
SourceIssue.ChannelListDTO.FlickerDataDTO flickerDataDTO = new SourceIssue.ChannelListDTO.FlickerDataDTO();
|
||||||
flickerDataDTO.setWaveFluType(waveFluType);
|
SourceIssue.ChannelListDTO.FlickerDataDTO flickerData = channelListDTO.getFlickerData();
|
||||||
flickerDataDTO.setWaveType(waveType);
|
if (ObjectUtil.isNotNull(flickerData)) {
|
||||||
flickerDataDTO.setFDutyCycle(fDutyCycle);
|
flickerDataDTO.setWaveFluType(flickerData.getWaveFluType());
|
||||||
|
flickerDataDTO.setWaveType(flickerData.getWaveType());
|
||||||
|
flickerDataDTO.setFDutyCycle(flickerData.getFDutyCycle());
|
||||||
|
} else {
|
||||||
|
flickerDataDTO.setWaveFluType(waveFluType);
|
||||||
|
flickerDataDTO.setWaveType(waveType);
|
||||||
|
flickerDataDTO.setFDutyCycle(fDutyCycle);
|
||||||
|
}
|
||||||
|
|
||||||
flickerDataDTO.setFChagFre(0.0);
|
flickerDataDTO.setFChagFre(0.0);
|
||||||
flickerDataDTO.setFChagValue(0.0);
|
flickerDataDTO.setFChagValue(0.0);
|
||||||
@@ -1104,6 +1112,8 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
if (CollUtil.isNotEmpty(dipList)) {
|
if (CollUtil.isNotEmpty(dipList)) {
|
||||||
PqScriptDtls dip = dipList.get(0);
|
PqScriptDtls dip = dipList.get(0);
|
||||||
dipDataDTO.setFTransValue(dip.getTransValue());
|
dipDataDTO.setFTransValue(dip.getTransValue());
|
||||||
|
dipDataDTO.setFPreTime(dip.getFPreTime());
|
||||||
|
dipDataDTO.setFAfterTime(dip.getFAfterTime());
|
||||||
if (devFly) {
|
if (devFly) {
|
||||||
// if (isValueType) {
|
// if (isValueType) {
|
||||||
dipDataDTO.setFTransValue(dip.getTransValue());
|
dipDataDTO.setFTransValue(dip.getTransValue());
|
||||||
|
|||||||
@@ -7,8 +7,10 @@ import io.swagger.annotations.ApiModelProperty;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import javax.validation.constraints.DecimalMin;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
import javax.validation.constraints.Pattern;
|
import javax.validation.constraints.Pattern;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author caozehui
|
* @author caozehui
|
||||||
@@ -51,6 +53,14 @@ public class PqSourceParam {
|
|||||||
@ApiModelProperty("源参数")
|
@ApiModelProperty("源参数")
|
||||||
private String parameter;
|
private String parameter;
|
||||||
|
|
||||||
|
@ApiModelProperty("最大电压")
|
||||||
|
@DecimalMin("0")
|
||||||
|
private BigDecimal maxVoltage;
|
||||||
|
|
||||||
|
@ApiModelProperty("最大电流")
|
||||||
|
@DecimalMin("0")
|
||||||
|
private BigDecimal maxCurrent;
|
||||||
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class QueryParam extends BaseParam {
|
public static class QueryParam extends BaseParam {
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package com.njcn.gather.source.pojo.po;
|
package com.njcn.gather.source.pojo.po;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.njcn.db.mybatisplus.bo.BaseEntity;
|
import com.njcn.db.mybatisplus.bo.BaseEntity;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author caozehui
|
* @author caozehui
|
||||||
@@ -46,6 +48,12 @@ public class PqSource extends BaseEntity implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String parameter;
|
private String parameter;
|
||||||
|
|
||||||
|
@TableField("Max_Voltage")
|
||||||
|
private BigDecimal maxVoltage;
|
||||||
|
|
||||||
|
@TableField("Max_Current")
|
||||||
|
private BigDecimal maxCurrent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 状态:0-删除 1-正常
|
* 状态:0-删除 1-正常
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package com.njcn.gather.source.pojo;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.njcn.gather.source.pojo.param.PqSourceParam;
|
||||||
|
import com.njcn.gather.source.pojo.po.PqSource;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.validation.Validation;
|
||||||
|
import javax.validation.Validator;
|
||||||
|
import javax.validation.constraints.DecimalMin;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
public class PqSourceCapacityFieldsTest {
|
||||||
|
|
||||||
|
private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExposeExplicitCapacityColumnMappings() throws Exception {
|
||||||
|
Field maxVoltage = PqSource.class.getDeclaredField("maxVoltage");
|
||||||
|
Field maxCurrent = PqSource.class.getDeclaredField("maxCurrent");
|
||||||
|
|
||||||
|
Assert.assertEquals("Max_Voltage", maxVoltage.getAnnotation(TableField.class).value());
|
||||||
|
Assert.assertEquals("Max_Current", maxCurrent.getAnnotation(TableField.class).value());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExposeNonNegativeCapacityValidation() throws Exception {
|
||||||
|
Field maxVoltage = PqSourceParam.class.getDeclaredField("maxVoltage");
|
||||||
|
Field maxCurrent = PqSourceParam.class.getDeclaredField("maxCurrent");
|
||||||
|
|
||||||
|
Assert.assertEquals("0", maxVoltage.getAnnotation(DecimalMin.class).value());
|
||||||
|
Assert.assertEquals("0", maxCurrent.getAnnotation(DecimalMin.class).value());
|
||||||
|
|
||||||
|
PqSourceParam.UpdateParam param = new PqSourceParam.UpdateParam();
|
||||||
|
param.setId("12345678901234567890123456789012");
|
||||||
|
param.setPattern("12345678901234567890123456789012");
|
||||||
|
param.setType("12345678901234567890123456789012");
|
||||||
|
param.setDevType("12345678901234567890123456789012");
|
||||||
|
param.setMaxVoltage(new BigDecimal("-1"));
|
||||||
|
|
||||||
|
Assert.assertFalse(validator.validate(param).isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldCopyCapacityFieldsFromRequestToEntity() {
|
||||||
|
PqSourceParam.UpdateParam param = new PqSourceParam.UpdateParam();
|
||||||
|
param.setMaxVoltage(new BigDecimal("220.00"));
|
||||||
|
param.setMaxCurrent(new BigDecimal("5.00"));
|
||||||
|
|
||||||
|
PqSource source = new PqSource();
|
||||||
|
BeanUtil.copyProperties(param, source);
|
||||||
|
|
||||||
|
Assert.assertEquals(new BigDecimal("220.00"), source.getMaxVoltage());
|
||||||
|
Assert.assertEquals(new BigDecimal("5.00"), source.getMaxCurrent());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
server:
|
server:
|
||||||
port: 18092
|
port: 18093
|
||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: entrance
|
name: entrance
|
||||||
datasource:
|
datasource:
|
||||||
druid:
|
druid:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
# url: jdbc:mysql://192.168.1.24:13306/pqs91002?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
|
url: jdbc:mysql://192.168.1.24:13306/pqs9100?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
|
||||||
# username: root
|
# username: root
|
||||||
# password: njcnpqs
|
# password: njcnpqs
|
||||||
url: jdbc:mysql://192.168.1.24:13306/pqs9100_nx?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
|
# url: jdbc:mysql://127.0.0.1:3306/pqs9100?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
|
||||||
username: root
|
username: root
|
||||||
password: njcnpqs
|
password: njcnpqs
|
||||||
#初始化建立物理连接的个数、最小、最大连接数
|
#初始化建立物理连接的个数、最小、最大连接数
|
||||||
@@ -36,9 +36,9 @@ mybatis-plus:
|
|||||||
#驼峰命名
|
#驼峰命名
|
||||||
map-underscore-to-camel-case: true
|
map-underscore-to-camel-case: true
|
||||||
#配置sql日志输出
|
#配置sql日志输出
|
||||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
#关闭日志输出
|
#关闭日志输出
|
||||||
# log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
|
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
|
||||||
global-config:
|
global-config:
|
||||||
db-config:
|
db-config:
|
||||||
#指定主键生成策略
|
#指定主键生成策略
|
||||||
@@ -64,29 +64,32 @@ webSocket:
|
|||||||
|
|
||||||
#源参数下发,暂态数据默认值
|
#源参数下发,暂态数据默认值
|
||||||
Dip:
|
Dip:
|
||||||
#暂态前时间(s)
|
# 暂态前时间(s)
|
||||||
fPreTime: 2f
|
# fPreTime: 2f
|
||||||
#写入时间(s)
|
#写入时间(s)
|
||||||
fRampIn: 0.001f
|
fRampIn: 0.001f
|
||||||
#写出时间(s)
|
#写出时间(s)
|
||||||
fRampOut: 0.001f
|
fRampOut: 0.001f
|
||||||
#暂态后时间(s)
|
# 暂态后时间(s)
|
||||||
fAfterTime: 3f
|
# fAfterTime: 3f
|
||||||
|
|
||||||
|
|
||||||
Flicker:
|
#Flicker:
|
||||||
waveFluType: CPM
|
# waveFluType: CPM
|
||||||
waveType: SQU
|
# waveType: SQU
|
||||||
fDutyCycle: 50f
|
# fDutyCycle: 50f
|
||||||
|
|
||||||
log:
|
#log:
|
||||||
homeDir: D:\logs
|
# homeDir: D:\logs
|
||||||
commonLevel: info
|
# commonLevel: info
|
||||||
report:
|
report:
|
||||||
template: D:\template
|
# template: D:\template
|
||||||
reportDir: D:\report
|
# reportDir: D:\report
|
||||||
data:
|
dateFormat: yyyy年MM月dd日
|
||||||
homeDir: D:\data
|
#data:
|
||||||
|
# homeDir: D:\data
|
||||||
|
#resource:
|
||||||
|
# videoDir: ${data.homeDir}\resources\videos
|
||||||
qr:
|
qr:
|
||||||
cloud: http://pqmcc.com:18082/api/file
|
cloud: http://pqmcc.com:18082/api/file
|
||||||
dev:
|
dev:
|
||||||
@@ -121,4 +124,4 @@ power-quality:
|
|||||||
# 激活配置
|
# 激活配置
|
||||||
activate:
|
activate:
|
||||||
private-key: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcUyYhVqczGxblL+o/xZzF/8nf+LjrfUE/dS1aRHM7uMDD0cgCArhjtfneFePrMxt+Z7W8yNBzSarub8qsfhaVNikV7Es7oaeTygfjQXTi2n4AFkir3fM07J08RpWhl5M8f8uWTCuvFUYAw00gq55typqmnbkmJa2VIUy/iQf+cMCP7abz4/jNhUzUR3qA7TV4oMRgTdIEDUp63YF8dOC+JH8XxYrCVeHXV6fLCwmesdMzl0lB2VTEKMfLbXhOmF5g7P9y/16VCcN8UBuZlbyYfn+GAxJOSbeHi5HshOKfoSuD7Jz+3WQZpNavOWjIFExKIU38/CvnJCOP7XBCqpSTAgMBAAECggEAYeWokWRE3TpvwiOZnUpR/aVMdVi75a3ROL5XIpqPV61B+t/bU3cEpl0GF9C5pUeiRi0IoStZb3mI9D1KPW/REKyUWkhabQO1gFYbTnRlkNOn6MILzKX4cwJjDaZeeo4EBPU7N+qHyOOXrU6hdH5FfxhMdV983ajm5eeuupxER1C2kAcIklTeVpTX6EKOgZb5LBp5ssOVm2P42pOauvcRozRcvZmqnErXmukv0H4l3EVNt4rHpTn9riHUC63e8JfiYzVaF6zuNUxv6nHEft0/SRMw11XSTnNfDzcKqgjz6ksFBS/6eQQYKESk+ONC53HUuYHFAknkwsPupDCT2W8FIQKBgQDLHT/xCU3nxGr4vFKBDNaO2D5oK20ECbBO4oDvLWWmQG7f+6TsMy8PgVdMnoL4RfqGlwFAKEpS6KVFHnBVqnNEhcdy9uCI7x7Xx8UnyUtxj1EDTm76uta9Ki9OrlqB6tImDM9+Ya3vGktW37ht4WOx2OsJRhG1dbf6RLwFlH7DWwKBgQDFBxvi5I1BR6hg6Tj7xd2SqOT2Y+BED3xuSYENhWbmMhLJDResaB7mjztbxlYaY2mOE0holWm2uDmVFFhMh4jYXik4hYH8nmDzq9mDpZCZ9pyjYqnAP8THoAa8EbgrUWB8A6BPH4iL3KbMnBfBKY0pIr2xrvnjQjNBAgta7KDRKQKBgCe6oe4wxrdF2TKsC2tIqpMoQxS3Icy/ZGgZr+SYuaBKTCWtoDW/UT40K3JGMxIDBhzbXphBCUCsVt9tM8Xd4EwP6tJW7dZ7B0pnve2pVwNwaAVAiz6p2yUHIle+jN+Koe5lZRSwYIg7WW81tWpwwsJfzqFyvjYDP6hJV4mz4ROvAoGAaRcdnKvjXApomShMqJ4lTPChD3q+SA8qg3jZSOj6tZXHx00gb2kp8jg7pPvpOTIFPy6x1Ha9aCRjMk0ju84fA6lVuzwa1S907wOehUVuF3Eeo1cgy9Y3k3KbpPyeixxgpkUY4JslLdSHc2NemD0dee951qhJyRmqVOZOQDUuoeECgYEAqBw2cAFk3vM97WY06TSldGA8ajVHx3BYRjj+zl62NTQthy8fw3tqxb3c5e8toOmZWKjZvDhg2TRLhsDDQWEYg3LZG87REqVIjgEPcpjNLidjygGX8n3JF2o0O5I/EMvl0s/+LVQONfduOBvhwDqr8QNisbLsyneiAq7umewMolo="
|
private-key: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcUyYhVqczGxblL+o/xZzF/8nf+LjrfUE/dS1aRHM7uMDD0cgCArhjtfneFePrMxt+Z7W8yNBzSarub8qsfhaVNikV7Es7oaeTygfjQXTi2n4AFkir3fM07J08RpWhl5M8f8uWTCuvFUYAw00gq55typqmnbkmJa2VIUy/iQf+cMCP7abz4/jNhUzUR3qA7TV4oMRgTdIEDUp63YF8dOC+JH8XxYrCVeHXV6fLCwmesdMzl0lB2VTEKMfLbXhOmF5g7P9y/16VCcN8UBuZlbyYfn+GAxJOSbeHi5HshOKfoSuD7Jz+3WQZpNavOWjIFExKIU38/CvnJCOP7XBCqpSTAgMBAAECggEAYeWokWRE3TpvwiOZnUpR/aVMdVi75a3ROL5XIpqPV61B+t/bU3cEpl0GF9C5pUeiRi0IoStZb3mI9D1KPW/REKyUWkhabQO1gFYbTnRlkNOn6MILzKX4cwJjDaZeeo4EBPU7N+qHyOOXrU6hdH5FfxhMdV983ajm5eeuupxER1C2kAcIklTeVpTX6EKOgZb5LBp5ssOVm2P42pOauvcRozRcvZmqnErXmukv0H4l3EVNt4rHpTn9riHUC63e8JfiYzVaF6zuNUxv6nHEft0/SRMw11XSTnNfDzcKqgjz6ksFBS/6eQQYKESk+ONC53HUuYHFAknkwsPupDCT2W8FIQKBgQDLHT/xCU3nxGr4vFKBDNaO2D5oK20ECbBO4oDvLWWmQG7f+6TsMy8PgVdMnoL4RfqGlwFAKEpS6KVFHnBVqnNEhcdy9uCI7x7Xx8UnyUtxj1EDTm76uta9Ki9OrlqB6tImDM9+Ya3vGktW37ht4WOx2OsJRhG1dbf6RLwFlH7DWwKBgQDFBxvi5I1BR6hg6Tj7xd2SqOT2Y+BED3xuSYENhWbmMhLJDResaB7mjztbxlYaY2mOE0holWm2uDmVFFhMh4jYXik4hYH8nmDzq9mDpZCZ9pyjYqnAP8THoAa8EbgrUWB8A6BPH4iL3KbMnBfBKY0pIr2xrvnjQjNBAgta7KDRKQKBgCe6oe4wxrdF2TKsC2tIqpMoQxS3Icy/ZGgZr+SYuaBKTCWtoDW/UT40K3JGMxIDBhzbXphBCUCsVt9tM8Xd4EwP6tJW7dZ7B0pnve2pVwNwaAVAiz6p2yUHIle+jN+Koe5lZRSwYIg7WW81tWpwwsJfzqFyvjYDP6hJV4mz4ROvAoGAaRcdnKvjXApomShMqJ4lTPChD3q+SA8qg3jZSOj6tZXHx00gb2kp8jg7pPvpOTIFPy6x1Ha9aCRjMk0ju84fA6lVuzwa1S907wOehUVuF3Eeo1cgy9Y3k3KbpPyeixxgpkUY4JslLdSHc2NemD0dee951qhJyRmqVOZOQDUuoeECgYEAqBw2cAFk3vM97WY06TSldGA8ajVHx3BYRjj+zl62NTQthy8fw3tqxb3c5e8toOmZWKjZvDhg2TRLhsDDQWEYg3LZG87REqVIjgEPcpjNLidjygGX8n3JF2o0O5I/EMvl0s/+LVQONfduOBvhwDqr8QNisbLsyneiAq7umewMolo="
|
||||||
public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFMmIVanMxsW5S/qP8Wcxf/J3/i4631BP3UtWkRzO7jAw9HIAgK4Y7X53hXj6zMbfme1vMjQc0mq7m/KrH4WlTYpFexLO6Gnk8oH40F04tp+ABZIq93zNOydPEaVoZeTPH/LlkwrrxVGAMNNIKuebcqapp25JiWtlSFMv4kH/nDAj+2m8+P4zYVM1Ed6gO01eKDEYE3SBA1Ket2BfHTgviR/F8WKwlXh11enywsJnrHTM5dJQdlUxCjHy214TpheYOz/cv9elQnDfFAbmZW8mH5/hgMSTkm3h4uR7ITin6Erg+yc/t1kGaTWrzloyBRMSiFN/Pwr5yQjj+1wQqqUkwIDAQAB"
|
public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFMmIVanMxsW5S/qP8Wcxf/J3/i4631BP3UtWkRzO7jAw9HIAgK4Y7X53hXj6zMbfme1vMjQc0mq7m/KrH4WlTYpFexLO6Gnk8oH40F04tp+ABZIq93zNOydPEaVoZeTPH/LlkwrrxVGAMNNIKuebcqapp25JiWtlSFMv4kH/nDAj+2m8+P4zYVM1Ed6gO01eKDEYE3SBA1Ket2BfHTgviR/F8WKwlXh11enywsJnrHTM5dJQdlUxCjHy214TpheYOz/cv9elQnDfFAbmZW8mH5/hgMSTkm3h4uR7ITin6Erg+yc/t1kGaTWrzloyBRMSiFN/Pwr5yQjj+1wQqqUkwIDAQAB"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<!-- 直接使用固定配置,避免Spring配置解析时机问题 -->
|
<!-- 直接使用固定配置,避免Spring配置解析时机问题 -->
|
||||||
<property name="log.projectName" value="entrance"/>
|
<property name="log.projectName" value="entrance"/>
|
||||||
<property name="logCommonLevel" value="info"/>
|
<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="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
|
||||||
<conversionRule conversionWord="wex"
|
<conversionRule conversionWord="wex"
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
entrance/src/main/resources/model/report_table - PQ-COM.docx
Normal file
BIN
entrance/src/main/resources/model/report_table - PQ-COM.docx
Normal file
Binary file not shown.
1
license.key
Normal file
1
license.key
Normal file
@@ -0,0 +1 @@
|
|||||||
|
AoNUHvLQag9nPPxWDsf5EwwBqifh5wnoFjrU01w+kIA7TPdRl0AQDBSA3IU7AY28Liubt6Rl8CsDtxEDrz8L5m0FqQrmZ1TmIJtZWbBR16NxXRgf8izM5JurYEY6ZbjU021yCu0fitxB0DJZ8LB8zfUDsV1MFGHl+yPjh4ZQrYDffID4rk/mRe/EE6F7bS19upStSOnQxVQVJSXwCVVHgsuFXqiuagM21OmxpYNjqaPnvAKoHRXTTxXn9BrSgZBocxuHB/IE+a0a+Q2eQo4RZa2IQpneEA/QIKEqezqsABxmM33duQ4eKt17hAttISV1J0R1cKpwZ4tYuSoHCuMONA==
|
||||||
@@ -325,7 +325,7 @@ public class DetectionDataServiceImpl extends ReplenishMybatisServiceImpl<Detect
|
|||||||
resultFlags = resultFlags.stream().filter(x -> 4 != x && 5 != x).distinct().collect(Collectors.toList());
|
resultFlags = resultFlags.stream().filter(x -> 4 != x && 5 != x).distinct().collect(Collectors.toList());
|
||||||
if (CollUtil.isNotEmpty(resultFlags)) {
|
if (CollUtil.isNotEmpty(resultFlags)) {
|
||||||
if (resultFlags.contains(2)) {
|
if (resultFlags.contains(2)) {
|
||||||
return 2;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
switch (resultFlags.get(0)) {
|
switch (resultFlags.get(0)) {
|
||||||
case 1:
|
case 1:
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ public class SysTestConfigParam {
|
|||||||
@ApiModelProperty(value = "场景")
|
@ApiModelProperty(value = "场景")
|
||||||
private String scene;
|
private String scene;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "比对监测后,当电压、电流不符合时,是否对标准设备进行系数校准")
|
||||||
|
private Integer coefficient;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class UpdateParam extends SysTestConfigParam {
|
public static class UpdateParam extends SysTestConfigParam {
|
||||||
@ApiModelProperty("id")
|
@ApiModelProperty("id")
|
||||||
|
|||||||
@@ -51,6 +51,11 @@ public class SysTestConfig extends BaseEntity implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Integer scale;
|
private Integer scale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比对监测后,当电压、电流不符合时,是否对标准设备进行系数校准
|
||||||
|
*/
|
||||||
|
private Integer coefficient;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 状态:0-删除 1-正常
|
* 状态:0-删除 1-正常
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public class SysTestConfigServiceImpl extends ServiceImpl<SysTestConfigMapper, S
|
|||||||
oneConfig.setScale(ObjectUtil.isNotNull(param.getScale()) ? param.getScale() : oneConfig.getScale());
|
oneConfig.setScale(ObjectUtil.isNotNull(param.getScale()) ? param.getScale() : oneConfig.getScale());
|
||||||
oneConfig.setMaxTime(ObjectUtil.isNotNull(param.getMaxTime()) ? param.getMaxTime() : oneConfig.getMaxTime());
|
oneConfig.setMaxTime(ObjectUtil.isNotNull(param.getMaxTime()) ? param.getMaxTime() : oneConfig.getMaxTime());
|
||||||
oneConfig.setScene(StringUtils.isNotBlank(param.getScene()) ? param.getScene() : oneConfig.getScene());
|
oneConfig.setScene(StringUtils.isNotBlank(param.getScene()) ? param.getScene() : oneConfig.getScene());
|
||||||
|
oneConfig.setCoefficient(param.getCoefficient());
|
||||||
return this.updateById(oneConfig);
|
return this.updateById(oneConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package com.njcn.gather.system.config;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author caozehui
|
||||||
|
* @data 2026-05-28
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class PathConfig {
|
||||||
|
|
||||||
|
private String appPath;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
// 获取程序运行目录
|
||||||
|
appPath = System.getProperty("user.dir");
|
||||||
|
|
||||||
|
// 或者获取jar包所在目录
|
||||||
|
// appPath = new File(getClass().getProtectionDomain()
|
||||||
|
// .getCodeSource().getLocation().getPath()).getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppPath() {
|
||||||
|
return appPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLogPath() {
|
||||||
|
return appPath + File.separator + "logs";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDataPath() {
|
||||||
|
return appPath + File.separator + "data";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getReportTemplatePath() {
|
||||||
|
return this.getDataPath() + File.separator + "template";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getReportPath() {
|
||||||
|
return this.getDataPath() + File.separator + "report";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResourcePath() {
|
||||||
|
return this.getDataPath() + File.separator + "resource";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package com.njcn.gather.system.resource.controller;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.njcn.common.pojo.annotation.OperateInfo;
|
||||||
|
import com.njcn.common.pojo.constant.OperateType;
|
||||||
|
import com.njcn.common.pojo.enums.common.LogEnum;
|
||||||
|
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
|
||||||
|
import com.njcn.common.pojo.response.HttpResult;
|
||||||
|
import com.njcn.common.utils.LogUtil;
|
||||||
|
import com.njcn.gather.system.resource.pojo.param.ResourceManageParam;
|
||||||
|
import com.njcn.gather.system.resource.pojo.vo.PlayVO;
|
||||||
|
import com.njcn.gather.system.resource.pojo.vo.ResourceManageVO;
|
||||||
|
import com.njcn.gather.system.resource.service.IResourceManageService;
|
||||||
|
import com.njcn.web.controller.BaseController;
|
||||||
|
import com.njcn.web.utils.HttpResultUtil;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestHeader;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Api(tags = "资源管理")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/resourceManage")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ResourceManageController extends BaseController {
|
||||||
|
|
||||||
|
private final IResourceManageService resourceManageService;
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
|
||||||
|
@PostMapping("/list")
|
||||||
|
@ApiOperation("分页查询资源列表")
|
||||||
|
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
|
||||||
|
public HttpResult<Page<ResourceManageVO>> list(@RequestBody @Validated ResourceManageParam.QueryParam queryParam) {
|
||||||
|
String methodDescribe = getMethodDescribe("list");
|
||||||
|
LogUtil.njcnDebug(log, "{},查询参数为:{}", methodDescribe, queryParam);
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, resourceManageService.list(queryParam), methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
|
||||||
|
@PostMapping("/add")
|
||||||
|
@ApiOperation("新增视频资源")
|
||||||
|
@ApiImplicitParam(name = "resourceManageParam", value = "资源参数", required = true)
|
||||||
|
public HttpResult<Boolean> add(ResourceManageParam resourceManageParam) {
|
||||||
|
String methodDescribe = getMethodDescribe("add");
|
||||||
|
LogUtil.njcnDebug(log, "{},新增资源参数为:{}", methodDescribe, resourceManageParam);
|
||||||
|
boolean result = resourceManageService.add(resourceManageParam);
|
||||||
|
if (result) {
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
|
||||||
|
}
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.UPDATE)
|
||||||
|
@PostMapping("/update")
|
||||||
|
@ApiOperation("编辑资源信息")
|
||||||
|
@ApiImplicitParam(name = "updateParam", value = "资源参数", required = true)
|
||||||
|
public HttpResult<Boolean> update(@RequestBody @Validated ResourceManageParam.UpdateParam updateParam) {
|
||||||
|
String methodDescribe = getMethodDescribe("update");
|
||||||
|
LogUtil.njcnDebug(log, "{},编辑资源参数为:{}", methodDescribe, updateParam);
|
||||||
|
boolean result = resourceManageService.update(updateParam);
|
||||||
|
if (result) {
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
|
||||||
|
}
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
|
||||||
|
@GetMapping("/play")
|
||||||
|
@ApiOperation("获取视频播放地址")
|
||||||
|
@ApiImplicitParam(name = "id", value = "资源id", required = true)
|
||||||
|
public HttpResult<PlayVO> play(@RequestParam("id") String id) {
|
||||||
|
String methodDescribe = getMethodDescribe("play");
|
||||||
|
LogUtil.njcnDebug(log, "{},资源id为:{}", methodDescribe, id);
|
||||||
|
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, resourceManageService.play(id), methodDescribe);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/stream")
|
||||||
|
@ApiOperation("播放视频流")
|
||||||
|
public void stream(@RequestParam("id") String id,
|
||||||
|
@RequestParam("token") String token,
|
||||||
|
@RequestHeader(value = "Range", required = false) String rangeHeader,
|
||||||
|
HttpServletResponse response) {
|
||||||
|
resourceManageService.stream(id, token, rangeHeader, response);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package com.njcn.gather.system.resource.mapper;
|
||||||
|
|
||||||
|
import com.github.yulichang.base.MPJBaseMapper;
|
||||||
|
import com.njcn.gather.system.resource.pojo.po.ResourceManage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理 mapper
|
||||||
|
*/
|
||||||
|
public interface ResourceManageMapper extends MPJBaseMapper<ResourceManage> {
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.njcn.gather.system.resource.mapper.ResourceManageMapper">
|
||||||
|
</mapper>
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.njcn.gather.system.resource.pojo.enums;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理业务响应
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public enum ResourceManageResponseEnum {
|
||||||
|
|
||||||
|
NAME_NOT_BLANK("A013001", "资源名称不能为空"),
|
||||||
|
REMARK_NOT_BLANK("A013002", "备注不能为空"),
|
||||||
|
FILE_NOT_NULL("A013003", "上传的视频文件不能为空"),
|
||||||
|
FILE_SUFFIX_ERROR("A013004", "仅支持上传 MP4 文件"),
|
||||||
|
FILE_SIZE_ERROR("A013005", "文件大小不能超过 250MB"),
|
||||||
|
FILE_UPLOAD_FAILED("A013006", "文件上传失败"),
|
||||||
|
RESOURCE_NOT_EXIST("A013007", "资源不存在"),
|
||||||
|
RESOURCE_FILE_NOT_EXIST("A013008", "资源文件不存在"),
|
||||||
|
PLAY_TOKEN_INVALID("A013009", "播放授权无效"),
|
||||||
|
PLAY_TOKEN_EXPIRED("A013010", "播放授权已过期"),
|
||||||
|
RANGE_INVALID("A013011", "视频请求范围非法"),
|
||||||
|
DISK_SPACE_NOT_ENOUGH("A013012", "磁盘空间不足"),
|
||||||
|
ID_NOT_BLANK("A013013", "资源id不能为空");
|
||||||
|
|
||||||
|
private final String code;
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
ResourceManageResponseEnum(String code, String message) {
|
||||||
|
this.code = code;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.njcn.gather.system.resource.pojo.param;
|
||||||
|
|
||||||
|
import com.njcn.web.pojo.param.BaseParam;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理参数
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class ResourceManageParam {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "资源名称", required = true)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备注", required = true)
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "视频文件", required = true)
|
||||||
|
private MultipartFile file;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class UpdateParam {
|
||||||
|
@ApiModelProperty(value = "资源id", required = true)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "资源名称", required = true)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "备注", required = true)
|
||||||
|
private String remark;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public static class QueryParam extends BaseParam {
|
||||||
|
@ApiModelProperty("资源名称")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty("原始文件名")
|
||||||
|
private String fileName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.njcn.gather.system.resource.pojo.po;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.njcn.db.mybatisplus.bo.BaseEntity;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("sys_resource_manage")
|
||||||
|
public class ResourceManage extends BaseEntity implements Serializable {
|
||||||
|
private static final long serialVersionUID = 684206384930125506L;
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
private Long fileSize;
|
||||||
|
|
||||||
|
private String relativePath;
|
||||||
|
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
private Integer state;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.njcn.gather.system.resource.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 播放授权信息
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class PlayVO {
|
||||||
|
private String url;
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.njcn.gather.system.resource.pojo.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理列表数据
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class ResourceManageVO {
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
private Long fileSize;
|
||||||
|
|
||||||
|
private String relativePath;
|
||||||
|
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
private Integer state;
|
||||||
|
|
||||||
|
private String createBy;
|
||||||
|
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
private String updateBy;
|
||||||
|
|
||||||
|
private LocalDateTime updateTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.njcn.gather.system.resource.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.njcn.gather.system.resource.pojo.param.ResourceManageParam;
|
||||||
|
import com.njcn.gather.system.resource.pojo.po.ResourceManage;
|
||||||
|
import com.njcn.gather.system.resource.pojo.vo.PlayVO;
|
||||||
|
import com.njcn.gather.system.resource.pojo.vo.ResourceManageVO;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资源管理服务
|
||||||
|
*/
|
||||||
|
public interface IResourceManageService extends IService<ResourceManage> {
|
||||||
|
|
||||||
|
Page<ResourceManageVO> list(ResourceManageParam.QueryParam queryParam);
|
||||||
|
|
||||||
|
boolean add(ResourceManageParam resourceManageParam);
|
||||||
|
|
||||||
|
boolean update(ResourceManageParam.UpdateParam updateParam);
|
||||||
|
|
||||||
|
PlayVO play(String id);
|
||||||
|
|
||||||
|
void stream(String id, String token, String rangeHeader, HttpServletResponse response);
|
||||||
|
}
|
||||||
@@ -0,0 +1,385 @@
|
|||||||
|
package com.njcn.gather.system.resource.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.njcn.common.pojo.enums.common.DataStateEnum;
|
||||||
|
import com.njcn.common.pojo.exception.BusinessException;
|
||||||
|
import com.njcn.gather.system.config.PathConfig;
|
||||||
|
import com.njcn.gather.system.resource.mapper.ResourceManageMapper;
|
||||||
|
import com.njcn.gather.system.resource.pojo.enums.ResourceManageResponseEnum;
|
||||||
|
import com.njcn.gather.system.resource.pojo.param.ResourceManageParam;
|
||||||
|
import com.njcn.gather.system.resource.pojo.po.ResourceManage;
|
||||||
|
import com.njcn.gather.system.resource.pojo.vo.PlayVO;
|
||||||
|
import com.njcn.gather.system.resource.pojo.vo.ResourceManageVO;
|
||||||
|
import com.njcn.gather.system.resource.service.IResourceManageService;
|
||||||
|
import com.njcn.web.factory.PageFactory;
|
||||||
|
import com.njcn.web.utils.RequestUtil;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
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.UUID;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ResourceManageServiceImpl extends ServiceImpl<ResourceManageMapper, ResourceManage> implements IResourceManageService {
|
||||||
|
|
||||||
|
private static final long MAX_FILE_SIZE = 250L * 1024L * 1024L;
|
||||||
|
private static final long PLAY_TOKEN_TTL_MILLIS = 30L * 60L * 1000L;
|
||||||
|
private static final String MP4_SUFFIX = ".mp4";
|
||||||
|
private static final String RELATIVE_VIDEO_ROOT = "resources/videos";
|
||||||
|
private static final int BUFFER_SIZE = 8192;
|
||||||
|
|
||||||
|
private static final ConcurrentHashMap<String, PlayToken> PLAY_TOKEN_CACHE = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
// @Value("${resource.videoDir:D:/data/resources/videos}")
|
||||||
|
// private String videoDir;
|
||||||
|
private final PathConfig pathConfig;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<ResourceManageVO> list(ResourceManageParam.QueryParam queryParam) {
|
||||||
|
QueryWrapper<ResourceManage> wrapper = new QueryWrapper<>();
|
||||||
|
wrapper.like(StrUtil.isNotBlank(queryParam.getName()), "Name", queryParam.getName())
|
||||||
|
.like(StrUtil.isNotBlank(queryParam.getFileName()), "File_Name", queryParam.getFileName())
|
||||||
|
.eq("State", DataStateEnum.ENABLE.getCode())
|
||||||
|
.orderByDesc("Create_Time");
|
||||||
|
|
||||||
|
Page<ResourceManage> page = this.page(
|
||||||
|
new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)),
|
||||||
|
wrapper
|
||||||
|
);
|
||||||
|
|
||||||
|
List<ResourceManageVO> records = page.getRecords().stream().map(resource -> {
|
||||||
|
ResourceManageVO vo = new ResourceManageVO();
|
||||||
|
BeanUtil.copyProperties(resource, vo);
|
||||||
|
return vo;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
Page<ResourceManageVO> result = new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam));
|
||||||
|
result.setTotal(page.getTotal());
|
||||||
|
result.setPages(page.getPages());
|
||||||
|
result.setCurrent(page.getCurrent());
|
||||||
|
result.setSize(page.getSize());
|
||||||
|
result.setRecords(records);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public boolean add(ResourceManageParam resourceManageParam) {
|
||||||
|
validateAddParam(resourceManageParam);
|
||||||
|
|
||||||
|
MultipartFile file = resourceManageParam.getFile();
|
||||||
|
String originalFilename = file.getOriginalFilename();
|
||||||
|
String dateDir = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
||||||
|
String savedFileName = UUID.randomUUID().toString().replace("-", "") + MP4_SUFFIX;
|
||||||
|
Path rootPath = Paths.get(pathConfig.getResourcePath()).toAbsolutePath().normalize();
|
||||||
|
Path targetDir = rootPath.resolve(dateDir).normalize();
|
||||||
|
Path targetFile = targetDir.resolve(savedFileName).normalize();
|
||||||
|
ensurePathInRoot(rootPath, targetFile);
|
||||||
|
|
||||||
|
String relativePath = RELATIVE_VIDEO_ROOT + "/" + dateDir + "/" + savedFileName;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Files.createDirectories(targetDir);
|
||||||
|
long usableSpace = targetDir.toFile().getUsableSpace();
|
||||||
|
if (usableSpace > 0 && usableSpace < file.getSize()) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.DISK_SPACE_NOT_ENOUGH);
|
||||||
|
}
|
||||||
|
file.transferTo(targetFile.toFile());
|
||||||
|
} catch (BusinessException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.FILE_UPLOAD_FAILED);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceManage resourceManage = new ResourceManage();
|
||||||
|
resourceManage.setId(UUID.randomUUID().toString().replace("-", ""));
|
||||||
|
resourceManage.setName(resourceManageParam.getName().trim());
|
||||||
|
resourceManage.setRemark(resourceManageParam.getRemark().trim());
|
||||||
|
resourceManage.setFileName(originalFilename);
|
||||||
|
resourceManage.setFileSize(file.getSize());
|
||||||
|
resourceManage.setRelativePath(relativePath);
|
||||||
|
resourceManage.setState(DataStateEnum.ENABLE.getCode());
|
||||||
|
|
||||||
|
try {
|
||||||
|
boolean saved = this.save(resourceManage);
|
||||||
|
if (!saved) {
|
||||||
|
deleteQuietly(targetFile);
|
||||||
|
}
|
||||||
|
return saved;
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
deleteQuietly(targetFile);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public boolean update(ResourceManageParam.UpdateParam updateParam) {
|
||||||
|
validateUpdateParam(updateParam);
|
||||||
|
getEnabledResource(updateParam.getId());
|
||||||
|
return this.lambdaUpdate()
|
||||||
|
.set(ResourceManage::getName, updateParam.getName().trim())
|
||||||
|
.set(ResourceManage::getRemark, updateParam.getRemark().trim())
|
||||||
|
.eq(ResourceManage::getId, updateParam.getId())
|
||||||
|
.eq(ResourceManage::getState, DataStateEnum.ENABLE.getCode())
|
||||||
|
.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlayVO play(String id) {
|
||||||
|
ResourceManage resourceManage = getEnabledResource(id);
|
||||||
|
Path filePath = resolveResourcePath(resourceManage);
|
||||||
|
if (!Files.exists(filePath) || !Files.isRegularFile(filePath)) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.RESOURCE_FILE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
String token = UUID.randomUUID().toString().replace("-", "");
|
||||||
|
PlayToken playToken = new PlayToken();
|
||||||
|
playToken.setResourceId(id);
|
||||||
|
playToken.setUserId(RequestUtil.getUserId());
|
||||||
|
playToken.setExpireTime(System.currentTimeMillis() + PLAY_TOKEN_TTL_MILLIS);
|
||||||
|
PLAY_TOKEN_CACHE.put(token, playToken);
|
||||||
|
clearExpiredTokens();
|
||||||
|
|
||||||
|
return new PlayVO("/resourceManage/stream?id=" + id + "&token=" + token);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stream(String id, String token, String rangeHeader, HttpServletResponse response) {
|
||||||
|
if (!validatePlayToken(id, token)) {
|
||||||
|
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceManage resourceManage = getEnabledResource(id);
|
||||||
|
Path filePath = resolveResourcePath(resourceManage);
|
||||||
|
if (!Files.exists(filePath) || !Files.isRegularFile(filePath)) {
|
||||||
|
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
long fileLength = Files.size(filePath);
|
||||||
|
Range range = parseRange(rangeHeader, fileLength);
|
||||||
|
String encodedFileName = URLEncoder.encode(resourceManage.getFileName(), "UTF-8")
|
||||||
|
.replaceAll("\\+", "%20");
|
||||||
|
|
||||||
|
response.setContentType("video/mp4");
|
||||||
|
response.setHeader("Accept-Ranges", "bytes");
|
||||||
|
response.setHeader("Content-Disposition", "inline; filename*=UTF-8''" + encodedFileName);
|
||||||
|
response.setHeader("Content-Length", String.valueOf(range.getLength()));
|
||||||
|
if (range.isPartial()) {
|
||||||
|
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
|
||||||
|
response.setHeader("Content-Range", "bytes " + range.getStart() + "-" + range.getEnd() + "/" + fileLength);
|
||||||
|
} else {
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
writeRange(filePath, range, response);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
response.setStatus(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||||
|
} catch (IOException e) {
|
||||||
|
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateAddParam(ResourceManageParam param) {
|
||||||
|
if (param == null || StrUtil.isBlank(param.getName())) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.NAME_NOT_BLANK);
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(param.getRemark())) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.REMARK_NOT_BLANK);
|
||||||
|
}
|
||||||
|
MultipartFile file = param.getFile();
|
||||||
|
if (file == null || file.isEmpty()) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.FILE_NOT_NULL);
|
||||||
|
}
|
||||||
|
String originalFilename = file.getOriginalFilename();
|
||||||
|
if (StrUtil.isBlank(originalFilename) || !originalFilename.toLowerCase().endsWith(MP4_SUFFIX)) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.FILE_SUFFIX_ERROR);
|
||||||
|
}
|
||||||
|
String contentType = file.getContentType();
|
||||||
|
if (StrUtil.isNotBlank(contentType) && !"video/mp4".equalsIgnoreCase(contentType)
|
||||||
|
&& !"application/octet-stream".equalsIgnoreCase(contentType)) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.FILE_SUFFIX_ERROR);
|
||||||
|
}
|
||||||
|
if (file.getSize() > MAX_FILE_SIZE) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.FILE_SIZE_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateUpdateParam(ResourceManageParam.UpdateParam param) {
|
||||||
|
if (param == null || StrUtil.isBlank(param.getId())) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.ID_NOT_BLANK);
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(param.getName())) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.NAME_NOT_BLANK);
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(param.getRemark())) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.REMARK_NOT_BLANK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResourceManage getEnabledResource(String id) {
|
||||||
|
ResourceManage resourceManage = this.lambdaQuery()
|
||||||
|
.eq(ResourceManage::getId, id)
|
||||||
|
.eq(ResourceManage::getState, DataStateEnum.ENABLE.getCode())
|
||||||
|
.one();
|
||||||
|
if (resourceManage == null) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.RESOURCE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
return resourceManage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Path resolveResourcePath(ResourceManage resourceManage) {
|
||||||
|
Path rootPath = Paths.get(pathConfig.getResourcePath()).toAbsolutePath().normalize();
|
||||||
|
String relativePath = resourceManage.getRelativePath().replace("\\", "/");
|
||||||
|
String prefix = RELATIVE_VIDEO_ROOT + "/";
|
||||||
|
if (!relativePath.startsWith(prefix)) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.RESOURCE_FILE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
String relativeToVideoRoot = relativePath.substring(prefix.length());
|
||||||
|
Path filePath = rootPath.resolve(relativeToVideoRoot).normalize();
|
||||||
|
ensurePathInRoot(rootPath, filePath);
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensurePathInRoot(Path rootPath, Path targetPath) {
|
||||||
|
if (!targetPath.startsWith(rootPath)) {
|
||||||
|
throw new BusinessException(ResourceManageResponseEnum.RESOURCE_FILE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean validatePlayToken(String id, String token) {
|
||||||
|
if (StrUtil.isBlank(id) || StrUtil.isBlank(token)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
PlayToken playToken = PLAY_TOKEN_CACHE.get(token);
|
||||||
|
if (playToken == null || !id.equals(playToken.getResourceId())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (playToken.getExpireTime() < System.currentTimeMillis()) {
|
||||||
|
PLAY_TOKEN_CACHE.remove(token);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearExpiredTokens() {
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
PLAY_TOKEN_CACHE.entrySet().removeIf(entry -> entry.getValue().getExpireTime() < now);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Range parseRange(String rangeHeader, long fileLength) {
|
||||||
|
if (StrUtil.isBlank(rangeHeader)) {
|
||||||
|
return new Range(0, fileLength - 1, false);
|
||||||
|
}
|
||||||
|
if (!rangeHeader.startsWith("bytes=")) {
|
||||||
|
throw new IllegalArgumentException("Invalid range");
|
||||||
|
}
|
||||||
|
String rangeValue = rangeHeader.substring("bytes=".length());
|
||||||
|
String[] parts = rangeValue.split("-", -1);
|
||||||
|
if (parts.length != 2) {
|
||||||
|
throw new IllegalArgumentException("Invalid range");
|
||||||
|
}
|
||||||
|
|
||||||
|
long start;
|
||||||
|
long end;
|
||||||
|
if (StrUtil.isBlank(parts[0])) {
|
||||||
|
long suffixLength = Long.parseLong(parts[1]);
|
||||||
|
if (suffixLength <= 0) {
|
||||||
|
throw new IllegalArgumentException("Invalid range");
|
||||||
|
}
|
||||||
|
start = Math.max(fileLength - suffixLength, 0);
|
||||||
|
end = fileLength - 1;
|
||||||
|
} else {
|
||||||
|
start = Long.parseLong(parts[0]);
|
||||||
|
end = StrUtil.isBlank(parts[1]) ? fileLength - 1 : Long.parseLong(parts[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start < 0 || end < start || start >= fileLength) {
|
||||||
|
throw new IllegalArgumentException("Invalid range");
|
||||||
|
}
|
||||||
|
end = Math.min(end, fileLength - 1);
|
||||||
|
return new Range(start, end, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeRange(Path filePath, Range range, HttpServletResponse response) throws IOException {
|
||||||
|
try (InputStream inputStream = Files.newInputStream(filePath);
|
||||||
|
ServletOutputStream outputStream = response.getOutputStream()) {
|
||||||
|
long skipped = inputStream.skip(range.getStart());
|
||||||
|
while (skipped < range.getStart()) {
|
||||||
|
long current = inputStream.skip(range.getStart() - skipped);
|
||||||
|
if (current <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
skipped += current;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
long bytesRemaining = range.getLength();
|
||||||
|
while (bytesRemaining > 0) {
|
||||||
|
int readLength = (int) Math.min(buffer.length, bytesRemaining);
|
||||||
|
int read = inputStream.read(buffer, 0, readLength);
|
||||||
|
if (read == -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
outputStream.write(buffer, 0, read);
|
||||||
|
bytesRemaining -= read;
|
||||||
|
}
|
||||||
|
outputStream.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteQuietly(Path path) {
|
||||||
|
try {
|
||||||
|
Files.deleteIfExists(path);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.warn("删除资源文件失败: {}", path, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
private static class PlayToken {
|
||||||
|
private String resourceId;
|
||||||
|
private String userId;
|
||||||
|
private long expireTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
private static class Range {
|
||||||
|
private final long start;
|
||||||
|
private final long end;
|
||||||
|
private final boolean partial;
|
||||||
|
|
||||||
|
private long getLength() {
|
||||||
|
return end - start + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -14,10 +14,17 @@ public interface IWordReportService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 替换Word文档中的占位符
|
* 替换Word文档中的占位符
|
||||||
*
|
*
|
||||||
* @param templateInputStream 模板文档输入流
|
* @param templateInputStream 模板文档输入流
|
||||||
* @param placeholderMap 占位符替换映射表,key为占位符标识,value为替换值
|
* @param placeholderMap 占位符替换映射表,key为占位符标识,value为替换值
|
||||||
* @return 处理后的文档输入流,调用方可根据需要进行下载、上传等操作
|
* @return 处理后的文档输入流,调用方可根据需要进行下载、上传等操作。
|
||||||
|
* <p>
|
||||||
|
* <b>资源管理契约:</b>当前实现返回 {@link java.io.ByteArrayInputStream},
|
||||||
|
* 其 {@code close()} 为空操作、内部仅持有 byte 数组、不占用文件句柄等 native 资源,
|
||||||
|
* 调用方<strong>不强制</strong>用 try-with-resources 包裹该返回流;
|
||||||
|
* 若未来该方法的实现改为返回底层依赖文件 / 网络 / 临时文件的真实流,
|
||||||
|
* 必须先改造所有调用方按 try-with-resources 关流后再合并实现,
|
||||||
|
* 以避免句柄泄漏。
|
||||||
* @throws Exception 处理异常
|
* @throws Exception 处理异常
|
||||||
*/
|
*/
|
||||||
InputStream replacePlaceholders(InputStream templateInputStream, Map<String, String> placeholderMap) throws Exception;
|
InputStream replacePlaceholders(InputStream templateInputStream, Map<String, String> placeholderMap) throws Exception;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user