From 0c66940a8e2cf64c9890519901f433b3668216b6 Mon Sep 17 00:00:00 2001
From: KEJ <kimeungju@diteam.co.kr>
Date: 수, 26 6월 2024 15:13:18 +0900
Subject: [PATCH] Ongoing80 #4942 CF AOI Review Bin File Loading 실패 개선  1. GlassRawMessenger 동기화  2. BIN파일 FindFile 제거(RawMessenger, Review 공통)  3. Unloading 시 BIN파일 제거

---
 ReviewSystem/ReviewSystem/DitGlassRawClient.cpp                       |   61 +++--
 ReviewSystem/ReviewSystem/DitGlassRawClient.h                         |   27 +-
 ReviewSystem/ReviewSystem/DisplayMessage.cpp                          |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp |   14 +
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp            |    3 
 DitGlassRawMessenger/Extern/DitGlassRawClient.h                       |    2 
 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp                  |  331 +++++++++++++++------------
 DitGlassRawMessenger/Extern/DitGlassRawClient.cpp                     |   24 ++
 DitGlassRawMessenger/Extern/DitGlassRawStruct.h                       |   12 +
 DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h             |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h   |    5 
 ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h                        |    1 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h              |   12 +
 ReviewSystem/ReviewSystem/DitGlassRawStruct.h                         |   16 +
 DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp           |   12 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp            |  194 +++++++++-------
 16 files changed, 436 insertions(+), 282 deletions(-)

diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
index acabcf6..0bde8c6 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
@@ -16,18 +16,16 @@
 {
 }
 
-BOOL CAnaResultFile::MakeAnaFile(CgrmGlassRawData* pData)
+BOOL CAnaResultFile::MakeAnaFile(CgrmGlassRawData* pData, CString strPath)
 {
-	//return TRUE;
-	/* < KJG 20220225 - #4000 MOD Start >*/ 
-	//CString strFilePathName;
-	//strFilePathName.Format("%s\\%sana", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strFileName);
 	char* pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 	CString strFilePathName;
 	CString strFileName = pData->GetGlassData()->m_strFileName;
 	strFileName.Replace(".bin", ".csv");
-	strFilePathName.Format("%s\\%s", pData->GetGlassData()->m_strPath, strFileName);
-	/* < KJG 20220225 - #4000 MOD End >*/
+	/* < KJG 20240620 - #4942 MOD Start >*/ 
+	//strFilePathName.Format("%s\\%s", pData->GetGlassData()->m_strPath, strFileName);
+	strFilePathName.Format(_T("%s\\%s"), strPath, strFileName);
+	/* < KJG 20240620 - #4942 MOD End > */
 
 	FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
 	if (pf == NULL)
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h b/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h
index 78a5fb5..5a1ebb2 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h
@@ -9,7 +9,7 @@
 	virtual ~CAnaResultFile(void);
 
 public:
-	BOOL MakeAnaFile(CgrmGlassRawData* pData);
+	BOOL MakeAnaFile(CgrmGlassRawData* pData, CString strPath);
 
 
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
index 1fdb749..e984f54 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -774,6 +774,8 @@
 	if(m_pGlassRawMaker) delete m_pGlassRawMaker;
 	
 	m_pGlassRawMaker = pNewRawMaker;
+	m_pGlassRawMaker->SetInterface_IGR2P(this); /* < KJG 20240620 - #4942 ADD Start >*/ 
+
 
 	m_ConfigOption.m_nSelectRawType = nIndex;
 	WriteConfigFile();
@@ -1676,4 +1678,14 @@
 
 	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
 }
-/* <LJC 20211122 : #3820 ADD End> */
\ No newline at end of file
+/* <LJC 20211122 : #3820 ADD End> */
+
+/* < KJG 20240620 - #4942 ADD Start >*/
+void CDitGlassRawMessengerDlg::IGR2P_ReportBinaryResult(BOOL bSucess)
+{
+	if(bSucess)
+		m_Server.GetGlassRawInfo()->m_ClientResultStep = APS_RES_BinarySuccess;
+	else
+		m_Server.GetGlassRawInfo()->m_ClientResultStep = APS_RES_BinaryFail;
+}
+/* < KJG 20240620 - #4942 ADD End >*/
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
index 7465412..2069e41 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
@@ -27,6 +27,8 @@
 
 // CDitGlassRawMessengerDlg 대화 상자
 class CDitGlassRawMessengerDlg : public CDialog
+	, public IGlassRaw2Parent 	/* < KJG 20240620 - #4942 ADD >*/
+
 {
 // 생성입니다.
 public:
@@ -149,4 +151,7 @@
 	/* <LJC 20211122 : #3820 ADD Start> */
 	afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
 	/* <LJC 20211122 : #3820 ADD End> */
+
+	public:
+		void	IGR2P_ReportBinaryResult(BOOL bSucess) override; /* < KJG 20240620 - #4942 ADD >*/
 };
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
index cd1ae2b..310e9d3 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
@@ -4,6 +4,7 @@
 #include "akLoggerExt.h"
 
 CGlassRawBase::CGlassRawBase(void)
+	: m_pParentInterface(nullptr) /* < KJG 20240620 - #4942 ADD >*/
 {	/* <LJC 20211122 : #3820 ADD Start> */
 	b_EnableFtpAck = FALSE;
 	/* <LJC 20211122 : #3820 ADD End> */
@@ -39,9 +40,11 @@
 	}
 	else
 	{
+		m_pParentInterface->IGR2P_ReportBinaryResult(FALSE); /* < KJG 20240620 - #4942 ADD >*/
 		AKLOG("WriteBinFile Fail");
 		return FALSE;
 	}
+	m_pParentInterface->IGR2P_ReportBinaryResult(TRUE); /* < KJG 20240620 - #4942 ADD >*/
 	AKLOG("WriteBinFile Finish");
 	return TRUE;
 }
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
index 59752dc..a20ea56 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
@@ -44,6 +44,14 @@
 
 enum CAMTYPE { _eCT_Reflex = 0, _eCT_Transfer };
 
