web-map/src/components/card/robot-detail-card.vue

108 lines
3.2 KiB
Vue
Raw Normal View History

2025-05-05 23:21:31 +08:00
<script setup lang="ts">
import { type RobotInfo, RobotState, RobotType } from '@api/robot';
import type { EditorService } from '@core/editor.service';
import sTheme from '@core/theme.service';
import { computed, inject, type InjectionKey, type ShallowRef } from 'vue';
type Props = {
token: InjectionKey<ShallowRef<EditorService>>;
current?: string;
};
const props = defineProps<Props>();
const editor = inject(props.token)!;
const robot = computed<RobotInfo | null>(() => {
const id = props.current;
if (!id) return null;
return editor.value.getRobotById(id) ?? null;
});
const batteryIcon = computed<string>(() => (robot.value?.state === RobotState.充电中 ? 'battery_charge' : 'battery'));
const stateDot = computed<string>(() => `state-${robot.value?.state}`);
</script>
<template>
2025-05-06 23:48:21 +08:00
<a-card :bordered="false">
2025-05-05 23:21:31 +08:00
<template v-if="robot">
<a-row :gutter="[8, 8]">
<a-col :span="24">
<a-flex align="center" :gap="8">
<i class="icon robot" />
2025-05-06 23:48:21 +08:00
<a-typography-text class="card-title" style="flex: auto" :content="robot.label" ellipsis />
2025-05-05 23:21:31 +08:00
<a-tag :bordered="false">{{ $t(RobotType[robot.type]) }}</a-tag>
</a-flex>
</a-col>
2025-06-04 10:43:58 +08:00
<a-col v-if="robot.ip" :span="24">
2025-05-05 23:21:31 +08:00
<a-typography-text code>{{ robot.ip }}</a-typography-text>
</a-col>
<a-col :span="24">
<a-space align="center" :size="8">
<a-tag v-if="robot.isConnected">
<i class="icon connect_on size-18 mr-4" />
<span>{{ $t('已连接') }}</span>
</a-tag>
<a-tag v-else>
<i class="icon connect_off size-18 mr-4" />
<span>{{ $t('未连接') }}</span>
</a-tag>
<a-tag>
<i class="icon size-18 mr-4" :class="batteryIcon" />
<span>{{ robot.battery ?? 0 }}%</span>
</a-tag>
<a-tag v-if="robot.state">
<i class="dot mr-4" :class="stateDot" />
<span>{{ $t(RobotState[robot.state]) }}</span>
</a-tag>
</a-space>
</a-col>
</a-row>
<a-list class="block mt-16">
<a-list-item>
<a-typography-text type="secondary">{{ $t('接单状态') }}</a-typography-text>
<a-typography-text>{{ $t(robot.canOrder ? '接单' : '不可接单') }}</a-typography-text>
</a-list-item>
<a-list-item>
<a-typography-text type="secondary">{{ $t('急停状态') }}</a-typography-text>
<a-typography-text>{{ $t(robot.canStop ? '是' : '否') }}</a-typography-text>
</a-list-item>
<a-list-item>
<a-typography-text type="secondary">{{ $t('控制权') }}</a-typography-text>
<a-typography-text>{{ $t(robot.canControl ? '已抢占' : '当前无控制权') }}</a-typography-text>
</a-list-item>
</a-list>
</template>
<a-empty v-else :image="sTheme.empty" />
</a-card>
</template>
<style scoped lang="scss">
.dot {
width: 8px;
height: 8px;
border-radius: 50%;
&.state {
&-1 {
background-color: #19f390;
}
&-2 {
background-color: #fdc11c;
}
&-3 {
background-color: #1982f3;
}
&-4 {
background-color: #888;
}
}
}
</style>