70 Commits
hainan ... dev

Author SHA1 Message Date
caozehui
8c7c34cda2 温度湿度弹窗中新增守时勾选框 2026-07-13 10:35:04 +08:00
caozehui
b0ee58a1b5 docs: add time check design spec 2026-07-10 16:02:28 +08:00
caozehui
c3915dc8f5 检测计划-开启守时检测功能 2026-07-10 10:19:47 +08:00
caozehui
ff4a197436 Merge branch 'dev' 2026-07-10 08:43:26 +08:00
caozehui
ad2d94a893 切换程控源页面保持页面缓存 2026-07-10 08:42:38 +08:00
caozehui
030e84ae16 被检设备上传图片功能 2026-07-09 16:35:53 +08:00
caozehui
60112e84e3 归档 2026-07-09 09:15:40 +08:00
caozehui
8f12d0e03e 暂态写入写出时间 2026-07-08 15:51:11 +08:00
caozehui
49ded8c568 微调 2026-07-08 08:33:38 +08:00
caozehui
a39ad579f9 微调 2026-07-06 20:06:31 +08:00
caozehui
657d357159 微调 2026-07-06 16:24:23 +08:00
caozehui
0d7d5722c1 微调 2026-07-06 10:44:38 +08:00
caozehui
36496e5825 脚本检测项单位调整 2026-07-06 08:46:48 +08:00
caozehui
5caffc9cc9 微调 2026-07-02 18:36:26 +08:00
caozehui
15bef7b17f 微调 2026-07-02 15:33:16 +08:00
caozehui
4ac32753f1 微调 2026-07-02 15:21:31 +08:00
caozehui
131adc81a7 三项不平衡补充序分量 2026-07-02 15:00:19 +08:00
caozehui
3135f76a2f 归档 2026-07-01 16:12:33 +08:00
caozehui
08d81f724f 微调 2026-07-01 13:59:28 +08:00
caozehui
29ef22c9b7 闪变调整 2026-06-26 13:57:17 +08:00
caozehui
7738d7d153 源控程序优化 2026-06-26 10:31:52 +08:00
caozehui
20bc6e3ab5 正式检测-过载测试显示结果 2026-06-26 08:46:23 +08:00
caozehui
2ea0557f4e 程控源调整 2026-06-25 10:52:19 +08:00
caozehui
1a35510801 修改配置文件 2026-06-23 11:42:45 +08:00
caozehui
5ad3029e0b pqdif 2026-06-23 10:21:56 +08:00
caozehui
cd51cfb052 程控源调整 2026-06-18 10:01:39 +08:00
caozehui
4415eb30b2 微调 2026-06-17 15:51:02 +08:00
caozehui
78d094e4a2 icd导入按钮及权限控制 2026-06-17 13:20:36 +08:00
caozehui
8f5642d0b5 icd调整 2026-06-16 19:26:47 +08:00
caozehui
6c191aa96f 多影响量 2026-06-16 13:24:21 +08:00
caozehui
f2d7156b4f 移除文件 2026-06-15 10:11:51 +08:00
caozehui
d44c79f7b8 报告模版新增pattern字段 2026-06-12 13:30:07 +08:00
caozehui
964ba77f8a Revert "docs: add report template pattern design"
This reverts commit 7c1f135e99.
2026-06-12 09:50:21 +08:00
caozehui
7c1f135e99 docs: add report template pattern design 2026-06-12 09:49:30 +08:00
caozehui
1982ccd7ff 闪变支持配置Pst 2026-06-12 09:22:50 +08:00
caozehui
5abaa743c0 修改常量 2026-06-11 10:35:11 +08:00
caozehui
52a8095334 移除文件 2026-06-11 09:57:01 +08:00
caozehui
654c997607 移除文件 2026-06-11 09:43:59 +08:00
caozehui
b31efb9ede 闪变编辑框微调 2026-06-11 09:28:26 +08:00
caozehui
195b58d798 比对检测计划默认值 2026-06-09 19:22:54 +08:00
caozehui
0423de2683 新增小工具页面、SNTP对时功能集成到小工具页面 2026-06-08 08:46:29 +08:00
caozehui
27b593ba01 微调 2026-06-02 11:21:55 +08:00
caozehui
8c7b164166 微调 2026-06-02 09:25:17 +08:00
caozehui
bdc45b8890 微调 2026-06-01 18:37:31 +08:00
caozehui
2705bedc71 微调 2026-06-01 14:12:47 +08:00
caozehui
ae970d048c 微调 2026-06-01 11:34:39 +08:00
caozehui
29f57c80ef 数据库调整 2026-06-01 11:25:37 +08:00
caozehui
80072bf7e0 资源管理前后端 2026-06-01 11:20:11 +08:00
caozehui
8d377dfed7 微调 2026-06-01 11:09:32 +08:00
caozehui
633b6ffd29 自动播放视频 2026-06-01 11:07:47 +08:00
caozehui
cf3141198b 微调 2026-06-01 09:26:01 +08:00
caozehui
c05d329614 补充观看教学视频路由跳转功能,检测页面微调 2026-05-29 10:39:12 +08:00
caozehui
ee08263e4a 检测计划统计弹窗下拉框内容调整 2026-05-29 09:58:24 +08:00
19ea08d5e0 feat(detection): 添加检测锁机制防止多用户同时操作
- 新增 detectionLock store 管理检测锁状态
- 实现检测锁相关的弹窗提示功能
- 添加 DETECTION_BUSY 错误码处理多人竞争逻辑
- 在 websocket 中集成检测锁超时处理
- 修改程序源控制接口以同步锁状态
- 更新项目标题和图标配置
- 添加 docs 目录到忽略列表
2026-05-28 20:44:53 +08:00
caozehui
f9809197e8 微调 2026-05-28 16:33:07 +08:00
caozehui
0090a922c6 资源管理页面微调 2026-05-28 14:37:40 +08:00
caozehui
0b26de20b9 资源管理 2026-05-28 13:26:35 +08:00
caozehui
1202f64bfc 检测计划统计功能 2026-05-28 08:44:15 +08:00
caozehui
ce1738daf0 微调 2026-05-27 11:20:12 +08:00
caozehui
a41d824ca3 归档 2026-05-26 15:45:08 +08:00
caozehui
ac5a8450e8 微调 2026-05-26 14:23:59 +08:00
caozehui
01e817a5d6 微调 2026-05-26 13:45:23 +08:00
caozehui
01bf07fc42 检测计划统计功能 2026-05-26 09:22:38 +08:00
caozehui
633e914c9a Revert "下拉多选报告模版"
This reverts commit 37e69e7bda.
2026-05-25 18:38:46 +08:00
caozehui
37e69e7bda 下拉多选报告模版 2026-05-25 14:25:57 +08:00
caozehui
19fb90432a 归档 2026-05-25 09:51:42 +08:00
caozehui
4a3c81a792 归档 2026-05-25 09:50:16 +08:00
caozehui
12d3073241 统一sourceId 2026-05-13 09:47:10 +08:00
caozehui
72838462ad 微调 2026-04-22 10:02:21 +08:00
caozehui
327addf625 微调 2026-04-22 09:58:03 +08:00
191 changed files with 5608 additions and 3712 deletions

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@ public/electron/
pnpm-lock.yaml
CLAUDE.md
/public/dist/
/docs/