+
+/* < KJG 20240620 - #4942 ADD Start >*/
+interface IGlassRaw2Parent
+{
+	virtual void IGR2P_ReportBinaryResult(BOOL bSucess) = 0;
+};
+/* < KJG 20240620 - #4942 ADD  End>*/
+
 class CGlassRawBase
 {
 public:
@@ -79,4 +87,8 @@
 	BOOL b_EnableFtpAck;
 
 	/* <LJC 20211122 : #3820 ADD End> */
+	void SetInterface_IGR2P(_In_ IGlassRaw2Parent* pInterface) { m_pParentInterface = pInterface; } /* < KJG 20240620 - #4942 ADD >*/
+
+protected:
+	IGlassRaw2Parent* m_pParentInterface; /* < KJG 20240620 - #4942 ADD >*/
 };
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
index 64660aa..089c488 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -19,10 +19,12 @@
 #define LOCAL_RAWPATH_INFO_INI_PATH	"D:\\ResultData\\"
 #define RAWINFO_FILE_NAME			"RESULT_INFO.ini"
 
+#define LOCAL_AOI_DEFECT_INFO_FILE_PATH		_T("D:\\DIT_ResultData\\DefectInfo") // 寃고븿 �긽�꽭 �젙蹂� �뙆�씪 �깮�꽦 寃쎈줈
 #define LOCAL_AOIRAWDFS_PATH		"D:\\DIT_ResultData\\Raw"
 #define LOCAL_AOIRAWBIN_PATH		"D:\\DIT_ResultData\\RawBin"
 #define NETWORK_AOIRAWDFS_PATH		"\\\\126.100.100.1\\d\\DIT_ResultData\\Raw"
 #define NETWORK_AOIRAWBIN_PATH		"\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
+#define LOCAL_ReviewRAWBIN_PATH		"D:\\DIT_ResultData\\RawBin"
 
 #define NETWORK_AOIRAWFILE_SUB_PATH "\\\\126.100.100.1\\d\\Raw_im\\"
 #define NETWORK_AOI_IMAGE_PATH		"\\\\126.100.100.1\\d\\Image\\Defect\\" 
@@ -89,6 +91,7 @@
 	CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL);
 	CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL);
 	CreateDirectory("D:\\Raw_im", NULL);
+	CreateDirectory(LOCAL_AOI_DEFECT_INFO_FILE_PATH, NULL); /* < KJG 20240620 - #4942 ADD >*/ 
 
 	/* <KMH 20220407 : #4053 ADD Start> */
 	CFileFind FileFinder;
@@ -125,9 +128,9 @@
 		
 		CString strStackFileLocalPath;
 		strStackFileLocalPath.Format("%s\\%s", NETWORK_AOISTACKLOCAL_PATH, pData->GetGlassData()->m_strGlassID);
-
+		
 		CFileFind File;
