using HslCommunication;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.Tools;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Services;
using WIDESEA_Services.IRepositories;
using WIDESEA_Services.Repositories;
using WIDESEA_Services.Services;
using WIDESEA_WCS.WCSClient;
namespace WIDESEA_WCS.Jobs.ConveyorLine.OutboundArea
{
public partial class OutboundAreaDispatch
{
///
/// 出库区空托盘回库
///
///
///
//public static void ReInboundRequestStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client, string barcode)
//{
// try
// {
// //查询任务
// Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode && r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString());
// if (null == wcsInfo)
// {
// //当前存在未完成的任务
// wcsInfo = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint));
// if (null != wcsInfo)
// return;
// //申请入库任务
// WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
// if (content.Status)
// {
// WmsTaskInfo wmsTask = JsonConvert.DeserializeObject(content.Data.ToString());
// wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
// taskWCSinfoRepository.Add(wcsInfo, true);
// }
// else
// throw new Exception("入库申请失败:" + content.Message);
// }
// string lineCode = "ReIboundArea";
// if (null != wcsInfo)
// {
// //读取逻辑控制值
// int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
// if ((logicValue == 1 || logicValue == 2))
// {
// WriteTaskInfo.WriteTaskInfoAction(wcsInfo, client, lineCode);
// }
// string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString();
// if (!wcsInfo.wcstask_barcode.Equals(rfidResult))
// return;
// logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
// //说明站台已经收到任务数据,等待WCS的启动指令
// if (logicValue == 3)
// {
// //启动任务
// client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1);
// }
// else if (logicValue == 4 || logicValue == 5)
// {
// //提升机执行中
// if (wcsInfo.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())
// return;
// if (!WriteRGVState(client, true))
// return;
// wcsInfo.wcstask_state = TaskState.TaskState_HoisterExecuting.ToString();
// wcsInfo.wcstask_dispatcherTime = DateTime.Now;
// taskWCSinfoRepository.Update(wcsInfo, true);
// }
// }
// }
// catch (Exception ex)
// {
// WriteLog.Info(ReInboundRequestStationNo).Write($"{ DateTime.Now }回库站台调度失败:{ex.Message}", ReInboundRequestStationNo);
// }
//}
//获取任务,生成入库任务
public static void RGV_InboundKTP(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
{
Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.Find(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint) && r.wcstask_type ==
TaskType.TaskType_Empty_Pallet_Inbound.ToString() && r.wcstask_state == TaskState.TaskState_Empty_In_PLC_Finished.ToString()).OrderBy(x => x.wcstask_dispatcherTime).FirstOrDefault();
if (inboundTask != null)
{
//判断是否有货,有托盘条码
string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), inboundTask.wcstask_startLocation).ToString();
bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), inboundTask.wcstask_startLocation).ToString());
if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load && inboundTask.wcstask_barcode== barcode)
{
//查找是否有该托盘条码任务,如果没有则进行添加RGV任务
Dt_TaskRGVinfo rgvInfo = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == inboundTask.wcstask_barcode
&& r.rgvtask_wcsTaskNumber == inboundTask.wcstask_taskNumber);
if (null == rgvInfo)
{
string rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
rgvInfo = GetRGVTask(taskRGVinfoRepository, inboundTask, rgvTaskType);
taskRGVinfoRepository.Add(rgvInfo, true);
inboundTask.wcstask_state = TaskState.TaskState_RGV_Received.ToString();
taskWCSinfoRepository.Update(inboundTask, x => x.wcstask_state, true);
}
}
}
}
//空托盘入库任务下发判断
public static void ReInboundKTP(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client)
{
try
{
//获取是否有货
bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString());
string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load)
{
//根据对应的托盘条码进行去下发任务
Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.Find(r => r.wcstask_barcode == barcode).Where(r => r.wcstask_type ==
TaskType.TaskType_Empty_Pallet_Inbound.ToString() && (r.wcstask_state == TaskState.TaskState_Assigned.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())).FirstOrDefault();
if(inboundTask != null)
{
if(inboundTask.wcstask_state== TaskState.TaskState_Assigned.ToString())
{
ReInAssignedKTP(taskWCSinfoRepository, client, inboundTask);
}
else
{
ReInboundRequestStationAction(taskWCSinfoRepository, client, inboundTask);
}
}
}
}
catch (Exception ex)
{
WriteLog.Info(ReInboundRequestStationNo).Write($"{DateTime.Now}回库站台任务下发,调度失败:{ex.Message}", ReInboundRequestStationNo);
throw;
}
}
public static void ReInAssignedKTP(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client, Dt_TaskWCSinfo wcsInfo)
{
try
{
//获取车轴出库
List executingTask = taskWCSinfoRepository.Find(r => (r.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString()) ||
r.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString())) && endStationNo.Contains(r.wcstask_endPoint));
//获取有多少条出库的任务
int LineExecucount = executingTask.Count(x => x.wcstask_state == TaskState.TaskState_Box_Out_Line_Executing.ToString());
if (LineExecucount >= 4)
{
//判断是否有对应层的出库任务,
int Assrscount = executingTask.Count(x => x.wcstask_endLocation == wcsInfo.wcstask_startLocation && (x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
|| x.wcstask_state == TaskState.TaskState_Assigned.ToString()));
if (Assrscount == 0)
{
ReInboundRequestStationAction(taskWCSinfoRepository, client, wcsInfo);
}
}
else
{
//判断有多少条在缓存架的
int RGV_Finishedcount = executingTask.Count(x => x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
&& x.wcstask_state != TaskState.TaskState_Assigned.ToString());
if (RGV_Finishedcount == 0)
{
//可以进行判断下发入库任务
int Assrscount = executingTask.Count(x => x.wcstask_endLocation == wcsInfo.wcstask_startLocation && (x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
|| x.wcstask_state == TaskState.TaskState_Assigned.ToString()));
if (Assrscount == 0)
{
ReInboundRequestStationAction(taskWCSinfoRepository, client, wcsInfo);
}
}
}
}
catch (Exception ex)
{
WriteLog.Info(ReInboundRequestStationNo).Write($"{DateTime.Now}回库站台任务下发,调度失败:{ex.Message}", ReInboundRequestStationNo);
throw;
}
}
public static void ReInboundRequestStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client, Dt_TaskWCSinfo wcsInfo)
{
try
{
string lineCode = "ReIboundArea";
if (null != wcsInfo)
{
//读取逻辑控制值
int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
if ((logicValue == 1 || logicValue == 2))
{
WriteTaskInfo.WriteTaskInfoAction(wcsInfo, client, lineCode);
}
string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString();
if (!wcsInfo.wcstask_barcode.Equals(rfidResult))
return;
logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
//说明站台已经收到任务数据,等待WCS的启动指令
if (logicValue == 3)
{
//启动任务
bool logicbool= client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1);
if (logicbool)
{
if (wcsInfo.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())
return;
wcsInfo.wcstask_state = TaskState.TaskState_HoisterExecuting.ToString();
wcsInfo.wcstask_dispatcherTime = DateTime.Now;
taskWCSinfoRepository.Update(wcsInfo, true);
}
}
else if (logicValue == 4 || logicValue == 5)
{
//提升机执行中
if (wcsInfo.wcstask_state == TaskState.TaskState_Empty_In_PLC_Finished.ToString())
return;
wcsInfo.wcstask_state = TaskState.TaskState_Empty_In_PLC_Finished.ToString();
wcsInfo.wcstask_dispatcherTime = DateTime.Now;
taskWCSinfoRepository.Update(wcsInfo, true);
}
}
}
catch (Exception ex)
{
WriteLog.Info(ReInboundRequestStationNo).Write($"{ DateTime.Now }回库站台调度失败:{ex.Message}", ReInboundRequestStationNo);
}
}
}
}