修复: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 参数
This commit is contained in:
2026-04-02 15:00:36 +08:00
parent 57df6a2704
commit 533fe263e6
2 changed files with 36 additions and 4 deletions

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 = []