-
+		
 		if (File.FindFile(strStackFileLocalPath))
 		{
 			File.FindNextFile();
@@ -201,27 +204,30 @@
 	//210128
 	m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
 	pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;      // Insp End �떆 Raw �뾽濡쒕뱶濡�, E_TIME, LD_TIME �엯�젰 [ 21-03-18 KJG ]
+	pData->GetGlassData()->m_tmInspectionEND = m_tmReviewEnd;      // �떎�젣 Insp End �떆 Raw �뾽濡쒕뱶濡�, E_TIME, LD_TIME �엯�젰	//< KEJ 20240408 - #4808 ADD >
 	m_tmFileCreateTime = CTime::GetCurrentTime();
 
 	//�뿬湲곗뿉�꽌 �씪�씤蹂꾨줈 �뙆�씪紐�, �샊�� Path �쐞移� 寃곗젙�븯硫대맖. AOIServer �샊�� ReviewServer�뿉�꽌 �븞�빐�룄�맖 [源��깭�쁽2019/9/4]
-	pData->GetGlassData()->m_strFileName;
-	{
-		_grmGlassData* pGlassData = pData->GetGlassData();
-		CTime CurrTime = pGlassData->m_tmGlassLoading;
-		CString strTime=_T(""), strFileName=_T("");
-		strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
-			
-			CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
-		strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
 
-		strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
-	}
-	strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
-
+	//=> �꽌踰꾩뿉�꽌 �뜥以� 洹몃�濡� �깮�꽦�븯�룄濡� 蹂�寃�
+	/* < KJG 20240620 - #4942 DEL Start >*/
+// 	pData->GetGlassData()->m_strFileName;
+// 	{
+// 		_grmGlassData* pGlassData = pData->GetGlassData();
+// 		CTime CurrTime = pGlassData->m_tmGlassLoading;
+// 		CString strTime=_T(""), strFileName=_T("");
+// 		strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
+// 			
+// 			CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
+// 		strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
+// 
+// 		strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
+// 	}
+//	strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
+	/* < KJG 20240620 - #4942 DEL End >*/
 	
 	if(!WriteBinFile(pData))
 		return FALSE;
-	
 	
 	//if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 媛쒕퀎 �뾽濡쒕뱶 �븯誘�濡� Macro �뜲�씠�꽣 �쟻�젣 �젣嫄� �슂泥�
 
@@ -261,8 +267,6 @@
 //	else
 		sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
 	/* <KYH 211129 : #3806 ADD End> */
-
-
 	BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
 	if (bIsBDI)
 	{
@@ -305,69 +309,72 @@
 
 	//�뿬湲곗뿉�꽌 �씪�씤蹂꾨줈 �뙆�씪紐�, �샊�� Path �쐞移� 寃곗젙�븯硫대맖. AOIServer �샊�� ReviewServer�뿉�꽌 �븞�빐�룄�맖 [源��깭�쁽2019/9/4]
 	pData->GetGlassData()->m_strFileName;
-	strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
+	//strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
+	strcpy(pData->GetGlassData()->m_strPath, LOCAL_ReviewRAWBIN_PATH);		//< KEJ 20240621 - #4942 MOD >
 	
 	//strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
-
+	/* < KEJ 20240621 - #4942 MOD Start > */
+// 	CString strFindFile;
+// 	int nCloseTime = 600*100000;//sec
+// 	int nReTryTime = 30;
+// 	{
+// 		CTime tmReviewLoading = CTime::GetCurrentTime();
+// 		CString strWild;
+// 		
+// 		strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
+// 		CakFileUtil akFileFinder;
+// 		while(nReTryTime--)
+// 		{
+// 			akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
+// 			VECFINDDATA* pFindData = akFileFinder.getFindData();
+// 			int nFileNamePos = strlen(akFileFinder.getProcessPath());
+// 			std::map<LONGLONG, CString> mapSpanFileName;
+// 			for(int i=0; i<pFindData->size(); i++)
+// 			{
+// 				char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
+// 				{
+// 					CakParser parser;
+// 					parser.process(pFileName, "_.");
+// 					if(parser.getTokNum() < 4) continue;
+// 
+// 					int nDataTime[8]={};
+// 					{
+// 						int nTokIndex=0;
+// 						const char* pGlassId = parser.getTokStr(nTokIndex++);
+// 						const char* pStepId = parser.getTokStr(nTokIndex++);
+// 						char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
+// 						char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
+// 
+// 						nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
+// 						nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
+// 						nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
+// 						nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
+// 						nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
+// 						nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
+// 					}
+// 					
+// 					CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
+// 					CTimeSpan tmSpan = tmReviewLoading-tmTemp;
+// 					mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
+// 				}
+// 			}
+// 
+// 			if(mapSpanFileName.empty() == FALSE)
+// 			{
+// 				if(mapSpanFileName.begin()->first < nCloseTime)
+// 				{
+// 					//媛��옣 理쒓렐 寃곌낵�뙆�씪 李얘린 �꽦怨� [源��깭�쁽 2019/7/17]
+// 					strFindFile = mapSpanFileName.begin()->second;
+// 					break;
+// 				}
+// 			}
+// 			akFileFinder.clear();
+// 			Sleep(100);
+// 		}
+// 	}
 	CString strFindFile;
-	int nCloseTime = 600*100000;//sec
-	int nReTryTime = 30;
-	{
-		CTime tmReviewLoading = CTime::GetCurrentTime();
-		CString strWild;
-		
-		strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
-		CakFileUtil akFileFinder;
-		while(nReTryTime--)
-		{
-			akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
-			VECFINDDATA* pFindData = akFileFinder.getFindData();
-			int nFileNamePos = strlen(akFileFinder.getProcessPath());
-			std::map<LONGLONG, CString> mapSpanFileName;
-			for(int i=0; i<pFindData->size(); i++)
-			{
-				char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
-				{
-					CakParser parser;
-					parser.process(pFileName, "_.");
-					if(parser.getTokNum() < 4) continue;
-
-					int nDataTime[8]={};
-					{
-						int nTokIndex=0;
-						const char* pGlassId = parser.getTokStr(nTokIndex++);
-						const char* pStepId = parser.getTokStr(nTokIndex++);
-						char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
-						char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
-
-						nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
-						nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
-						nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
-						nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
-						nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
-						nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
-					}
-					
-					CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
-					CTimeSpan tmSpan = tmReviewLoading-tmTemp;
-					mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
-				}
-			}
-
-			if(mapSpanFileName.empty() == FALSE)
-			{
-				if(mapSpanFileName.begin()->first < nCloseTime)
-				{
-					//媛��옣 理쒓렐 寃곌낵�뙆�씪 李얘린 �꽦怨� [源��깭�쁽 2019/7/17]
-					strFindFile = mapSpanFileName.begin()->second;
-					break;
-				}
-			}
-			akFileFinder.clear();
-			Sleep(100);
-		}
-	}
-
+	strFindFile.Format("%s_%s.bin", pData->GetGlassData()->m_strGlassID, pData->GetGlassData()->m_strStepID);
+	/* < KEJ 20240621 - #4942 MOD End > */
 	if(strFindFile.IsEmpty()) return FALSE;
 
 	strcpy(pData->GetGlassData()->m_strFileName, strFindFile.GetBuffer(0));
@@ -507,7 +514,10 @@
 	
 	bResult &= MakeAOIFile(pData);
 	
-	m_GlassRawAna.MakeAnaFile(pData);
+	/* < KJG 20240620 - #4942 MOD Start >*/ 
+	//m_GlassRawAna.MakeAnaFile(pData);
+	m_GlassRawAna.MakeAnaFile(pData, LOCAL_AOI_DEFECT_INFO_FILE_PATH);
+	/* < KJG 20240620 - #4942 MOD End > */
 	//m_GlassRawRTMS.WriteAOIFile(pData);
 
 	AKLOG("WriteAOIFile Complete");
@@ -636,6 +646,7 @@
 	/* <LJC 20220425 : #3957 MOD End> */
 /* < KMH 20220613 : #3957 MOD End > */
 	/*< KJG 20211229 - #3846 MOD End >*/
+	strValue += _T(" B_DEFECT"); /* < KJG 20240620 - #4942 ADD >*/ 
 	strLine += strValue; strLine += "\n";
 /* < KMH 20220614 : #3957 MOD Start > */
 	/* <LJC 20220425 : #3957 MOD Start> */
@@ -892,13 +903,22 @@
 		, pGlassData->m_tmInspectionStart.GetSecond());
 	SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
 	// 23   14  E_TIME		// Stage�뿉�꽌 寃��궗/怨꾩륫 醫낅즺�맂 �떆媛�
+	/* < KEJ 20240408 - #4808 MOD Start > */
+// 	strValue.Format("%04d%02d%02d%02d%02d%02d"			// E_TIME
+// 		, pGlassData->m_tmReviewEnd.GetYear()
+// 		, pGlassData->m_tmReviewEnd.GetMonth()
+// 		, pGlassData->m_tmReviewEnd.GetDay()
+// 		, pGlassData->m_tmReviewEnd.GetHour()
+// 		, pGlassData->m_tmReviewEnd.GetMinute()
+// 		, pGlassData->m_tmReviewEnd.GetSecond());
 	strValue.Format("%04d%02d%02d%02d%02d%02d"			// E_TIME
-		, pGlassData->m_tmReviewEnd.GetYear()
-		, pGlassData->m_tmReviewEnd.GetMonth()
-		, pGlassData->m_tmReviewEnd.GetDay()
-		, pGlassData->m_tmReviewEnd.GetHour()
-		, pGlassData->m_tmReviewEnd.GetMinute()
-		, pGlassData->m_tmReviewEnd.GetSecond());
+		, pGlassData->m_tmInspectionEND.GetYear()
+		, pGlassData->m_tmInspectionEND.GetMonth()
+		, pGlassData->m_tmInspectionEND.GetDay()
+		, pGlassData->m_tmInspectionEND.GetHour()
+		, pGlassData->m_tmInspectionEND.GetMinute()
+		, pGlassData->m_tmInspectionEND.GetSecond());
+	/* < KEJ 20240408 - #4808 MOD End > */
 	SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
 	// 24   6   T_DEFECT		// Common Item 1 - Total Defect Count	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNum - pGlassData->m_nCutOffDefectNum); //210203 CJH - Cutoff 寃고븿�� �쟾泥닿컻�닔�뿉�꽌 �젣�쇅�빐以��떎.
