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> { 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 = { 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) } }