using HslCommunication;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.CustomModels.RGVModel;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Services;
using WIDESEA_Services.IRepositories;
using WIDESEA_Services.Repositories;
using WIDESEA_Services.Services;
using WIDESEA_Services.Services.APIInvoke.RGV;
using WIDESEA_WCS.Jobs;
using WIDESEA_Common.Tools;
using WIDESEA_WCS.WCSClient;
using static WIDESEA_Entity.CustomModels.RGVModel.RgvSendTaskModel;
using static WIDESEA_Entity.CustomModels.RGVModel.RgvDeviceStatusModel;
using WIDESEA_Core.Services;
using WIDESEA_Core.Enums;
namespace WIDESEA_WCS
{
[DisallowConcurrentExecution]
public partial class RgvDispatchJob : JobBase, IJob
{
///
/// RGV(有轨小车)调度
///
///
///
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
var executeLog = ExecuteJob(context, () => Run(context));
});
}
public string Run(IJobExecutionContext context)
{
using (VOLContext dbCcontext = new VOLContext())
{
WebResponseContent content = new WebResponseContent();
IDt_TaskRGVinfoRepository taskRGVinfoRepository = new Dt_TaskRGVinfoRepository(dbCcontext);
IDt_TaskWCSinfoRepository taskWCSinfoRepository = new Dt_TaskWCSinfoRepository(dbCcontext);
//查看PLC连接的情况
PLCClient client = WCSService.Clients.Find(r => r.PLCName == "LineDevice");
if (!client.IsConnected)
{
// Console.WriteLine("RGV无法调度,线体PLC与WCS系统断开了连接");
return "RGV无法调度,线体PLC与WCS系统断开了连接";
}
//发送任务之前,看是否有小车可用
content = RGVAPIInvokeGetRgvInfo.GetRgvInfo();
if (!content.Status)
return $"获取小车状态出错,原因:{content.Message}";
RgvDeviceStatusModel rgvData = (RgvDeviceStatusModel)content.Data;
int carCount = 0;
List currentLayer = new List();
foreach (var item in rgvData.data)
{
//0离线 1正常 2故障
if (item.status != 1)
carCount++;
else
currentLayer.Add(item.layer);
}
if (carCount == 3)
{
Console.WriteLine($"当前无小车可用,无法下发任务");
return $"当前无小车可用,无法下发任务";
}
//找等待下发的任务
List rgvTaskList = taskRGVinfoRepository.Find(x => x.rgvtask_taskStatus == RGVTaskState.RgvTaskState_Wait_Send.ToString()).OrderBy(r => r.rgvtask_msgTime).ToList();
if (null != rgvTaskList && rgvTaskList.Count > 0)
{
//暂时注释
int modelValue = int.Parse(client.ReadValue(CLineInfoDBName.R_System_Inline_Run_Model.ToString(), "System").ToString());
//1=手动 2=单机 3=联机
if (modelValue != 3)
rgvTaskList = rgvTaskList.Where(r => r.rgvtask_areaCode != "InboundArea").ToList();
modelValue = int.Parse(client.ReadValue(CLineInfoDBName.R_System_Inline_Run_Model.ToString(), "OutSystem").ToString());
if (modelValue != 3)
rgvTaskList = rgvTaskList.Where(r => r.rgvtask_areaCode != "OutboundArea").ToList();
if (null != rgvTaskList)
{
List listTask = new List();
//优先出库区
List outboundArea = rgvTaskList.FindAll(r => r.rgvtask_areaCode != "InboundArea");
if (outboundArea.Count > 0)
listTask.AddRange(outboundArea);
List inboundArea = rgvTaskList.FindAll(r => r.rgvtask_areaCode != "OutboundArea");
if (inboundArea.Count > 0)
{
int layer = 0;
List layerTask = new List();
List ortherTask = new List();
foreach (var item in inboundArea)
{
if (item.rgvtask_taskType.Equals(RGVTaskType.RgvTaskType_Inbound.ToString()))
layer = int.Parse(item.rgvtask_startNode.Split('-')[0]);
else if (item.rgvtask_taskType.Equals(RGVTaskType.RgvTaskType_Outbound.ToString()))
layer = int.Parse(item.rgvtask_endNode.Split('-')[0]);
if (currentLayer.Contains(layer))
layerTask.Add(item);
else
ortherTask.Add(item);
}
if (layerTask.Count > 0)
listTask.AddRange(layerTask);
if (ortherTask.Count > 0)
listTask.AddRange(ortherTask);
}
rgvTaskList = listTask;
}
foreach (var rgvTask in rgvTaskList)
{
//找到RGV任务对应的WCS任务,看是否有会冲突的任务发生,如果有?先不下发:下发
//比如有一个入库任务正在执行,目的站台为:050301,那么走050301的出库测量任务RGV段的则不能下发,避免冲突
Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_taskNumber == rgvTask.rgvtask_wcsTaskNumber);
if (null == wcsInfo)
{
//手动任务
if (rgvTask.rgvtask_wcsTaskNumber == 0 && rgvTask.rgvtask_taskId == "0")
SendRGVTaskAction(rgvTask, wcsInfo, taskRGVinfoRepository, taskWCSinfoRepository);
else
continue;
}
//再做一个保护,查看对应的放货站台上是有有货,即读取站台是否处于负载待机的状态,如果是,说明有东西
if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() ||
wcsInfo.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() ||
wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() ||
wcsInfo.wcstask_type == TaskType.TaskType_CheckOutbound.ToString() ||
//移库需要跨层
(wcsInfo.wcstask_type == TaskType.TaskType_MoveOutbound.ToString() && wcsInfo.wcstask_startPoint != wcsInfo.wcstask_endPoint)
)
{
//穿梭车放货站台
string targetStation = wcsInfo.wcstask_endLocation;
//判断有到当前放货位置的就不执行
Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_endPoint == targetStation && r.wcstask_id != wcsInfo.wcstask_id);
if (null != executingTask)
continue;
//if (rgvTask.rgvtask_areaCode.Equals("OutboundArea"))
//{
// //当前层有任务就不执行
// Dt_TaskRGVinfo rgvcurrentTask = taskRGVinfoRepository.FindFirst(r => (r.rgvtask_startNode == rgvTask.rgvtask_startNode ||
// rgvTask.rgvtask_endNode == r.rgvtask_endNode || rgvTask.rgvtask_startNode == r.rgvtask_endNode ||
// rgvTask.rgvtask_endNode == r.rgvtask_startNode) && r.rgvtask_taskStatus != RGVTaskState.RgvTaskState_Wait_Send.ToString());
// if (null != rgvcurrentTask)
// continue;
//}
if (rgvTask.rgvtask_areaCode.Equals("InboundArea") && !rgvTask.rgvtask_taskType.Equals(RGVTaskType.RgvTaskType_Inbound.ToString()))
{
//读取负载待机,有货
bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), rgvTask.rgvtask_endNode).ToString());
bool noflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), rgvTask.rgvtask_endNode).ToString());
if (flag || !noflag)
continue;
else
{
Dt_TaskRGVinfo currentTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_endNode == rgvTask.rgvtask_endNode && r.rgvtask_taskStatus != RGVTaskState.RgvTaskState_Wait_Send.ToString());
if (null != currentTask)
continue;
}
}
//此处查看当前正在进行的测量任务条数,需要控制数量,线体缓存数量有限,测量需要时间,暂定3个
if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
{
List measureList = taskWCSinfoRepository.Find(x =>
x.wcstask_state != TaskState.TaskState_Assigned.ToString() && (x.wcstask_endPoint == "10301" || x.wcstask_startPoint == "10301"));
if (measureList.Count > 1)//tx 0921 2->1
{
//说明测量任务达到上限值,需要等待
Console.WriteLine("当前执行的测量任务已达到上限,其它测量任务需等待");
continue;
}
}
}
SendRGVTaskAction(rgvTask, wcsInfo, taskRGVinfoRepository, taskWCSinfoRepository);
}
}
}
return "";
}
}
}