You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.8 KiB
168 lines
4.8 KiB
import _ from 'lodash'
|
|
import { reactive, watch } from 'vue'
|
|
import EventBus from '@/runtime/EventBus'
|
|
import Measure from '@/modules/measure'
|
|
import Way from '@/modules/way'
|
|
import Gstore from '@/modules/gstore'
|
|
import Rack from '@/modules/rack'
|
|
import Pallet from "@/modules/pallet"
|
|
import Ptr from "@/modules/ptr"
|
|
import Clx from "@/modules/clx"
|
|
import Charger from "@/modules/charger"
|
|
import StateManager from '@/core/manager/StateManager.ts'
|
|
|
|
export interface WorldModelState {
|
|
isOpened: boolean // 是否已打开世界模型
|
|
catalog: Catalog // 世界模型目录数据
|
|
isDraft: boolean // 是否是草稿数据, 如果是草稿数据, 则不需要再从服务器加载数据
|
|
catalogCode: string // 当前楼层的目录代码
|
|
stateManagerId: string // 当前楼层的状态管理器id
|
|
}
|
|
|
|
/**
|
|
* 物流世界模型
|
|
*/
|
|
export default class WorldModel {
|
|
data: any = null
|
|
|
|
/**
|
|
* 世界模型双向绑定的状态数据
|
|
*/
|
|
state: WorldModelState = reactive({
|
|
isOpened: false, // 是否已打开世界模型
|
|
catalogCode: '', // 当前楼层的目录代码
|
|
isDraft: false, // 是否是草稿数据, 如果是草稿数据, 则不需要再从服务器加载数据
|
|
stateManagerId: '', // 当前楼层的状态管理器id, 一般是 项目ID+目录项ID
|
|
catalog: [] as Catalog // 世界模型目录
|
|
})
|
|
|
|
get gridOption(): IGridHelper {
|
|
const data = _.get(this.data, 'Tool.gridHelper')
|
|
return _.defaultsDeep(data, {
|
|
axesEnabled: true,
|
|
axesSize: 5,
|
|
axesColor: 0xDDDDDD,
|
|
axesWidth: 2,
|
|
|
|
gridEnabled: true, // 启用网格
|
|
gridSize: 1000, // 网格大小, 单位米
|
|
gridDivisions: 1000, // 网格分割数
|
|
gridColor: 0xDDDDDD, // 网格颜色, 十六进制颜色值
|
|
gridOpacity: 0.8, // 网格透明度
|
|
|
|
backgroundColor: 0xF5F5F5, // 背景颜色, 十六进制颜色值
|
|
snapEnabled: true, // 启用吸附
|
|
snapDistance: 0.25 // 吸附距离, 单位米
|
|
})
|
|
}
|
|
|
|
constructor() {
|
|
}
|
|
|
|
/**
|
|
* 初始化世界模型
|
|
*/
|
|
init() {
|
|
// 观察 this.state.catalogCode 的变化, 如果变化就调用 catalogCodeChange 方法
|
|
watch(() => this.state.catalogCode, this.onCatalogCodeChanged.bind(this))
|
|
|
|
return Promise.all([
|
|
Measure,
|
|
Way,
|
|
Gstore,
|
|
Rack,
|
|
Pallet,
|
|
Ptr,
|
|
Clx,
|
|
Charger
|
|
|
|
]).then(() => {
|
|
console.log('世界模型初始化完成')
|
|
|
|
// 尝试从草稿中加载数据
|
|
StateManager.tryLoadCatalogFromLocalstore().then(data => {
|
|
if (data.success) {
|
|
this.state.catalog = data.catalog
|
|
this.state.isOpened = true
|
|
this.state.catalogCode = data.catalogCode
|
|
this.state.stateManagerId = data.stateManagerId
|
|
this.state.isDraft = true
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 读取世界地图数据目录
|
|
*/
|
|
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
|
|
}
|
|
|
|
|
|
if (!catalogCode) {
|
|
this.state.stateManagerId = ''
|
|
EventBus.dispatch('catalogChanged', {
|
|
catalogCode: this.state.catalogCode,
|
|
stateManagerId: this.state.stateManagerId
|
|
})
|
|
return
|
|
}
|
|
|
|
const floor = _.find(this.data.items, r => r.catalogCode === catalogCode && r.t === 'floor')
|
|
if (!floor) {
|
|
system.msg('楼层不存在: ' + catalogCode)
|
|
this.state.catalogCode = ''
|
|
return
|
|
}
|
|
|
|
this.state.stateManagerId = this.data.project_uuid + '_' + catalogCode
|
|
EventBus.dispatch('catalogChanged', {
|
|
catalogCode: this.state.catalogCode,
|
|
stateManagerId: this.state.stateManagerId
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 从服务器获取当前目录楼层的所有数据
|
|
*/
|
|
async getCatalogData(catalogCode: string): Promise<Partial<VData>> {
|
|
if (!this.data || !this.data.items) {
|
|
return Promise.reject('楼层数据未加载, catalogCode=' + catalogCode)
|
|
}
|
|
|
|
const floor = _.find(this.data.items, 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[],
|
|
isChanged: false,
|
|
server: '',
|
|
projectId: '',
|
|
catalogCode: catalogCode
|
|
}
|
|
|
|
console.log('从服务器返回数据, 一共' + vdata.items.length + '个')
|
|
return Promise.resolve(vdata)
|
|
}
|
|
return Promise.reject('楼层不存在, catalogCode=' + catalogCode)
|
|
}
|
|
}
|
|
|