""" 全局术语注册中心(Single Source of Truth) 所有业务术语、状态映射、类型映射集中在此文件定义。 其他模块一律从这里 import,禁止各自重复定义。 修改告警类型、工单状态、保洁类型等业务术语时,只需改这一个文件。 """ from enum import Enum from typing import Dict # ============================================================ # 摄像头 ID 统一说明 # ============================================================ # 全系统的摄像头唯一标识统一叫 camera_code,格式为 cam_{hash} # 不同系统的字段名映射关系: # - security-ai-edge: camera_id → 实际是 camera_code # - wvp-platform: camera_code → 数据库字段就叫这个 # - IoT 工单表: camera_id → 实际存的是 camera_code # - vsp-service: device_id → AlarmEvent 表,历史原因叫 device_id # # Python 代码中对外接口(API 参数、工具参数)统一使用 device_id, # 因为 AlarmEvent 主表和 EdgeAlarmReport schema 已用此名。 # 内部传递和显示时,用 camera_name_service 解析为人类可读名称。 # ============================================================ # 告警类型 (alarm_type) # ============================================================ class AlarmType(str, Enum): LEAVE_POST = "leave_post" INTRUSION = "intrusion" ILLEGAL_PARKING = "illegal_parking" VEHICLE_CONGESTION = "vehicle_congestion" ALARM_TYPE_NAMES: Dict[str, str] = { AlarmType.LEAVE_POST: "人员离岗", AlarmType.INTRUSION: "周界入侵", AlarmType.ILLEGAL_PARKING: "车辆违停", AlarmType.VEHICLE_CONGESTION: "车辆拥堵", } # VLM 场景下的简短名称(用于截图分析提示词,尽量精炼) ALARM_TYPE_SHORT_NAMES: Dict[str, str] = { AlarmType.LEAVE_POST: "离岗", AlarmType.INTRUSION: "入侵", AlarmType.ILLEGAL_PARKING: "违停", AlarmType.VEHICLE_CONGESTION: "拥堵", } def get_alarm_type_name(code: str) -> str: """获取告警类型中文名,未知类型原样返回""" return ALARM_TYPE_NAMES.get(code, code) # ============================================================ # 告警状态 (alarm_status) — vsp-service 内部使用 # ============================================================ class AlarmStatus(str, Enum): NEW = "NEW" # 新告警 CONFIRMED = "CONFIRMED" # 已确认(已创建工单) FALSE = "FALSE" # 误报 CLOSED = "CLOSED" # 已关闭 ALARM_STATUS_NAMES: Dict[str, str] = { AlarmStatus.NEW: "待处理", AlarmStatus.CONFIRMED: "处理中", AlarmStatus.FALSE: "误报", AlarmStatus.CLOSED: "已关闭", } # 芋道前端兼容映射(前端期望的状态值) ALARM_STATUS_TO_YUDAO: Dict[str, str] = { AlarmStatus.NEW: "pending", AlarmStatus.CONFIRMED: "processing", AlarmStatus.FALSE: "false_alarm", AlarmStatus.CLOSED: "completed", } YUDAO_TO_ALARM_STATUS: Dict[str, str] = { v: k for k, v in ALARM_STATUS_TO_YUDAO.items() } # ============================================================ # 处理状态 (handle_status) — vsp-service 内部使用 # ============================================================ class HandleStatus(str, Enum): UNHANDLED = "UNHANDLED" # 未处理 HANDLING = "HANDLING" # 处理中 DONE = "DONE" # 已完成 IGNORED = "IGNORED" # 已忽略 HANDLE_STATUS_NAMES: Dict[str, str] = { HandleStatus.UNHANDLED: "未处理", HandleStatus.HANDLING: "处理中", HandleStatus.DONE: "已完成", HandleStatus.IGNORED: "已忽略", } # ============================================================ # IoT 工单状态 (order status) — 来自芋道 ops_order 表 # ============================================================ class OrderStatus(str, Enum): PENDING = "PENDING" # 待处理 ASSIGNED = "ASSIGNED" # 已派单 ARRIVED = "ARRIVED" # 已到岗 PAUSED = "PAUSED" # 已暂停 COMPLETED = "COMPLETED" # 已完成 CANCELLED = "CANCELLED" # 已取消 ORDER_STATUS_NAMES: Dict[str, str] = { OrderStatus.PENDING: "待处理", OrderStatus.ASSIGNED: "已派单", OrderStatus.ARRIVED: "已到岗", OrderStatus.PAUSED: "已暂停", OrderStatus.COMPLETED: "已完成", OrderStatus.CANCELLED: "已取消", } # 未完成状态集合(用于查询"待处理"工单) ORDER_OPEN_STATUSES = frozenset({ OrderStatus.PENDING, OrderStatus.ASSIGNED, OrderStatus.ARRIVED, OrderStatus.PAUSED, }) # ============================================================ # 告警等级 (alarm_level) # ============================================================ ALARM_LEVEL_NAMES: Dict[int, str] = { 0: "紧急", 1: "重要", 2: "普通", 3: "轻微", } # 各算法的默认告警等级 ALARM_TYPE_DEFAULT_LEVEL: Dict[str, int] = { AlarmType.INTRUSION: 1, # 重要 AlarmType.LEAVE_POST: 2, # 普通 AlarmType.ILLEGAL_PARKING: 2, # 普通 AlarmType.VEHICLE_CONGESTION: 2, # 普通 } # ============================================================ # 工单优先级 (priority) # ============================================================ PRIORITY_NAMES: Dict[int, str] = { 0: "低", 1: "中", 2: "高", } # ============================================================ # 保洁类型 (cleaning_type) # ============================================================ class CleaningType(str, Enum): ROUTINE = "ROUTINE" DEEP = "DEEP" SPOT = "SPOT" EMERGENCY = "EMERGENCY" CLEANING_TYPE_NAMES: Dict[str, str] = { CleaningType.ROUTINE: "日常保洁", CleaningType.DEEP: "深度保洁", CleaningType.SPOT: "点状保洁", CleaningType.EMERGENCY: "应急保洁", } # ============================================================ # 通用常量 # ============================================================ WEEKDAY_NAMES = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]