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)}" }