197 lines
8.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import asyncio
from typing import Dict, Any
async def test1(a: int, b: int) -> int:
return {"name": a + b}
def name1():
print('=====')
async def validate_task_condition(function_args: Dict[str, Any]) -> Dict[str, Any]:
"""
任务状态验证功能,用于验证关联任务的状态
Args:
function_args: 包含以下参数的字典
- task_code: 任务代码,用于查询外部任务记录
- task_type: 任务类型,用于判断验证逻辑
- end_node: 终点节点仅对GT类型任务需要
Returns:
Dict[str, Any]: 验证结果
"""
from services.external_task_record_service import ExternalTaskRecordService
from services.task_record_service import TaskRecordService
from data.session import get_async_session
from data.models.operate_point_layer import OperatePointLayer
from data.enum.task_record_enum import TaskStatus
from sqlalchemy import select
from utils.logger import get_logger
logger = get_logger("scripts.user_save.test1")
# print(function_args, "=========================")
try:
# 获取参数
task_code = function_args.get('task_code')
task_type = function_args.get('task_type')
end_node = function_args.get('end_node')
if not task_code:
return {
"success": False,
"message": "task_code参数为空"
}
if not task_type:
return {
"success": False,
"message": "task_type参数为空"
}
# 定义任务类型模板映射
TASK_TYPE_TEMPLATE_MAPPING = {
"GG2MP": "GG",
"GGFK2MP": "GG",
"GT2MP": "GT",
"GTFK2MP": "GT",
"ZG2MP": "ZG",
"QZ2MP": "QZ",
"LG2MP": "LG",
"PHZ2MP": "PHZ",
"MP2GG": "GG",
"MP2GGFK": "GG",
"MP2GT": "GT",
"MP2GTFK": "GT",
"MP2ZG": "ZG",
"MP2QZ": "QZ",
"MP2LG": "LG",
"MP2PHZ": "PHZ"
}
# 根据TaskCode查询external_task_record表获取task_record_id
external_records = await ExternalTaskRecordService.get_task_records_by_task_code(task_code)
logger.info(f"系统相关记录: {external_records}")
if not external_records:
return {
"success": False,
"message": f"找不到TaskCode={task_code}对应的叫料任务记录,无法监控叫料任务状态"
}
# 获取最新的记录
latest_record = max(external_records, key=lambda x: x.created_at)
if not latest_record.task_record_id:
return {
"success": False,
"message": "叫料任务记录对应关键字task_record_id值为空"
}
# 获取TaskType对应的模板类型
template_type = TASK_TYPE_TEMPLATE_MAPPING.get(task_type, "")
logger.info(f"TaskCode={task_code}, TaskType={task_type}, TemplateType={template_type}")
# 如果是GT类型需要验证end_node库位是否解锁
if template_type == "GT":
if not end_node:
return {
"success": False,
"message": "GT类型任务需要提供end_node参数"
}
logger.info(f"GT类型任务需要验证end_node库位解锁状态: TaskCode={task_code}")
# 验证end_node对应的库位是否解锁
while True:
try:
async with get_async_session() as session:
# 查询end_node对应的库位锁定状态
stmt = select(OperatePointLayer).where(
OperatePointLayer.layer_name == end_node,
OperatePointLayer.is_deleted == False
).limit(1)
result = await session.execute(stmt)
end_layer = result.scalar_one_or_none()
task_detail_result = await TaskRecordService.get_task_record_detail(
latest_record.task_record_id)
task_detail = task_detail_result.get("data", {})
task_status = task_detail.get("status", "")
if task_status == TaskStatus.CANCELED:
return {
"success": True,
"message": f"任务被取消: TaskCode={task_code}, Status={task_status}"
}
if end_layer:
if not end_layer.is_locked:
logger.info(f"GT类型任务end_node库位已解锁可以执行: TaskCode={task_code}, end_node={end_node}")
return {
"success": True,
"message": f"GT类型任务验证通过end_node库位已解锁: {end_node}"
}
else:
logger.info(f"GT类型任务end_node库位被锁定等待解锁: TaskCode={task_code}, end_node={end_node}, locked_by={end_layer.locked_by}")
await asyncio.sleep(2) # 等待2秒后重试
else:
logger.warning(f"GT类型任务未找到end_node对应的库位继续执行: TaskCode={task_code}, end_node={end_node}")
return {
"success": True,
"message": f"GT类型任务验证通过未找到对应库位继续执行: {end_node}"
}
except Exception as e:
logger.error(f"GT类型任务检查end_node库位锁定状态时出现异常: {str(e)}, TaskCode={task_code}, end_node={end_node}")
await asyncio.sleep(2) # 等待2秒后重试
else:
# 非GT类型需要等待任务完成
logger.info(f"非GT类型任务需要等待关联任务完成: TaskCode={task_code}")
wait_count = 0
while True:
# 调用get_task_record_detail查询任务运行状态
task_detail_result = await TaskRecordService.get_task_record_detail(latest_record.task_record_id)
if task_detail_result.get("success", False):
task_detail = task_detail_result.get("data", {})
task_status = task_detail.get("status", "")
logger.info(f"检查任务状态: TaskCode={task_code}, Status={task_status}, WaitCount={wait_count}")
# 如果任务已完成(成功)
if task_status == TaskStatus.COMPLETED:
logger.info(f"关联任务已完成继续执行AGV调度任务: TaskCode={task_code}")
return {
"success": True,
"message": f"任务验证通过,关联任务已完成: {task_code}"
}
# 如果任务已失败
elif task_status == TaskStatus.FAILED:
logger.error(f"关联任务执行失败: TaskCode={task_code}, Status={task_status}")
return {
"success": False,
"message": f"关联任务执行失败: TaskCode={task_code}, Status={task_status}"
}
elif task_status == TaskStatus.CANCELED:
return {
"success": True,
"message": f"任务被取消: TaskCode={task_code}, Status={task_status}"
}
# 任务还在运行中,继续等待
else:
logger.info(f"任务仍在执行中,继续等待: TaskCode={task_code}, Status={task_status}")
await asyncio.sleep(1) # 等待1秒
wait_count += 1
else:
logger.warning(f"无法获取任务详情,继续等待: TaskCode={task_code}, TaskRecordId={latest_record.task_record_id}")
await asyncio.sleep(1) # 等待1秒
wait_count += 1
except Exception as e:
logger.error(f"任务状态验证异常: {str(e)}")
return {
"success": False,
"message": f"任务状态验证异常: {str(e)}"
}