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
|
{
|
/// <summary>
|
/// 出库的层
|
/// </summary>
|
private static List<string> OutboundStationLayerNo = new List<string>() { "60100", "60200", "60300", "60400", "60500", "60600", "60700"};
|
//入库托盘申请站台
|
private static string ReInboundRequestStationNo = "90101";
|
//出库站台交互
|
//private static string OutboundStationNo = "90201";
|
//提升机编号
|
private static string hoisterResultNo = "90100";
|
/// <summary>
|
/// 出库区调度
|
/// </summary>
|
/// <param name="taskWCSinfoRepository"></param>
|
/// <param name="client"></param>
|
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<Dt_TaskWCSinfo> 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);
|
}
|
/// <summary>
|
/// 查询是否有可出的出库任务
|
/// </summary>
|
/// <param name="taskWCSinfoRepository"></param>
|
/// <param name="client"></param>
|
/// <returns></returns>
|
public static Dt_TaskWCSinfo GetOutboundTask(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client)
|
{
|
Dt_TaskWCSinfo wcsInfo = null;
|
|
List<Dt_TaskWCSinfo> 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<Dt_TaskWCSinfo> 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<Dt_TaskWCSinfo> 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<WmsTaskInfo>(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);
|
}
|
}
|
}
|
}
|