@@ -1050,6 +1070,10 @@
 		}
 	}
 	/* <LJC 20220425 : #3957 ADD End> */
+
+	// B_DEFECT(Before T_DEFECT) �븘�꽣留� �쟾 寃고븿 �닔�웾
+	SPRINTRAW(12, "%d", pGlassData->m_nDefectNum); /* < KJG 20240620 - #4942 ADD >*/ 
+
 	SPRINTRAWEND;   //以묒슂!!! �젮 留덉�留됱뿉 瑗� �엳�뼱�빞�븿!!!(�궘�젣湲덉�) [源��깭�쁽2020/9/23]
 }
 
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp b/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
index e86109c..f1faed3 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
+++ b/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
@@ -152,6 +152,30 @@
 	return TRUE;
 }
 
+/* < KJG 20240620 - #4942 ADD Start >*/
+void CDitGlassRawClient::ResetClientResultStep()
+{
+	if (isConnect() == FALSE) return;
+
+	if (m_pGlassRawInfo)
+	{
+		m_pGlassRawInfo->m_ClientResultStep = APS_RES_None;
+	}
+}
+
+emClientResult CDitGlassRawClient::GetClientResultStep()
+{
+	if (isConnect() == FALSE) return APS_RES_None;
+
+	if (m_pGlassRawInfo)
+	{
+		return m_pGlassRawInfo->m_ClientResultStep;
+	}
+
+	return APS_RES_None;
+}
+/* < KJG 20240620 - #4942 ADD End >*/
+
 emAOIProcStep CDitGlassRawClient::GetProcessStep()
 {
 	if(isConnect() == FALSE) return APS_None;
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawClient.h b/DitGlassRawMessenger/Extern/DitGlassRawClient.h
index dfdfb4b..c66f391 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawClient.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawClient.h
@@ -12,6 +12,8 @@
 	BOOL ConnectServer();
 	BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
 
+	emClientResult GetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
+	void ResetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
 	emAOIProcStep GetProcessStep();
 
 	BOOL SetGlassLoading();
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
index a1c4a04..bb93482 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -27,6 +27,16 @@
 		RPT_AOICustom = 1000,
 	};
 };
+
+/* < KJG 20240620 - #4942 ADD Start >*/
+enum emClientResult
+{
+	APS_RES_None = 0,
+	APS_RES_BinarySuccess,
+	APS_RES_BinaryFail
+};
+/* < KJG 20240620 - #4942 ADD End >*/
+
 enum emAOIProcStep
 {
 	APS_None = 0,
@@ -638,6 +648,8 @@
 	size_t m_nGlassLoadingCount;
 	emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
 	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
+	// m_ClientResultStep : Binary File 생성 감지하기 위한 신호로 사용
+	emClientResult m_ClientResultStep;  /* < KJG 20240620 - #4942 ADD Start >*/
 };
 
 class CgrmGlassRawData
diff --git a/ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h b/ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h
index 38f2a0c..55a2399 100644
--- a/ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h
+++ b/ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h
@@ -27,6 +27,7 @@
 #define	REVIEW_OFFSET_CONFIGFILE_PATH _T("D:\\DIT_Review\\ReviewServerConfig\\") //210805
 #define	REVIEW_OFFSET_CONFIGFILE_NAME _T("ReviewOffSet.cfg")
 #define REVIEW_OFFSET_CONFIGFILE_FULL_PATHNAME _T("D:\\DIT_Review\\ReviewServerConfig\\ReviewOffSet.cfg")
+#define MOTOR_OFFSET_CONFIGFILE_FULL_PATHNAME _T("D:\\DIT_Review\\ReviewServerConfig\\MotorOffSet.cfg")
 /*< LYW 20220525 - #4158 ADD Start >*/
 #define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT	_T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig")
 /*< LYW 20220525 - #4158 ADD End >*/
diff --git a/ReviewSystem/ReviewSystem/DisplayMessage.cpp b/ReviewSystem/ReviewSystem/DisplayMessage.cpp
index a223f03..8d59dea 100644
--- a/ReviewSystem/ReviewSystem/DisplayMessage.cpp
+++ b/ReviewSystem/ReviewSystem/DisplayMessage.cpp
@@ -34,7 +34,7 @@
 {
 	m_strLogPath = strPath;
 	CString m_GlobalLogPath;
-	m_strLogFile.Format(_T("D:\\DIT_LogData\\%04d%02d%02d"), m_strLogPath, m_TimeLogFile.GetYear(), m_TimeLogFile.GetMonth(), m_TimeLogFile.GetDay());
+	m_strLogFile.Format(_T("D:\\DIT_LogData\\%04d%02d%02d"), m_TimeLogFile.GetYear(), m_TimeLogFile.GetMonth(), m_TimeLogFile.GetDay());
 	CreateDirectory(m_strLogFile, NULL);
 	CreateDirectory(m_strLogPath, NULL);
 
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp b/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
index 2c98d09..f1faed3 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
+++ b/ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
@@ -2,20 +2,15 @@
 #include "DitGlassRawClient.h"
 
 CDitGlassRawClient::CDitGlassRawClient(void)
-	: m_mxCommandProcess(FALSE, MUTEX_RAWMESSENGER)
+: m_mxCommandProcess(FALSE, MUTEX_RAWMESSENGER)
 {
 	m_hMapBasicInfo = NULL;
 	m_hMapGlassData = NULL;
-	m_pDitGlassClient =NULL;
+
 	m_pGlassRawInfo = NULL;
 	m_pGlassRawData = NULL;
 
 	m_nLastCommandIdx = -1;
-
-	m_pGlassData = NULL;
-	m_pBlockData = NULL;
-	m_pCellData = NULL;
-	m_pDefectData = NULL;
 }
 
 CDitGlassRawClient::~CDitGlassRawClient(void)
@@ -77,7 +72,7 @@
 }
 
 BOOL CDitGlassRawClient::ConnectGlassRawData()
