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