2025-08-13 15:27:04 +08:00
|
|
|
|
import asyncio
|
|
|
|
|
from typing import Dict, Any
|
|
|
|
|
|
|
|
|
|
async def test1(a: int, b: int) -> int:
|
|
|
|
|
return {"name": a + b}
|
2025-04-30 16:57:46 +08:00
|
|
|
|
|
|
|
|
|
def name1():
|
2025-08-13 15:27:04 +08:00
|
|
|
|
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)}"
|
|
|
|
|
}
|