private DataTable GetLotTitle() { DataTable dt = _LotData.CopyDataToTable("MES_WIP_LOT"); dt.Columns.Add("DeviceCode");//料號的2,3碼 dt.Columns.Add("LotTypeDescr"); dt.Columns.Add("WOQuantity"); dt.Columns.Add("DeviceDescr"); dt.Columns.Add("DeviceBPNo"); dt.Columns.Add("DeviceBPRev"); dt.Columns.Add("ProductionDate");//預計生產日期 dt.Rows[0]["DeviceCode"] = _LotData.DeviceName.Substring(1, 2); var lsLotType = WpcExClassItemInfo.GetExClassItemInfo("LotType", _LotData.LotType); dt.Rows[0]["LotTypeDescr"] = lsLotType.Count > 0 ? lsLotType[0].Remark02 : ""; var WOData = WorkOrderInfo.GetWorkOrderByWorkOrder(_LotData.WorkOrder); dt.Rows[0]["WOQuantity"] = WOData.Quantity; dt.Rows[0]["ProductionDate"] = WOData["ProductionDate"].ToCimesString(); var DeviceData = DeviceVersionInfoEx.GetActiveDeviceVersion(_LotData.DeviceName).ChangeTo <DeviceVersionInfoEx>(); dt.Rows[0]["DeviceDescr"] = DeviceData.Description; dt.Rows[0]["DeviceBPNo"] = "0 無欄位"; dt.Rows[0]["DeviceBPRev"] = "0 無欄位"; return(dt); }
/// <summary> /// 取得系統控制設定的類別資料 /// </summary> /// <param name="className"></param> /// <returns></returns> private List <WpcExClassItemInfo> GetExtendItemListByClass(string className) { var dataList = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks(className); if (dataList.Count == 0) { // [00466]系統控制設定,類別:[{0}],項目:[{1}]未設定! throw new Exception(TextMessage.Error.T00466(className, "")); } return(dataList); }
/// <summary> /// 取得供應商清單 /// </summary> private void GetSuppliers() { var suppliers = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks("SAIToolSupplier"); ddlSupplier.DataSource = suppliers; ddlSupplier.DataTextField = "Remark01"; ddlSupplier.DataBind(); ddlSupplier.Items.Insert(0, ""); if (suppliers.Count == 0) { //[00555]查無資料,請至系統資料維護新增類別{0}、項目{1}! throw new Exception(TextMessage.Error.T00555("SAIToolSupplier", "")); } }
protected void ttbWorkOrderLot_TextChanged(object sender, EventArgs e) { try { ClearField(); string workorderLot = ttbWorkOrderLot.Text.Trim(); if (workorderLot.IsNullOrEmpty()) { return; } _LotDatas = LotInfoEx.GetLotListByWorkOrderLot(workorderLot); if (_LotDatas.Count == 0) { // [00060] 工件清單沒有資料可顯示! throw new RuleCimesException(TextMessage.Error.T00060(lblLotList.Text)); } var judgeOperation = WpcExClassItemInfo.GetInfoByClass("SAIJudgeOperation").Find(p => p.Remark01 == _LotDatas[0].Process); if (judgeOperation == null) { //找不到待判站資訊,請至系統資料維護增加資訊,屬性:{0} throw new Exception(RuleMessage.Error.C10014(_LotDatas[0].Process)); } _JudgeOperation = judgeOperation.Remark02; _LotDatas = _LotDatas.OrderBy(p => p.OperationSequence).ThenBy(p => p.ComponentLot).ToList(); var lotTemp = _LotDatas.FindAll(p => p.OperationName != _JudgeOperation); var enabled = true; lotTemp.ForEach(lot => { if (lot.Status != "WaitMerge") { enabled = false; } }); btnOK.Enabled = enabled; //gvWorkpiece.SetDataSource(_LotDatas, true); gvWorkpiece.DataSource = _LotDatas; gvWorkpiece.DataBind(); } catch (Exception ex) { AjaxFocus(ttbWorkOrderLot); HandleError(ex); } }
/// <summary> /// 取得預約工作站資料 /// </summary> private void GetReserveCheckInData() { //如果批號狀態為Wait,表示第一次進站 if (_LotData.Status == LotDefaultStatus.Wait.ToString()) { //檢查批號目前規則是否與使用程式名稱一樣 if (_LotData.CurrentRuleName != ProgramRight) { //該批號作業為{0},不為此功能,請遵循作業規範 throw new Exception(RuleMessage.Error.C10004(_LotData.CurrentRuleName)); } } else if (_LotData.Status == LotDefaultStatus.Run.ToString()) { var reserveFlag = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks("SAIReserve").Find(p => p.Remark01 == _LotData.Process); //如果批號狀態為Run,且有設定允許預約進站,則開始取得預約站點資訊 if (reserveFlag != null) { //取得預約工作站的序號 var nextOperationSequence = CustomizeFunction.GetAppointmentOperationSequence(_LotData.Lot, ProgramRight); //取得預約工作站名稱 var operationName = CustomizeFunction.GetAppointmentOperationName(_LotData, nextOperationSequence); //取得預約工作站的第一個RuleName var firstRuleName = CustomizeFunction.GetFirstOperationTypeRuleByOperationName(_LotData, operationName, ProgramRight); //新增一筆預約資料 _WIPReserveCheckInData = InfoCenter.Create <CSTWIPReserveCheckInInfo>(); _WIPReserveCheckInData.Lot = _LotData.Lot; _WIPReserveCheckInData.OperationName = operationName; _WIPReserveCheckInData.RuleName = firstRuleName; } else { throw new CimesException(TextMessage.Error.T00356(_LotData.Lot)); } } }
private void LoadControlDefault() { ttbQuantity.Text = ""; ttbEquipment.Text = _CurrentEquipment; ttbDevice.Text = _CurrentDevice; //取得所有啟用之刀具類別 var toolTypes = ToolTypeInfoEx.GetToolTypeByToolClass("CUTTER"); ddlToolType.Items.Clear(); ddlToolType.DataSource = toolTypes; ddlToolType.DataTextField = "Type"; ddlToolType.DataValueField = "Type"; ddlToolType.DataBind(); ddlToolType.Items.Insert(0, ""); var lstToolOperation = WpcExClassItemInfo.GetInfoByClass("SAIToolOperation"); lstToolOperation.ForEach(oper => { ddlOperation.Items.Add(oper.Remark01); }); ddlOperation.Items.Insert(0, ""); }
private void Page_Load(object sender, System.EventArgs e) { try { if (!IsPostBack) { _SAIEQPChangeStateList = WpcExClassItemInfo.GetExClassItemInfo("SAIEQPChangeState", ProgramRight); ciEquipment.Text = this.GetCookie("Equipment"); if (!ciEquipment.Text.IsNullOrTrimEmpty()) { ciEquipment.Verify(true); } LoadControlDefault(); } else { SetControlByData(); } } catch (Exception ex) { HandleError(ex); } }
protected void ttbWOLot_TextChanged(object sender, EventArgs e) { try { /*************************************************************************************** * 依照PRODTYP不同,做不同畫面的處置: * S:有序號,一律刷入DMC處理。 * G:僅有鍛造批,選擇要判定的工作站,系統找出該工作站所有的COMPONENT,順排取最後一個 * W:沒有刻字,選擇要判定的工作站,系統找出該工作站所有的COMPONENT,順排取最後一個 * B:有刻字,但序號無意義。 * 在刻字站前因為未刻字所以選擇要判定的工作站,系統找出該工作站所有的COMPONENT,順排取最後一個 * 刻字後,直接刷入DMC處理 **********************************************************/ // 清除資料與使用者介面 ClearField(); LoadDefaultControl(); string sWOLot = ttbWOLot.Text.Trim(); if (sWOLot.IsNullOrEmpty()) { return; } #region 找出料號型態 // 小工單號找批號,此處找批號只是為了找出料號,也順便可以確認線上還有批號可以做送待判這件事 ProcessLotData = LotInfoEx.GetLotByWorkOrderLot(sWOLot); if (ProcessLotData == null) { ProcessLotData = LotInfoEx.GetLotByLot(sWOLot); } if (ProcessLotData == null) { ttbWOLot.Text = ""; AjaxFocus(ttbWOLot); throw new RuleCimesException(TextMessage.Error.T00030(GetUIResource("WOLot"), sWOLot)); } //取得小工單號的料號版本 var deviceVersionInfo = DeviceVersionInfo.GetLotCurrentDeviceVersion(ProcessLotData).ChangeTo <DeviceVersionInfoEx>(); if (deviceVersionInfo == null) { throw new CimesException(TextMessage.Error.T00537(ProcessLotData.DeviceName)); } if (deviceVersionInfo.ProdType.IsNullOrTrimEmpty()) { ttbWOLot.Text = ""; AjaxFocus(ttbWOLot); throw new RuleCimesException(TextMessage.Error.T00031(GetUIResource("Device"), deviceVersionInfo.DeviceName, "PRODTYPE")); } _ProdType = deviceVersionInfo.ProdType; #endregion #region 取得工作站 ddlOperation.Items.Clear(); var lstLotRouteOperation = RouteOperationInfo.GetLotDefaultOperations(ProcessLotData).OrderBy(p => p.OperationSequence).ToList(); lstLotRouteOperation.ForEach(oper => { ddlOperation.Items.Add(new ListItem(oper.OperationName + "[" + oper.OperationSequence + "]", oper.OperationName)); }); ddlOperation.Items.Insert(0, ""); #endregion #region 原因碼選項 ddlDefectReason.Items.Clear(); List <BusinessReason> reason = ReasonCategoryInfo.GetOperationRuleCategoryReasonsWithReasonDescr(ProgramRight, ProcessLotData.OperationName, "Default", ReasonMode.Category); if (reason.Count == 0) { reason = ReasonCategoryInfo.GetOperationRuleCategoryReasonsWithReasonDescr(ProgramRight, "ALL", "Default", ReasonMode.Category); } if (reason.Count > 0) { ddlDefectReason.DataSource = reason; ddlDefectReason.DataTextField = "ReasonDescription"; ddlDefectReason.DataValueField = "ReasonCategorySID"; ddlDefectReason.DataBind(); if (ddlDefectReason.Items.Count != 1) { ddlDefectReason.Items.Insert(0, ""); } else { ddlDefectReason.SelectedIndex = 0; } } else { //[00641]規則:{0} 工作站:{1} 使用的原因碼未設定,請洽IT人員! throw new Exception(TextMessage.Error.T00641(ProgramRight, ProcessLotData.OperationName)); } #endregion #region 依照PRODTYPE處理介面 ttbDefectDesc.ReadOnly = false; ddlDefectReason.Enabled = true; if (_ProdType == CustomizeFunction.ProdType.S.ToCimesString()) { ddlOperation.Enabled = false; ttbWorkpiece.ReadOnly = false; } if (_ProdType == CustomizeFunction.ProdType.W.ToCimesString() || _ProdType == CustomizeFunction.ProdType.G.ToCimesString()) { ttbWorkpiece.ReadOnly = true; ddlOperation.Enabled = true; } if (_ProdType == CustomizeFunction.ProdType.B.ToCimesString()) { ttbWorkpiece.ReadOnly = false; ddlOperation.Enabled = true; } #endregion #region 找出待判站 //在系統資料維護裡,取得此批號對應製程(CPC/CPF)的待判工作站名稱 List <WpcExClassItemInfo> operationList = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks("SAIJudgeOperation"); WpcExClassItemInfo judgeOperationData = operationList.Find(p => p.Remark01 == ProcessLotData.Process); if (judgeOperationData == null) { //找不到待判站資訊,請至系統資料維護增加資訊,屬性:{0} throw new Exception(RuleMessage.Error.C10014(ProcessLotData.Process)); } //取得待判工作站名稱 _JudgeOperationName = judgeOperationData.Remark02; #endregion if (ttbWorkpiece.Enabled) { AjaxFocus(ttbWorkpiece); } } 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"))); } // 定義交易戳記 var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { bool inSpec = true; if (_CenterHoleFlag != "N") { gvComponentEDC.Rows.LoopDo <GridViewRow>((p, i) => { // 取得TextBox Control var ttbEDC = p.FindControl("ttbEDC") as TextBox; if (ttbEDC.Text.IsNullOrEmpty()) { throw new RuleCimesException(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 edcCompInfo = InfoCenter.Create <CSTEDCComponentInfo>(); edcCompInfo.ComponentID = ComponentInfo.ComponentID; edcCompInfo.Data = measureVal; edcCompInfo.UpSpecification = SAICenterHole.Remark02.ToDecimal(); edcCompInfo.LowSpecification = SAICenterHole.Remark03.ToDecimal(); edcCompInfo.INSPEC = inSpec == true ? "OK" : "NG"; edcCompInfo.Lot = ProcessLotData.Lot; edcCompInfo["LINKSID"] = txnStamp.LinkSID; edcCompInfo["PARAMETER"] = "SC" + (i + 1).ToString(); edcCompInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); } if (!ttbTemperature.Text.IsNullOrEmpty()) { // 溫度必須是數值 ttbTemperature.MustDecimal(lblTemperature); // 將量測資料記錄到客製表 var edcCompInfo = InfoCenter.Create <CSTEDCComponentInfo>(); edcCompInfo.ComponentID = ComponentInfo.ComponentID; edcCompInfo.Data = ttbTemperature.Text.ToDecimal(); edcCompInfo.Lot = ProcessLotData.Lot; edcCompInfo["LINKSID"] = txnStamp.LinkSID; edcCompInfo["PARAMETER"] = "Temperature"; edcCompInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); } var lstCompAttr = new List <ModifyAttributeInfo>(); // 紀錄子單元量測時間 lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("CENTER_HOLE_TIME", txnStamp.RecordTime)); lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("DMC", ttbWorkpiece.Text.Trim())); if (inSpec) { // 修改子單元系統屬性 lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("CENTER_HOLE_FLAG", "OK")); WIPTransaction.ModifyLotComponentMultipleAttribute(ProcessLotData, ComponentInfo, lstCompAttr, txnStamp); } else { // 修改子單元系統屬性 lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("CENTER_HOLE_FLAG", "NG")); WIPTransaction.ModifyLotComponentMultipleAttribute(ProcessLotData, ComponentInfo, lstCompAttr, txnStamp); #region 若不在規格範圍內則拆批至待判站點 var lstSourceLot = new List <LotInfo>(); List <SqlAgent> splitLotArchiSQLList = new List <SqlAgent>(); List <ComponentInfo> lsComponentDatas = new List <ComponentInfo>(); lsComponentDatas.Add(ComponentInfo); var generator = NamingIDGenerator.GetRule("SplitLot"); if (generator == null) { //WRN-00411,找不到可產生的序號,請至命名規則維護設定,規則名稱:{0}!!! throw new Exception(TextMessage.Error.T00437("SplitLot")); } var serialData = generator.GenerateNextIDs(1, ProcessLotData, new string[] { }, User.Identity.Name); splitLotArchiSQLList = serialData.Second; var splitLotID = serialData.First[0]; var reasonCategoryInfo = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); SplitLotInfo splitLotData = SplitLotInfo.CreateSplitLotByLotAndQuantity(ProcessLotData.Lot, splitLotID, lsComponentDatas, reasonCategoryInfo, "EDC"); WIPTxn.SplitIndicator splitInd = WIPTxn.SplitIndicator.Create(); WIPTxn.Default.SplitLot(ProcessLotData, splitLotData, splitInd, txnStamp); //若子單元為自動產生,更新序號至DB if (splitLotArchiSQLList != null && splitLotArchiSQLList.Count > 0) { DBCenter.ExecuteSQL(splitLotArchiSQLList); } #endregion var splitLotInfo = LotInfo.GetLotByLot(splitLotID); // 新增Defect List <ComponentDefectObject> lstCompDefectObj = new List <ComponentDefectObject>(); var reason = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("CustomizeReason", "MeasureNG_MES"); lstCompDefectObj.Add(ComponentDefectObject.Create(ComponentInfo, 1, 0, reason, "CENTER_HOLE_FLAG:NG")); WIPTransaction.DefectComponent(splitLotInfo, lstCompDefectObj, WIPTransaction.DefectIndicator.Create(), txnStamp); #region ReassignOperation // 取得待判站點設定 var saiJudgeOperation = WpcExClassItemInfo.GetExClassItemInfo("SAIJudgeOperation", splitLotInfo["PROCESS"].ToString()); if (saiJudgeOperation.Count == 0) { throw new RuleCimesException(TextMessage.Error.T00555("SAIJudgeOperation", splitLotInfo["PROCESS"].ToString())); } var reassignOperationInfo = RouteOperationInfo.GetLotAllRouteOperations(splitLotInfo).Find(oper => oper.OperationName == saiJudgeOperation[0].Remark02); if (reassignOperationInfo == null) { throw new RuleCimesException(RuleMessage.Error.C10050()); } var lstLotAttr = new List <ModifyLotAttributeInfo>(); // 修改批號系統屬性 lstLotAttr.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL01", "Y")); lstLotAttr.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL02", splitLotInfo.OperationSequence)); lstLotAttr.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL03", splitLotInfo.OperationName)); WIPTransaction.ModifyLotMultipleAttribute(splitLotInfo, lstLotAttr, txnStamp); WIPTransaction.ReassignOperation(splitLotInfo, reassignOperationInfo, reasonCategoryInfo, "EDCSplitReassignOperation", txnStamp); WIPTransaction.ResetLotRule(splitLotInfo, txnStamp); #endregion } cts.Complete(); } ClearUI(); AjaxFocus(ttbWorkpiece); } catch (Exception ex) { HandleError(ex); } }
protected void ttbWorkpiece_TextChanged(object sender, EventArgs e) { try { string inputObject = ttbWorkpiece.Text.Trim(); if (inputObject.IsNullOrEmpty()) { ClearUI(); return; } //轉換字串最後"."的字串 inputObject = CustomizeFunction.ConvertDMCCode(inputObject); //DMCCode有刻字有SN if (_ProdType == CustomizeFunction.ProdType.S.ToCimesString()) { ComponentInfo = _ComponentList.Find(p => p.ComponentID == inputObject); if (ComponentInfo == null) { //工件{0}不屬於Runcard {1},請確認!! throw new CimesException(RuleMessage.Error.C00030(inputObject, ttbWOLot.Text)); } #region 以ComponentID找出ComponentInfo //ComponentInfo = ComponentInfoEx.GetComponentByComponentID(inputObject); //if (ComponentInfo != null) //{ // ProcessLotData = LotInfo.GetLotByLot(ComponentInfo.CurrentLot); //} #endregion } //DMCCode有刻字無SN if (_ProdType == CustomizeFunction.ProdType.G.ToCimesString()) { #region 以MLot,WOLot找出ComponentInfo // 以物料批找出批號 var lstLots = LotInfoEx.GetLotByMaterialLotAndWOLot(inputObject, ProcessLotData.WorkOrderLot); if (lstLots.Count > 1) { throw new RuleCimesException(RuleMessage.Error.C10040(inputObject)); } // 若物料批找不到批號則以WOLot找出批號 if (lstLots.Count == 0) { //[00030]{0}:{1}不存在! throw new RuleCimesException(TextMessage.Error.T00030(lblWOLot.Text + "(" + ttbWOLot.Text + ")," + lblMaterialLot.Text + "(" + inputObject + ")", GetUIResource("Lot"))); } ProcessLotData = lstLots[0]; // 取得所有子單元,並取得沒有做過中心孔量測的批號,以ComponentID排序 var lstComponents = ComponentInfo.GetLotAllComponents(ProcessLotData).FindAll(p => p["CENTER_HOLE_FLAG"].ToString() == "N").OrderBy(p => p.ComponentID).ToList(); ComponentInfo = lstComponents.Count == 0 ? null : lstComponents[0]; if (ComponentInfo == null) { throw new CimesException(RuleMessage.Error.C00039(ProcessLotData.Lot)); } #endregion } //DMCCode有刻字無意義,或是沒有刻DMCCODE,WOLOT是唯一所以可以直接找到批號 if (_ProdType == CustomizeFunction.ProdType.B.ToCimesString() || _ProdType == CustomizeFunction.ProdType.W.ToCimesString()) { #region 以小工單號找出批號 // 以小工單號找出批號 //ProcessLotData = LotInfoEx.GetLotByWorkOrderLot(ttbWOLot.Text.Trim()); ProcessLotData = LotInfoEx.GetLotByLot(ttbWOLot.Text.Trim()); if (ProcessLotData == null) { throw new RuleCimesException(RuleMessage.Error.C10040(inputObject)); } var lstComponents = ComponentInfo.GetLotAllComponents(ProcessLotData).ChangeTo <ComponentInfoEx>(); var lstComponentTemp = lstComponents.Find(p => p.DMC == inputObject); if (lstComponentTemp != null) { throw new CimesException(RuleMessage.Error.C00052(inputObject)); } // 取得所有子單元,並取得沒有做過中心孔量測的批號,以ComponentID排序 lstComponents = lstComponents.FindAll(p => p["CENTER_HOLE_FLAG"].ToString() == "N").OrderBy(p => p.ComponentID).ToList(); ComponentInfo = lstComponents.Count == 0 ? null : lstComponents[0]; if (ComponentInfo == null) { throw new CimesException(RuleMessage.Error.C00039(ProcessLotData.Lot)); } #endregion } // 找不到工件 if (ComponentInfo == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Workpiece"))); } // 找不到批號 if (ProcessLotData == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Lot"))); } if (ComponentInfo["CENTER_HOLE_FLAG"].ToString() != "N") { throw new RuleCimesException(RuleMessage.Error.C10049()); } //批號檢查狀態 if (ProcessLotData.Status != LotDefaultStatus.Run.ToCimesString()) { //[01203]批號狀態不正確, 應為 {0} ! throw new Exception(TextMessage.Error.T01203("Run")); } // 顯示機加批號資訊 //ttbWOLot.Text = ProcessLotData["WOLOT"].ToString(); // 顯示鍛造批號資訊 ttbMaterialLot.Text = ProcessLotData["MATERIALLOT"].ToString(); // 顯示工件序號資訊 ttbWorkpieceSerialNumber.Text = ComponentInfo.ComponentID; // 顯示料號資訊 ttbDeviceName.Text = ProcessLotData.DeviceName; var deviceInfo = DeviceInfo.GetDeviceByName(ProcessLotData.DeviceName); // 顯示機加批號資訊 ttbDeviceDescr.Text = deviceInfo.Description; // 顯示工作站資訊 ttbOperation.Text = ProcessLotData.OperationName; // 顯示流程名稱資訊 ttbRouteName.Text = ProcessLotData.RouteName; if (_CenterHoleFlag.ToBool()) { // 取得中心孔量測設定值 var lstSAICenterHolde = WpcExClassItemInfo.GetExClassItemInfo("SAICenterHole", ProcessLotData.DeviceName); if (lstSAICenterHolde.Count == 0) { lstSAICenterHolde = WpcExClassItemInfo.GetExClassItemInfo("SAICenterHole", "ALL"); } // 若找不到中心孔量測需拋錯 if (lstSAICenterHolde.Count == 0) { throw new RuleCimesException(TextMessage.Error.T00555("SAICenterHole", ProcessLotData.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(); ttbTemperature.ReadOnly = false; } else { btnOK_Click(null, EventArgs.Empty); } } catch (Exception ex) { ttbWorkpiece.Text = ""; ClearUI(); HandleError(ex, ttbWorkpiece.ClientID); } }
/// <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 { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { if (_SelectLotDatas.Count > 0) { string sLotInString = ""; // 組出where in字串 _SelectLotDatas.ForEach(p => { sLotInString += "'" + p.Lot + "',"; }); sLotInString = sLotInString.EndsWith(",") ? sLotInString.Substring(0, sLotInString.Length - 1) : sLotInString; var dtInvData = DBCenter.GetDataTable(@"SELECT WO,INVLOT,SUM(QUANTITY) QUANTITY,DEVICE,FACTORY FROM MES_WIP_LOT WHERE LOT IN(" + sLotInString + ") GROUP BY WO,INVLOT,DEVICE,FACTORY ORDER BY WO"); string headerSID = ""; string date = txnStamp.RecordTime.Substring(0, 10).Replace("/", ""); string time = txnStamp.RecordTime.Substring(11).Replace(":", ""); string preWo = string.Empty; int seq = 1; // SAI倉位對應表 var lstSAIWarehouse = WpcExClassItemInfo.GetInfoByClass("SAIWarehouse"); dtInvData.Rows.LoopDo <DataRow>((p, i) => { string currentWO = p["WO"].ToString(); string device = p["DEVICE"].ToString(); string factory = p["FACTORY"].ToString(); string invLot = p["INVLOT"].ToString(); string qty = p["QUANTITY"].ToString(); if (preWo != currentWO) { seq = 1; headerSID = DBCenter.GetSystemID(); DBCenter.ExecuteParse(@"INSERT INTO PPFHK (SID, WDATE, WTIME, BUDAT, AUFNR, FLAG) VALUES (#[STRING], #[STRING], #[STRING], #[STRING], #[STRING],'N')", headerSID, date, time, date, currentWO); } //寫入PPFHP //WERKS:Factory //LGORT:入庫倉位 //CHARG:INVLOT //MATNR:Device var lstDetail = _SelectLotDatas.FindAll(select => select.InventoryLot == invLot); var warehouseInfo = lstSAIWarehouse.Find(wpcItem => wpcItem.Remark01 == lstDetail[0].Process && wpcItem.Remark03 == "DEFECT"); if (warehouseInfo == null) { //T00555:查無資料,請至系統資料維護新增類別{0}、項目{1}! throw new CimesException(TextMessage.Error.T00555("SAIWarehouse", lstDetail[0].Process + "Remark03:DEFECT")); } DBCenter.ExecuteParse(@"INSERT INTO PPFHP (SID, SEQNR, WDATE, WTIME, MATNR, WERKS, LGORT, CHARG, MENGE, MEINS, FLAG) VALUES (#[STRING], #[DECIMAL], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], 'N')", headerSID, seq, date, time, device, factory, warehouseInfo.Remark02, invLot, qty, lstDetail[0].Unit); int detailseq = 1; lstDetail.ForEach(lot => { var defectInfo = CSTWIPDefectJudgementInfo.GetDataByLot(lot.Lot); var reasonGroupInfo = WIPReasonGroupInfoEx.GetReasonGroupByCategory(defectInfo["REASONCATEGORY"].ToString()); var reasonGroup = reasonGroupInfo == null ? "" : reasonGroupInfo.REASONGROUP; //寫入PPBCH DBCenter.ExecuteParse(@"INSERT INTO PPBCH (SID, MATNR, WERKS, CHARG, SEQNO, WDATE, WTIME, CLASS, ATINN, ATWRT, FLAG) Values (#[STRING], #[STRING], #[STRING], #[STRING], #[DECIMAL], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], 'N')", headerSID, device, factory, invLot, detailseq, date, time, reasonGroup, defectInfo["REASONCATEGORY"].ToString(), defectInfo.Reason); detailseq += 1; }); seq += 1; preWo = currentWO; }); _SelectLotDatas.ForEach(lot => { //寫入WMSMaster & Detail var wmsMaster = CSTWMSMastInfo.GetMaterialLotDataByMaterialLot(lot.InventoryLot); if (wmsMaster == null) { wmsMaster = InfoCenter.Create <CSTWMSMastInfo>(); wmsMaster.Lot = lot.InventoryLot; wmsMaster.DeviceName = lot.DeviceName; wmsMaster.RuleName = txnStamp.RuleName; wmsMaster.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); } //理論上只會有一個Comp lot.GetLotAllComponents().ForEach(comp => { var wmsDetail = InfoCenter.Create <CSTWMSDetailInfo>(); wmsDetail.Lot = lot.InventoryLot; wmsDetail.ComponentID = comp.ComponentID; wmsDetail.Quantity = comp.ComponentQuantity; wmsDetail.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); //將入庫單號回寫到批號身上 WIPTransaction.ModifyLotSystemAttribute(lot, "INVNO", ttbDefectNo.Text, txnStamp); //將勾選的批號結批 WIPTransaction.TerminateLot(lot, txnStamp); }); #region 更新命名規則 if (_ExecuteNamingSQLList != null && _ExecuteNamingSQLList.Count > 0) { DBCenter.ExecuteSQL(_ExecuteNamingSQLList); } #endregion cts.Complete(); } else { //[00816]請至少選取一個{0}! throw new Exception(TextMessage.Error.T00816(GetUIResource("WorkpieceLot"))); } } ClearField(); _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> /// First:SHIFTDATE Second:SHIFT /// </summary> /// <param name="userID"></param> /// <param name="systime"></param> /// <returns></returns> public static Pair <string, string> GetUserShifeData(string systime, bool workon) { var nowTime = DateTime.Parse(systime); var today = nowTime.ToString("yyyy/MM/dd"); var lstShift = WpcExClassItemInfo.GetInfoByClass("Shift"); var firstShif = lstShift.Find(p => p.Remark05 == "1"); var todayStart = DateTime.Parse(today + " " + "00:00:00"); var firstSecond = DateTime.Parse(today + " " + firstShif.Remark02).Subtract(todayStart); string nowShift = "", nowShiftDate = ""; nowShiftDate = nowTime.Subtract(firstSecond).ToString("yyyy/MM/dd"); // 上工才找最早允許上工時間 if (workon) { lstShift.ForEach(p => { // 優先找最早允許上工時間到開始時間 var earliestStartTime = DateTime.Parse(today + " " + p["REMARK04"].ToString()); var shiftStartTime = DateTime.Parse(today + " " + p["REMARK02"].ToString()); var shiftEndTime = DateTime.Parse(today + " " + p["REMARK03"].ToString()); if (shiftEndTime < shiftStartTime) { if (nowTime.Subtract(firstSecond).Day != nowTime.Day) { earliestStartTime = DateTime.Parse(nowTime.AddDays(-1).ToString("yyyy/MM/dd") + " " + p["REMARK04"].ToString()); } else { shiftEndTime = DateTime.Parse(nowTime.AddDays(1).ToString("yyyy/MM/dd") + " " + p["REMARK03"].ToString()); } } var earSecond = shiftStartTime.Subtract(earliestStartTime); if (nowTime >= earliestStartTime && nowTime.Add(earSecond) < shiftEndTime) { nowShift = p["REMARK01"].ToString(); } }); } if (nowShift.IsNullOrEmpty()) { lstShift.ForEach(p => { var shiftStartTime = DateTime.Parse(today + " " + p["REMARK02"].ToString()); var shiftEndTime = DateTime.Parse(today + " " + p["REMARK03"].ToString()); if (shiftEndTime < shiftStartTime) { if (nowTime.Subtract(firstSecond).Day != nowTime.Day) { shiftStartTime = DateTime.Parse(nowTime.AddDays(-1).ToString("yyyy/MM/dd") + " " + p["REMARK02"].ToString()); } else { shiftEndTime = DateTime.Parse(nowTime.AddDays(1).ToString("yyyy/MM/dd") + " " + p["REMARK03"].ToString()); } } if (nowTime >= shiftStartTime && nowTime <= shiftEndTime) { nowShift = p["REMARK01"].ToString(); } }); } if (nowShift == "") { throw new Exception(RuleMessage.Error.C10155()); } //var dt = DBCenter.GetDataTable("SELECT * FROM BPM_MES_EMPSHIFT WHERE USERID =#[STRING] AND SHIFTDATE = #[STRING]", userID, nowShiftDate); //if (dt.Rows.Count == 0) //{ // throw new Exception(RuleMessage.Error.C10139()); //} //string EMPShiftDate = dt.Rows[0]["SHIFTDATE"].ToString(); //string EMPShift = dt.Rows[0]["SHIFT"].ToString(); //if (EMPShiftDate.IsNullOrEmpty()) //{ // throw new Exception(RuleMessage.Error.T00043("SHIFTDATE")); //} //if (EMPShift.IsNullOrEmpty()) //{ // throw new Exception(RuleMessage.Error.T00043("SHIFT")); //} //if (nowShift == "早" && EMPShiftDate == "晚") //{ // throw new Exception(RuleMessage.Error.C10156(nowShift, EMPShiftDate)); //} //if (nowShift == "中" && EMPShiftDate == "早") //{ // throw new Exception(RuleMessage.Error.C10156(nowShift, EMPShiftDate)); //} //if (nowShift == "晚" && EMPShiftDate == "中") //{ // throw new Exception(RuleMessage.Error.C10156(nowShift, EMPShiftDate)); //} return(new Pair <string, string>(nowShiftDate, nowShift)); }
private DataTable GetLotTitle() { DataTable dt = _LotData.CopyDataToTable("MES_WIP_LOT"); dt.Columns.Add("DeviceCode");//料號的2,3碼 dt.Columns.Add("LotTypeDescr"); dt.Columns.Add("WOQuantity"); dt.Columns.Add("DeviceDescr"); dt.Columns.Add("DeviceBPNo"); dt.Columns.Add("DeviceBPRev"); dt.Columns.Add("ProductionDate"); //預計生產日期 dt.Columns.Add("ScheduleDate"); //預計完成日期 dt.Columns.Add("BOM_MATNR"); //投入料號 dt.Columns.Add("Device_PLMNO"); //PLM 編號 dt.Columns.Add("Device_PLMVR"); //PLM 版本 if (cbxWO.Checked) { var woLot = CSTWorkOrderLotInfo.GetWorkOrderLotDataByWorkOrderLot(ttbWOLot.Text.Trim()); dt.Rows[0]["WOLOT"] = woLot.WOLOT; dt.Rows[0]["INVLOT"] = woLot.INVLOT; dt.Rows[0]["MATERIALLOT"] = woLot.MATERIALLOT; dt.Rows[0]["Quantity"] = woLot.Quantity; dt.Rows[0]["LOT"] = woLot.WOLOT; var cstWOBOMInfo = CSTWPCWorkOrderBOMInfo.GetDataByWorkOrder(woLot.WorkOrder).Find(p => p["SORTF"].ToString() == "1"); if (cstWOBOMInfo != null) { dt.Rows[0]["BOM_MATNR"] = cstWOBOMInfo["MATNR"].ToString(); } dt.Rows[0]["DeviceCode"] = _LotData.DeviceName.Substring(1, 2); var lsLotType = WpcExClassItemInfo.GetExClassItemInfo("LotType", _LotData.LotType); dt.Rows[0]["LotTypeDescr"] = lsLotType.Count > 0 ? lsLotType[0].Remark02 : ""; var WOData = WorkOrderInfo.GetWorkOrderByWorkOrder(woLot.WorkOrder); dt.Rows[0]["WOQuantity"] = WOData.Quantity; dt.Rows[0]["ProductionDate"] = WOData["ProductionDate"].ToCimesString(); dt.Rows[0]["ScheduleDate"] = WOData.ScheduleDate; var DeviceData = DeviceVersionInfoEx.GetActiveDeviceVersion(_LotData.DeviceName).ChangeTo <DeviceVersionInfoEx>(); dt.Rows[0]["DeviceDescr"] = DeviceData.Description; dt.Rows[0]["DeviceBPNo"] = DeviceData["BPNO"].ToString(); dt.Rows[0]["DeviceBPRev"] = DeviceData["BPREV"].ToString(); dt.Rows[0]["Device_PLMVR"] = DeviceData["PLMVR"].ToString(); dt.Rows[0]["Device_PLMNO"] = DeviceData["PLMNO"].ToString(); } if (cbxSN.Checked || cbxLot.Checked) { dt.Rows[0]["WOLOT"] = _LotData.WorkOrderLot; dt.Rows[0]["INVLOT"] = _LotData.InventoryLot; dt.Rows[0]["MATERIALLOT"] = _LotData.MaterialLot; dt.Rows[0]["Quantity"] = _LotData.Quantity; dt.Rows[0]["LOT"] = _LotData.Lot; dt.Rows[0]["DeviceCode"] = _LotData.DeviceName.Substring(1, 2); var lsLotType = WpcExClassItemInfo.GetExClassItemInfo("LotType", _LotData.LotType); dt.Rows[0]["LotTypeDescr"] = lsLotType.Count > 0 ? lsLotType[0].Remark02 : ""; var WOData = WorkOrderInfo.GetWorkOrderByWorkOrder(_LotData.WorkOrder); dt.Rows[0]["WOQuantity"] = WOData.Quantity; dt.Rows[0]["ProductionDate"] = WOData["ProductionDate"].ToCimesString(); dt.Rows[0]["ScheduleDate"] = WOData.ScheduleDate; var DeviceData = DeviceVersionInfoEx.GetActiveDeviceVersion(_LotData.DeviceName).ChangeTo <DeviceVersionInfoEx>(); dt.Rows[0]["DeviceDescr"] = DeviceData.Description; dt.Rows[0]["DeviceBPNo"] = DeviceData["BPNO"].ToString(); dt.Rows[0]["DeviceBPRev"] = DeviceData["BPREV"].ToString(); dt.Rows[0]["Device_PLMVR"] = DeviceData["PLMVR"].ToString(); dt.Rows[0]["Device_PLMNO"] = DeviceData["PLMNO"].ToString(); var cstWOBOMInfo = CSTWPCWorkOrderBOMInfo.GetDataByWorkOrder(WOData.WorkOrder).Find(p => p["SORTF"].ToString() == "1"); if (cstWOBOMInfo != null) { dt.Rows[0]["BOM_MATNR"] = cstWOBOMInfo["MATNR"].ToString(); } } return(dt); }