Files
SecMPS/doc/设计文档/VolPro框架改造方案_任务清单.md

11 KiB
Raw Blame History

Vol.Pro 框架前后端改造 — 任务清单

基准文档: VolPro框架改造方案 v1.0
分支: phase/0-infrastructure
原则: 所有改动在 Partial/extension 目录,严禁修改框架生成文件


Phase V0: 数据库与代码生成(预计 0.5 天)

V0.1 建表

  • 在 SQL Server 执行 doc/db_init.sql,创建 6 张表:
    • gateway_nodes(网关节点)
    • base_device统一设备主表AdapterCode+SourceId 联合主键)
    • video_channel(视频通道扩展)
    • video_record(录像文件)
    • iot_alarm(告警记录)
    • iot_devicedata(数据归档)

V0.2 字典初始化

  • 在 Vol.Pro 管理端 → 字典管理,创建 8 组数据字典:
    • 设备分组:视频设备/IoT设备/门禁设备/道闸设备/报警设备
    • 设备种类:摄像机/硬盘录像机/温湿度变送器/空调控制器/...18 项)
    • 在线状态:在线/离线
    • 启用状态:启用/禁用
    • 是否父设备:是/否
    • 是否控制点:只读/可写
    • 告警等级:提示/普通/重要/紧急
    • 告警状态:未确认/已确认/已结束

V0.3 代码生成

  • 在 Vol.Pro 代码生成器中选择 device_manager 数据源,生成 6 张表的全套代码:
    • VolPro.Entity/DomainModels/device_manager/ — 6 个 Entity
    • Warehouse/IRepositories/device_manager/ — 6 个 Repository 接口
    • Warehouse/Repositories/device_manager/ — 6 个 Repository 实现
    • Warehouse/IServices/device_manager/ — 6 个 Service 接口 + 6 个 Partial 接口
    • Warehouse/Services/device_manager/ — 6 个 Service 实现 + 6 个 Partial Service
    • VolPro.WebApi/Controllers/Warehouse/ — 6 个 Controller

V0.4 配置主从表

  • 代码生成器配置 base_device 的 DetailTable
    • 关联 video_channelDeviceId=DeviceId
    • 关联 iot_devicedataDeviceId=DeviceId
    • 关联 iot_alarmDeviceId=DeviceId
  • 代码生成器配置 base_device 的 ParentId 自引用字段ParentDeviceId

V0.5 构建验证

  • VS 编译 Vol.Pro 解决方案,确认 0 错误
  • 管理端访问 base_device 页面 → 框架默认主从表三 Tab 渲染正常

V0 提交点: PhaseV0_db_codegen — 6 张表建表 + 字典 + 代码生成完毕,框架默认页面可访问


Phase V1: Entity 与 Service 扩展(预计 0.5 天)

V1.1 Entity Partial

  • 创建 VolPro.Entity/DomainModels/device_manager/partial/base_device.cs
    • 添加导航属性VideoChannel、Alarms、DeviceData
    • 添加网关字段白名单常量 GatewayFields
  • 创建 VolPro.Entity/DomainModels/device_manager/partial/gateway_nodes.cs
    • 添加 AdapterList 属性(从 AdapterTypes 逗号分隔解析)
  • 其他 4 个 Entity Partial 留空(框架生成即够用)

V1.2 Service Partial — gateway_nodesService

  • 编辑 Warehouse/Services/device_manager/Partial/gateway_nodesService.cs
    • 注入 Igateway_nodesRepository + IHttpContextAccessor[ActivatorUtilitiesConstructor]
    • 实现 RegisterNodeAsync(nodeCode, token, adapterTypes, baseUrl) — Upsert 逻辑
    • 实现 UpdateHeartbeatAsync(nodeCode, token) — 更新心跳
    • 实现 SyncDevicesAsync(gatewayNodeId, List<StandardDevice>) — 字段分治 + parentSourceId 映射

V1.3 Service Partial — base_deviceService

  • 编辑 Warehouse/Services/device_manager/Partial/base_deviceService.cs
    • 注入 Ibase_deviceRepository
    • 实现 GetDevicesByGatewayNodeAsync(gatewayNodeId) — 网关注册时返回设备列表
    • 实现 UpsertDeviceAsync(StandardDevice, gatewayNodeId, existingIds) — 字段分治