-{	
+{
 	SIZE_T nGlassRawSharedSize = m_pGlassRawInfo->m_nGlassRawDataSize;
 
 	if(m_hMapGlassData == NULL)
@@ -105,7 +100,9 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
+	/*< KJG 20211024 - #3487 ADD End >*/
 
 	return TRUE;
 }
@@ -138,14 +135,14 @@
 
 	int nCmdId = (m_pGlassRawInfo->m_nCommandIdxWrite+1) % COMMAND_MAXCOUNT;
 
-	if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)
+	if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//둘이 같다는것은 서큘러 버퍼가 한바퀴 돌았다는것!! [김태현 2018/11/12]
 	{
-		m_pGlassRawInfo->m_nCommandIdxRead++;
+		m_pGlassRawInfo->m_nCommandIdxRead++;//가장 오래된 명령 하나를 삭제한다. [김태현 2018/11/12]
 	}
 
 	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nCommand = (short)nCmd;
 	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].strParam;
-	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1;
+	m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1; //-1수행전, 0실패, 1성공 [김태현 2018/11/13]
 
 
 	m_nLastCommandIdx = m_pGlassRawInfo->m_nCommandIdxWrite = nCmdId;
@@ -154,6 +151,30 @@
 
 	return TRUE;
 }
+
+/* < KJG 20240620 - #4942 ADD Start >*/
+void CDitGlassRawClient::ResetClientResultStep()
+{
+	if (isConnect() == FALSE) return;
+
+	if (m_pGlassRawInfo)
+	{
+		m_pGlassRawInfo->m_ClientResultStep = APS_RES_None;
+	}
+}
+
+emClientResult CDitGlassRawClient::GetClientResultStep()
+{
+	if (isConnect() == FALSE) return APS_RES_None;
+
+	if (m_pGlassRawInfo)
+	{
+		return m_pGlassRawInfo->m_ClientResultStep;
+	}
+
+	return APS_RES_None;
+}
+/* < KJG 20240620 - #4942 ADD End >*/
 
 emAOIProcStep CDitGlassRawClient::GetProcessStep()
 {
@@ -172,7 +193,9 @@
 	if(isConnect() == FALSE) return FALSE;
 	m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
 	m_pGlassData->m_bStackRead = FALSE;
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_pGlassData->m_bRawMergeRead = FALSE;
+	/*< KJG 20211024 - #3487 ADD End >*/
 	return SetCommand(grcSequenceGlassLoading);
 }
 
@@ -192,7 +215,7 @@
 
 BOOL CDitGlassRawClient::SetReviewEnd()
 {
-    if(isConnect() == FALSE) return FALSE;
+	if(isConnect() == FALSE) return FALSE;
 	m_pGlassRawInfo->m_ClientProcStep = APS_ReviewEnd;
 	return SetCommand(grcSequenceReviewEnd);
 }
@@ -204,20 +227,10 @@
 	return SetCommand(grcSequenceCustomReviewDataRead);
 }
 
-CDitGlassRawClient* CDitGlassRawClient::GetInstance()
-{
-	if(m_pDitGlassClient == NULL)
-	{
-		m_pDitGlassClient = new CDitGlassRawClient;
-	}
-
-	return m_pDitGlassClient;
-}
-
 void CDitGlassRawClient::RemoveReviewDefects()
 {
 	int nDefectNum = m_pGlassData->m_nDefectNum;
-	int nRightDefectNum = 0;
+	int nRightDefectNum = 0;//기준점 오른쪽에 위치한 결함 갯수
 	int nDefectDeleteNum = 0;
 	for(int i=nDefectNum-1; i>=0; i--)
 	{
@@ -238,5 +251,3 @@
 
 	m_pGlassData->m_nDefectNum = nDefectNum-nDefectDeleteNum;
 }
-
-CDitGlassRawClient* CDitGlassRawClient::m_pDitGlassClient;
\ No newline at end of file
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawClient.h b/ReviewSystem/ReviewSystem/DitGlassRawClient.h
index 3ad927e..c66f391 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawClient.h
+++ b/ReviewSystem/ReviewSystem/DitGlassRawClient.h
@@ -1,20 +1,19 @@
 #pragma once
 
 #include "DitGlassRawStruct.h"
-#include <afxmt.h>
 
 class CDitGlassRawClient
 {
 public:
 	CDitGlassRawClient(void);
 	~CDitGlassRawClient(void);
-	
-public:
-	static CDitGlassRawClient* GetInstance(); //cmark
 
+public:
 	BOOL ConnectServer();
 	BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
 
+	emClientResult GetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
+	void ResetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
 	emAOIProcStep GetProcessStep();
 
 	BOOL SetGlassLoading();
@@ -25,22 +24,25 @@
 
 	BOOL SetReviewComtomize();
 
-	void RemoveReviewDefects();//AOI占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占싹곤옙, 占쏙옙占썰에占쏙옙 占쏙옙占쏙옙占쏙옙 User 혹占쏙옙 Reflow 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占싼댐옙.
+	void RemoveReviewDefects();//AOI에서 생성한 디펙 정보를 제외하고, 리뷰에서 생성한 User 혹은 Reflow 결함을 제외한다.
 
 	_grmDitMemInfo*	GetGlassMeminfo(){return (_grmDitMemInfo*)m_pGlassRawInfo;};
 	_grmGlassData*	GetGlassData(){return m_pGlassData;};
-	_grmBlockData*	GetBlockData(){return m_pBlockData;};
+	_grmBlockData*		GetBlockData(){return m_pBlockData;};
 	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
 	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
 	_grmDefectData*	GetStackData(int nIndex) { return &m_pStackData[nIndex];};
+	/*< KJG 20211024 - #3487 ADD Start >*/
+	_grmDefectData*	GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
+	/*< KJG 20211024 - #3487 ADD End >*/
 
-	//占쏙옙占� 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占� [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//결과 파일 강제 쓰기 명령 [김태현 2018/11/12]
 	BOOL WriteAOIRawFile();
 
-	//占쏙옙占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占싱너몌옙 占쏙옙占승뤄옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2018/11/12]
+	//결과파일 강제 바이너리 형태로 쓰기 [김태현 2018/11/12]
 	BOOL WriteAOIRawBinFile(); 
 
-	//占쏙옙占쏙옙占쏙옙占� 占쏙옙占쏙옙 占쏙옙占싱너몌옙 占싻깍옙 
+	//결과파일 강제 바이너리 읽기 
 	BOOL ReadAOIRawBinFile();
 
 	BOOL WriteReviewRawBinFile();
@@ -49,15 +51,16 @@
 	BOOL ConnectGlassRawInfo();
 	BOOL ConnectGlassRawData();
 	BOOL SetCommand(emGlassRawCommand nCmd);
-	static CDitGlassRawClient* m_pDitGlassClient; //cmark
+
 protected:
 	_grmGlassData*  m_pGlassData;
-	_grmBlockData*	m_pBlockData;
+	_grmBlockData*		m_pBlockData;
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	_grmDefectData* m_pRawMergeData;
-
+	/*< KJG 20211024 - #3487 ADD End >*/
 protected:
 	HANDLE		m_hMapBasicInfo;
 	HANDLE		m_hMapGlassData;
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
index 41f203d..bb93482 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
+++ b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -27,6 +27,16 @@
 		RPT_AOICustom = 1000,
 	};
 };
