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.
 
 
 

174 lines
5.0 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 ShuttleRack from '@/modules/shuttle_rack'
import Pallet from "@/modules/pallet"
import Tote from "@/modules/tote"
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'
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,
ShuttleRack,
Pallet,
Tote,
Carton,
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)
}
}