116 lines
3.0 KiB
JavaScript
116 lines
3.0 KiB
JavaScript
import http from 'node:http'
|
|
|
|
const host = '127.0.0.1'
|
|
const port = Number(process.env.TCS_MOCK_PORT || 18080)
|
|
const tasks = new Map()
|
|
|
|
const sendJson = (response, payload, statusCode = 200) => {
|
|
response.writeHead(statusCode, { 'Content-Type': 'application/json; charset=utf-8' })
|
|
response.end(JSON.stringify(payload))
|
|
}
|
|
|
|
const success = result => ({
|
|
success: true,
|
|
message: '仿真接口调用成功',
|
|
code: 200,
|
|
result,
|
|
timestamp: Date.now()
|
|
})
|
|
|
|
const readBody = request => new Promise((resolve, reject) => {
|
|
let body = ''
|
|
request.setEncoding('utf8')
|
|
request.on('data', chunk => { body += chunk })
|
|
request.on('end', () => {
|
|
if (!body) {
|
|
resolve({})
|
|
return
|
|
}
|
|
try {
|
|
resolve(JSON.parse(body))
|
|
} catch (error) {
|
|
reject(error)
|
|
}
|
|
})
|
|
request.on('error', reject)
|
|
})
|
|
|
|
const server = http.createServer(async (request, response) => {
|
|
const url = new URL(request.url, `http://${host}:${port}`)
|
|
try {
|
|
if (request.method === 'POST' && url.pathname === '/api/createExternalBusinessTask') {
|
|
const body = await readBody(request)
|
|
tasks.set(body.externalCode, body)
|
|
console.log('CREATE', JSON.stringify(body))
|
|
sendJson(response, success({ externalCode: body.externalCode }))
|
|
return
|
|
}
|
|
|
|
if (request.method === 'GET' && url.pathname === '/api/getExternalBusinessTaskStatus') {
|
|
const externalCode = url.searchParams.get('externalCode') || ''
|
|
sendJson(response, success([{
|
|
externalCode,
|
|
status: '1',
|
|
ip: '10.146.79.9',
|
|
type: tasks.get(externalCode)?.type || 'nav_action_program',
|
|
beginTime: '2026-07-13 14:40:00',
|
|
endTime: '',
|
|
remark: '仿真状态同步'
|
|
}]))
|
|
return
|
|
}
|
|
|
|
if (request.method === 'GET' && url.pathname === '/api/getMcrInfo') {
|
|
sendJson(response, success([{
|
|
name: 'AGV-01',
|
|
ip: '10.146.79.9',
|
|
speed: 0,
|
|
power: 80,
|
|
autoCharging: '1',
|
|
chargingThreshold: 20,
|
|
status: '0',
|
|
currentPos: 'S000214',
|
|
control: '1',
|
|
CameraInfo: ''
|
|
}]))
|
|
return
|
|
}
|
|
|
|
const successfulGetRoutes = new Set([
|
|
'/api/cancelExternalBusinessTask',
|
|
'/api/stopExternalBusinessTask',
|
|
'/api/reset',
|
|
'/api/stopNow'
|
|
])
|
|
if (request.method === 'GET' && successfulGetRoutes.has(url.pathname)) {
|
|
console.log('GET', url.pathname, url.search)
|
|
sendJson(response, success('成功'))
|
|
return
|
|
}
|
|
|
|
sendJson(response, {
|
|
success: false,
|
|
message: `未实现的仿真路由:${request.method} ${url.pathname}`,
|
|
code: 500,
|
|
result: null,
|
|
timestamp: Date.now()
|
|
}, 404)
|
|
} catch (error) {
|
|
sendJson(response, {
|
|
success: false,
|
|
message: error.message,
|
|
code: 500,
|
|
result: null,
|
|
timestamp: Date.now()
|
|
}, 500)
|
|
}
|
|
})
|
|
|
|
server.listen(port, host, () => {
|
|
console.log(`TCS AGV mock listening on http://${host}:${port}`)
|
|
})
|
|
|
|
const close = () => server.close(() => process.exit(0))
|
|
process.on('SIGINT', close)
|
|
process.on('SIGTERM', close)
|