+
+/* < KJG 20240620 - #4942 ADD Start >*/
+enum emClientResult
+{
+	APS_RES_None = 0,
+	APS_RES_BinarySuccess,
+	APS_RES_BinaryFail
+};
+/* < KJG 20240620 - #4942 ADD End >*/
+
 enum emAOIProcStep
 {
 	APS_None = 0,
@@ -129,7 +139,7 @@
 	int			m_nDefectNumJudgeRV;
 	int			m_nDefectNumJudgeTR;
 	int			m_nDefectNumJudgePR;
-	int			m_nDefectNumJudgePT;		//< KEJ 20231123 - #4669 ADD >
+	int			m_nDefectNumJudgePT; /* < KJG 20231124 - #4627 ADD >*/ 
 	/*< LHS 20211029 - #3783 MOD Start >*/
 	int			m_nDefectNumJudgeLine;
 	/*< LHS 20211029 - #3783 MOD End >*/
@@ -339,7 +349,7 @@
 	int			m_nDefectNumJudgeRV;
 	int			m_nDefectNumJudgeTR;
 	int			m_nDefectNumJudgePR;
-	int			m_nDefectNumJudgePT;		//< KEJ 20231123 - #4669 ADD >
+	int			m_nDefectNumJudgePT; /* < KJG 20231124 - #4627 ADD >*/
 	/*< LHS 20211029 - #3783 MOD Start >*/
 	int			m_nDefectNumJudgeLine;
 	/*< LHS 20211029 - #3783 MOD End >*/
@@ -638,6 +648,8 @@
 	size_t m_nGlassLoadingCount;
 	emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
 	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
+	// m_ClientResultStep : Binary File 생성 감지하기 위한 신호로 사용
+	emClientResult m_ClientResultStep;  /* < KJG 20240620 - #4942 ADD Start >*/
 };
 
 class CgrmGlassRawData
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
index 9ffdfdb..ee28e1c 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -53,6 +53,7 @@
 
 #define AOIRAWBIN_PATH		"\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
 #define AOIRAWBIN_TEST_PATH		"d:\\DIT_ResultData\\RawBin"
+#define AOIRAWBIN_LOCAL_PATH			"D:\\DIT_ResultData\\RawBin"
 #define AOIRAWBIN_NETWORK_DRIVE_PATH	"Y:\\RawBin"
 
 enum CPJT_MeasureMode { CPJT_ModeAuto = 0, CPJT_ModeManual };
@@ -1899,6 +1900,24 @@
 // 	if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
 // 		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
 
+	/* < KEJ 20240621 - #4942 ADD Start > */
+	STransferData* pTransferData = m_pSP2P->ISP2P_GetCurrentTransferData();
+	CString strGlassStepIdTemp = pTransferData->strStepID;
+	CString strGlassIDTemp = pTransferData->strGlassID;
+
+	CString strFileName;
+	strFileName.Format(_T("%s\\%s_%s.bin"), AOIRAWBIN_LOCAL_PATH, strGlassIDTemp, strGlassStepIdTemp);
+
+	CFile file;
+	if (file.Open(strFileName, CFile::modeRead))
+	{
+		file.Close();
+		DeleteFile(strFileName);
+		g_pLog->DisplayMessage(_T("[SequenceProcessor] Delete RAW BIN File [%s]"), strFileName);
+	}
+	file.Close();
+	/* < KEJ 20240621 - #4942 ADD  End > */
+
 	m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Ready"));
 	m_pSP2P->ISP2P_GetReviewProcessor()->FileMonitorThreadStart(); /* < KJG 20230630 - #4517 ADD Start >*/
 	m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Complete"));
