feat: 优化库位状态更新逻辑,支持增量刷新和状态比较,提升性能

This commit is contained in:
xudan 2025-09-05 16:01:02 +08:00
parent 7708bcfaa1
commit b06ce3ebd7

View File

@ -396,8 +396,21 @@ export class StorageLocationService {
// 只更新有变化的点的边框颜色
this.updatePointBorderColorsOptimized(changedPointIds);
// 重新创建所有动作点的库位pen对象以反映最新状态
this.createAll();
// 仅对发生变化的点位做增量刷新:存在则批量更新状态,不存在则创建
for (const pointId of changedPointIds) {
const pointPen = this.editor?.getPenById(pointId);
const storageNames = pointPen?.point?.associatedStorageLocations;
if (pointPen && Array.isArray(storageNames) && storageNames.length > 0) {
const existing = this.getStorageLocationPens(pointId);
if (existing.length > 0) {
// 已有库位图元:按名称列表从 storageStateMap 取状态并批量更新
this.update(pointId, storageNames);
} else {
// 不存在库位图元:为该点创建一次
this.create(pointId, storageNames);
}
}
}
// 批量更新后触发一次重绘
this.scheduleRender();
@ -633,12 +646,27 @@ export class StorageLocationService {
state: { occupied?: boolean; locked?: boolean }
): void {
if (!this.editor) return;
// 计算新旧状态,用于比较与更新
const prevOccupied = !!storageLocation.occupied;
const prevLocked = !!storageLocation.locked;
const nextOccupied = state.occupied ?? prevOccupied;
const nextLocked = state.locked ?? prevLocked;
const updatedState = { ...storageLocation, ...state };
this.editor.updatePen(penId, {
storageLocation: updatedState,
background: this.getColorByOccupiedState(updatedState.occupied || false),
}, false);
// 若状态无变化则跳过
if (prevOccupied === nextOccupied && prevLocked === nextLocked) {
return;
}
const updatedState = { ...storageLocation, occupied: nextOccupied, locked: nextLocked };
const nextBg = this.getColorByOccupiedState(updatedState.occupied || false);
this.editor.updatePen(
penId,
{
storageLocation: updatedState,
background: nextBg,
},
false,
);
}
/**