From 9167ffecc0c63927d56268182e57cb8c52ed1b37 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 28 八月 2025 15:19:25 +0800
Subject: [PATCH] 1.ControlJob工作流程模拟测试,保存工作状态,重启软件还原工作状态等; 2.CJEnd事件上报,EAP模拟测试,数据验证等;

---
 SourceCode/Bond/Servo/CMaster.cpp |   65 ++++++++++++++++++++++++++++++--
 1 files changed, 60 insertions(+), 5 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index a4878d6..1716f9a 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -1417,6 +1417,7 @@
 					if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
 						CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
 						pGlass->complete();
+						this->saveState();
 						bool bMoved = glassFromInPorcessToComplete(pGlass);
 						if (bMoved) {
 							LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.",
@@ -1433,10 +1434,22 @@
 						// 检查PJ是否已经完成
 						CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext());
 						if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+							this->saveState();
 							LOGE("<Master>ProcessJob(%s)完成.",
 								pJob->id().c_str());
 							if (m_listener.onPjEnd != nullptr) {
 								m_listener.onPjEnd(this, pJob);
+							}
+
+							// 检查CJ是否已经完成
+							ASSERT(m_pControlJob);
+							if (checkAndUpdateCjComplete(m_pControlJob)) {
+								this->saveState();
+								LOGE("<Master>ControlJob(%s)完成.",
+									m_pControlJob->id().c_str());
+								if (m_listener.onCjEnd != nullptr) {
+									m_listener.onCjEnd(this, pJob);
+								}
 							}
 						}
 					}
@@ -1754,6 +1767,7 @@
 				CGlass* pGlass = m_queueGlasses.front();
 				pGlass->start();
 				glassFromQueueToInPorcess(pGlass);
+				this->saveState();
 
 				// 这里上报Panel Start事件
 				if (m_listener.onPanelStart != nullptr) {
@@ -1767,6 +1781,7 @@
 				CGlass* pGlass = m_inProcesGlasses.front();
 				pGlass->complete();
 				glassFromInPorcessToComplete(pGlass);
+				this->saveState();
 
 				// 这里上报Panel End事件
 				if (m_listener.onPanelEnd != nullptr) {
@@ -1775,10 +1790,23 @@
 
 				CProcessJob* pJob = getGlassProcessJob(pGlass);
 				if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+					processJobFromInPorcessToComplete(pJob);
+					this->saveState();
 					LOGE("<Master>ProcessJob(%s)完成.",
 						pJob->id().c_str());
 					if (m_listener.onPjEnd != nullptr) {
 						m_listener.onPjEnd(this, pJob);
+					}
+
+					// 检查CJ是否已经完成
+					ASSERT(m_pControlJob);
+					if (checkAndUpdateCjComplete(m_pControlJob)) {
+						this->saveState();
+						LOGE("<Master>ControlJob(%s)完成.",
+							m_pControlJob->id().c_str());
+						if (m_listener.onCjEnd != nullptr) {
+							m_listener.onCjEnd(this, pJob);
+						}
 					}
 				}
 			}
@@ -2483,8 +2511,8 @@
 		for (const auto pj : pjs) {
 			if (pj->state() == PJState::Queued) {
 				pj->start();
+				return pj;
 			}
-			return pj;
 		}
 
 
@@ -2558,6 +2586,17 @@
 		return false;
 	}
 
+	bool CMaster::processJobFromInPorcessToComplete(CProcessJob* pProcessJob)
+	{
+		auto it = std::find(m_inProcesJobs.begin(), m_inProcesJobs.end(), pProcessJob);
+		if (it != m_inProcesJobs.end()) {
+			m_completeProcessJobs.push_back(*it);
+			m_inProcesJobs.erase(it);
+			return true;
+		}
+		return false;
+	}
+
 	bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob)
 	{
 		ASSERT(pJob);
@@ -2566,10 +2605,26 @@
 
 		for (auto c : pJob->carriers()) {
 			for (auto g : c.contexts) {
-				CGlass* pGlass = (CGlass*)g;
-				if (pGlass->state() != GlsState::Aborted
-					&& pGlass->state() != GlsState::Completed
-					&& pGlass->state() != GlsState::Failed) return false;
+				auto state = ((CGlass*)g)->state();
+				if (state != GlsState::Aborted && state != GlsState::Completed
+					&& state != GlsState::Failed) return false;
+			}
+		}
+
+		return pJob->complete();
+	}
+
+	bool CMaster::checkAndUpdateCjComplete(CControlJob* pJob)
+	{
+		ASSERT(pJob);
+		auto state = pJob->state();
+		if (state != CJState::Executing && state != CJState::Paused) return false;
+
+		for (auto pj : pJob->getPjs()) {
+			auto state = pj->state();
+			if (state != PJState::Aborted && state != PJState::Completed
+				&& state != PJState::Failed) {
+				return false;
 			}
 		}
 

--
Gitblit v1.9.3