import _ from 'lodash' import { worldModel } from '@/core/manager/WorldModel.ts' import { Request } from '@ease-forge/shared' /** * LCC 物流控制中心客户端 API 实现 */ export default class LCCScript implements LCC { log(from: string, message: string, ...args: any[]): void { // 插入时分秒 HH:mm:ss.sss const now = new Date().toISOString().replace('T', ' ').replace('Z', '').split(' ')[1] // 打成彩色 // console.log(now + ' [LCC-' + from + '] ' + message, ...args) console.log(`%c${now} [${from}] ${message}`, 'color: #00f', ...args) } /** * 延时函数 - 使用普通函数确保正确绑定 */ async sleep(timeOfMs: number = 1000): Promise { return new Promise((resolve) => { setTimeout(() => { resolve() // 确保调用 resolve }, timeOfMs) }) } async getAllProjects(): Promise> { return Request.request.post('/api/workbench/LccController@getAllProjects', {}) } async serverStart(): Promise> { if (!worldModel.state.project_uuid || !worldModel.state.runState.currentEnvId) { return Promise.reject(new Error('Project UUID or Environment ID is not set.')) } return Request.request.post('/api/workbench/LccController@serverStart', { projectUUID: worldModel.state.project_uuid, envId: worldModel.state.runState.currentEnvId }) } async serverStop(): Promise> { if (!worldModel.state.project_uuid || !worldModel.state.runState.currentEnvId) { return Promise.reject(new Error('Project UUID or Environment ID is not set.')) } return Request.request.post('/api/workbench/LccController@serverStop', { projectUUID: worldModel.state.project_uuid, envId: worldModel.state.runState.currentEnvId }) } // 从后台读取所有库存 async loadInv(): Promise> { const res = await Request.request.post('/api/workbench/LccController@loadInv', { projectUuid: worldModel.state.project_uuid, catalogCode: worldModel.state.catalogCode, envId: worldModel.state.runState.currentEnvId }) for (const row of res.data) { const bay = row.bay const cell = row.cell // : 0 const level = row.level // : 0 const loc_code = row.loc_code // : "rack1_0_0_0" const lpn = row.lpn // : "LPN1" const rack = row.rack // : "rack1" const container_type = row.container_type // : "pallet" if (window['Model']) { Model.createInv(container_type, lpn, rack, bay, level, cell) } } return res.data } saveAndSyncScripts(scriptList: { name: string; content: string }[]): Promise> { if (!worldModel.state.project_uuid || !worldModel.state.runState.currentEnvId) { return Promise.reject(new Error('Project UUID or Environment ID is not set.')) } return Request.request.post('/api/workbench/LccController@saveAndSyncScripts', { projectUUID: worldModel.state.project_uuid, envId: worldModel.state.runState.currentEnvId, scriptList: scriptList }) } queryDeviceInfoList(): Promise> { return Request.request.post('/api/workbench/LccController@queryDeviceInfoList', { projectUUID: worldModel.state.project_uuid, envId: worldModel.state.runState.currentEnvId }) } // 从后台读取所有车 async loadExecutor(): Promise { const res = await Request.request.post('/api/workbench/LccController@loadExecutor', { projectUuid: worldModel.state.project_uuid, envId: worldModel.state.runState.currentEnvId }) for (const row of res.data) { const executor_id = row.executor_id const payload = JSON.parse(row.virtual_executor_payload) // 车所在的标记位置,及方向 11_4:RIGHT const [wayPointId, direction] = _.split(row.virtual_location_at, ':') if (window['Model']) { const point = Model.find(wayPointId) if (!point) { console.error(`Waypoint with ID ${wayPointId} not found for executor ${executor_id}.`) continue } const item = _.cloneDeep(payload) item.id = executor_id item.tf[0] = _.cloneDeep(point.tf[0]) switch (_.toLower(direction)) { // right=0/left=180/up=90/down=-90 case 'right': item.tf[1][1] = 0 // 右侧 break case 'left': item.tf[1][1] = 180 // 左侧 break case 'down': item.tf[1][1] = -90 // 下方 break case 'up': item.tf[1][1] = 90 // 上方 break } if (row.virtual_floor_code === worldModel.state.catalogCode) { Model.createExecutor(item) } } } return res.data } subscribe(topicType: BackendTopicType, eventHandler: BackendMessageHandler) { return worldModel.backendMessageReceiver.subscribe(topicType, eventHandler) } unsubscribe(topicType: BackendTopicType, eventHandler: BackendMessageHandler) { worldModel.backendMessageReceiver.unsubscribe(topicType, eventHandler) } }