protected void ttbEquipment_TextChanged(object sender, EventArgs e) { try { if (ttbEquipment.Text.Trim().IsNullOrTrimEmpty()) { return; } string sEquipment = ttbEquipment.Text.Trim(); _EquipmentInfo = EquipmentInfo.GetEquipmentByName(sEquipment); if (_EquipmentInfo == null) { ttbEquipment.Text = ""; AjaxFocus(ttbEquipment); throw new RuleCimesException(TextMessage.Error.T00030(lblEquipment.Text, sEquipment)); } ddlOperation.Items.Clear(); var lstOepration = DBCenter.GetStringList(SQLCenter.Parse( "SELECT DISTINCT OPERATION FROM CST_TOOL_DEVICE_DETAIL WHERE EQP=#[STRING] AND OPERATION IS NOT NULL", sEquipment)); lstOepration.ForEach(p => { ddlOperation.Items.Add(p); }); if (lstOepration.Count > 1) { ddlOperation.Items.Insert(0, ""); } } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { EquipmentInfo equipmentData = EquipmentInfo.GetEquipmentByName(mEQP.EquipmentName); if (mEQP.Tag != equipmentData.Tag) { throw new RuleCimesException(TextMessage.Error.T00747("")); } string EqpID = ciEquipment.Must(lblEquipment); string Reason = csReason.Must(lblReasonCode).Value; EquipmentStateInfo equipmentState = EquipmentStateInfo.GetEquipmentStateByState(ddlNewState.Must(lblNewState).Text); var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, this.ApplicationName); var rcData = csReason.GetBusinessReason().CategoryReason; txnStamp.CategoryReasonCode = rcData; txnStamp.Description = ttbDesc.Text.Trim(); #region 檢查是否有設定機台變更狀態警報,若有,則發送警報 //使用Function取得ALM設定,可彈性使用 //取得機台狀態警報設定,預設是抓取系統資料設定[EquipStateAlarm] AlarmTypeInfo AlarmType = RuleExtendManager.GetEquipmentChangeStateAlarm(equipmentData, ddlNewState.Must(lblNewState).Text); string ALMsg = @"[Subject:{0}][Content:{1}:{2}; {3}:{4}; {5}:{6}; {7}:{8}; {9}:{10}]"; if (AlarmType != null) { // "[Content:TEST][Subject:TEST]" ALMsg = string.Format(ALMsg, ProgramInformationBlock1.Caption, lblEquipment.Text, mEQP.EquipmentName, lblOldState.Text, mEQP.CurrentState, lblNewState.Text, equipmentState.State, lblReasonCode.Text, rcData.Reason, lblDescription.Text, txnStamp.Description); } #endregion using (var cts = CimesTransactionScope.Create()) { EMSTransaction.ChangeState(equipmentData, equipmentState, txnStamp); RuleExtendManager.EquipmentTxnEnd(equipmentData); cts.Complete(); } #region 發送警報 if (AlarmType != null) { AlarmService WebServiceALM = new AlarmService(); string url = "http://" + Request.Url.Host + Request.ApplicationPath + "/ALM/Services/AlarmService.asmx"; WebServiceALM.Url = url; string ReturnMsg = WebServiceALM.LaunchAlarm(AlarmType.GroupRights, AlarmType.TYPE, ALMsg, txnStamp.RecordTime, "UI", User.Identity.Name); } #endregion Response.Redirect(ciMes.Security.UserSetting.GetPreviousListPage(this), false); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 輸入機台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ttbEquip_TextChanged(object sender, EventArgs e) { try { _EquipData = EquipmentInfo.GetEquipmentByName(ttbEquip.Text); #region 驗證機台正確性 if (_EquipData == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(ttbEquip.Text)); } #endregion #region 驗證機台啟用狀態 if (_EquipData.UsingStatus == UsingStatus.Disable) { //機台:{0}已停用,如需使用,請至"機台資料維護"啟用!! throw new Exception(RuleMessage.Error.C10025(_EquipData.EquipmentName)); } #endregion #region 驗證機台狀態,僅IDLE、RUN可使用 if (_EquipData.CurrentState != "IDLE" && _EquipData.CurrentState != "RUN") { //機台狀態為{0},不可執行此功能!! throw new Exception(RuleMessage.Error.C10026(_EquipData.CurrentState)); } #endregion if (_ToolData != null) { btnOK.Enabled = true; } } catch (Exception ex) { ttbEquip.Text = ""; _EquipData = null; AjaxFocus(ttbEquip); HandleError(ex); } }
/// <summary> /// 確認出站後是否有下一站的預約紀錄,如果有,則將批號進站至下一個工作站 /// </summary> /// <param name="txnLotData">機加批號</param> /// <param name="txnStamp"></param> public void CheckNextReserveCheckIn(LotInfoEx txnLotData, TransactionStamp txnStamp) { //取得預約工作站資料 var WIPNextReserveList = CSTWIPReserveCheckInInfo.GetDataByLot(txnLotData.Lot); if (WIPNextReserveList.Count > 0) { //下一個預約工作站資料 var reserveData = WIPNextReserveList[0]; //將預約的進站時間回寫到hist的Remark01 txnStamp.Remark01 = reserveData.InTime; //取得機台資料 var equipData = EquipmentInfo.GetEquipmentByName(reserveData.Equipment); if (equipData == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(reserveData.Equipment)); } //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("RUN"); if (equipData.CurrentState != "RUN") { //更新機台狀態 EMSTransaction.ChangeState(equipData, newStateInfo, txnStamp); } //批號上機台 EMSTxn.Default.AddLotToEquipment(txnLotData, equipData, txnStamp); //批號進站 WIPTransaction.CheckIn(txnLotData, equipData.EquipmentName, "", "", LotDefaultStatus.Run.ToString(), txnStamp); //將批號Dispatch到下一規則 WIPTransaction.DispatchLot(txnLotData, txnStamp); } }
/// <summary> /// 檢查機台資料及狀態 /// </summary> /// <param name="equipmentName"></param> /// <returns></returns> private bool CheckEquipCurrentState(string equipmentName) { //檢查機台是否存在 var equipData = EquipmentInfo.GetEquipmentByName(equipmentName); if (equipData == null) { //請輸入正確的機台/序號! throw new Exception(RuleMessage.Error.C10066()); } //檢查機台狀態是否為PPK string currentState = CustomizeFunction.QCType.PPK.ToCimesString(); if (equipData.CurrentState != currentState) { //[00902]機台狀態不是{0},不可使用{1}規則! throw new Exception(TextMessage.Error.T00902(currentState, _ProgramInformationBlock.ProgramRight)); } return(true); }
protected void ttbEquipmentName_TextChanged(object sender, EventArgs e) { try { ttbEquipmentName.Must(lblEquipment); string sEquipment = ttbEquipmentName.Text.Trim(); _EquipmentInfo = EquipmentInfo.GetEquipmentByName(sEquipment); if (_EquipmentInfo == null) { ttbEquipmentName.Text = ""; AjaxFocus(ttbEquipmentName); throw new RuleCimesException(TextMessage.Error.T00030(lblEquipment.Text, sEquipment)); } AjaxFocus(ttbDevice1); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 輸入機台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ttbEquipment_TextChanged(object sender, EventArgs e) { try { _EquipData = null; _EquipData = EquipmentInfo.GetEquipmentByName(ttbEquipment.Text); #region 驗證機台正確性 if (_EquipData == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(ttbEquipment.Text)); } #endregion #region 驗證機台啟用狀態 if (_EquipData.UsingStatus == UsingStatus.Disable) { //機台:{0}已停用,如需使用,請至"機台資料維護"啟用!! throw new Exception(RuleMessage.Error.C10025(_EquipData.EquipmentName)); } #endregion //尚未定義機台為何狀態不可執行刀具上機 //.. //.. AjaxFocus(ttbToolName); } catch (Exception ex) { _EquipData = null; ttbEquipment.Text = ""; AjaxFocus(ttbEquipment); HandleError(ex); } }
/// <summary> /// 輸入機台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ttbEquipment_TextChanged(object sender, EventArgs e) { try { //清除資料 _EquipData = null; ttbToolName.Text = ""; _ToolList = new List<ToolInfoEx>(); gvQuery.SetDataSource(_ToolList, true); //確認機台編號是否有輸入 ttbEquipment.Must(lblEquipment); _EquipData = EquipmentInfo.GetEquipmentByName(ttbEquipment.Text); #region 驗證機台正確性 if (_EquipData == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(ttbEquipment.Text)); } #endregion #region 驗證機台啟用狀態 if (_EquipData.UsingStatus == UsingStatus.Disable) { //機台:{0}已停用,如需使用,請至"機台資料維護"啟用!! throw new Exception(RuleMessage.Error.C10025(_EquipData.EquipmentName)); } #endregion #region 取得已上機的刀具資料 var equipTools = EquipToolInfo.GetByEquipmentName(_EquipData.EquipmentName); if (equipTools.Count == 0) { //機台編號:{0} 沒有刀具上機資料!! throw new Exception(RuleMessage.Error.C10147(_EquipData.EquipmentName)); } equipTools.ForEach(equipTool => { //取得刀具資料 var toolData = ToolInfo.GetToolByName(equipTool.ToolName).ChangeTo<ToolInfoEx>(); //確認刀具零組件是否存在 if (toolData == null) { // [00030]{0}:{1}不存在! throw new Exception(TextMessage.Error.T00030(lblToolName.Text, ttbToolName.Text)); } //確認刀具零組件狀態是否可使用,僅USED可執行 if (toolData.CurrentState != "USED") { //刀具零組件狀態為{0},不可執行此功能!! throw new Exception(RuleMessage.Error.C10129(toolData.CurrentState)); } #region 確認刀具零組件是否啟用 if (toolData.UsingStatus == UsingStatus.Disable) { //刀具零組件:{0}已停用,如需使用,請至"刀具零組件進料作業"啟用!! throw new Exception(RuleMessage.Error.C10128(toolData.ToolName)); } #endregion _ToolList.Add(toolData); }); #endregion gvQuery.SetDataSource(_ToolList, true); btnOK.Enabled = true; AjaxFocus(ttbToolName); } catch (Exception ex) { ClearField(); AjaxFocus(ttbEquipment); HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { #region 確認選擇結果,如果是選擇NG,確認是否有選擇原因碼 string result = ""; if (rdbOK.Checked) { result = "OK"; } else if (rdbNG.Checked) { result = "NG"; //確認是否有選擇原因碼 ddlPQCReasonCode.Must(lblPQCReasonCode); } #endregion TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { #region 更新檢驗主檔[MES_QC_INSP] //取得檢驗主檔資料 var QCInsepctionData = InfoCenter.GetBySID <QCInspectionInfo>(_SelectedQCData.QCInspectionSID).ChangeTo <QCInspectionInfoEx>(); //有選擇原因碼才更新[NG_Category]及[NG_Reason] if (string.IsNullOrEmpty(ddlPQCReasonCode.SelectedValue) == false) { var reason = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlPQCReasonCode.SelectedValue); QCInsepctionData.NG_Category = reason.Category; QCInsepctionData.NG_Reason = reason.Reason; } QCInsepctionData.NG_Description = ttbDescr.Text; QCInsepctionData.Result = result; QCInsepctionData.Status = "Finished"; QCInsepctionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); #endregion #region 更新自主檢數據內容[CST_EDC_COMP] bool inSpec = true; gvComponentEDC.Rows.LoopDo <GridViewRow>((p, i) => { // 取得TextBox Control var ttbEDC = p.FindControl("ttbEDC") as TextBox; if (ttbEDC.Text.IsNullOrEmpty()) { AjaxFocus(ttbEDC); throw new Exception(TextMessage.Error.T00043(GetUIResource("CenterHoleData"))); } // 是否符合規格判斷 var measureVal = ttbEDC.Text.ToDecimal(); if (measureVal > _SAICenterHole.Remark02.ToDecimal()) { inSpec = false; } if (measureVal < _SAICenterHole.Remark03.ToDecimal()) { inSpec = false; } var lotData = ComponentInfo.GetComponentByComponentID(_SelectedQCData.ComponentLot); // 將量測資料記錄到客製表 var edcCompInfo = InfoCenter.Create <CSTEDCComponentInfo>(); edcCompInfo.ComponentID = _SelectedQCData.ComponentLot; edcCompInfo.Data = measureVal; edcCompInfo.UpSpecification = _SAICenterHole.Remark02.ToDecimal(); edcCompInfo.LowSpecification = _SAICenterHole.Remark03.ToDecimal(); edcCompInfo.INSPEC = inSpec == true ? "OK" : "NG"; edcCompInfo.Lot = (lotData == null) ? "" : lotData.CurrentLot; edcCompInfo["LINKSID"] = txnStamp.LinkSID; edcCompInfo["PARAMETER"] = "SC" + (i + 1).ToString(); edcCompInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); #endregion #region 更新機台狀態及更新檢驗單對應的批號資料 //如果選擇結果為NG時,則更新機台狀態及更新檢驗單對應的批號資料 if (rdbNG.Checked) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("DOWN"); var equipData = EquipmentInfo.GetEquipmentByName(_SelectedQCData.EquipmentName); //如果機台狀態為IDLE,則變更狀態為DOWN if (equipData.CurrentState == "IDLE") { //更新機台狀態 EMSTransaction.ChangeState(equipData, newStateInfo, txnStamp); } else { //如果機台狀態不為IDLE,則註記機台[USERDEFINECOL01]為Y EMSTransaction.ModifyEquipmentSystemAttribute(equipData, "USERDEFINECOL01", "Y", txnStamp); } //上一次的檢驗單號資料 QCInspectionInfoEx previousInspectionData = null; //依據機台及料號查詢,然後用建立時間逆排序,找出所有FAI及MPQC的檢驗單號資料 var QCDataList = QCInspectionInfoEx.GetInspDataListByEquipmentAndDevice(QCInsepctionData.EquipmentName, QCInsepctionData.DeviceName); //如果筆數大於1,則目前檢驗單號的索引值 if (QCDataList.Count > 1) { //找出目前檢驗單號的索引值 var NGIndex = QCDataList.FindIndex(p => p.InspectionNo == QCInsepctionData.InspectionNo); //如果找到的索引值不是最後一筆的話,則找出上一次的檢驗單號資料 if (NGIndex != (QCDataList.Count - 1)) { //找出上一次的檢驗單號資料 previousInspectionData = QCDataList[NGIndex + 1]; } } //取得目前檢驗單號的批號子單元資料 var componentList = ComponentInfoEx.GetDataByInspectionNo(QCInsepctionData.InspectionNo); componentList.ForEach(component => { //取得批號資料 var lotData = LotInfo.GetLotByLot(component.CurrentLot); //更新欄位[PQCNGFLAG] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGFLAG", "Y", txnStamp); //更新欄位[PQCNGNO] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGNO", QCInsepctionData.InspectionNo, txnStamp); }); if (previousInspectionData != null) { //取得上一次檢驗單號的批號子單元資料 var previousComponentList = ComponentInfoEx.GetDataByInspectionNo(previousInspectionData.InspectionNo); //取得不需要註記的ComponentID var passInspectionDataList = QCInspectionObjectInfo.GetInspectionObjects(previousInspectionData); previousComponentList.ForEach(component => { //確認是否為不需要註記的ComponentID if (passInspectionDataList.FindIndex(p => p.ItemName1 == component.ComponentID) == -1) { //取得批號資料 var lotData = LotInfo.GetLotByLot(component.CurrentLot); //更新欄位[PQCNGFLAG] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGFLAG", "Y", txnStamp); //更新欄位[PQCNGNO] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGNO", QCInsepctionData.InspectionNo, txnStamp); } }); } } #endregion 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 { /* 1. 如有不良數量,先確認有待判站。 * 2. 待判站找尋方式:到系統資料設定(MES_WPC_EXTENDITEM)裡找尋屬性SAIJudgeOperation,依照process找出待判站的名稱。如找不到要報錯。(找不到待判站資訊,請至系統資料維護增加資訊,屬性:xxxx。) * 拿MES_WIP_LOT_PROCESS 跟系統資料設定裡的REMARK01比對後,找出工作站點(REMARK02) * 3. 將批號出站。(CheckOut) * 4. 將批號下機。(EQPRemoveLot) * 5. 判定機台容量如果為0,將機台狀態變更為IDLE。(ChangeStaus) * 機台容量判定方式:MES_EQP_EQP. CAPACITY = 0。 * 6. 將CST_WIP_RESERVE_CHECKIN_INFO搬移至CST_WIP_RESERVE_CHECKIN_INFO_LOG。 * 資料條件:Lot + Operation * 7. 如有不良數量,拆一個不良批號,將批號送到待判站。(Defect、SplitLot、ReassignOperation) * 8. 將原批號派送至下一規則。(Dispatch) */ TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //取得批號資料 var txnLotData = _LotData; //取得批號上機台資料 var equipmentLotData = EquipmentLotInfo.GetEquipmentLotByLot(txnLotData.Lot); //如果批號上機台是有資料,表示必須執行機台相關的交易 if (equipmentLotData != null) { var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("IDLE"); var equipment = EquipmentInfo.GetEquipmentByName(txnLotData.ResourceName); if (equipment == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(txnLotData.ResourceName)); } //機台移批號 EMSTransaction.RemoveLotFromEquipment(txnLotData, equipment, txnStamp); //確認機台的最大容量是否為零,如果不是,則執行變更機台狀態 if (equipment.Capacity == 0) { //變更機台狀態 Run=>IDLE EMSTransaction.ChangeState(equipment, newStateInfo, txnStamp); } } //更新預約資料 UpdateReserveCheckInData(txnLotData, txnLotData.OperationName, txnStamp); //批號出站 WIPTransaction.CheckOut(txnLotData, txnStamp); //如果有不良數量,則拆號及送待判工作站 if (_DefectGridData != null && _DefectGridData.Count > 0) { SplitDefectLotList(txnLotData, _DefectGridData, txnStamp); } //將批號Dispatch到下一規則 WIPTransaction.DispatchLot(txnLotData, txnStamp); //檢查是否還有預約工作站資料 CheckNextReserveCheckIn(txnLotData, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
private void LoadEquipmentControl() { ttbEquipmentFilter.Text = ttbEquipmentFilter.Text.Trim(); ddlEquipment.Items.Clear(); EquipmentInfo equipmant = null; if (ttbEquipmentFilter.Text.IsNullOrTrimEmpty() == false) { equipmant = EquipmentInfo.GetEquipmentByName(ttbEquipmentFilter.Text); } if (equipmant != null) { ddlEquipGroup.Items.Clear(); //ddlEquipGroup.Items.Insert(0, new ListItem(ddlEquipment.ProductName, device.ProductName)); ddlEquipment.Items.Add(new ListItem(equipmant.EquipmentName, equipmant.EquipmentName)); ddlEquipment_SelectedIndexChanged(ddlEquipment, EventArgs.Empty); } else { if (ddlEquipGroup.SelectedItem.Text.IsNullOrTrimEmpty() == true) { return; } List <string> paras = new List <string>(); sql = @"SELECT {0} FROM MES_EQP_GROUP_EQP G WHERE G.EQP_GROUP_SID = #[STRING] "; paras.Add(ddlEquipGroup.SelectedItem.Value); if (ttbEquipmentFilter.Text.IsNullOrTrimEmpty() == false) { sql += " AND G.EQUIPMENT LIKE #[STRING] "; paras.Add(ttbEquipmentFilter.Text + "%"); } if (DBCenter.GetSingleResult <int>(string.Format(sql, "COUNT(G.EQUIPMENT)"), paras.ToArray()) > maxReturnQty) { ddlEquipment.Items.Add(new ListItem(GetUIResource("InputRequired", lblEquipment.Text), string.Empty)); } else { List <EquipGroupEquipInfo> equipmentList = InfoCenter.GetList <EquipGroupEquipInfo>(string.Format(sql + " ORDER BY G.EQUIPMENT", "G.EQUIPMENT"), paras.ToArray()); ddlEquipment.DataSource = equipmentList; ddlEquipment.DataTextField = "EquipmentName"; ddlEquipment.DataValueField = "EquipmentName"; ddlEquipment.DataBind(); if (equipmentList.Count == 0) { ddlEquipment.Items.Add(new ListItem(TextMessage.Error.T00550(""), string.Empty)); } if (equipmentList.Count == 1) { ddlEquipment_SelectedIndexChanged(ddlEquipment, EventArgs.Empty); } if (equipmentList.Count > 1) { ddlEquipment.Items.Insert(0, ""); } } } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { #region 確認選擇結果,如果是選擇NG,確認是否有選擇原因碼 string result = ""; if (rdbOK.Checked) { result = "OK"; } else if (rdbNG.Checked) { result = "NG"; //確認是否有選擇原因碼 ddlPQCReasonCode.Must(lblPQCReasonCode); } else if (rdbCLOSE.Checked) { result = "CLOSE"; //確認是否有選擇原因碼 ddlPQCReasonCode.Must(lblPQCReasonCode); } #endregion TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { #region 更新檢驗主檔[MES_QC_INSP] //取得檢驗主檔資料 var QCInsepctionData = InfoCenter.GetBySID <QCInspectionInfo>(_SelectedQCData.QCInspectionSID).ChangeTo <QCInspectionInfoEx>(); //原因碼 ReasonCategoryInfo reason = null; //有選擇原因碼才更新[NG_Category]及[NG_Reason] if (string.IsNullOrEmpty(ddlPQCReasonCode.SelectedValue) == false) { reason = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlPQCReasonCode.SelectedValue); QCInsepctionData.NG_Category = reason.Category; QCInsepctionData.NG_Reason = reason.Reason; } //如果判定結果為結單的話,則必須把結單時間及人員資料寫回資料庫 if (result == "CLOSE") { QCInsepctionData.FINISHTIME = txnStamp.RecordTime; QCInsepctionData.FINISHUSER = txnStamp.UserID; } QCInsepctionData.NG_Description = ttbDescr.Text; QCInsepctionData.Result = result; QCInsepctionData.Status = "Finished"; QCInsepctionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); #endregion #region 更新機台檢驗主檔[CST_WIP_CMM] if (_CSTWIPCMMList != null) { //更新檢驗主檔的QCInspectionSID欄位 _CSTWIPCMMList.ForEach(data => { data.QCInspectionSID = QCInsepctionData.ID; data.UpdateToDB(); }); } #endregion #region 更新機台狀態及更新檢驗單對應的批號資料 //如果選擇結果為NG時,則更新機台狀態及更新檢驗單對應的批號資料 if (rdbNG.Checked) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("DOWN"); var equipData = EquipmentInfo.GetEquipmentByName(_SelectedQCData.EquipmentName); //如果機台狀態為IDLE,則變更狀態為DOWN if (equipData.CurrentState == "IDLE") { //更新機台狀態 EMSTransaction.ChangeState(equipData, newStateInfo, txnStamp); } else { //如果機台狀態不為IDLE,則註記機台[USERDEFINECOL01]為Y EMSTransaction.ModifyEquipmentSystemAttribute(equipData, "USERDEFINECOL01", "Y", txnStamp); } //上一次的檢驗單號資料 QCInspectionInfoEx previousInspectionData = null; //依據機台及料號查詢,然後用建立時間逆排序,找出所有FAI及PQC的檢驗單號資料 var QCDataList = QCInspectionInfoEx.GetInspDataListByEquipmentAndDevice(QCInsepctionData.EquipmentName, QCInsepctionData.DeviceName); //如果筆數大於1,則目前檢驗單號的索引值 if (QCDataList.Count > 1) { //找出目前檢驗單號的索引值 var NGIndex = QCDataList.FindIndex(p => p.InspectionNo == QCInsepctionData.InspectionNo); //如果找到的索引值不是最後一筆的話,則找出上一次的檢驗單號資料 if (NGIndex != (QCDataList.Count - 1)) { //找出上一次的檢驗單號資料 previousInspectionData = QCDataList[NGIndex + 1]; } } //取得目前檢驗單號的批號子單元資料 var componentList = ComponentInfoEx.GetDataByInspectionNo(QCInsepctionData.InspectionNo); componentList.ForEach(component => { //取得批號資料 var lotData = LotInfo.GetLotByLot(component.CurrentLot); //更新欄位[PQCNGFLAG] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGFLAG", "Y", txnStamp); //更新欄位[PQCNGNO] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGNO", QCInsepctionData.InspectionNo, txnStamp); }); if (previousInspectionData != null) { //取得上一次檢驗單號的批號子單元資料 var previousComponentList = ComponentInfoEx.GetDataByInspectionNo(previousInspectionData.InspectionNo); //取得不需要註記的ComponentID var passInspectionDataList = QCInspectionObjectInfo.GetInspectionObjects(previousInspectionData); previousComponentList.ForEach(component => { //確認是否為不需要註記的ComponentID if (passInspectionDataList.FindIndex(p => p.ItemName1 == component.ComponentID) == -1) { //取得批號資料 var lotData = LotInfo.GetLotByLot(component.CurrentLot); //更新欄位[PQCNGFLAG] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGFLAG", "Y", txnStamp); //更新欄位[PQCNGNO] WIPTransaction.ModifyLotComponentSystemAttribute(lotData, component, "PQCNGNO", QCInsepctionData.InspectionNo, txnStamp); } }); } } #endregion //如果判定結果選擇為NG,則必須拆批送待判 if (rdbNG.Checked) { //判定NG直接拆批及送待判工作站 CustomizeFunction.SplitDefectLot(_SelectedQCData.ComponentLot, ttbDescr.Text, reason, 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 ttbEquipOrCompLot_TextChanged(object sender, EventArgs e) { try { //清除資料 _QCTable.Rows.Clear(); string currentState = "Wait" + _QCType; string equipmentName = ""; //檢查是否有輸入機台/序號 ttbEquipOrCompLot.Must(lblEquipOrCompLot); #region 檢查輸入的內容在MES_QC_INSP_OBJ.ITEM1是否有符合的資料,如果沒有,則檢查機台 var QCDataObjList = QCInspectionObjectInfoEx.GetDataListByComponentLot(ttbEquipOrCompLot.Text); if (QCDataObjList.Count == 0) { var QCInspectionDataList = QCInspectionInfoEx.GetDataListByEquip(ttbEquipOrCompLot.Text, _QCType); if (QCInspectionDataList.Count == 0) { //找不到檢驗資料!! throw new Exception(RuleMessage.Error.C00038()); } else { //取得檢驗機台名稱 equipmentName = QCInspectionDataList[0].EquipmentName; } #region 取得檢驗清單 //string currentState = "WaitPPK"; QCInspectionDataList.ForEach(qcData => { //只有狀態為WaitPPK才可以加入清單 if (qcData.Status == currentState) { //取得檢驗明細 var QCInspectionObjList = QCInspectionObjectInfo.GetInspectionObjects(qcData); QCInspectionObjList.ForEach(qcObjData => { var row = _QCTable.NewRow(); row["Equipment"] = qcData.EquipmentName; row["Device"] = qcData.DeviceName; row["SN"] = qcObjData.ItemName1; row["Status"] = qcData.PassFlag == "Y" ? "PASS" : GetUIResource("WaitQC"); row["QCINSPSID"] = qcData.ID; _QCTable.Rows.Add(row); }); } }); #endregion } else { //取得檢驗主檔 var QCInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(QCDataObjList[0].QC_INSP_SID).ChangeTo <QCInspectionInfoEx>(); //確認檢驗主檔狀態是否為WaitPPK if (QCInspectionData.Status != currentState) { //序號:{0} 檢驗主檔狀態為{1},不可以執行 throw new Exception(RuleMessage.Error.C10100(ttbEquipOrCompLot.Text, QCInspectionData.Status)); } //取得檢驗機台名稱 equipmentName = QCInspectionData.EquipmentName; //取得檢驗資料 var row = _QCTable.NewRow(); row["Equipment"] = QCInspectionData.EquipmentName; row["Device"] = QCInspectionData.DeviceName; row["SN"] = QCDataObjList[0].ItemName1; row["Status"] = QCInspectionData.PassFlag == "Y" ? "PASS" : GetUIResource("WaitQC"); row["QCINSPSID"] = QCInspectionData.ID; _QCTable.Rows.Add(row); } #endregion #region 檢查機台是否存在 _EquipData = EquipmentInfo.GetEquipmentByName(equipmentName); if (_EquipData == null) { //請輸入正確的機台/序號! throw new Exception(RuleMessage.Error.C10066()); } #endregion if (_QCTable.Rows.Count == 0) { //機台:{0},查無任何檢驗資料。 throw new Exception(RuleMessage.Error.C10053(equipmentName)); } //顯示檢驗清單 gvQC.SetDataSource(_QCTable, true); btnOK.Enabled = true; //設置初始勾選狀態 CheckBox ckbSelectAll = gvQC.HeaderRow.FindControl("ckbSelectAll") as CheckBox; ckbSelectAll.Checked = true; ckbSelectAll_CheckedChanged(null, EventArgs.Empty); } catch (Exception ex) { ClearField(); AjaxFocus(ttbEquipOrCompLot); HandleError(ex); } }
/// <summary> /// 輸入機台/序號 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ttbEquipOrCompLot_TextChanged(object sender, EventArgs e) { try { //清除資料 _QCTable.Rows.Clear(); string equipmentName = ""; //檢查是否有輸入機台/序號 ttbEquipOrCompLot.Must(lblEquipOrCompLot); #region 檢查輸入的內容在MES_QC_INSP_OBJ.ITEM1是否有符合的資料,如果沒有,則檢查機台 var QCDataObjList = QCInspectionObjectInfoEx.GetDataListByComponentLot(ttbEquipOrCompLot.Text); if (QCDataObjList.Count == 0) { var QCDataList = QCInspectionInfoEx.GetDataListByEquip(ttbEquipOrCompLot.Text, _QCType); if (QCDataList.Count == 0) { //找不到檢驗資料!! throw new Exception(RuleMessage.Error.C00038()); } else { //取得檢驗機台名稱 equipmentName = QCDataList[0].EquipmentName; } } else { //取得檢驗機台名稱 equipmentName = InfoCenter.GetBySID <QCInspectionInfo>(QCDataObjList[0].QC_INSP_SID).EquipmentName; } #endregion #region 檢查機台是否存在 _EquipData = EquipmentInfo.GetEquipmentByName(equipmentName); if (_EquipData == null) { //請輸入正確的機台/序號! throw new Exception(RuleMessage.Error.C10066()); } #endregion #region 檢查機台狀態是否為WaitReceiveFAI/WaitReceivePPK string currentState = "WaitReceive" + _QCType; //如果傳入參數是FAI,則必須檢查機台狀態 if (_QCType == CustomizeFunction.QCType.FAI.ToCimesString()) { if (_EquipData.CurrentState != currentState) { //[00902]機台狀態不是{0},不可使用{1}規則! throw new Exception(TextMessage.Error.T00902(currentState, _ProgramInformationBlock.ProgramRight)); } } #endregion #region 顯示檢驗清單 //取得檢驗主檔 var qcInspectionDataList = QCInspectionInfoEx.GetDataListByEquip(equipmentName, _QCType); if (qcInspectionDataList.Count == 0) { //機台:{0},查無任何檢驗資料。 throw new Exception(RuleMessage.Error.C10053(equipmentName)); } qcInspectionDataList.ForEach(qcData => { //只有狀態為WaitReceivePPK/WaitReceiveFAI/WaitReceivePQC才可以加入清單 if (qcData.Status == currentState) { //取得檢驗明細 var QCInspectionObjList = QCInspectionObjectInfo.GetInspectionObjects(qcData); QCInspectionObjList.ForEach(qcObjData => { var row = _QCTable.NewRow(); row["Equipment"] = qcData.EquipmentName; row["Device"] = qcData.DeviceName; row["SN"] = qcObjData.ItemName1; row["Status"] = qcData.PassFlag == "Y" ? "PASS" : GetUIResource("WaitQC"); row["QCINSPSID"] = qcData.ID; _QCTable.Rows.Add(row); }); } }); if (_QCTable.Rows.Count == 0) { //機台:{0},查無任何檢驗資料。 throw new Exception(RuleMessage.Error.C10053(equipmentName)); } gvQC.SetDataSource(_QCTable, true); #endregion btnOK.Enabled = true; btnReject.Enabled = true; } catch (Exception ex) { ClearField(); AjaxFocus(ttbEquipOrCompLot); HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { /******************************************************************* * PPK判定後須執行事項: * 1. 依照判定的BATCHID+料號,將所屬單號資料更新。 * 2. 依照判定狀態更新CST_WIP_PPK結果。 * 3. 如同一個BATCHID都判定完成,變更機台狀態,從PPK變IDLE。 * 如一個BATCHID有兩個料號,需兩個料號都判定完成才可以變更機台狀態。 ******************************************************************/ try { //取得所選擇的料號名稱 var deviceName = ddlDevice.SelectedValue; #region 確認選擇結果,如果是選擇NG,確認是否有選擇原因碼及選擇結果及檢驗清單的勾選是否符合 string result = ""; if (rdbOK.Checked) { result = "OK"; } else if (rdbNG.Checked) { result = "NG"; //確認是否有選擇原因碼 ddlPPKReasonCode.Must(lblPPKReasonCode); if (SelectedNGData() == false) { //PPK結果選擇NG,檢驗清單至少勾選一筆資料! throw new Exception(RuleMessage.Error.C10070()); } } else if (rdbCLOSE.Checked) { result = "CLOSE"; //確認是否有選擇原因碼 ddlPPKReasonCode.Must(lblPPKReasonCode); } #endregion TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { #region 更新檢驗主檔清單[MES_QC_INSP] _QCInspectionDataList.ForEach(QCInspectionData => { //符合選擇的料號才進行資料更新 if (QCInspectionData.DeviceName == deviceName) { //有選擇原因碼才更新[NG_Category]及[NG_Reason] if (string.IsNullOrEmpty(ddlPPKReasonCode.SelectedValue) == false) { var reason = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlPPKReasonCode.SelectedValue); QCInspectionData.NG_Category = reason.Category; QCInspectionData.NG_Reason = reason.Reason; } //如果判定結果為結單的話,則必須把結單時間及人員資料寫回資料庫 if (result == "CLOSE") { QCInspectionData.FINISHTIME = txnStamp.RecordTime; QCInspectionData.FINISHUSER = txnStamp.UserID; } QCInspectionData.NG_Description = ttbDescr.Text; QCInspectionData.Result = result; QCInspectionData.Status = "Finished"; QCInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } }); #endregion #region 更新機台資訊及檢驗工件結果 //取某一支工件序號的資料來傳入UpdatePPK var updateLot = InfoCenter.GetBySID <LotInfo>(_QCInspectionObjDataList[0].OBJECTSID).ChangeTo <LotInfoEx>(); //更新[CST_WIP_PPK.PPKCOUNT] CustomizeFunction.UpdatePPK(_QCInspectionDataList[0].EquipmentName, updateLot.DeviceName, updateLot.DeviceVersion, (rdbNG.Checked) ? "false" : "true"); //將介面上所勾選/不勾選的資料對應到MES_QC_INSP_OBJ.ITEM4的欄位 for (int i = 0; i < gvQC.Rows.Count; i++) { var thisCheckBox = (CheckBox)gvQC.Rows[i].FindControl("ckbDefectSelect"); if (thisCheckBox.Checked) { _QCInspectionObjDataList[i].ItemName4 = "NG"; } else { _QCInspectionObjDataList[i].ItemName4 = "OK"; } _QCInspectionObjDataList[i].UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } //更新機台檢驗主檔 _CSTWIPCMMList.ForEach(data => { data.UpdateToDB(); }); //取得相同BatchID的檢驗資料 (理論上應該都完成檢驗...) //如果是雙料號,每次判定要分料號判定 var QCDataList = QCInspectionInfoEx.GetDataListByBatchIDAndDeviceName(_QCInspectionDataList[0].BatchID, deviceName); //如果是雙料號,每次判定要分料號判定,但是機台的狀態要該batchID都判定通過,才算PPK完成 var QCDAllataList = QCInspectionInfoEx.GetDataListByBatchID(_QCInspectionDataList[0].BatchID); #region 如果相同的BatchID都檢驗完成時,則更新機台狀態為IDLE //相同BatchID都已完成檢驗旗標 //如果是雙料號,每次判定要分料號判定,但是機台的狀態要該batchID都判定通過,才算PPK完成 bool isAllFinish = true; QCDAllataList.ForEach(p => { if (p.Status != "Finished") { isAllFinish = false; } }); if (isAllFinish) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("IDLE"); //檢查機台是否存在 var equipData = EquipmentInfo.GetEquipmentByName(_QCInspectionDataList[0].EquipmentName); if (equipData == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(_QCInspectionDataList[0].EquipmentName)); } //更新機台狀態 EMSTransaction.ChangeState(equipData, newStateInfo, txnStamp); } #endregion #region 如果相同的BatchID都檢驗完成且結果都為OK時,則更新機台檢驗資料及更新COUNT //相同BatchID都已完成檢驗及結果都為OK旗標 bool isAllFinishAndOK = true; QCDataList.ForEach(p => { if (!(p.Status == "Finished" && p.Result == "OK")) { isAllFinishAndOK = false; } }); if (isAllFinishAndOK) { //取得AutoMerge原因碼 var reasonCategory = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("CustomizeReason", "AutoMerge"); if (reasonCategory == null) { //[00030]{0}:{1}不存在! throw new Exception(TextMessage.Error.T00030("", "CustomizeReason- AutoMerge")); } _QCInspectionObjDataList.ForEach(Data => { //更新機台檢驗資料 Data.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); }); var mergeList = _QCInspectionObjDataList.Select(p => p.ItemName2).Distinct().ToList(); foreach (var lot in mergeList) { var lotData = LotInfoEx.GetLotByWorkOrderLot(lot); //確認FAI是否已經檢驗完成 if (CustomizeFunction.CheckFAI(_QCInspectionDataList[0].EquipmentName, lotData.Lot)) { //執行AutoMerge CustomizeFunction.AutoMerge(lotData.InventoryLot, txnStamp, reasonCategory); } } } #endregion #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbEquipOrCompLot); _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 { #region 確認選擇結果,如果是選擇NG,確認是否有選擇原因碼 string result = ""; if (rdbOK.Checked) { result = "OK"; } else if (rdbNG.Checked) { result = "NG"; //確認是否有選擇原因碼 ddlFAIReasonCode.Must(lblFAIReasonCode); } else if (rdbPASS.Checked) { result = "PASS"; } else if (rdbCLOSE.Checked) { result = "CLOSE"; //確認是否有選擇原因碼 ddlFAIReasonCode.Must(lblFAIReasonCode); } #endregion TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { #region 更新檢驗主檔[MES_QC_INSP] //取得檢驗主檔資料 var QCInsepctionData = InfoCenter.GetBySID <QCInspectionInfo>(_SelectedQCData.QCInspectionSID).ChangeTo <QCInspectionInfoEx>(); //原因碼 ReasonCategoryInfo reason = null; //有選擇原因碼才更新[NG_Category]及[NG_Reason] if (string.IsNullOrEmpty(ddlFAIReasonCode.SelectedValue) == false) { reason = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlFAIReasonCode.SelectedValue); QCInsepctionData.NG_Category = reason.Category; QCInsepctionData.NG_Reason = reason.Reason; } //如果判定結果為結單的話,則必須把結單時間及人員資料寫回資料庫 if (result == "CLOSE") { QCInsepctionData.FINISHTIME = txnStamp.RecordTime; QCInsepctionData.FINISHUSER = txnStamp.UserID; } QCInsepctionData.NG_Description = ttbDescr.Text; QCInsepctionData.Result = result; QCInsepctionData.Status = "Finished"; QCInsepctionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); #endregion #region 更新機台檢驗主檔[CST_WIP_CMM] if (_CSTWIPCMMList != null) { //更新檢驗主檔的QCInspectionSID欄位 _CSTWIPCMMList.ForEach(data => { data.QCInspectionSID = QCInsepctionData.ID; data.UpdateToDB(); }); } #endregion #region 更新機台資訊 //取得相同BatchID的檢驗資料 var QCDataList = QCInspectionInfoEx.GetDataListByBatchID(_SelectedQCData.BatchID); //相同BatchID都已完成檢驗旗標 bool isAllFinish = true; QCDataList.ForEach(p => { if (!(p.Status == "Finished")) { isAllFinish = false; } }); //取得lot資料 var lot = InfoCenter.GetBySID <LotInfo>(_SelectedQCData.ObjectSID); //更新機台屬性[FAICOUNT] CustomizeFunction.UpdateFAI(_SelectedQCData.EquipmentName, lot.Lot, (rdbNG.Checked) ? true : false, txnStamp); //如果相同的BatchID都檢驗完成或選擇結果為NG時,則更新狀態為IDLE及更新FAICOUNT if (isAllFinish) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("IDLE"); var equipData = EquipmentInfo.GetEquipmentByName(_SelectedQCData.EquipmentName); //更新機台狀態 EMSTransaction.ChangeState(equipData, newStateInfo, txnStamp); } #endregion //如果判定結果選擇為NG,則必須拆批送待判 if (rdbNG.Checked) { //判定NG直接拆批及送待判工作站 CustomizeFunction.SplitDefectLot(_SelectedQCData.ComponentLot, ttbDescr.Text, reason, txnStamp); } cts.Complete(); } ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { 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> /// 依照檢驗計畫取得該物件的datatable /// </summary> /// <param name="QCTypeData"></param> /// <param name="objectName"></param> /// <returns></returns> public static DataTable GetInspectionData(QCTypeInfo QCTypeData, string objectName) { string sql = ""; DataTable dtQCTarget = null; #region 依照檢驗計畫取得該物件的datatable switch (QCTypeData.QCTarget) { case "MES_WIP_LOT": { LotInfo lot = LotInfo.GetLotByLot(objectName); if (lot == null) { throw new Exception(TextMessage.Error.T00378(objectName)); } dtQCTarget = lot.CopyDataToTable(lot.ID); } break; case "MES_WIP_COMP": { //取得component資訊以及所在的工作站 sql = @"SELECT L.OPERATION,C.* FROM MES_WIP_COMP C INNER JOIN MES_WIP_LOT L ON C.CURRENTLOT = L.LOT WHERE COMPONENTID = #[STRING]"; ComponentInfo comp = InfoCenter.GetBySQL <ComponentInfo>(sql, objectName); if (comp == null) { throw new Exception(TextMessage.Error.T00154(objectName)); } dtQCTarget = comp.CopyDataToTable(comp.ID); } break; case "MES_CMS_CAR": { CarrierInfo carrier = CarrierInfo.GetCarrierByCarrierNo(objectName); if (carrier == null) { throw new RuleCimesException(TextMessage.Error.T00725(objectName)); } dtQCTarget = carrier.CopyDataToTable(carrier.ID); } break; case "MES_TOOL_MAST": { ToolInfo tool = ToolInfo.GetToolByName(objectName); if (tool == null) { throw new Exception(TextMessage.Error.T00592(objectName)); } dtQCTarget = tool.CopyDataToTable(tool.ID); } break; case "MES_MMS_MLOT": { MaterialLotInfo mlot = MaterialLotInfo.GetMaterialLotByMaterialLot(objectName); if (mlot == null) { throw new Exception(TextMessage.Error.T00512(objectName)); } dtQCTarget = mlot.CopyDataToTable(mlot.ID); } break; case "MES_EQP_EQP": { EquipmentInfo equipment = EquipmentInfo.GetEquipmentByName(objectName); if (equipment == null) { throw new Exception(TextMessage.Error.T00885(objectName)); } dtQCTarget = equipment.CopyDataToTable(equipment.ID); } break; default: { sql = string.Format("SELECT * FROM {0} WHERE {1} = #[STRING]", QCTypeData.QCTarget, QCTypeData.IdentityColumn); dtQCTarget = DBCenter.GetDataTable(sql, objectName); if (dtQCTarget == null || dtQCTarget.Rows.Count == 0) { throw new Exception(TextMessage.Error.T00030("InspectionTarget", objectName)); } } break; } #endregion return(dtQCTarget); }
/// <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); //確認是否輸入模治具 ttbToolName.Must(lblToolName); //確認是否選擇下機原因 ddlCheckOutReasonCode.Must(lblCheckOutReasonCode); using (var cts = CimesTransactionScope.Create()) { #region 確認機台資料 var equipData = EquipmentInfo.GetEquipmentByName(ttbEquip.Text); if (equipData == null) { //[00885]機台{0}不存在! throw new Exception(TextMessage.Error.T00885(ttbEquip.Text)); } #endregion //配件下機台 TMSTxn.Default.RemoveToolFromEquipment(_ToolData, equipData, txnStamp); ////配件記錄下機原因。 //TMSTransaction.AddToolComment(_ToolData, txnStamp); //註記原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlCheckOutReasonCode.SelectedValue); txnStamp.CategoryReasonCode = reasonCategory; txnStamp.Description = ttbCheckOutDescr.Text; #region 變更配件狀態為WaitPM或IDLE(依權限傳入的參數而定) var newStateInfo = ToolStateInfo.GetToolStateByState(_ToolChangeState); if (newStateInfo == null) { //模治具狀態:{0}不存在!! throw new Exception(RuleMessage.Error.C10032(_ToolChangeState)); } TMSTransaction.ChangeToolState(_ToolData, newStateInfo, txnStamp); #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }