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.
 
 
 

150 lines
5.1 KiB

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<void> {
return new Promise((resolve) => {
setTimeout(() => {
resolve() // 确保调用 resolve
}, timeOfMs)
})
}
async getAllProjects(): Promise<ServerResponse<LccProjectVo[]>> {
return Request.request.post('/api/workbench/LccController@getAllProjects', {})
}
async serverStart(): Promise<ServerResponse<boolean>> {
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<ServerResponse<boolean>> {
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<ServerResponse<InvVo>> {
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<ServerResponse<{ name: string; content: string }[]>> {
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<ServerResponse<DeviceVo[]>> {
return Request.request.post('/api/workbench/LccController@queryDeviceInfoList', {
projectUUID: worldModel.state.project_uuid,
envId: worldModel.state.runState.currentEnvId
})
}
// 从后台读取所有车
async loadExecutor(): Promise<ExecutorVo> {
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)
}
}