View File

@@ -33,9 +33,9 @@ mybatis-plus:
#驼峰命名
map-underscore-to-camel-case: true
#配置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:
db-config:
#指定主键生成策略
@@ -54,31 +54,33 @@ webSocket:
port: 7778
#源参数下发,暂态数据默认值
Dip:
#暂态前时间s
fPreTime: 2f
#Dip:
# 暂态前时间s
# fPreTime: 2f
#写入时间s
fRampIn: 0.001f
# fRampIn: 0.001f
#写出时间s
fRampOut: 0.001f
#暂态后时间s
fAfterTime: 3f
# fRampOut: 0.001f
# 暂态后时间s
# fAfterTime: 3f
Flicker:
waveFluType: CPM
waveType: SQU
fDutyCycle: 50f
#Flicker:
# waveFluType: CPM
# waveType: SQU
# fDutyCycle: 50f
log:
homeDir: {{APP_DATA_PATH}}\logs
commonLevel: info
#log:
# homeDir: D:\logs
# commonLevel: info
report:
template: {{APP_DATA_PATH}}\template
reportDir: {{APP_DATA_PATH}}\report
# template: D:\template
# reportDir: D:\report
dateFormat: yyyy年MM月dd日
data:
homeDir: {{APP_DATA_PATH}}\data
#data:
# homeDir: D:\data
#resource:
# videoDir: ${data.homeDir}\resources\videos
qr:
cloud: http://pqmcc.com:18082/api/file
dev:
@@ -95,6 +97,8 @@ qr:
db:
type: mysql
icd:
txt-dir: ..\..\..\9100\DeviceControl\Config
# 比对录波需要的配置,晚点再做优化
# 系统配置
@@ -116,3 +120,5 @@ activate:
public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFMmIVanMxsW5S/qP8Wcxf/J3/i4631BP3UtWkRzO7jAw9HIAgK4Y7X53hXj6zMbfme1vMjQc0mq7m/KrH4WlTYpFexLO6Gnk8oH40F04tp+ABZIq93zNOydPEaVoZeTPH/LlkwrrxVGAMNNIKuebcqapp25JiWtlSFMv4kH/nDAj+2m8+P4zYVM1Ed6gO01eKDEYE3SBA1Ket2BfHTgviR/F8WKwlXh11enywsJnrHTM5dJQdlUxCjHy214TpheYOz/cv9elQnDfFAbmZW8mH5/hgMSTkm3h4uR7ITin6Erg+yc/t1kGaTWrzloyBRMSiFN/Pwr5yQjj+1wQqqUkwIDAQAB"
dataCheck:
enable: false

