183 lines
6.5 KiB
Python
183 lines
6.5 KiB
Python
|
|
"""
|
|||
|
|
工单操作工具:确认接单、完成、误报、提交处理结果
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import json
|
|||
|
|
from typing import Optional, List
|
|||
|
|
from langchain_core.tools import tool
|
|||
|
|
from langchain_core.runnables import RunnableConfig
|
|||
|
|
|
|||
|
|
from app.utils.logger import logger
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def _update_wechat_card(order_id: str, user_id: str, action: str):
|
|||
|
|
"""更新企微卡片状态(以 order_id 为 key)"""
|
|||
|
|
try:
|
|||
|
|
from app.services.wechat_service import get_wechat_service
|
|||
|
|
wechat = get_wechat_service()
|
|||
|
|
response_code = wechat.get_response_code(order_id)
|
|||
|
|
if not response_code:
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
if action == "confirm":
|
|||
|
|
await wechat.update_alarm_card_step2(
|
|||
|
|
response_code=response_code, user_ids=[user_id],
|
|||
|
|
order_id=order_id, operator_name=user_id,
|
|||
|
|
)
|
|||
|
|
else:
|
|||
|
|
await wechat.update_alarm_card_terminal(
|
|||
|
|
response_code=response_code, user_ids=[user_id],
|
|||
|
|
order_id=order_id, action=action, operator_name=user_id,
|
|||
|
|
)
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.error(f"更新企微卡片失败: order={order_id}, error={e}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
@tool
|
|||
|
|
async def update_order_status(order_id: str, action: str, config: RunnableConfig) -> str:
|
|||
|
|
"""更新工单状态:确认接单(confirm)、处理完成(complete)、标记误报(false)、忽略(ignore)
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
order_id: 工单ID(ops_order.id)
|
|||
|
|
action: 操作类型 confirm=确认接单 complete=处理完成 false=标记误报 ignore=忽略
|
|||
|
|
"""
|
|||
|
|
user_id = config.get("configurable", {}).get("user_id", "")
|
|||
|
|
|
|||
|
|
from app.services.work_order_client import get_work_order_client
|
|||
|
|
wo_client = get_work_order_client()
|
|||
|
|
|
|||
|
|
if not wo_client.enabled:
|
|||
|
|
return json.dumps({"error": "工单系统未启用"}, ensure_ascii=False)
|
|||
|
|
|
|||
|
|
# IoT 工单操作
|
|||
|
|
iot_success = False
|
|||
|
|
if action == "confirm":
|
|||
|
|
iot_success = await wo_client.confirm_order(order_id)
|
|||
|
|
elif action in ("ignore", "false"):
|
|||
|
|
iot_success = await wo_client.false_alarm(order_id)
|
|||
|
|
elif action == "complete":
|
|||
|
|
iot_success = await wo_client.submit_order(order_id, result=f"已处理 by {user_id}")
|
|||
|
|
|
|||
|
|
if not iot_success:
|
|||
|
|
return json.dumps({"error": f"工单操作失败: order={order_id}, action={action}"}, ensure_ascii=False)
|
|||
|
|
|
|||
|
|
# 有关联告警时同步告警状态
|
|||
|
|
from app.services.wechat_service import get_wechat_service
|
|||
|
|
wechat = get_wechat_service()
|
|||
|
|
alarm_id = wechat.get_alarm_id_for_order(order_id)
|
|||
|
|
|
|||
|
|
if alarm_id:
|
|||
|
|
action_map = {
|
|||
|
|
"confirm": ("CONFIRMED", "HANDLING", "Agent确认接单"),
|
|||
|
|
"ignore": ("FALSE", "IGNORED", "Agent忽略"),
|
|||
|
|
"complete": ("CLOSED", "DONE", "Agent已处理"),
|
|||
|
|
"false": ("FALSE", "IGNORED", "Agent标记误报"),
|
|||
|
|
}
|
|||
|
|
if action in action_map:
|
|||
|
|
alarm_status, handle_status, remark = action_map[action]
|
|||
|
|
from app.services.alarm_event_service import get_alarm_event_service
|
|||
|
|
svc = get_alarm_event_service()
|
|||
|
|
svc.handle_alarm(
|
|||
|
|
alarm_id=alarm_id, alarm_status=alarm_status,
|
|||
|
|
handle_status=handle_status, handler=user_id, remark=remark,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 更新企微卡片
|
|||
|
|
await _update_wechat_card(order_id, user_id, action)
|
|||
|
|
|
|||
|
|
action_labels = {
|
|||
|
|
"confirm": "已确认接单",
|
|||
|
|
"ignore": "已忽略",
|
|||
|
|
"complete": "已处理完成",
|
|||
|
|
"false": "已标记误报",
|
|||
|
|
}
|
|||
|
|
return json.dumps(
|
|||
|
|
{"success": True, "message": f"{action_labels.get(action, action)}: 工单{order_id}"},
|
|||
|
|
ensure_ascii=False,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@tool
|
|||
|
|
async def submit_order_result(
|
|||
|
|
order_id: str,
|
|||
|
|
result_text: str,
|
|||
|
|
config: RunnableConfig,
|
|||
|
|
image_urls: Optional[List[str]] = None,
|
|||
|
|
) -> str:
|
|||
|
|
"""提交工单处理结果(文字描述+处理后照片URL)
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
order_id: 工单ID(ops_order.id)
|
|||
|
|
result_text: 处理结果描述
|
|||
|
|
image_urls: 处理后照片URL列表(COS永久URL)
|
|||
|
|
"""
|
|||
|
|
user_id = config.get("configurable", {}).get("user_id", "")
|
|||
|
|
|
|||
|
|
if image_urls is None:
|
|||
|
|
image_urls = []
|
|||
|
|
|
|||
|
|
# 合并 session 中暂存的图片
|
|||
|
|
from app.services.session_manager import get_session_manager
|
|||
|
|
session = get_session_manager().get(user_id)
|
|||
|
|
if session.pending_images:
|
|||
|
|
image_urls = session.pending_images + image_urls
|
|||
|
|
session.pending_images = []
|
|||
|
|
|
|||
|
|
from app.services.work_order_client import get_work_order_client
|
|||
|
|
wo_client = get_work_order_client()
|
|||
|
|
|
|||
|
|
if wo_client.enabled:
|
|||
|
|
success = await wo_client.submit_order(
|
|||
|
|
order_id,
|
|||
|
|
result=f"{result_text} by {user_id}",
|
|||
|
|
result_img_urls=image_urls or None,
|
|||
|
|
)
|
|||
|
|
if not success:
|
|||
|
|
return json.dumps({"error": f"提交工单结果失败: order={order_id}"}, ensure_ascii=False)
|
|||
|
|
|
|||
|
|
# 有关联告警时同步告警状态
|
|||
|
|
from app.services.wechat_service import get_wechat_service
|
|||
|
|
wechat = get_wechat_service()
|
|||
|
|
alarm_id = wechat.get_alarm_id_for_order(order_id)
|
|||
|
|
|
|||
|
|
if alarm_id:
|
|||
|
|
from app.services.alarm_event_service import get_alarm_event_service
|
|||
|
|
svc = get_alarm_event_service()
|
|||
|
|
remark = f"Agent结单: {result_text}"
|
|||
|
|
if image_urls:
|
|||
|
|
remark += f" (附{len(image_urls)}张图片)"
|
|||
|
|
svc.handle_alarm(alarm_id=alarm_id, alarm_status="CLOSED",
|
|||
|
|
handle_status="DONE", handler=user_id, remark=remark)
|
|||
|
|
|
|||
|
|
# 持久化处理结果图片到 alarm_event_ext
|
|||
|
|
if image_urls:
|
|||
|
|
try:
|
|||
|
|
from app.models import get_session as get_db_session, AlarmEventExt
|
|||
|
|
db = get_db_session()
|
|||
|
|
try:
|
|||
|
|
ext = AlarmEventExt(
|
|||
|
|
alarm_id=alarm_id,
|
|||
|
|
ext_type="HANDLER_RESULT",
|
|||
|
|
ext_data={"result_text": result_text, "image_urls": image_urls, "handler": user_id},
|
|||
|
|
)
|
|||
|
|
db.add(ext)
|
|||
|
|
db.commit()
|
|||
|
|
except Exception as e:
|
|||
|
|
db.rollback()
|
|||
|
|
logger.error(f"持久化处理结果图片失败: {e}")
|
|||
|
|
finally:
|
|||
|
|
db.close()
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.error(f"保存处理结果失败: {e}")
|
|||
|
|
|
|||
|
|
# 更新卡片到终态
|
|||
|
|
await _update_wechat_card(order_id, user_id, "complete")
|
|||
|
|
|
|||
|
|
result = {
|
|||
|
|
"success": True,
|
|||
|
|
"message": f"工单已提交: {order_id}",
|
|||
|
|
"result": result_text,
|
|||
|
|
"images_count": len(image_urls),
|
|||
|
|
}
|
|||
|
|
return json.dumps(result, ensure_ascii=False)
|