Compare commits

...

2 Commits

Author SHA1 Message Date
bfcd3b9a35 修复:企微推送摄像头编码自动解析显示名称 2026-04-03 11:26:20 +08:00
533fe263e6 修复:Agent查询待处理工单始终为空
根因:list_orders 和 query_order_stats 默认按 create_time 过滤
今日范围,但待处理工单可能是昨天或更早创建的,导致全部漏掉。

修复内容:
1. 查询待处理状态工单时跳过时间范围过滤(skip_time_filter)
2. query_order_stats 额外返回 current_pending/current_assigned
   表示当前所有未完成工单数(不限时间)
3. _query_orders 新增 tenant_id 过滤(从配置读取)
4. 系统提示词增加查询技巧引导 Agent 正确使用 status 参数
2026-04-02 15:00:36 +08:00
3 changed files with 46 additions and 9 deletions

View File

@@ -116,11 +116,16 @@ async def send_card(request: Request):
if alarm:
alarm_type_code = alarm.alarm_type or ""
alarm_snapshot_key = alarm.snapshot_url or ""
if not camera_name or camera_name == "未知":
if alarm.device_id:
camera_service = get_camera_name_service()
camera_info = await camera_service.get_camera_info(alarm.device_id)
camera_name = camera_service.format_display_name(alarm.device_id, camera_info)
camera_name_needs_resolve = (
not camera_name
or camera_name == "未知"
or camera_name == (alarm.device_id or "")
or camera_name.lower().startswith("cam_")
)
if camera_name_needs_resolve and alarm.device_id:
camera_service = get_camera_name_service()
camera_info = await camera_service.get_camera_info(alarm.device_id)
camera_name = camera_service.format_display_name(alarm.device_id, camera_info)
finally:
db.close()

View File

@@ -16,6 +16,12 @@ SYSTEM_PROMPT = """你是VSP物业AI助手通过企业微信协助物业人
- SECURITY安保工单关联告警含摄像头、告警类型等
- CLEAN保洁工单含保洁类型、难度、预计时长等
## 查询技巧(重要)
- 用户问"有没有待处理/未完成的工单"时,必须用 list_orders(status="PENDING") 或 status="ASSIGNED" 查询,不要只用默认参数
- 待处理工单可能是之前创建的,设置 status 参数后会自动忽略时间范围限制
- query_order_stats 返回的 current_pending 和 current_assigned 是当前所有未完成工单数(不限时间)
- 查历史统计用 time_range 参数,查当前未处理用 status 参数
## 核心原则(严格遵守)
- 所有数据必须来自工具调用结果绝对不要编造工单ID、数量、人员等任何数据
- 如果工具返回错误或未找到数据,如实告知用户,不要猜测或补充

View File

@@ -81,20 +81,29 @@ def _query_orders(
end_time=None,
limit: int = 100,
assignee_name: Optional[str] = None,
skip_time_filter: bool = False,
):
"""查询 IoT 工单(跨库只读)"""
from app.models_iot import get_iot_session, IotOpsOrder
from app.config import settings
db = get_iot_session()
try:
q = db.query(IotOpsOrder).filter(IotOpsOrder.deleted == 0)
# 租户隔离
try:
tid = int(settings.work_order.tenant_id)
q = q.filter(IotOpsOrder.tenant_id == tid)
except Exception:
pass
if order_type and order_type != "ALL":
q = q.filter(IotOpsOrder.order_type == order_type)
if status:
q = q.filter(IotOpsOrder.status == status)
if start_time:
q = q.filter(IotOpsOrder.create_time >= start_time)
if end_time:
q = q.filter(IotOpsOrder.create_time < end_time)
if not skip_time_filter:
if start_time:
q = q.filter(IotOpsOrder.create_time >= start_time)
if end_time:
q = q.filter(IotOpsOrder.create_time < end_time)
if assignee_name:
q = q.filter(IotOpsOrder.assignee_name.contains(assignee_name))
@@ -151,6 +160,16 @@ def query_order_stats(time_range: str = "today", order_type: str = "ALL") -> str
start_time=start, end_time=end, limit=10000,
)
# 额外统计当前所有未完成工单(不限时间范围)
pending_orders, pending_total, _, _ = _query_orders(
order_type=order_type if order_type != "ALL" else None,
status="PENDING", limit=10000, skip_time_filter=True,
)
assigned_orders, assigned_total, _, _ = _query_orders(
order_type=order_type if order_type != "ALL" else None,
status="ASSIGNED", limit=10000, skip_time_filter=True,
)
# 按状态统计
status_count = {}
for o in orders:
@@ -180,6 +199,8 @@ def query_order_stats(time_range: str = "today", order_type: str = "ALL") -> str
"by_order_type": {k: v for k, v in type_count.items() if v > 0},
"by_alarm_type": {ALARM_TYPE_NAMES.get(t, t): c for t, c in alarm_type_count.items()} if alarm_type_count else {},
"false_alarm_count": false_alarm_count,
"current_pending": pending_total,
"current_assigned": assigned_total,
}
return json.dumps(result, ensure_ascii=False)
@@ -215,10 +236,15 @@ def list_orders(
if config and assigned_to_me:
user_id = config.get("configurable", {}).get("user_id", "")
# 查待处理工单时不限时间范围(待处理可能是之前创建的)
pending_statuses = {"PENDING", "ASSIGNED", "ARRIVED", "PAUSED"}
skip_time = status and status in pending_statuses
orders, total, sec_ext_map, clean_ext_map = _query_orders(
order_type=order_type if order_type != "ALL" else None,
status=status or None,
start_time=start, end_time=end, limit=limit,
skip_time_filter=skip_time,
)
items = []