From 349f26accd28cd83356334239b11728ce50b7f95 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期三, 14 五月 2025 18:10:21 +0800
Subject: [PATCH] 1.重新理顺Glass的流转,CJobDataB, CJobDataS在CEquipment的列表存储等;

---
 SourceCode/Bond/Servo/CEquipment.cpp |  187 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 174 insertions(+), 13 deletions(-)

diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index 3b15620..cea483e 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -85,6 +85,11 @@
 		m_pArm = pEquipment;
 	}
 
+	CEquipment* CEquipment::getArm()
+	{
+		return m_pArm;
+	}
+
 	void CEquipment::setBaseAlarmId(int nBaseId)
 	{
 		m_nBaseAlarmId = nBaseId;
@@ -822,7 +827,7 @@
 		return pGlass;
 	}
 
-	int CEquipment::fetchedOutJob(const char* pszGlassId)
+	int CEquipment::fetchedOutJob(CJobDataB* pJobDataB)
 	{
 		if (m_pArm == nullptr) {
 			return -1;
@@ -837,7 +842,7 @@
 
 		CGlass* pContext = nullptr;
 		for (auto iter = m_glassList.begin(); iter != m_glassList.end(); iter++) {
-			if ((*iter)->getID().compare(pszGlassId) == 0) {
+			if ((*iter)->getID().compare(pJobDataB->getGlassId()) == 0) {
 				pContext = (*iter);
 				m_glassList.erase(iter);
 				break;
@@ -859,7 +864,7 @@
 		return 0;
 	}
 
-	int CEquipment::storedJob(const char* pszGlassId)
+	int CEquipment::storedJob(CJobDataB* pJobDataB)
 	{
 		if (m_pArm == nullptr) {
 			return -1;
@@ -1061,6 +1066,24 @@
 		return m_recipesManager.decodeRecipeParameterReport(pszData, size);
 	}
 
+	int CEquipment::decodeProcessDataReport(CStep* pStep, const char* pszData, size_t size)
+	{
+		CProcessData processData;
+		int nRet = processData.unserialize(&pszData[0], (int)size);
+		if (nRet < 0) return nRet;
+
+		// 缓存Attribute,用于调试时显示信息
+		unsigned int weight = 201;
+		CAttributeVector attrubutes;
+		processData.getAttributeVector(attrubutes, weight);
+		pStep->addAttributeVector(attrubutes);
+
+
+		onProcessData(&processData);
+
+		return nRet;
+	}
+
 	int CEquipment::decodeReceivedJobReport(CStep* pStep, int port, const char* pszData, size_t size)
 	{
 		CJobDataS jobDataS;
@@ -1082,7 +1105,8 @@
 	int CEquipment::onReceivedJob(int port, CJobDataS* pJobDataS)
 	{
 		LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str());
-		// return fetchedOutJob(pszGlassId);
+
+		addJobDataS(pJobDataS);
 		return 0;
 	}
 
@@ -1107,7 +1131,15 @@
 	int CEquipment::onSentOutJob(int port, CJobDataS* pJobDataS)
 	{
 		LOGI("<CEquipment-%s>onSentOutJob.", m_strName.c_str());
-		// return fetchedOutJob(pszGlassId);
+
+		int count = removeJobDataS(pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
+		if (count == 1) {
+			LOGI("<CEquipment-%s>onSentOutJob,删除数据 %d 条", m_strName.c_str(), count);
+		}
+		else {
+			LOGE("<CEquipment-%s>onSentOutJob,删除数据 %d 条,注意排查风险", m_strName.c_str(), count);
+		}
+
 		return 0;
 	}
 
@@ -1148,16 +1180,32 @@
 			jobDataB.getGlassId().c_str(), "", weight++));
 
 
-		onFetchedOutJob(port, jobDataB.getGlassId().c_str());
+		onFetchedOutJob(port, &jobDataB);
 
 		return index;
 	}
 
-	int CEquipment::onFetchedOutJob(int port, const char* pszGlassId)
+	int CEquipment::onPreFetchedOutJob(int port, CJobDataB* pJobDataB)
+	{
+		LOGI("<CEquipment-%s>onPreFetchedOutJob:port:%d|GlassId:%s",
+			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
+		return TRUE;
+	}
+
+	int CEquipment::onFetchedOutJob(int port, CJobDataB* pJobDataB)
 	{
 		LOGI("<CEquipment-%s>onFetchedOutJob:port:%d|GlassId:%s", 
-			m_strName.c_str(), port, pszGlassId);
-		return fetchedOutJob(pszGlassId);
+			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
+
+		BOOL bCheck = onPreFetchedOutJob(port, pJobDataB);
+		if (bCheck) {
+			return fetchedOutJob(pJobDataB);
+		}
+
+		// 数据异常,处理或显示
+		LOGI("<CEquipment-%s>onFetchedOutJob Error.ort:%d|GlassId:%s",
+			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
+		return -1;
 	}
 
 	int CEquipment::decodeStoredJobReport(CStep* pStep, int port, const char* pszData, size_t size)
@@ -1197,15 +1245,128 @@
 			jobDataB.getGlassId().c_str(), "", weight++));
 
 
-		onStoreJob(port, jobDataB.getGlassId().c_str());
+		onStoredJob(port, &jobDataB);
 
 		return index;
 	}
 
-	int CEquipment::onStoreJob(int port, const char* pszGlassId)
+	int CEquipment::onPreStoredJob(int port, CJobDataB* pJobDataB)
+	{
+		LOGI("<CEquipment-%s>onPreStoredJob:port:%d|GlassId:%s",
+			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
+		return TRUE;
+	}
+
+	int CEquipment::onStoredJob(int port, CJobDataB* pJobDataB)
 	{
 		LOGI("<CEquipment-%s>onStore:port:%d|GlassId:%s",
-			m_strName.c_str(), port, pszGlassId);
-		return storedJob(pszGlassId);
+			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
+
+		BOOL bCheck = onPreStoredJob(port, pJobDataB);
+		if (bCheck) {
+			addJobDataB(pJobDataB);
+			return storedJob(pJobDataB);
+		}
+
+		// 数据异常,处理或显示
+		LOGI("<CEquipment-%s>onStoredJob Error.ort:%d|GlassId:%s",
+			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
+		return -1;
+	}
+
+	int CEquipment::onProcessData(CProcessData* pProcessData)
+	{
+		LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str());
+		return 0;
+	}
+
+	int CEquipment::addJobDataB(CJobDataB* pJobDataB)
+	{
+		// 添加之前先删除旧的,以免数据重复
+		Lock();
+		int count = removeJobDataB(pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
+		if (count > 0) {
+			LOGE("<CEquipment-%s>addJobDataB,删除重复数据 %d 条,注意排查风险", m_strName.c_str(), count);
+		}
+
+		m_listJobDataB.push_back(std::move(*pJobDataB));
+		Unlock();
+
+		return (int)m_listJobDataB.size();
+	}
+
+	int CEquipment::removeJobDataB(int nCassetteSequenceNo, int nJobSequenceNo)
+	{
+		int count = 0;
+		for (auto it = m_listJobDataB.begin(); it != m_listJobDataB.end(); ) {
+			if ((*it).getCassetteSequenceNo() == nCassetteSequenceNo
+				&& (*it).getJobSequenceNo() == nJobSequenceNo) {
+				it = m_listJobDataB.erase(it);
+				count++;
+			}
+			else {
+				++it;
+			}
+		}
+
+		return count;
+	}
+
+	CJobDataB* CEquipment::getJobDataB(int nCassetteSequenceNo, int nJobSequenceNo)
+	{
+		for (auto& item : m_listJobDataB) {
+			if (item.getCassetteSequenceNo() == nCassetteSequenceNo
+				&& item.getJobSequenceNo() == nJobSequenceNo) {
+				return &item;
+			}
+		}
+
+		return nullptr;
+	}
+
+	int CEquipment::addJobDataS(CJobDataS* pJobDataS)
+	{
+		// 添加之前先删除旧的,以免数据重复
+		Lock();
+		int count = removeJobDataS(pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
+		if (count > 0) {
+			LOGE("<CEquipment-%s>addJobDataS,删除重复数据 %d 条,注意排查风险", m_strName.c_str(), count);
+		}
+
+		m_listJobDataS.push_back(std::move(*pJobDataS));
+		Unlock();
+
+		return (int)m_listJobDataB.size();
+	}
+
+	int CEquipment::removeJobDataS(int nCassetteSequenceNo, int nJobSequenceNo)
+	{
+		int count = 0;
+		Lock();
+		for (auto it = m_listJobDataS.begin(); it != m_listJobDataS.end(); ) {
+			if ((*it).getCassetteSequenceNo() == nCassetteSequenceNo
+				&& (*it).getJobSequenceNo() == nJobSequenceNo) {
+				it = m_listJobDataS.erase(it);
+				count++;
+			}
+			else {
+				++it;
+			}
+		}
+		Unlock();
+
+		return count;
+	}
+
+	CJobDataS* CEquipment::getJobDataS(int nCassetteSequenceNo, int nJobSequenceNo)
+	{
+		for (auto& item : m_listJobDataS) {
+			if (item.getCassetteSequenceNo() == nCassetteSequenceNo
+				&& item.getJobSequenceNo() == nJobSequenceNo) {
+				return &item;
+			}
+		}
+
+		return nullptr;
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.3