/// <summary> /// 取得預約工作站的第一個RuleName /// </summary> /// <param name="operationName"></param> /// <returns></returns> public static string GetFirstOperationTypeRuleByOperationName(LotInfo lot, string operationName, string ruleName) { //取得預約站點的第一個Rule var frstRuleType = OperationTypeRuleInfo.GetFirstOperationTypeRuleByOperationName(operationName); if (frstRuleType == null) { //站點:{0},找不到設定規則,請確認[工作站設定] throw new Exception(RuleMessage.Error.C10002(operationName)); } //檢查目前使用程式的RuleName是否與預約站點的第一個Rule相同,如果不同,則拋出錯誤訊息 if (frstRuleType.RuleName != ruleName) { //該批號作業為{0},不為此功能,請遵循作業規範 throw new Exception(RuleMessage.Error.C10004(lot.CurrentRuleName)); } //確認預約工作站是否有開啟預約功能 var operationData = OperationInfo.GetOperationByName(operationName).ChangeTo <OperationInfoEx>(); if (operationData.ReserveFlag == "N") { //工作站:{0} 系統屬性設定沒有開啟預約功能! throw new Exception(RuleMessage.Error.C10068(operationData.OperationName)); } return(frstRuleType.RuleName); }
/// <summary> /// 檢查傳入機台是否符合工單上線別內可使用機台名稱 /// </summary> /// <param name="equipmentName"></param> /// <param name="lotData"></param> /// <returns></returns> public static bool CheckEqpGruopAndDivision(string equipmentName, LotInfo lot) { bool checkResult = false; //找出工單上的線別(division),再用線別名稱去工作站的機台設定,找出同名稱的機台群組,再比照機台的正確性 //取得批號目前的工作站資料 var operationData = OperationInfo.GetOperationByName(lot.OperationName); if (operationData == null) { //機台:{0},不在可用機台範圍,請至 [工作站設定] 確認機台設定 throw new Exception(RuleMessage.Error.C10005(equipmentName)); } //依據批號工作站找出歸屬的機台群組清單 List <OperationResourceInfoEx> resourceDataList = OperationResourceInfoEx.GetDataByOperSID(operationData.OperationSID); if (resourceDataList.Count == 0) { //機台:{0},不在可用機台範圍,請至 [工作站設定] 確認機台設定 throw new Exception(RuleMessage.Error.C10005(equipmentName)); } foreach (var resourceData in resourceDataList) { //找出同名稱的機台群組 var equipGroupData = EquipmentGroupInfo.GetEquipmentGroupByID(resourceData.ResourceID); //找出工單上的線別(Division) var workOrder = WorkOrderInfo.GetWorkOrderByWorkOrder(lot.WorkOrder).ChangeTo <WorkOrderInfoEx>(); if (equipGroupData.GroupName == workOrder.Division) { //用群組SID找出在該群組下的工作站 List <EquipGroupEquipInfoEx> eqGroupDataList = EquipGroupEquipInfoEx.GetEquipGroupByGroupSID(equipGroupData.ID); if (eqGroupDataList.Find(p => p.EquipmentName == equipmentName) != null) { checkResult = true; } } } return(checkResult); }
protected void ttbWOLot_TextChanged(object sender, EventArgs e) { try { /**************************************************************** * 1. 依照工作站點及料號的設定,判斷批號是否可執行中心孔資訊收集。 * 2. 部分料號就算不收中心孔資訊,但需要收集DMC * 3. 若不須收集中心孔,且prodType = 'W',連DMC都不須執行 ****************************************************************/ ttbWorkpiece.ReadOnly = true; ttbTemperature.ReadOnly = true; // 清除資料與使用者介面 ClearField(); string sWOLot = ttbWOLot.Text.Trim(); if (sWOLot.IsNullOrEmpty()) { return; } // 小工單號找批號 //var lotInfo = LotInfoEx.GetLotByWorkOrderLot(sWOLot); ProcessLotData = LotInfoEx.GetLotByLot(sWOLot); if (ProcessLotData == null) { ttbWOLot.Text = ""; AjaxFocus(ttbWOLot); throw new RuleCimesException(TextMessage.Error.T00030(lblWOLot.Text + "(" + sWOLot + ")", GetUIResource("Lot"))); } _ComponentList = ComponentInfo.GetLotAllComponents(ProcessLotData); //取得小工單號的料號版本 var deviceVersionInfo = DeviceVersionInfo.GetLotCurrentDeviceVersion(ProcessLotData).ChangeTo <DeviceVersionInfoEx>(); if (deviceVersionInfo == null) { throw new CimesException(TextMessage.Error.T00537(ProcessLotData.DeviceName)); } if (deviceVersionInfo.ProdType.IsNullOrTrimEmpty()) { ttbWOLot.Text = ""; AjaxFocus(ttbWOLot); throw new RuleCimesException(TextMessage.Error.T00031(GetUIResource("Device"), deviceVersionInfo.DeviceName, "PRODTYPE")); } _ProdType = deviceVersionInfo.ProdType; _CenterHoleFlag = deviceVersionInfo.CenterHoleFlag; //確認執行的工作站是否需要收集中心孔 var operData = OperationInfo.GetOperationByName(ProcessLotData.OperationName).ChangeTo <OperationInfoEx>(); if (operData == null) { throw new CimesException(TextMessage.Error.T00171(ProcessLotData.OperationName)); } if (!operData.CenterHoleFlag.ToBool() && !operData.GetDMC.ToBool()) { AjaxFocus(ttbWOLot); throw new CimesException(RuleMessage.Error.C00042(ProcessLotData.OperationName)); } //若不須收集中心孔,且prodType = 'W',連DMC都不須執行 if (!_CenterHoleFlag.ToBool() && deviceVersionInfo.ProdType == CustomizeFunction.ProdType.W.ToCimesString()) { AjaxFocus(ttbWOLot); throw new CimesException(RuleMessage.Error.C00043(ProcessLotData.DeviceName)); } if (_CenterHoleFlag.ToBool()) { gvComponentEDC.Visible = true; } else { gvComponentEDC.Visible = false; } ttbWorkpiece.ReadOnly = false; AjaxFocus(ttbWorkpiece); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查維修原因是否有選擇 ddlRepairReasonCode.Must(lblJudgeReason); #region 檢查維修結果是否有選擇 if (rdbOK.Checked == false && rdbNG.Checked == false) { throw new Exception(TextMessage.Error.T00841(lblRepairResult.Text)); } #endregion using (var cts = CimesTransactionScope.Create()) { //選取的原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlRepairReasonCode.SelectedValue); #region 紀錄維修結束 To do... List <WIPRepairFinishInfo> repairFinishDatas = new List <WIPRepairFinishInfo>(); var repairData = WIPRepairInfo.GetRepairByLotAndReason(_LotData.Lot, _DefectJudgementData.Reason); var repairFinishData = WIPRepairFinishInfo.CreateInfo(repairData); repairFinishData.ActionCategory = reasonCategory.Category; repairFinishData.ActionReasonCode = reasonCategory.Reason; repairFinishData.ActionReasonSID = reasonCategory.ReasonSID; repairFinishData.Result = rdbOK.Checked ? "OK" : "NG"; repairFinishDatas.Add(repairFinishData); var issueOperation = OperationInfo.GetOperationByName(_LotData.OperationName); WIPTransaction.RepairEnd(_LotData, repairFinishDatas, issueOperation, txnStamp); #endregion #region 2017/10/26 跟詩涵確認,無論維修結果如何,一律送回待判站由品保決定處理結果 /* #region OK:依照批號的UDC02(工作站序號)+UDC03(工作站名稱)找出預設流程的下一站點,將批號跳站至該站 * * if (rdbOK.Checked) * { * //取得流程線上版本 取得目前Lot的所有流程(所有工作站) * RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(_LotData.RouteName); * * //以此工作站名稱去查詢在流程中的序號 * var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == _LotData.UserDefineColumn03); * * var lastOperationSeq = string.Format("{0:000}", (Convert.ToDecimal(routeOperation.OperationSequence) + 1)); * * //下一個工作站 用LOT和流程中下一站的序號去查出下一個工作站資訊 * var NextRouteOperation = RouteOperationInfo.GetRouteOperationByLotSequence(_LotData, lastOperationSeq); * * if (NextRouteOperation == null) * { * //批號:{0}已無下個工作站點,請確認[流程設定] * throw new Exception(RuleMessage.Error.C10008(_LotData.Lot)); * } * * //將批號的UDC02清空 * WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL02", "", txnStamp); * * //將批號的UDC03清空 * WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL03", "", txnStamp); * * //執行出站 * WIPTransaction.CheckOut(_LotData, txnStamp); * * WIPTransaction.ReassignOperation(_LotData, NextRouteOperation, reasonCategory, ttbRepairDescr.Text, txnStamp); * } #endregion * #region NG:送到下一站 * if (rdbNG.Checked) * { * //執行出站 * WIPTransaction.CheckOut(_LotData, txnStamp); * * WIPTransaction.DispatchLot(_LotData, txnStamp); * } #endregion * */ #endregion //執行出站 WIPTransaction.CheckOut(_LotData, txnStamp); WIPTransaction.DispatchLot(_LotData, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認是否有選擇送待判原因 ddlJudgeDefect.Must(lblJudgeDefect); #region 檢查判定結果是否有選擇 if (rdbGoods.Checked == false && rdbRepair.Checked == false && rdbDefectInv.Checked == false && rdbScrapInv.Checked == false) { throw new Exception(TextMessage.Error.T00841(lblJudgeResult.Text)); } #endregion //檢查判定原因是否有選擇 ddlJudgeReason.Must(lblJudgeReason); using (var cts = CimesTransactionScope.Create()) { #region 依照選擇的判定結果,對批號進行不同的處置 //選取的判定結果 string result = ""; //選取的原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlJudgeReason.SelectedValue); #region 良品:依照批號的UDC02(工作站序號)+UDC03(工作站名稱)找出預設流程的下一站點,將批號跳站至該站 if (rdbGoods.Checked) { result = "Good"; //取得流程線上版本 取得目前Lot的所有流程(所有工作站) RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(_LotData.RouteName); //取得設定包裝工作站名稱 var packingOperation = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks("SAIPackingOperation"); if (packingOperation.Count == 0) { //T00555:查無資料,請至系統資料維護新增類別{0}、項目{1}! throw new CimesException(TextMessage.Error.T00555("SAIPackingOperation", "")); } var reassignOperation = packingOperation[0]; //如果送待判站之前記錄的是包裝站,則直接跳至包裝站,反之,跳至下一站 if (reassignOperation.Remark01 == _LotData.UserDefineColumn03) { //取得包裝站名稱 string qcOperationName = reassignOperation.Remark01; //取得包裝工作站資訊 var operation = OperationInfo.GetOperationByName(qcOperationName); if (operation == null) { //T00171, 工作站:{0}不存在!! throw new CimesException(TextMessage.Error.T00171(qcOperationName)); } //根據指定的流程名稱、流程版本、工作站名稱, 找出第一個符合的流程工作站,新的站點包裝 var newOperation = RouteOperationInfo.GetRouteOperationByOperationName(_LotData.RouteName, _LotData.RouteVersion, qcOperationName); //將批號的UDC02清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL02", "", txnStamp); //將批號的UDC03清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL03", "", txnStamp); //變更至指定工作站 WIPTransaction.ReassignOperation(_LotData, newOperation, reasonCategory, ttbJudgeDescr.Text, txnStamp); } else { //以此工作站名稱去查詢在流程中的序號 var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == _LotData.UserDefineColumn03); var lastOperationSeq = string.Format("{0:000}", (Convert.ToDecimal(routeOperation.OperationSequence) + 1)); //下一個工作站 用LOT和流程中下一站的序號去查出下一個工作站資訊 var NextRouteOperation = RouteOperationInfo.GetRouteOperationByLotSequence(_LotData, lastOperationSeq); if (NextRouteOperation == null) { //批號:{0}已無下個工作站點,請確認[流程設定] throw new Exception(RuleMessage.Error.C10008(_LotData.Lot)); } //將批號的UDC02清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL02", "", txnStamp); //將批號的UDC03清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL03", "", txnStamp); WIPTransaction.ReassignOperation(_LotData, NextRouteOperation, reasonCategory, ttbJudgeDescr.Text, txnStamp); } } #endregion #region 維修:紀錄維修及將批號派送至下一規則 if (rdbRepair.Checked) { result = "Repair"; List <WIPRepairInfo> repairDatas = new List <WIPRepairInfo>(); var componentData = ComponentInfoEx.GetDataByCurrentLot(_LotData.Lot)[0]; var repairData = WIPRepairInfo.CreateInfo(_LotData, componentData, componentData.ComponentQuantity, reasonCategory, _LotData.OperationName, _LotData.ResourceName, string.Empty, string.Empty); repairDatas.Add(repairData); var issueOperation = OperationInfo.GetOperationByName(_LotData.OperationName); WIPTransaction.RepairAdd(_LotData, repairDatas, issueOperation, txnStamp); WIPTransaction.DispatchLot(_LotData, txnStamp); } #endregion #region 良品入庫:將批號狀態變更為DefectInv if (rdbDefectInv.Checked) { result = "DefectInv"; WIPTransaction.ModifyLotSystemAttribute(_LotData, "STATUS", "DefectInv", txnStamp); } #endregion #region 報廢品入庫:將批號狀態變更為ScrapInv if (rdbScrapInv.Checked) { result = "ScrapInv"; WIPTransaction.ModifyLotSystemAttribute(_LotData, "STATUS", "ScrapInv", txnStamp); } #endregion #endregion #region 將判定結果紀錄在CST_WIP_DEFECT_JUDGEMENT,Result:良品(Goods)、維修(Repair)、不良品入庫(DefectInv)、報廢入庫(ScrapInv) var insertData = InfoCenter.Create <CSTWIPDefectJudgementInfo>(); insertData.WIPDefectSID = _LotDefectData.DefectSID; insertData["REASONCATEGORY"] = reasonCategory.Category; insertData["LOT"] = _LotData.Lot; insertData.Reason = reasonCategory.Reason; insertData.Result = result; insertData.Description = ttbJudgeDescr.Text; insertData.LinkSID = WIPHistoryInfo.GetLotFirstHistory(_LotData.Lot).LinkSID; insertData.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); #endregion cts.Complete(); } ttbLot.Text = ""; ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 流程切換 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ddlRoute_SelectedIndexChanged(object sender, EventArgs e) { try { //清除資料 ddlRouteOperation.Items.Clear(); ddlRouteOperation.Enabled = false; //確認是否有選擇流程 ddlRoute.Must(lblRoute); //取得所選擇的流程資料 var routeData = InfoCenter.GetBySID <RouteInfo>(ddlRoute.SelectedValue); //取得所選擇流程目前線上版本資料 var routeVersionData = RouteVersionInfo.GetActiveRouteVersion(routeData); //取得所選擇流程目前線上版本的所有工作站資料 var routeOperationList = RouteOperationInfo.GetRouteAllOperations(routeVersionData); if (routeOperationList.Count > 0) { List <RouteOperationData> routeOperationDataList = new List <RouteOperationData>(); //轉換型態 routeOperationList.ForEach(data => { var operData = OperationInfo.GetOperationByName(data.OperationName); //CNC的站點不可併批(需排除),因為CNC後才能併批 if (operData["AUTOMERGE"].ToBool() == false && operData["FAIFLAG"].ToBool() == false && operData["MAIN_EQUIP"].ToBool() == false) { RouteOperationData routeOperationData = new RouteOperationData(); routeOperationData.OperationName = string.Format("[{0}]{1}", data.OperationSequence, data.OperationName); routeOperationData.RouteOperationSID = data.RouteOperationSID; routeOperationDataList.Add(routeOperationData); } }); ddlRouteOperation.DataSource = routeOperationDataList; ddlRouteOperation.DataTextField = "OperationName"; ddlRouteOperation.DataValueField = "RouteOperationSID"; ddlRouteOperation.DataBind(); if (ddlRouteOperation.Items.Count != 1) { ddlRouteOperation.Items.Insert(0, ""); } else { ddlRouteOperation.SelectedIndex = 0; } ddlRouteOperation.Enabled = true; } } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 輸入機加批號 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ttbLot_TextChanged(object sender, EventArgs e) { try { /* 1. 驗證批號存在性。(批號不存在) * 2. 驗證批號狀態,只能輸入Wait或Run的批號。(狀態為XX,不可執行) * 數量(Label):帶出批號數量。 * 料號(Label):帶出批號所屬料號。 * 料號描述(Label):帶出料號說明。 * 流程(Label):帶出批號所屬流程。 * 工作站(Label):帶出批號所屬工作站。 */ ttbLot.Must(lblLot); #region 清除介面資料 ttbEquip.Text = ""; ttbQty.Text = ""; ttbDevice.Text = ""; ttbRoute.Text = ""; ttbOperation.Text = ""; ttbComponentId.Text = ""; ttbDefectDesc.Text = ""; ttbDefectQty.Text = ""; ttbDeviceDescr.Text = ""; ddlComponentId.Items.Clear(); ddlDefectReason.Items.Clear(); ddlComponentId.Enabled = true; ttbComponentId.Enabled = true; _LotData = null; _SelectedComponetData = null; _DeviceData = null; _DispatchReportTable = new DataTable(); _DefectGridData = new List <DefectGridData>(); btnOK.Enabled = false; gvDefect.SetDataSource(_DispatchReportTable, true); #endregion _LotData = LotInfoEx.GetLotByLot(ttbLot.Text).ChangeTo <LotInfoEx>(); //驗證批號存在性。(批號不存在) if (_LotData != null) { //驗證批號狀態,Run的批號。(狀態為XX,不可執行) if (_LotData.Status == LotDefaultStatus.Run.ToString()) { //驗證currentRule。 if (_LotData.CurrentRuleName != _ProgramInformationBlock.ProgramRight) { //該批號作業為{0},不為此功能,請遵循作業規範 throw new Exception(RuleMessage.Error.C10004(_LotData.CurrentRuleName)); } var operData = OperationInfo.GetOperationByName(_LotData.OperationName).ChangeTo <OperationInfoEx>(); if (operData.GetDMC.ToBool()) { var compList = ComponentInfo.GetLotAllComponents(_LotData.Lot).ChangeTo <ComponentInfoEx>(); foreach (var compData in compList) { if (compData.DMC.IsNullOrTrimEmpty()) { throw new CimesException(RuleMessage.Error.C00040(compData.ComponentID)); } } } _DeviceData = DeviceVersionInfoEx.GetDataByDeviceName(_LotData.DeviceName); ttbQty.Text = _LotData.Quantity.ToString(); ttbDevice.Text = _LotData.DeviceName; ttbEquip.Text = _LotData.ResourceName; ttbDeviceDescr.Text = _DeviceData.Description; ttbRoute.Text = _LotData.RouteName; ttbOperation.Text = _LotData.OperationName; InitialDropDownList(); if (_DeviceData.ProdType == CustomizeFunction.ProdType.S.ToCimesString()) { ttbDefectQty.Enabled = false; ttbDefectQty.Text = "1"; } else if (_DeviceData.ProdType == CustomizeFunction.ProdType.G.ToCimesString() || _DeviceData.ProdType == CustomizeFunction.ProdType.W.ToCimesString() || _DeviceData.ProdType == CustomizeFunction.ProdType.B.ToCimesString()) { ttbDefectQty.Enabled = true; ttbDefectQty.Text = "1"; ddlComponentId.Enabled = false; ddlComponentId.SelectedIndex = -1; ttbComponentId.Enabled = false; } else { //[00031]{0}:{1}的系統屬性:{2} 未設定,請洽IT人員! throw new Exception(TextMessage.Error.T00031(lblDevice.Text, _DeviceData.DeviceName, _DeviceData.ProdType)); } } else { //狀態為{0},不可執行 throw new Exception(RuleMessage.Error.C10003(_LotData.Status)); } } else { //[00030]{0}:{1}不存在! throw new Exception(TextMessage.Error.T00030(lblLot.Text, ttbLot.Text)); } btnOK.Enabled = true; } catch (Exception ex) { ClearField(); AjaxFocus(ttbLot); HandleError(ex); } }
/// <summary> /// 依據傳入的工作站取得可使用機台清單 /// </summary> /// <param name="operationName">工作站名稱</param> public static List <EquipmentInfo> GetEquipmentListByOperationName(string operationName) { //清除機台清單 List <EquipmentInfo> equipmentList = new List <EquipmentInfo>(); //取得批號目前的工作站資料 var operationData = OperationInfo.GetOperationByName(operationName); if (operationData == null) { //[00171]工作站:{0}不存在!! throw new Exception(TextMessage.Error.T00171(operationName)); } //確認工作站是否有啟用使用機台的功能 if (operationData.EQUIPFLAG == "Y") { //依據工作站找出歸屬的機台群組清單 List <OperationResourceInfoEx> resourceDataList = OperationResourceInfoEx.GetDataByOperSID(operationData.OperationSID); if (resourceDataList.Count > 0) { #region 取得該工作站可使用的所有機台資料 foreach (var resourceData in resourceDataList) { if (resourceData.ResourceType == "Group") { //如果資源類別為Group,則找出此機台群組內的所有機台資訊 var equipGroupData = EquipmentGroupInfo.GetEquipmentGroupByID(resourceData.ResourceID); //用群組SID找出在該群組下的工作站 List <EquipGroupEquipInfoEx> eqGroupDataList = EquipGroupEquipInfoEx.GetEquipGroupByGroupSID(equipGroupData.ID); if (eqGroupDataList.Count > 0) { foreach (var eqGroupData in eqGroupDataList) { //取得機台資訊 var equipmentData = EquipmentInfo.GetEquipmentByName(eqGroupData.EquipmentName); //如果機台資料不為NULL才要確認是否己經加入清單內 if (equipmentData != null) { //確認是否已經加入機台清單 if (equipmentList.Contains(equipmentData) == false) { equipmentList.Add(equipmentData); } } } } } else if (resourceData.ResourceType == "Equip") { //如果資源類別為Equip,則加入此機台資訊 var equipmentData = EquipmentInfo.GetEquipmentByID(resourceData.ResourceID); //如果機台資料不為NULL才要確認是否己經加入清單內 if (equipmentData != null) { //確認是否已經加入機台清單 if (equipmentList.Contains(equipmentData) == false) { equipmentList.Add(equipmentData); } } } else if (resourceData.ResourceType == "Type") { //如果資源類別為Type,則加入所有此Type的機台資訊 var equipmentTypeData = EquipmentTypeInfo.GetEquipmentTypeByID(resourceData.ResourceID); var equipmentDatalList = EquipmentInfo.GetEquipmentsByType(equipmentTypeData); foreach (var equipmentData in equipmentDatalList) { //確認是否已經加入機台清單 if (equipmentList.Contains(equipmentData) == false) { equipmentList.Add(equipmentData); } } } } #endregion } } //以機台名稱排序 equipmentList.Sort(p => p.EquipmentName); return(equipmentList); }
/// <summary> /// 確認預約工作站是否有開啟物料檢查功能 /// </summary> private void CheckBom(string opeartoinName, EquipmentInfo equipData, LotInfo lotData) { //確認工作站是否有開啟物料檢查功能,如果機台資料為NULL,則直接跳過這個檢查機制 var operationData = OperationInfo.GetOperationByName(opeartoinName).ChangeTo <OperationInfoEx>(); if (operationData.CheckBOM == "Y" && equipData != null) { #region 先比對BOM表的料是否都有上機 //取得客製表[CST_WPC_BOM]工單對應華司料(SORTF = 2)的資料 var WOBomList = CSTWPCWorkOrderBOMInfo.GetDataByWorkOrderAndSORTF(_LotData.WorkOrder, "2"); //取得目前選定的機台上所有的物料資料 var eqpMLotList = EquipmentMaterialLotInfo.GetEquipmentMaterialLotByEquipment(equipData.EquipmentName); //確認目前選定的機台是否已經有上物料 WOBomList.ForEach(WOBom => { bool isFind = false; foreach (var eqpMLot in eqpMLotList) { //取得料編號資料 var materialLotData = MaterialLotInfo.GetMaterialLotByMaterialLot(eqpMLot.MaterialLot); if (WOBom.MATNR == materialLotData.MaterialNO) { //註記有找到對應的物料編號 isFind = true; break; } } if (isFind == false) { //機台:{0} 沒有上物料編號{1}的資料! throw new Exception(RuleMessage.Error.C10145(equipData.EquipmentName, WOBom.MATNR)); } }); #endregion #region 依照料號的孔位設定,確認孔位都有華司資料 var deviceVersion = DeviceVersionInfo.GetLotCurrentDeviceVersion(lotData).ChangeTo <DeviceVersionInfoEx>(); if (deviceVersion.PushLocation.ToString().IsNullOrEmpty()) { //[00031]{0}:{1}的系統屬性:{2} 未設定,請洽IT人員! throw new CimesException(TextMessage.Error.T00031(GetUIResource("Device"), deviceVersion.DeviceName, "PUSH_LOCATION")); } var lstPushLocation = deviceVersion["PUSH_LOCATION"].ToString().Split(','); //先取得機台上的物料批資訊 List <MaterialLotInfo> eqpMaterialLotList = new List <MaterialLotInfo>(); eqpMLotList.ForEach(p => { var mLot = MaterialLotInfo.GetMaterialLotByMaterialLot(p.MaterialLot); eqpMaterialLotList.Add(mLot); }); for (int i = 0; i < lstPushLocation.Length; i++) { var mlotData = eqpMaterialLotList.Find(p => p.Location == lstPushLocation[i]); if (mlotData == null) { throw new CimesException(RuleMessage.Error.C00041(equipData.EquipmentName, lstPushLocation[i])); } } #endregion } }