VWED_server/services/external_task_record_service.py

349 lines
13 KiB
Python
Raw Normal View History

2025-08-13 15:27:04 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
外部任务记录服务模块
提供外部任务记录相关的服务方法
"""
import json
import uuid
from typing import Dict, List, Any, Optional
from sqlalchemy import select, and_, or_
import datetime
from data.models.external_task_record import VWEDExternalTaskRecord, ExternalTaskTypeEnum, ExternalTaskStatusEnum
from data.session import get_async_session
from utils.logger import get_logger
# 设置日志
logger = get_logger("service.external_task_record_service")
class ExternalTaskRecordService:
"""
外部任务记录服务类
提供与外部任务记录相关的方法
"""
@staticmethod
async def create_new_task_record(
req_code: str,
source_id: str,
target_id: str,
business_task_type: str,
template_id: str,
request_params: Dict[str, Any],
client_ip: str = None,
client_info: str = None
) -> VWEDExternalTaskRecord:
"""
创建newTask任务记录
Args:
req_code: 请求标识码
source_id: 来源ID
target_id: 目标ID
business_task_type: 业务任务类型
template_id: 任务模板ID
request_params: 请求参数
client_ip: 客户端IP
client_info: 客户端信息
Returns:
VWEDExternalTaskRecord: 创建的外部任务记录
"""
try:
async with get_async_session() as session:
# 生成唯一ID
record_id = str(uuid.uuid4())
# 创建外部任务记录
external_record = VWEDExternalTaskRecord(
id=record_id,
req_code=req_code,
task_type=ExternalTaskTypeEnum.NEW_TASK,
task_status=ExternalTaskStatusEnum.PENDING,
source_id=source_id,
target_id=target_id,
business_task_type=business_task_type,
template_id=template_id,
request_params=json.dumps(request_params, ensure_ascii=False),
client_ip=client_ip,
client_info=client_info,
start_time=datetime.datetime.now()
)
session.add(external_record)
await session.commit()
await session.refresh(external_record)
logger.info(f"创建newTask任务记录成功: record_id={record_id}, req_code={req_code}")
return external_record
except Exception as e:
logger.error(f"创建newTask任务记录失败: {str(e)}, req_code={req_code}")
raise
@staticmethod
async def create_agv_scheduling_task_record(
req_code: str,
task_code: str,
business_task_type: str,
security_key: str,
type_field: str,
sub_type: str,
area_position_code: str,
area_position_name: str,
position_code_path: List[Dict[str, Any]],
template_id: str,
request_params: Dict[str, Any],
client_code: str = None,
token_code: str = None,
client_ip: str = None,
client_info: str = None,
related_req_code: str = None
) -> VWEDExternalTaskRecord:
"""
创建GenAgvSchedulingTask任务记录
Args:
req_code: 请求标识码
task_code: 任务代码
business_task_type: 业务任务类型
security_key: 安全密钥
type_field: 类型字段
sub_type: 子类型
area_position_code: 区域位置代码
area_position_name: 区域位置名称
position_code_path: 位置代码路径
template_id: 任务模板ID
request_params: 请求参数
client_code: 客户端代码
token_code: 令牌代码
client_ip: 客户端IP
client_info: 客户端信息
related_req_code: 关联的ReqCode
Returns:
VWEDExternalTaskRecord: 创建的外部任务记录
"""
try:
async with get_async_session() as session:
# 生成唯一ID
record_id = str(uuid.uuid4())
# 创建外部任务记录
external_record = VWEDExternalTaskRecord(
id=record_id,
req_code=req_code,
task_type=ExternalTaskTypeEnum.GEN_AGV_SCHEDULING_TASK,
task_status=ExternalTaskStatusEnum.PENDING,
task_code=task_code,
business_task_type=business_task_type,
security_key=security_key,
type_field=type_field,
sub_type=sub_type,
area_position_code=area_position_code,
area_position_name=area_position_name,
position_code_path=json.dumps(position_code_path, ensure_ascii=False),
client_code=client_code,
token_code=token_code,
template_id=template_id,
request_params=json.dumps(request_params, ensure_ascii=False),
client_ip=client_ip,
client_info=client_info,
related_req_code=related_req_code,
start_time=datetime.datetime.now()
)
session.add(external_record)
await session.commit()
await session.refresh(external_record)
logger.info(f"创建GenAgvSchedulingTask任务记录成功: record_id={record_id}, req_code={req_code}, task_code={task_code}")
return external_record
except Exception as e:
logger.error(f"创建GenAgvSchedulingTask任务记录失败: {str(e)}, req_code={req_code}")
raise
@staticmethod
async def update_task_record_status(
req_code: str,
task_status: ExternalTaskStatusEnum,
task_record_id: str = None,
response_code: int = None,
response_message: str = None,
response_row_count: int = None,
response_data: Dict[str, Any] = None,
error_message: str = None,
error_stack: str = None
) -> bool:
"""
更新外部任务记录状态
Args:
req_code: 请求标识码
task_status: 任务状态
task_record_id: 内部任务记录ID
response_code: 响应状态码
response_message: 响应消息
response_row_count: 响应行数
response_data: 响应数据
error_message: 错误信息
error_stack: 错误堆栈
Returns:
bool: 更新是否成功
"""
try:
async with get_async_session() as session:
# 查询外部任务记录
query = select(VWEDExternalTaskRecord).where(
VWEDExternalTaskRecord.id == req_code
)
result = await session.execute(query)
external_record = result.scalar_one_or_none()
if not external_record:
logger.error(f"外部任务记录不存在: req_code={req_code}")
return False
# 更新状态和相关信息
response_data_json = None
if response_data:
try:
response_data_json = json.dumps(response_data, ensure_ascii=False, default=str)
except Exception as e:
# logger.warning(f"序列化response_data失败: {str(e)}")
response_data_json = str(response_data)
external_record.update_status(task_status, error_message, response_data_json)
if task_record_id:
external_record.task_record_id = task_record_id
if response_code is not None:
external_record.response_code = response_code
if response_message:
external_record.response_message = json.dumps(response_message, ensure_ascii=False)
if response_row_count is not None:
external_record.response_row_count = response_row_count
if error_stack:
external_record.error_stack = error_stack
await session.commit()
logger.info(f"更新外部任务记录状态成功: req_code={req_code}, status={task_status}")
return True
except Exception as e:
logger.error(f"更新外部任务记录状态失败: {str(e)}, req_code={req_code}")
return False
@staticmethod
async def get_external_task_record(req_code: str) -> Optional[VWEDExternalTaskRecord]:
"""
根据ReqCode获取外部任务记录
Args:
req_code: 请求标识码
Returns:
Optional[VWEDExternalTaskRecord]: 外部任务记录或None
"""
try:
async with get_async_session() as session:
query = select(VWEDExternalTaskRecord).where(
VWEDExternalTaskRecord.req_code == req_code
).order_by(VWEDExternalTaskRecord.created_at.desc()).limit(1)
result = await session.execute(query)
return result.scalar_one_or_none()
except Exception as e:
logger.error(f"获取外部任务记录失败: {str(e)}, req_code={req_code}")
return None
@staticmethod
async def get_related_tasks(req_code: str) -> List[VWEDExternalTaskRecord]:
"""
获取关联的任务记录通过req_code和related_req_code关联
Args:
req_code: 请求标识码
Returns:
List[VWEDExternalTaskRecord]: 关联的任务记录列表
"""
try:
async with get_async_session() as session:
query = select(VWEDExternalTaskRecord).where(
or_(
VWEDExternalTaskRecord.req_code == req_code,
VWEDExternalTaskRecord.related_req_code == req_code
)
)
result = await session.execute(query)
return result.scalars().all()
except Exception as e:
logger.error(f"获取关联任务记录失败: {str(e)}, req_code={req_code}")
return []
@staticmethod
async def get_task_records_by_task_code(task_code: str) -> List[VWEDExternalTaskRecord]:
"""
根据TaskCode获取任务记录
Args:
task_code: 任务代码
Returns:
List[VWEDExternalTaskRecord]: 任务记录列表
"""
try:
async with get_async_session() as session:
query = select(VWEDExternalTaskRecord).where(
VWEDExternalTaskRecord.req_code == task_code
)
result = await session.execute(query)
return result.scalars().all()
except Exception as e:
logger.error(f"根据TaskCode获取任务记录失败: {str(e)}, task_code={task_code}")
return []
@staticmethod
async def check_task_completion_status(task_record_id: str) -> Optional[Dict[str, Any]]:
"""
检查任务是否完成通过内部任务记录ID查询
Args:
task_record_id: 内部任务记录ID
Returns:
Optional[Dict[str, Any]]: 任务状态信息或None
"""
try:
# 这里需要查询内部任务记录表来获取任务状态
# 可以根据实际需求实现具体的查询逻辑
from data.models.taskrecord import VWEDTaskRecord
async with get_async_session() as session:
query = select(VWEDTaskRecord).where(
VWEDTaskRecord.id == task_record_id
)
result = await session.execute(query)
task_record = result.scalar_one_or_none()
if not task_record:
return None
return {
"task_record_id": task_record_id,
"status": task_record.status,
"ended_on": task_record.ended_on,
"ended_reason": task_record.ended_reason,
"state_description": task_record.state_description
}
except Exception as e:
logger.error(f"检查任务完成状态失败: {str(e)}, task_record_id={task_record_id}")
return None