From 6dc80508b1c0f431007f8a8c947c152ec00c3d15 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期一, 08 九月 2025 09:24:05 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/PortConfigurationDlg.cpp |  108 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 86 insertions(+), 22 deletions(-)

diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 62b883a..62ad3a0 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -11,8 +11,6 @@
 #include "RecipeManager.h"
 #include "ServoCommo.h"
 
-
-
 #define CHECKBOX_ALL_ID        0x1234
 
 // CPortConfigurationDlg 瀵硅瘽妗�
@@ -56,6 +54,10 @@
         return;
     }
 
+    CStringArray permissions;
+    permissions.Add(_T("G1"));
+    permissions.Add(_T("G2"));
+
     SetDlgItemText(IDC_EDIT_LOTID, "");
     SetDlgItemText(IDC_EDIT_PRODUCTID, "");
     SetDlgItemText(IDC_EDIT_OPERATIONID, "");
@@ -68,11 +70,11 @@
             continue;
         }
 
-
         // 璁剧疆 Panel ID 鍜屽嬀閫夋
         SERVO::CGlass* pGlass = dynamic_cast<SERVO::CGlass*>(pSlot->getContext());
+        SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
         int nRow = i + 1;
-        if (pGlass != nullptr) {
+        if (pGlass != nullptr && pJobDataS != nullptr) {
             m_wndGrid.SetItemState(nRow, 0, GVIS_READONLY);
             m_wndGrid.SetItemText(nRow, 0, pSlot->getName().c_str());
             m_wndGrid.SetCellType(nRow, 1, RUNTIME_CLASS(CGridCellCheck));
@@ -80,18 +82,44 @@
             ASSERT(pCheck);
             pCheck->SetCheck(pGlass->isScheduledForProcessing());
             pCheck->SetText(pGlass->getID().c_str());
+
+            if (m_wndGrid.SetCellType(nRow, 2, RUNTIME_CLASS(CGridCellCombo))) {
+                CGridCellCombo* pCell = static_cast<CGridCellCombo*>(m_wndGrid.GetCell(nRow, 2));
+                pCell->SetOptions(permissions);
+                pCell->SetStyle(CBS_DROPDOWNLIST);
+
+                int nMaterialsType = pJobDataS->getMaterialsType() - 1;
+                if (nMaterialsType < 0 || nMaterialsType > 2) {
+                    nMaterialsType = 0;
+                }
+                m_wndGrid.SetItemText(nRow, 2, permissions.GetAt(nMaterialsType));
+            }
         }
         m_wndGrid.SetItemData(nRow, 0, (LPARAM)pGlass);
-
 
         // 鍥炲~ Job 淇℃伅锛堝彧鍙栫涓�涓湁鏁� Glass锛�
         if (!bJobInfoSet && pGlass) {
             SERVO::CJobDataS* pJS = pGlass->getJobDataS();
-            if (pJS) {
+            if (pJS) {        
+                int nRecipeID = pJobDataS->getMasterRecipe();
+                std::string strRecipeName = RecipeManager::getInstance().getPPIDById(nRecipeID);
                 SetDlgItemText(IDC_EDIT_LOTID, CString(pJS->getLotId().c_str()));
                 SetDlgItemText(IDC_EDIT_PRODUCTID, CString(pJS->getProductId().c_str()));
                 SetDlgItemText(IDC_EDIT_OPERATIONID, CString(pJS->getOperationId().c_str()));
                 m_comboMaterialsType.SetCurSel(pJS->getMaterialsType() - 1);
+
+                if (!strRecipeName.empty()) {
+                    CString csRecipeName(strRecipeName.c_str());
+                    int nIndex = m_comboRecipe.FindStringExact(-1, csRecipeName);
+                    if (nIndex != CB_ERR) {
+                        m_comboRecipe.SetCurSel(nIndex);
+                    }
+                    else {
+						AfxMessageBox(_T("褰撳墠閰嶆柟鍦ㄧ郴缁熶腑涓嶅瓨鍦紝璇烽噸鏂伴�夋嫨锛�"), MB_ICONWARNING);
+                        m_comboRecipe.SetCurSel(0);
+                    }
+				}
+
                 bJobInfoSet = true;
             }
         }
@@ -105,7 +133,7 @@
         return;
     }
 
-    const int nCols = 2;
+    const int nCols = 3;
     const int nFixRows = 1;
 	const int nRows = SLOT_MAX + 1; // 瀛樺湪琛ㄥご锛屾墍浠� +1
 
@@ -130,6 +158,8 @@
     m_wndGrid.SetItemText(0, nColIdx++, _T("Slot ID"));
     m_wndGrid.SetColumnWidth(nColIdx, 60);
     m_wndGrid.SetItemText(0, nColIdx++, _T("Glass ID"));
+    m_wndGrid.SetColumnWidth(nColIdx, 60);
+    m_wndGrid.SetItemText(0, nColIdx++, _T("鐗╂枡绫诲瀷"));
 
 
     // 璁剧疆琛屼负鏍峰紡
@@ -137,7 +167,7 @@
     m_wndGrid.SetFixedColumnSelection(FALSE);
     m_wndGrid.SetEditable(TRUE);
     m_wndGrid.SetRowResize(FALSE);
-    m_wndGrid.SetColumnResize(TRUE);
+    m_wndGrid.SetColumnResize(FALSE);
     m_wndGrid.SetListMode(TRUE);
     m_wndGrid.EnableSelection(TRUE);
     m_wndGrid.SetSingleRowSelection(TRUE);
@@ -219,7 +249,7 @@
         m_comboMaterialsType.AddString(item);
     }
     m_comboMaterialsType.SetCurSel(0);  // 榛樿閫夋嫨绗竴涓墿鏂欑被鍨�
