From 22f2984276ff75433ebeab877c96b48905826e6c Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期五, 06 二月 2026 16:51:25 +0800
Subject: [PATCH] 1.Slot防护

---
 SourceCode/Bond/Servo/CCjPage2.cpp              |   36 ++++++++++++++++++
 SourceCode/Bond/Servo/PortConfigurationDlg.cpp  |   14 +++++++
 SourceCode/Bond/Servo/CMaster.cpp               |   14 +++++++
 SourceCode/Bond/Servo/CControlJobManagerDlg.cpp |   20 +++++++++
 4 files changed, 83 insertions(+), 1 deletions(-)

diff --git a/SourceCode/Bond/Servo/CCjPage2.cpp b/SourceCode/Bond/Servo/CCjPage2.cpp
index 0a1bf21..29eea6a 100644
--- a/SourceCode/Bond/Servo/CCjPage2.cpp
+++ b/SourceCode/Bond/Servo/CCjPage2.cpp
@@ -490,6 +490,15 @@
     short jobExistence[12] = { 0 };
     short slotProcess = 0;
     BuildCassetteCtrlMaps(port, jobExistence, slotProcess);
+    bool hasExistence = false;
+    for (short w : jobExistence) {
+        if (w != 0) { hasExistence = true; break; }
+    }
+    if (!hasExistence) {
+        LOGE("ProcessStart blocked (P1): no JobExistence map (portStatus=%d, scanMap=%d).",
+            port->getPortStatus(), port->getScanCassetteMap());
+        return;
+    }
     port->sendCassetteCtrlCmd(CCC_PROCESS_START, jobExistence, 12, slotProcess, 0, nullptr, nullptr);
 
 }
@@ -502,6 +511,15 @@
     short jobExistence[12] = { 0 };
     short slotProcess = 0;
     BuildCassetteCtrlMaps(port, jobExistence, slotProcess);
+    bool hasExistence = false;
+    for (short w : jobExistence) {
+        if (w != 0) { hasExistence = true; break; }
+    }
+    if (!hasExistence) {
+        LOGE("ProcessStart blocked (P2): no JobExistence map (portStatus=%d, scanMap=%d).",
+            port->getPortStatus(), port->getScanCassetteMap());
+        return;
+    }
     port->sendCassetteCtrlCmd(CCC_PROCESS_START, jobExistence, 12, slotProcess, 0, nullptr, nullptr);
 }
 
@@ -513,6 +531,15 @@
     short jobExistence[12] = { 0 };
     short slotProcess = 0;
     BuildCassetteCtrlMaps(port, jobExistence, slotProcess);
+    bool hasExistence = false;
+    for (short w : jobExistence) {
+        if (w != 0) { hasExistence = true; break; }
+    }
+    if (!hasExistence) {
+        LOGE("ProcessStart blocked (P3): no JobExistence map (portStatus=%d, scanMap=%d).",
+            port->getPortStatus(), port->getScanCassetteMap());
+        return;
+    }
     port->sendCassetteCtrlCmd(CCC_PROCESS_START, jobExistence, 12, slotProcess, 0, nullptr, nullptr);
 }
 
@@ -524,6 +551,15 @@
     short jobExistence[12] = { 0 };
     short slotProcess = 0;
     BuildCassetteCtrlMaps(port, jobExistence, slotProcess);
+    bool hasExistence = false;
+    for (short w : jobExistence) {
+        if (w != 0) { hasExistence = true; break; }
+    }
+    if (!hasExistence) {
+        LOGE("ProcessStart blocked (P4): no JobExistence map (portStatus=%d, scanMap=%d).",
+            port->getPortStatus(), port->getScanCassetteMap());
+        return;
+    }
     port->sendCassetteCtrlCmd(CCC_PROCESS_START, jobExistence, 12, slotProcess, 0, nullptr, nullptr);
 }
 
diff --git a/SourceCode/Bond/Servo/CControlJobManagerDlg.cpp b/SourceCode/Bond/Servo/CControlJobManagerDlg.cpp
index 78036f4..05b4f62 100644
--- a/SourceCode/Bond/Servo/CControlJobManagerDlg.cpp
+++ b/SourceCode/Bond/Servo/CControlJobManagerDlg.cpp
@@ -645,7 +645,25 @@
 	// process start
 	for (int p = 0; p < 4; p++) {
 		if (bProcessStart[p]) {
-			pPorts[p]->sendCassetteCtrlCmd(CCC_PROCESS_START, nullptr, 0, 0, 0, nullptr, nullptr);
+			if (pPorts[p] == nullptr) continue;
+			short jobExistence[12] = { 0 };
+			short slotProcess = 0;
+			const short scanMap = pPorts[p]->getScanCassetteMap();
+			if (scanMap != 0) {
+				jobExistence[0] = scanMap;
+				slotProcess = scanMap;
+			}
+
+			bool hasExistence = false;
+			for (short w : jobExistence) {
+				if (w != 0) { hasExistence = true; break; }
+			}
+			if (!hasExistence) {
+				LOGE("ProcessStart blocked (ControlJob): no JobExistence map (port=%d, portStatus=%d, scanMap=%d).",
+					p + 1, pPorts[p]->getPortStatus(), scanMap);
+				continue;
+			}
+			pPorts[p]->sendCassetteCtrlCmd(CCC_PROCESS_START, jobExistence, 12, slotProcess, 0, nullptr, nullptr);
 			Sleep(100);
 		}
 	}
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 707f808..492e813 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -3055,6 +3055,20 @@
 			slotProcess = jobExistence[0];
 		}
 
+		bool hasExistence = false;
+		for (short w : jobExistence) {
+			if (w != 0) { hasExistence = true; break; }
+		}
+		const int portStatus = pPort->getPortStatus();
+		if (!hasExistence) {
+			LOGE("ProcessStart blocked (ProceedWithCarrier): no JobExistence map (port=%u, portStatus=%d, scanMap=%d, cassetteId=%s).",
+				port + 1, portStatus, scanMap, pPort->getCassetteId().c_str());
+			return -2;
+		}
+		if (portStatus != PORT_INUSE) {
+			LOGW("ProcessStart warning (ProceedWithCarrier): port status is %d (expected INUSE).", portStatus);
+		}
+
 		pPort->sendCassetteCtrlCmd(CCC_PROCESS_START, jobExistence, 12, slotProcess, jobCount, nullptr, nullptr);
 		return 0;
 	}
diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 5b21fda..2de5acd 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -484,6 +484,20 @@
         slotProcess = jobExistence[0];
     }
 
+    bool hasExistence = false;
+    for (short w : jobExistence) {
+        if (w != 0) { hasExistence = true; break; }
+    }
+    const int portStatus = pPort->getPortStatus();
+    if (!hasExistence) {
+        LOGE("ProcessStart blocked: no JobExistence map (port=%d, portStatus=%d, scanMap=%d, cassetteId=%s).",
+            selPort + 1, portStatus, scanMap, pPort->getCassetteId().c_str());
+        return;
+    }
+    if (portStatus != PORT_INUSE) {
+        LOGW("ProcessStart warning: port status is %d (expected INUSE).", portStatus);
+    }
+
     int ret = pPort->sendCassetteCtrlCmd(cmd, jobExistence, 12, slotProcess, jobCount, nullptr,
         [selPort](int code) -> int {
             if (code == WOK) {

--
Gitblit v1.9.3