View File

@@ -1 +1 @@
11900
51248

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.

View File

@@ -11,3 +11,10 @@
.\binlog.000033
.\binlog.000034
.\binlog.000035
.\binlog.000036
.\binlog.000037
.\binlog.000038
.\binlog.000039
.\binlog.000040
.\binlog.000041
.\binlog.000042

View File

@@ -0,0 +1,211 @@
# 守时检测设计
## 背景
现有守时页面 `frontend/src/views/home/components/timeTest.vue` 是演示式页面,包含假数据、步骤条和旧的“标准时间/上送时刻”展示方式,不符合新的业务流程。新的守时检测需要同时支持多台装置,动态展示每台装置的暂态触发时刻、守时误差和结果,并与现有检测弹窗、后端 `startPreTest` 流程联动。
后端项目位于 `D:\njcn\test\CN_Gather`。本设计覆盖前端与后端协同修改。
## 目标
- 守时页面只展示守时检测用时和设备结果表,不展示源连接、设备连接、协议校验、相序校验等前置阶段。
- 表格列固定为装置名称、暂态1触发时刻、暂态2触发时刻、守时误差、结果。
- 未收到对应数据时,单元格显示 loading 转圈状态。
- 守时检测计时格式为 `HH:mm:ss`
- 支持多台设备同时检测。
- 守时检测过程要像 `factorTest.vue` 一样监听并拦截 WebSocket 错误,错误时终止流程。
- 守时完成后,如果后续还有正式检测,前后端自动流向正式检测且保持组件状态;如果没有正式检测,则清理连接和 WebSocket 资源。
## 检测项契约
`PreDetectionParam.testItemList` 从 3 位改为 4 位:
1. 第 1 位:预检测
2. 第 2 位:系数校准
3. 第 3 位:守时校验
4. 第 4 位:正式检测
前端所有调用 `startPreTest` 的位置都必须发送 4 位数组,例如:
- 只做守时检测:`[false, false, true, false]`
- 预检测 + 守时检测:`[true, false, true, false]`
- 守时检测 + 正式检测:`[false, false, true, true]`
- 预检测 + 守时检测 + 正式检测:`[true, false, true, true]`
后端所有读取 `testItemList` 的逻辑同步使用新索引,不能继续把第三位解释为正式检测。
## 前端流程
### 启动规则
`testPopup.vue` 继续作为检测弹窗流程编排入口。
只勾选守时检测时,前端调用现有 `startPreTest`。接口成功返回后,认为守时检测开始,`timeTest.vue` 开始计时。后端随后执行源连接、设备连接、协议校验、相序校验,再进入守时暂态流程。
勾选预检测 + 守时检测时,守时检测不在 `startPreTest` 成功后立刻开始计时。预检测包含源连接、设备连接、协议校验、相序校验四个阶段;这四个阶段完成后,后端推送守时开始/暂态数据相关消息,前端开始守时计时并展示表格更新。
### 页面结构
`timeTest.vue` 改为轻量结果页:
- 顶部为紧凑计时区域,显示 `守时检测用时HH:mm:ss`
- 下方为结果表格,列为 `装置名称 / 暂态1触发时刻 / 暂态2触发时刻 / 守时误差 / 结果`
- 行数据初始化自 `checkStore.devices`
- 未收到数据的字段显示 Element Plus loading 转圈。
- `time_waiting_second` 消息只触发轻量提示,例如“已收到第一组暂态数据,等待第二组暂态数据”,不增加页面状态区和统计区。
### Step 切换与状态保活
守时检测完成且后续进入正式检测后,用户可以点击弹窗顶部 step 切回守时检测页。此时守时页只读展示已完成结果,不重启监听、不重置 loading、不重新计时。
用户再切回正式检测页时,正式检测组件的表格信息、计时信息、日志进度和当前检测步骤不能初始化。实现上应保持组件实例存活,只切换 `stepsActiveView` 的显示状态,避免因 step 切换触发正式检测组件重建或初始化。
### 错误处理
`timeTest.vue` 需要接收并监听 `webMsgSend`,与 `factorTest.vue` 保持一致的错误拦截思路:
- 通用错误码如 `10520``10521``10522``10523``10524``10525``10527``10528``10529``10550``10551``10552``-1`
- WebSocket 连接类错误,如 `socket_timeout``server_error``device_error``connect/Source``connect/Dev`
- 源连接、设备连接、协议校验、相序校验阶段虽然不展示在页面中,但这些阶段的错误必须被守时页捕获,弹窗提示后 `emit('update:testStatus', 'error')`,父流程终止。
## 后端流程
### 总体接入
后端采用复用现有检测链路的方案。`startPreTest` 仍作为统一入口,守时校验作为现有检测链路中的独立业务阶段插入。
单独勾选守时检测时,后端需要执行完整前置阶段:
1. 源连接
2. 设备连接
3. 协议校验
4. 相序校验
5. 守时检测暂态流程
勾选预检测 + 守时检测时,预检测已经包含前四个阶段。后端不重复执行、不关闭源连接和设备连接,直接进入守时检测暂态流程。
### 守时业务规则
守时检测使用后端内置的两段守时专用暂态脚本,不由前端传脚本编号。
业务过程:
1. 下发暂态脚本 1。
2. 收取每台装置的一组暂态数据。
3. 两次暂态触发时刻均从 `DevData.time` 读取。
4. 同一设备存在多个监测点数据时,以第一条数据为准。
5. 第一组数据收齐后,后端推送 `time_waiting_second` 事件。
6. 后端等待 `waitTime - 暂态持续时间1 - fRampOut - fPreTime - fRampIn`
7. 下发暂态脚本 2。
8. 收取每台装置第二组暂态数据。
9. 计算 `dtMs = 暂态1触发时刻 - 暂态2触发时刻 - waitTime`
10. `dtMs <= 10ms` 为合格,否则不合格。
结果判定完全由后端负责。前端只展示后端推送的守时误差和结果,不自行计算合格性。
### 守时结束后的资源处理
如果 `testItemList[3]``true`,守时检测完成后自动流向正式检测:
- 后端不关闭源连接。
- 后端不关闭设备连接。
- 后端不清理正式检测需要的流程上下文。
- 前端不关闭 WebSocket不重建正式检测组件。
- 前端收到守时成功后自动切到正式检测步骤。
如果 `testItemList[3]``false`,守时检测后没有正式检测:
- 后端在守时结束后断开设备连接和源连接。
- 后端清理检测流程上下文。
- 前端停止计时,展示最终结果,状态置为 `success``error`
- 弹窗关闭时清理 WebSocket 回调或连接。
如果守时检测失败,无论是否勾选正式检测,都终止流程,不进入正式检测,并按错误流程释放资源。
## WebSocket 消息
守时阶段使用独立的守时消息语义,避免前端混在正式检测或系数校准消息里猜状态。推荐 `requestId` 使用 `Time_Check`
### `time_first_data`
收到某台设备第一次暂态数据。
`data` 建议字段:
- `deviceId`
- `deviceName`
- `monitorId` 或监测点标识
- `firstTriggerTime`
### `time_waiting_second`
第一组暂态数据已收齐,后端已进入等待第二次暂态数据阶段。
该消息只作为事件触发标志,前端只做提示,不依赖业务字段。
### `time_second_data`
收到某台设备第二次暂态数据。
`data` 建议字段:
- `deviceId`
- `deviceName`
- `monitorId` 或监测点标识
- `secondTriggerTime`
### `time_result`
某台设备守时结果计算完成。
`data` 建议字段:
- `deviceId`
- `deviceName`
- `firstTriggerTime`
- `secondTriggerTime`
- `waitTimeMs`
- `dtMs`
- `result`
- `message`
`result` 可以使用后端现有结果约定,也可以明确为 `passed` / `failed`。前端需统一映射为“合格 / 不合格”。
### `time_finish`
全部守时检测完成。
`data` 建议字段:
- `allPassed`
- `results`
- `hasFormalTest`
前端收到后停止守时计时。如果 `hasFormalTest``true`,自动流向正式检测;否则结束当前检测流程。
## 涉及文件
前端:
- `frontend/src/views/home/components/timeTest.vue`
- `frontend/src/views/home/components/testPopup.vue`
- `frontend/src/api/socket/socket.ts`
- 必要时检查 `frontend/src/views/home/components/compareTestPopup.vue` 是否存在同类 `testItemList` 构造逻辑。
后端:
- `D:\njcn\test\CN_Gather\detection\src\main\java\com\njcn\gather\detection\pojo\param\PreDetectionParam.java`
- `D:\njcn\test\CN_Gather\detection\src\main\java\com\njcn\gather\detection\controller\PreDetectionController.java`
- `D:\njcn\test\CN_Gather\detection\src\main\java\com\njcn\gather\detection\service\impl\PreDetectionServiceImpl.java`
- `D:\njcn\test\CN_Gather\detection\src\main\java\com\njcn\gather\detection\handler\SocketDevResponseService.java`
- `D:\njcn\test\CN_Gather\detection\src\main\java\com\njcn\gather\detection\pojo\enums\SourceOperateCodeEnum.java`
## 测试建议
- 单独勾选守时检测:验证 `startPreTest` 成功后计时立即开始,前置四阶段错误可被前端拦截,最终无正式检测时资源被清理。
- 勾选预检测 + 守时检测:验证前置四阶段不重复执行、不关闭连接,守时计时从预检测四阶段完成后开始。
- 勾选守时检测 + 正式检测:验证守时成功后自动进入正式检测,连接和 WebSocket 不被清理。
- 正式检测中点击 step 切回守时页,再切回正式检测页:验证正式检测表格、计时、日志和进度不初始化。
- 多设备且多监测点:验证每台设备只取第一条监测点数据参与守时计算。
- 守时失败:验证不进入正式检测,并按错误流程释放资源。
- `time_waiting_second`:验证只提示,不改变表格结构。