-
+    m_comboMaterialsType.EnableWindow(FALSE);
     InitGrid();
 
 	LoadPortConfigToUI(m_pPort[0]);     // 榛樿鍔犺浇绗竴涓鍙g殑閰嶇疆
@@ -235,11 +265,9 @@
         SetWindowText(_T("Port Configuration"));
     }
 
-
     // Porcess Start / Process Cancel 鎸夐挳鐘舵��
     GetDlgItem(IDC_BUTTON_PROCESS_START)->EnableWindow(FALSE);
     GetDlgItem(IDC_BUTTON_PROCESS_CANCEL)->EnableWindow(FALSE);
-
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
@@ -254,6 +282,12 @@
 	}
 
 	// 鍔犺浇閫変腑绔彛鐨勯厤缃埌 UI
+    for (int i = 1; i <= 8; i++) {
+        m_wndGrid.SetItemText(i, 0, "");
+        m_wndGrid.SetItemText(i, 1, "");
+        m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellNumeric));
+    }
+    m_wndGrid.Invalidate();
 	LoadPortConfigToUI(m_pPort[selPort]);
 }
 
@@ -277,16 +311,19 @@
         m_comboRecipe.GetLBText(selRecipe, str);
         config.strRecipe = CT2A(str.GetString());
     }
+    int nRecipeID = RecipeManager::getInstance().getIdByPPID(config.strRecipe);
+    RecipeInfo stRecipeInfo = RecipeManager::getInstance().getRecipeByPPID(config.strRecipe);
+    std::vector<DeviceRecipe> vecRecipeInfo = stRecipeInfo.vecDeviceList;
 
     // 鑾峰彇 Material Type 绱㈠紩锛堢储寮曚粠 0 寮�濮嬶紝瀵瑰簲鏋氫妇浠� 1 寮�濮嬶級
-    int selMaterial = m_comboMaterialsType.GetCurSel();
-    if (selMaterial != CB_ERR) {
-        config.nMaterialType = selMaterial + 1;
-    }
-	else {
-		AfxMessageBox(_T("Please select a material type!"));
-		return;
-	}
+    //int selMaterial = m_comboMaterialsType.GetCurSel();
+    //if (selMaterial != CB_ERR) {
+    //    config.nMaterialType = selMaterial + 1;
+    //}
+	//else {
+	//	AfxMessageBox(_T("Please select a material type!"));
+	//	return;
+	//}
 
     // 鑾峰彇 Lot ID / Product ID / Operation ID
     CString strText;
@@ -314,17 +351,44 @@
     // 鑾峰彇 Grid 琛ㄦ牸涓� Slot 鐘舵�侊紙绗�1~8琛岋級
     for (int i = 1; i <= SLOT_MAX; ++i) {
         SERVO::CGlass* pGlass = (SERVO::CGlass*)m_wndGrid.GetItemData(i, 0);
+        int nMaterialType = m_wndGrid.GetItemText(i, 2).CompareNoCase("G1") == 0 ? 1 : 2;
         if (pGlass != nullptr) {
             CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
-            ASSERT(pCheck);
+            CGridCellCombo* pCombo = dynamic_cast<CGridCellCombo*>(m_wndGrid.GetCell(i, 2));
+            ASSERT(pCheck && pCombo);
             pGlass->setScheduledForProcessing(pCheck->GetCheck());
-            pGlass->setType(static_cast<SERVO::MaterialsType>(config.nMaterialType));
+            pGlass->setType(static_cast<SERVO::MaterialsType>(nMaterialType));
 
             SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
             pJobDataS->setLotId(config.strLotID.c_str());
             pJobDataS->setProductId(config.strProductID.c_str());
             pJobDataS->setOperationId(config.strOperationID.c_str());
-            pJobDataS->setMaterialsType(config.nMaterialType);
+            pJobDataS->setMaterialsType(nMaterialType);
+            pJobDataS->setMasterRecipe(nRecipeID);
+
+            for (const auto& info : vecRecipeInfo) {
+                const std::string& name = info.strDeviceName;
+                short nRecipeID = (short)info.nRecipeID;
+
+                if (name == EQ_NAME_EFEM) {
+                    pJobDataS->setDeviceRecipeId(0, nRecipeID);
+                }
+                else if (name == EQ_NAME_BONDER1) {
+                    pJobDataS->setDeviceRecipeId(1, nRecipeID);
+                }
+                else if (name == EQ_NAME_BONDER2) {
+                    pJobDataS->setDeviceRecipeId(2, nRecipeID);
+                }
+                else if (name == EQ_NAME_BAKE_COOLING) {
+                    pJobDataS->setDeviceRecipeId(3, nRecipeID);
+                }
+                else if (name == EQ_NAME_VACUUMBAKE) {
+                    pJobDataS->setDeviceRecipeId(4, nRecipeID);
+                }
+                else if (name == EQ_NAME_MEASUREMENT) {
+                    pJobDataS->setDeviceRecipeId(5, nRecipeID);
+                }
+            }
         }
     }
 

--
Gitblit v1.9.3