From f02d3a8ffc05a10a64859b2a16d5d43c8abb0fb9 Mon Sep 17 00:00:00 2001
From: xiaojiao <xiaojiao@kaokeziliao.com>
Date: 星期一, 23 三月 2026 11:13:36 +0800
Subject: [PATCH] 北京回长沙的最终版
---
项目代码/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs | 511 ++++++++++++++++++++++++++++++++++----------------------
1 files changed, 310 insertions(+), 201 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs"
index 9feff89..28c3593 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs"
@@ -3,10 +3,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Reflection.Metadata;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
+using WIDESEA_Common.LogEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.Tools;
using WIDESEA_Core.Utilities;
@@ -24,8 +26,10 @@
/// <summary>
/// 鍑哄簱鐨勫眰
/// </summary>
- private static List<string> OutboundStationLayerNo = new List<string>() { "90100", "90200", "90300", "90400", "90500", "90600", "90700", "90800" };
- //鍏ュ簱鎵樼洏鐢宠绔欏彴
+ private static List<string> OutboundStationLayerNo = new List<string>() { "60101", "60102", "60103", "60104", "60105", "60106", "60107" };
+ /// <summary>
+ /// 鍏ュ簱鎵樼洏鐢宠绔欏彴
+ /// </summary>
private static string ReInboundRequestStationNo = "90101";
//鍑哄簱绔欏彴浜や簰
//private static string OutboundStationNo = "90201";
@@ -38,81 +42,111 @@
/// <param name="client"></param>
public static string currentModel = "Inbound";
static int flag = 0;
+ // 鍘嬭鍙扮紦瀛樹綅瀛楀吀
+ public static Dictionary<string, string> PlatformDict = new Dictionary<string, string>
+ {
+ ["70101"] = "80101",
+ ["70103"] = "80103",
+ ["70104"] = "80104",
+ ["70106"] = "80106"
+ };
+ // 鍑哄簱鍖哄煙鏍″噯缂撳瓨鏋舵牎鍑�
+ public static void OutboundAreaJZ(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
+ {
+ // 鍑哄簱鍖虹殑鍑哄簱浠诲姟 鍒扮紦瀛樻灦瀛愪簡 灏辫鎶婁换鍔″彿鍜屾墭鐩樺彿鍐欏叆鍒板搴斿眰鐨勭紦瀛樻灦
+ List<Dt_TaskWCSinfo> executingTasks = taskWCSinfoRepository.Find(r => (
+ r.wcstask_state == TaskState.TaskState_Box_Out_RGV_Finished.ToString() ||
+ r.wcstask_state == TaskState.TaskState_Empty_Out_RGV_Finished.ToString())
+ && endStationNo.Contains(r.wcstask_endPoint)).ToList();
+ foreach (var item in executingTasks)
+ {
+ bool LoadSleep = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item.wcstask_startPoint.ToString()).ToString());
+ int ReadNumber = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), item.wcstask_startPoint.ToString()).ToString());
+ int ReadBarcode = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.wcstask_startPoint.ToString()).ToString());
+ if (LoadSleep && (ReadNumber == 0 || ReadBarcode == 0))
+ {
+ //鍐欏叆鎵樼洏鏉$爜
+ bool writeTaskNumber = client.WriteValue(CLineInfoDBName.W_Line_TaskNumber.ToString(), item.wcstask_startPoint, item.wcstask_taskNumber);
+ bool writeBarcode = client.WriteValue(CLineInfoDBName.W_Line_Barcode.ToString(), item.wcstask_startPoint, item.wcstask_barcode);
+ }
+ }
+
+ foreach (var item in OutboundStationLayerNo)
+ {
+ bool LoadSleep = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item.ToString()).ToString());
+ int ReadNumber = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), item.ToString()).ToString());
+ int ReadBarcode = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.ToString()).ToString());
+
+ Dt_TaskWCSinfo dt_TaskWCSinfo = taskWCSinfoRepository.Find(r =>
+ r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString()
+ && r.wcstask_state == TaskState.TaskState_Assigned.ToString()
+ && r.wcstask_startPoint == 90101.ToString()
+ && r.wcstask_endPoint == item
+ && r.wcstask_barcode == ReadBarcode.ToString()
+ && r.wcstask_taskNumber == ReadNumber
+ ).FirstOrDefault();
+
+ if (LoadSleep && dt_TaskWCSinfo != null)
+ {
+ // 璇佹槑璐х墿宸茬粡鍒颁簡缂撳瓨鏋� 浣嗕换鍔$姸鎬佹病鏈夋敼鍙� 杩樻槸鏂板缓鐘舵�� 灏辫鏀逛负 TaskState.TaskState_Empty_In_PLC_Finished.ToString()
+ dt_TaskWCSinfo.wcstask_state = TaskState.TaskState_Empty_In_PLC_Finished.ToString();
+ taskWCSinfoRepository.Update(dt_TaskWCSinfo, true);
+ string str = $"鍑哄簱鍖哄煙 绌烘墭鐩樺洖搴� 鎵樼洏閮藉埌缂撳瓨鏋跺瓙 浣嗕换鍔$姸鎬佹病鍙� {DateTime.Now}銆恵dt_TaskWCSinfo.wcstask_state}銆戯紝鎵樼洏鍙�:{dt_TaskWCSinfo.wcstask_barcode},浠诲姟鍙凤細{dt_TaskWCSinfo.wcstask_taskNumber}";
+ LogRecord.WriteLog(LogEnum.Errer, str.ToString());
+ }
+ }
+
+ // 杩欓噷瑕佸啓涓�涓� 鏈変竴浜涙墭鐩樺凡缁忓嚭鍒板闈㈠幓浜� 浣嗙姸鎬佽繕鏄彁鍗囨満杩愯涓� 瀵艰嚧鍚庨潰鐨勫彂涓嶅嚭鍘�
+ Dt_TaskWCSinfo OutTask = taskWCSinfoRepository.Find(r =>
+ r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()
+ && endStationNo.Contains(r.wcstask_endPoint)
+ ).FirstOrDefault();
+ if (OutTask != null)
+ {
+ double secondsPassend = (DateTime.Now - OutTask.wcstask_dispatcherTime.Value).TotalSeconds;
+ if (secondsPassend > 38) // 濡傛灉澶т簬38绉� 杩樻病鐢ㄦ彁鍗囨満瀹屾垚 灏辫鎵嬪姩
+ {
+ string state = TaskState.TaskState_Box_Out_Line_Executing.ToString();
+ if (OutTask.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString())
+ {
+ state = TaskState.TaskState_Empty_Out_Line_Executing.ToString();
+ }
+ OutTask.wcstask_state = state;
+ OutTask.wcstask_dispatcherTime = DateTime.Now;
+ taskWCSinfoRepository.Update(OutTask, true);
+ string str = $"鍑哄簱鍖� 鍑哄簱 鎻愬崌鏈哄凡缁忓唴鐨勬墭鐩樺凡缁忓嚭鍘� 浣嗙姸鎬佽繕鏄彁鍗囨満鎵ц涓�... {DateTime.Now}锛屾墭鐩樺彿:{OutTask.wcstask_barcode},浠诲姟鍙凤細{OutTask.wcstask_taskNumber}";
+ LogRecord.WriteLog(LogEnum.Errer, str.ToString());
+ }
+ }
+
+ }
public static void OutboundAreaDispathAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
{
try
{
//鍑哄簱瀹屾垚
- OutboundCompleteAction(taskWCSinfoRepository, client);
- //璇诲彇鎻愬崌鏈烘槸鍚︽甯�
- //婊氱瓛绾跨姸鎬�
- string hoisterResult = client.ReadValue(CLineInfoDBName.R_Line_DeviceNormal.ToString(), hoisterResultNo).ToString();
- //鎻愬崌鏈虹姸鎬�
- string result = client.Read("DB506.36.0", "bool").ToString();
- if (!bool.Parse(hoisterResult) || !bool.Parse(result))
- return;
- //鍏ュ簱鐢宠
- InboundRequestAction(taskWCSinfoRepository, taskRGVinfoRepository, client);
+ OutboundCompleteAction(taskWCSinfoRepository, client); //鍘嬭鍑哄簱鍙d换鍔″畬鎴�
- //澧炲姞琛ヤ竵.澧炲姞杞﹀瓨鍌ㄤ腑鏈夐棶棰�.鍐嶅啓
- 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_RGV_Received.ToString()
- || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())
- && (OutboundStationLayerNo.Contains(r.wcstask_startPoint) || OutboundStationLayerNo.Contains(r.wcstask_endPoint)));
- if (executingTask.Count < 3)
+ //鐢熸垚鍙笅鍙戠殑RGV浠诲姟锛岃嚦缂撳瓨鍙�
+ List<Dt_TaskWCSinfo> executingTask = taskWCSinfoRepository.Find(r => r.wcstask_state != TaskState.TaskState_Assigned.ToString()
+ && endStationNo.Contains(r.wcstask_endPoint));
+ // 杩欓噷瑕佸啓涓�涓�昏緫锛屽氨鏄垜鑾峰彇鐨勪换鍔★紝鍙湁瀵瑰簲鐨勭珯鍙颁负绌猴紝鎴戞墠鑳戒笅鍙戯紝杩欐牱鏀圭殑璇濓紝绌烘墭鐩樺叆搴撲篃瑕佹敼
+ if (executingTask.Count < 8) //灏忎簬8锛屽垯鍙敓鎴愬幓杩欒竟鐨勪换鍔�
{
//鐩存帴灏嗕换鍔℃坊鍔犲埌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())
+ 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);
@@ -123,60 +157,23 @@
}
}
- //鎻愬崌鏈鸿繍琛岀殑浠诲姟
- 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 hoisterLayer = client.ReadValue(CLineInfoDBName.R_Line_Layer.ToString(), hoisterResultNo).ToString();
- 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('-');
- //璇存槑鎻愬崌鏈哄埌杈句簡鐩爣灞�
- if (int.Parse(locationArray[0]).ToString() == hoisterLayer)
- WriteRGVState(client, false);// 鍐欏叆RGV寮�濮嬫墽琛�
- }
- 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);
- }
+ //缂撳瓨鍙�(缂撳瓨鏋�)鑷宠緭閫佺嚎
+ OutboundCZ_PLC(taskWCSinfoRepository, taskRGVinfoRepository, client);
+
+ //绌烘墭鍏ュ簱鐢宠(鐢熸垚浜嗙┖鎵樺叆搴撲换鍔�)
+ InboundRequestAction(taskWCSinfoRepository, taskRGVinfoRepository, client);
+
+ //绌烘墭鍒扮紦瀛樺彛(缂撳瓨鏋�)
+ ReInboundKTP(taskWCSinfoRepository, client);
+
+ //绌烘墭鍏ュ簱鍙o紝鐢熸垚RGV浠诲姟,杩涜鍏ュ簱
+ RGV_InboundKTP(taskWCSinfoRepository, taskRGVinfoRepository, client);
+
+
}
catch (Exception ex)
{
- WriteLog.Info("OutboundArea").Write($"{ DateTime.Now }鍑哄簱鍖哄煙璋冨害澶辫触:{ex.Message}", "OutboundArea");
+ WriteLog.Info("OutboundArea").Write($"{DateTime.Now}鍑哄簱鍖哄煙璋冨害澶辫触:{ex.Message}", "OutboundArea");
}
}
public static bool WriteRGVState(PLCClient client, bool value)
@@ -212,16 +209,35 @@
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();//
+ && endStationNo.Contains(r.wcstask_endPoint)).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)
{
+ //鍒ゆ柇鍘嬭鍙版槸鍚︽湁璐� 涔熷氨鏄垽鏂�80101閭h竟
+ bool yzflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), PlatformDict[wcsTask.wcstask_endPoint]).ToString());
+ bool yznoflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), PlatformDict[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()));
+ //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;
+ // 鑲栦郊 灏嗕笂闈慨鏀规垚涓嬮潰
+ Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r =>
+ (r.wcstask_startPoint == wcsTask.wcstask_startPoint)
+ && (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString()));
if (null != executingTask)
continue;
@@ -229,6 +245,7 @@
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)
@@ -251,48 +268,6 @@
}
}
}
-
-
-
- //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;
}
@@ -314,70 +289,204 @@
return rgvInfo;
}
+ // 鍙敤涓�涓瓧鍏革細Key=鎵樼洏鍙凤紝Value=Tuple<閿佸璞�, 鏈�鍚庝娇鐢ㄦ椂闂�>
+ // Tuple<object, DateTime>锛欼tem1=閿佸璞★紝Item2=鏈�鍚庝娇鐢ㄦ椂闂�
+ private static readonly Dictionary<string, Tuple<object, DateTime>> BarcodeLockDict = new Dictionary<string, Tuple<object, DateTime>>();
+ private static readonly object GlobalLock = new object(); // 淇濇姢瀛楀吀鐨勫叏灞�閿�
+ private const int ExpireMinutes = 1; // 杩囨湡鏃堕棿锛�1鍒嗛挓
+
+ /// <summary>
+ /// 鑾峰彇鎵樼洏鍙蜂笓灞為攣锛堝崟瀛楀吀+1鍒嗛挓杩囨湡+鎳掓竻鐞嗭級
+ /// </summary>
+ private static object GetBarcodeLock(string barcode)
+ {
+
+ lock (GlobalLock) // 鍏ㄥ眬閿佷繚鎶ゅ瓧鍏告搷浣�
+ {
+ // ========== 绗竴姝ワ細鎳掓竻鐞嗭紙姣忔鑾峰彇閿佹椂锛屾竻鐞嗚秴杩�1鍒嗛挓鐨勯棽缃墭鐩樺彿锛� ==========
+ var expiredBarcodes = BarcodeLockDict
+ .Where(kv => (DateTime.Now - kv.Value.Item2).TotalMinutes > ExpireMinutes)
+ .Select(kv => kv.Key)
+ .ToList();
+
+ foreach (var expiredBarcode in expiredBarcodes)
+ {
+ BarcodeLockDict.Remove(expiredBarcode);
+ }
+
+ // ========== 绗簩姝ワ細澶勭悊褰撳墠鎵樼洏鍙风殑閿佸拰鏃堕棿 ==========
+ if (!BarcodeLockDict.ContainsKey(barcode))
+ {
+ // 鏃犺鎵樼洏鍙凤細鏂板閿佸璞�+褰撳墠鏃堕棿
+ BarcodeLockDict[barcode] = Tuple.Create(new object(), DateTime.Now);
+ }
+ // 杩斿洖褰撳墠鎵樼洏鍙风殑閿佸璞�
+ return BarcodeLockDict[barcode].Item1;
+ }
+ }
+
public static void InboundRequestAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
{
try
{
- string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
+ int R_Line_PLCDispatch = int.Parse(client.ReadValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo).ToString());
bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString());
- if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load)
+ if (R_Line_PLCDispatch == 1 && 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;
+ string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
- //褰撳墠瀛樺湪鏈畬鎴愮殑浠诲姟 鍏ュ簱
- wcsInfo = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint));
- if (null != wcsInfo)
+ if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode))
+ {
+ if (int.Parse(barcode) < 800000 || int.Parse(barcode) > 890000)
{
- Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == wcsInfo.wcstask_taskNumber);
- if (null != rgvTask)
+ return;
+ }
+ object barcodeLock = GetBarcodeLock(barcode);
+ lock (barcodeLock)
+ {
+ Dt_TaskWCSinfo IsTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == barcode
+ && (x.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() || x.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString())
+ && (x.wcstask_state == TaskState.TaskState_Box_Out_Line_Executing.ToString() || x.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString())
+ && (endStationNo.Contains(x.wcstask_endPoint)));
+ if (IsTask != null)
{
- //鍙栬揣瀹屾垚
- if ("2" != rgvTask.rgvtask_backup_2)
- return;
+ // 杩欓噷瑕佸姞涓�涓垽鏂紝濡傛灉鎷垮洖鏉ョ殑绌烘墭鐩樻槸800001锛屼絾鏄垜鏈変竴鏉¤繖涓墭鐩樼殑浠诲姟鏄�800001杩樻病鏈夊埌鎸囧畾鐨勫帇瑁呭彴锛屾墍浠ユ垜瑕佸畬鎴愯繖涓换鍔�
+ // 鍦ㄦ瀹屾垚璇ョ┖鎵樺嚭搴撲换鍔�
+ WebResponseContent content = taskWCSinfoRepository.DbContextBeginTransaction(() =>
+ {
+ //涓婃姤WMS浠诲姟瀹屾垚
+ content = WMSApi.TellWmsTaskFinished(IsTask.wcstask_barcode,IsTask.wcstask_backUp_2);
+ if (content.Status)
+ {
+ //绉诲姩浠诲姟鍒板巻鍙茶〃
+ Dt_TaskWCSinfo_HtyRepository taskWCSinfo_HtyRepository = new Dt_TaskWCSinfo_HtyRepository(taskWCSinfoRepository.DbContext);
+ IsTask.wcstask_state = TaskState.TaskState_Finished.ToString();
+ CommonFunction.AddWcsTaskToHistory(IsTask, taskWCSinfoRepository, taskWCSinfo_HtyRepository);
+ }
+ else
+ throw new Exception($"{DateTime.Now}涓婃姤WMS浠诲姟瀹屾垚鍑洪敊锛屽師鍥狅細銆恵content.Message}銆�");
+
+ return content;
+ });
+ string str = string.Empty;
+ if (content.Status)
+ str = $" {DateTime.Now}涓婃姤WMS鍑哄簱瀹屾垚鎴愬姛,銆愭墜鍔ㄥ共鎵板嚭搴撴病鏈夊埌杈炬寚瀹氬帇瑁呭彴鐐逛綅锛屾墜鍔ㄦ嬁鍥�90101銆戙�怲askState_ConveyorLineExecuting銆戯紝鎵樼洏鍙�:{IsTask.wcstask_barcode},浠诲姟鍙凤細{IsTask.wcstask_taskNumber}";
+ else
+ str = $" {DateTime.Now}涓婃姤WMS鍑哄簱瀹屾垚澶辫触銆愭墜鍔ㄥ共鎵板嚭搴撴病鏈夊埌杈炬寚瀹氬帇瑁呭彴鐐逛綅锛屾墜鍔ㄦ嬁鍥�90101銆戙�怲askState_ConveyorLineExecuting銆戯紝鎵樼洏鍙�:{IsTask.wcstask_barcode},浠诲姟鍙凤細{IsTask.wcstask_taskNumber}";
+
+ WriteLog.Info(IsTask.wcstask_endPoint).Write(str, IsTask.wcstask_endPoint);
+ LogRecord.WriteLog(LogEnum.Errer, str.ToString());
+ }
+
+ Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode);
+ if (null == wcsInfo)
+ {
+ //鑾峰彇杞﹁酱鍑哄簱
+ List<Dt_TaskWCSinfo> 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()
+ || x.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString());
+ if (LineExecucount >= 8)
+ {
+ //鍒ゆ柇鏄惁鏈夊搴斿眰鐨勫嚭搴撲换鍔★紝
+ //鐢宠鍏ュ簱浠诲姟
+ WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
+ if (content.Status)
+ {
+ //WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
+ //wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
+ //taskWCSinfoRepository.Add(wcsInfo, true);
+ //client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 2);
+ try
+ {
+ WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
+ wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
+ taskWCSinfoRepository.Add(wcsInfo, true);
+ }
+ catch (Exception)
+ {
+ string str = $"杩欓噷鍙兘鏄嚭鐜颁簡骞跺彂鐨勬儏鍐垫墭鐩樼爜 鍦ㄦ坊鍔犵殑鏃跺�欐嫤鎴殑銆恵wcsInfo.wcstask_barcode}銆�" +
+ $"浠诲姟鍙枫�恵wcsInfo.wcstask_taskNumber}銆�,浠诲姟鐘舵�侊細銆恵wcsInfo.wcstask_state}銆�";
+ LogRecord.WriteLog(LogEnum.Errer, str.ToString());
+ //throw;
+ }
+ }
+ else
+ {
+ if (content.Message.Contains("褰撳墠鎵樼洏鍙峰凡瀛樺湪搴撻噷"))
+ {
+ client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 4);
+ }
+ throw new Exception("鍏ュ簱鐢宠澶辫触:" + content.Message);
+ }
+ }
+ else
+ {
+ //鍒ゆ柇鏈夊灏戞潯鍦ㄧ紦瀛樻灦鐨�
+ int RGV_Finishedcount = executingTask.Count(x =>
+ x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
+ && x.wcstask_state != TaskState.TaskState_Empty_Out_Line_Executing.ToString()
+ && x.wcstask_state != TaskState.TaskState_Assigned.ToString());
+
+ if (RGV_Finishedcount == 0)
+ {
+ // 鏍稿績锛氳幏鍙栧綋鍓嶆墭鐩樺彿鐨勪笓灞為攣锛屽悓涓�鎵樼洏鍙蜂覆琛屽鐞�
+ //鐢宠鍏ュ簱浠诲姟
+ WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
+ if (content.Status)
+ {
+ try
+ {
+ WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
+ wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
+ taskWCSinfoRepository.Add(wcsInfo, true);
+ }
+ catch (Exception)
+ {
+ string str = $"杩欓噷鍙兘鏄嚭鐜颁簡骞跺彂鐨勬儏鍐垫墭鐩樼爜锛屽湪娣诲姞鐨勬椂鍊欐嫤鎴殑銆恵wcsInfo.wcstask_barcode}銆�" +
+ $"浠诲姟鍙枫�恵wcsInfo.wcstask_taskNumber}銆�,浠诲姟鐘舵�侊細銆恵wcsInfo.wcstask_state}銆�";
+ LogRecord.WriteLog(LogEnum.Errer, str.ToString());
+ //throw;
+ }
+ }
+ else
+ {
+ if (content.Message.Contains("褰撳墠鎵樼洏鍙峰凡瀛樺湪搴撻噷"))
+ {
+ client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 4);
+ }
+ else if (content.Message.Contains("鏆傛棤璐т綅鍙垎閰�"))
+ {
+
+ }
+ else
+ {
+ throw new Exception("鍏ュ簱鐢宠澶辫触:" + content.Message);
+ }
+
+ }
+ }
+ }
}
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();
- });
+ string str = $"杩欓噷鍙兘鏄嚭鐜颁簡骞跺彂鐨勬儏鍐垫墭鐩樼爜 鍦ㄦ煡璇㈢殑鏃跺�欐嫤鎴殑銆恵wcsInfo.wcstask_barcode}銆�" +
+ $"浠诲姟鍙枫�恵wcsInfo.wcstask_taskNumber}銆�,浠诲姟鐘舵�侊細銆恵wcsInfo.wcstask_state}銆�";
+ LogRecord.WriteLog(LogEnum.Errer, str.ToString());
+ }
}
- else
- throw new Exception("鍏ュ簱鐢宠澶辫触:" + content.Message);
+ }
+ else
+ {
+ throw new Exception("鍏ュ簱鐢宠澶辫触:璇诲彇鍒扮殑绌烘墭鐩樻潯鐮佷负绌猴紝璇诲彇鍐呭锛�" + barcode);
}
}
}
catch (Exception ex)
{
+ client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 3);
Console.Out.WriteLine(DateTime.Now + ex.Message);
}
}
--
Gitblit v1.9.3