/// <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); //確認是否選擇報廢原因 ddlReason.Must(lblReason); using (var cts = CimesTransactionScope.Create()) { var newStateInfo = ToolStateInfo.GetToolStateByState("SCRAP"); if (newStateInfo == null) { //刀具零組件狀態: {0}不存在,請至配件狀態維護新增此狀態!! throw new Exception(RuleMessage.Error.C10149("SCRAP")); } //因刀具報表需求,所以在報廢時要將使用次數記錄在UDC07 var toolLifeList = CSTToolLifeInfo.GetToolLifeByToolNmae(_ToolData.ToolName); var toolLifeData = toolLifeList.Find(p => p.Head == _ToolData.Head); TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL07", toolLifeData.UseCount.ToCimesString(), txnStamp); //變更刀具 GROUPID TMSTransaction.ModifyToolSystemAttribute(_ToolData, "GROUPID", "", txnStamp); //變更IDENTITY為報廢品 TMSTransaction.ModifyToolSystemAttribute(_ToolData, "IDENTITY", "報廢品", txnStamp); //變更狀態為SCRAP TMSTransaction.ChangeToolState(_ToolData, newStateInfo, txnStamp); //註記原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlReason.SelectedValue); txnStamp.CategoryReasonCode = reasonCategory; txnStamp.Description = ""; //備註 TMSTransaction.AddToolComment(_ToolData, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _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); //檢查機台/序號是否有輸入 ttbEquipOrCompLot.Must(lblEquipOrCompLot); using (var cts = CimesTransactionScope.Create()) { string equipmentState = "Wait" + _QCType; #region 更新機台狀態為WaitFAI //只有FAI需要變更機台狀態,如果QCType參數為PPK或PQC,則不需更新機台狀態 if (_QCType.Equals(CustomizeFunction.QCType.FAI.ToCimesString())) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState(equipmentState); if (newStateInfo == null) { //C00028 無機台狀態{0}的設定資料! throw new CimesException(RuleMessage.Error.C00028(equipmentState)); } //更新機台狀態 EMSTransaction.ChangeState(_EquipData, newStateInfo, txnStamp); } #endregion #region 更新單號狀態為WaitFAI/WaitPPK foreach (DataRow dr in _QCTable.Rows) { var qcInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(dr["QCINSPSID"].ToString()).ChangeTo <QCInspectionInfoEx>(); qcInspectionData.Status = equipmentState; qcInspectionData.ReceiveTime = txnStamp.RecordTime; qcInspectionData.ReceiveUser = txnStamp.UserID; qcInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } #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 { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查機台是否有輸入 ttbEquipOrCompLot.Must(lblEquipOrCompLot); //確認是否有勾選資料 if (SelectedData() == false) { // [00816]請至少選取一個{0}! throw new Exception(TextMessage.Error.T00816(GetUIResource("SN"))); } using (var cts = CimesTransactionScope.Create()) { #region 更新單號狀態為PPK for (int i = 0; i < gvQC.Rows.Count; i++) { var thisCheckBox = (CheckBox)gvQC.Rows[i].FindControl("ckbSelect"); //只有勾選的資料才要更新單號狀態 if (thisCheckBox.Checked) { DataRow dr = _QCTable.Rows[i]; var qcInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(dr["QCINSPSID"].ToString()).ChangeTo <QCInspectionInfoEx>(); qcInspectionData.Status = _QCType; qcInspectionData.StartTime = DBCenter.GetSystemTime(); qcInspectionData.StartUser = txnStamp.UserID; qcInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } } #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 btnReject_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查機台/序號是否有輸入 ttbEquipOrCompLot.Must(lblEquipOrCompLot); string status = "ToBeSent" + _QCType; using (var cts = CimesTransactionScope.Create()) { #region 更新單號狀態為ToBeSentFAI及設置PASSFLAG = N foreach (DataRow dr in _QCTable.Rows) { var qcInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(dr["QCINSPSID"].ToString()).ChangeTo <QCInspectionInfoEx>(); qcInspectionData.Status = status; qcInspectionData.PassFlag = "N"; qcInspectionData.QCRejectTime = txnStamp.RecordTime; qcInspectionData.QCRejectUser = txnStamp.UserID; qcInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } #endregion #region 更新機台狀態 //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState(status); if (newStateInfo == null) { //C00028 無機台狀態{0}的設定資料! throw new CimesException(RuleMessage.Error.C00028(status)); } //更新機台狀態 EMSTransaction.ChangeState(_EquipData, newStateInfo, txnStamp); #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbEquipOrCompLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnSave_Click(object sender, EventArgs e) { try { //取得登入者資訊 var recordTime = DBCenter.GetSystemTime(); var userID = User.Identity.Name; //確認是否有資料 if (_ModifyToolDeviceDetails.Count == 0) { //請新增一筆刀具類型資料! throw new Exception(RuleMessage.Error.C10122()); } using (var cts = CimesTransactionScope.Create()) { CSTToolDeviceInfo toolDevice = null; //如果傳入ToolDeviceSID為NULL,表示要新增一筆CST_TOOL_DEVICE資料 if (_CurrentToolDeviceSID.IsNullOrTrimEmpty()) { toolDevice = InfoCenter.Create <CSTToolDeviceInfo>(); toolDevice.DeviceName = ttbDevice.Text; toolDevice.EquipmentName = ttbEquipment.Text; toolDevice.Tag = 1; toolDevice.InsertToDB(userID, recordTime); LogCenter.LogToDB(toolDevice, LogCenter.LogIndicator.Create(ActionType.Add, userID, recordTime)); } else { toolDevice = InfoCenter.GetBySID <CSTToolDeviceInfo>(_CurrentToolDeviceSID); } #region 更新資料清單 _ModifyToolDeviceDetails.ForEach(deviceDetail => { //註記資料LOG的狀態 ActionType deviceDetailActionType = new ActionType(); if (deviceDetail.InfoState == InfoState.NewCreate) { deviceDetail.ToolDeviceSID = toolDevice.ToolDeviceSID; //新增資料 deviceDetail.InsertToDB(userID, recordTime); deviceDetailActionType = ActionType.Add; } else if (deviceDetail.InfoState == InfoState.Modified) { //更改資料 deviceDetail.UpdateToDB(userID, recordTime); deviceDetailActionType = ActionType.Set; _SourceToolDeviceDetails.Remove(deviceDetail); } else if (deviceDetail.InfoState == InfoState.Unchanged) { _SourceToolDeviceDetails.Remove(deviceDetail); } //紀錄歷史紀錄[CST_TOOL_DEVICE_DETAIL_LOG],有異動資料才更新 if (deviceDetailActionType != ActionType.None) { LogCenter.LogToDB(deviceDetail, LogCenter.LogIndicator.Create(deviceDetailActionType, userID, recordTime)); } }); #endregion #region 處理資料刪除的部份 _SourceToolDeviceDetails.ForEach(deviceDetail => { deviceDetail.DeleteFromDB(); LogCenter.LogToDB(deviceDetail, LogCenter.LogIndicator.Create(ActionType.Remove, userID, recordTime)); }); #endregion cts.Complete(); } //INF-00002:{0}儲存成功! _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00083(""), MessageShowOptions.OnLabel); ClearData(); LoadControlDefault(); QueryData(); btnExit_Click(null, EventArgs.Empty); } catch (Exception E) { HandleError(E); } }
/// <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 ddlSN_SelectedIndexChanged(object sender, EventArgs e) { try { ddlSN.Must(lblSN); if (ddlSN.SelectedIndex != -1) { //清除原因碼資料 ddlPQCReasonCode.Items.Clear(); ttbMaterialLot.Text = ""; ttbWorkOrderLot.Text = ""; ttbDescr.Text = ""; rdbNG.Enabled = false; rdbOK.Enabled = false; int index = -1; for (int i = 0; i < _QCDataList.Count; i++) { string ID = _QCDataList[i].ID; //比對符合選擇機台編號的資料 if (ID == ddlSN.SelectedValue) { index = i; break; } } _SelectedQCData = _QCDataList[index]; ttbMaterialLot.Text = _SelectedQCData.MaterialLot; ttbWorkOrderLot.Text = _SelectedQCData.WorkOderLot; if (_SelectedQCData.PassFlag == "N") { // 取得中心孔量測設定值 var lstSAICenterHolde = WpcExClassItemInfo.GetExClassItemInfo("SAICenterHole", _SelectedQCData.DeviceName); if (lstSAICenterHolde.Count == 0) { lstSAICenterHolde = WpcExClassItemInfo.GetExClassItemInfo("SAICenterHole", "ALL"); } // 若找不到中心孔量測需拋錯 if (lstSAICenterHolde.Count == 0) { throw new Exception(TextMessage.Error.T00555("SAICenterHole", _SelectedQCData.DeviceName + "," + "ALL")); } _SAICenterHole = lstSAICenterHolde[0]; // 設定中心孔量測的DataTable資料 DataTable dtEmpty = new DataTable(); dtEmpty.Columns.Add("ITEM", typeof(int)); dtEmpty.Columns.Add("EDC", typeof(String)); for (int i = 0; i < _SAICenterHole.Remark04.ToDecimal(0); i++) { DataRow dr = dtEmpty.NewRow(); dr["ITEM"] = i + 1; dtEmpty.Rows.Add(dr); } // 將產生的資料表顯示在畫面上 gvComponentEDC.DataSource = dtEmpty; gvComponentEDC.DataBind(); } //取得Lot資料 var lotData = InfoCenter.GetBySID <LotInfo>(_SelectedQCData.ObjectSID); rdbNG.Enabled = true; rdbOK.Enabled = true; #region 設置原因碼 List <BusinessReason> reason = ReasonCategoryInfo.GetOperationRuleCategoryReasonsWithReasonDescr(ProgramRight, "ALL", "Default", ReasonMode.Category); if (reason.Count > 0) { ddlPQCReasonCode.DataSource = reason; ddlPQCReasonCode.DataTextField = "ReasonDescription"; ddlPQCReasonCode.DataValueField = "ReasonCategorySID"; ddlPQCReasonCode.DataBind(); if (ddlPQCReasonCode.Items.Count != 1) { ddlPQCReasonCode.Items.Insert(0, ""); } else { ddlPQCReasonCode.SelectedIndex = 0; } } else { //[00641]規則:{0} 工作站:{1} 使用的原因碼未設定,請洽IT人員! throw new Exception(TextMessage.Error.T00641(ProgramRight, "ALL")); } #endregion btnOK.Enabled = true; } } catch (Exception ex) { HandleError(ex); ddlPQCReasonCode.Items.Clear(); ttbMaterialLot.Text = ""; ttbDescr.Text = ""; ttbWorkOrderLot.Text = ""; btnOK.Enabled = false; rdbOK.Checked = true; rdbNG.Checked = false; rdbOK.Enabled = true; rdbNG.Enabled = false; gvComponentEDC.DataSource = null; gvComponentEDC.DataBind(); } }
/// <summary> /// 鍛造出站有不良數量直接拆批及送待判工作站 /// </summary> /// <param name="txnLotData">機加批號</param> /// <param name="defectGridDataList">不良清單</param> /// <param name="txnStamp"></param> public void SplitDefectLotList(LotInfoEx txnLotData, List <DefectGridData> defectGridDataList, TransactionStamp txnStamp) { //待判工作站點名稱 string judgeOperationName = ""; //確認是否有不良清單,如果有不良清單的話,則要取得待判工作站資料 if (defectGridDataList.Count > 0) { //在系統資料維護裡,取得此批號對應製程(CPC/CPF)的待判工作站名稱 List <WpcExClassItemInfo> operationList = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks("SAIJudgeOperation"); WpcExClassItemInfo judgeOperationData = operationList.Find(p => p.Remark01 == txnLotData.Process); if (judgeOperationData == null) { //找不到待判站資訊,請至系統資料維護增加資訊,屬性:{0} throw new Exception(RuleMessage.Error.C10014(txnLotData.Process)); } //取得待判工作站名稱 judgeOperationName = judgeOperationData.Remark02; } //處理不良批號 defectGridDataList.ForEach(defectGridData => { //取得原因碼資訊 var reasonData = InfoCenter.GetBySID <ReasonCategoryInfo>(defectGridData.DefectID); //取得批號子單元資訊 var component = ComponentInfo.GetComponentByComponentID(defectGridData.ComponentID); //取得不良子批批號名稱 var splitLotNaming = GetNamingRule("SplitLot", txnStamp.UserID, txnLotData); //批號拆子批 var splitLot = SplitLotInfo.CreateSplitLotByLotAndQuantity(txnLotData.Lot, splitLotNaming.First[0], new List <ComponentInfo>() { component }, reasonData, reasonData.Description); WIPTxn.Default.SplitLot(txnLotData, splitLot, WIPTxn.SplitIndicator.Create(null, null, null, TerminateBehavior.NoTerminate), txnStamp); if (splitLotNaming.Second != null && splitLotNaming.Second.Count != 0) { DBCenter.ExecuteSQL(splitLotNaming.Second); } //註記不良 var compDefect = ComponentDefectObject.Create(component, component.ComponentQuantity, 0, reasonData, defectGridData.DefectDesc); WIPTransaction.DefectComponent(splitLot, new List <ComponentDefectObject>() { compDefect }, WIPTransaction.DefectIndicator.Create(), txnStamp); #region 送至待判工作站 //取得目前批號的流程線上版本 RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(txnLotData.RouteName); //以目前工作站名稱去查詢在所有流程中的序號 var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == judgeOperationName); //以目前工作站名稱去查詢在所有流程中的序號 var reasonCategory = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); ////將批號的UDC01註記不良批 //WIPTransaction.ModifyLotSystemAttribute(splitLot, "USERDEFINECOL01", "Y", txnStamp); ////將批號的UDC02註記工作站序號 //WIPTransaction.ModifyLotSystemAttribute(splitLot, "USERDEFINECOL02", operationSequence, txnStamp); ////將批號的UDC03註記工作站名稱 //WIPTransaction.ModifyLotSystemAttribute(splitLot, "USERDEFINECOL03", operationName, txnStamp); var modifyAttrList = new List <ModifyLotAttributeInfo>(); //將批號的UDC01註記不良批 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL01", "Y")); //將批號的UDC02註記工作站序號 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL02", splitLot.OperationSequence)); //將批號的UDC03註記工作站名稱 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL03", splitLot.OperationName)); WIPTransaction.ModifyLotMultipleAttribute(splitLot, modifyAttrList, txnStamp); WIPTransaction.ReassignOperation(splitLot, routeOperation, reasonCategory, reasonCategory.Description, txnStamp); #endregion }); }
/// <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); } }
/// <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 ddlSN_SelectedIndexChanged(object sender, EventArgs e) { try { //清除機台檢驗資料 _CSTWIPCMMList = new List <CSTWIPCMMInfo>(); _CSTWIPCMMDataList = new List <CSTWIPCMMDataInfo>(); gvInspectionData.SetDataSource(_CSTWIPCMMDataList, true); ddlFileName.Items.Clear(); ddlSN.Must(lblSN); if (ddlSN.SelectedIndex != -1) { //清除原因碼資料 ddlFAIReasonCode.Items.Clear(); ttbMaterialLot.Text = ""; ttbWorkOrderLot.Text = ""; ttbDescr.Text = ""; rdbPASS.Enabled = false; rdbNG.Enabled = false; rdbOK.Enabled = false; int index = -1; for (int i = 0; i < _QCDataList.Count; i++) { string ID = _QCDataList[i].ID; //比對符合選擇機台編號的資料 if (ID == ddlSN.SelectedValue) { index = i; break; } } _SelectedQCData = _QCDataList[index]; ttbMaterialLot.Text = _SelectedQCData.MaterialLot; ttbWorkOrderLot.Text = _SelectedQCData.WorkOderLot; if (_SelectedQCData.PassFlag == "N") { //以機台名稱檢查是否有檢驗結果資料 _CSTWIPCMMList = CSTWIPCMMInfo.GetDataListByEquipmantAndFileIDAndDevice(_SelectedQCData.EquipmentName, _SelectedQCData.ComponentLot, _SelectedQCData.WorkOderLot, _SelectedQCData.MaterialLot, _SelectedQCData.DeviceName); //以OP1機台名稱檢查是否有檢驗結果資料 var CSTWIPCMMListBySEquipment = CSTWIPCMMInfo.GetDataListByEquipmantAndFileIDAndDevice(_SelectedQCData.SecondEquipmentName, _SelectedQCData.ComponentLot, _SelectedQCData.WorkOderLot, _SelectedQCData.MaterialLot, _SelectedQCData.DeviceName); //將二組資料合併,去除重覆資料 CSTWIPCMMListBySEquipment.ForEach(data => { if (_CSTWIPCMMList.Contains(data) == false) { _CSTWIPCMMList.Add(data); } }); if (_CSTWIPCMMList.Count == 0) { //序號:{0} 沒有機台檢驗資料可以顯示! throw new Exception(RuleMessage.Error.C10065(ddlSN.SelectedItem.Text)); } //加入機台檢驗檔名稱 _CSTWIPCMMList.ForEach(data => { ddlFileName.Items.Add(new ListItem(data["FILENAME"].ToString(), data.ID)); }); if (ddlFileName.Items.Count > 0) { ddlFileName.Items.Insert(0, ""); } } else { rdbPASS.Enabled = true; } //取得Lot資料 var lotData = InfoCenter.GetBySID <LotInfo>(_SelectedQCData.ObjectSID); rdbNG.Enabled = true; rdbOK.Enabled = true; #region 設置原因碼 List <BusinessReason> reason = ReasonCategoryInfo.GetOperationRuleCategoryReasonsWithReasonDescr(ProgramRight, "ALL", "Default", ReasonMode.Category); if (reason.Count > 0) { ddlFAIReasonCode.DataSource = reason; ddlFAIReasonCode.DataTextField = "ReasonDescription"; ddlFAIReasonCode.DataValueField = "ReasonCategorySID"; ddlFAIReasonCode.DataBind(); if (ddlFAIReasonCode.Items.Count != 1) { ddlFAIReasonCode.Items.Insert(0, ""); } else { ddlFAIReasonCode.SelectedIndex = 0; } } else { //[00641]規則:{0} 工作站:{1} 使用的原因碼未設定,請洽IT人員! throw new Exception(TextMessage.Error.T00641(ProgramRight, "ALL")); } #endregion btnOK.Enabled = true; } } catch (Exception ex) { HandleError(ex); ddlFAIReasonCode.Items.Clear(); ttbMaterialLot.Text = ""; ttbDescr.Text = ""; ttbWorkOrderLot.Text = ""; btnOK.Enabled = false; rdbOK.Checked = true; rdbNG.Checked = false; rdbPASS.Checked = false; rdbCLOSE.Checked = false; rdbOK.Enabled = true; rdbNG.Enabled = false; rdbPASS.Enabled = false; _CSTWIPCMMList = new List <CSTWIPCMMInfo>(); _CSTWIPCMMDataList = new List <CSTWIPCMMDataInfo>(); gvInspectionData.SetDataSource(_CSTWIPCMMDataList, true); } }
/// <summary> /// 切換不同的送待判原因 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ddlJudgeDefect_SelectedIndexChanged(object sender, EventArgs e) { try { //確認是否有選擇送待判原因 ddlJudgeDefect.Must(lblJudgeDefect); //取得批號資訊 _LotDefectData = InfoCenter.GetBySID <LotDefectInfo>(ddlJudgeDefect.SelectedValue); _LotData = LotInfoEx.GetLotByLot(_LotDefectData.Lot).ChangeTo <LotInfoEx>(); #region 判定原因碼(DropDownList):依照原因碼工作站設定,帶出原因碼 ddlJudgeReason.Items.Clear(); List <BusinessReason> reasonList = ReasonCategoryInfo.GetOperationRuleCategoryReasonsWithReasonDescr(_LotData.CurrentRuleName, _LotData.OperationName, "Default", ReasonMode.Category); if (reasonList.Count > 0) { ddlJudgeReason.DataSource = reasonList; ddlJudgeReason.DataTextField = "ReasonDescription"; ddlJudgeReason.DataValueField = "ReasonCategorySID"; ddlJudgeReason.DataBind(); if (ddlJudgeReason.Items.Count != 1) { ddlJudgeReason.Items.Insert(0, ""); } else { ddlJudgeReason.SelectedIndex = 0; } } else { //[00641]規則:{0} 工作站:{1} 使用的原因碼未設定,請洽IT人員! throw new Exception(TextMessage.Error.T00641(ProgramRight, _LotData.OperationName)); } #endregion //數量 ttbQty.Text = _LotData.Quantity.ToString(); //取得工件序號 var componentDataList = ComponentInfoEx.GetDataByCurrentLot(_LotData.Lot); if (componentDataList.Count > 0) { ttbItemSN.Text = componentDataList[0].ComponentID; } ttbJudgeDescr.Text = ""; btnOK.Enabled = true; btnPrint.Enabled = true; } catch (Exception ex) { ttbItemSN.Text = ""; ttbQty.Text = ""; ttbJudgeDescr.Text = ""; ddlJudgeReason.Items.Clear(); btnOK.Enabled = false; btnPrint.Enabled = false; _LotData = null; _LotDefectData = null; 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); } }
protected void btnOK_Click(object sender, EventArgs e) { try { ttbEquipment.Must(lblEquipment); ddlOperation.Must(lblOperation); csReason.Must(lblTakeReason); if (_TakeToolLifeList.Count == 0) { // [00824]請新增[刀頭]! throw new RuleCimesException(TextMessage.Error.T00824(lblMillHeader.Text)); } string groupid = DBCenter.GetSystemID(); var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { _TakeToolLifeList.ForEach(tool => { // 變更GROUPID與HEAD系統屬性 // HEAD紀錄目前刀具使用的刀頭 // GROUPID紀錄目前綁定的刀具 var toolInfo = ToolInfo.GetToolByName(tool.ToolName); var modifyAttrList = new List <ModifyAttributeInfo>(); modifyAttrList.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("GROUPID", groupid)); modifyAttrList.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("HEAD", tool.Head)); modifyAttrList.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("LOCATION", "Hub")); //因刀具報表需求,所以在領用時要AddComment,並將刀面及使用次數記錄在UDC06 & UDC07 modifyAttrList.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("USERDEFINECOL06", tool.Head)); modifyAttrList.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("USERDEFINECOL07", tool.UseCount)); modifyAttrList.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("USERDEFINECOL08", tool.Operation)); TMSTransaction.ModifyToolMultipleAttribute(toolInfo, modifyAttrList, txnStamp); txnStamp.Remark = "刀具領用"; var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(csReason.SelectedValue); txnStamp.CategoryReasonCode = reasonCategory; txnStamp.Description = ""; TMSTransaction.AddToolComment(toolInfo, txnStamp); }); // 寫入CSTToolIssue客製表 var toolIssueInfo = InfoCenter.Create <CSTToolIssueInfo>(); toolIssueInfo.TOTALQTY = _TakeToolLifeList.Count; toolIssueInfo.Reason = csReason.GetBusinessReason().ReasonCode; toolIssueInfo.EquipmentName = _EquipmentInfo == null ? "" : _EquipmentInfo.EquipmentName; toolIssueInfo.LinkSID = txnStamp.LinkSID; toolIssueInfo.Action = "領用"; toolIssueInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); cts.Complete(); } ClearField(); AjaxFocus(ttbMillName); ((ProgramInformationBlock)ProgramInformationBlock1).ShowMessage(TextMessage.Hint.T00057("領用")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 輸入機台/序號 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ttbEquipOrCompLot_TextChanged(object sender, EventArgs e) { try { QCInspectionInfoEx QCInspectionData = new QCInspectionInfoEx(); //檢查是否有輸入機台/序號 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, CustomizeFunction.QCType.PPK.ToCimesString()); if (QCDataList.Count == 0) { //請輸入正確的機台/序號! throw new Exception(RuleMessage.Error.C10066()); } //取得檢驗主檔資訊 QCInspectionData = QCDataList[0]; } else { //取得檢驗主檔資訊 QCInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(QCDataObjList[0].QC_INSP_SID).ChangeTo <QCInspectionInfoEx>(); } //檢查機台資料及狀態 CheckEquipCurrentState(QCInspectionData.EquipmentName); #endregion #region 查詢相同的BatchID的檢驗主檔清單 _QCInspectionDataList = QCInspectionInfoEx.GetDataListByBatchID(QCInspectionData.BatchID); if (_QCInspectionDataList.Count == 0) { //檢驗單號:{0} 查無相同的BatchID throw new Exception(RuleMessage.Error.C10110(QCInspectionData.InspectionNo)); } #endregion //設置機台名稱 ttbEquip.Text = QCInspectionData.EquipmentName; //取得不重複的料號清單 var deviceList = _QCInspectionDataList.FindAll(p => p.Status == CustomizeFunction.QCStatus.PPK.ToCimesString()).Select(p => p.DeviceName).Distinct().ToList(); //var deviceList = _QCInspectionDataList.Select(p => p.DeviceName).Distinct().ToList(); #region 設置料號資料(DropDownList) //清除資料 ddlDevice.Items.Clear(); //加入清單 foreach (var deviceName in deviceList) { ddlDevice.Items.Add(new ListItem(deviceName, deviceName)); } if (ddlDevice.Items.Count != 1) { ddlDevice.Items.Insert(0, ""); } else { ddlDevice.SelectedIndex = 0; ddlDevice_SelectedIndexChanged(null, EventArgs.Empty); } #endregion } 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 { //確認是否輸入工件序號 ttbCompLot.Must(lblCompLot); //確認是否有選擇流程 ddlRoute.Must(lblRoute); //確認是否有選擇流程工作站 ddlRouteOperation.Must(lblRouteOperation); TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //以第一個工件序號為拆批的母批 var txnLotData = _MergeLotDataList[0]; //取得原因碼資料 var reasonData = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); #region 執行拆批 //批號子單元清單 var lsComponetData = ComponentInfoEx.GetDataByCurrentLot(txnLotData.Lot); //取得併批批號名稱 var splitLotNaming = GetNamingRule("SplitLot", txnStamp.UserID, txnLotData); //批號拆批 var splitLot = SplitLotInfo.CreateSplitLotByLotAndQuantity(txnLotData.Lot, splitLotNaming.First[0], lsComponetData, reasonData, reasonData.Description); WIPTxn.Default.SplitLot(txnLotData, splitLot, WIPTxn.SplitIndicator.Create(null, null, null, TerminateBehavior.TerminateWithHistory), txnStamp); //將批號的UDC08註記N WIPTransaction.ModifyLotSystemAttribute(splitLot, "USERDEFINECOL08", "N", txnStamp); if (splitLotNaming.Second != null && splitLotNaming.Second.Count != 0) { DBCenter.ExecuteSQL(splitLotNaming.Second); } #endregion #region 執行併批 //移除第一個工件序號(因為拆批已處理過了) _MergeLotDataList.RemoveAt(0); List <MergeLotInfo> lsMergeLots = new List <MergeLotInfo>(); foreach (var mergeLot in _MergeLotDataList) { //批號子單元清單 var componetDataList = ComponentInfoEx.GetDataByCurrentLot(mergeLot.Lot); //加入併批清單 lsMergeLots.Add(MergeLotInfo.GetMergeLotByLotAndQuantity(mergeLot.Lot, componetDataList, reasonData, reasonData.Description)); } //將數量合併到在狀態為Run的批號上 if (lsMergeLots.Count > 0) { WIPTransaction.MergeLot(splitLot, lsMergeLots, txnStamp); } #endregion #region 變更流程 //取得料號版本資料 var deviceVersionData = DeviceVersionInfo.GetDeviceVersion(splitLot.DeviceName, splitLot.DeviceVersion); //取得所選擇的流程資料 var routeData = InfoCenter.GetBySID <RouteInfo>(ddlRoute.SelectedValue); //取得所選擇流程目前線上版本資料 var routeVersionData = RouteVersionInfo.GetActiveRouteVersion(routeData); //取得所選擇的流程工作站資料 var routeOpeartionData = InfoCenter.GetBySID <RouteOperationInfo>(ddlRouteOperation.SelectedValue); WIPTransaction.ReassignRoute(splitLot, deviceVersionData, routeVersionData, routeOpeartionData, reasonData, reasonData.Description, txnStamp); #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbCompLot); _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 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 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 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="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); //確認是否選擇維修原因 ddlReason.Must(lblReason); //確認是否有選擇預定回廠日 var date = ttbDate.MustDate(lblDate); //取得系統時間 var sysDate = Convert.ToDateTime(DBCenter.GetSystemDateTime().ToString("yyyy/MM/dd")); //確認預定回廠日是否大於等於當天日期 if (date < sysDate) { //預定回廠日必須大於等於{0} ! throw new Exception(RuleMessage.Error.C10159(sysDate.ToString("yyyy/MM/dd"))); } using (var cts = CimesTransactionScope.Create()) { //取得原因碼資料 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlReason.SelectedValue); //取得刀面資料清單 var toolLifes = CSTToolLifeInfo.GetToolLifeByToolNmae(_ToolData.ToolName); toolLifes.Sort(data => data.Head); //新增一筆[CST_TOOL_REPAIR] var newToolRePair = InfoCenter.Create <CSTToolRepairInfo>(); newToolRePair.EstimateDateOfReturn = ttbDate.Text; newToolRePair.Parts = ttbRepairPart.Text; newToolRePair.Reason = reasonCategory.Reason; newToolRePair.ReasonCategory = reasonCategory.Category; newToolRePair.RepairTime = txnStamp.RecordTime; newToolRePair.RepairUser = txnStamp.UserID; newToolRePair.ToolName = _ToolData.ToolName; newToolRePair.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); //新增一筆[CST_TOOL_REPAIR_LOG] LogCenter.LogToDB(newToolRePair, LogCenter.LogIndicator.Create(ActionType.Add, txnStamp.UserID, txnStamp.RecordTime)); //新增[CST_TOOL_REPAIR_LIFE] toolLifes.ForEach(toolLife => { var newToolRePairLife = InfoCenter.Create <CSTToolRepairLifeInfo>(); newToolRePairLife.Head = toolLife.Head; newToolRePairLife.Life = toolLife.UseCount.ToString(); newToolRePairLife.ToolRepairSID = newToolRePair.ToolRepairSID; newToolRePairLife.InsertToDB(); }); var newStateInfo = ToolStateInfo.GetToolStateByState("REPAIR"); if (newStateInfo == null) { //刀具零組件狀態: {0}不存在,請至配件狀態維護新增此狀態!! throw new Exception(RuleMessage.Error.C10149("REPAIR")); } //因刀具報表需求,所以在送修時要將使用次數記錄在UDC07 var toolLifeData = toolLifes.Find(p => p.Head == _ToolData.Head); TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL07", toolLifeData.UseCount.ToCimesString(), txnStamp); //變更狀態為REPAIR TMSTransaction.ChangeToolState(_ToolData, newStateInfo, txnStamp); int maintainCount = _ToolData.MaintainCount; //維修次數+1 TMSTransaction.ModifyToolSystemAttribute(_ToolData, "MAINTAINCOUNT", (maintainCount + 1).ToString(), txnStamp); //預定回廠日 TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL04", ttbDate.Text, txnStamp); //註記原因碼 txnStamp.CategoryReasonCode = reasonCategory; txnStamp.Description = ""; //備註 TMSTransaction.AddToolComment(_ToolData, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { // 子單元不存在拋錯 if (_ComponentInfo == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Component"))); } // 批號不存在拋錯 if (ProcessLotData == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Lot"))); } // 批號狀態必須為Wait if (ProcessLotData.Status != "Wait") { throw new RuleCimesException(TextMessage.Error.T00424()); } // 原因碼 ddlDefectReason.Must(lblDefectReason); var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //取得原因碼資訊 var reasonData = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlDefectReason.SelectedValue); //取得不良子批批號名稱 var splitLotNaming = GetNamingRule("SplitLot", txnStamp.UserID, ProcessLotData); //批號拆子批 var splitLot = SplitLotInfo.CreateSplitLotByLotAndQuantity(ProcessLotData.Lot, splitLotNaming.First[0], new List <ComponentInfo>() { _ComponentInfo }, reasonData, reasonData.Description); WIPTxn.Default.SplitLot(ProcessLotData, splitLot, WIPTxn.SplitIndicator.Create(), txnStamp); if (splitLotNaming.Second != null && splitLotNaming.Second.Count != 0) { DBCenter.ExecuteSQL(splitLotNaming.Second); } //註記不良 var compDefect = ComponentDefectObject.Create(_ComponentInfo, _ComponentInfo.ComponentQuantity, 0, reasonData, ttbDefectDesc.Text.Trim()); WIPTransaction.DefectComponent(splitLot, new List <ComponentDefectObject>() { compDefect }, WIPTransaction.DefectIndicator.Create(), txnStamp); #region 送至待判工作站 //取得目前批號的流程線上版本 RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(ProcessLotData.RouteName); //以目前工作站名稱去查詢在所有流程中的序號 var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == _JudgeOperationName); //以目前工作站名稱去查詢在所有流程中的序號 var reasonCategory = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); var modifyAttrList = new List <ModifyLotAttributeInfo>(); //將批號的UDC01註記不良批 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL01", "Y")); //將批號的UDC02註記工作站序號 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL02", splitLot.OperationSequence)); //將批號的UDC03註記工作站名稱 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL03", splitLot.OperationName)); WIPTransaction.ModifyLotMultipleAttribute(splitLot, modifyAttrList, txnStamp); WIPTransaction.ReassignOperation(splitLot, routeOperation, reasonCategory, reasonCategory.Description, txnStamp); #endregion cts.Complete(); } LoadDefaultControl(); ClearField(); ttbWOLot.Text = ""; AjaxFocus(ttbWOLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 取的runcard的資料來源 /// </summary> /// <param name="LotDataList"></param> /// <returns></returns> private DataView GetRunCardDataSource(List <LotInfo> LotDataList) { string sql = ""; DataTable dtReportData = new DataTable(); dtReportData.Columns.Add("OPERSEQ"); dtReportData.Columns.Add("OPERNO"); dtReportData.Columns.Add("Operation"); dtReportData.Columns.Add("OperationDescr"); dtReportData.Columns.Add("RECIPEID"); dtReportData.Columns.Add("EDC"); dtReportData.Columns.Add("ERP_Route_LTEXT"); dtReportData.Columns.Add("ERP_Route_LTXA1"); LotDataList.ForEach(p => { var workOrder = WorkOrderInfo.GetWorkOrderByWorkOrder(p.WorkOrder); var lstCstRouteInfo = CSTWPCWorkOrderRouteInfo.GetDataByWorkOrder(workOrder.WorkOrder); #region RouteOperationInfo sql = @" SELECT O.OPERATIONNO, O.DESCR, ROUTEOPER.* FROM MES_PRC_ROUTE_OPER ROUTEOPER ,MES_PRC_ROUTE_VER ROUTEVER ,MES_PRC_ROUTE ROUTE ,MES_PRC_OPER O WHERE ROUTE.PRC_ROUTE_SID = ROUTEVER.PRC_ROUTE_SID AND ROUTEVER.PRC_ROUTE_VER_SID = ROUTEOPER.PRC_ROUTE_VER_SID AND ROUTEOPER.OPERNAME = O.OPERATION AND ROUTEVER.ROUTE = #[STRING] AND ROUTEVER.VERSION = #[DECIMAL] ORDER BY OPERSEQ"; List <RouteOperationInfo> routeOpers = InfoCenter.GetList <RouteOperationInfo>(sql, p.RouteName, p.RouteVersion); #endregion #region 工作站 routeOpers.ForEach(oper => { DataRow dr = dtReportData.NewRow(); dr["OPERSEQ"] = oper.OperationSequence; dr["Operation"] = oper.OperationName; dr["OPERNO"] = oper["OPERATIONNO"].ToString(); dr["OperationDescr"] = oper["DESCR"].ToString(); var cstOperDataInfo = CSTPRCOperationMappingDataInfo.GetOperationMappingDataByMESOperation(oper.OperationName); if (cstOperDataInfo != null) { var cstOperInfo = InfoCenter.GetBySID <CSTPRCOperationMappingInfo>(cstOperDataInfo.PRCOperationMappingSID); if (cstOperInfo != null) { var cstRouteInfo = lstCstRouteInfo.Find(route => route.ARBPL == cstOperInfo.ERPOperation); if (cstRouteInfo != null) { dr["ERP_Route_LTEXT"] = cstRouteInfo["LTEXT"].ToString(); dr["ERP_Route_LTXA1"] = cstRouteInfo["LTXA1"].ToString(); } } } dtReportData.Rows.Add(dr); }); #endregion }); dtReportData.AcceptChanges(); DataView dvReportData = new DataView(dtReportData); dvReportData.Sort = "OPERSEQ"; dvReportData.Table.TableName = "MES_OPER_RECIPE"; return(dvReportData); }