新建 app/constants.py 作为全局术语单一真相源,包含: - AlarmType/AlarmStatus/HandleStatus/OrderStatus/CleaningType 枚举 - 所有中文映射字典(ALARM_TYPE_NAMES 等) - 芋道前端兼容状态映射 - 告警等级、优先级、保洁类型等常量 - ORDER_OPEN_STATUSES 未完成状态集合 已替换 daily_report_service.py 和 order_query.py 中的重复定义。 其余文件(wechat_service/vlm_service/yudao_*等)待下一阶段替换。
187 lines
5.9 KiB
Python
187 lines
5.9 KiB
Python
"""
|
||
全局术语注册中心(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 = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
|