V1.4 Service Partial — iot_alarmService

  • 编辑 Warehouse/Services/device_manager/Partial/iot_alarmService.cs
    • 注入 Iiot_alarmRepository
    • 实现 UpsertAlarmAsync(StandardAlarm) — SourceAlarmId 去重

V1.5 构建验证

  • VS 编译 → 0 错误

V1 提交点: PhaseV1_entity_service — Entity 导航属性 + Service 同步方法全部就绪


Phase V2: Controller 扩展(预计 1 天)

V2.1 gateway_nodesController — A1 网关注册

  • 编辑 Controllers/Warehouse/Partial/gateway_nodesController.cs
    • 添加 [HttpPost, Route("/api/gateway/register"), AllowAnonymous]
    • 认证NodeToken 验证
    • Upsert存在则更新 AdapterTypes/BaseUrl/IsOnline不存在且 Token 有效则 Insert
    • 返回:{ nodeId, devices } — 当前网关的顶层设备列表

V2.2 gateway_nodesController — A2 心跳

  • 添加 [HttpPost, Route("/api/gateway/heartbeat"), AllowAnonymous]
    • 认证NodeToken
    • 更新IsOnline="在线" + LastHeartbeat=now
    • 返回:{ status: "ok", serverTime }

V2.3 gateway_nodesController — A3 设备同步

  • 添加 [HttpPost, Route("/api/gateway/sync/devices"), AllowAnonymous]
    • 认证NodeToken
    • 批量查已有 DeviceId 映射表
    • 遍历设备:字段分治写入(首次全量,后续仅网关字段)
    • parentSourceId → ParentDeviceId 解析
    • 返回:{ added, updated, removed }

V2.4 gateway_nodesController — A4 告警同步

  • 添加 [HttpPost, Route("/api/gateway/sync/alarms"), AllowAnonymous]
    • 认证NodeToken
    • 批量查 deviceSourceId → DeviceId 映射
    • SourceAlarmId 去重
    • 写入 iot_alarmState="未确认"
    • 返回:{ added }

V2.5 base_deviceController — 设备树

  • 编辑 Controllers/Warehouse/Partial/base_deviceController.cs
  • 添加 [HttpGet, Route("/api/DeviceManager/GetRegionTree")]
    • 查询warehouse_regions JOIN warehouse_devicepoint
    • 构建树形结构region → point含 deviceCount
    • 返回:[{ id, label, type, children, deviceCount }]
  • 添加 [HttpGet, Route("/api/DeviceManager/GetDevicesByPoint")]
    • 查询base_device WHERE PointId=pointId含子设备递归
    • 分页返回:{ items, total }

V2.6 权限配置

  • A1-A4 接口加 [AllowAnonymous](内部 Token 二次认证)
  • GetRegionTree/GetDevicesByPoint 走框架 JWT 权限

V2.7 构建验证

  • VS 编译 → 0 错误
  • Postman 测试 A1-A4Mock Token
  • 管理端访问 GetRegionTree → 返回 JSON

V2 提交点: PhaseV2_controller — 6 个 API 全部就绪A1-A4 AllowAnonymous设备树可查


Phase V3: 基础设施与定时任务(预计 0.5 天)

V3.1 GatewayClient

  • 创建 Warehouse/Services/GatewayClient.cs
    • 实现 TriggerFullSyncAsync(baseUrl, adapterTypes) — 调网关 B3
    • 实现 GetRealtimeAsync(baseUrl, adapter, deviceId) — 调网关 B4
    • 实现 ControlDeviceAsync(baseUrl, adapter, deviceId, pointIndex, value) — 调网关 B5

V3.2 Quartz Job — SyncDevicesJob

  • 创建 Warehouse/Services/SyncDevicesJob.cs
    • 实现 IJob 接口
    • 遍历 gateway_nodes WHERE IsOnline=在线 AND Enable=启用
    • 逐个调 GatewayClient.TriggerFullSyncAsync

V3.3 Quartz Job — HeartbeatMonitorJob

  • 创建 Warehouse/Services/HeartbeatMonitorJob.cs
    • 扫描心跳超时 30s 的网关 → 标记离线
    • 级联:base_device WHERE GatewayNodeId=离线节点Id → IsOnline=离线

V3.4 Quartz Job — RealtimePollJobPhase 2

  • 创建 Warehouse/Services/RealtimePollJob.cs骨架Phase 2 完善)

