|
|
|
@ -3,6 +3,7 @@ import localforage from 'localforage' |
|
|
|
import type EntityManager from './EntityManager' |
|
|
|
import { markRaw, reactive, ref } from 'vue' |
|
|
|
import type Viewport from '@/core/engine/Viewport.ts' |
|
|
|
import { getQueryParams, setQueryParam } from '@/utils/webutils.ts' |
|
|
|
|
|
|
|
// 差异类型定义
|
|
|
|
interface DataDiff { |
|
|
|
@ -142,7 +143,7 @@ export default class StateManager { |
|
|
|
/** |
|
|
|
* 结束用户操作(计算差异并保存) |
|
|
|
*/ |
|
|
|
endStateUpdate(): void { |
|
|
|
endStateUpdate(option = { autoSave: true }): void { |
|
|
|
this.calculateDiff() |
|
|
|
this.saveStep() |
|
|
|
this.syncDataState(this.changeTracker) |
|
|
|
@ -150,7 +151,9 @@ export default class StateManager { |
|
|
|
this.pendingChanges = true // 标记有需要保存的更改
|
|
|
|
this.isUpdating = false |
|
|
|
|
|
|
|
this.startAutoSave() // 触发自动保存
|
|
|
|
if (option.autoSave) { |
|
|
|
this.startAutoSave() // 触发自动保存
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 差异反转方法
|
|
|
|
@ -258,6 +261,10 @@ export default class StateManager { |
|
|
|
} |
|
|
|
|
|
|
|
this.entityManager.endEntityUpdate() |
|
|
|
|
|
|
|
// 从实体管理器中获取最新数据
|
|
|
|
const updatedItems = this.entityManager.getAllEntities() |
|
|
|
this.vdata.items = Array.from(updatedItems.values()) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -369,15 +376,10 @@ export default class StateManager { |
|
|
|
|
|
|
|
// 同步到视口
|
|
|
|
this.fullSync() |
|
|
|
|
|
|
|
// 初始状态作为第一步
|
|
|
|
this.beginStateUpdate() |
|
|
|
this.endStateUpdate() |
|
|
|
|
|
|
|
this.isChanged.value = false |
|
|
|
this.pendingChanges = false |
|
|
|
|
|
|
|
// 强制保存一次初始状态
|
|
|
|
await this.saveToLocalstore() |
|
|
|
console.log('[StateManager] 加载完成,共', data.items.length, '个对象') |
|
|
|
|
|
|
|
} finally { |
|
|
|
@ -416,6 +418,11 @@ export default class StateManager { |
|
|
|
this.entityManager.createOrUpdateEntity(item) |
|
|
|
}) |
|
|
|
this.entityManager.endEntityUpdate() |
|
|
|
|
|
|
|
// 初始状态作为第一步
|
|
|
|
this.beginStateUpdate() |
|
|
|
this.endStateUpdate({ autoSave: false }) |
|
|
|
this.pendingChanges = false |
|
|
|
} |
|
|
|
|
|
|
|
undoEnabled() { |
|
|
|
@ -445,7 +452,7 @@ export default class StateManager { |
|
|
|
/** |
|
|
|
* 从本地存储还原数据 |
|
|
|
*/ |
|
|
|
async tryLoadFromLocalstore(): Promise<boolean> { |
|
|
|
async loadFromLocalstore(): Promise<boolean> { |
|
|
|
try { |
|
|
|
this.isLoading.value = true |
|
|
|
const saved: VData = await localforage.getItem(this.storeKey) |
|
|
|
@ -457,7 +464,6 @@ export default class StateManager { |
|
|
|
|
|
|
|
this.fullSync() // 同步到视口
|
|
|
|
console.log('[StateManager] 从本地存储恢复', this.vdata.items.length, '个对象') |
|
|
|
this.pendingChanges = false |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
@ -492,5 +498,38 @@ export default class StateManager { |
|
|
|
delete this.vdata |
|
|
|
delete this.historySteps |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 尝试从草稿中读取数据 |
|
|
|
*/ |
|
|
|
static async tryLoadCatalogFromLocalstore(): Promise<{ |
|
|
|
success: boolean, |
|
|
|
catalogCode?: string, |
|
|
|
catalog?: Catalog, |
|
|
|
stateManagerId?: string |
|
|
|
}> { |
|
|
|
// 获取 url 中的 stateManagerId
|
|
|
|
// 从 localforage 中读取草稿数据
|
|
|
|
const stateManagerId = getQueryParams()?.get('store') |
|
|
|
if (stateManagerId) { |
|
|
|
const storeKey = `-tmp-yvan-lcc-${stateManagerId}` |
|
|
|
const saved: VData = await localforage.getItem(storeKey) |
|
|
|
if (saved && saved.catalog) { |
|
|
|
const catalogCode = saved.catalogCode || '' |
|
|
|
if (catalogCode) { |
|
|
|
return { |
|
|
|
success: true, |
|
|
|
catalogCode, |
|
|
|
catalog: saved.catalog, |
|
|
|
stateManagerId |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return { |
|
|
|
success: false |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|