/// <summary> /// 取得預約工作站的序號 /// </summary> /// <param name="lot"></param> /// <param name="ruleName"></param> /// <returns></returns> public static string GetAppointmentOperationSequence(string lot, string ruleName) { var lotData = LotInfo.GetLotByLot(lot).ChangeTo <LotInfoEx>(); string nextOperationSequence = ""; //依據傳入的批號去取得預約表資訊 var WIPReserveCheckInDataList = CSTWIPReserveCheckInInfo.GetDataByLot(lotData.Lot); //用批號去客製表找出所有預約紀錄,先比較currentRule是否存在於客製表,若有,則拋錯 if (WIPReserveCheckInDataList.Count > 0) { //從預約表中找出相同的RuleName List <CSTWIPReserveCheckInInfo> matchReserveList = WIPReserveCheckInDataList.FindAll(x => x.RuleName == ruleName); if (matchReserveList.Count > 0) { //批號:{0}已進行站點:{1}預約進站作業,請遵循作業規範 throw new Exception(RuleMessage.Error.C10001(lotData.Lot, lotData.OperationName)); } //取得最後一次預約的工作站點名稱 var lastAppointmentOperation = WIPReserveCheckInDataList[0].OperationName; //取得目前批號的流程線上版本 RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(lotData.RouteName); //以目前工作站名稱去查詢在所有流程中的序號 var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == lastAppointmentOperation); //取得下一個工作站序號 nextOperationSequence = string.Format("{0:000}", (Convert.ToDecimal(routeOperation.OperationSequence) + 1)); } return(nextOperationSequence); }
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> /// 確定 /// </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="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 }); }