feat: 添加获取机器人信息和菜单配置的功能,增强机器人菜单服务的可用性和扩展性

This commit is contained in:
xudan 2025-09-11 14:28:55 +08:00
parent 13c1a689b2
commit 1dbb3888d5
2 changed files with 24 additions and 164 deletions

View File

@ -1,164 +0,0 @@
# 右键菜单服务 - 模块化架构
## 概述
右键菜单服务已重构为模块化架构,按业务逻辑分离到不同的文件中,提高了代码的可维护性和可扩展性。
## 文件夹结构
```
src/services/context-menu/
├── index.ts # 主入口文件,导出所有服务
├── state-manager.ts # 核心状态管理
├── event-parser.ts # 事件解析器
├── storage-menu.service.ts # 库位相关业务逻辑
├── robot-menu.service.ts # 机器人相关业务逻辑
├── menu-config.service.ts # 菜单配置服务
└── README.md # 说明文档
```
## 组件结构
```
src/components/context-menu/
├── index.ts # 组件入口文件
├── context-menu.vue # 主菜单组件
├── storage-menu.vue # 库位菜单组件
├── robot-menu.vue # 机器人菜单组件
└── default-menu.vue # 默认菜单组件
```
## 核心模块说明
### 1. 状态管理 (state-manager.ts)
- 提供纯函数和状态管理工具
- 避免单例模式的问题
- 支持订阅/通知机制
### 2. 事件解析 (event-parser.ts)
- 解析鼠标事件和pen数据
- 提取事件信息
- 纯函数,无副作用
### 3. 库位菜单服务 (storage-menu.service.ts)
- 处理库位相关的菜单逻辑
- 库位状态检查
- 库位操作处理
### 4. 机器人菜单服务 (robot-menu.service.ts)
- 处理机器人相关的菜单逻辑
- 机器人状态管理
- 机器人操作处理
### 5. 菜单配置服务 (menu-config.service.ts)
- 统一管理不同业务类型的菜单配置
- 提供统一的菜单配置入口
## 使用方式
### 基本使用
```typescript
import { createContextMenuManager, handleContextMenu, handleContextMenuFromPenData } from '@/services/context-menu';
// 创建状态管理器
const manager = createContextMenuManager();
// 处理右键事件
handleContextMenu(event, manager, {
storageLocationService: storageService,
robotService: robotService,
});
```
### 组件使用
```vue
<template>
<ContextMenu
:visible="menuVisible"
:x="menuX"
:y="menuY"
:menu-type="menuType"
:storage-locations="storageLocations"
:robot-info="robotInfo"
@close="handleClose"
@action-complete="handleActionComplete"
/>
</template>
<script setup>
import { ContextMenu } from '@/components/context-menu';
</script>
```
## 扩展新业务类型
### 1. 添加新的业务服务
`src/services/context-menu/` 下创建新的服务文件,例如 `point-menu.service.ts`
```typescript
export interface PointMenuConfig {
menuType: 'point' | 'default';
pointInfo?: PointInfo;
}
export function getPointMenuConfig(data: ParsedEventData): PointMenuConfig {
// 实现点位菜单逻辑
}
```
### 2. 添加新的组件
`src/components/context-menu/` 下创建新的组件文件,例如 `point-menu.vue`
```vue
<template>
<div class="point-menu">
<!-- 点位菜单内容 -->
</div>
</template>
<script setup lang="ts">
// 实现点位菜单组件
</script>
```
### 3. 更新菜单配置服务
`menu-config.service.ts` 中添加新的业务类型处理:
```typescript
case 'point':
return getPointMenuConfig(data);
```
### 4. 更新主菜单组件
`context-menu.vue` 中添加新的组件:
```vue
<PointMenu
v-else-if="menuType === 'point' && pointInfo"
:point-info="pointInfo"
@action-complete="handleActionComplete"
/>
```
## 向后兼容
原有的 `context-menu.service.ts` 文件仍然保留,作为向后兼容的入口,重新导出新的模块化服务。现有代码无需修改即可继续使用。
## 优势
1. **模块化**: 按业务逻辑分离,代码更清晰
2. **可维护性**: 每个模块职责单一,易于维护
3. **可扩展性**: 新增业务类型只需添加对应模块
4. **可测试性**: 每个模块可独立测试
5. **向后兼容**: 保持现有API不变

View File

@ -291,3 +291,27 @@ export function getRobotActionIcon(action: RobotAction): string {
return iconMap[action] || '⚙️';
}
/**
*
* @param robotId ID
* @returns
*/
export function getRobotInfo(robotId: string): RobotInfo | null {
// 这里应该从实际的机器人服务中获取信息
// 目前返回null实际使用时需要对接真实的机器人数据源
console.warn('getRobotInfo: 需要对接真实的机器人数据源', robotId);
return null;
}
/**
*
* @param robotInfo
* @returns
*/
export function getRobotMenuConfig(robotInfo: RobotInfo): RobotMenuConfig {
return {
menuType: 'robot',
robotInfo,
};
}