feat(elevator): 实现楼层感知的电梯状态显示,非当前楼层电梯强制显示为关门状态以优化可视化效果
This commit is contained in:
parent
eda308db14
commit
b1d77ae3c8
@ -106,6 +106,17 @@ const client = shallowRef<WebSocket>();
|
|||||||
|
|
||||||
// 电梯状态管理
|
// 电梯状态管理
|
||||||
const elevatorStore = useElevatorStore();
|
const elevatorStore = useElevatorStore();
|
||||||
|
|
||||||
|
// 计算当前场景的楼层号
|
||||||
|
const currentFloor = computed(() => currentFloorIndex.value + 1);
|
||||||
|
|
||||||
|
// 将当前楼层信息提供给电梯store
|
||||||
|
elevatorStore.setCurrentFloor(currentFloor.value);
|
||||||
|
|
||||||
|
// 监听楼层变化,更新电梯store中的当前楼层
|
||||||
|
watch(currentFloor, (newFloor) => {
|
||||||
|
elevatorStore.setCurrentFloor(newFloor);
|
||||||
|
});
|
||||||
// 模拟门设备WS推送(仅开发调试使用)
|
// 模拟门设备WS推送(仅开发调试使用)
|
||||||
let doorMockTimer: number | undefined;
|
let doorMockTimer: number | undefined;
|
||||||
let doorMockStatus: 0 | 1 = 0;
|
let doorMockStatus: 0 | 1 = 0;
|
||||||
@ -533,7 +544,7 @@ onMounted(async () => {
|
|||||||
elevatorStore.handleElevatorWebSocketData({
|
elevatorStore.handleElevatorWebSocketData({
|
||||||
id: '1998661793706377218',
|
id: '1998661793706377218',
|
||||||
type: 102,
|
type: 102,
|
||||||
elevatorFloor: 5,
|
elevatorFloor: 1,
|
||||||
elevatorDirection: 2, // 停止
|
elevatorDirection: 2, // 停止
|
||||||
elevatorFrontDoorStatus: 2, // 正在开关
|
elevatorFrontDoorStatus: 2, // 正在开关
|
||||||
isConnected: true
|
isConnected: true
|
||||||
@ -544,26 +555,26 @@ onMounted(async () => {
|
|||||||
|
|
||||||
// 定义电梯状态变化序列
|
// 定义电梯状态变化序列
|
||||||
const elevatorStates = [
|
const elevatorStates = [
|
||||||
{ floor: 5, direction: 2, doorStatus: 2 }, // 5楼,停止,正在开关门
|
{ floor: 1, direction: 2, doorStatus: 2 }, // 1楼,停止,正在开关门
|
||||||
{ floor: 5, direction: 2, doorStatus: 3 }, // 5楼,停止,门已开
|
{ floor: 1, direction: 2, doorStatus: 3 }, // 1楼,停止,门已开
|
||||||
{ floor: 5, direction: 2, doorStatus: 1 }, // 5楼,停止,门已关
|
{ floor: 1, direction: 2, doorStatus: 1 }, // 1楼,停止,门已关
|
||||||
{ floor: 5, direction: 2, doorStatus: 1 }, // 5楼,向上,门已关
|
{ floor: 1, direction: 2, doorStatus: 1 }, // 1楼,向上,门已关
|
||||||
{ floor: 6, direction: 2, doorStatus: 1 }, // 6楼,向上,门已关
|
{ floor: 2, direction: 2, doorStatus: 1 }, // 2楼,向上,门已关
|
||||||
{ floor: 6, direction: 2, doorStatus: 2 }, // 6楼,向上,正在开关门
|
{ floor: 2, direction: 2, doorStatus: 2 }, // 2楼,向上,正在开关门
|
||||||
{ floor: 6, direction: 2, doorStatus: 3 }, // 6楼,向上,门已开
|
{ floor: 2, direction: 2, doorStatus: 3 }, // 2楼,向上,门已开
|
||||||
{ floor: 6, direction: 2, doorStatus: 1 }, // 6楼,向上,门已关
|
{ floor: 2, direction: 2, doorStatus: 1 }, // 2楼,向上,门已关
|
||||||
{ floor: 7, direction: 2, doorStatus: 1 }, // 7楼,向上,门已关
|
{ floor: 3, direction: 2, doorStatus: 1 }, // 3楼,向上,门已关
|
||||||
{ floor: 7, direction: 2, doorStatus: 2 }, // 7楼,向上,正在开关门
|
{ floor: 3, direction: 2, doorStatus: 2 }, // 3楼,向上,正在开关门
|
||||||
{ floor: 7, direction: 2, doorStatus: 3 }, // 7楼,向上,门已开
|
{ floor: 3, direction: 2, doorStatus: 3 }, // 3楼,向上,门已开
|
||||||
{ floor: 7, direction: 2, doorStatus: 1 }, // 7楼,向上,门已关
|
{ floor: 3, direction: 2, doorStatus: 1 }, // 3楼,向上,门已关
|
||||||
{ floor: 7, direction: 1, doorStatus: 1 }, // 7楼,停止,门已关
|
{ floor: 3, direction: 1, doorStatus: 1 }, // 3楼,停止,门已关
|
||||||
{ floor: 7, direction: 3, doorStatus: 1 }, // 7楼,向下,门已关
|
{ floor: 3, direction: 3, doorStatus: 1 }, // 3楼,向下,门已关
|
||||||
{ floor: 6, direction: 3, doorStatus: 1 }, // 6楼,向下,门已关
|
{ floor: 2, direction: 3, doorStatus: 1 }, // 2楼,向下,门已关
|
||||||
{ floor: 6, direction: 3, doorStatus: 2 }, // 6楼,向下,正在开关门
|
{ floor: 2, direction: 3, doorStatus: 2 }, // 2楼,向下,正在开关门
|
||||||
{ floor: 6, direction: 3, doorStatus: 3 }, // 6楼,向下,门已开
|
{ floor: 2, direction: 3, doorStatus: 3 }, // 2楼,向下,门已开
|
||||||
{ floor: 6, direction: 3, doorStatus: 1 }, // 6楼,向下,门已关
|
{ floor: 2, direction: 3, doorStatus: 1 }, // 2楼,向下,门已关
|
||||||
{ floor: 5, direction: 3, doorStatus: 1 }, // 5楼,向下,门已关
|
{ floor: 1, direction: 3, doorStatus: 1 }, // 1楼,向下,门已关
|
||||||
{ floor: 5, direction: 1, doorStatus: 1 }, // 5楼,停止,门已关
|
{ floor: 1, direction: 1, doorStatus: 1 }, // 1楼,停止,门已关
|
||||||
];
|
];
|
||||||
|
|
||||||
elevatorMockTimer = window.setInterval(() => {
|
elevatorMockTimer = window.setInterval(() => {
|
||||||
|
|||||||
@ -391,8 +391,12 @@ function drawElevatorMinimal(
|
|||||||
elevatorDirection,
|
elevatorDirection,
|
||||||
elevatorFrontDoorStatus,
|
elevatorFrontDoorStatus,
|
||||||
isConnected,
|
isConnected,
|
||||||
|
isCurrentFloor = true, // 默认为true,兼容旧数据
|
||||||
} = elevatorData;
|
} = elevatorData;
|
||||||
|
|
||||||
|
// 如果不是当前楼层,强制设为关门状态,但保留其他状态
|
||||||
|
const actualDoorStatus = isCurrentFloor ? elevatorFrontDoorStatus : 1;
|
||||||
|
|
||||||
const { x = 0, y = 0, width: w = 0, height: h = 0 } = pen.calculative?.worldRect ?? {};
|
const { x = 0, y = 0, width: w = 0, height: h = 0 } = pen.calculative?.worldRect ?? {};
|
||||||
|
|
||||||
// 基于pen元素尺寸的动态边框参数
|
// 基于pen元素尺寸的动态边框参数
|
||||||
@ -475,7 +479,7 @@ function drawElevatorMinimal(
|
|||||||
y + h / 2,
|
y + h / 2,
|
||||||
Math.min(48, w * 0.8), // 根据pen大小调整电梯图标宽度,最大48像素
|
Math.min(48, w * 0.8), // 根据pen大小调整电梯图标宽度,最大48像素
|
||||||
Math.min(60, h * 0.8), // 根据pen大小调整电梯图标高度,最大60像素
|
Math.min(60, h * 0.8), // 根据pen大小调整电梯图标高度,最大60像素
|
||||||
elevatorFrontDoorStatus,
|
actualDoorStatus, // 使用经过楼层过滤后的门状态
|
||||||
time,
|
time,
|
||||||
elevatorDirection
|
elevatorDirection
|
||||||
);
|
);
|
||||||
|
|||||||
@ -47,6 +47,8 @@ export const useElevatorStore = defineStore('elevator', () => {
|
|||||||
const elevators = ref<Map<string, ElevatorData>>(new Map());
|
const elevators = ref<Map<string, ElevatorData>>(new Map());
|
||||||
const elevatorPoints = ref<Map<string, ElevatorPoint>>(new Map());
|
const elevatorPoints = ref<Map<string, ElevatorPoint>>(new Map());
|
||||||
const editorService = ref<EditorService | null>(null);
|
const editorService = ref<EditorService | null>(null);
|
||||||
|
// 当前楼层状态
|
||||||
|
const currentFloor = ref<number>(1);
|
||||||
// 动画相关状态
|
// 动画相关状态
|
||||||
const movingElevators = ref<Set<string>>(new Set());
|
const movingElevators = ref<Set<string>>(new Set());
|
||||||
const animationFrameId = ref<number | null>(null);
|
const animationFrameId = ref<number | null>(null);
|
||||||
@ -54,7 +56,16 @@ export const useElevatorStore = defineStore('elevator', () => {
|
|||||||
|
|
||||||
// ========== 方法 ==========
|
// ========== 方法 ==========
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前楼层
|
||||||
|
*/
|
||||||
|
const setCurrentFloor = (floor: number) => {
|
||||||
|
currentFloor.value = floor;
|
||||||
|
console.log(`🛗 当前楼层设置为: ${floor}`);
|
||||||
|
// 重新刷新所有电梯显示,以应用新的楼层过滤
|
||||||
|
refreshMapping();
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置编辑器服务
|
* 设置编辑器服务
|
||||||
* 注意:此方法只保存编辑器引用,不会立即构建映射
|
* 注意:此方法只保存编辑器引用,不会立即构建映射
|
||||||
@ -240,6 +251,9 @@ export const useElevatorStore = defineStore('elevator', () => {
|
|||||||
|
|
||||||
const penId = elevatorData.penId;
|
const penId = elevatorData.penId;
|
||||||
|
|
||||||
|
// 判断电梯当前楼层是否与场景楼层一致
|
||||||
|
const isCurrentFloor = elevatorData.elevatorFloor === currentFloor.value;
|
||||||
|
|
||||||
// 基础更新数据
|
// 基础更新数据
|
||||||
const updateData: any = {
|
const updateData: any = {
|
||||||
// 更新点位信息
|
// 更新点位信息
|
||||||
@ -250,7 +264,8 @@ export const useElevatorStore = defineStore('elevator', () => {
|
|||||||
lastUpdate: elevatorData.lastUpdate,
|
lastUpdate: elevatorData.lastUpdate,
|
||||||
// 保存原始后端数据
|
// 保存原始后端数据
|
||||||
elevatorDirection: elevatorData.elevatorDirection,
|
elevatorDirection: elevatorData.elevatorDirection,
|
||||||
elevatorFrontDoorStatus: elevatorData.elevatorFrontDoorStatus
|
elevatorFrontDoorStatus: isCurrentFloor ? elevatorData.elevatorFrontDoorStatus : 1, // 非当前楼层强制设为关门状态
|
||||||
|
isCurrentFloor: isCurrentFloor // 添加标识,用于渲染层判断
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -258,6 +273,10 @@ export const useElevatorStore = defineStore('elevator', () => {
|
|||||||
// 更新电梯点
|
// 更新电梯点
|
||||||
editorService.value.updatePen(penId, updateData, false);
|
editorService.value.updatePen(penId, updateData, false);
|
||||||
|
|
||||||
|
// 调试信息
|
||||||
|
if (elevatorData.elevatorFloor !== currentFloor.value) {
|
||||||
|
console.log(`🛗 电梯 ${elevatorData.deviceId} 位于 ${elevatorData.elevatorFloor} 楼,当前场景为 ${currentFloor.value} 楼,隐藏开关门状态`);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`🛗 更新电梯点显示失败 (${elevatorData.deviceId}):`, error);
|
console.error(`🛗 更新电梯点显示失败 (${elevatorData.deviceId}):`, error);
|
||||||
@ -286,8 +305,10 @@ export const useElevatorStore = defineStore('elevator', () => {
|
|||||||
elevators,
|
elevators,
|
||||||
elevatorPoints,
|
elevatorPoints,
|
||||||
editorService,
|
editorService,
|
||||||
|
currentFloor,
|
||||||
// 方法
|
// 方法
|
||||||
setEditorService,
|
setEditorService,
|
||||||
|
setCurrentFloor,
|
||||||
handleElevatorWebSocketData,
|
handleElevatorWebSocketData,
|
||||||
refreshMapping
|
refreshMapping
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user