using HslCommunication;
using Newtonsoft.Json;
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
{
///
/// 出库的层
///
private static List OutboundStationLayerNo = new List() { "60100", "60200", "60300", "60400", "60500", "60600", "60700"};
//入库托盘申请站台
private static string ReInboundRequestStationNo = "90101";
//出库站台交互
//private static string OutboundStationNo = "90201";
//提升机编号
private static string hoisterResultNo = "90100";
///
/// 出库区调度
///
///
///
public static string currentModel = "Inbound";
static int flag = 0;
public static void OutboundAreaDispathAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
{
try
{
//出库完成
OutboundCompleteAction(taskWCSinfoRepository, client); //压装出库口任务完成
//空托入库申请
InboundRequestAction(taskWCSinfoRepository, taskRGVinfoRepository, client);
//测试阶段注释的内容(后续需要使用的)
//增加补丁.增加车存储中有问题.再写
/*int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), "OutboundArea").ToString());
if (logicValue == 4)
{
string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), "OutboundArea").ToString();
if (!string.IsNullOrEmpty(rfidResult) && !"0".Equals(rfidResult))
{
Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == rfidResult
&& (r.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString()
|| r.wcstask_state == TaskState.TaskState_Box_Out_Line_Executing.ToString()));
if (null != wcsInfo)
{
//提升机层
string hoisterLayer = client.ReadValue(CLineInfoDBName.R_Line_Layer.ToString(), hoisterResultNo).ToString();
string[] locationArray = wcsInfo.wcstask_startLocation.Split('-');
if (int.Parse(locationArray[0]).ToString() == hoisterLayer)
{
Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == wcsInfo.wcstask_barcode);
if (null == rgvTask)
{
flag++;//避免刚完成重复写
if (flag == 10)
{
WriteRGVState(client, false);
WriteRGVState(client, true);
flag = 0;
return;
}
}
}
}
}
}
else
{
flag = 0;
}*/
//测试阶段注释的内容*/
//查询出库至压装台的任务有多少进行中
List executingTask = taskWCSinfoRepository.Find(r => (r.wcstask_state != TaskState.TaskState_Assigned.ToString()
&& (OutboundStationLayerNo.Contains(r.wcstask_startPoint) || OutboundStationLayerNo.Contains(r.wcstask_endPoint))));
if (executingTask.Count < 4)
{
//直接将任务添加到AGV任务
Dt_TaskWCSinfo outboundTask = GetOutboundTask(taskWCSinfoRepository, client);
if (null != outboundTask)
{
//查找是否有该托盘条码任务,如果没有则进行添加RGV任务
Dt_TaskRGVinfo rgvInfo = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == outboundTask.wcstask_barcode
&& r.rgvtask_wcsTaskNumber == outboundTask.wcstask_taskNumber);
if (null == rgvInfo)
{
string rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
//空托盘回库
if (outboundTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString()))
rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
//轴承出库
else if (outboundTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString())
|| outboundTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString()))
rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString();
rgvInfo = GetRGVTask(taskRGVinfoRepository, outboundTask, rgvTaskType);
taskRGVinfoRepository.Add(rgvInfo, true);
outboundTask.wcstask_state = TaskState.TaskState_RGV_Received.ToString();
taskWCSinfoRepository.Update(outboundTask, x => x.wcstask_state, true);
}
}
}
//提升机运行的任务
Dt_TaskWCSinfo hisTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()
&& (OutboundStationLayerNo.Contains(r.wcstask_startPoint) || OutboundStationLayerNo.Contains(r.wcstask_endPoint)));
if (null != hisTask)
{
string[] locationArray = null;
//空托盘回库
if (hisTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString()))
{
locationArray = hisTask.wcstask_endLocation.Split('-');
//RGV上报取货完成直接执行下一个
Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == hisTask.wcstask_taskNumber);
if (null != rgvTask && "2" == rgvTask.rgvtask_backup_2)
{
if (rgvTask.rgvtask_taskType.Contains(RGVTaskType.RgvTaskType_Inbound.ToString()))
{
Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint) && r.wcstask_type ==
TaskType.TaskType_Empty_Pallet_Inbound.ToString() && r.wcstask_state == TaskState.TaskState_RGV_Received.ToString());
if (null != inboundTask)
ReInboundRequestStationAction(taskWCSinfoRepository, client, inboundTask);
else
OutboundRequestAction(taskWCSinfoRepository, client);
return;
}
}
string hoisterTaskNumber = client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), hoisterResultNo).ToString();
string hoisterBarcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), hoisterResultNo).ToString();
//避免提升机还没取就停止了
if (string.IsNullOrEmpty(hoisterTaskNumber) || string.IsNullOrEmpty(hoisterBarcode))
return;
}
//轴承出库
else if (hisTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString()) || hisTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString()))
{
locationArray = hisTask.wcstask_startLocation.Split('-');
}
}
else
{
Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint) && r.wcstask_type ==
TaskType.TaskType_Empty_Pallet_Inbound.ToString() && r.wcstask_state == TaskState.TaskState_RGV_Received.ToString());
if (null != inboundTask)
ReInboundRequestStationAction(taskWCSinfoRepository, client, inboundTask);
else
OutboundRequestAction(taskWCSinfoRepository, client); //提升机出库的流程
}
}
catch (Exception ex)
{
WriteLog.Info("OutboundArea").Write($"{ DateTime.Now }出库区域调度失败:{ex.Message}", "OutboundArea");
}
}
public static bool WriteRGVState(PLCClient client, bool value)
{
client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), value);
string rel = string.Empty;
for (int i = 0; i < 50; i++)
{
rel = client.ReadValue(CLineInfoDBName.W_System_RGVState.ToString()).ToString();
if (value == bool.Parse(rel))
break;
else
{
client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), value);
Thread.Sleep(88);
}
}
rel = client.ReadValue(CLineInfoDBName.W_System_RGVState.ToString()).ToString();
if (value != bool.Parse(rel))
Console.Out.WriteLine($"{DateTime.Now}写入车存储中{value}失败.");
return bool.Parse(rel);
}
///
/// 查询是否有可出的出库任务
///
///
///
///
public static Dt_TaskWCSinfo GetOutboundTask(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client)
{
Dt_TaskWCSinfo wcsInfo = null;
List listTask = taskWCSinfoRepository.Find(r => r.wcstask_state == TaskState.TaskState_Assigned.ToString() &&
(r.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || r.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString())
&& OutboundStationLayerNo.Contains(r.wcstask_startPoint)).OrderBy(r => r.wcstask_createTime).ToList();//
foreach (var item in listTask.GroupBy(r => r.wcstask_endPoint))
{
Dt_TaskWCSinfo wcsTask = item.OrderBy(r => r.wcstask_createTime).FirstOrDefault();
if (null != wcsTask)
{
//判断压装台是否有货
bool yzflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), wcsTask.wcstask_endPoint).ToString());
bool yznoflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), wcsTask.wcstask_endPoint).ToString());
if (!yzflag || yznoflag)
continue;
//判断缓存架是否有货
bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), wcsTask.wcstask_startPoint).ToString());
bool noflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), wcsTask.wcstask_startPoint).ToString());
if (!flag || noflag)
continue;
//同一层有执行中的任务不添加
Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => (r.wcstask_startPoint == wcsTask.wcstask_startPoint || r.wcstask_endPoint == wcsTask.wcstask_endPoint)
&& (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
if (null != executingTask)
continue;
List listTarget = taskWCSinfoRepository.Find(r => r.wcstask_endPoint == wcsTask.wcstask_endPoint &&
r.wcstask_state != TaskState.TaskState_Assigned.ToString());
string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), wcsTask.wcstask_endPoint).ToString();
if (string.IsNullOrEmpty(barcode) || "0".Equals(barcode))
{
if (null != listTarget && listTarget.Count > 1)
continue;
else
{
wcsInfo = wcsTask;
break;
}
}
else
{
if (null != listTarget && listTarget.Count > 0)
continue;
else
{
wcsInfo = wcsTask;
break;
}
}
}
}
//foreach (var item in listTask)
//{
// //同一层有执行中的任务不添加
// Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => (r.wcstask_startPoint == item.wcstask_startPoint || r.wcstask_endPoint == item.wcstask_endPoint)
// && (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
// if (null != executingTask)
// continue;
// //同一目标位置的不能同时出
// // Dt_TaskWCSinfo endTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_endPoint == item.wcstask_endPoint &&
// //(r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
// // if (null != endTask)
// // continue;
// List listTarget = taskWCSinfoRepository.Find(r => r.wcstask_endPoint == item.wcstask_endPoint &&
// r.wcstask_state != TaskState.TaskState_Assigned.ToString());
// string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.wcstask_endPoint).ToString();
// if (string.IsNullOrEmpty(barcode) || "0".Equals(barcode))
// {
// if (null != listTarget && listTarget.Count > 1)
// continue;
// else
// {
// wcsInfo = item;
// break;
// }
// }
// else
// {
// if (null != listTarget && listTarget.Count > 0)
// continue;
// else
// {
// wcsInfo = item;
// break;
// }
// }
//}
return wcsInfo;
}
public static Dt_TaskRGVinfo GetRGVTask(IDt_TaskRGVinfoRepository taskRGVinfoRepository, Dt_TaskWCSinfo wcsTask, string rgvTaskType)
{
Dt_TaskRGVinfo rgvInfo = new Dt_TaskRGVinfo();
rgvInfo.rgvtask_taskId = GetTaskNumber.GetRgvTaskNumber(taskRGVinfoRepository).ToString();
rgvInfo.rgvtask_taskType = rgvTaskType;
rgvInfo.rgvtask_taskStatus = RGVTaskState.RgvTaskState_Wait_Send.ToString();
rgvInfo.rgvtask_priorityCode = wcsTask.wcstask_grade.ToString();
rgvInfo.rgvtask_startNode = wcsTask.wcstask_startLocation;
rgvInfo.rgvtask_endNode = wcsTask.wcstask_endLocation;
rgvInfo.rgvtask_wcsTaskNumber = wcsTask.wcstask_taskNumber;
rgvInfo.rgvtask_barCode = wcsTask.wcstask_barcode;
rgvInfo.rgvtask_creator = wcsTask.wcstask_creator;
rgvInfo.rgvtask_msgTime = DateTime.Now;
rgvInfo.rgvtask_areaCode = "OutboundArea";
return rgvInfo;
}
public static void InboundRequestAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
{
try
{
string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString());
if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load)
{
Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode && r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString());
if (null == wcsInfo)
{
//有出库任务,不能下发
Dt_TaskRGVinfo executingRgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_areaCode == "OutboundArea"
&& OutboundStationLayerNo.Contains(r.rgvtask_endNode));
if (null != executingRgvTask)
return;
//当前存在未完成的任务 入库
wcsInfo = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint));
if (null != wcsInfo)
{
Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == wcsInfo.wcstask_taskNumber);
if (null != rgvTask)
{
//取货完成
if ("2" != rgvTask.rgvtask_backup_2)
return;
}
else
return;
}
//申请入库任务
WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
if (content.Status)
{
WmsTaskInfo wmsTask = JsonConvert.DeserializeObject(content.Data.ToString());
wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
string rgvTaskType = string.Empty;
if (wcsInfo.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString()))
rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
//轴承出库
else if (wcsInfo.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString())
|| wcsInfo.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString()))
rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString();
taskWCSinfoRepository.DbContextBeginTransaction(() =>
{
Dt_TaskRGVinfo rgvInfo = GetRGVTask(taskRGVinfoRepository, wcsInfo, rgvTaskType);
taskRGVinfoRepository.Add(rgvInfo, true);
wcsInfo.wcstask_state = TaskState.TaskState_RGV_Received.ToString();
taskWCSinfoRepository.Add(wcsInfo, true);
return content.OK();
});
}
else
throw new Exception("入库申请失败:" + content.Message);
}
}
}
catch (Exception ex)
{
Console.Out.WriteLine(DateTime.Now + ex.Message);
}
}
}
}