|
|
|
@ -1,4 +1,4 @@ |
|
|
|
import _ from 'lodash' |
|
|
|
import _, { cloneDeep } from 'lodash' |
|
|
|
import { reactive, watch } from 'vue' |
|
|
|
import EventBus from '@/runtime/EventBus' |
|
|
|
import Measure from '@/modules/measure' |
|
|
|
@ -6,42 +6,58 @@ import Way from '@/modules/way' |
|
|
|
import Gstore from '@/modules/gstore' |
|
|
|
import Rack from '@/modules/rack' |
|
|
|
import ShuttleRack from '@/modules/shuttle_rack' |
|
|
|
import Pallet from "@/modules/pallet" |
|
|
|
import Tote from "@/modules/tote" |
|
|
|
import Agv1 from "@/modules/agv1" |
|
|
|
import Carton from "@/modules/carton" |
|
|
|
import Ptr from "@/modules/ptr" |
|
|
|
import Clx from "@/modules/clx" |
|
|
|
import Charger from "@/modules/charger" |
|
|
|
import Pallet from '@/modules/pallet' |
|
|
|
import Tote from '@/modules/tote' |
|
|
|
import Agv1 from '@/modules/agv1' |
|
|
|
import Carton from '@/modules/carton' |
|
|
|
import Ptr from '@/modules/ptr' |
|
|
|
import Clx from '@/modules/clx' |
|
|
|
import Charger from '@/modules/charger' |
|
|
|
import StateManager from '@/core/manager/StateManager.ts' |
|
|
|
import { getQueryParams, setQueryParam } from '@/utils/webutils.ts' |
|
|
|
import localforage from 'localforage' |
|
|
|
|
|
|
|
export interface WorldModelState { |
|
|
|
isOpened: boolean // 是否已打开世界模型
|
|
|
|
catalog: Catalog // 世界模型目录数据
|
|
|
|
isDraft: boolean // 是否是草稿数据, 如果是草稿数据, 则不需要再从服务器加载数据
|
|
|
|
worldData: any // 世界模型数据, 包含排除 items 楼层数据之外的所有数据
|
|
|
|
|
|
|
|
infos: any // 当前楼层的其他数据
|
|
|
|
isChanged: boolean // 当前楼层数据是否被修改
|
|
|
|
catalog: Catalog // 当前世界模型目录数据
|
|
|
|
server: string // 当前楼层服务器地址
|
|
|
|
project_uuid: string // 当前楼层所在项目ID
|
|
|
|
catalogCode: string // 当前楼层的目录代码
|
|
|
|
|
|
|
|
stateManagerId: string // 当前楼层的状态管理器id
|
|
|
|
isDraft: boolean // 是否是草稿数据
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 物流世界模型 |
|
|
|
*/ |
|
|
|
export default class WorldModel { |
|
|
|
data: any = null |
|
|
|
currentStateManager: StateManager |
|
|
|
|
|
|
|
/** |
|
|
|
* 世界模型双向绑定的状态数据 |
|
|
|
*/ |
|
|
|
state: WorldModelState = reactive({ |
|
|
|
isOpened: false, // 是否已打开世界模型
|
|
|
|
worldData: null, // 世界模型数据, 包含排除 items 楼层数据之外的所有数据
|
|
|
|
|
|
|
|
infos: {} as any, // 楼层的其他数据
|
|
|
|
isChanged: false, |
|
|
|
catalog: [] as Catalog, // 世界模型目录
|
|
|
|
server: '', |
|
|
|
project_uuid: '', // 项目ID
|
|
|
|
catalogCode: '', // 当前楼层的目录代码
|
|
|
|
isDraft: false, // 是否是草稿数据, 如果是草稿数据, 则不需要再从服务器加载数据
|
|
|
|
|
|
|
|
stateManagerId: '', // 当前楼层的状态管理器id, 一般是 项目ID+目录项ID
|
|
|
|
catalog: [] as Catalog // 世界模型目录
|
|
|
|
isDraft: false // 是否是草稿数据, 如果是草稿数据, 则不需要再从服务器加载数据
|
|
|
|
}) |
|
|
|
|
|
|
|
get gridOption(): IGridHelper { |
|
|
|
const data = _.get(this.data, 'Tool.gridHelper') |
|
|
|
const data = _.get(this.state.worldData, 'Tool.gridHelper') |
|
|
|
return _.defaultsDeep(data, { |
|
|
|
axesEnabled: true, |
|
|
|
axesSize: 5, |
|
|
|
@ -68,8 +84,6 @@ export default class WorldModel { |
|
|
|
*/ |
|
|
|
init() { |
|
|
|
// 观察 this.state.catalogCode 的变化, 如果变化就调用 catalogCodeChange 方法
|
|
|
|
watch(() => this.state.catalogCode, this.onCatalogCodeChanged.bind(this)) |
|
|
|
|
|
|
|
return Promise.all([ |
|
|
|
Measure, |
|
|
|
Way, |
|
|
|
@ -88,84 +102,111 @@ export default class WorldModel { |
|
|
|
console.log('世界模型初始化完成') |
|
|
|
|
|
|
|
// 尝试从草稿中加载数据
|
|
|
|
StateManager.tryLoadCatalogFromLocalstore().then(data => { |
|
|
|
if (data.success) { |
|
|
|
this.state.catalog = data.catalog |
|
|
|
const stateManagerId = getQueryParams()?.get('store') |
|
|
|
|
|
|
|
StateManager.tryLoadCatalogFromLocalstore(stateManagerId).then(data => { |
|
|
|
if (data) { |
|
|
|
this.state.isOpened = true |
|
|
|
this.state.catalogCode = data.catalogCode |
|
|
|
this.state.stateManagerId = data.stateManagerId |
|
|
|
this.state.worldData = data.worldData |
|
|
|
|
|
|
|
this.state.infos = data.infos |
|
|
|
this.state.isChanged = data.isChanged |
|
|
|
this.state.catalog = data.catalog |
|
|
|
this.state.server = data.server |
|
|
|
this.state.project_uuid = data.project_uuid |
|
|
|
this.state.isDraft = true |
|
|
|
|
|
|
|
this.tryOpenCatelog(data.catalogCode, true).then(() => { |
|
|
|
this.state.catalogCode = data.catalogCode |
|
|
|
this.state.stateManagerId = data.project_uuid + '_' + data.catalogCode |
|
|
|
}) |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 读取世界地图数据目录 |
|
|
|
*/ |
|
|
|
loadCatalog(data: any) { |
|
|
|
this.data = data |
|
|
|
this.state.catalog = data.catalog |
|
|
|
this.state.isOpened = true |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 当楼层发生改变时调用此方法, 将事件派发出去 |
|
|
|
*/ |
|
|
|
onCatalogCodeChanged(catalogCode: string) { |
|
|
|
if (this.state.isDraft) { |
|
|
|
// 草稿数据, 不需要再从服务器加载数据, 放行
|
|
|
|
EventBus.dispatch('catalogChanged', { |
|
|
|
catalogCode: this.state.catalogCode, |
|
|
|
stateManagerId: this.state.stateManagerId |
|
|
|
}) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async tryOpenCatelog(catalogCode: string, isDraft: boolean = false) { |
|
|
|
if (!catalogCode) { |
|
|
|
this.state.stateManagerId = '' |
|
|
|
EventBus.dispatch('catalogChanged', { |
|
|
|
catalogCode: this.state.catalogCode, |
|
|
|
stateManagerId: this.state.stateManagerId |
|
|
|
}) |
|
|
|
// 没有地图
|
|
|
|
this.clear() |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
const floor = _.find(this.data.items, r => r.catalogCode === catalogCode && r.t === 'floor') |
|
|
|
if (!floor) { |
|
|
|
system.msg('楼层不存在: ' + catalogCode) |
|
|
|
if (!this.state.project_uuid) { |
|
|
|
system.showErrorDialog('项目未初始化, 请先打开一个项目!') |
|
|
|
this.state.catalogCode = '' |
|
|
|
this.state.stateManagerId = null |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
this.state.stateManagerId = this.data.project_uuid + '_' + catalogCode |
|
|
|
EventBus.dispatch('catalogChanged', { |
|
|
|
catalogCode: this.state.catalogCode, |
|
|
|
stateManagerId: this.state.stateManagerId |
|
|
|
}) |
|
|
|
this.state.catalogCode = catalogCode |
|
|
|
this.state.isDraft = isDraft |
|
|
|
this.state.stateManagerId = this.state.project_uuid + '_' + catalogCode |
|
|
|
const stateManager = new StateManager(this.state.stateManagerId) |
|
|
|
|
|
|
|
if (isDraft) { |
|
|
|
// 从草稿捞数据
|
|
|
|
await stateManager.loadFromLocalstore() |
|
|
|
} else { |
|
|
|
// 从服务器捞数据
|
|
|
|
const vdata = await worldModel.getCatalogData(catalogCode) |
|
|
|
await stateManager.load(vdata) |
|
|
|
} |
|
|
|
this.currentStateManager = stateManager |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 从远程服务器读取世界地图数据目录 |
|
|
|
*/ |
|
|
|
async loadWorldFromRemoting(veryBigData) { |
|
|
|
const worldData = veryBigData |
|
|
|
const catalog = veryBigData.catalog |
|
|
|
const items = veryBigData.items |
|
|
|
delete veryBigData.catalog |
|
|
|
delete veryBigData.items |
|
|
|
|
|
|
|
this.state.isOpened = true |
|
|
|
this.state.worldData = worldData |
|
|
|
|
|
|
|
// 没有打开楼层,不加载 this.state.infos
|
|
|
|
// 没有打开楼层,不加载 this.state.isChanged
|
|
|
|
this.state.catalog = catalog |
|
|
|
this.state.server = veryBigData.server |
|
|
|
this.state.project_uuid = veryBigData.project_uuid |
|
|
|
|
|
|
|
// 没有打开楼层,不加载 this.state.catalogCode
|
|
|
|
this.state.isDraft = false |
|
|
|
|
|
|
|
await localforage.setItem('_____veryBigItemsData', items) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 从服务器获取当前目录楼层的所有数据 |
|
|
|
*/ |
|
|
|
async getCatalogData(catalogCode: string): Promise<Partial<VData>> { |
|
|
|
if (!this.data || !this.data.items) { |
|
|
|
async getCatalogData(catalogCode: string): Promise<VData> { |
|
|
|
const _____veryBigItemsData: any = await localforage.getItem('_____veryBigItemsData') |
|
|
|
if (!_____veryBigItemsData) { |
|
|
|
return Promise.reject('楼层数据未加载, catalogCode=' + catalogCode) |
|
|
|
} |
|
|
|
|
|
|
|
const floor = _.find(this.data.items, r => r.catalogCode === this.state.catalogCode && r.t === 'floor') |
|
|
|
const floor = _.find(_____veryBigItemsData, r => r.catalogCode === this.state.catalogCode && r.t === 'floor') |
|
|
|
if (floor) { |
|
|
|
if (!floor.items) { |
|
|
|
floor.items = [] |
|
|
|
} |
|
|
|
|
|
|
|
const vdata: Partial<VData> = { |
|
|
|
items: _.cloneDeep(floor.items) as ItemJson[], |
|
|
|
const items = _.cloneDeep(floor.items) |
|
|
|
delete floor.items |
|
|
|
|
|
|
|
const vdata: VData = { |
|
|
|
items: items as ItemJson[], |
|
|
|
infos: floor, |
|
|
|
isChanged: false, |
|
|
|
server: '', |
|
|
|
projectId: '', |
|
|
|
catalogCode: catalogCode |
|
|
|
catalog: _.cloneDeep(this.state.catalog), |
|
|
|
server: this.state.server, |
|
|
|
project_uuid: this.state.project_uuid, |
|
|
|
catalogCode: catalogCode, |
|
|
|
worldData: _.cloneDeep(this.state.worldData) |
|
|
|
} |
|
|
|
|
|
|
|
console.log('从服务器返回数据, 一共' + vdata.items.length + '个') |
|
|
|
@ -173,4 +214,14 @@ export default class WorldModel { |
|
|
|
} |
|
|
|
return Promise.reject('楼层不存在, catalogCode=' + catalogCode) |
|
|
|
} |
|
|
|
|
|
|
|
clear() { |
|
|
|
this.currentStateManager = null |
|
|
|
this.state.catalogCode = '' |
|
|
|
this.state.stateManagerId = null |
|
|
|
setQueryParam('store', '') |
|
|
|
EventBus.dispatch('dataLoadComplete', { |
|
|
|
stateManager: null |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|