using HslCommunication;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WIDESEA_Common;
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.InboundArea
{
public partial class InboundAreaDispatch
{
public static string[] InboundStationNo = new string[] { "50301", "50302", "50303", "50304", "50305", "50306", "50307"};
public static void InboundStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
{
foreach (var item in InboundStationNo)
{
//bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString());
//if (!flag)
// continue;
InboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item);
MeasureOutboundStationComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, "Measure_O");
}
}
public static void InboundStationAction_YJ(IDt_TaskWCSinfoRepository taskWCSinfoRepository,
IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, bool leftState)
{
if (leftState)
{
foreach (var item in OutboundStationNo)
{
//bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString());
//if (!flag)
// continue;
InboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item);
MeasureOutboundStationComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, "Measure_O_YJ");//
}
}
else
{
foreach (var item in InboundStationNo)
{
//bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString());
//if (!flag)
// continue;
InboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item);
MeasureOutboundStationComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, "Measure_O");//_YJ
}
}
}
///
/// 入库任务到达线体完成
///
///
///
///
private static void InboundLineTaskComplete(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, string station)
{
try
{
int taskNumber = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), station).ToString());
string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), station).ToString();
bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), station).ToString());
if (!flag)
return;
Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_taskNumber == taskNumber && x.wcstask_barcode == barcode);
if (wcsInfo != null && (wcsInfo.wcstask_state != TaskState.TaskState_ConveyorLineFinish.ToString() && wcsInfo.wcstask_state != TaskState.TaskState_RGV_Received.ToString()))
{
var currentdt_taskinfo = taskWCSinfoRepository.DbContext.ChangeTracker.Entries().FirstOrDefault();
if (currentdt_taskinfo != null)
currentdt_taskinfo.State = EntityState.Detached;
//检查任务的目的货位的层数是否和站台层数一致
string toLayer = wcsInfo.wcstask_endLocation.Substring(0, 2);
string stationLayer = station.Substring(3, 2);
if (toLayer == stationLayer)
{
string state = string.Empty;
//空托和实托的入库
if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Inbound.ToString()
|| wcsInfo.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString()
|| wcsInfo.wcstask_type == TaskType.TaskType_ErrorCheckBackIn.ToString()
|| wcsInfo.wcstask_type == TaskType.TaskType_CheckBackIn.ToString()
)
state = TaskState.TaskState_ConveyorLineFinish.ToString();
//测量回库
else if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString() && wcsInfo.wcstask_state == TaskState.TaskState_Measure_Back_Line_Executing.ToString())
state = TaskState.TaskState_Measure_Back_Line_Finished.ToString();
WebResponseContent content = WMSApi.PostTaskStateToWMS(barcode, state);
if (content.Status)
{
Dt_TaskRGVinfo _tmpRgvInfo = taskRGVinfoRepository.FindFirst(x => x.rgvtask_barCode == wcsInfo.wcstask_barcode);
if (_tmpRgvInfo == null)
{
//在此生成RGV任务
Dt_TaskRGVinfo rgvInfo = new Dt_TaskRGVinfo();
rgvInfo.rgvtask_taskId = GetTaskNumber.GetRgvTaskNumber(taskRGVinfoRepository).ToString();
rgvInfo.rgvtask_taskType = RGVTaskType.RgvTaskType_Inbound.ToString();
rgvInfo.rgvtask_taskStatus = RGVTaskState.RgvTaskState_Wait_Send.ToString();
rgvInfo.rgvtask_priorityCode = wcsInfo.wcstask_grade.ToString();
rgvInfo.rgvtask_startNode = station;
rgvInfo.rgvtask_endNode = wcsInfo.wcstask_endLocation;
rgvInfo.rgvtask_wcsTaskNumber = wcsInfo.wcstask_taskNumber;
rgvInfo.rgvtask_barCode = wcsInfo.wcstask_barcode;
rgvInfo.rgvtask_msgTime = DateTime.Now;
rgvInfo.rgvtask_areaCode = "InboundArea";
taskRGVinfoRepository.Add(rgvInfo, true);
}
wcsInfo.wcstask_state = state;
wcsInfo.wcstask_dispatcherTime = DateTime.Now;
taskWCSinfoRepository.Update(wcsInfo, true);
}
}
else
{
string str = $"{DateTime.Now}托盘号:{barcode},入库口检查失败:任务层{toLayer},站台层{stationLayer}";
WriteLog.Info(station).Write(str, station);
}
}
}
catch (Exception ex)
{
WriteLog.Info(station).Write($"{ DateTime.Now }入库任务到达线体完成调度失败:{ex.Message}", station);
}
}
///
/// 出库测量任务,当穿梭车放货后的处理逻辑
///
///
///
///
///
private static void MeasureOutboundStationComplete(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, string station, string lineCode)
{
try
{
var currentdt_taskinfo = taskWCSinfoRepository.DbContext.ChangeTracker.Entries().FirstOrDefault();
if (currentdt_taskinfo != null)
currentdt_taskinfo.State = EntityState.Detached;
//找对应任务类型:TaskType_Box_Pallet_Measure_Out,并且状态为TaskState_RGV_Finished的任务
Dt_TaskWCSinfo taskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() &&
x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString() && x.wcstask_startPoint.Contains(station));
if (null == taskWCSinfo)
{
//bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), station).ToString());
//if (flag)
//{
// Dt_TaskWCSinfo executing = taskWCSinfoRepository.FindFirst(x => x.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() &&
// x.wcstask_state == TaskState.TaskState_Measure_Out_Line_Executing.ToString() && x.wcstask_startPoint.Contains(station));
//}
return;
}
//string lineCode = "Measure_O";
int taskNumber = taskWCSinfo.wcstask_taskNumber;
//查看线体状态,准备给线体下发任务信息 读取逻辑控制值
int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
//说明工位在等待调度,准备下发任务
if (logicValue == 1 || logicValue == 2)
{
if (!taskWCSinfo.wcstask_state.Contains("Executing"))
WriteTaskInfo.WriteTaskInfoAction(taskWCSinfo, client, lineCode);
}
string barcode = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString();
if (!taskWCSinfo.wcstask_barcode.Equals(barcode))
return;
logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
if (logicValue == 3)
{
//启动任务
client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1);
}
else if (logicValue == 4 || logicValue == 5)
{
if (taskWCSinfo.wcstask_state == TaskState.TaskState_ConveyorLineExecuting.ToString())
return;
string str = string.Empty;
//启动成功后,在此更新任务状态、上报WMS任务状态
WebResponseContent content = WMSApi.PostTaskStateToWMS(taskWCSinfo.wcstask_barcode, TaskState.TaskState_Measure_Out_Line_Executing.ToString());
if (content.Status)
{
taskWCSinfo.wcstask_state = TaskState.TaskState_Measure_Out_Line_Executing.ToString();
taskWCSinfo.wcstask_dispatcherTime = DateTime.Now;
taskWCSinfoRepository.Update(taskWCSinfo, true);
str = $" { DateTime.Now }上报WMS更新任务状态成功【TaskState_Measure_Out_Line_Executing】,托盘号:{taskWCSinfo.wcstask_barcode},任务号:{ taskWCSinfo.wcstask_taskNumber}";
}
else
str = $" { DateTime.Now }上报WMS更新任务状态失败【TaskState_Measure_Out_Line_Executing】,托盘号:{taskWCSinfo.wcstask_barcode},任务号:{ taskWCSinfo.wcstask_taskNumber},原因:{content.Message}";
WriteLog.Info(station).Write(str, station);
}
}
catch (Exception ex)
{
WriteLog.Info(station).Write($"{ DateTime.Now }测量出库起始站台调度失败:{ex.Message}", station);
}
}
}
}