@@ -3083,159 +3102,175 @@
 
 BOOL CSequenceProcessor_CPJT::FindRawBinFile(CString strFileName)
 {
-	/* < KJG 20230605 - #4517 ADD Start >*/
-	auto FuncStringSplit = [](string Sentence, char Separator, vector<string>& vec)
-	{
-		stringstream ss(Sentence);
-		string tmp;
+	/* < KEJ 20240621 - #4942 MOD Start > */
+// 	/* < KJG 20230605 - #4517 ADD Start >*/
+// 	auto FuncStringSplit = [](string Sentence, char Separator, vector<string>& vec)
+// 	{
+// 		stringstream ss(Sentence);
+// 		string tmp;
+// 
+// 		while (getline(ss, tmp, Separator)) {
+// 			vec.push_back(tmp);
+// 		}
+// 	};
+// 	/* < KJG 20230605 - #4517 ADD End >*/
+// 
+// 	//210128
+// 	CString strFilePath = _T("");
+// 	//pData->GetGlassData()->m_strFileName;
+// 	//strcpy(pData->GetGlassData()->m_strPath, AOIRAWBIN_PATH);
+// 	//strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
+// 
+// 	strFilePath = AOIRAWBIN_PATH;
+// 
+// 	CString strFindFile;
+// 	int nCloseTime = 600 * 100000;//sec
+// 	int nReTryTime = 30;
+// 	{
+// 		CTime tmReviewLoading = CTime::GetCurrentTime();
+// 		CString strWild;
+// 		//strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
+// 		CakFileUtil akFileFinder;
+// 		while (nReTryTime--)
+// 		{
+// 			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
+// 			if (nReTryTime%2 == 0)
+// 			{
+// 				strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH;
+// 			}
+// 			else strFilePath = AOIRAWBIN_PATH;
+// 
+// 			//strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); /* < KJG 20230605 - #4517 DEL >*/
+// 			//akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); /* < KJG 20230605 - #4517 DEL >*/
+// 
+// 			/* < KJG 20230605 - #4517 ADD Start >*/
+// 			auto timeStart = chrono::steady_clock::now();
+// 			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Start Find Path = %s, File Name = %s, TryCount = %d"), strFilePath, strFileName, 30 - nReTryTime);
+// 
+// 			std::error_code err;
+// 			vector<std::string> vtFileList;
+// 			fs::path pathBinFile(strFilePath.GetBuffer(0));
+// 			int constexpr SaperatorCount = 4, DateSize = 8, TimeSize = 6; // GLASSID_STEPID_'YYYYMMDD'_'HHMMSS' �룷留� �솗�씤
+// 			for (auto iter = fs::directory_iterator(pathBinFile, err); iter != fs::directory_iterator(); iter++)
+// 			{
+// 				fs::path p = iter->path();
+// 				if (p.filename().stem().string().find(strFileName) != string::npos)
+// 				{
+// 					std::string strSearchFile = p.filename().stem().string();
+// 					if (p.extension().string() == _T(".bin"))
+// 					{
+// 						vtFileList.push_back(p.filename().stem().string());
+// 					}
+// 				}
+// 			}
+// 
+// 			for (auto iter = vtFileList.begin(); iter != vtFileList.end(); ) 
+// 			{
+// 				vector<string> vtSplit;
+// 				FuncStringSplit(*iter, _T('_'), vtSplit);
+// 
+// 				if (vtSplit.size() == SaperatorCount && vtSplit[2].size() == DateSize && vtSplit[3].size() == TimeSize)
+// 				{
+// 					iter++;
+// 				}
+// 				else
+// 				{
+// 					vtFileList.erase(iter);
+// 				}
+// 			}
+// 
+// 			sort(vtFileList.begin(), vtFileList.end(), greater<>()); // 理쒖떊�닚�쑝濡� �젙�젹
+// 
+// 			string strPickFileName = vtFileList.empty() ? _T("NULL") : vtFileList.front();
+// 			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] End File Count = %d, Pick File Name = %s, Tact = %d, ErrorCode = %d, ErrorMsg = %s"), vtFileList.size(), strPickFileName.c_str(), chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - timeStart).count(),err.value(), err.message().c_str());
+// 
+// 			if (vtFileList.empty() == FALSE)
+// 			{
+// 				vector<string> vtSplit;
+// 				FuncStringSplit(strPickFileName, _T('_'), vtSplit);
+// 				
+// 				CTime tmTemp(stoi(vtSplit[2].substr(0, 4)), stoi(vtSplit[2].substr(4, 2)), stoi(vtSplit[2].substr(6, 2)), stoi(vtSplit[3].substr(0, 2)), stoi(vtSplit[3].substr(2, 2)), stoi(vtSplit[3].substr(4, 2)));
+// 				CTimeSpan tmSpan = tmReviewLoading - tmTemp;
+// 				
+// 				if (tmSpan < nCloseTime)
+// 				{
+// 					strFindFile = strPickFileName.c_str();
+// 					g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find File Success"));
+// 					break;
+// 				}
+// 			}
+// 			/* < KJG 20230605 - #4517 ADD End >*/
+// 
+// 			/* < KJG 20230605 - #4517 DEL Start >*/ 
+// 			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
+// 			//VECFINDDATA* pFindData = akFileFinder.getFindData();
+// 			//int nFileNamePos = strlen(akFileFinder.getProcessPath());
+// 			//std::map<LONGLONG, CString> mapSpanFileName;
+// 			//for (int i = 0; i < pFindData->size(); i++)
+// 			//{
+// 			//	char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
+// 			//	{
+// 			//		CakParser parser;
+// 			//		parser.process(pFileName, "_.");
+// 			//		if (parser.getTokNum() < 4) continue;
+// 			//		
+// 			//		if (parser.getTokNum() >= 6) continue; // 0401
+// 			//
+// 			//		int nDataTime[8] = {};
+// 			//		{
+// 			//			int nTokIndex = 0;
+// 			//			const char* pGlassId = parser.getTokStr(nTokIndex++);
+// 			//			const char* pStepId = parser.getTokStr(nTokIndex++);
+// 			//			char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
+// 			//			char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
+// 			//
+// 			//			nDataTime[0] = (pDate[0] - '0') * 1000 + (pDate[1] - '0') * 100 + (pDate[2] - '0') * 10 + (pDate[3] - '0') * 1;
+// 			//			nDataTime[1] = (pDate[4] - '0') * 10 + (pDate[5] - '0') * 1;
+// 			//			nDataTime[2] = (pDate[6] - '0') * 10 + (pDate[7] - '0') * 1;
+// 			//			nDataTime[3] = (pTime[0] - '0') * 10 + (pTime[1] - '0') * 1;
+// 			//			nDataTime[4] = (pTime[2] - '0') * 10 + (pTime[3] - '0') * 1;
+// 			//			nDataTime[5] = (pTime[4] - '0') * 10 + (pTime[5] - '0') * 1;
+// 			//		}
+// 			//
+// 			//		CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5]);
+// 			//		CTimeSpan tmSpan = tmReviewLoading - tmTemp;
+// 			//		mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
+// 			//	}
+// 			//}
+// 			//
+// 			//if (mapSpanFileName.empty() == FALSE)
+// 			//{
+// 			//	if (mapSpanFileName.begin()->first < nCloseTime)
+// 			//	{
+// 			//		strFindFile = mapSpanFileName.begin()->second;
+// 			//		break;
+// 			//	}
+// 			//}
+// 			//
+// 			//akFileFinder.clear();
+// 			/* < KJG 20230605 - #4517 DEL End >*/
+// 
+// 
+// 			Sleep(100);
+// 		}
+// 	}
+//	if (strFindFile.IsEmpty()) return FALSE;
 
-		while (getline(ss, tmp, Separator)) {
-			vec.push_back(tmp);
-		}
-	};
-	/* < KJG 20230605 - #4517 ADD End >*/
-
-	//210128
-	CString strFilePath = _T("");
-	//pData->GetGlassData()->m_strFileName;
-	//strcpy(pData->GetGlassData()->m_strPath, AOIRAWBIN_PATH);
-	//strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
-
-	strFilePath = AOIRAWBIN_PATH;
-
+ 	CString strFilePath = _T("");
+ 
+ 	strFilePath = AOIRAWBIN_LOCAL_PATH;
 	CString strFindFile;
-	int nCloseTime = 600 * 100000;//sec
-	int nReTryTime = 30;
+	strFindFile.Format(_T("%s\\%s.bin"), strFilePath, strFileName);
+
+	CFile file;
+	if (!file.Open(strFindFile, CFile::modeRead))
 	{
-		CTime tmReviewLoading = CTime::GetCurrentTime();
-		CString strWild;
-		//strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
-		CakFileUtil akFileFinder;
-		while (nReTryTime--)
-		{
-			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
-			if (nReTryTime%2 == 0)
-			{
-				strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH;
-			}
-			else strFilePath = AOIRAWBIN_PATH;
-
-			//strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); /* < KJG 20230605 - #4517 DEL >*/
-			//akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); /* < KJG 20230605 - #4517 DEL >*/
-
-			/* < KJG 20230605 - #4517 ADD Start >*/
-			auto timeStart = chrono::steady_clock::now();
-			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Start Find Path = %s, File Name = %s, TryCount = %d"), strFilePath, strFileName, 30 - nReTryTime);
-
-			std::error_code err;
-			vector<std::string> vtFileList;
-			fs::path pathBinFile(strFilePath.GetBuffer(0));
-			int constexpr SaperatorCount = 4, DateSize = 8, TimeSize = 6; // GLASSID_STEPID_'YYYYMMDD'_'HHMMSS' �룷留� �솗�씤
-			for (auto iter = fs::directory_iterator(pathBinFile, err); iter != fs::directory_iterator(); iter++)
-			{
-				fs::path p = iter->path();
-				if (p.filename().stem().string().find(strFileName) != string::npos)
-				{
-					std::string strSearchFile = p.filename().stem().string();
-					if (p.extension().string() == _T(".bin"))
-					{
-						vtFileList.push_back(p.filename().stem().string());
-					}
-				}
-			}
-
-			for (auto iter = vtFileList.begin(); iter != vtFileList.end(); ) 
-			{
-				vector<string> vtSplit;
-				FuncStringSplit(*iter, _T('_'), vtSplit);
-
-				if (vtSplit.size() == SaperatorCount && vtSplit[2].size() == DateSize && vtSplit[3].size() == TimeSize)
-				{
-					iter++;
-				}
-				else
-				{
-					vtFileList.erase(iter);
-				}
-			}
-
-			sort(vtFileList.begin(), vtFileList.end(), greater<>()); // 理쒖떊�닚�쑝濡� �젙�젹
-
-			string strPickFileName = vtFileList.empty() ? _T("NULL") : vtFileList.front();
-			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] End File Count = %d, Pick File Name = %s, Tact = %d, ErrorCode = %d, ErrorMsg = %s"), vtFileList.size(), strPickFileName.c_str(), chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - timeStart).count(),err.value(), err.message().c_str());
-
-			if (vtFileList.empty() == FALSE)
-			{
-				vector<string> vtSplit;
-				FuncStringSplit(strPickFileName, _T('_'), vtSplit);
-				
-				CTime tmTemp(stoi(vtSplit[2].substr(0, 4)), stoi(vtSplit[2].substr(4, 2)), stoi(vtSplit[2].substr(6, 2)), stoi(vtSplit[3].substr(0, 2)), stoi(vtSplit[3].substr(2, 2)), stoi(vtSplit[3].substr(4, 2)));
-				CTimeSpan tmSpan = tmReviewLoading - tmTemp;
-				
-				if (tmSpan < nCloseTime)
-				{
-					strFindFile = strPickFileName.c_str();
-					g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find File Success"));
-					break;
-				}
-			}
-			/* < KJG 20230605 - #4517 ADD End >*/
-
-			/* < KJG 20230605 - #4517 DEL Start >*/ 
-			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
-			//VECFINDDATA* pFindData = akFileFinder.getFindData();
-			//int nFileNamePos = strlen(akFileFinder.getProcessPath());
-			//std::map<LONGLONG, CString> mapSpanFileName;
-			//for (int i = 0; i < pFindData->size(); i++)
-			//{
-			//	char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
-			//	{
-			//		CakParser parser;
-			//		parser.process(pFileName, "_.");
-			//		if (parser.getTokNum() < 4) continue;
-			//		
-			//		if (parser.getTokNum() >= 6) continue; // 0401
-			//
-			//		int nDataTime[8] = {};
-			//		{
-			//			int nTokIndex = 0;
-			//			const char* pGlassId = parser.getTokStr(nTokIndex++);
-			//			const char* pStepId = parser.getTokStr(nTokIndex++);
-			//			char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
-			//			char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
-			//
-			//			nDataTime[0] = (pDate[0] - '0') * 1000 + (pDate[1] - '0') * 100 + (pDate[2] - '0') * 10 + (pDate[3] - '0') * 1;
-			//			nDataTime[1] = (pDate[4] - '0') * 10 + (pDate[5] - '0') * 1;
-			//			nDataTime[2] = (pDate[6] - '0') * 10 + (pDate[7] - '0') * 1;
-			//			nDataTime[3] = (pTime[0] - '0') * 10 + (pTime[1] - '0') * 1;
-			//			nDataTime[4] = (pTime[2] - '0') * 10 + (pTime[3] - '0') * 1;
-			//			nDataTime[5] = (pTime[4] - '0') * 10 + (pTime[5] - '0') * 1;
-			//		}
-			//
-			//		CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5]);
-			//		CTimeSpan tmSpan = tmReviewLoading - tmTemp;
-			//		mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
-			//	}
-			//}
-			//
-			//if (mapSpanFileName.empty() == FALSE)
-			//{
-			//	if (mapSpanFileName.begin()->first < nCloseTime)
-			//	{
-			//		strFindFile = mapSpanFileName.begin()->second;
-			//		break;
-			//	}
-			//}
-			//
-			//akFileFinder.clear();
-			/* < KJG 20230605 - #4517 DEL End >*/
-
-
-			Sleep(100);
-		}
+		g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Bin File Is Not Collect [%s]"), strFindFile);
+		return FALSE;
 	}
+	file.Close();
 
-	if (strFindFile.IsEmpty()) return FALSE;
+	/* < KEJ 20240621 - #4942 MOD  End > */
 
 	return TRUE;
 }

--
Gitblit v1.9.3