View File

@@ -12,3 +12,10 @@ VITE_REPORT=false
# 浏览器是否显示vue的告警信息
VUE_APP_SILENCE_WARNINGS=true
VITE_COMPANY_WEBSITE=http://www.shining-electric.com/
VITE_COMPANY_NAME=南京灿能电力自动化股份有限公司
VITE_IS_SHOW_RAW_DATA=true
# 开启激活验证
VITE_ACTIVATE_OPEN=true

View File

@@ -19,9 +19,6 @@ VITE_API_URL=/api
# 开发环境跨域代理,支持配置多个
VITE_PROXY=[["/api","http://127.0.0.1:18093/"]]
VITE_PROXY=[["/api","http://127.0.0.1:18092/"]]
#VITE_PROXY=[["/api","http://192.168.1.124:18092/"]]
#VITE_PROXY=[["/api","http://192.168.2.125:18092/"]]
# VITE_PROXY=[["/api","http://192.168.1.138:8080/"]]张文
# 开启激活验证
VITE_ACTIVATE_OPEN=true

View File

@@ -23,6 +23,5 @@ VITE_PWA=true
# 线上环境接口地址
#VITE_API_URL="/api" # 打包时用
VITE_API_URL="http://127.0.0.1:18093/"
# 开启激活验证
VITE_ACTIVATE_OPEN=true
VITE_API_URL="http://127.0.0.1:18092/"

