Merge branch 'master' of http://192.168.1.22:3000/ClientApps/pqs-9100_client
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
<template>
|
||||
<!--element-plus语言国际化,全局修改为中文-->
|
||||
<!-- 测试升级功能 - 2025-10-24 -->
|
||||
<el-config-provider :locale="locale" :size="assemblySize" :button="buttonConfig">
|
||||
<router-view />
|
||||
</el-config-provider>
|
||||
@@ -31,14 +32,6 @@ onMounted(() => {
|
||||
const language = globalStore.language ?? getBrowserLang()
|
||||
i18n.locale.value = language
|
||||
globalStore.setGlobalState('language', language as LanguageType)
|
||||
// 移除 autofit,使用 CSS 自适应
|
||||
// autofit.init({
|
||||
// el: '#app',
|
||||
// dw: 1440,
|
||||
// dh: 900,
|
||||
// resize: true,
|
||||
// limit: 0.1
|
||||
// })
|
||||
})
|
||||
|
||||
// element language
|
||||
|
||||
@@ -82,8 +82,8 @@ export const reCalculate = (params: {
|
||||
errorSysId: string
|
||||
deviceId: string
|
||||
code: string
|
||||
patternId: string
|
||||
|
||||
patternId: string,
|
||||
chnNum: string
|
||||
}) => {
|
||||
return http.post('/result/reCalculate', params, {loading: true})
|
||||
}
|
||||
@@ -129,7 +129,8 @@ export const changeErrorSystem = (params: {
|
||||
errorSysId: string
|
||||
deviceId: string
|
||||
code: string
|
||||
patternId: string
|
||||
patternId: string,
|
||||
chnNum: string
|
||||
}) => {
|
||||
return http.post('/result/changeErrorSystem', params, {loading: true})
|
||||
}
|
||||
|
||||
@@ -21,10 +21,10 @@ export interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig {
|
||||
}
|
||||
|
||||
const config = {
|
||||
// 默认地址请求地址,可在 .env.** 文件中修改
|
||||
// 默认地址请求地址,可在 .env 开头文件中修改
|
||||
baseURL: import.meta.env.VITE_API_URL as string,
|
||||
// 设置超时时间
|
||||
timeout: ResultEnum.TIMEOUT as number,
|
||||
// 设置超时时间(60s)
|
||||
timeout: 60000,
|
||||
// 跨域时候允许携带凭证
|
||||
withCredentials: true,
|
||||
// post请求指定数据类型以及编码
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* WebSocket客户端服务
|
||||
* 提供WebSocket连接管理、心跳机制、消息处理等功能
|
||||
* 集成JWT token解析,支持自动获取用户登录名
|
||||
*
|
||||
*
|
||||
* @author hongawen
|
||||
* @version 2.0
|
||||
*/
|
||||
@@ -66,7 +66,7 @@ namespace WebSocketMessageTypes {
|
||||
progress?: number;
|
||||
errorInfo?: string;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 系数校准相关消息
|
||||
*/
|
||||
@@ -77,7 +77,7 @@ namespace WebSocketMessageTypes {
|
||||
current?: string;
|
||||
calibrationResult?: boolean;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 正式检测相关消息
|
||||
*/
|
||||
@@ -87,7 +87,7 @@ namespace WebSocketMessageTypes {
|
||||
testResult?: 'success' | 'failed' | 'processing';
|
||||
testData?: any;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 通用响应消息
|
||||
*/
|
||||
@@ -102,14 +102,14 @@ namespace WebSocketMessageTypes {
|
||||
// 导出类型
|
||||
// ============================================================================
|
||||
|
||||
export type {
|
||||
WebSocketMessage,
|
||||
CallbackFunction,
|
||||
SocketConfig,
|
||||
export type {
|
||||
WebSocketMessage,
|
||||
CallbackFunction,
|
||||
SocketConfig,
|
||||
WebSocketMessageTypes
|
||||
};
|
||||
|
||||
export {
|
||||
export {
|
||||
ConnectionStatus
|
||||
};
|
||||
|
||||
@@ -130,7 +130,7 @@ export default class SocketService {
|
||||
* 单例实例
|
||||
*/
|
||||
private static instance: SocketService | null = null;
|
||||
|
||||
|
||||
/**
|
||||
* 获取单例实例
|
||||
* @returns SocketService实例
|
||||
@@ -150,42 +150,42 @@ export default class SocketService {
|
||||
* WebSocket连接实例
|
||||
*/
|
||||
private ws: WebSocket | null = null;
|
||||
|
||||
|
||||
/**
|
||||
* 消息回调函数映射表
|
||||
*/
|
||||
private callBackMapping: Record<string, CallbackFunction<any>> = {};
|
||||
|
||||
|
||||
/**
|
||||
* 当前连接状态
|
||||
*/
|
||||
private connectionStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED;
|
||||
|
||||
|
||||
/**
|
||||
* 发送消息重试计数器
|
||||
*/
|
||||
private sendRetryCount: number = 0;
|
||||
|
||||
|
||||
/**
|
||||
* 连接重试计数器
|
||||
*/
|
||||
private connectRetryCount: number = 0;
|
||||
|
||||
|
||||
/**
|
||||
* 心跳Worker实例
|
||||
*/
|
||||
private heartbeatWorker: Worker | null = null;
|
||||
|
||||
|
||||
/**
|
||||
* Worker脚本的Blob URL
|
||||
*/
|
||||
private workerBlobUrl: string | null = null;
|
||||
|
||||
|
||||
/**
|
||||
* 最后一次收到心跳响应的时间戳
|
||||
*/
|
||||
private lastResponseHeartTime: number = Date.now();
|
||||
|
||||
|
||||
/**
|
||||
* WebSocket连接配置
|
||||
*/
|
||||
@@ -246,18 +246,18 @@ export default class SocketService {
|
||||
public connect(): Promise<void> | void {
|
||||
// 检查浏览器支持
|
||||
if (!window.WebSocket) {
|
||||
// console.log('您的浏览器不支持WebSocket');
|
||||
// console.log('您的浏览器不支持WebSocket');
|
||||
return;
|
||||
}
|
||||
|
||||
// 防止重复连接
|
||||
if (this.connectionStatus === ConnectionStatus.CONNECTING || this.connected) {
|
||||
// console.warn('WebSocket已连接或正在连接中');
|
||||
// console.warn('WebSocket已连接或正在连接中');
|
||||
return;
|
||||
}
|
||||
|
||||
this.connectionStatus = ConnectionStatus.CONNECTING;
|
||||
|
||||
|
||||
try {
|
||||
this.ws = new WebSocket(this.buildWebSocketUrl());
|
||||
this.setupEventHandlersLegacy();
|
||||
@@ -289,7 +289,7 @@ export default class SocketService {
|
||||
}
|
||||
|
||||
this.connectionStatus = ConnectionStatus.CONNECTING;
|
||||
|
||||
|
||||
try {
|
||||
this.ws = new WebSocket(this.buildWebSocketUrl());
|
||||
this.setupEventHandlers(resolve, reject);
|
||||
@@ -311,7 +311,7 @@ export default class SocketService {
|
||||
return;
|
||||
}
|
||||
this.callBackMapping[messageType] = callback;
|
||||
// console.log(`注册消息处理器: ${messageType}`);
|
||||
// console.log(`注册消息处理器: ${messageType}`);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -349,11 +349,11 @@ export default class SocketService {
|
||||
try {
|
||||
// 重置重试计数
|
||||
this.sendRetryCount = 0;
|
||||
|
||||
|
||||
// 尝试发送JSON数据,失败则发送原始数据
|
||||
const message = typeof data === 'string' ? data : JSON.stringify(data);
|
||||
this.ws.send(message);
|
||||
|
||||
|
||||
//console.log('发送消息:', message);
|
||||
resolve();
|
||||
} catch (error) {
|
||||
@@ -368,21 +368,21 @@ export default class SocketService {
|
||||
*/
|
||||
public closeWs(): void {
|
||||
//console.log('正在关闭WebSocket连接...');
|
||||
|
||||
|
||||
// 清理心跳
|
||||
this.clearHeartbeat();
|
||||
|
||||
|
||||
// 关闭连接
|
||||
if (this.ws) {
|
||||
this.ws.close(1000, '主动关闭连接');
|
||||
this.ws = null;
|
||||
}
|
||||
|
||||
|
||||
// 更新状态
|
||||
this.connectionStatus = ConnectionStatus.DISCONNECTED;
|
||||
this.connectRetryCount = 0;
|
||||
this.sendRetryCount = 0;
|
||||
|
||||
|
||||
//console.log('WebSocket连接已关闭');
|
||||
}
|
||||
|
||||
@@ -422,15 +422,15 @@ export default class SocketService {
|
||||
*/
|
||||
private buildWebSocketUrl(): string {
|
||||
const { url } = this.config;
|
||||
|
||||
|
||||
// 直接从JWT token中获取loginName作为name参数
|
||||
const loginName = jwtUtil.getLoginName();
|
||||
|
||||
|
||||
if (loginName) {
|
||||
const separator = url.includes('?') ? '&' : '?';
|
||||
return `${url}${separator}name=${encodeURIComponent(loginName)}`;
|
||||
}
|
||||
|
||||
|
||||
// 如果无法获取loginName,返回原始URL并输出警告
|
||||
console.warn('无法从JWT token中获取loginName,WebSocket连接可能会失败');
|
||||
return url;
|
||||
@@ -443,11 +443,11 @@ export default class SocketService {
|
||||
*/
|
||||
private setupEventHandlers(resolve: () => void, reject: (error: Error) => void): void {
|
||||
if (!this.ws) return;
|
||||
|
||||
|
||||
// 连接成功事件
|
||||
this.ws.onopen = () => {
|
||||
ElMessage.success("WebSocket连接服务端成功");
|
||||
// console.log('WebSocket连接成功');
|
||||
// console.log('WebSocket连接成功');
|
||||
this.connectionStatus = ConnectionStatus.CONNECTED;
|
||||
this.connectRetryCount = 0;
|
||||
this.startHeartbeat();
|
||||
@@ -459,7 +459,7 @@ export default class SocketService {
|
||||
//console.log('WebSocket连接关闭', event.code, event.reason);
|
||||
this.connectionStatus = ConnectionStatus.DISCONNECTED;
|
||||
this.clearHeartbeat();
|
||||
|
||||
|
||||
// 非正常关闭且未超过最大重连次数,尝试重连
|
||||
if (event.code !== 1000 && this.connectRetryCount < this.config.maxReconnectAttempts!) {
|
||||
this.attemptReconnect();
|
||||
@@ -485,11 +485,11 @@ export default class SocketService {
|
||||
*/
|
||||
private setupEventHandlersLegacy(): void {
|
||||
if (!this.ws) return;
|
||||
|
||||
|
||||
// 连接成功事件
|
||||
this.ws.onopen = () => {
|
||||
ElMessage.success("webSocket连接服务端成功了");
|
||||
// console.log('连接服务端成功了');
|
||||
// console.log('连接服务端成功了');
|
||||
this.connectionStatus = ConnectionStatus.CONNECTED;
|
||||
this.connectRetryCount = 0;
|
||||
this.startHeartbeat();
|
||||
@@ -497,10 +497,10 @@ export default class SocketService {
|
||||
|
||||
// 连接关闭事件
|
||||
this.ws.onclose = (event: CloseEvent) => {
|
||||
// console.log('连接webSocket服务端关闭');
|
||||
// console.log('连接webSocket服务端关闭');
|
||||
this.connectionStatus = ConnectionStatus.DISCONNECTED;
|
||||
this.clearHeartbeat();
|
||||
|
||||
|
||||
// 保持原有的重连逻辑(被注释掉的)
|
||||
// this.connectRetryCount++;
|
||||
/* setTimeout(() => {
|
||||
@@ -527,10 +527,10 @@ export default class SocketService {
|
||||
*/
|
||||
private handleMessage(event: MessageEvent): void {
|
||||
// console.log('Received message:', event.data);
|
||||
|
||||
|
||||
// 心跳响应处理
|
||||
if (event.data === 'over') {
|
||||
// console.log(`${new Date().toLocaleTimeString()} - 收到心跳响应`);
|
||||
// console.log(`${new Date().toLocaleTimeString()} - 收到心跳响应`);
|
||||
this.lastResponseHeartTime = Date.now();
|
||||
return;
|
||||
}
|
||||
@@ -553,16 +553,16 @@ export default class SocketService {
|
||||
}
|
||||
} else {
|
||||
// 非JSON格式的消息,作为普通文本处理
|
||||
// console.log('收到非JSON格式消息:', event.data);
|
||||
// console.log('收到非JSON格式消息:', event.data);
|
||||
// 可以添加文本消息的处理逻辑
|
||||
if (this.callBackMapping['text']) {
|
||||
this.callBackMapping['text']({
|
||||
type: 'text',
|
||||
data: event.data
|
||||
this.callBackMapping['text']({
|
||||
type: 'text',
|
||||
data: event.data
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} catch (error) {
|
||||
console.error('消息解析失败:', event.data, error);
|
||||
console.error('消息类型:', typeof event.data);
|
||||
@@ -584,11 +584,11 @@ export default class SocketService {
|
||||
|
||||
this.connectionStatus = ConnectionStatus.RECONNECTING;
|
||||
this.connectRetryCount++;
|
||||
|
||||
|
||||
const delay = this.config.reconnectDelay! * this.connectRetryCount;
|
||||
|
||||
// console.log(`尝试第${this.connectRetryCount}次重连,${delay}ms后开始...`);
|
||||
|
||||
|
||||
// console.log(`尝试第${this.connectRetryCount}次重连,${delay}ms后开始...`);
|
||||
|
||||
setTimeout(() => {
|
||||
try {
|
||||
const result = this.connect();
|
||||
@@ -627,24 +627,24 @@ export default class SocketService {
|
||||
postMessage('heartbeat');
|
||||
}, ${this.config.heartbeatInterval});
|
||||
`;
|
||||
|
||||
|
||||
this.workerBlobUrl = window.URL.createObjectURL(
|
||||
new Blob([workerScript], { type: 'application/javascript' })
|
||||
);
|
||||
|
||||
|
||||
this.heartbeatWorker = new Worker(this.workerBlobUrl);
|
||||
|
||||
|
||||
// 心跳Worker消息处理
|
||||
this.heartbeatWorker.onmessage = (event: MessageEvent) => {
|
||||
this.handleHeartbeatTick();
|
||||
};
|
||||
|
||||
|
||||
// Worker错误处理
|
||||
this.heartbeatWorker.onerror = (error: ErrorEvent) => {
|
||||
console.error('心跳Worker错误:', error);
|
||||
this.clearHeartbeat();
|
||||
};
|
||||
|
||||
|
||||
} catch (error) {
|
||||
console.error('创建心跳Worker失败:', error);
|
||||
}
|
||||
@@ -657,7 +657,7 @@ export default class SocketService {
|
||||
private handleHeartbeatTick(): void {
|
||||
// 检查是否超时(距离上次收到心跳响应的时间)
|
||||
const timeSinceLastResponse = Date.now() - this.lastResponseHeartTime;
|
||||
|
||||
|
||||
if (timeSinceLastResponse > this.config.timeout!) {
|
||||
console.error(`WebSocket心跳超时: ${timeSinceLastResponse}ms > ${this.config.timeout}ms`);
|
||||
ElMessage.error("WebSocket连接超时,请检查网络连接!");
|
||||
@@ -665,7 +665,7 @@ export default class SocketService {
|
||||
this.closeWs();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
this.sendHeartbeat();
|
||||
}
|
||||
|
||||
@@ -674,7 +674,7 @@ export default class SocketService {
|
||||
*/
|
||||
private sendHeartbeat(): void {
|
||||
if (this.connected && this.ws) {
|
||||
// console.log(`${new Date().toLocaleTimeString()} - 发送心跳消息`);
|
||||
// console.log(`${new Date().toLocaleTimeString()} - 发送心跳消息`);
|
||||
this.ws.send('alive');
|
||||
}
|
||||
}
|
||||
@@ -688,7 +688,7 @@ export default class SocketService {
|
||||
this.heartbeatWorker.terminate();
|
||||
this.heartbeatWorker = null;
|
||||
}
|
||||
|
||||
|
||||
if (this.workerBlobUrl) {
|
||||
window.URL.revokeObjectURL(this.workerBlobUrl);
|
||||
this.workerBlobUrl = null;
|
||||
|
||||
@@ -37,6 +37,7 @@ import { jwtUtil } from '@/utils/jwtUtil'
|
||||
import { useCheckStore } from '@/stores/modules/check'
|
||||
import { ipc } from '@/utils/ipcRenderer'
|
||||
import { fa, tr } from 'element-plus/es/locale'
|
||||
import { CheckData } from '@/api/check/interface'
|
||||
const vueFlowElement = ref(442)
|
||||
const checkStore = useCheckStore()
|
||||
const dialogVisible = ref(false)
|
||||
@@ -427,7 +428,7 @@ const standardDevIds = ref<string[]>()
|
||||
const open = async () => {
|
||||
edges.value = []
|
||||
|
||||
devIds.value = prop.devIdList.map(d => d.id)
|
||||
//devIds.value = prop.devIdList.map(d => d.id)
|
||||
standardDevIds.value = prop.pqStandardDevList.map(d => d.id)
|
||||
planId.value = prop.planIdKey
|
||||
nodes.value = createNodes(prop.devIdList, prop.pqStandardDevList, prop.deviceMonitor)
|
||||
@@ -447,11 +448,33 @@ const handleNext = async () => {
|
||||
let chnNumList: string[] = []
|
||||
await edges.value.forEach(edge => {
|
||||
const match = edge.source.split('-')
|
||||
|
||||
if (match) {
|
||||
chnNumList.push(match[2])
|
||||
chnNumList.push(match[1] + '-'+ match[2])
|
||||
}
|
||||
})
|
||||
|
||||
const connectedDeviceIds = [...new Set(chnNumList.map(item => item.split('-')[0]))]
|
||||
devIds.value = connectedDeviceIds
|
||||
//可能存在勾选的被检设备未连线的情况,需要过滤掉
|
||||
let devices: CheckData.Device[] = prop.devIdList
|
||||
.filter((item: any) => connectedDeviceIds.includes(item.id))
|
||||
.map((item: any) => {
|
||||
return {
|
||||
deviceId: item.id,
|
||||
deviceName: item.name,
|
||||
chnNum: item.devChns,
|
||||
planId: item.planId,
|
||||
deviceType: item.devType,
|
||||
devVolt: item.devVolt,
|
||||
devCurr: item.devCurr,
|
||||
factorFlag: item.factorFlag,
|
||||
checkResult: item.checkResult
|
||||
}
|
||||
})
|
||||
checkStore.clearDevices()
|
||||
checkStore.addDevices(devices)
|
||||
|
||||
|
||||
const connections = edges.value.reduce(
|
||||
(map, edge) => {
|
||||
// 从source中提取设备ID和通道号: 被检通道-{deviceId}-{channelNum} => {deviceId}-{channelNum}
|
||||
|
||||
@@ -21,7 +21,11 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="isDataA" label="检测结果">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="row.dataA.isData === 4 || row.dataA.isData === 5">
|
||||
<el-tag type="warning" v-if="row.dataA.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataA.isData === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围:{{ addPercentSigns(row.dataA.radius, row.dataA.unit) }}
|
||||
<br/>
|
||||
@@ -29,8 +33,7 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="row.dataA.isData === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="row.dataA.isData === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="row.dataA.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataA.isData === 5">-</el-tag>
|
||||
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -49,7 +52,11 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="isDataB" label="检测结果">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="row.dataB.isData === 4 || row.dataB.isData === 5">
|
||||
<el-tag type="warning" v-if="row.dataB.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataB.isData === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围:{{ addPercentSigns(row.dataB.radius, row.dataB.unit) }}
|
||||
<br/>
|
||||
@@ -57,8 +64,6 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="row.dataB.isData === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="row.dataB.isData === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="row.dataB.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataB.isData === 5">-</el-tag>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -77,7 +82,11 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="isDataC" label="检测结果">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="row.dataC.isData === 4 || row.dataC.isData === 5">
|
||||
<el-tag type="warning" v-if="row.dataC.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataC.isData === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围:{{ addPercentSigns(row.dataC.radius, row.dataC.unit) }}
|
||||
<br/>
|
||||
@@ -85,8 +94,6 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="row.dataC.isData === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="row.dataC.isData === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="row.dataC.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataC.isData === 5">-</el-tag>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -105,7 +112,11 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="isDataT" label="检测结果">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="row.dataT.isData === 4 || row.dataT.isData === 5">
|
||||
<el-tag type="warning" v-if="row.dataT.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataT.isData === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围:{{ addPercentSigns(row.dataT.radius, row.dataT.unit) }}
|
||||
<br/>
|
||||
@@ -113,8 +124,7 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="row.dataT.isData === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="row.dataT.isData === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="row.dataT.isData === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="row.dataT.isData === 5">-</el-tag>
|
||||
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -563,7 +563,8 @@ const handleErrorSysChange = async () => {
|
||||
errorSysId: formContent.errorSysId,
|
||||
deviceId: formContent.deviceId,
|
||||
code: checkStore.plan.code + '',
|
||||
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? ''
|
||||
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
|
||||
chnNum: formContent.chnNum
|
||||
}).then(res => {
|
||||
if (res.code === ResultEnum.SUCCESS) {
|
||||
ElMessage.success('切换误差体系成功')
|
||||
@@ -579,7 +580,8 @@ const handleReCalculate = async () => {
|
||||
errorSysId: formContent.errorSysId,
|
||||
deviceId: formContent.deviceId,
|
||||
code: checkStore.plan.code + '',
|
||||
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? ''
|
||||
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
|
||||
chnNum: formContent.chnNum
|
||||
}).then(res => {
|
||||
if (res.code === ResultEnum.SUCCESS) {
|
||||
ElMessage.success('重新计算成功!')
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
align="center"
|
||||
>
|
||||
<el-table-column
|
||||
v-for="(chnItem, index2) in checkStore.chnNumList"
|
||||
v-for="(chnItem, index2) in checkStore.chnNumList.filter(c => c.startsWith(item.deviceId))"
|
||||
:key="`${item.deviceId}${chnItem}`"
|
||||
:label="'通道' + chnItem"
|
||||
:label="'通道' + chnItem.split('-')[1]"
|
||||
align="center"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -69,7 +69,7 @@
|
||||
"
|
||||
:color="row.devices[index1].chnResult[index2].color"
|
||||
size="small"
|
||||
@click="handleClick(row, chnItem, row.scriptType)"
|
||||
@click="handleClick(row, chnItem.split('-')[1], row.scriptType)"
|
||||
style="align-self: center"
|
||||
>
|
||||
<el-icon
|
||||
@@ -804,6 +804,7 @@ const initCheckResult = (defaultValue: CheckData.ChnCheckResultEnum) => {
|
||||
})
|
||||
|
||||
Object.assign(checkResult, result)
|
||||
|
||||
}
|
||||
|
||||
const scrollToBottom = () => {
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
<el-table-column prop="dataA" :label="'被检值' + (outerUnit == '' ? '' : '(' + outerUnit + ')')" />
|
||||
<el-table-column prop="isDataA" label="检测结果">
|
||||
<template #default="scope">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="scope.row.isDataA === 4 || scope.row.isDataA === 5">
|
||||
<el-tag type="warning" v-if="scope.row.isDataA === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围:{{ scope.row.maxErrorA }}
|
||||
<br />
|
||||
@@ -25,8 +29,6 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="scope.row.isDataA === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="scope.row.isDataA === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="scope.row.isDataA === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -36,7 +38,11 @@
|
||||
<el-table-column prop="dataB" :label="'被检值' + (outerUnit == '' ? '' : '(' + outerUnit + ')')" />
|
||||
<el-table-column prop="isDataB" label="检测结果">
|
||||
<template #default="scope">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="scope.row.isDataB === 4 || scope.row.isDataB === 5">
|
||||
<el-tag type="warning" v-if="scope.row.isDataB === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围:{{ scope.row.maxErrorB }}
|
||||
<br />
|
||||
@@ -44,8 +50,7 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="scope.row.isDataB === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="scope.row.isDataB === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="scope.row.isDataB === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -55,7 +60,11 @@
|
||||
<el-table-column prop="dataC" :label="'被检值' + (outerUnit == '' ? '' : '(' + outerUnit + ')')" />
|
||||
<el-table-column prop="isDataC" label="检测结果">
|
||||
<template #default="scope">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="scope.row.isDataC === 4 || scope.row.isDataC === 5">
|
||||
<el-tag type="warning" v-if="scope.row.isDataC === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围: {{ scope.row.maxErrorC }}
|
||||
<br />
|
||||
@@ -63,8 +72,7 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="scope.row.isDataC === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="scope.row.isDataC === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="scope.row.isDataC === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -75,7 +83,11 @@
|
||||
<el-table-column prop="dataT" :label="'被检值' + (outerUnit == '' ? '' : '(' + outerUnit + ')')" />
|
||||
<el-table-column prop="isDataT" label="检测结果">
|
||||
<template #default="scope">
|
||||
<el-tooltip effect="dark" placement="bottom">
|
||||
<template v-if="scope.row.isDataT === 4 || scope.row.isDataT === 5">
|
||||
<el-tag type="warning" v-if="scope.row.isDataT === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
</template>
|
||||
<el-tooltip v-else effect="dark" placement="bottom">
|
||||
<template #content>
|
||||
误差范围: {{ scope.row.maxErrorT }}
|
||||
<br />
|
||||
@@ -83,8 +95,6 @@
|
||||
</template>
|
||||
<el-tag type="success" v-if="scope.row.isDataT === 1">符合</el-tag>
|
||||
<el-tag type="danger" v-if="scope.row.isDataT === 2">不符合</el-tag>
|
||||
<el-tag type="warning" v-if="scope.row.isDataT === 4">/</el-tag>
|
||||
<el-tag type="info" v-if="scope.row.isDataA === 5">-</el-tag>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -18,13 +18,15 @@
|
||||
<img :src="item.img" />
|
||||
</div>
|
||||
<div class="test_button">
|
||||
<el-button size="large" type="primary" @click="handelOpen(item)" :disabled="!item.activated">
|
||||
进入检测
|
||||
<el-button size="large" type="primary" @click="handelOpen(item)">
|
||||
{{ item.activated ? '进入检测' : '待激活' }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-carousel-item>
|
||||
</el-carousel>
|
||||
</div>
|
||||
<!-- versionRegisterDialog -->
|
||||
<VersionDialog ref="versionRegisterRef"></VersionDialog>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { useAuthStore } from '@/stores/modules/auth'
|
||||
@@ -32,6 +34,8 @@ import { useAppSceneStore, useModeStore } from '@/stores/modules/mode' // 引入
|
||||
import { getCurrentScene } from '@/api/user/login'
|
||||
import { initDynamicRouter } from '@/routers/modules/dynamicRouter'
|
||||
import { useTabsStore } from '@/stores/modules/tabs'
|
||||
import VersionDialog from '@/views/system/versionRegister/index.vue'
|
||||
import { ref, onMounted } from 'vue'
|
||||
|
||||
const authStore = useAuthStore()
|
||||
const modeStore = useModeStore() // 使用模式 store
|
||||
@@ -39,6 +43,7 @@ const AppSceneStore = useAppSceneStore()
|
||||
const activateInfo = authStore.activateInfo
|
||||
const isActivateOpen = import.meta.env.VITE_ACTIVATE_OPEN
|
||||
const tabsStore = useTabsStore()
|
||||
const versionRegisterRef = ref<InstanceType<typeof VersionDialog> | null>(null)
|
||||
const modeList = [
|
||||
{
|
||||
name: '模拟式模块',
|
||||
@@ -64,7 +69,8 @@ const modeList = [
|
||||
]
|
||||
const handelOpen = async (item: any) => {
|
||||
if (!item.activated) {
|
||||
ElMessage.warning(`${item.name}未激活`)
|
||||
// 打开版本激活弹窗
|
||||
versionRegisterRef.value?.openDialog()
|
||||
return
|
||||
}
|
||||
modeStore.setCurrentMode(item.code) // 将模式code存入 store
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="checked">
|
||||
<el-form-item prop="checked" v-show="false">
|
||||
<el-checkbox v-model="loginForm.checked">记住我</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
</el-icon>
|
||||
</el-tooltip>
|
||||
<el-button
|
||||
v-if="!data.disabled && !props.disabled"
|
||||
v-if="modeStore.currentMode === '比对式' ? !data.disabled : (!data.disabled && !props.disabled)"
|
||||
text
|
||||
circle
|
||||
@click="removeNode(data)"
|
||||
@@ -252,7 +252,7 @@
|
||||
</el-row>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { nextTick, ref, watch } from 'vue'
|
||||
import { computed, nextTick, onMounted, PropType, ref, useSlots, watch } from 'vue'
|
||||
import type {
|
||||
FilterNodeMethodFunction,
|
||||
RenderContentContext,
|
||||
@@ -261,6 +261,7 @@ import type {
|
||||
TreeKey
|
||||
} from 'element-plus'
|
||||
import { Cpu, Lightning, Location, OfficeBuilding, Warning } from '@element-plus/icons-vue'
|
||||
import { useModeStore } from '@/stores/modules/mode' // 引入模式 store
|
||||
|
||||
interface Tree {
|
||||
[key: string]: any
|
||||
@@ -274,6 +275,7 @@ interface Device {
|
||||
type Data = RenderContentContext['data']
|
||||
const modelValue = defineModel<string[]>({ default: [] })
|
||||
const slots = useSlots()
|
||||
const modeStore = useModeStore()
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Array as unknown as PropType<Device[]>,
|
||||
@@ -298,7 +300,7 @@ const props = defineProps({
|
||||
expandAll: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
})
|
||||
const leftTreeRef = ref<TreeInstance>()
|
||||
const rightTreeRef = ref<TreeInstance>()
|
||||
@@ -353,6 +355,7 @@ watch(
|
||||
)
|
||||
|
||||
const initTree = (data: Device[]) => {
|
||||
|
||||
// 禁用Key数据
|
||||
disabledKeys.value = data.filter(item => item.disabled).map(item => item.id)
|
||||
// 编辑逻辑
|
||||
@@ -360,11 +363,14 @@ const initTree = (data: Device[]) => {
|
||||
modelValue.value = []
|
||||
}
|
||||
// 左侧树数据
|
||||
leftTreeData.value = convertToTree(data, filter.value.groupBy)
|
||||
leftTreeData.value = convertToTree(data, 0,filter.value.groupBy)
|
||||
|
||||
// 右侧树数据
|
||||
rightTreeData.value = convertToTree(
|
||||
data.filter(item => item.checked),
|
||||
1,
|
||||
filter.value.groupBy
|
||||
|
||||
)
|
||||
defaultCheckedKeys.value = data.filter(item => item.checked).map(item => item.id)
|
||||
modelValue.value = defaultCheckedKeys.value
|
||||
@@ -393,7 +399,7 @@ const setCheckedStatus = (checked: boolean) => {
|
||||
})
|
||||
}
|
||||
}
|
||||
const convertToTree = (data: Device[], groupBy?: string | undefined) => {
|
||||
const convertToTree = (data: Device[], type: number,groupBy?: string | undefined) => {
|
||||
if (groupBy) {
|
||||
// 创建一个映射来存储每个分组
|
||||
const groupMap = new Map()
|
||||
@@ -408,21 +414,57 @@ const convertToTree = (data: Device[], groupBy?: string | undefined) => {
|
||||
})
|
||||
|
||||
// 将分组转换为树形结构
|
||||
const treeData: Tree[] = []
|
||||
groupMap.forEach((items, groupName) => {
|
||||
const groupNode: Tree = {
|
||||
id: `${groupBy}_${groupName}`,
|
||||
label: groupName,
|
||||
children: (items as any[]).map((item: any) => ({
|
||||
...item,
|
||||
label: item.name,
|
||||
children: [],
|
||||
disabled: item.disabled ? item.disabled : props.disabled
|
||||
})),
|
||||
disabled: props.disabled
|
||||
}
|
||||
treeData.push(groupNode)
|
||||
})
|
||||
const treeData: Tree[] = []
|
||||
|
||||
if(modeStore.currentMode == '比对式'){
|
||||
groupMap.forEach((items, groupName) => {
|
||||
let groupNode: Tree;
|
||||
if(type === 0){
|
||||
// 只有当组内所有项目都禁用时,才将组节点设为禁用
|
||||
const allItemsDisabled = (items as any[]).every((item: any) => {
|
||||
return item.disabled === true ;
|
||||
});
|
||||
groupNode = {
|
||||
id: `${groupBy}_${groupName}`,
|
||||
label: groupName,
|
||||
children: (items as any[]).map((item: any) => ({
|
||||
...item,
|
||||
label: item.name,
|
||||
children: [],
|
||||
// disabled: item.disabled ? item.disabled : props.disabled
|
||||
})),
|
||||
// disabled: props.disabled
|
||||
disabled: allItemsDisabled
|
||||
}
|
||||
}else{
|
||||
groupNode = {
|
||||
id: `${groupBy}_${groupName}`,
|
||||
label: groupName,
|
||||
children: (items as any[]).map((item: any) => ({
|
||||
...item,
|
||||
label: item.name,
|
||||
children: [],
|
||||
})),
|
||||
}
|
||||
}
|
||||
treeData.push(groupNode)
|
||||
})
|
||||
}else{
|
||||
groupMap.forEach((items, groupName) => {
|
||||
const groupNode: Tree = {
|
||||
id: `${groupBy}_${groupName}`,
|
||||
label: groupName,
|
||||
children: (items as any[]).map((item: any) => ({
|
||||
...item,
|
||||
label: item.name,
|
||||
children: [],
|
||||
disabled: item.disabled ? item.disabled : props.disabled
|
||||
})),
|
||||
disabled: props.disabled
|
||||
}
|
||||
treeData.push(groupNode)
|
||||
})
|
||||
}
|
||||
|
||||
return treeData
|
||||
} else {
|
||||
@@ -445,14 +487,17 @@ const filterNode: FilterNodeMethodFunction = (value: string, data: Tree) => {
|
||||
}
|
||||
return data.label.includes(value) || data.cityName.includes(value) || data.manufacturer.includes(value)
|
||||
}
|
||||
|
||||
const handleCommand = (command: string) => {
|
||||
filter.value.groupBy = command
|
||||
const oldCheckedKeys = leftTreeRef.value?.getCheckedKeys() || []
|
||||
leftTreeData.value = convertToTree(props.data, filter.value.groupBy)
|
||||
leftTreeData.value = convertToTree(props.data,0, filter.value.groupBy)
|
||||
leftTreeRef.value?.setCheckedKeys(oldCheckedKeys)
|
||||
rightTreeData.value = convertToTree(
|
||||
props.data.filter(item => oldCheckedKeys.includes(item.id)),
|
||||
1,
|
||||
filter.value.groupBy
|
||||
|
||||
)
|
||||
if (filter.value.checkAll) {
|
||||
setCheckedStatus(true)
|
||||
@@ -467,10 +512,14 @@ const handleCheckChange = () => {
|
||||
.map(key => key.toString())
|
||||
rightTreeData.value = convertToTree(
|
||||
props.data.filter(item => checkedKeys.includes(item.id)),
|
||||
filter.value.groupBy
|
||||
1,
|
||||
filter.value.groupBy,
|
||||
|
||||
)
|
||||
statistics.value.checked = checkedKeys.length || 0
|
||||
filter.value.checkAll = statistics.value.checked === statistics.value.total
|
||||
|
||||
|
||||
}
|
||||
const clearAll = () => {
|
||||
if (statistics.value.checked > 0) {
|
||||
@@ -478,11 +527,44 @@ const clearAll = () => {
|
||||
}
|
||||
}
|
||||
const removeNode = (data: Data) => {
|
||||
|
||||
nextTick(() => {
|
||||
leftTreeRef.value?.setChecked(data, false, true)
|
||||
rightTreeRef.value?.remove(data)
|
||||
})
|
||||
}
|
||||
|
||||
// 获取当前右侧树中的设备ID
|
||||
const getSelectedDeviceIds = () => {
|
||||
const extractDeviceIds = (treeData: Tree[]): string[] => {
|
||||
const ids: string[] = [];
|
||||
|
||||
const traverse = (nodes: Tree[]) => {
|
||||
if (!Array.isArray(nodes)) return;
|
||||
|
||||
nodes.forEach(node => {
|
||||
// 如果节点有 children 且不为空,则递归遍历
|
||||
if (node.children && Array.isArray(node.children) && node.children.length > 0) {
|
||||
traverse(node.children);
|
||||
} else {
|
||||
// 只有叶子节点(设备节点)才添加到 ID 列表中
|
||||
// 设备节点的 ID 不包含下划线
|
||||
if (node.id && !node.id.toString().includes('_')) {
|
||||
ids.push(node.id);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
traverse(treeData);
|
||||
return ids;
|
||||
};
|
||||
|
||||
return extractDeviceIds(rightTreeData.value);
|
||||
};
|
||||
|
||||
|
||||
defineExpose({ getSelectedDeviceIds });
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.card-header {
|
||||
|
||||
@@ -243,6 +243,7 @@
|
||||
</el-col>
|
||||
<el-col :span="15">
|
||||
<DevSelect
|
||||
ref="devSelectRef"
|
||||
v-model="formContent.devIds"
|
||||
:titles="['被检设备列表', '已选被检设备列表']"
|
||||
filter-placeholder="请输入内容搜索"
|
||||
@@ -459,12 +460,14 @@ import { getTestConfig } from '@/api/system/base'
|
||||
import { getRegRes } from '@/api/system/versionRegister'
|
||||
import DevSelect from '@/views/plan/planList/components/devSelect.vue'
|
||||
import { WarningFilled } from '@element-plus/icons-vue'
|
||||
import { el } from 'element-plus/es/locale'
|
||||
|
||||
const modeStore = useModeStore()
|
||||
const AppSceneStore = useAppSceneStore()
|
||||
const dictStore = useDictStore()
|
||||
// 定义弹出组件元信息
|
||||
const dialogFormRef = ref()
|
||||
const devSelectRef = ref()
|
||||
const mode = ref()
|
||||
const selectByMode = ref(true)
|
||||
const pqSourceList = ref<TestSource.ResTestSource[]>([]) //获取指定模式下所有检测源
|
||||
@@ -513,11 +516,20 @@ const generateData = () => {
|
||||
}
|
||||
}
|
||||
i.checked = boundPqDevIds.length > 0 ? boundPqDevIds.includes(i.id) : false
|
||||
if (i.checkState && i.checkState != 0) {
|
||||
i.disabled = true
|
||||
}
|
||||
if (allDisabled.value) {
|
||||
i.disabled = true
|
||||
|
||||
if (mode.value === '比对式') {
|
||||
if (i.checkState && i.checkState != 0) {
|
||||
i.disabled = true
|
||||
}else {
|
||||
i.disabled = false
|
||||
}
|
||||
}else{
|
||||
if (i.checkState && i.checkState != 0) {
|
||||
i.disabled = true
|
||||
}
|
||||
if (allDisabled.value) {
|
||||
i.disabled = true
|
||||
}
|
||||
}
|
||||
})
|
||||
// 排序逻辑
|
||||
@@ -533,6 +545,7 @@ const generateData = () => {
|
||||
// 最后按名称排序(升序)
|
||||
return a.name.localeCompare(b.name)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -756,6 +769,7 @@ const save = () => {
|
||||
emit('update:tab')
|
||||
} else {
|
||||
formContent.sourceIds = null
|
||||
formContent.devIds = devSelectRef.value?.getSelectedDeviceIds() || [];
|
||||
await updatePlan(formContent)
|
||||
}
|
||||
} else {
|
||||
@@ -1086,12 +1100,12 @@ const open = async (sign: string, data: Plan.ReqPlan, currentMode: string, plan:
|
||||
}
|
||||
}
|
||||
//数据源选中录波,检测项禁止频率和闪变
|
||||
if(formContent.datasourceIds.includes('wave_data')){
|
||||
const frequencyOption = secondLevelOptions.find(option => option.label.includes('频率'));
|
||||
if (frequencyOption && Array.isArray(formContent.testItems)) {
|
||||
formContent.testItems = formContent.testItems.filter(id => id !== frequencyOption.value);
|
||||
}
|
||||
}
|
||||
// if(formContent.datasourceIds.includes('wave_data')){
|
||||
// const frequencyOption = secondLevelOptions.find(option => option.label.includes('频率'));
|
||||
// if (frequencyOption && Array.isArray(formContent.testItems)) {
|
||||
// formContent.testItems = formContent.testItems.filter(id => id !== frequencyOption.value);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
if (mode.value != '比对式') {
|
||||
@@ -1296,6 +1310,7 @@ const handleDataSourceChange = () => {
|
||||
const hasMinuteStats = selectedLabels.some(label => label.includes('分钟'))
|
||||
const hasLuBo = selectedLabels.some(label => label.includes('录波'))
|
||||
|
||||
|
||||
if (hasThreeSeconds && hasMinuteStats) {
|
||||
ElMessage.warning('3s实时数据与分钟统计数据不能同时选择')
|
||||
formContent.datasourceIds = []
|
||||
@@ -1333,10 +1348,10 @@ const handleDataSourceChange = () => {
|
||||
} else {
|
||||
statisticsSetting.value = false
|
||||
}
|
||||
if (hasLuBo) {
|
||||
if (hasLuBo && selectedLabels.length === 1) {
|
||||
waveRecordSetting.value = true
|
||||
|
||||
// 当选中录波数据源时,从已选检测项中移除频率和闪变项
|
||||
//只勾选录波数据源时,从已选检测项中移除频率和闪变项
|
||||
const frequencyOption = secondLevelOptions.find(option => option.label.includes('频率'));
|
||||
const flickerOption = secondLevelOptions.find(option => option.label.includes('闪变'));
|
||||
|
||||
@@ -1353,30 +1368,59 @@ const handleDataSourceChange = () => {
|
||||
|
||||
formContent.testItems = filteredItems;
|
||||
}
|
||||
} else {
|
||||
}else if (hasLuBo && selectedLabels.length > 1) {
|
||||
waveRecordSetting.value = true
|
||||
//数据源有多个且包含录波数据源时,从已选检测项中移除闪变项
|
||||
const flickerOption = secondLevelOptions.find(option => option.label.includes('闪变'));
|
||||
|
||||
if (Array.isArray(formContent.testItems)) {
|
||||
let filteredItems = [...formContent.testItems];
|
||||
|
||||
if (flickerOption) {
|
||||
filteredItems = filteredItems.filter(id => id !== flickerOption.value);
|
||||
}
|
||||
|
||||
formContent.testItems = filteredItems;
|
||||
}
|
||||
}else {
|
||||
waveRecordSetting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 判断检测项是否应被禁用
|
||||
const shouldDisableTestItem = computed(() => {
|
||||
return (option: { label: string; value: string }) => {
|
||||
// 当数据源选中录波时,禁用频率和闪变选项
|
||||
if (Array.isArray(formContent.datasourceIds)) {
|
||||
const hasLuBo = formContent.datasourceIds.some(id => {
|
||||
const dictItem = dictStore.getDictData(dataSourceType.value).find(item => item.code === id);
|
||||
return dictItem ? dictItem.name.includes('录波') : false;
|
||||
});
|
||||
|
||||
if (hasLuBo && (option.label.includes('频率') || option.label.includes('闪变'))) {
|
||||
// 获取当前选中的 datasourceIds,并确保为数组
|
||||
const values = Array.isArray(formContent.datasourceIds)
|
||||
? formContent.datasourceIds
|
||||
: [formContent.datasourceIds].filter(Boolean) // 转为数组并过滤空值
|
||||
|
||||
const selectedLabels = values.map(value => {
|
||||
const dictItem = dictStore.getDictData(dataSourceType.value).find(item => item.code === value);
|
||||
return dictItem ? dictItem.name : '';
|
||||
});
|
||||
|
||||
const hasLuBo = selectedLabels.some(label => label.includes('录波'));
|
||||
|
||||
// 当只勾选录波数据源时,禁用频率和闪变选项
|
||||
if (hasLuBo && selectedLabels.length === 1) {
|
||||
if (option.label.includes('频率') || option.label.includes('闪变')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// 当数据源有多个且包含录波数据源时,只禁用闪变选项
|
||||
else if (hasLuBo && selectedLabels.length > 1) {
|
||||
if (option.label.includes('闪变')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
|
||||
//导入设备
|
||||
const deviceImportExcel = ref<InstanceType<typeof ImportExcel> | null>(null)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user