5.6 KiB
5.6 KiB
库位功能逻辑分析
1. 概述
本文档旨在详细解析项目中“库位”(Storage Location)功能的实现逻辑。该功能的核心目标是实时监控与地图中“动作点”关联的库位状态,并将这些状态直观地反馈在前端界面上,包括更新画布上点的边框颜色和在详情卡片中展示详细的库位信息。
整个功能逻辑主要由 StorageLocationService
服务和 PointDetailCard
UI组件协作完成,数据通过 WebSocket 从后端实时推送。
2. 核心服务: StorageLocationService
StorageLocationService
是库位管理的中枢,封装了所有核心业务逻辑。它在 movement-supervision.vue
页面中被实例化和管理。
文件路径: src/services/storage-location.service.ts
主要职责
-
WebSocket 通信:
- 通过调用
@api/scene
中的monitorStorageLocationById
方法,建立一个 WebSocket 连接来接收实时的库位状态更新。 - 连接建立后,会主动向后端请求一次全量的库位状态数据。
- 通过调用
-
数据处理与状态管理:
- 维护一个核心数据结构
storageLocations: Ref<Map<string, StorageLocationInfo[]>>
。这是一个响应式的 Map,其中:key
: 画布中“动作点”的 ID (pointId
)。value
: 一个数组,包含所有绑定到该动作点的库位信息 (StorageLocationInfo[]
)。
- 通过
handleStorageLocationUpdate
方法处理来自 WebSocket 的两种消息:storage_location_update
: 用于全量更新所有库位信息。storage_location_status_change
: 用于更新单个库位的状态,实现增量更新。
- 维护一个核心数据结构
-
与编辑器 (
EditorService
) 的交互:- ID 映射: 通过
buildStationToPointIdMap
方法,将后端数据中的station_name
(如 "AP9") 与画布中“动作点”的唯一id
(如 "3351") 进行映射。这是连接后端逻辑与前端视觉呈现的关键桥梁。 - 视觉状态更新: 实现
updatePointBorderColor
方法,根据一个点所关联的所有库位的占用状态 (is_occupied
),动态更新该点在画布上的边框颜色:- 全部占用: 红色 (
#ff4d4f
) - 部分或全部未占用: 绿色 (
#52c41a
)
- 全部占用: 红色 (
- ID 映射: 通过
对外接口
getLocationsByPointId(pointId: string)
: 向外部组件提供一个接口,用于根据“动作点”的 ID 获取其关联的所有库位的详细信息数组。
3. UI 展示: PointDetailCard
当用户在 movement-supervision.vue
页面中选中一个“动作点”时,PointDetailCard
组件会负责展示该点的详细信息,其中就包括了库位的实时状态。
文件路径: src/components/card/point-detail-card.vue
主要职责
-
接收数据:
- 通过
props
从父组件接收storageLocations
数组。该数组的数据源是StorageLocationService.getLocationsByPointId()
方法的返回值。
- 通过
-
渲染库位状态:
- 遍历
storageLocations
数组,为每一个库位渲染一个信息块。 - 使用
getStorageStatusTag
方法,根据库位的多个布尔状态 (is_occupied
,is_locked
,is_disabled
,is_empty_tray
),生成对应文本(如“已占用”、“未锁定”)和颜色样式的标签,为用户提供清晰、直观的状态反馈。
- 遍历
4. 数据流转图
下面的流程图清晰地展示了从后端数据推送到前端UI渲染的完整过程。
sequenceDiagram
participant Backend as Backend (WebSocket)
participant StorageLocationService as StorageLocationService
participant MovementSupervision as movement-supervision.vue
participant PointDetailCard as PointDetailCard
participant EditorService as EditorService (Canvas)
MovementSupervision->>StorageLocationService: new StorageLocationService(editor, sceneId)
MovementSupervision->>StorageLocationService: startMonitoring()
StorageLocationService->>Backend: 建立 WebSocket 连接
Backend-->>StorageLocationService: 推送库位状态消息 (JSON)
StorageLocationService->>StorageLocationService: handleStorageLocationUpdate(message)
StorageLocationService->>EditorService: buildStationToPointIdMap() <br> (获取点位ID与站点名称映射)
StorageLocationService->>StorageLocationService: 更新内部 storageLocations Map
StorageLocationService->>EditorService: updatePointBorderColor(pointId, color) <br> (更新画布点的边框颜色)
Note right of MovementSupervision: 用户点击一个动作点
MovementSupervision->>StorageLocationService: getLocationsByPointId(current.id)
StorageLocationService-->>MovementSupervision: 返回库位信息数组
MovementSupervision->>PointDetailCard: :storage-locations="locations"
PointDetailCard->>PointDetailCard: 渲染库位名称和状态标签
5. 关联文件清单
src/pages/movement-supervision.vue
:- 角色: 核心页面。负责实例化和管理
StorageLocationService
的生命周期,并将获取到的库位数据传递给PointDetailCard
。
- 角色: 核心页面。负责实例化和管理
src/services/storage-location.service.ts
:- 角色: 核心服务。处理所有与库位相关的业务逻辑,包括数据获取、状态管理和与画布的交互。
src/components/card/point-detail-card.vue
:- 角色: UI组件。负责展示单个动作点所绑定的库位的详细状态信息。
src/apis/scene/api.ts
:- 角色: API定义。包含
monitorStorageLocationById
方法,用于发起 WebSocket 连接请求。
- 角色: API定义。包含
src/core/editor.service.ts
:- 角色: 编辑器服务。
StorageLocationService
依赖此服务来获取画布中的点位信息并更新其视觉样式。
- 角色: 编辑器服务。