V3.5 Startup.cs 注册

  • 注册 IHttpClientFactoryNamed: "VolPro"
  • 注册 GatewayClient 为 Singleton
  • 确认 Quartz Job 在管理端可配置JobDataMap 传入 ServiceProvider

V3.6 Job 注册

  • 在 Vol.Pro 管理端 → Quartz 管理 → 新建 3 个 Job
    • SyncDevicesJobCron "0 */5 * * * ?"
    • HeartbeatMonitorJobCron "0/15 * * * * ?"
    • RealtimePollJobCron "0/10 * * * * ?"

V3.7 构建验证

  • VS 编译 → 0 错误
  • GatewayClient 可通过 Swagger 测试

V3 提交点: PhaseV3_infrastructure — GatewayClient + 3 Job + Startup 注册完毕


Phase V4: 前端改造(预计 1.5 天)

V4.1 目录创建

  • 创建 web.vite/src/views/warehouse/base_device/components/ 目录
  • 创建 web.vite/src/extension/warehouse/ 目录
  • 创建 web.vite/src/api/gateway.js — 网关 B 组 API 封装

V4.2 gateway.js API 封装

  • getStreamUrl(adapter, deviceId) → GET 流地址
  • ptzControl(adapter, deviceId, direction) → POST 云台控制
  • getRealtime(adapter, deviceId) → GET 实时点值
  • controlDevice(adapter, deviceId, pointIndex, value) → POST 控制
  • getAlarms(adapter, params) → GET 告警列表
  • confirmAlarm(adapter, alarmId) → POST 告警确认

V4.3 视频操作组件

  • 创建 VideoDeviceActions.vue — 按钮组(预览/云台/回放/快照/同步通道)
  • 创建 DeviceLivePreview.vue — Jessibuca 播放器弹窗(
  • 创建 PtzControlPanel.vue — 方向键面板(↑↓←→+ZOOM+停止)
    • mousedown 开始移动mouseup 停止

V4.4 IoT 操作组件

  • 创建 IoTDeviceActions.vue — 按钮组(实时数据/控制/刷新/告警)
  • 创建 RealtimeDataPanel.vue — 实时数值弹窗5s 自动轮询 B4
  • 创建 DeviceControlPanel.vue — 控制写值面板B5

V4.5 通用操作组件

  • 创建 DeviceEditDialog.vue — 设备编辑弹窗(管理员字段)
  • 创建 MapBindingPanel.vue — 地图模型绑定面板模型ID/缩放/旋转)

V4.6 未来组件(骨架)

  • 创建 AccessDeviceActions.vue — 门禁按钮组(远程开门)
  • 创建 BarrierDeviceActions.vue — 道闸按钮组(抬杆/落杆)
  • 创建 AlarmDeviceActions.vue — 报警按钮组(告警/布防撤防)

V4.7 扩展注入

  • 创建 web.vite/src/extension/warehouse/base_device.jsx
    • 注册操作列插槽 col-action
    • row.deviceGroup 动态渲染对应按钮组件
    • 视频设备 → VideoDeviceActions
    • IoT 设备 → IoTDeviceActions
    • 其他 → 框架默认编辑/删除按钮

V4.8 构建验证

  • 前端 npm run dev 启动
  • 访问 base_device 页面 → 操作列根据 DeviceGroup 显示不同按钮
  • 点击"预览"→ 弹窗打开 → 获取流地址

V4 提交点: PhaseV4_frontend — 11 个组件 + extension 注入完成,操作列动态渲染


Phase V5: 联调验证(需网关+子系统就绪,预计 1 天)

V5.1 端到端同步

  • 启动网关 → 调 A1 注册 → gateway_nodes 表新增记录
  • 网关调 A3 上送设备 → base_device 表有新设备
  • 管理端 base_device 页面 → 列表中显示新设备

V5.2 视频操作

  • 视频设备行 → 点击"实时预览" → 弹窗播放 Owl 视频流
  • 视频设备行 → 云台方向键操作 → Owl PTZ 响应

V5.3 IoT 操作

  • IoT 设备行 → 点击"实时数据" → 显示 MC4.0 温湿度值

V5.4 告警确认

  • MC4.0 触发告警 → 网关 A4 上送 → iot_alarm 表新增
  • 管理端确认告警 → 通过 B9 写回 MC4.0

V5 提交点: PhaseV5_integration — 端到端同步 + 视频操作 + IoT 数据 + 告警确认全链路跑通


总周期: V0-V5 预计 5 个工作日(不含联调等待时间)