View File

@@ -4,7 +4,8 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0, minimum-scale=1.0" />
<title></title>
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<title>NPQS-9100</title>
<!-- 优化vue渲染未完成之前先加一个css动画 -->
<style>
#loadingPage {

BIN
frontend/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,15 @@
import http from '@/api'
import type { DetectionLockHolder } from '@/stores/modules/detectionLock'
/**
* 查询当前检测锁持有状态
* - data 为 null → 锁空闲
* - data 非 null → 锁被某账号持有
*
* 本接口只读,不抢锁、不会返回 DETECTION_BUSY
*/
export const getCurrentLock = () => {
return http.get<DetectionLockHolder | null>('/detection/lock/current', undefined, {
loading: false
})
}

View File

@@ -1,6 +1,7 @@
import type { controlSource } from '@/api/device/interface/controlSource'
import http from '@/api'
import { useDetectionLockStore } from '@/stores/modules/detectionLock'
/**
* @name 程控源管理模块
@@ -17,8 +18,11 @@ export const startSimulateTest = (params: controlSource.ResControl) => {
}
//停止
export const closeSimulateTest = (params: controlSource.ResControl) => {
return http.post(`/prepare/closeSimulateTest`,params,{loading:false})
export const closeSimulateTest = async (params: controlSource.ResControl) => {
const result = await http.post(`/prepare/closeSimulateTest`,params,{loading:false})
// 主动终止 → 释放本地持锁标记
useDetectionLockStore().clearHolder()
return result
}

Some files were not shown because too many files have changed in this diff Show More