|
@@ -1,10 +1,11 @@
|
|
|
/**
|
|
/**
|
|
|
* API 封装层 - 迎宾机器人屏幕端
|
|
* API 封装层 - 迎宾机器人屏幕端
|
|
|
*
|
|
*
|
|
|
- * 所有接口统一在此文件封装,一期使用 Mock 数据返回 Promise
|
|
|
|
|
- * 后续替换为真实接口时,只需修改本文件中对应的方法实现
|
|
|
|
|
|
|
+ * 所有接口统一在此文件封装
|
|
|
|
|
+ * 使用真实的后端接口,失败时降级到 Mock 数据
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
|
|
+import { http } from '@/utils/request'
|
|
|
import {
|
|
import {
|
|
|
mockRobotStatus,
|
|
mockRobotStatus,
|
|
|
mockScreenConfig,
|
|
mockScreenConfig,
|
|
@@ -23,12 +24,6 @@ import {
|
|
|
mockScreenTheme
|
|
mockScreenTheme
|
|
|
} from '@/mock/screen'
|
|
} from '@/mock/screen'
|
|
|
|
|
|
|
|
-// API 基础地址(后续替换为真实后端地址)
|
|
|
|
|
-const BASE_URL = '/api'
|
|
|
|
|
-
|
|
|
|
|
-// 模拟网络延迟
|
|
|
|
|
-const delay = (ms = 300) => new Promise(resolve => setTimeout(resolve, ms))
|
|
|
|
|
-
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
|
// 屏幕配置与状态
|
|
// 屏幕配置与状态
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -37,56 +32,84 @@ const delay = (ms = 300) => new Promise(resolve => setTimeout(resolve, ms))
|
|
|
* 获取屏幕配置
|
|
* 获取屏幕配置
|
|
|
*/
|
|
*/
|
|
|
export async function getScreenConfig() {
|
|
export async function getScreenConfig() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockScreenConfig }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/screen/config')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getScreenConfig')
|
|
|
|
|
+ return { ...mockScreenConfig }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取机器人状态
|
|
* 获取机器人状态
|
|
|
*/
|
|
*/
|
|
|
export async function getRobotStatus() {
|
|
export async function getRobotStatus() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockRobotStatus }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/robot/status')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getRobotStatus')
|
|
|
|
|
+ return { ...mockRobotStatus }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取播放方案
|
|
* 获取播放方案
|
|
|
*/
|
|
*/
|
|
|
export async function getPlayPlan() {
|
|
export async function getPlayPlan() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockPlayPlan }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/screen/play-plan/current')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getPlayPlan')
|
|
|
|
|
+ return { ...mockPlayPlan }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取欢迎页兜底内容
|
|
* 获取欢迎页兜底内容
|
|
|
*/
|
|
*/
|
|
|
export async function getWelcomeContent() {
|
|
export async function getWelcomeContent() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockWelcomeContent }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/screen/welcome-content')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getWelcomeContent')
|
|
|
|
|
+ return { ...mockWelcomeContent }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取屏幕主题配置
|
|
* 获取屏幕主题配置
|
|
|
*/
|
|
*/
|
|
|
export async function getScreenTheme() {
|
|
export async function getScreenTheme() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockScreenTheme }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/screen/theme')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getScreenTheme')
|
|
|
|
|
+ return { ...mockScreenTheme }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取播报状态
|
|
* 获取播报状态
|
|
|
*/
|
|
*/
|
|
|
export async function getBroadcastState() {
|
|
export async function getBroadcastState() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockBroadcastState }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/broadcast/state')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getBroadcastState')
|
|
|
|
|
+ return { ...mockBroadcastState }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取播报内容
|
|
* 获取播报内容
|
|
|
*/
|
|
*/
|
|
|
export async function getBroadcastContent() {
|
|
export async function getBroadcastContent() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockBroadcastContent }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/broadcast/content')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getBroadcastContent')
|
|
|
|
|
+ return { ...mockBroadcastContent }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -97,20 +120,27 @@ export async function getBroadcastContent() {
|
|
|
* 获取最新指令
|
|
* 获取最新指令
|
|
|
*/
|
|
*/
|
|
|
export async function getLatestCommand() {
|
|
export async function getLatestCommand() {
|
|
|
- await delay(100)
|
|
|
|
|
- // 模拟随机返回指令
|
|
|
|
|
- if (Math.random() > 0.9) {
|
|
|
|
|
- return mockCommands[Math.floor(Math.random() * mockCommands.length)]
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/commands/latest')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getLatestCommand')
|
|
|
|
|
+ if (Math.random() > 0.9) {
|
|
|
|
|
+ return mockCommands[Math.floor(Math.random() * mockCommands.length)]
|
|
|
|
|
+ }
|
|
|
|
|
+ return null
|
|
|
}
|
|
}
|
|
|
- return null
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 指令回执
|
|
* 指令回执
|
|
|
*/
|
|
*/
|
|
|
export async function ackCommand(commandId) {
|
|
export async function ackCommand(commandId) {
|
|
|
- await delay()
|
|
|
|
|
- return { success: true, commandId }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post(`/robot-ops/commands/${commandId}/ack`)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:ackCommand')
|
|
|
|
|
+ return { success: true, commandId }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -121,38 +151,44 @@ export async function ackCommand(commandId) {
|
|
|
* 读取身份证
|
|
* 读取身份证
|
|
|
*/
|
|
*/
|
|
|
export async function readIdCard() {
|
|
export async function readIdCard() {
|
|
|
- await delay(1000)
|
|
|
|
|
- return { ...mockIdCardResult }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post('/robot-ops/id-card/read')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:readIdCard')
|
|
|
|
|
+ return { ...mockIdCardResult }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 预约查询
|
|
* 预约查询
|
|
|
*/
|
|
*/
|
|
|
export async function queryAppointment(params) {
|
|
export async function queryAppointment(params) {
|
|
|
- await delay(800)
|
|
|
|
|
- const { mobile, idCardNo } = params
|
|
|
|
|
- // 根据手机号或身份证号查询
|
|
|
|
|
- const appointment = mockAppointments.find(
|
|
|
|
|
- a => a.mobile === mobile || a.idCardNo === idCardNo
|
|
|
|
|
- )
|
|
|
|
|
- if (appointment) {
|
|
|
|
|
- return appointment
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/appointments/query', {
|
|
|
|
|
+ data: params
|
|
|
|
|
+ })
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:queryAppointment')
|
|
|
|
|
+ const { mobile, idCardNo } = params
|
|
|
|
|
+ const appointment = mockAppointments.find(
|
|
|
|
|
+ a => a.mobile === mobile || a.idCardNo === idCardNo
|
|
|
|
|
+ )
|
|
|
|
|
+ if (appointment) {
|
|
|
|
|
+ return appointment
|
|
|
|
|
+ }
|
|
|
|
|
+ throw new Error('未查询到预约记录')
|
|
|
}
|
|
}
|
|
|
- throw new Error('未查询到预约记录')
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 提交访客登记
|
|
* 提交访客登记
|
|
|
*/
|
|
*/
|
|
|
export async function submitVisitorRegistration(data) {
|
|
export async function submitVisitorRegistration(data) {
|
|
|
- await delay(1000)
|
|
|
|
|
- // 模拟成功返回
|
|
|
|
|
- return {
|
|
|
|
|
- success: true,
|
|
|
|
|
- visitorId: 'V' + Date.now(),
|
|
|
|
|
- registrationNo: 'REG' + Date.now(),
|
|
|
|
|
- visitorName: data.visitorName,
|
|
|
|
|
- registrationTime: new Date().toISOString()
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post('/robot-ops/visitors/register', data)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('提交访客登记失败:', error)
|
|
|
|
|
+ throw error
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -160,8 +196,12 @@ export async function submitVisitorRegistration(data) {
|
|
|
* 获取最新识别结果
|
|
* 获取最新识别结果
|
|
|
*/
|
|
*/
|
|
|
export async function getRecognitionResult() {
|
|
export async function getRecognitionResult() {
|
|
|
- await delay(500)
|
|
|
|
|
- return { ...mockRecognitionResult }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/face/result/latest')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getRecognitionResult')
|
|
|
|
|
+ return { ...mockRecognitionResult }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -172,19 +212,23 @@ export async function getRecognitionResult() {
|
|
|
* 获取目的地列表
|
|
* 获取目的地列表
|
|
|
*/
|
|
*/
|
|
|
export async function getDestinations() {
|
|
export async function getDestinations() {
|
|
|
- await delay()
|
|
|
|
|
- return [...mockDestinations]
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/destinations')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getDestinations')
|
|
|
|
|
+ return [...mockDestinations]
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 开始导航
|
|
* 开始导航
|
|
|
*/
|
|
*/
|
|
|
export async function startNavigation(params) {
|
|
export async function startNavigation(params) {
|
|
|
- await delay(500)
|
|
|
|
|
- return {
|
|
|
|
|
- taskId: 'nav_' + Date.now(),
|
|
|
|
|
- destinationId: params.destinationId,
|
|
|
|
|
- status: 'starting'
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post('/robot-ops/navigation/start', params)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('开始导航失败:', error)
|
|
|
|
|
+ throw error
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -192,16 +236,24 @@ export async function startNavigation(params) {
|
|
|
* 获取导航状态
|
|
* 获取导航状态
|
|
|
*/
|
|
*/
|
|
|
export async function getNavigationStatus(params) {
|
|
export async function getNavigationStatus(params) {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockNavigationStatus, taskId: params.taskId }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get(`/robot-ops/navigation/${params.taskId}/status`)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getNavigationStatus')
|
|
|
|
|
+ return { ...mockNavigationStatus, taskId: params.taskId }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 取消导航
|
|
* 取消导航
|
|
|
*/
|
|
*/
|
|
|
export async function cancelNavigation(params) {
|
|
export async function cancelNavigation(params) {
|
|
|
- await delay(300)
|
|
|
|
|
- return { success: true, taskId: params.taskId }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post(`/robot-ops/navigation/${params.taskId}/cancel`)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('取消导航失败:', error)
|
|
|
|
|
+ throw error
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -212,20 +264,28 @@ export async function cancelNavigation(params) {
|
|
|
* 获取通知公告列表
|
|
* 获取通知公告列表
|
|
|
*/
|
|
*/
|
|
|
export async function getNotices() {
|
|
export async function getNotices() {
|
|
|
- await delay()
|
|
|
|
|
- return [...mockNotices]
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/notices')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getNotices')
|
|
|
|
|
+ return [...mockNotices]
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取通知详情
|
|
* 获取通知详情
|
|
|
*/
|
|
*/
|
|
|
export async function getNoticeDetail(id) {
|
|
export async function getNoticeDetail(id) {
|
|
|
- await delay()
|
|
|
|
|
- const notice = mockNotices.find(n => n.id === id)
|
|
|
|
|
- if (notice) {
|
|
|
|
|
- return { ...notice }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get(`/robot-ops/notices/${id}`)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getNoticeDetail')
|
|
|
|
|
+ const notice = mockNotices.find(n => n.id === id)
|
|
|
|
|
+ if (notice) {
|
|
|
|
|
+ return { ...notice }
|
|
|
|
|
+ }
|
|
|
|
|
+ throw new Error('公告不存在')
|
|
|
}
|
|
}
|
|
|
- throw new Error('公告不存在')
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -236,11 +296,11 @@ export async function getNoticeDetail(id) {
|
|
|
* 呼叫工作人员
|
|
* 呼叫工作人员
|
|
|
*/
|
|
*/
|
|
|
export async function callStaff(params) {
|
|
export async function callStaff(params) {
|
|
|
- await delay(1000)
|
|
|
|
|
- return {
|
|
|
|
|
- success: true,
|
|
|
|
|
- callId: 'CALL' + Date.now(),
|
|
|
|
|
- message: '已通知工作人员,请稍候'
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post('/robot-ops/staff/call', params)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('呼叫工作人员失败:', error)
|
|
|
|
|
+ throw error
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -252,8 +312,12 @@ export async function callStaff(params) {
|
|
|
* 获取系统信息
|
|
* 获取系统信息
|
|
|
*/
|
|
*/
|
|
|
export async function getSystemInfo() {
|
|
export async function getSystemInfo() {
|
|
|
- await delay()
|
|
|
|
|
- return { ...mockSystemInfo }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/system/info')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getSystemInfo')
|
|
|
|
|
+ return { ...mockSystemInfo }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -264,11 +328,15 @@ export async function getSystemInfo() {
|
|
|
* 获取摄像头预览地址
|
|
* 获取摄像头预览地址
|
|
|
*/
|
|
*/
|
|
|
export async function getCameraPreviewUrl() {
|
|
export async function getCameraPreviewUrl() {
|
|
|
- await delay()
|
|
|
|
|
- return {
|
|
|
|
|
- streamUrl: 'rtsp://localhost:8554/camera',
|
|
|
|
|
- streamType: 'rtsp',
|
|
|
|
|
- expireTime: Date.now() + 300000
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.get('/robot-ops/camera/preview-url')
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.warn('使用 Mock 数据:getCameraPreviewUrl')
|
|
|
|
|
+ return {
|
|
|
|
|
+ streamUrl: 'rtsp://localhost:8554/camera',
|
|
|
|
|
+ streamType: 'rtsp',
|
|
|
|
|
+ expireTime: Date.now() + 300000
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -280,8 +348,12 @@ export async function getCameraPreviewUrl() {
|
|
|
* 音量控制
|
|
* 音量控制
|
|
|
*/
|
|
*/
|
|
|
export async function setAudioControl(params) {
|
|
export async function setAudioControl(params) {
|
|
|
- await delay()
|
|
|
|
|
- return { success: true, ...params }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post('/robot-ops/audio/control', params)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('音量控制失败:', error)
|
|
|
|
|
+ throw error
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ============================================
|
|
// ============================================
|
|
@@ -292,9 +364,12 @@ export async function setAudioControl(params) {
|
|
|
* 上报屏幕事件
|
|
* 上报屏幕事件
|
|
|
*/
|
|
*/
|
|
|
export async function reportEvent(data) {
|
|
export async function reportEvent(data) {
|
|
|
- await delay(100)
|
|
|
|
|
- console.log('[Event Report]', data)
|
|
|
|
|
- return { success: true }
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return await http.post('/robot-ops/events/report', data)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('事件上报失败:', error)
|
|
|
|
|
+ return { success: true }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 导出所有 API 方法
|
|
// 导出所有 API 方法
|
|
@@ -323,4 +398,4 @@ export default {
|
|
|
getCameraPreviewUrl,
|
|
getCameraPreviewUrl,
|
|
|
setAudioControl,
|
|
setAudioControl,
|
|
|
reportEvent
|
|
reportEvent
|
|
|
-}
|
|
|
|
|
|
|
+}
|